@salesforce/plugin-deploy-retrieve 3.11.4 → 3.12.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.
Files changed (35) hide show
  1. package/README.md +18 -18
  2. package/lib/commands/project/delete/source.js +3 -7
  3. package/lib/commands/project/delete/source.js.map +1 -1
  4. package/lib/commands/project/deploy/report.js +3 -6
  5. package/lib/commands/project/deploy/report.js.map +1 -1
  6. package/lib/commands/project/deploy/resume.js +4 -5
  7. package/lib/commands/project/deploy/resume.js.map +1 -1
  8. package/lib/commands/project/deploy/start.d.ts +3 -12
  9. package/lib/commands/project/deploy/start.js +36 -22
  10. package/lib/commands/project/deploy/start.js.map +1 -1
  11. package/lib/commands/project/deploy/validate.js +3 -6
  12. package/lib/commands/project/deploy/validate.js.map +1 -1
  13. package/lib/commands/project/retrieve/start.d.ts +1 -6
  14. package/lib/commands/project/retrieve/start.js +18 -50
  15. package/lib/commands/project/retrieve/start.js.map +1 -1
  16. package/lib/utils/output.d.ts +1 -0
  17. package/lib/utils/output.js +8 -0
  18. package/lib/utils/output.js.map +1 -1
  19. package/lib/utils/progressBar.d.ts +11 -0
  20. package/lib/utils/progressBar.js +80 -0
  21. package/lib/utils/progressBar.js.map +1 -0
  22. package/lib/utils/types.d.ts +4 -1
  23. package/lib/utils/types.js.map +1 -1
  24. package/messages/retrieve.start.md +12 -0
  25. package/oclif.manifest.json +2 -2
  26. package/package.json +6 -7
  27. package/schemas/project-deploy-cancel.json +17 -5
  28. package/schemas/project-deploy-quick.json +17 -5
  29. package/schemas/project-deploy-report.json +17 -5
  30. package/schemas/project-deploy-resume.json +17 -5
  31. package/schemas/project-deploy-start.json +17 -5
  32. package/schemas/project-deploy-validate.json +17 -5
  33. package/lib/utils/deployStages.d.ts +0 -26
  34. package/lib/utils/deployStages.js +0 -141
  35. package/lib/utils/deployStages.js.map +0 -1
@@ -8,6 +8,12 @@
8
8
  "type": "object",
9
9
  "additionalProperties": false,
10
10
  "properties": {
11
+ "files": {
12
+ "type": "array",
13
+ "items": {
14
+ "$ref": "#/definitions/FileResponse"
15
+ }
16
+ },
11
17
  "replacements": {
12
18
  "type": "object",
13
19
  "additionalProperties": {
@@ -17,11 +23,11 @@
17
23
  }
18
24
  }
19
25
  },
20
- "files": {
21
- "type": "array",
22
- "items": {
23
- "$ref": "#/definitions/FileResponse"
24
- }
26
+ "zipSize": {
27
+ "type": "number"
28
+ },
29
+ "zipFileCount": {
30
+ "type": "number"
25
31
  },
26
32
  "id": {
27
33
  "type": "string"
@@ -496,6 +502,12 @@
496
502
  "$ref": "#/definitions/FileResponse"
497
503
  }
498
504
  },
505
+ "zipSize": {
506
+ "type": "number"
507
+ },
508
+ "zipFileCount": {
509
+ "type": "number"
510
+ },
499
511
  "canceledBy": {
500
512
  "type": "string"
501
513
  },
@@ -8,6 +8,12 @@
8
8
  "type": "object",
9
9
  "additionalProperties": false,
10
10
  "properties": {
11
+ "files": {
12
+ "type": "array",
13
+ "items": {
14
+ "$ref": "#/definitions/FileResponse"
15
+ }
16
+ },
11
17
  "replacements": {
12
18
  "type": "object",
13
19
  "additionalProperties": {
@@ -17,11 +23,11 @@
17
23
  }
18
24
  }
19
25
  },
20
- "files": {
21
- "type": "array",
22
- "items": {
23
- "$ref": "#/definitions/FileResponse"
24
- }
26
+ "zipSize": {
27
+ "type": "number"
28
+ },
29
+ "zipFileCount": {
30
+ "type": "number"
25
31
  },
26
32
  "id": {
27
33
  "type": "string"
@@ -496,6 +502,12 @@
496
502
  "$ref": "#/definitions/FileResponse"
497
503
  }
498
504
  },
505
+ "zipSize": {
506
+ "type": "number"
507
+ },
508
+ "zipFileCount": {
509
+ "type": "number"
510
+ },
499
511
  "canceledBy": {
500
512
  "type": "string"
501
513
  },
@@ -8,6 +8,12 @@
8
8
  "type": "object",
9
9
  "additionalProperties": false,
10
10
  "properties": {
11
+ "files": {
12
+ "type": "array",
13
+ "items": {
14
+ "$ref": "#/definitions/FileResponse"
15
+ }
16
+ },
11
17
  "replacements": {
12
18
  "type": "object",
13
19
  "additionalProperties": {
@@ -17,11 +23,11 @@
17
23
  }
18
24
  }
19
25
  },
20
- "files": {
21
- "type": "array",
22
- "items": {
23
- "$ref": "#/definitions/FileResponse"
24
- }
26
+ "zipSize": {
27
+ "type": "number"
28
+ },
29
+ "zipFileCount": {
30
+ "type": "number"
25
31
  },
26
32
  "id": {
27
33
  "type": "string"
@@ -496,6 +502,12 @@
496
502
  "$ref": "#/definitions/FileResponse"
497
503
  }
498
504
  },
505
+ "zipSize": {
506
+ "type": "number"
507
+ },
508
+ "zipFileCount": {
509
+ "type": "number"
510
+ },
499
511
  "canceledBy": {
500
512
  "type": "string"
501
513
  },
@@ -8,6 +8,12 @@
8
8
  "type": "object",
9
9
  "additionalProperties": false,
10
10
  "properties": {
11
+ "files": {
12
+ "type": "array",
13
+ "items": {
14
+ "$ref": "#/definitions/FileResponse"
15
+ }
16
+ },
11
17
  "replacements": {
12
18
  "type": "object",
13
19
  "additionalProperties": {
@@ -17,11 +23,11 @@
17
23
  }
18
24
  }
19
25
  },
20
- "files": {
21
- "type": "array",
22
- "items": {
23
- "$ref": "#/definitions/FileResponse"
24
- }
26
+ "zipSize": {
27
+ "type": "number"
28
+ },
29
+ "zipFileCount": {
30
+ "type": "number"
25
31
  },
26
32
  "id": {
27
33
  "type": "string"
@@ -496,6 +502,12 @@
496
502
  "$ref": "#/definitions/FileResponse"
497
503
  }
498
504
  },
505
+ "zipSize": {
506
+ "type": "number"
507
+ },
508
+ "zipFileCount": {
509
+ "type": "number"
510
+ },
499
511
  "canceledBy": {
500
512
  "type": "string"
501
513
  },
@@ -1,26 +0,0 @@
1
- import { MetadataApiDeploy, MetadataApiDeployStatus } from '@salesforce/source-deploy-retrieve';
2
- import { SourceMemberPollingEvent } from '@salesforce/source-tracking';
3
- type Options = {
4
- title: string;
5
- jsonEnabled: boolean;
6
- };
7
- type Data = {
8
- mdapiDeploy: MetadataApiDeployStatus;
9
- sourceMemberPolling: SourceMemberPollingEvent;
10
- status: string;
11
- message: string;
12
- username: string;
13
- id: string;
14
- };
15
- export declare class DeployStages {
16
- private ms;
17
- constructor({ title, jsonEnabled }: Options);
18
- start({ username, deploy }: {
19
- username?: string | undefined;
20
- deploy: MetadataApiDeploy;
21
- }): void;
22
- update(data: Partial<Data>): void;
23
- stop(error?: Error): void;
24
- done(data?: Partial<Data>): void;
25
- }
26
- export {};
@@ -1,141 +0,0 @@
1
- /*
2
- * Copyright (c) 2024, salesforce.com, inc.
3
- * All rights reserved.
4
- * Licensed under the BSD 3-Clause license.
5
- * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
6
- */
7
- import { MultiStageOutput } from '@oclif/multi-stage-output';
8
- import { Lifecycle, Messages } from '@salesforce/core';
9
- import { RequestStatus } from '@salesforce/source-deploy-retrieve';
10
- Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
11
- const mdTransferMessages = Messages.loadMessages('@salesforce/plugin-deploy-retrieve', 'metadata.transfer');
12
- function round(value, precision) {
13
- const multiplier = Math.pow(10, precision || 0);
14
- return Math.round(value * multiplier) / multiplier;
15
- }
16
- function formatProgress(current, total) {
17
- if (total === 0) {
18
- return '0/0 (0%)';
19
- }
20
- return `${current}/${total} (${round((current / total) * 100, 0)}%)`;
21
- }
22
- export class DeployStages {
23
- ms;
24
- constructor({ title, jsonEnabled }) {
25
- this.ms = new MultiStageOutput({
26
- title,
27
- stages: [
28
- 'Preparing',
29
- 'Waiting for the org to respond',
30
- 'Deploying Metadata',
31
- 'Running Tests',
32
- 'Updating Source Tracking',
33
- 'Done',
34
- ],
35
- jsonEnabled,
36
- preStagesBlock: [
37
- {
38
- type: 'message',
39
- get: (data) => data?.message,
40
- },
41
- ],
42
- postStagesBlock: [
43
- {
44
- label: 'Status',
45
- get: (data) => data?.status,
46
- bold: true,
47
- type: 'dynamic-key-value',
48
- },
49
- {
50
- label: 'Deploy ID',
51
- get: (data) => data?.id,
52
- type: 'static-key-value',
53
- },
54
- {
55
- label: 'Target Org',
56
- get: (data) => data?.username,
57
- type: 'static-key-value',
58
- },
59
- ],
60
- stageSpecificBlock: [
61
- {
62
- label: 'Components',
63
- get: (data) => data?.mdapiDeploy?.numberComponentsTotal
64
- ? formatProgress(data?.mdapiDeploy?.numberComponentsDeployed ?? 0, data?.mdapiDeploy?.numberComponentsTotal)
65
- : undefined,
66
- stage: 'Deploying Metadata',
67
- type: 'dynamic-key-value',
68
- },
69
- {
70
- label: 'Tests',
71
- get: (data) => data?.mdapiDeploy?.numberTestsTotal && data?.mdapiDeploy?.numberTestsCompleted
72
- ? formatProgress(data?.mdapiDeploy?.numberTestsCompleted, data?.mdapiDeploy?.numberTestsTotal)
73
- : undefined,
74
- stage: 'Running Tests',
75
- type: 'dynamic-key-value',
76
- },
77
- {
78
- label: 'Members',
79
- get: (data) => data?.sourceMemberPolling?.original
80
- ? formatProgress(data.sourceMemberPolling.original - data.sourceMemberPolling.remaining, data.sourceMemberPolling.original)
81
- : undefined,
82
- stage: 'Updating Source Tracking',
83
- type: 'dynamic-key-value',
84
- },
85
- ],
86
- });
87
- }
88
- start({ username, deploy }) {
89
- const lifecycle = Lifecycle.getInstance();
90
- this.ms.goto('Preparing', { username, id: deploy.id });
91
- // for sourceMember polling events
92
- lifecycle.on('sourceMemberPollingEvent', (event) => Promise.resolve(this.ms.goto('Updating Source Tracking', { sourceMemberPolling: event })));
93
- deploy.onUpdate((data) => {
94
- if (data.numberComponentsDeployed === data.numberComponentsTotal &&
95
- data.numberTestsTotal > 0 &&
96
- data.numberComponentsDeployed > 0) {
97
- this.ms.goto('Running Tests', { mdapiDeploy: data, status: mdTransferMessages.getMessage(data?.status) });
98
- }
99
- else if (data.status === RequestStatus.Pending) {
100
- this.ms.goto('Waiting for the org to respond', {
101
- mdapiDeploy: data,
102
- status: mdTransferMessages.getMessage(data?.status),
103
- });
104
- }
105
- else {
106
- this.ms.goto('Deploying Metadata', { mdapiDeploy: data, status: mdTransferMessages.getMessage(data?.status) });
107
- }
108
- });
109
- deploy.onFinish((data) => {
110
- this.ms.updateData({ mdapiDeploy: data.response, status: mdTransferMessages.getMessage(data.response.status) });
111
- if (data.response.status === RequestStatus.Failed) {
112
- this.ms.stop(new Error('Failed to deploy metadata'));
113
- }
114
- else {
115
- this.ms.goto('Done');
116
- this.ms.stop();
117
- }
118
- });
119
- deploy.onCancel((data) => {
120
- this.ms.updateData({ mdapiDeploy: data, status: mdTransferMessages.getMessage(data?.status ?? 'Canceled') });
121
- this.ms.stop(new Error('Deploy canceled'));
122
- });
123
- deploy.onError((error) => {
124
- if (error.message.includes('client has timed out')) {
125
- this.ms.updateData({ status: 'Client Timeout' });
126
- }
127
- this.ms.stop(error);
128
- throw error;
129
- });
130
- }
131
- update(data) {
132
- this.ms.updateData(data);
133
- }
134
- stop(error) {
135
- this.ms.stop(error);
136
- }
137
- done(data) {
138
- this.ms.goto('Done', data);
139
- }
140
- }
141
- //# sourceMappingURL=deployStages.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"deployStages.js","sourceRoot":"","sources":["../../src/utils/deployStages.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAA8C,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAG/G,QAAQ,CAAC,kCAAkC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC7D,MAAM,kBAAkB,GAAG,QAAQ,CAAC,YAAY,CAAC,oCAAoC,EAAE,mBAAmB,CAAC,CAAC;AAgB5G,SAAS,KAAK,CAAC,KAAa,EAAE,SAAiB;IAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,IAAI,CAAC,CAAC,CAAC;IAChD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,UAAU,CAAC;AACrD,CAAC;AAED,SAAS,cAAc,CAAC,OAAe,EAAE,KAAa;IACpD,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAChB,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,OAAO,GAAG,OAAO,IAAI,KAAK,KAAK,KAAK,CAAC,CAAC,OAAO,GAAG,KAAK,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC;AACvE,CAAC;AAED,MAAM,OAAO,YAAY;IACf,EAAE,CAAyB;IAEnC,YAAmB,EAAE,KAAK,EAAE,WAAW,EAAW;QAChD,IAAI,CAAC,EAAE,GAAG,IAAI,gBAAgB,CAAO;YACnC,KAAK;YACL,MAAM,EAAE;gBACN,WAAW;gBACX,gCAAgC;gBAChC,oBAAoB;gBACpB,eAAe;gBACf,0BAA0B;gBAC1B,MAAM;aACP;YACD,WAAW;YACX,cAAc,EAAE;gBACd;oBACE,IAAI,EAAE,SAAS;oBACf,GAAG,EAAE,CAAC,IAAI,EAAsB,EAAE,CAAC,IAAI,EAAE,OAAO;iBACjD;aACF;YACD,eAAe,EAAE;gBACf;oBACE,KAAK,EAAE,QAAQ;oBACf,GAAG,EAAE,CAAC,IAAI,EAAsB,EAAE,CAAC,IAAI,EAAE,MAAM;oBAC/C,IAAI,EAAE,IAAI;oBACV,IAAI,EAAE,mBAAmB;iBAC1B;gBACD;oBACE,KAAK,EAAE,WAAW;oBAClB,GAAG,EAAE,CAAC,IAAI,EAAsB,EAAE,CAAC,IAAI,EAAE,EAAE;oBAC3C,IAAI,EAAE,kBAAkB;iBACzB;gBACD;oBACE,KAAK,EAAE,YAAY;oBACnB,GAAG,EAAE,CAAC,IAAI,EAAsB,EAAE,CAAC,IAAI,EAAE,QAAQ;oBACjD,IAAI,EAAE,kBAAkB;iBACzB;aACF;YACD,kBAAkB,EAAE;gBAClB;oBACE,KAAK,EAAE,YAAY;oBACnB,GAAG,EAAE,CAAC,IAAI,EAAsB,EAAE,CAChC,IAAI,EAAE,WAAW,EAAE,qBAAqB;wBACtC,CAAC,CAAC,cAAc,CACZ,IAAI,EAAE,WAAW,EAAE,wBAAwB,IAAI,CAAC,EAChD,IAAI,EAAE,WAAW,EAAE,qBAAqB,CACzC;wBACH,CAAC,CAAC,SAAS;oBACf,KAAK,EAAE,oBAAoB;oBAC3B,IAAI,EAAE,mBAAmB;iBAC1B;gBACD;oBACE,KAAK,EAAE,OAAO;oBACd,GAAG,EAAE,CAAC,IAAI,EAAsB,EAAE,CAChC,IAAI,EAAE,WAAW,EAAE,gBAAgB,IAAI,IAAI,EAAE,WAAW,EAAE,oBAAoB;wBAC5E,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE,WAAW,EAAE,oBAAoB,EAAE,IAAI,EAAE,WAAW,EAAE,gBAAgB,CAAC;wBAC9F,CAAC,CAAC,SAAS;oBACf,KAAK,EAAE,eAAe;oBACtB,IAAI,EAAE,mBAAmB;iBAC1B;gBACD;oBACE,KAAK,EAAE,SAAS;oBAChB,GAAG,EAAE,CAAC,IAAI,EAAsB,EAAE,CAChC,IAAI,EAAE,mBAAmB,EAAE,QAAQ;wBACjC,CAAC,CAAC,cAAc,CACZ,IAAI,CAAC,mBAAmB,CAAC,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC,SAAS,EACtE,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAClC;wBACH,CAAC,CAAC,SAAS;oBACf,KAAK,EAAE,0BAA0B;oBACjC,IAAI,EAAE,mBAAmB;iBAC1B;aACF;SACF,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAgE;QAC7F,MAAM,SAAS,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;QAE1C,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QAEvD,kCAAkC;QAClC,SAAS,CAAC,EAAE,CAA2B,0BAA0B,EAAE,CAAC,KAA+B,EAAE,EAAE,CACrG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,0BAA0B,EAAE,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC,CAAC,CAC1F,CAAC;QAEF,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE;YACvB,IACE,IAAI,CAAC,wBAAwB,KAAK,IAAI,CAAC,qBAAqB;gBAC5D,IAAI,CAAC,gBAAgB,GAAG,CAAC;gBACzB,IAAI,CAAC,wBAAwB,GAAG,CAAC,EACjC,CAAC;gBACD,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,kBAAkB,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;YAC5G,CAAC;iBAAM,IAAI,IAAI,CAAC,MAAM,KAAK,aAAa,CAAC,OAAO,EAAE,CAAC;gBACjD,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,gCAAgC,EAAE;oBAC7C,WAAW,EAAE,IAAI;oBACjB,MAAM,EAAE,kBAAkB,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC;iBACpD,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,kBAAkB,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;YACjH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE;YACvB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,kBAAkB,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAChH,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,aAAa,CAAC,MAAM,EAAE,CAAC;gBAClD,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC;YACvD,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACrB,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;YACjB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE;YACvB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,kBAAkB,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;YAE7G,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,OAAO,CAAC,CAAC,KAAY,EAAE,EAAE;YAC9B,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC;gBACnD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC;YACnD,CAAC;YAED,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,KAAK,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,MAAM,CAAC,IAAmB;QAC/B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAEM,IAAI,CAAC,KAAa;QACvB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;IAEM,IAAI,CAAC,IAAoB;QAC9B,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC;CACF"}