@cyclonedx/cdxgen 11.0.4 → 11.0.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.
- package/lib/cli/index.js +85 -46
- package/lib/helpers/display.js +30 -20
- package/lib/helpers/utils.js +129 -69
- package/lib/helpers/utils.test.js +16 -5
- package/package.json +1 -1
- package/types/lib/cli/index.d.ts.map +1 -1
- package/types/lib/helpers/display.d.ts.map +1 -1
- package/types/lib/helpers/utils.d.ts +28 -33
- package/types/lib/helpers/utils.d.ts.map +1 -1
package/lib/cli/index.js
CHANGED
|
@@ -883,7 +883,14 @@ function addComponent(
|
|
|
883
883
|
purl: purlString,
|
|
884
884
|
externalReferences: addExternalReferences(pkg),
|
|
885
885
|
};
|
|
886
|
-
|
|
886
|
+
if (options.specVersion >= 1.5) {
|
|
887
|
+
component.pedigree = pkg.pedigree || undefined;
|
|
888
|
+
}
|
|
889
|
+
if (options.specVersion >= 1.6) {
|
|
890
|
+
component.releaseNotes = pkg.releaseNotes || undefined;
|
|
891
|
+
component.modelCard = pkg.modelCard || undefined;
|
|
892
|
+
component.data = pkg.data || undefined;
|
|
893
|
+
}
|
|
887
894
|
component["type"] = determinePackageType(pkg);
|
|
888
895
|
component["bom-ref"] = decodeURIComponent(purlString);
|
|
889
896
|
if (
|
|
@@ -1264,7 +1271,6 @@ export async function createJavaBom(path, options) {
|
|
|
1264
1271
|
// For java, this would correctly include the cyclonedx maven plugin.
|
|
1265
1272
|
let tools = undefined;
|
|
1266
1273
|
let possible_misses = false;
|
|
1267
|
-
let mavenDepsTreeInfoShown = false;
|
|
1268
1274
|
// war/ear mode
|
|
1269
1275
|
if (path.endsWith(".war") || path.endsWith(".jar")) {
|
|
1270
1276
|
// Check if the file exists
|
|
@@ -1294,6 +1300,11 @@ export async function createJavaBom(path, options) {
|
|
|
1294
1300
|
parentComponent,
|
|
1295
1301
|
});
|
|
1296
1302
|
}
|
|
1303
|
+
// -t quarkus is supported
|
|
1304
|
+
let isQuarkus = options?.projectType?.includes("quarkus");
|
|
1305
|
+
let useMavenDepsTree = isQuarkus ? false : PREFER_MAVEN_DEPS_TREE;
|
|
1306
|
+
// Is this a multi-module project
|
|
1307
|
+
let rootModules;
|
|
1297
1308
|
// maven - pom.xml
|
|
1298
1309
|
const pomFiles = getAllFiles(
|
|
1299
1310
|
path,
|
|
@@ -1305,37 +1316,72 @@ export async function createJavaBom(path, options) {
|
|
|
1305
1316
|
pomFiles?.length &&
|
|
1306
1317
|
isPackageManagerAllowed("maven", ["bazel", "sbt", "gradle"], options)
|
|
1307
1318
|
) {
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
if (!DEBUG_MODE) {
|
|
1323
|
-
mvnArgs.push("-q");
|
|
1324
|
-
}
|
|
1325
|
-
// Support for passing additional settings and profile to maven
|
|
1326
|
-
if (process.env.MVN_ARGS) {
|
|
1327
|
-
const addArgs = process.env.MVN_ARGS.split(" ");
|
|
1328
|
-
mvnArgs = mvnArgs.concat(addArgs);
|
|
1319
|
+
if (!isQuarkus) {
|
|
1320
|
+
// Quarkus projects require special treatment. To detect quarkus, we parse the first 3 maven file to look for a hit
|
|
1321
|
+
for (const pf of pomFiles.slice(0, 3)) {
|
|
1322
|
+
const pomMap = parsePom(pf);
|
|
1323
|
+
if (!rootModules && pomMap?.modules?.length) {
|
|
1324
|
+
rootModules = pomMap.modules;
|
|
1325
|
+
}
|
|
1326
|
+
// In quarkus mode, we cannot use the maven deps tree
|
|
1327
|
+
if (pomMap.isQuarkus) {
|
|
1328
|
+
isQuarkus = true;
|
|
1329
|
+
useMavenDepsTree = false;
|
|
1330
|
+
break;
|
|
1331
|
+
}
|
|
1332
|
+
}
|
|
1329
1333
|
}
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
if (
|
|
1333
|
-
|
|
1334
|
+
let result = undefined;
|
|
1335
|
+
let mvnArgs;
|
|
1336
|
+
if (isQuarkus) {
|
|
1337
|
+
// disable analytics. See: https://quarkus.io/usage/
|
|
1338
|
+
mvnArgs = [
|
|
1339
|
+
"-fn",
|
|
1340
|
+
"quarkus:dependency-sbom",
|
|
1341
|
+
"-Dquarkus.analytics.disabled=true",
|
|
1342
|
+
];
|
|
1343
|
+
} else {
|
|
1344
|
+
const cdxMavenPlugin =
|
|
1345
|
+
process.env.CDX_MAVEN_PLUGIN ||
|
|
1346
|
+
"org.cyclonedx:cyclonedx-maven-plugin:2.9.1";
|
|
1347
|
+
const cdxMavenGoal = process.env.CDX_MAVEN_GOAL || "makeAggregateBom";
|
|
1348
|
+
mvnArgs = [
|
|
1349
|
+
"-fn",
|
|
1350
|
+
`${cdxMavenPlugin}:${cdxMavenGoal}`,
|
|
1351
|
+
"-DoutputName=bom",
|
|
1352
|
+
];
|
|
1353
|
+
if (includeMavenTestScope) {
|
|
1354
|
+
mvnArgs.push("-DincludeTestScope=true");
|
|
1355
|
+
}
|
|
1356
|
+
// By using quiet mode we can reduce the maxBuffer used and avoid crashes
|
|
1357
|
+
if (!DEBUG_MODE) {
|
|
1358
|
+
mvnArgs.push("-q");
|
|
1359
|
+
}
|
|
1360
|
+
// Support for passing additional settings and profile to maven
|
|
1361
|
+
if (process.env.MVN_ARGS) {
|
|
1362
|
+
const addArgs = process.env.MVN_ARGS.split(" ");
|
|
1363
|
+
mvnArgs = mvnArgs.concat(addArgs);
|
|
1364
|
+
}
|
|
1365
|
+
// specVersion 1.4 doesn't support externalReferences.type=disribution-intake
|
|
1366
|
+
// so we need to run the plugin with the correct version
|
|
1367
|
+
if (options.specVersion === 1.4) {
|
|
1368
|
+
mvnArgs = mvnArgs.concat("-DschemaVersion=1.4");
|
|
1369
|
+
}
|
|
1334
1370
|
}
|
|
1335
1371
|
const firstPom = pomFiles.length ? pomFiles[0] : undefined;
|
|
1336
1372
|
let mavenCmd = getMavenCommand(path, path);
|
|
1337
1373
|
for (const f of pomFiles) {
|
|
1338
1374
|
const basePath = dirname(f);
|
|
1375
|
+
if (
|
|
1376
|
+
isQuarkus &&
|
|
1377
|
+
!options.deep &&
|
|
1378
|
+
rootModules?.includes(basename(basePath))
|
|
1379
|
+
) {
|
|
1380
|
+
if (DEBUG_MODE) {
|
|
1381
|
+
console.log("Skipped sub-module", basePath);
|
|
1382
|
+
}
|
|
1383
|
+
continue;
|
|
1384
|
+
}
|
|
1339
1385
|
const settingsXml = join(basePath, "settings.xml");
|
|
1340
1386
|
if (existsSync(settingsXml)) {
|
|
1341
1387
|
console.log(
|
|
@@ -1358,16 +1404,7 @@ export async function createJavaBom(path, options) {
|
|
|
1358
1404
|
}
|
|
1359
1405
|
}
|
|
1360
1406
|
// Use the cyclonedx maven plugin if there is no preference for maven deps tree
|
|
1361
|
-
if (!
|
|
1362
|
-
if (!mavenDepsTreeInfoShown && DEBUG_MODE) {
|
|
1363
|
-
console.log(
|
|
1364
|
-
"cdxgen now supports generating SBOM with only the maven cli without the need for the cyclonedx-maven plugin. This mode works better in enterprise environments and in multi-module projects.",
|
|
1365
|
-
);
|
|
1366
|
-
console.log(
|
|
1367
|
-
"Set the environment variable PREFER_MAVEN_DEPS_TREE to true to enable this.",
|
|
1368
|
-
);
|
|
1369
|
-
mavenDepsTreeInfoShown = true;
|
|
1370
|
-
}
|
|
1407
|
+
if (!useMavenDepsTree) {
|
|
1371
1408
|
console.log(
|
|
1372
1409
|
`Executing '${mavenCmd} ${mvnArgs.join(" ")}' in`,
|
|
1373
1410
|
basePath,
|
|
@@ -1381,19 +1418,23 @@ export async function createJavaBom(path, options) {
|
|
|
1381
1418
|
});
|
|
1382
1419
|
// Check if the cyclonedx plugin created the required bom.json file
|
|
1383
1420
|
// Sometimes the plugin fails silently for complex maven projects
|
|
1384
|
-
bomJsonFiles = getAllFiles(
|
|
1421
|
+
bomJsonFiles = getAllFiles(
|
|
1422
|
+
path,
|
|
1423
|
+
"**/target/*{cdx,bom,cyclonedx}*.json",
|
|
1424
|
+
options,
|
|
1425
|
+
);
|
|
1385
1426
|
// Check if the bom json files got created in a directory other than target
|
|
1386
1427
|
if (!bomJsonFiles.length) {
|
|
1387
1428
|
bomJsonFiles = getAllFiles(
|
|
1388
1429
|
path,
|
|
1389
|
-
"target/**/*{cdx,bom}*.json",
|
|
1430
|
+
"target/**/*{cdx,bom,cyclonedx}*.json",
|
|
1390
1431
|
options,
|
|
1391
1432
|
);
|
|
1392
1433
|
}
|
|
1393
1434
|
}
|
|
1394
1435
|
// Also check if the user has a preference for maven deps tree command
|
|
1395
1436
|
if (
|
|
1396
|
-
|
|
1437
|
+
useMavenDepsTree ||
|
|
1397
1438
|
!bomJsonFiles.length ||
|
|
1398
1439
|
result?.status !== 0 ||
|
|
1399
1440
|
result?.error
|
|
@@ -1539,7 +1580,7 @@ export async function createJavaBom(path, options) {
|
|
|
1539
1580
|
}
|
|
1540
1581
|
} // for
|
|
1541
1582
|
// Locate and parse all bom.json files from the maven plugin
|
|
1542
|
-
if (!
|
|
1583
|
+
if (!useMavenDepsTree) {
|
|
1543
1584
|
for (const abjson of bomJsonFiles) {
|
|
1544
1585
|
let bomJsonObj = undefined;
|
|
1545
1586
|
try {
|
|
@@ -1556,7 +1597,9 @@ export async function createJavaBom(path, options) {
|
|
|
1556
1597
|
!tools &&
|
|
1557
1598
|
bomJsonObj.metadata &&
|
|
1558
1599
|
bomJsonObj.metadata.tools &&
|
|
1559
|
-
Array.isArray(bomJsonObj.metadata.tools)
|
|
1600
|
+
(Array.isArray(bomJsonObj.metadata.tools) ||
|
|
1601
|
+
bomJsonObj.metadata.tools.components ||
|
|
1602
|
+
bomJsonObj.metadata.tools.services)
|
|
1560
1603
|
) {
|
|
1561
1604
|
tools = bomJsonObj.metadata.tools;
|
|
1562
1605
|
}
|
|
@@ -1621,10 +1664,6 @@ export async function createJavaBom(path, options) {
|
|
|
1621
1664
|
console.warn(
|
|
1622
1665
|
"Multiple errors occurred while building this project with maven. The SBOM is therefore incomplete!",
|
|
1623
1666
|
);
|
|
1624
|
-
} else if (!PREFER_MAVEN_DEPS_TREE) {
|
|
1625
|
-
console.log(
|
|
1626
|
-
"Try generating an SBOM with the maven dependency tree plugin. Set the environment variable PREFER_MAVEN_DEPS_TREE to true to enable this.",
|
|
1627
|
-
);
|
|
1628
1667
|
}
|
|
1629
1668
|
}
|
|
1630
1669
|
}
|
package/lib/helpers/display.js
CHANGED
|
@@ -178,34 +178,44 @@ const locationComparator = (a, b) => {
|
|
|
178
178
|
};
|
|
179
179
|
|
|
180
180
|
export function printOccurrences(bomJson) {
|
|
181
|
-
const data = [["Group", "Name", "Version", "Occurrences"]];
|
|
182
181
|
if (!bomJson || !bomJson.components) {
|
|
183
182
|
return;
|
|
184
183
|
}
|
|
185
|
-
|
|
186
|
-
if (!comp.evidence || !comp.evidence.occurrences) {
|
|
187
|
-
continue;
|
|
188
|
-
}
|
|
189
|
-
data.push([
|
|
190
|
-
comp.group || "",
|
|
191
|
-
comp.name,
|
|
192
|
-
comp.version || "",
|
|
193
|
-
comp.evidence.occurrences
|
|
194
|
-
.map((l) => l.location)
|
|
195
|
-
.sort(locationComparator)
|
|
196
|
-
.join("\n"),
|
|
197
|
-
]);
|
|
198
|
-
}
|
|
184
|
+
const data = ["Group", "Name", "Version", "Occurrences"];
|
|
199
185
|
const config = {
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
content: "Component Evidence\nGenerated with \u2665 by cdxgen",
|
|
186
|
+
columnDefault: {
|
|
187
|
+
width: 30,
|
|
203
188
|
},
|
|
189
|
+
columnCount: 4,
|
|
190
|
+
columns: [
|
|
191
|
+
{ width: 30 },
|
|
192
|
+
{ width: 30 },
|
|
193
|
+
{ width: 25, alignment: "right" },
|
|
194
|
+
{ width: 80 },
|
|
195
|
+
],
|
|
204
196
|
};
|
|
205
|
-
|
|
206
|
-
|
|
197
|
+
const stream = createStream(config); // Create stream with the config
|
|
198
|
+
const header = "Component Evidence\nGenerated with \u2665 by cdxgen";
|
|
199
|
+
console.log(header);
|
|
200
|
+
stream.write(data);
|
|
201
|
+
// Stream the components
|
|
202
|
+
for (const comp of bomJson.components) {
|
|
203
|
+
if (comp.evidence?.occurrences) {
|
|
204
|
+
const row = [
|
|
205
|
+
comp.group || "",
|
|
206
|
+
comp.name,
|
|
207
|
+
comp.version || "",
|
|
208
|
+
comp.evidence.occurrences
|
|
209
|
+
.map((l) => l.location)
|
|
210
|
+
.sort(locationComparator)
|
|
211
|
+
.join("\n"),
|
|
212
|
+
];
|
|
213
|
+
stream.write(row);
|
|
214
|
+
}
|
|
207
215
|
}
|
|
216
|
+
console.log();
|
|
208
217
|
}
|
|
218
|
+
|
|
209
219
|
export function printCallStack(bomJson) {
|
|
210
220
|
const data = [["Group", "Name", "Version", "Call Stack"]];
|
|
211
221
|
if (!bomJson || !bomJson.components) {
|
package/lib/helpers/utils.js
CHANGED
|
@@ -267,6 +267,7 @@ export const PROJECT_TYPE_ALIASES = {
|
|
|
267
267
|
"maven",
|
|
268
268
|
"sbt",
|
|
269
269
|
"bazel",
|
|
270
|
+
"quarkus",
|
|
270
271
|
],
|
|
271
272
|
android: ["android", "apk", "aab"],
|
|
272
273
|
jar: ["jar", "war", "ear"],
|
|
@@ -401,15 +402,12 @@ export function isFeatureEnabled(cliOptions, feature) {
|
|
|
401
402
|
return true;
|
|
402
403
|
}
|
|
403
404
|
// Retry by replacing hyphens with underscore
|
|
404
|
-
|
|
405
|
+
return !!(
|
|
405
406
|
process.env[feature.replaceAll("-", "_").toUpperCase()] &&
|
|
406
407
|
["true", "1"].includes(
|
|
407
408
|
process.env[feature.replaceAll("-", "_").toUpperCase()],
|
|
408
409
|
)
|
|
409
|
-
)
|
|
410
|
-
return true;
|
|
411
|
-
}
|
|
412
|
-
return false;
|
|
410
|
+
);
|
|
413
411
|
}
|
|
414
412
|
|
|
415
413
|
/**
|
|
@@ -618,16 +616,10 @@ export function isSpdxLicenseExpression(license) {
|
|
|
618
616
|
if (!license) {
|
|
619
617
|
return false;
|
|
620
618
|
}
|
|
621
|
-
|
|
622
619
|
if (/[(\s]+/g.test(license)) {
|
|
623
620
|
return true;
|
|
624
621
|
}
|
|
625
|
-
|
|
626
|
-
if (license.endsWith("+")) {
|
|
627
|
-
return true; // GPL-2.0+ means GPL-2.0 or any later version, at the licensee’s option.
|
|
628
|
-
}
|
|
629
|
-
|
|
630
|
-
return false;
|
|
622
|
+
return !!license.endsWith("+");
|
|
631
623
|
}
|
|
632
624
|
|
|
633
625
|
/**
|
|
@@ -1064,8 +1056,8 @@ export async function parsePkgLock(pkgLockFile, options = {}) {
|
|
|
1064
1056
|
const scope = node.dev === true ? "optional" : undefined;
|
|
1065
1057
|
const integrity = node.integrity ? node.integrity : undefined;
|
|
1066
1058
|
|
|
1067
|
-
let pkg
|
|
1068
|
-
let purlString
|
|
1059
|
+
let pkg;
|
|
1060
|
+
let purlString;
|
|
1069
1061
|
const author = node.package.author;
|
|
1070
1062
|
const authorString =
|
|
1071
1063
|
author instanceof Object
|
|
@@ -2515,9 +2507,14 @@ export async function parseMinJs(minJsFile) {
|
|
|
2515
2507
|
* Parse pom file
|
|
2516
2508
|
*
|
|
2517
2509
|
* @param {string} pomFile pom file to parse
|
|
2510
|
+
* @returns {Object} Object containing pom properties, modules, and array of dependencies
|
|
2518
2511
|
*/
|
|
2519
2512
|
export function parsePom(pomFile) {
|
|
2520
2513
|
const deps = [];
|
|
2514
|
+
let modules;
|
|
2515
|
+
let pomPurl;
|
|
2516
|
+
const properties = {};
|
|
2517
|
+
let isQuarkus = false;
|
|
2521
2518
|
const xmlData = readFileSync(pomFile, "utf-8");
|
|
2522
2519
|
const project = xml2js(xmlData, {
|
|
2523
2520
|
compact: true,
|
|
@@ -2526,6 +2523,69 @@ export function parsePom(pomFile) {
|
|
|
2526
2523
|
attributesKey: "$",
|
|
2527
2524
|
commentKey: "value",
|
|
2528
2525
|
}).project;
|
|
2526
|
+
for (const aprop of [
|
|
2527
|
+
"groupId",
|
|
2528
|
+
"artifactId",
|
|
2529
|
+
"version",
|
|
2530
|
+
"name",
|
|
2531
|
+
"description",
|
|
2532
|
+
"url",
|
|
2533
|
+
"packaging",
|
|
2534
|
+
]) {
|
|
2535
|
+
if (project?.[aprop]?._) {
|
|
2536
|
+
properties[aprop] = project[aprop]._;
|
|
2537
|
+
}
|
|
2538
|
+
}
|
|
2539
|
+
// Take the version from the parent if available
|
|
2540
|
+
if (!properties.version && project.parent) {
|
|
2541
|
+
properties.version = project.parent.version._;
|
|
2542
|
+
}
|
|
2543
|
+
// Take the groupId from the parent if available
|
|
2544
|
+
if (!properties.groupId && project.parent) {
|
|
2545
|
+
properties.groupId = project.parent.groupId._;
|
|
2546
|
+
}
|
|
2547
|
+
if (project?.scm?.url?._) {
|
|
2548
|
+
properties.scm = project.scm.url._;
|
|
2549
|
+
}
|
|
2550
|
+
if (properties.groupId || properties.artifactId) {
|
|
2551
|
+
pomPurl = new PackageURL(
|
|
2552
|
+
"maven",
|
|
2553
|
+
properties.groupId || "",
|
|
2554
|
+
properties.artifactId,
|
|
2555
|
+
properties.version,
|
|
2556
|
+
{ type: properties.packaging || "jar" },
|
|
2557
|
+
null,
|
|
2558
|
+
).toString();
|
|
2559
|
+
}
|
|
2560
|
+
if (project?.modules?.module) {
|
|
2561
|
+
modules = project.modules.module.map((m) => m?._);
|
|
2562
|
+
}
|
|
2563
|
+
if (project?.properties) {
|
|
2564
|
+
for (const aprop of Object.keys(project.properties)) {
|
|
2565
|
+
properties[aprop] = project.properties[aprop]?._;
|
|
2566
|
+
if (!isQuarkus && aprop.startsWith("quarkus.platform")) {
|
|
2567
|
+
isQuarkus = true;
|
|
2568
|
+
}
|
|
2569
|
+
}
|
|
2570
|
+
}
|
|
2571
|
+
// Check the plugins for quarkus
|
|
2572
|
+
if (!isQuarkus && project?.build?.plugins?.plugin) {
|
|
2573
|
+
if (Array.isArray(project.build.plugins.plugin)) {
|
|
2574
|
+
for (const aplugin of project.build.plugins.plugin) {
|
|
2575
|
+
if (aplugin?.groupId?._?.includes("quarkus.platform")) {
|
|
2576
|
+
isQuarkus = true;
|
|
2577
|
+
break;
|
|
2578
|
+
}
|
|
2579
|
+
}
|
|
2580
|
+
} else if (
|
|
2581
|
+
Object.keys(project.build.plugins.plugin).length &&
|
|
2582
|
+
project.build.plugins.plugin?.groupId?._
|
|
2583
|
+
) {
|
|
2584
|
+
if (project.build.plugins.plugin.groupId._.includes("quarkus.platform")) {
|
|
2585
|
+
isQuarkus = true;
|
|
2586
|
+
}
|
|
2587
|
+
}
|
|
2588
|
+
}
|
|
2529
2589
|
if (project?.dependencies) {
|
|
2530
2590
|
let dependencies = project.dependencies.dependency;
|
|
2531
2591
|
// Convert to an array
|
|
@@ -2537,38 +2597,42 @@ export function parsePom(pomFile) {
|
|
|
2537
2597
|
for (const adep of dependencies) {
|
|
2538
2598
|
const version = adep.version;
|
|
2539
2599
|
let versionStr = undefined;
|
|
2540
|
-
if (version?._
|
|
2600
|
+
if (version?._) {
|
|
2541
2601
|
versionStr = version._;
|
|
2542
|
-
|
|
2543
|
-
|
|
2544
|
-
|
|
2545
|
-
|
|
2546
|
-
|
|
2547
|
-
|
|
2548
|
-
|
|
2549
|
-
|
|
2550
|
-
|
|
2551
|
-
|
|
2552
|
-
|
|
2553
|
-
|
|
2554
|
-
|
|
2555
|
-
|
|
2556
|
-
field: "purl",
|
|
2557
|
-
confidence: 1,
|
|
2558
|
-
methods: [
|
|
2559
|
-
{
|
|
2560
|
-
technique: "manifest-analysis",
|
|
2561
|
-
confidence: 1,
|
|
2562
|
-
value: pomFile,
|
|
2563
|
-
},
|
|
2564
|
-
],
|
|
2565
|
-
},
|
|
2602
|
+
}
|
|
2603
|
+
if (versionStr?.includes("$")) {
|
|
2604
|
+
versionStr = properties[versionStr?.replace(/[${}]/g, "")];
|
|
2605
|
+
}
|
|
2606
|
+
if (includeMavenTestScope || !adep.scope || adep.scope !== "test") {
|
|
2607
|
+
deps.push({
|
|
2608
|
+
group: adep.groupId ? adep.groupId._ : "",
|
|
2609
|
+
name: adep.artifactId ? adep.artifactId._ : "",
|
|
2610
|
+
version: versionStr,
|
|
2611
|
+
qualifiers: { type: "jar" },
|
|
2612
|
+
properties: [
|
|
2613
|
+
{
|
|
2614
|
+
name: "SrcFile",
|
|
2615
|
+
value: pomFile,
|
|
2566
2616
|
},
|
|
2567
|
-
|
|
2617
|
+
],
|
|
2618
|
+
evidence: {
|
|
2619
|
+
identity: {
|
|
2620
|
+
field: "purl",
|
|
2621
|
+
confidence: 1,
|
|
2622
|
+
methods: [
|
|
2623
|
+
{
|
|
2624
|
+
technique: "manifest-analysis",
|
|
2625
|
+
confidence: !versionStr ? 0 : 0.6,
|
|
2626
|
+
value: pomFile,
|
|
2627
|
+
},
|
|
2628
|
+
],
|
|
2629
|
+
},
|
|
2630
|
+
},
|
|
2631
|
+
});
|
|
2568
2632
|
}
|
|
2569
2633
|
}
|
|
2570
2634
|
}
|
|
2571
|
-
return deps;
|
|
2635
|
+
return { isQuarkus, pomPurl, modules, properties, dependencies: deps };
|
|
2572
2636
|
}
|
|
2573
2637
|
|
|
2574
2638
|
/**
|
|
@@ -3553,10 +3617,7 @@ export async function getMvnMetadata(
|
|
|
3553
3617
|
*/
|
|
3554
3618
|
export function composePomXmlUrl({ urlPrefix, group, name, version }) {
|
|
3555
3619
|
const groupPart = group.replace(/\./g, "/");
|
|
3556
|
-
|
|
3557
|
-
urlPrefix + groupPart
|
|
3558
|
-
}/${name}/${version}/${name}-${version}.pom`;
|
|
3559
|
-
return fullUrl;
|
|
3620
|
+
return `${urlPrefix + groupPart}/${name}/${version}/${name}-${version}.pom`;
|
|
3560
3621
|
}
|
|
3561
3622
|
|
|
3562
3623
|
/**
|
|
@@ -3593,8 +3654,7 @@ export async function fetchPomXmlAsJson({ urlPrefix, group, name, version }) {
|
|
|
3593
3654
|
return undefined;
|
|
3594
3655
|
}
|
|
3595
3656
|
const parentJson = xml2js(parentXml, options).project;
|
|
3596
|
-
|
|
3597
|
-
return result;
|
|
3657
|
+
return { ...parentJson, ...pomJson };
|
|
3598
3658
|
}
|
|
3599
3659
|
return pomJson;
|
|
3600
3660
|
}
|
|
@@ -4418,7 +4478,7 @@ export async function parseReqFile(reqData, fetchDepsInfo) {
|
|
|
4418
4478
|
export async function getPyModules(src, epkgList, options) {
|
|
4419
4479
|
const allImports = {};
|
|
4420
4480
|
const dependenciesList = [];
|
|
4421
|
-
let modList
|
|
4481
|
+
let modList;
|
|
4422
4482
|
const slicesFile = resolve(
|
|
4423
4483
|
options.depsSlicesFile || options.usagesSlicesFile,
|
|
4424
4484
|
);
|
|
@@ -4540,10 +4600,10 @@ export function parsePixiLockFile(pixiLockFileName, path) {
|
|
|
4540
4600
|
const pixiLockData = _load(pixiFileData);
|
|
4541
4601
|
|
|
4542
4602
|
// this function returns
|
|
4543
|
-
let pkgList
|
|
4603
|
+
let pkgList;
|
|
4544
4604
|
const formulationList = [];
|
|
4545
4605
|
const rootList = [];
|
|
4546
|
-
let dependenciesList
|
|
4606
|
+
let dependenciesList;
|
|
4547
4607
|
// we do not set false because we have assumed that pixi lock is accurate
|
|
4548
4608
|
const frozen = true;
|
|
4549
4609
|
|
|
@@ -4791,8 +4851,7 @@ export function getGithubUrlParts(repoUrl) {
|
|
|
4791
4851
|
repoUrl = repoUrl.slice(0, -4);
|
|
4792
4852
|
}
|
|
4793
4853
|
repoUrl.replace(/\/$/, "");
|
|
4794
|
-
|
|
4795
|
-
return parts;
|
|
4854
|
+
return repoUrl.split("/");
|
|
4796
4855
|
}
|
|
4797
4856
|
|
|
4798
4857
|
/**
|
|
@@ -4940,7 +4999,6 @@ export async function getGoPkgLicense(repoMetadata) {
|
|
|
4940
4999
|
}
|
|
4941
5000
|
|
|
4942
5001
|
export async function getGoPkgComponent(group, name, version, hash) {
|
|
4943
|
-
let pkg = {};
|
|
4944
5002
|
let license = undefined;
|
|
4945
5003
|
if (shouldFetchLicense()) {
|
|
4946
5004
|
if (DEBUG_MODE) {
|
|
@@ -4957,7 +5015,7 @@ export async function getGoPkgComponent(group, name, version, hash) {
|
|
|
4957
5015
|
const purlString = new PackageURL("golang", group, name, version)
|
|
4958
5016
|
.toString()
|
|
4959
5017
|
.replace(/%2F/g, "/");
|
|
4960
|
-
|
|
5018
|
+
return {
|
|
4961
5019
|
group: group,
|
|
4962
5020
|
name: name,
|
|
4963
5021
|
version: version,
|
|
@@ -4966,7 +5024,6 @@ export async function getGoPkgComponent(group, name, version, hash) {
|
|
|
4966
5024
|
purl: purlString,
|
|
4967
5025
|
"bom-ref": decodeURIComponent(purlString),
|
|
4968
5026
|
};
|
|
4969
|
-
return pkg;
|
|
4970
5027
|
}
|
|
4971
5028
|
|
|
4972
5029
|
/**
|
|
@@ -7698,7 +7755,7 @@ export function parseNuspecData(nupkgFile, nuspecData) {
|
|
|
7698
7755
|
}
|
|
7699
7756
|
dependenciesMap[pkg["bom-ref"]] = dependsOn;
|
|
7700
7757
|
} else if (m?.dependencies?.group) {
|
|
7701
|
-
let dependencyGroups
|
|
7758
|
+
let dependencyGroups;
|
|
7702
7759
|
if (Array.isArray(m.dependencies.group)) {
|
|
7703
7760
|
dependencyGroups = m.dependencies.group;
|
|
7704
7761
|
} else {
|
|
@@ -9485,8 +9542,7 @@ export async function collectGradleDependencies(
|
|
|
9485
9542
|
for (const apom of pomFiles) {
|
|
9486
9543
|
pomPathMap[basename(apom)] = apom;
|
|
9487
9544
|
}
|
|
9488
|
-
|
|
9489
|
-
return jarNSMapping;
|
|
9545
|
+
return await collectJarNS(GRADLE_CACHE_DIR, pomPathMap);
|
|
9490
9546
|
}
|
|
9491
9547
|
|
|
9492
9548
|
/**
|
|
@@ -9516,10 +9572,9 @@ export async function collectJarNS(jarPath, pomPathMap = {}) {
|
|
|
9516
9572
|
const jarFiles = getAllFiles(jarPath, "**/*.jar");
|
|
9517
9573
|
if (jarFiles?.length) {
|
|
9518
9574
|
for (const jf of jarFiles) {
|
|
9519
|
-
const jarname = jf;
|
|
9520
9575
|
let pomname =
|
|
9521
9576
|
pomPathMap[basename(jf).replace(".jar", ".pom")] ||
|
|
9522
|
-
|
|
9577
|
+
jf.replace(".jar", ".pom");
|
|
9523
9578
|
let pomData = undefined;
|
|
9524
9579
|
let purl = undefined;
|
|
9525
9580
|
// In some cases, the pom name might be slightly different to the jar name
|
|
@@ -9536,6 +9591,7 @@ export async function collectJarNS(jarPath, pomPathMap = {}) {
|
|
|
9536
9591
|
}
|
|
9537
9592
|
}
|
|
9538
9593
|
if (existsSync(pomname)) {
|
|
9594
|
+
// TODO: Replace with parsePom which contains pomPurl
|
|
9539
9595
|
pomData = parsePomXml(readFileSync(pomname, { encoding: "utf-8" }));
|
|
9540
9596
|
if (pomData) {
|
|
9541
9597
|
const purlObj = new PackageURL(
|
|
@@ -9715,6 +9771,13 @@ export function convertJarNSToPackages(jarNSMapping) {
|
|
|
9715
9771
|
return pkgList;
|
|
9716
9772
|
}
|
|
9717
9773
|
|
|
9774
|
+
/**
|
|
9775
|
+
* Deprecated function to parse pom.xml. Use parsePom instead.
|
|
9776
|
+
*
|
|
9777
|
+
* @deprecated
|
|
9778
|
+
* @param pomXmlData XML contents
|
|
9779
|
+
* @returns {Object} Parent component data
|
|
9780
|
+
*/
|
|
9718
9781
|
export function parsePomXml(pomXmlData) {
|
|
9719
9782
|
if (!pomXmlData) {
|
|
9720
9783
|
return undefined;
|
|
@@ -10253,7 +10316,7 @@ export async function readZipEntry(
|
|
|
10253
10316
|
break;
|
|
10254
10317
|
}
|
|
10255
10318
|
}
|
|
10256
|
-
zip.close();
|
|
10319
|
+
await zip.close();
|
|
10257
10320
|
} catch (e) {
|
|
10258
10321
|
console.log(e);
|
|
10259
10322
|
}
|
|
@@ -10298,7 +10361,7 @@ export async function getJarClasses(jarFile) {
|
|
|
10298
10361
|
);
|
|
10299
10362
|
}
|
|
10300
10363
|
}
|
|
10301
|
-
zip.close();
|
|
10364
|
+
await zip.close();
|
|
10302
10365
|
} catch (e) {
|
|
10303
10366
|
// node-stream-zip seems to fail on deno with a RangeError.
|
|
10304
10367
|
// So we fallback to using jar -tf command
|
|
@@ -11726,7 +11789,7 @@ export function parseCmakeLikeFile(cmakeListFile, pkgType, options = {}) {
|
|
|
11726
11789
|
const tmpB = (tmpA[1] || "")
|
|
11727
11790
|
.trim()
|
|
11728
11791
|
.replace(/["']/g, "")
|
|
11729
|
-
.replace(/
|
|
11792
|
+
.replace(/ /g, ",")
|
|
11730
11793
|
.split(")")[0]
|
|
11731
11794
|
.split(",")
|
|
11732
11795
|
.filter((v) => v.length > 1);
|
|
@@ -11797,7 +11860,7 @@ export function parseCmakeLikeFile(cmakeListFile, pkgType, options = {}) {
|
|
|
11797
11860
|
// find_package(Boost 1.79 COMPONENTS date_time)
|
|
11798
11861
|
// find_library(PTHREADPOOL_LIB pthreadpool REQUIRED)
|
|
11799
11862
|
if (tmpB) {
|
|
11800
|
-
let working_name
|
|
11863
|
+
let working_name;
|
|
11801
11864
|
if (l.startsWith("find_library")) {
|
|
11802
11865
|
name_list.push(tmpB[1]);
|
|
11803
11866
|
working_name = tmpB[1];
|
|
@@ -11985,7 +12048,7 @@ export function getCppModules(src, options, osPkgsList, epkgList) {
|
|
|
11985
12048
|
const pkgType = "generic";
|
|
11986
12049
|
const pkgList = [];
|
|
11987
12050
|
const pkgAddedMap = {};
|
|
11988
|
-
let sliceData
|
|
12051
|
+
let sliceData;
|
|
11989
12052
|
const epkgMap = {};
|
|
11990
12053
|
let parentComponent = undefined;
|
|
11991
12054
|
const dependsOn = new Set();
|
|
@@ -12730,10 +12793,7 @@ export function isValidIriReference(iri) {
|
|
|
12730
12793
|
iriIsValid = false;
|
|
12731
12794
|
}
|
|
12732
12795
|
}
|
|
12733
|
-
|
|
12734
|
-
return true;
|
|
12735
|
-
}
|
|
12736
|
-
return false;
|
|
12796
|
+
return iriIsValid;
|
|
12737
12797
|
}
|
|
12738
12798
|
|
|
12739
12799
|
/**
|
|
@@ -2640,14 +2640,25 @@ test("get nget metadata", async () => {
|
|
|
2640
2640
|
}, 240000);
|
|
2641
2641
|
|
|
2642
2642
|
test("parsePomFile", () => {
|
|
2643
|
-
|
|
2644
|
-
expect(data.length).toEqual(
|
|
2643
|
+
let data = parsePom("./test/data/pom-quarkus.xml");
|
|
2644
|
+
expect(data.dependencies.length).toEqual(46);
|
|
2645
|
+
expect(data.modules).toBeUndefined();
|
|
2646
|
+
expect(data.properties).toBeDefined();
|
|
2647
|
+
expect(data.isQuarkus).toBeTruthy();
|
|
2648
|
+
data = parsePom("./test/data/pom-quarkus-modules.xml");
|
|
2649
|
+
expect(data.dependencies.length).toEqual(0);
|
|
2650
|
+
expect(data.modules.length).toEqual(105);
|
|
2651
|
+
expect(data.properties).toBeDefined();
|
|
2652
|
+
expect(data.isQuarkus).toBeFalsy();
|
|
2653
|
+
data = parsePom("./test/pom.xml");
|
|
2654
|
+
expect(data.dependencies.length).toEqual(13);
|
|
2655
|
+
expect(data.isQuarkus).toBeFalsy();
|
|
2645
2656
|
});
|
|
2646
2657
|
|
|
2647
2658
|
test("parsePomMetadata", async () => {
|
|
2648
2659
|
const deps = parsePom("./test/pom.xml");
|
|
2649
|
-
const data = await getMvnMetadata(deps);
|
|
2650
|
-
expect(data.length).toEqual(deps.length);
|
|
2660
|
+
const data = await getMvnMetadata(deps.dependencies);
|
|
2661
|
+
expect(data.length).toEqual(deps.dependencies.length);
|
|
2651
2662
|
});
|
|
2652
2663
|
|
|
2653
2664
|
// These tests are disabled because they are returning undefined
|
|
@@ -2689,7 +2700,6 @@ test("get repo license", async () => {
|
|
|
2689
2700
|
url: "https://github.com/ugorji/go/blob/master/LICENSE"
|
|
2690
2701
|
});
|
|
2691
2702
|
});
|
|
2692
|
-
*/
|
|
2693
2703
|
|
|
2694
2704
|
test("get go pkg license", async () => {
|
|
2695
2705
|
let license = await getGoPkgLicense({
|
|
@@ -2725,6 +2735,7 @@ test("get go pkg license", async () => {
|
|
|
2725
2735
|
},
|
|
2726
2736
|
]);
|
|
2727
2737
|
});
|
|
2738
|
+
*/
|
|
2728
2739
|
|
|
2729
2740
|
test("get licenses", () => {
|
|
2730
2741
|
let licenses = getLicenses({ license: "MIT" });
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cyclonedx/cdxgen",
|
|
3
|
-
"version": "11.0.
|
|
3
|
+
"version": "11.0.5",
|
|
4
4
|
"description": "Creates CycloneDX Software Bill of Materials (SBOM) from source or container image",
|
|
5
5
|
"homepage": "http://github.com/cyclonedx/cdxgen",
|
|
6
6
|
"author": "Prabhu Subramanian <prabhu@appthreat.com>",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/cli/index.js"],"names":[],"mappings":"AA4wBA;;;;;;;;GAQG;AACH,gFAFW,MAAM,SAchB;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/cli/index.js"],"names":[],"mappings":"AA4wBA;;;;;;;;GAQG;AACH,gFAFW,MAAM,SAchB;AAgWD;;;;;;;GAOG;AACH,mCALW,MAAM,qBAiEhB;AAED;;;;;GAKG;AACH,uCAHW,MAAM;;;;EAKhB;AAED;;;;;GAKG;AACH,sCAHW,MAAM;;;;EAkBhB;AAED;;;;;GAKG;AACH,oCAHW,MAAM,8BAs7BhB;AAED;;;;;GAKG;AACH,sCAHW,MAAM,8BA2ehB;AAED;;;;;;;;;;GAUG;AACH,+DAsEC;AAED;;;;;GAKG;AACH,sCAHW,MAAM,8BA6bhB;AAED;;;;;GAKG;AACH,kCAHW,MAAM,8BA+YhB;AAED;;;;;GAKG;AACH,oCAHW,MAAM,8BAqIhB;AAED;;;;;GAKG;AACH,oCAHW,MAAM,8BAiDhB;AAED;;;;;GAKG;AACH,mCAHW,MAAM,qBA+KhB;AAED;;;;;GAKG;AACH,uCAHW,MAAM,qBAsHhB;AAED;;;;;GAKG;AACH,uCAHW,MAAM,qBA2BhB;AAED;;;;;GAKG;AACH,sCAHW,MAAM,qBA2BhB;AAED;;;;;GAKG;AACH,sCAHW,MAAM,qBA2BhB;AAED;;;;;GAKG;AACH,0CAHW,MAAM,qBAuBhB;AAED;;;;;GAKG;AACH,mCAHW,MAAM,8BAqDhB;AAED;;;;;GAKG;AACH,uCAHW,MAAM,8BA4ChB;AAED;;;;;GAKG;AACH,oCAHW,MAAM,qBA2BhB;AAED;;;;;GAKG;AACH,qCAHW,MAAM,8BA6FhB;AAED;;;;;GAKG;AACH,iDAHW,MAAM,qBAiUhB;AAED;;;;;GAKG;AACH,mCAHW,MAAM,qBAqJhB;AAED;;;;;GAKG;AACH,oCAHW,MAAM,8BAmFhB;AAED;;;;;GAKG;AACH,sCAHW,MAAM,8BA4XhB;AAED;;;;;GAKG;AACH,2CAHW,MAAM;;;;;;;;;;;;;;;;;;;;GAoChB;AAED;;;;;;;;KA+DC;AAED;;;;;;GAMG;AACH,yDAuCC;AAED;;;;;;;;;GASG;AACH,2GA6BC;AAED;;;;;GAKG;AACH,0CAHW,MAAM,EAAE,8BAmclB;AAED;;;;;GAKG;AACH,iCAHW,MAAM,8BAgUhB;AAED;;;;;GAKG;AACH,gCAHW,MAAM,qBAqOhB;AAED;;;;;;GAMG;AACH,wDAFY,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,SAAS,CAAC,CAwHxE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"display.d.ts","sourceRoot":"","sources":["../../../lib/helpers/display.js"],"names":[],"mappings":"AAoBA,mFAuEC;AAQD,iDAmBC;AACD,kDAsBC;AAED,qDAqBC;AAeD,
|
|
1
|
+
{"version":3,"file":"display.d.ts","sourceRoot":"","sources":["../../../lib/helpers/display.js"],"names":[],"mappings":"AAoBA,mFAuEC;AAQD,iDAmBC;AACD,kDAsBC;AAED,qDAqBC;AAeD,qDAqCC;AAED,mDA8CC;AACD,wFA0CC;AA4DD,2DA+BC;AAED,iEA0BC;AAED,uDAoBC;AAED,iDA8CC"}
|
|
@@ -186,30 +186,9 @@ export function parseMinJs(minJsFile: string): Promise<any[]>;
|
|
|
186
186
|
* Parse pom file
|
|
187
187
|
*
|
|
188
188
|
* @param {string} pomFile pom file to parse
|
|
189
|
+
* @returns {Object} Object containing pom properties, modules, and array of dependencies
|
|
189
190
|
*/
|
|
190
|
-
export function parsePom(pomFile: string):
|
|
191
|
-
group: any;
|
|
192
|
-
name: any;
|
|
193
|
-
version: any;
|
|
194
|
-
qualifiers: {
|
|
195
|
-
type: string;
|
|
196
|
-
};
|
|
197
|
-
properties: {
|
|
198
|
-
name: string;
|
|
199
|
-
value: string;
|
|
200
|
-
}[];
|
|
201
|
-
evidence: {
|
|
202
|
-
identity: {
|
|
203
|
-
field: string;
|
|
204
|
-
confidence: number;
|
|
205
|
-
methods: {
|
|
206
|
-
technique: string;
|
|
207
|
-
confidence: number;
|
|
208
|
-
value: string;
|
|
209
|
-
}[];
|
|
210
|
-
};
|
|
211
|
-
};
|
|
212
|
-
}[];
|
|
191
|
+
export function parsePom(pomFile: string): any;
|
|
213
192
|
/**
|
|
214
193
|
* Parse maven tree output
|
|
215
194
|
* @param {string} rawOutput Raw string output
|
|
@@ -527,7 +506,15 @@ export function getRepoLicense(repoUrl: string, repoMetadata: any): Promise<stri
|
|
|
527
506
|
* @param {Object} repoMetadata Repo metadata
|
|
528
507
|
*/
|
|
529
508
|
export function getGoPkgLicense(repoMetadata: any): Promise<any>;
|
|
530
|
-
export function getGoPkgComponent(group: any, name: any, version: any, hash: any): Promise<{
|
|
509
|
+
export function getGoPkgComponent(group: any, name: any, version: any, hash: any): Promise<{
|
|
510
|
+
group: any;
|
|
511
|
+
name: any;
|
|
512
|
+
version: any;
|
|
513
|
+
_integrity: any;
|
|
514
|
+
license: any;
|
|
515
|
+
purl: string;
|
|
516
|
+
"bom-ref": string;
|
|
517
|
+
}>;
|
|
531
518
|
/**
|
|
532
519
|
* Method to parse go.mod files
|
|
533
520
|
*
|
|
@@ -546,7 +533,15 @@ export function parseGoModData(goModData: string, gosumMap: any): any;
|
|
|
546
533
|
*/
|
|
547
534
|
export function parseGoListDep(rawOutput: string, gosumMap: any): Promise<{
|
|
548
535
|
parentComponent: {};
|
|
549
|
-
pkgList: {
|
|
536
|
+
pkgList: {
|
|
537
|
+
group: any;
|
|
538
|
+
name: any;
|
|
539
|
+
version: any;
|
|
540
|
+
_integrity: any;
|
|
541
|
+
license: any;
|
|
542
|
+
purl: string;
|
|
543
|
+
"bom-ref": string;
|
|
544
|
+
}[];
|
|
550
545
|
}>;
|
|
551
546
|
/**
|
|
552
547
|
* Parse go mod graph
|
|
@@ -965,14 +960,14 @@ export function convertJarNSToPackages(jarNSMapping: any): {
|
|
|
965
960
|
value: any;
|
|
966
961
|
}[];
|
|
967
962
|
}[];
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
963
|
+
/**
|
|
964
|
+
* Deprecated function to parse pom.xml. Use parsePom instead.
|
|
965
|
+
*
|
|
966
|
+
* @deprecated
|
|
967
|
+
* @param pomXmlData XML contents
|
|
968
|
+
* @returns {Object} Parent component data
|
|
969
|
+
*/
|
|
970
|
+
export function parsePomXml(pomXmlData: any): any;
|
|
976
971
|
export function parseJarManifest(jarMetadata: any): {};
|
|
977
972
|
export function parsePomProperties(pomProperties: any): {};
|
|
978
973
|
export function encodeForPurl(s: any): any;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../lib/helpers/utils.js"],"names":[],"mappings":"AAyIA,8CAKC;AAqBD,yCAYC;AAED,2CAQC;
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../lib/helpers/utils.js"],"names":[],"mappings":"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"}
|