@hellocoop/nextjs 3.0.2 → 3.1.0
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.
- package/LICENSE +21 -0
- package/dist/app.d.ts +2 -2
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +21 -9
- package/dist/auth.d.ts +1 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +7 -7
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -0
- package/dist/pages.d.ts +2 -2
- package/dist/pages.d.ts.map +1 -1
- package/dist/pages.js +21 -12
- package/package.json +12 -12
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2023 Hellō
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/dist/app.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { NextRequest, NextResponse } from 'next/server';
|
|
2
|
-
import { Auth } from '@hellocoop/
|
|
3
|
-
import { Config } from '@hellocoop/
|
|
2
|
+
import { Auth } from '@hellocoop/definitions';
|
|
3
|
+
import { Config } from '@hellocoop/api';
|
|
4
4
|
declare module 'next/server' {
|
|
5
5
|
interface NextRequest {
|
|
6
6
|
auth?: Auth;
|
package/dist/app.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAExD,OAAO,EAAE,IAAI,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAExD,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAA;AAE7C,OAAO,EAOH,MAAM,EACT,MAAM,gBAAgB,CAAA;AAEvB,OAAO,QAAQ,aAAa,CAAC;IACzB,UAAU,WAAW;QACjB,IAAI,CAAC,EAAE,IAAI,CAAC;KACf;CACJ;AA+ED,KAAK,eAAe,GAAG,CAAC,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;AAEnE,eAAO,MAAM,OAAO,WAAa,MAAM,KAAG,eA0BzC,CAAA"}
|
package/dist/app.js
CHANGED
|
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
4
4
|
exports.appAuth = void 0;
|
|
5
5
|
const cookie_1 = require("cookie");
|
|
6
6
|
const server_1 = require("next/server");
|
|
7
|
-
const
|
|
7
|
+
const api_1 = require("@hellocoop/api");
|
|
8
8
|
function headersToObject(headers) {
|
|
9
9
|
const object = {};
|
|
10
10
|
headers.forEach((value, key) => {
|
|
@@ -15,11 +15,16 @@ function headersToObject(headers) {
|
|
|
15
15
|
function urlSearchParamsToObject(params) {
|
|
16
16
|
const obj = {};
|
|
17
17
|
params.forEach((value, key) => {
|
|
18
|
-
|
|
18
|
+
if (Array.isArray(value)) {
|
|
19
|
+
obj[key] = value[0];
|
|
20
|
+
}
|
|
21
|
+
else if (typeof value === 'string') {
|
|
22
|
+
obj[key] = value;
|
|
23
|
+
}
|
|
19
24
|
});
|
|
20
25
|
return obj;
|
|
21
26
|
}
|
|
22
|
-
const convertToHelloRequest = (req) => {
|
|
27
|
+
const convertToHelloRequest = (req, res) => {
|
|
23
28
|
return {
|
|
24
29
|
headers: () => { return headersToObject(req.headers); },
|
|
25
30
|
query: urlSearchParamsToObject(req.nextUrl.searchParams),
|
|
@@ -27,13 +32,20 @@ const convertToHelloRequest = (req) => {
|
|
|
27
32
|
getAuth: () => req.auth,
|
|
28
33
|
setAuth: (auth) => { req.auth = auth; },
|
|
29
34
|
method: req.method,
|
|
30
|
-
body: req.body
|
|
35
|
+
body: req.body,
|
|
36
|
+
loginSyncWrapper: (loginSync, params) => {
|
|
37
|
+
return loginSync({ ...params, req, res });
|
|
38
|
+
},
|
|
39
|
+
logoutSyncWrapper: (logoutSync) => {
|
|
40
|
+
return logoutSync({ req, res });
|
|
41
|
+
},
|
|
42
|
+
frameWork: 'nextjs',
|
|
31
43
|
};
|
|
32
44
|
};
|
|
33
45
|
const convertToHelloResponse = (res) => {
|
|
34
46
|
return {
|
|
35
47
|
clearAuth: () => {
|
|
36
|
-
const { name, value, options } = (0,
|
|
48
|
+
const { name, value, options } = (0, api_1.clearAuthCookieParams)();
|
|
37
49
|
res.headers.append('Set-Cookie', (0, cookie_1.serialize)(name, value, options));
|
|
38
50
|
},
|
|
39
51
|
send: (data) => {
|
|
@@ -66,17 +78,17 @@ const convertToHelloResponse = (res) => {
|
|
|
66
78
|
};
|
|
67
79
|
};
|
|
68
80
|
const appAuth = (config) => {
|
|
69
|
-
if (!
|
|
70
|
-
(0,
|
|
81
|
+
if (!api_1.isConfigured) {
|
|
82
|
+
(0, api_1.configure)(config);
|
|
71
83
|
}
|
|
72
84
|
const r = async (req) => {
|
|
73
85
|
const internalResponse = {
|
|
74
86
|
status: 200,
|
|
75
87
|
headers: new Headers(),
|
|
76
88
|
};
|
|
77
|
-
const helloReq = convertToHelloRequest(req);
|
|
89
|
+
const helloReq = convertToHelloRequest(req, internalResponse);
|
|
78
90
|
const helloRes = convertToHelloResponse(internalResponse);
|
|
79
|
-
await (0,
|
|
91
|
+
await (0, api_1.router)(helloReq, helloRes);
|
|
80
92
|
if (internalResponse.redirect)
|
|
81
93
|
return server_1.NextResponse.redirect(new URL(internalResponse.redirect, req.url), { headers: internalResponse.headers });
|
|
82
94
|
if (internalResponse.json)
|
package/dist/auth.d.ts
CHANGED
package/dist/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAe,MAAM,wBAAwB,CAAA;AAS1D,eAAO,MAAM,IAAI,QAAsB,OAAO,CAAC,IAAI,CAQlD,CAAA"}
|
package/dist/auth.js
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.auth = void 0;
|
|
4
|
-
const
|
|
4
|
+
const definitions_1 = require("@hellocoop/definitions");
|
|
5
|
+
const api_1 = require("@hellocoop/api");
|
|
5
6
|
const headers_1 = require("next/headers");
|
|
6
|
-
const
|
|
7
|
-
const constants_1 = require("@hellocoop/constants");
|
|
7
|
+
const helper_server_1 = require("@hellocoop/helper-server");
|
|
8
8
|
// TODO cache decryption
|
|
9
9
|
// import { unstable_cache } from 'next/cache';
|
|
10
10
|
// https://nextjs.org/docs/app/api-reference/functions/unstable_cache
|
|
11
11
|
const auth = async function () {
|
|
12
12
|
var _a;
|
|
13
|
-
const authCookie = (_a = (0, headers_1.cookies)().get(
|
|
13
|
+
const authCookie = (_a = (0, headers_1.cookies)().get(api_1.configuration.cookies.authName)) === null || _a === void 0 ? void 0 : _a.value;
|
|
14
14
|
if (!authCookie)
|
|
15
|
-
return
|
|
16
|
-
const a = await (0,
|
|
15
|
+
return definitions_1.NotLoggedIn;
|
|
16
|
+
const a = await (0, helper_server_1.decryptObj)(authCookie, api_1.configuration.secret);
|
|
17
17
|
if (!a)
|
|
18
|
-
return
|
|
18
|
+
return definitions_1.NotLoggedIn;
|
|
19
19
|
return a;
|
|
20
20
|
};
|
|
21
21
|
exports.auth = auth;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
export type { Config as HelloConfig,
|
|
2
|
-
export type { Auth } from '@hellocoop/
|
|
1
|
+
export type { Config as HelloConfig, LoginSyncResponse, LogoutSyncResponse, } from '@hellocoop/api';
|
|
2
|
+
export type { Auth } from '@hellocoop/definitions';
|
|
3
3
|
export { getAuth, getServerSideProps, pageAuth, pagesAuth } from './pages';
|
|
4
4
|
export { appAuth } from './app';
|
|
5
5
|
export { auth } from './auth';
|
|
6
|
+
export * from '@hellocoop/react';
|
|
6
7
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACR,MAAM,IAAI,WAAW,EACrB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACR,MAAM,IAAI,WAAW,EACrB,iBAAiB,EACjB,kBAAkB,GACrB,MAAM,gBAAgB,CAAA;AACvB,YAAY,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAA;AAGlD,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAE1E,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAC7B,cAAc,kBAAkB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
2
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
17
|
exports.auth = exports.appAuth = exports.pagesAuth = exports.pageAuth = exports.getServerSideProps = exports.getAuth = void 0;
|
|
4
18
|
// pageAuth is synonym for pagesAuth
|
|
@@ -12,3 +26,4 @@ var app_1 = require("./app");
|
|
|
12
26
|
Object.defineProperty(exports, "appAuth", { enumerable: true, get: function () { return app_1.appAuth; } });
|
|
13
27
|
var auth_1 = require("./auth");
|
|
14
28
|
Object.defineProperty(exports, "auth", { enumerable: true, get: function () { return auth_1.auth; } });
|
|
29
|
+
__exportStar(require("@hellocoop/react"), exports);
|
package/dist/pages.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { GetServerSidePropsContext, GetServerSidePropsResult, NextApiHandler, NextApiRequest } from 'next';
|
|
2
|
-
import { Auth } from '@hellocoop/
|
|
3
|
-
import { Config } from '@hellocoop/
|
|
2
|
+
import { Auth } from '@hellocoop/definitions';
|
|
3
|
+
import { Config } from '@hellocoop/api';
|
|
4
4
|
declare module 'next' {
|
|
5
5
|
interface NextApiRequest {
|
|
6
6
|
auth?: Auth;
|
package/dist/pages.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pages.d.ts","sourceRoot":"","sources":["../src/pages.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACR,yBAAyB,EACzB,wBAAwB,EACxB,cAAc,EACd,cAAc,EAEjB,MAAM,MAAM,CAAA;AAEb,OAAO,EAAE,IAAI,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"pages.d.ts","sourceRoot":"","sources":["../src/pages.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACR,yBAAyB,EACzB,wBAAwB,EACxB,cAAc,EACd,cAAc,EAEjB,MAAM,MAAM,CAAA;AAEb,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAA;AAE7C,OAAO,EAQH,MAAM,EACT,MAAM,gBAAgB,CAAA;AAIvB,OAAO,QAAQ,MAAM,CAAC;IAClB,UAAU,cAAc;QACpB,IAAI,CAAC,EAAE,IAAI,CAAC;KACf;CACJ;AAwDD,eAAO,MAAM,kBAAkB,YAA2B,yBAAyB,KAC1E,OAAO,CAAC,wBAAwB,CAAC;IAAC,IAAI,EAAC,IAAI,CAAA;CAAC,CAAC,CAcrD,CAAA;AAED,eAAO,MAAM,OAAO,QAAyB,cAAc,KAAG,OAAO,CAAC,IAAI,CAOzE,CAAA;AAED,eAAO,MAAM,QAAQ,WAAsB,MAAM,KAAG,cAUnD,CAAA;AAED,eAAO,MAAM,SAAS,WAZqB,MAAM,KAAG,cAYnB,CAAA"}
|
package/dist/pages.js
CHANGED
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
4
|
exports.pagesAuth = exports.pageAuth = exports.getAuth = exports.getServerSideProps = void 0;
|
|
5
5
|
const cookie_1 = require("cookie");
|
|
6
|
-
const
|
|
6
|
+
const api_1 = require("@hellocoop/api");
|
|
7
7
|
const url_1 = require("url");
|
|
8
|
-
const convertToHelloRequest = (req) => {
|
|
8
|
+
const convertToHelloRequest = (req, res) => {
|
|
9
9
|
var _a;
|
|
10
10
|
return {
|
|
11
11
|
headers: () => req.headers,
|
|
@@ -14,13 +14,20 @@ const convertToHelloRequest = (req) => {
|
|
|
14
14
|
getAuth: () => req.auth,
|
|
15
15
|
setAuth: (auth) => { req.auth = auth; },
|
|
16
16
|
method: req.method,
|
|
17
|
-
body: req.body
|
|
17
|
+
body: req.body,
|
|
18
|
+
frameWork: 'nextjs',
|
|
19
|
+
loginSyncWrapper: (loginSync, params) => {
|
|
20
|
+
return loginSync({ ...params, req, res });
|
|
21
|
+
},
|
|
22
|
+
logoutSyncWrapper: (logoutSync) => {
|
|
23
|
+
return logoutSync({ req, res });
|
|
24
|
+
},
|
|
18
25
|
};
|
|
19
26
|
};
|
|
20
27
|
const convertToHelloResponse = (res) => {
|
|
21
28
|
return {
|
|
22
29
|
clearAuth: () => {
|
|
23
|
-
const { name, value, options } = (0,
|
|
30
|
+
const { name, value, options } = (0, api_1.clearAuthCookieParams)();
|
|
24
31
|
res.setHeader('Set-Cookie', (0, cookie_1.serialize)(name, value, options));
|
|
25
32
|
},
|
|
26
33
|
send: (data) => res.send(data),
|
|
@@ -53,13 +60,14 @@ const convertToHelloResponse = (res) => {
|
|
|
53
60
|
};
|
|
54
61
|
const getServerSideProps = async function (context) {
|
|
55
62
|
const req = context.req;
|
|
63
|
+
const res = context.res;
|
|
56
64
|
if (req.auth)
|
|
57
65
|
return {
|
|
58
66
|
props: { auth: req.auth }
|
|
59
67
|
};
|
|
60
|
-
const helloReq = convertToHelloRequest(req);
|
|
68
|
+
const helloReq = convertToHelloRequest(req, res);
|
|
61
69
|
const helloRes = convertToHelloResponse(context.res);
|
|
62
|
-
const auth = await (0,
|
|
70
|
+
const auth = await (0, api_1.getAuthfromCookies)(helloReq, helloRes);
|
|
63
71
|
return {
|
|
64
72
|
props: { auth }
|
|
65
73
|
};
|
|
@@ -68,19 +76,20 @@ exports.getServerSideProps = getServerSideProps;
|
|
|
68
76
|
const getAuth = async function (req) {
|
|
69
77
|
if (req.auth)
|
|
70
78
|
return req.auth;
|
|
71
|
-
const
|
|
72
|
-
const
|
|
79
|
+
const dummyResponse = {};
|
|
80
|
+
const helloReq = convertToHelloRequest(req, dummyResponse);
|
|
81
|
+
const auth = await (0, api_1.getAuthfromCookies)(helloReq);
|
|
73
82
|
return auth;
|
|
74
83
|
};
|
|
75
84
|
exports.getAuth = getAuth;
|
|
76
85
|
const pageAuth = function (config) {
|
|
77
|
-
if (!
|
|
78
|
-
(0,
|
|
86
|
+
if (!api_1.isConfigured) {
|
|
87
|
+
(0, api_1.configure)(config);
|
|
79
88
|
}
|
|
80
89
|
const r = async (req, res) => {
|
|
81
|
-
const helloReq = convertToHelloRequest(req);
|
|
90
|
+
const helloReq = convertToHelloRequest(req, res);
|
|
82
91
|
const helloRes = convertToHelloResponse(res);
|
|
83
|
-
await (0,
|
|
92
|
+
await (0, api_1.router)(helloReq, helloRes);
|
|
84
93
|
};
|
|
85
94
|
return r;
|
|
86
95
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hellocoop/nextjs",
|
|
3
|
-
"version": "3.0
|
|
3
|
+
"version": "3.1.0",
|
|
4
4
|
"description": "Next.js SDK for Hellō https://hello.dev",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -36,9 +36,8 @@
|
|
|
36
36
|
},
|
|
37
37
|
"scripts": {
|
|
38
38
|
"watch": "tsc --watch --declaration",
|
|
39
|
-
"
|
|
40
|
-
"build
|
|
41
|
-
"build:src": "tsc --declaration"
|
|
39
|
+
"prebuild": "rimraf dist node_modules",
|
|
40
|
+
"build": "tsc --declaration"
|
|
42
41
|
},
|
|
43
42
|
"peerDependencies": {
|
|
44
43
|
"next": ">=10",
|
|
@@ -46,13 +45,13 @@
|
|
|
46
45
|
"react-dom": ">=17"
|
|
47
46
|
},
|
|
48
47
|
"devDependencies": {
|
|
49
|
-
"@hellocoop/
|
|
48
|
+
"@hellocoop/definitions": "1.0.0",
|
|
50
49
|
"@tsconfig/node18": "^18.2.2",
|
|
51
|
-
"@types/cookie": "^0.
|
|
50
|
+
"@types/cookie": "^0.6.0",
|
|
52
51
|
"@types/cors": "^2.8.14",
|
|
53
52
|
"@types/react": "^18.2.21",
|
|
54
53
|
"eslint-config-next": "^13.5.1",
|
|
55
|
-
"next": "^
|
|
54
|
+
"next": "^14.2.15",
|
|
56
55
|
"react": "^18.2.0",
|
|
57
56
|
"react-dom": "^18.2.0",
|
|
58
57
|
"rimraf": "^5.0.1",
|
|
@@ -62,11 +61,12 @@
|
|
|
62
61
|
"node": ">=18"
|
|
63
62
|
},
|
|
64
63
|
"dependencies": {
|
|
65
|
-
"@hellocoop/
|
|
66
|
-
"@hellocoop/
|
|
67
|
-
"@hellocoop/
|
|
68
|
-
"cookie": "^0.
|
|
64
|
+
"@hellocoop/api": "~2.0.0",
|
|
65
|
+
"@hellocoop/helper-server": "~2.0.0",
|
|
66
|
+
"@hellocoop/react": "^3.0.2",
|
|
67
|
+
"cookie": "^1.0.1",
|
|
69
68
|
"cors": "^2.8.5",
|
|
70
69
|
"swr": "^2.2.2"
|
|
71
|
-
}
|
|
70
|
+
},
|
|
71
|
+
"gitHead": "018e57826706471620d6ac09e66121e53877c87e"
|
|
72
72
|
}
|