@payfit/nx-core 4.39.0 → 4.39.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/package.json +1 -1
- package/src/executors/publisher/docker.js +4 -1
- package/src/executors/publisher/docker.js.map +1 -1
- package/src/executors/publisher/helm.js +2 -2
- package/src/executors/publisher/helm.js.map +1 -1
- package/src/utils/docker.d.ts +2 -1
- package/src/utils/docker.js +17 -16
- package/src/utils/docker.js.map +1 -1
package/package.json
CHANGED
|
@@ -47,7 +47,10 @@ async function publishDocker(options, context, version, projectRoot, isDryRun) {
|
|
|
47
47
|
const extraTags = !version.includes('ephemeral') && options.extraReleaseTags
|
|
48
48
|
? options.extraReleaseTags
|
|
49
49
|
: [];
|
|
50
|
-
|
|
50
|
+
const sanitizedRepoUrl = await (0, github_1.getSanitizedCurrentGitRepoUrl)();
|
|
51
|
+
const commitSha = await (0, github_1.getCurrentGitCommitSha)();
|
|
52
|
+
const appName = context.projectName || 'unknown-app';
|
|
53
|
+
await (0, docker_1.buildAndPushDockerImage)(options.ecrRegistry, projectDockerfile, version, sanitizedRepoUrl, commitSha, registry.url, extraTags, appName);
|
|
51
54
|
logger_1.consola.success('Docker image built and pushed successfully!');
|
|
52
55
|
}
|
|
53
56
|
//# sourceMappingURL=docker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../../../../../../packages/nx-core/src/executors/publisher/docker.ts"],"names":[],"mappings":";;AAsBA,
|
|
1
|
+
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../../../../../../packages/nx-core/src/executors/publisher/docker.ts"],"names":[],"mappings":";;AAsBA,sCAmFC;AAzGD,8BAA6B;AAI7B,mDAI6B;AAC7B,+CAA4D;AAC5D,+CAG2B;AAC3B,+CAA4C;AAQrC,KAAK,UAAU,aAAa,CACjC,OAAiC,EACjC,OAAwB,EACxB,OAAe,EACf,WAAmB,EACnB,QAAiB;IAEjB,MAAM,iBAAiB,GAAG,GAAG,WAAW,aAAa,CAAA;IAErD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACtC,gBAAO,CAAC,IAAI,CAAC,2BAA2B,iBAAiB,YAAY,CAAC,CAAA;QACtE,OAAM;IACR,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QACzB,gBAAO,CAAC,KAAK,CACX,mGAAmG,CACpG,CAAA;QACD,OAAM;IACR,CAAC;IAED,MAAM,QAAQ,GAAgB;QAC5B,GAAG,EAAE,OAAO,CAAC,gBAAgB;YAC3B,CAAC,CAAC,uBAAuB;YACzB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB;QAChC,IAAI,EAAE,OAAO,CAAC,gBAAgB;YAC5B,CAAC,CAAC,gBAAgB;YAClB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB;KACjC,CAAA;IAED,IAAI,QAAQ,EAAE,CAAC;QACb,gBAAO,CAAC,GAAG,CACT,gDAAgD,iBAAiB,gBAAgB,OAAO,CAAC,WAAW,iBAAiB,OAAO,2BAA2B,CACxJ,CAAA;QACD,OAAM;IACR,CAAC;IAED,MAAM,IAAA,uBAAY,GAAE,CAAA;IACpB,MAAM,IAAA,qBAAU,EAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAA;IAEzD,8DAA8D;IAC9D,MAAM,mBAAmB,GAAG,MAAM,IAAA,+BAAoB,EAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IACrE,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACzB,gBAAO,CAAC,IAAI,CACV,mEAAmE,CACpE,CAAA;QACD,uBAAuB;QACvB,MAAM,IAAA,qBAAU,EAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAA;QAEzD,2BAA2B;QAC3B,MAAM,gBAAgB,GAAG,MAAM,IAAA,+BAAoB,EAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;QAClE,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CACb,6DAA6D,CAC9D,CAAA;QACH,CAAC;IACH,CAAC;IAED,gBAAO,CAAC,GAAG,CACT,8BAA8B,QAAQ,CAAC,GAAG,IAAI,OAAO,CAAC,WAAW,iBAAiB,OAAO,EAAE,CAC5F,CAAA;IAED,gBAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAA;IAElD,MAAM,SAAS,GACb,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,gBAAgB;QACxD,CAAC,CAAC,OAAO,CAAC,gBAAgB;QAC1B,CAAC,CAAC,EAAE,CAAA;IAER,MAAM,gBAAgB,GAAG,MAAM,IAAA,sCAA6B,GAAE,CAAA;IAC9D,MAAM,SAAS,GAAG,MAAM,IAAA,+BAAsB,GAAE,CAAA;IAChD,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,IAAI,aAAa,CAAA;IAEpD,MAAM,IAAA,gCAAuB,EAC3B,OAAO,CAAC,WAAW,EACnB,iBAAiB,EACjB,OAAO,EACP,gBAAgB,EAChB,SAAS,EACT,QAAQ,CAAC,GAAG,EACZ,SAAS,EACT,OAAO,CACR,CAAA;IACD,gBAAO,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAA;AAChE,CAAC"}
|
|
@@ -19,8 +19,8 @@ async function publishHelm(options, context, version, projectRoot, projectDist,
|
|
|
19
19
|
const gitBranchName = await (0, github_1.getSanitizedCurrentGitBranch)();
|
|
20
20
|
if (!gitBranchName)
|
|
21
21
|
throw new Error('Unable to get current Git branch');
|
|
22
|
-
if (!fs.existsSync(
|
|
23
|
-
logger_1.consola.warn(
|
|
22
|
+
if (!fs.existsSync(chartConfigPath)) {
|
|
23
|
+
logger_1.consola.warn(`No helm chart found in project ${context.projectName}, searching ${chartConfigPath}, skipping`);
|
|
24
24
|
return;
|
|
25
25
|
}
|
|
26
26
|
if (!options.chartRegistry) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helm.js","sourceRoot":"","sources":["../../../../../../packages/nx-core/src/executors/publisher/helm.ts"],"names":[],"mappings":";;AAoBA,kCA6EC;;AAjGD,8BAA6B;AAI7B,mDAAmD;AACnD,+CAAiE;AACjE,2CASyB;AACzB,+CAA4C;AAC5C,yCAA4D;AAGrD,KAAK,UAAU,WAAW,CAC/B,OAAiC,EACjC,OAAwB,EACxB,OAAe,EACf,WAAmB,EACnB,WAAmB,EACnB,QAAiB;;;QAEjB,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,SAAS,CAAA;QAC5D,MAAM,iBAAiB,GAAG,GAAG,WAAW,IAAI,eAAe,EAAE,CAAA;QAC7D,MAAM,gBAAgB,GAAG,GAAG,iBAAiB,cAAc,CAAA;QAC3D,MAAM,eAAe,GAAG,GAAG,iBAAiB,aAAa,CAAA;QACzD,MAAM,qBAAqB,GAAG,GAAG,WAAW,SAAS,CAAA;QACrD,MAAM,aAAa,GAAG,MAAM,IAAA,qCAA4B,GAAE,CAAA;QAE1D,IAAI,CAAC,aAAa;YAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAA;QAEvE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"helm.js","sourceRoot":"","sources":["../../../../../../packages/nx-core/src/executors/publisher/helm.ts"],"names":[],"mappings":";;AAoBA,kCA6EC;;AAjGD,8BAA6B;AAI7B,mDAAmD;AACnD,+CAAiE;AACjE,2CASyB;AACzB,+CAA4C;AAC5C,yCAA4D;AAGrD,KAAK,UAAU,WAAW,CAC/B,OAAiC,EACjC,OAAwB,EACxB,OAAe,EACf,WAAmB,EACnB,WAAmB,EACnB,QAAiB;;;QAEjB,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,SAAS,CAAA;QAC5D,MAAM,iBAAiB,GAAG,GAAG,WAAW,IAAI,eAAe,EAAE,CAAA;QAC7D,MAAM,gBAAgB,GAAG,GAAG,iBAAiB,cAAc,CAAA;QAC3D,MAAM,eAAe,GAAG,GAAG,iBAAiB,aAAa,CAAA;QACzD,MAAM,qBAAqB,GAAG,GAAG,WAAW,SAAS,CAAA;QACrD,MAAM,aAAa,GAAG,MAAM,IAAA,qCAA4B,GAAE,CAAA;QAE1D,IAAI,CAAC,aAAa;YAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAA;QAEvE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YACpC,gBAAO,CAAC,IAAI,CACV,kCAAkC,OAAO,CAAC,WAAW,eAAe,eAAe,YAAY,CAChG,CAAA;YACD,OAAM;QACR,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;YAC3B,gBAAO,CAAC,KAAK,CACX,uGAAuG,CACxG,CAAA;YACD,OAAM;QACR,CAAC;QAED,IAAI,QAAQ,EAAE,CAAC;YACb,gBAAO,CAAC,GAAG,CACT,8CAA8C,iBAAiB,OAAO,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,IAAI,aAAa,iBAAiB,OAAO,2BAA2B,CAClN,CAAA;YACD,OAAM;QACR,CAAC;QAED,MAAM,IAAA,uBAAY,GAAE,CAAA;QAEpB,gBAAO,CAAC,GAAG,CACT,4BAA4B,OAAO,CAAC,aAAa,IAAI,aAAa,iBAAiB,OAAO,EAAE,CAC7F,CAAA;QACD,8CAA8C;QAC9C,MAAM,SAAS,0CAAG,MAAM,IAAA,gCAA0B,GAAE,QAAA,CAAA;QACpD,MAAM,SAAS,CAAC,OAAO,EAAE,CAAA;QAEzB,gBAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAA;QACpC,MAAM,IAAA,sCAA+B,EAAC,iBAAiB,EAAE,SAAS,CAAC,IAAI,CAAC,CAAA;QACxE,MAAM,IAAA,sBAAe,EAAC,iBAAiB,CAAC,CAAA;QACxC,MAAM,IAAA,oBAAa,EAAC,gBAAgB,EAAE,eAAe,EAAE,OAAO,CAAC,CAAA;QAC/D,MAAM,IAAA,kBAAW,EAAC,iBAAiB,EAAE,OAAO,EAAE,qBAAqB,CAAC,CAAA;QACpE,MAAM,IAAA,sCAA+B,EAAC,iBAAiB,EAAE,SAAS,CAAC,IAAI,CAAC,CAAA;QACxE,gBAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAA;QAEvC,MAAM,WAAW,GAAG,MAAM,IAAA,uBAAgB,EAAC,iBAAiB,CAAC,CAAA;QAC7D,MAAM,qBAAqB,GAAG,GAAG,WAAW,CAAC,IAAI,IAAI,OAAO,MAAM,CAAA;QAClE,MAAM,qBAAqB,GAAG,GAAG,qBAAqB,GAAG,qBAAqB,EAAE,CAAA;QAEhF,gBAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAA;QACtC,8DAA8D;QAC9D,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YAC3B,gBAAO,CAAC,GAAG,CACT,yCAAyC,OAAO,CAAC,cAAc,EAAE,CAClE,CAAA;YACD,MAAM,IAAA,0BAAmB,EAAC,qBAAqB,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;QAC1E,CAAC;aAAM,CAAC;YACN,+CAA+C;YAC/C,MAAM,IAAA,uBAAgB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,OAAO,CAAC,aAAa,EACrB,aAAa,CACd,CAAA;QACH,CAAC;QAED,gBAAO,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAA;;;;;;;;;CACtD"}
|
package/src/utils/docker.d.ts
CHANGED
|
@@ -9,6 +9,7 @@ import { Result } from 'tinyexec';
|
|
|
9
9
|
* @param commitSha - Git commit SHA for annotations
|
|
10
10
|
* @param registry - Docker registry URL
|
|
11
11
|
* @param extraTags - Optional additional tags for the image
|
|
12
|
+
* @param appName
|
|
12
13
|
* @return {Promise<Result>}
|
|
13
14
|
*/
|
|
14
|
-
export declare function buildAndPushDockerImage(imageName: string, dockerfilePath: string, version: string, gitRepoUrl: string, commitSha: string, registry: string, extraTags
|
|
15
|
+
export declare function buildAndPushDockerImage(imageName: string, dockerfilePath: string, version: string, gitRepoUrl: string, commitSha: string, registry: string, extraTags: string[], appName: string): Promise<Result>;
|
package/src/utils/docker.js
CHANGED
|
@@ -3,22 +3,18 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.buildAndPushDockerImage = buildAndPushDockerImage;
|
|
4
4
|
const exec_1 = require("./exec");
|
|
5
5
|
const logger_1 = require("./logger");
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
buildkit* docker-container
|
|
13
|
-
\_ buildkit0 \_ unix:///var/run/docker.sock running v0.22.0 linux/amd64 (+3), ...
|
|
14
|
-
default docker
|
|
15
|
-
\_ default \_ default running v0.23.1 linux/amd64 (+3), ...
|
|
16
|
-
*/
|
|
17
|
-
const buildersResult = await (0, exec_1.exec)(`docker buildx ls`);
|
|
6
|
+
async function setupDockerBuilder(appName) {
|
|
7
|
+
const BUILDKIT_BUILDER_NAME = 'dockerContainerBuildkit'.concat(appName);
|
|
8
|
+
logger_1.consola.log(`Setting up Docker Buildx builder named ${BUILDKIT_BUILDER_NAME}...`);
|
|
9
|
+
const buildersResult = await (0, exec_1.exec)(`docker buildx ls`, {
|
|
10
|
+
throwOnError: true,
|
|
11
|
+
});
|
|
18
12
|
const hasBuildkitBuilder = buildersResult.stdout.includes(BUILDKIT_BUILDER_NAME);
|
|
19
13
|
const isBuildkitCurrentBuilder = buildersResult.stdout.includes(`${BUILDKIT_BUILDER_NAME}*`);
|
|
14
|
+
logger_1.consola.log(`Checking for existing buildx builders...`);
|
|
20
15
|
if (!hasBuildkitBuilder) {
|
|
21
16
|
// Create new buildkit builder
|
|
17
|
+
logger_1.consola.log(`Creating new buildkit builder...`);
|
|
22
18
|
await (0, exec_1.exec)(`docker buildx create \
|
|
23
19
|
--name ${BUILDKIT_BUILDER_NAME} \
|
|
24
20
|
--driver=docker-container \
|
|
@@ -27,12 +23,14 @@ async function setupDockerBuilder() {
|
|
|
27
23
|
});
|
|
28
24
|
}
|
|
29
25
|
else if (!isBuildkitCurrentBuilder) {
|
|
26
|
+
logger_1.consola.log(`Existing buildkit builder found, but not current.`);
|
|
30
27
|
// Use existing buildkit builder
|
|
31
28
|
await (0, exec_1.exec)(`docker buildx use ${BUILDKIT_BUILDER_NAME}`, {
|
|
32
29
|
throwOnError: true,
|
|
33
30
|
});
|
|
34
31
|
}
|
|
35
32
|
logger_1.consola.info(`Buildx context is set to ${BUILDKIT_BUILDER_NAME}`);
|
|
33
|
+
return BUILDKIT_BUILDER_NAME;
|
|
36
34
|
}
|
|
37
35
|
/**
|
|
38
36
|
* Builds and pushes a Docker image using the provided Dockerfile.
|
|
@@ -44,15 +42,17 @@ async function setupDockerBuilder() {
|
|
|
44
42
|
* @param commitSha - Git commit SHA for annotations
|
|
45
43
|
* @param registry - Docker registry URL
|
|
46
44
|
* @param extraTags - Optional additional tags for the image
|
|
45
|
+
* @param appName
|
|
47
46
|
* @return {Promise<Result>}
|
|
48
47
|
*/
|
|
49
|
-
async function buildAndPushDockerImage(imageName, dockerfilePath, version, gitRepoUrl, commitSha, registry, extraTags = []) {
|
|
50
|
-
await setupDockerBuilder();
|
|
48
|
+
async function buildAndPushDockerImage(imageName, dockerfilePath, version, gitRepoUrl, commitSha, registry, extraTags = [], appName) {
|
|
49
|
+
const buildContextName = await setupDockerBuilder(appName);
|
|
51
50
|
// Build all tags including base version and extra tags
|
|
52
51
|
const tagArgs = [`${version}`, ...extraTags]
|
|
53
52
|
.map(tag => `-t ${registry}/${imageName}:${tag}`)
|
|
54
53
|
.join(' ');
|
|
55
|
-
|
|
54
|
+
const runCmd = `docker buildx build ${tagArgs} \
|
|
55
|
+
--builder ${buildContextName} \
|
|
56
56
|
-f ${dockerfilePath} \
|
|
57
57
|
--secret id=NPM_TOKEN \
|
|
58
58
|
--push \
|
|
@@ -61,7 +61,8 @@ async function buildAndPushDockerImage(imageName, dockerfilePath, version, gitRe
|
|
|
61
61
|
--annotation org.opencontainers.image.revision=${commitSha} \
|
|
62
62
|
--build-arg DD_GIT_REPOSITORY_URL=${gitRepoUrl} \
|
|
63
63
|
--build-arg DD_GIT_COMMIT_SHA=${commitSha} \
|
|
64
|
-
|
|
64
|
+
.`;
|
|
65
|
+
return (0, exec_1.exec)(runCmd, {
|
|
65
66
|
throwOnError: true,
|
|
66
67
|
nodeOptions: {
|
|
67
68
|
stdio: 'inherit',
|
package/src/utils/docker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../../../../../packages/nx-core/src/utils/docker.ts"],"names":[],"mappings":";;AA0DA,
|
|
1
|
+
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../../../../../packages/nx-core/src/utils/docker.ts"],"names":[],"mappings":";;AA0DA,0DAmCC;AA3FD,iCAA6B;AAC7B,qCAAkC;AAElC,KAAK,UAAU,kBAAkB,CAAC,OAAe;IAC/C,MAAM,qBAAqB,GAAG,yBAAyB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACvE,gBAAO,CAAC,GAAG,CACT,0CAA0C,qBAAqB,KAAK,CACrE,CAAA;IACD,MAAM,cAAc,GAAG,MAAM,IAAA,WAAI,EAAC,kBAAkB,EAAE;QACpD,YAAY,EAAE,IAAI;KACnB,CAAC,CAAA;IACF,MAAM,kBAAkB,GAAG,cAAc,CAAC,MAAM,CAAC,QAAQ,CACvD,qBAAqB,CACtB,CAAA;IACD,MAAM,wBAAwB,GAAG,cAAc,CAAC,MAAM,CAAC,QAAQ,CAC7D,GAAG,qBAAqB,GAAG,CAC5B,CAAA;IACD,gBAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAA;IACvD,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxB,8BAA8B;QAC9B,gBAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAA;QAC/C,MAAM,IAAA,WAAI,EACR;iBACW,qBAAqB;;cAExB,EACR;YACE,YAAY,EAAE,IAAI;SACnB,CACF,CAAA;IACH,CAAC;SAAM,IAAI,CAAC,wBAAwB,EAAE,CAAC;QACrC,gBAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAA;QAChE,gCAAgC;QAChC,MAAM,IAAA,WAAI,EAAC,qBAAqB,qBAAqB,EAAE,EAAE;YACvD,YAAY,EAAE,IAAI;SACnB,CAAC,CAAA;IACJ,CAAC;IAED,gBAAO,CAAC,IAAI,CAAC,4BAA4B,qBAAqB,EAAE,CAAC,CAAA;IAEjE,OAAO,qBAAqB,CAAA;AAC9B,CAAC;AAED;;;;;;;;;;;;GAYG;AACI,KAAK,UAAU,uBAAuB,CAC3C,SAAiB,EACjB,cAAsB,EACtB,OAAe,EACf,UAAkB,EAClB,SAAiB,EACjB,QAAgB,EAChB,YAAsB,EAAE,EACxB,OAAe;IAEf,MAAM,gBAAgB,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAA;IAE1D,uDAAuD;IACvD,MAAM,OAAO,GAAG,CAAC,GAAG,OAAO,EAAE,EAAE,GAAG,SAAS,CAAC;SACzC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,QAAQ,IAAI,SAAS,IAAI,GAAG,EAAE,CAAC;SAChD,IAAI,CAAC,GAAG,CAAC,CAAA;IAEZ,MAAM,MAAM,GAAG,uBAAuB,OAAO;kBAC7B,gBAAgB;WACvB,cAAc;;;;qDAI4B,UAAU;uDACR,SAAS;0CACtB,UAAU;sCACd,SAAS;EAC7C,CAAA;IAEA,OAAO,IAAA,WAAI,EAAC,MAAM,EAAE;QAClB,YAAY,EAAE,IAAI;QAClB,WAAW,EAAE;YACX,KAAK,EAAE,SAAS;SACjB;KACF,CAAC,CAAA;AACJ,CAAC"}
|