trm-core 7.5.6 → 8.0.1
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.txt +15 -0
- package/dist/actions/checkPackageDependencies/analyze.js +5 -51
- package/dist/actions/checkPackageDependencies/index.d.ts +2 -5
- package/dist/actions/checkPackageDependencies/init.js +5 -7
- package/dist/actions/checkSapEntries/analyze.js +2 -2
- package/dist/actions/checkSapEntries/index.d.ts +2 -2
- package/dist/actions/checkSapEntries/init.js +1 -4
- package/dist/actions/findDependencies/index.d.ts +0 -2
- package/dist/actions/findDependencies/setTrmDependencies.js +11 -55
- package/dist/actions/install/addNamespace.js +14 -9
- package/dist/actions/install/checkAlreadyInstalled.js +2 -2
- package/dist/actions/install/checkDependencies.js +2 -16
- package/dist/actions/install/checkSapEntries.js +1 -1
- package/dist/actions/install/checkTransports.js +2 -2
- package/dist/actions/install/executePostActivities.js +3 -3
- package/dist/actions/install/generateInstallTransport.js +40 -5
- package/dist/actions/install/index.d.ts +6 -10
- package/dist/actions/install/index.js +2 -4
- package/dist/actions/install/init.js +37 -45
- package/dist/actions/install/installDependencies.js +0 -1
- package/dist/actions/install/setPackageIntegrity.js +1 -1
- package/dist/actions/install/setTrmServerUpgradeService.js +1 -1
- package/dist/actions/installDependency/findInstallRelease.js +18 -18
- package/dist/actions/installDependency/index.d.ts +0 -1
- package/dist/actions/installDependency/init.js +0 -7
- package/dist/actions/installDependency/installRelease.js +0 -1
- package/dist/actions/publish/findDependencies.js +0 -12
- package/dist/actions/publish/generateCustTransport.js +0 -3
- package/dist/actions/publish/generateDevcTransport.js +0 -4
- package/dist/actions/publish/generateLangTransport.js +0 -3
- package/dist/actions/publish/getSourceCode.js +1 -1
- package/dist/actions/publish/index.d.ts +1 -1
- package/dist/actions/publish/init.js +71 -95
- package/dist/actions/publish/setManifestValues.js +4 -13
- package/dist/commons/getAxiosInstance.d.ts +1 -1
- package/dist/manifest/Manifest.d.ts +2 -0
- package/dist/manifest/Manifest.js +47 -17
- package/dist/manifest/TrmManifestDependency.d.ts +0 -1
- package/dist/registry/AbstractRegistry.d.ts +7 -7
- package/dist/registry/FileSystem.d.ts +7 -6
- package/dist/registry/FileSystem.js +35 -34
- package/dist/registry/RegistryProvider.js +4 -4
- package/dist/registry/{Registry.d.ts → RegistryV2.d.ts} +11 -10
- package/dist/registry/{Registry.js → RegistryV2.js} +146 -74
- package/dist/registry/index.d.ts +1 -1
- package/dist/registry/index.js +1 -1
- package/dist/systemConnector/ISystemConnectorBase.d.ts +1 -1
- package/dist/systemConnector/SystemConnector.d.ts +1 -1
- package/dist/systemConnector/SystemConnector.js +3 -3
- package/dist/systemConnector/SystemConnectorBase.d.ts +1 -1
- package/dist/systemConnector/SystemConnectorBase.js +33 -11
- package/dist/transport/Transport.d.ts +4 -1
- package/dist/transport/Transport.js +54 -31
- package/dist/trmPackage/TrmArtifact.js +3 -5
- package/dist/trmPackage/TrmPackage.d.ts +0 -16
- package/dist/trmPackage/TrmPackage.js +10 -133
- package/dist/validators/validatePackageVisibility.d.ts +1 -1
- package/dist/validators/validatePackageVisibility.js +2 -16
- package/package.json +4 -3
- package/dist/actions/install/checkIntegrity.d.ts +0 -3
- package/dist/actions/install/checkIntegrity.js +0 -42
|
@@ -2,17 +2,11 @@ import { Manifest } from "../manifest";
|
|
|
2
2
|
import { AbstractRegistry } from "../registry";
|
|
3
3
|
import { TrmArtifact } from "./TrmArtifact";
|
|
4
4
|
import { DEVCLASS } from "../client";
|
|
5
|
-
import { R3transOptions } from "node-r3trans";
|
|
6
5
|
import { Transport } from "../transport";
|
|
7
|
-
export declare const DEFAULT_VERSION: string;
|
|
8
6
|
export declare class TrmPackage {
|
|
9
7
|
packageName: string;
|
|
10
8
|
registry: AbstractRegistry;
|
|
11
9
|
manifest?: Manifest;
|
|
12
|
-
private _userAuthorizations;
|
|
13
|
-
private _canPublishReleasesCause;
|
|
14
|
-
private _remoteArtifacts;
|
|
15
|
-
private _remoteContent;
|
|
16
10
|
private _devclass;
|
|
17
11
|
private _wbTransport;
|
|
18
12
|
constructor(packageName: string, registry: AbstractRegistry, manifest?: Manifest);
|
|
@@ -20,22 +14,12 @@ export declare class TrmPackage {
|
|
|
20
14
|
getDevclass(): DEVCLASS;
|
|
21
15
|
setWbTransport(transport: Transport): TrmPackage;
|
|
22
16
|
getWbTransport(): Promise<Transport>;
|
|
23
|
-
exists(version?: string): Promise<boolean>;
|
|
24
|
-
canPublishReleases(): Promise<{
|
|
25
|
-
canPublishReleases: boolean;
|
|
26
|
-
cause?: string;
|
|
27
|
-
}>;
|
|
28
|
-
fetchRemoteArtifact(version?: string): Promise<TrmArtifact>;
|
|
29
|
-
fetchRemoteManifest(version?: string): Promise<Manifest>;
|
|
30
|
-
fetchRemoteContent(version?: string, r3transConfig?: R3transOptions): Promise<any>;
|
|
31
17
|
publish(data: {
|
|
32
18
|
artifact: TrmArtifact;
|
|
33
19
|
readme?: string;
|
|
34
20
|
}): Promise<TrmPackage>;
|
|
35
21
|
compareRegistry(registry: AbstractRegistry): boolean;
|
|
36
22
|
compareName(name: string): boolean;
|
|
37
|
-
private _viewLatest;
|
|
38
23
|
static create(manifest: Manifest, registry: AbstractRegistry): Promise<TrmPackage>;
|
|
39
24
|
static compare(o1: TrmPackage, o2: TrmPackage): boolean;
|
|
40
|
-
static normalizeVersion(packageName: string, version: string, registry: AbstractRegistry): Promise<string>;
|
|
41
25
|
}
|
|
@@ -1,37 +1,4 @@
|
|
|
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
2
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
36
3
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
37
4
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -42,19 +9,15 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
42
9
|
});
|
|
43
10
|
};
|
|
44
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
-
exports.TrmPackage =
|
|
46
|
-
const semver = __importStar(require("semver"));
|
|
12
|
+
exports.TrmPackage = void 0;
|
|
47
13
|
const trm_commons_1 = require("trm-commons");
|
|
48
14
|
const manifest_1 = require("../manifest");
|
|
49
15
|
const systemConnector_1 = require("../systemConnector");
|
|
50
|
-
exports.DEFAULT_VERSION = "1.0.0";
|
|
51
16
|
class TrmPackage {
|
|
52
17
|
constructor(packageName, registry, manifest) {
|
|
53
18
|
this.packageName = packageName;
|
|
54
19
|
this.registry = registry;
|
|
55
20
|
this.manifest = manifest;
|
|
56
|
-
this._remoteArtifacts = {};
|
|
57
|
-
this._remoteContent = {};
|
|
58
21
|
}
|
|
59
22
|
setDevclass(devclass) {
|
|
60
23
|
this._devclass = devclass;
|
|
@@ -70,66 +33,18 @@ class TrmPackage {
|
|
|
70
33
|
getWbTransport() {
|
|
71
34
|
return __awaiter(this, void 0, void 0, function* () {
|
|
72
35
|
if (this._wbTransport === undefined) {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
exists() {
|
|
79
|
-
return __awaiter(this, arguments, void 0, function* (version = 'latest') {
|
|
80
|
-
return (yield this.registry.packageExists(this.packageName, version));
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
canPublishReleases() {
|
|
84
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
85
|
-
if (this._userAuthorizations === undefined) {
|
|
86
|
-
var view;
|
|
87
|
-
try {
|
|
88
|
-
view = yield this._viewLatest();
|
|
36
|
+
const transports = yield systemConnector_1.SystemConnector.getWbTransports(this);
|
|
37
|
+
if (transports.length === 1) {
|
|
38
|
+
this._wbTransport = transports[0];
|
|
89
39
|
}
|
|
90
|
-
|
|
91
|
-
this.
|
|
92
|
-
if (e.response && typeof (e.response) === "object") {
|
|
93
|
-
view = e.response;
|
|
94
|
-
}
|
|
95
|
-
else {
|
|
96
|
-
throw e;
|
|
97
|
-
}
|
|
40
|
+
else {
|
|
41
|
+
this._wbTransport = false;
|
|
98
42
|
}
|
|
99
|
-
this._userAuthorizations = view.userAuthorizations;
|
|
100
|
-
}
|
|
101
|
-
return {
|
|
102
|
-
canPublishReleases: this._userAuthorizations.canCreateReleases,
|
|
103
|
-
cause: this._canPublishReleasesCause
|
|
104
|
-
};
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
fetchRemoteArtifact() {
|
|
108
|
-
return __awaiter(this, arguments, void 0, function* (version = 'latest') {
|
|
109
|
-
if (!this._remoteArtifacts[version]) {
|
|
110
|
-
this._remoteArtifacts[version] = yield this.registry.getArtifact(this.packageName, version);
|
|
111
43
|
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
}
|
|
115
|
-
fetchRemoteManifest() {
|
|
116
|
-
return __awaiter(this, arguments, void 0, function* (version = 'latest') {
|
|
117
|
-
const artifact = yield this.fetchRemoteArtifact(version);
|
|
118
|
-
this.manifest = artifact.getManifest();
|
|
119
|
-
this._remoteArtifacts[this.manifest.get().version] = this._remoteArtifacts[version];
|
|
120
|
-
return this._remoteArtifacts[version].getManifest();
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
fetchRemoteContent() {
|
|
124
|
-
return __awaiter(this, arguments, void 0, function* (version = 'latest', r3transConfig) {
|
|
125
|
-
if (!this._remoteContent[version]) {
|
|
126
|
-
const artifact = yield this.fetchRemoteArtifact(version);
|
|
127
|
-
const manifest = artifact.getManifest();
|
|
128
|
-
const actualVersion = manifest.get().version;
|
|
129
|
-
this._remoteArtifacts[version] = yield artifact.getContent(r3transConfig);
|
|
130
|
-
this._remoteArtifacts[actualVersion] = this._remoteArtifacts[version];
|
|
44
|
+
if (this._wbTransport === false) {
|
|
45
|
+
return undefined;
|
|
131
46
|
}
|
|
132
|
-
return this.
|
|
47
|
+
return this._wbTransport;
|
|
133
48
|
});
|
|
134
49
|
}
|
|
135
50
|
publish(data) {
|
|
@@ -141,9 +56,8 @@ class TrmPackage {
|
|
|
141
56
|
throw new Error(`Cannot publish package ${packageName}: expected name is ${this.packageName}`);
|
|
142
57
|
}
|
|
143
58
|
const packageVersion = trmManifest.version;
|
|
144
|
-
const readme = data.readme || '';
|
|
145
59
|
trm_commons_1.Logger.loading(`Publishing "${packageName}" ${packageVersion} to registry "${this.registry.name}"...`, false);
|
|
146
|
-
yield this.registry.
|
|
60
|
+
yield this.registry.publish(packageName, packageVersion, artifact, data.readme);
|
|
147
61
|
this.manifest = new manifest_1.Manifest(trmManifest);
|
|
148
62
|
return this;
|
|
149
63
|
});
|
|
@@ -154,11 +68,6 @@ class TrmPackage {
|
|
|
154
68
|
compareName(name) {
|
|
155
69
|
return this.packageName.trim().toUpperCase() === name.trim().toUpperCase();
|
|
156
70
|
}
|
|
157
|
-
_viewLatest() {
|
|
158
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
159
|
-
return (yield this.registry.view(this.packageName, 'latest'));
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
71
|
static create(manifest, registry) {
|
|
163
72
|
return __awaiter(this, void 0, void 0, function* () {
|
|
164
73
|
return new TrmPackage(manifest.get().name, registry, manifest);
|
|
@@ -167,37 +76,5 @@ class TrmPackage {
|
|
|
167
76
|
static compare(o1, o2) {
|
|
168
77
|
return o1.compareName(o2.packageName) && o1.compareRegistry(o2.registry);
|
|
169
78
|
}
|
|
170
|
-
static normalizeVersion(packageName, version, registry) {
|
|
171
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
172
|
-
const oPackage = new TrmPackage(packageName, registry);
|
|
173
|
-
const usingLatest = version.trim().toLowerCase() === 'latest';
|
|
174
|
-
if (!usingLatest) {
|
|
175
|
-
version = semver.clean(version);
|
|
176
|
-
if (!version) {
|
|
177
|
-
throw new Error('Version not supported.');
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
const exists = yield oPackage.exists();
|
|
181
|
-
if (!exists) {
|
|
182
|
-
if (usingLatest) {
|
|
183
|
-
version = exports.DEFAULT_VERSION;
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
else {
|
|
187
|
-
if (!usingLatest) {
|
|
188
|
-
const versionExists = yield oPackage.exists(version);
|
|
189
|
-
if (versionExists) {
|
|
190
|
-
throw new Error(`Package "${packageName}" versioned ${version} already published.`);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
else {
|
|
194
|
-
const oManifest = yield oPackage.fetchRemoteManifest('latest');
|
|
195
|
-
const latestPublishedManifest = oManifest.get();
|
|
196
|
-
version = semver.inc(latestPublishedManifest.version, 'patch');
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
return version;
|
|
200
|
-
});
|
|
201
|
-
}
|
|
202
79
|
}
|
|
203
80
|
exports.TrmPackage = TrmPackage;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { RegistryType } from "../registry";
|
|
2
|
-
export declare function validatePackageVisibility(registryType: RegistryType,
|
|
2
|
+
export declare function validatePackageVisibility(registryType: RegistryType, isPrivate: boolean, latestReleaseVisibility: boolean): string | true;
|
|
@@ -1,29 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.validatePackageVisibility = validatePackageVisibility;
|
|
4
|
-
const commons_1 = require("../commons");
|
|
5
4
|
const registry_1 = require("../registry");
|
|
6
|
-
function validatePackageVisibility(registryType,
|
|
5
|
+
function validatePackageVisibility(registryType, isPrivate, latestReleaseVisibility) {
|
|
7
6
|
if (registryType === registry_1.RegistryType.PUBLIC) {
|
|
8
7
|
if (latestReleaseVisibility !== undefined) {
|
|
9
8
|
if (isPrivate !== latestReleaseVisibility) {
|
|
10
9
|
return `Cannot change package visibility from ${isPrivate ? 'private' : 'public'} to ${latestReleaseVisibility ? 'private' : 'public'}.`;
|
|
11
10
|
}
|
|
12
11
|
}
|
|
13
|
-
|
|
14
|
-
const packageNameParsed = (0, commons_1.parsePackageName)({
|
|
15
|
-
fullName: packageName
|
|
16
|
-
});
|
|
17
|
-
if (!packageNameParsed.organization) {
|
|
18
|
-
return `Private packages on public registry need a scope!`;
|
|
19
|
-
}
|
|
20
|
-
else {
|
|
21
|
-
return true;
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
else {
|
|
25
|
-
return true;
|
|
26
|
-
}
|
|
12
|
+
return true;
|
|
27
13
|
}
|
|
28
14
|
else {
|
|
29
15
|
return true;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "trm-core",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "8.0.1",
|
|
4
4
|
"description": "TRM (Transport Request Manager) Core",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -46,13 +46,14 @@
|
|
|
46
46
|
"axios": "^1.7.9",
|
|
47
47
|
"chalk": "^4.1.2",
|
|
48
48
|
"cli-progress": "^3.12.0",
|
|
49
|
-
"dotenv": "^
|
|
49
|
+
"dotenv": "^17.2.2",
|
|
50
50
|
"email-validator": "^2.0.4",
|
|
51
51
|
"express": "^4.18.2",
|
|
52
52
|
"get-root-path": "^3.0.1",
|
|
53
53
|
"get-stack-trace": "^3.1.1",
|
|
54
54
|
"lodash": "^4.17.21",
|
|
55
55
|
"minimatch": "^10.0.1",
|
|
56
|
+
"node-cache": "^5.1.2",
|
|
56
57
|
"node-html-parser": "^7.0.1",
|
|
57
58
|
"node-r3trans": "^2.0.1",
|
|
58
59
|
"object-keys-normalizer": "^1.0.1",
|
|
@@ -62,7 +63,7 @@
|
|
|
62
63
|
"semver": "^7.5.4",
|
|
63
64
|
"semver-sort": "^1.0.0",
|
|
64
65
|
"spdx-license-ids": "^3.0.13",
|
|
65
|
-
"trm-registry-types": "^
|
|
66
|
+
"trm-registry-types": "^2.0.0",
|
|
66
67
|
"uuid": "^9.0.1",
|
|
67
68
|
"xml-beautify": "^1.2.3",
|
|
68
69
|
"xml-js": "^1.6.11"
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.checkIntegrity = void 0;
|
|
13
|
-
const trm_commons_1 = require("trm-commons");
|
|
14
|
-
exports.checkIntegrity = {
|
|
15
|
-
name: 'check-integrity',
|
|
16
|
-
run: (context) => __awaiter(void 0, void 0, void 0, function* () {
|
|
17
|
-
trm_commons_1.Logger.log('Check integrity step', true);
|
|
18
|
-
const inputIntegrity = context.rawInput.packageData.integrity;
|
|
19
|
-
const safe = context.rawInput.installData.checks.safe;
|
|
20
|
-
if (!inputIntegrity) {
|
|
21
|
-
if (safe) {
|
|
22
|
-
throw new Error(`Running in safe mode but no integrity checksum was provided.`);
|
|
23
|
-
}
|
|
24
|
-
else {
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
const trmManifest = context.runtime.remotePackageData.trmManifest;
|
|
29
|
-
const installIntegrity = context.runtime.remotePackageData.integrity;
|
|
30
|
-
if (installIntegrity !== inputIntegrity) {
|
|
31
|
-
trm_commons_1.Logger.warning(`ATTENTION!! Integrity check failed on package ${trmManifest.name}, version ${trmManifest.version}.`);
|
|
32
|
-
trm_commons_1.Logger.warning(` Local: ${inputIntegrity}`);
|
|
33
|
-
trm_commons_1.Logger.warning(` Remote: ${installIntegrity}`);
|
|
34
|
-
if (safe) {
|
|
35
|
-
trm_commons_1.Logger.warning(` Install will continue.`);
|
|
36
|
-
}
|
|
37
|
-
else {
|
|
38
|
-
throw new Error(`Safe mode: package installation aborted due to integrity check failure.`);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
})
|
|
42
|
-
};
|