nightingale-unit-testing 14.2.1 → 16.0.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/CHANGELOG.md +28 -0
- package/README.md +11 -11
- package/dist/definitions/index.d.ts +2 -2
- package/dist/definitions/index.d.ts.map +1 -1
- package/dist/index-node20.mjs +21 -0
- package/dist/index-node20.mjs.map +1 -0
- package/package.json +18 -18
- package/src/index.ts +13 -12
- package/dist/index-node18.mjs +0 -17
- package/dist/index-node18.mjs.map +0 -1
- package/src/.eslintrc.json +0 -30
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,34 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [16.0.0](https://github.com/christophehurpeau/nightingale/compare/v15.0.0...v16.0.0) (2025-03-30)
|
|
7
|
+
|
|
8
|
+
### ⚠ BREAKING CHANGES
|
|
9
|
+
|
|
10
|
+
* drop node 18
|
|
11
|
+
|
|
12
|
+
### Features
|
|
13
|
+
|
|
14
|
+
* drop node 18 ([1b11a55](https://github.com/christophehurpeau/nightingale/commit/1b11a55dd24c9435be50519a748316079f554414))
|
|
15
|
+
|
|
16
|
+
Version bump for dependency: nightingale
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
## [15.0.0](https://github.com/christophehurpeau/nightingale/compare/v14.2.1...v15.0.0) (2023-12-25)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
### ⚠ BREAKING CHANGES
|
|
23
|
+
|
|
24
|
+
* update babel and drop browser modern version
|
|
25
|
+
|
|
26
|
+
### Features
|
|
27
|
+
|
|
28
|
+
* update babel and drop browser modern version ([5c76abc](https://github.com/christophehurpeau/nightingale/commit/5c76abc8bfb595a617fc4c8b795dae7e674ea664))
|
|
29
|
+
|
|
30
|
+
Version bump for dependency: nightingale
|
|
31
|
+
Version bump for dependency: nightingale-console
|
|
32
|
+
|
|
33
|
+
|
|
6
34
|
## [14.2.1](https://github.com/christophehurpeau/nightingale/compare/v14.2.0...v14.2.1) (2023-11-05)
|
|
7
35
|
|
|
8
36
|
Note: no notable changes
|
package/README.md
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
<
|
|
1
|
+
<h1 align="center">
|
|
2
2
|
nightingale-unit-testing
|
|
3
|
-
</
|
|
3
|
+
</h1>
|
|
4
4
|
|
|
5
5
|
<p align="center">
|
|
6
6
|
nightingale default config for unit testing
|
|
7
7
|
</p>
|
|
8
8
|
|
|
9
9
|
<p align="center">
|
|
10
|
-
<a href="https://npmjs.org/package/nightingale-unit-testing"><img src="https://img.shields.io/npm/v/nightingale-unit-testing.svg?style=flat-square"></a>
|
|
11
|
-
<a href="https://npmjs.org/package/nightingale-unit-testing"><img src="https://img.shields.io/npm/dw/nightingale-unit-testing.svg?style=flat-square"></a>
|
|
12
|
-
<a href="https://npmjs.org/package/nightingale-unit-testing"><img src="https://img.shields.io/node/v/nightingale-unit-testing.svg?style=flat-square"></a>
|
|
13
|
-
<a href="https://npmjs.org/package/nightingale-unit-testing"><img src="https://img.shields.io/npm/types/nightingale-unit-testing.svg?style=flat-square"></a>
|
|
10
|
+
<a href="https://npmjs.org/package/nightingale-unit-testing"><img src="https://img.shields.io/npm/v/nightingale-unit-testing.svg?style=flat-square" alt="npm version"></a>
|
|
11
|
+
<a href="https://npmjs.org/package/nightingale-unit-testing"><img src="https://img.shields.io/npm/dw/nightingale-unit-testing.svg?style=flat-square" alt="npm downloads"></a>
|
|
12
|
+
<a href="https://npmjs.org/package/nightingale-unit-testing"><img src="https://img.shields.io/node/v/nightingale-unit-testing.svg?style=flat-square" alt="node version"></a>
|
|
13
|
+
<a href="https://npmjs.org/package/nightingale-unit-testing"><img src="https://img.shields.io/npm/types/nightingale-unit-testing.svg?style=flat-square" alt="types"></a>
|
|
14
14
|
</p>
|
|
15
15
|
|
|
16
16
|
## Install
|
|
@@ -26,7 +26,7 @@ In your source file, use [nightingale-logger](https://www.npmjs.com/package/nigh
|
|
|
26
26
|
In `test-setup` for example:
|
|
27
27
|
|
|
28
28
|
```js
|
|
29
|
-
import
|
|
29
|
+
import "nightingale-unit-testing";
|
|
30
30
|
```
|
|
31
31
|
|
|
32
32
|
By default, only log above 'ERROR' are displayed
|
|
@@ -56,12 +56,12 @@ NIGHTINGALE_LIB_MIN_LEVEL=200 DEBUG='my-lib' npm test
|
|
|
56
56
|
## Logging in tests
|
|
57
57
|
|
|
58
58
|
```js
|
|
59
|
-
import { testLogger } from
|
|
59
|
+
import { testLogger } from "nightingale-unit-testing";
|
|
60
60
|
|
|
61
|
-
it(
|
|
62
|
-
const value =
|
|
61
|
+
it("should test something", () => {
|
|
62
|
+
const value = "hello world";
|
|
63
63
|
testLogger.inspectValue(value);
|
|
64
|
-
expect(value).toBe(
|
|
64
|
+
expect(value).toBe("hello world");
|
|
65
65
|
});
|
|
66
66
|
```
|
|
67
67
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Logger } from
|
|
2
|
-
export { configure, addConfig, levels, Level, Logger } from
|
|
1
|
+
import { Logger } from "nightingale";
|
|
2
|
+
export { configure, addConfig, levels, Level, Logger } from "nightingale";
|
|
3
3
|
export declare const testLogger: Logger;
|
|
4
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,MAAM,EAAa,MAAM,aAAa,CAAC;AAEvE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAkB1E,eAAO,MAAM,UAAU,QAA6B,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Level, Logger, configure, ConsoleHandler } from 'nightingale';
|
|
2
|
+
export { Level, Logger, addConfig, configure, levels } from 'nightingale';
|
|
3
|
+
|
|
4
|
+
const testMinLevel = (() => {
|
|
5
|
+
if (process.env.NIGHTINGALE_TEST_MIN_LEVEL !== undefined && process.env.NIGHTINGALE_TEST_MIN_LEVEL !== "") {
|
|
6
|
+
return Number(process.env.NIGHTINGALE_TEST_MIN_LEVEL);
|
|
7
|
+
}
|
|
8
|
+
return process.env.NODE_ENV !== "production" ? Level.DEBUG : Level.INFO;
|
|
9
|
+
})();
|
|
10
|
+
const libMinLevel = process.env.NIGHTINGALE_LIB_MIN_LEVEL !== undefined && process.env.NIGHTINGALE_LIB_MIN_LEVEL !== "" ? Number(process.env.NIGHTINGALE_LIB_MIN_LEVEL) : Level.INFO;
|
|
11
|
+
const testLogger = new Logger("unit-testing");
|
|
12
|
+
configure([{
|
|
13
|
+
pattern: /^unit-testing(:|$)/,
|
|
14
|
+
handlers: [new ConsoleHandler(testMinLevel)],
|
|
15
|
+
stop: true
|
|
16
|
+
}, {
|
|
17
|
+
handlers: [new ConsoleHandler(libMinLevel)]
|
|
18
|
+
}]);
|
|
19
|
+
|
|
20
|
+
export { testLogger };
|
|
21
|
+
//# sourceMappingURL=index-node20.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-node20.mjs","sources":["../src/index.ts"],"sourcesContent":["import { ConsoleHandler, Level, Logger, configure } from \"nightingale\";\n\nexport { configure, addConfig, levels, Level, Logger } from \"nightingale\";\n\nconst testMinLevel = (() => {\n if (\n process.env.NIGHTINGALE_TEST_MIN_LEVEL !== undefined &&\n process.env.NIGHTINGALE_TEST_MIN_LEVEL !== \"\"\n ) {\n return Number(process.env.NIGHTINGALE_TEST_MIN_LEVEL);\n }\n return process.env.NODE_ENV !== \"production\" ? Level.DEBUG : Level.INFO;\n})();\n\nconst libMinLevel =\n process.env.NIGHTINGALE_LIB_MIN_LEVEL !== undefined &&\n process.env.NIGHTINGALE_LIB_MIN_LEVEL !== \"\"\n ? Number(process.env.NIGHTINGALE_LIB_MIN_LEVEL)\n : Level.INFO;\n\nexport const testLogger = new Logger(\"unit-testing\");\n\nconfigure([\n {\n pattern: /^unit-testing(:|$)/,\n handlers: [new ConsoleHandler(testMinLevel)],\n stop: true,\n },\n {\n handlers: [new ConsoleHandler(libMinLevel)],\n },\n]);\n"],"names":["testMinLevel","process","env","NIGHTINGALE_TEST_MIN_LEVEL","undefined","Number","NODE_ENV","Level","DEBUG","INFO","libMinLevel","NIGHTINGALE_LIB_MIN_LEVEL","testLogger","Logger","configure","pattern","handlers","ConsoleHandler","stop"],"mappings":";;;AAIA,MAAMA,YAAY,GAAG,CAAC,MAAM;AAC1B,EAAA,IACEC,OAAO,CAACC,GAAG,CAACC,0BAA0B,KAAKC,SAAS,IACpDH,OAAO,CAACC,GAAG,CAACC,0BAA0B,KAAK,EAAE,EAC7C;AACA,IAAA,OAAOE,MAAM,CAACJ,OAAO,CAACC,GAAG,CAACC,0BAA0B,CAAC;AACvD;AACA,EAAA,OAAOF,OAAO,CAACC,GAAG,CAACI,QAAQ,KAAK,YAAY,GAAGC,KAAK,CAACC,KAAK,GAAGD,KAAK,CAACE,IAAI;AACzE,CAAC,GAAG;AAEJ,MAAMC,WAAW,GACfT,OAAO,CAACC,GAAG,CAACS,yBAAyB,KAAKP,SAAS,IACnDH,OAAO,CAACC,GAAG,CAACS,yBAAyB,KAAK,EAAE,GACxCN,MAAM,CAACJ,OAAO,CAACC,GAAG,CAACS,yBAAyB,CAAC,GAC7CJ,KAAK,CAACE,IAAI;MAEHG,UAAU,GAAG,IAAIC,MAAM,CAAC,cAAc;AAEnDC,SAAS,CAAC,CACR;AACEC,EAAAA,OAAO,EAAE,oBAAoB;AAC7BC,EAAAA,QAAQ,EAAE,CAAC,IAAIC,cAAc,CAACjB,YAAY,CAAC,CAAC;AAC5CkB,EAAAA,IAAI,EAAE;AACR,CAAC,EACD;AACEF,EAAAA,QAAQ,EAAE,CAAC,IAAIC,cAAc,CAACP,WAAW,CAAC;AAC5C,CAAC,CACF,CAAC;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nightingale-unit-testing",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "16.0.0",
|
|
4
4
|
"description": "nightingale default config for unit testing",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"author": "Christophe Hurpeau <christophe@hurpeau.com> (https://christophe.hurpeau.com)",
|
|
@@ -13,20 +13,20 @@
|
|
|
13
13
|
"homepage": "https://github.com/christophehurpeau/nightingale",
|
|
14
14
|
"type": "module",
|
|
15
15
|
"engines": {
|
|
16
|
-
"node": ">=
|
|
16
|
+
"node": ">=20.9.0"
|
|
17
17
|
},
|
|
18
|
-
"
|
|
18
|
+
"sideEffects": false,
|
|
19
|
+
"main": "./dist/index-node20.mjs",
|
|
19
20
|
"types": "./dist/definitions/index.d.ts",
|
|
20
21
|
"exports": {
|
|
21
22
|
"./package.json": "./package.json",
|
|
22
23
|
".": {
|
|
23
24
|
"types": "./dist/definitions/index.d.ts",
|
|
24
25
|
"node": {
|
|
25
|
-
"import": "./dist/index-
|
|
26
|
+
"import": "./dist/index-node20.mjs"
|
|
26
27
|
}
|
|
27
28
|
}
|
|
28
29
|
},
|
|
29
|
-
"sideEffects": false,
|
|
30
30
|
"files": [
|
|
31
31
|
"src",
|
|
32
32
|
"dist"
|
|
@@ -37,29 +37,29 @@
|
|
|
37
37
|
"clean": "yarn clean:build",
|
|
38
38
|
"clean:build": "pob-babel-clean-out dist",
|
|
39
39
|
"lint": "yarn run lint:eslint",
|
|
40
|
-
"lint:eslint": "yarn ../.. run eslint --
|
|
40
|
+
"lint:eslint": "yarn ../.. run eslint --quiet packages/nightingale-unit-testing",
|
|
41
41
|
"watch": "yarn clean:build && rollup --config rollup.config.mjs --watch"
|
|
42
42
|
},
|
|
43
|
-
"prettier": "@pob/root/prettier-config",
|
|
44
43
|
"pob": {
|
|
45
|
-
"
|
|
44
|
+
"bundler": "rollup-babel",
|
|
45
|
+
"entries": [
|
|
46
|
+
"index"
|
|
47
|
+
],
|
|
48
|
+
"envs": [
|
|
46
49
|
{
|
|
47
50
|
"target": "node",
|
|
48
|
-
"version": "
|
|
51
|
+
"version": "20"
|
|
49
52
|
}
|
|
50
|
-
],
|
|
51
|
-
"entries": [
|
|
52
|
-
"index"
|
|
53
53
|
]
|
|
54
54
|
},
|
|
55
|
+
"prettier": "@pob/root/prettier-config",
|
|
55
56
|
"dependencies": {
|
|
56
|
-
"@types/node": ">=
|
|
57
|
-
"nightingale": "
|
|
58
|
-
"nightingale-console": "14.2.1"
|
|
57
|
+
"@types/node": ">=20.0.0",
|
|
58
|
+
"nightingale": "16.0.0"
|
|
59
59
|
},
|
|
60
60
|
"devDependencies": {
|
|
61
|
-
"@babel/core": "7.
|
|
62
|
-
"pob-babel": "
|
|
63
|
-
"typescript": "5.
|
|
61
|
+
"@babel/core": "7.26.10",
|
|
62
|
+
"pob-babel": "43.4.0",
|
|
63
|
+
"typescript": "5.8.2"
|
|
64
64
|
}
|
|
65
65
|
}
|
package/src/index.ts
CHANGED
|
@@ -1,23 +1,24 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { ConsoleHandler } from 'nightingale-console';
|
|
1
|
+
import { ConsoleHandler, Level, Logger, configure } from "nightingale";
|
|
3
2
|
|
|
4
|
-
export { configure, addConfig, levels, Level, Logger } from
|
|
3
|
+
export { configure, addConfig, levels, Level, Logger } from "nightingale";
|
|
5
4
|
|
|
6
|
-
const testMinLevel =
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
5
|
+
const testMinLevel = (() => {
|
|
6
|
+
if (
|
|
7
|
+
process.env.NIGHTINGALE_TEST_MIN_LEVEL !== undefined &&
|
|
8
|
+
process.env.NIGHTINGALE_TEST_MIN_LEVEL !== ""
|
|
9
|
+
) {
|
|
10
|
+
return Number(process.env.NIGHTINGALE_TEST_MIN_LEVEL);
|
|
11
|
+
}
|
|
12
|
+
return process.env.NODE_ENV !== "production" ? Level.DEBUG : Level.INFO;
|
|
13
|
+
})();
|
|
13
14
|
|
|
14
15
|
const libMinLevel =
|
|
15
16
|
process.env.NIGHTINGALE_LIB_MIN_LEVEL !== undefined &&
|
|
16
|
-
process.env.NIGHTINGALE_LIB_MIN_LEVEL !==
|
|
17
|
+
process.env.NIGHTINGALE_LIB_MIN_LEVEL !== ""
|
|
17
18
|
? Number(process.env.NIGHTINGALE_LIB_MIN_LEVEL)
|
|
18
19
|
: Level.INFO;
|
|
19
20
|
|
|
20
|
-
export const testLogger = new Logger(
|
|
21
|
+
export const testLogger = new Logger("unit-testing");
|
|
21
22
|
|
|
22
23
|
configure([
|
|
23
24
|
{
|
package/dist/index-node18.mjs
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { Level, Logger, configure } from 'nightingale';
|
|
2
|
-
export { Level, Logger, addConfig, configure, levels } from 'nightingale';
|
|
3
|
-
import { ConsoleHandler } from 'nightingale-console';
|
|
4
|
-
|
|
5
|
-
const testMinLevel = process.env.NIGHTINGALE_TEST_MIN_LEVEL !== undefined && process.env.NIGHTINGALE_TEST_MIN_LEVEL !== '' ? Number(process.env.NIGHTINGALE_TEST_MIN_LEVEL) : process.env.NODE_ENV !== 'production' ? Level.DEBUG : Level.INFO;
|
|
6
|
-
const libMinLevel = process.env.NIGHTINGALE_LIB_MIN_LEVEL !== undefined && process.env.NIGHTINGALE_LIB_MIN_LEVEL !== '' ? Number(process.env.NIGHTINGALE_LIB_MIN_LEVEL) : Level.INFO;
|
|
7
|
-
const testLogger = new Logger('unit-testing');
|
|
8
|
-
configure([{
|
|
9
|
-
pattern: /^unit-testing(:|$)/,
|
|
10
|
-
handlers: [new ConsoleHandler(testMinLevel)],
|
|
11
|
-
stop: true
|
|
12
|
-
}, {
|
|
13
|
-
handlers: [new ConsoleHandler(libMinLevel)]
|
|
14
|
-
}]);
|
|
15
|
-
|
|
16
|
-
export { testLogger };
|
|
17
|
-
//# sourceMappingURL=index-node18.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-node18.mjs","sources":["../src/index.ts"],"sourcesContent":["import { configure, Level, Logger } from 'nightingale';\nimport { ConsoleHandler } from 'nightingale-console';\n\nexport { configure, addConfig, levels, Level, Logger } from 'nightingale';\n\nconst testMinLevel =\n process.env.NIGHTINGALE_TEST_MIN_LEVEL !== undefined &&\n process.env.NIGHTINGALE_TEST_MIN_LEVEL !== ''\n ? Number(process.env.NIGHTINGALE_TEST_MIN_LEVEL)\n : process.env.NODE_ENV !== 'production'\n ? Level.DEBUG\n : Level.INFO;\n\nconst libMinLevel =\n process.env.NIGHTINGALE_LIB_MIN_LEVEL !== undefined &&\n process.env.NIGHTINGALE_LIB_MIN_LEVEL !== ''\n ? Number(process.env.NIGHTINGALE_LIB_MIN_LEVEL)\n : Level.INFO;\n\nexport const testLogger = new Logger('unit-testing');\n\nconfigure([\n {\n pattern: /^unit-testing(:|$)/,\n handlers: [new ConsoleHandler(testMinLevel)],\n stop: true,\n },\n {\n handlers: [new ConsoleHandler(libMinLevel)],\n },\n]);\n"],"names":["testMinLevel","process","env","NIGHTINGALE_TEST_MIN_LEVEL","undefined","Number","NODE_ENV","Level","DEBUG","INFO","libMinLevel","NIGHTINGALE_LIB_MIN_LEVEL","testLogger","Logger","configure","pattern","handlers","ConsoleHandler","stop"],"mappings":";;;;AAKA,MAAMA,YAAY,GAChBC,OAAO,CAACC,GAAG,CAACC,0BAA0B,KAAKC,SAAS,IACpDH,OAAO,CAACC,GAAG,CAACC,0BAA0B,KAAK,EAAE,GACzCE,MAAM,CAACJ,OAAO,CAACC,GAAG,CAACC,0BAA0B,CAAC,GAC9CF,OAAO,CAACC,GAAG,CAACI,QAAQ,KAAK,YAAY,GACrCC,KAAK,CAACC,KAAK,GACXD,KAAK,CAACE,IAAI,CAAA;AAEhB,MAAMC,WAAW,GACfT,OAAO,CAACC,GAAG,CAACS,yBAAyB,KAAKP,SAAS,IACnDH,OAAO,CAACC,GAAG,CAACS,yBAAyB,KAAK,EAAE,GACxCN,MAAM,CAACJ,OAAO,CAACC,GAAG,CAACS,yBAAyB,CAAC,GAC7CJ,KAAK,CAACE,IAAI,CAAA;MAEHG,UAAU,GAAG,IAAIC,MAAM,CAAC,cAAc,EAAC;AAEpDC,SAAS,CAAC,CACR;AACEC,EAAAA,OAAO,EAAE,oBAAoB;AAC7BC,EAAAA,QAAQ,EAAE,CAAC,IAAIC,cAAc,CAACjB,YAAY,CAAC,CAAC;AAC5CkB,EAAAA,IAAI,EAAE,IAAA;AACR,CAAC,EACD;AACEF,EAAAA,QAAQ,EAAE,CAAC,IAAIC,cAAc,CAACP,WAAW,CAAC,CAAA;AAC5C,CAAC,CACF,CAAC;;;;"}
|
package/src/.eslintrc.json
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"root": true,
|
|
3
|
-
"parser": "@typescript-eslint/parser",
|
|
4
|
-
"parserOptions": {
|
|
5
|
-
"project": "packages/nightingale-unit-testing/tsconfig.json"
|
|
6
|
-
},
|
|
7
|
-
"plugins": ["@typescript-eslint"],
|
|
8
|
-
"extends": [
|
|
9
|
-
"@pob/eslint-config-typescript",
|
|
10
|
-
"@pob/eslint-config-typescript/node"
|
|
11
|
-
],
|
|
12
|
-
"ignorePatterns": ["*.d.ts"],
|
|
13
|
-
"overrides": [
|
|
14
|
-
{
|
|
15
|
-
"files": ["**/*.test.ts", "__tests__/**/*.ts"],
|
|
16
|
-
"extends": ["@pob/eslint-config-typescript/test"],
|
|
17
|
-
"env": {
|
|
18
|
-
"jest": true
|
|
19
|
-
},
|
|
20
|
-
"rules": {
|
|
21
|
-
"import/no-extraneous-dependencies": [
|
|
22
|
-
"error",
|
|
23
|
-
{
|
|
24
|
-
"devDependencies": true
|
|
25
|
-
}
|
|
26
|
-
]
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
]
|
|
30
|
-
}
|