From 0b1543c1be1bbb9b036e6b2c273f47385867dc4e Mon Sep 17 00:00:00 2001 From: "Bansal, Gaurav" Date: Thu, 20 Nov 2025 15:07:32 +0530 Subject: [PATCH 1/3] adding bin to git ignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 63ee138..02a4df0 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ # Adding .DS_Store for mac .DS_Store +/bin From 8e17920845bd73479c1fe820446f3037568124dd Mon Sep 17 00:00:00 2001 From: "Bansal, Gaurav" Date: Tue, 25 Nov 2025 16:39:02 +0530 Subject: [PATCH 2/3] samples added for response mle --- src/main/java/Data/ConfigurationWithMLE.java | 192 +++++++++++------- ...cpApiExampleWithRequestAndResponseMLE.java | 99 +++++++++ 2 files changed, 214 insertions(+), 77 deletions(-) create mode 100644 src/main/java/samples/MLEFeature/AcpApiExampleWithRequestAndResponseMLE.java diff --git a/src/main/java/Data/ConfigurationWithMLE.java b/src/main/java/Data/ConfigurationWithMLE.java index 88dfc8a..d1a5a7c 100644 --- a/src/main/java/Data/ConfigurationWithMLE.java +++ b/src/main/java/Data/ConfigurationWithMLE.java @@ -16,9 +16,16 @@ public static Properties getMerchantDetailsWithMLE1() { props.setProperty("runEnvironment", "apitest.cybersource.com"); props.setProperty("requestJsonPath", "src/main/resources/request.json"); - //Set MLE Settings in Merchant Configuration - props.setProperty("useMLEGlobally", "true"); //globally MLE will be enabled for all MLE supported APIs - props.setProperty("mleKeyAlias", "CyberSource_SJC_US"); //this is optional parameter, not required to set the parameter if custom value is not required for MLE key alias. Default value is "CyberSource_SJC_US". + //Set Request MLE Settings in Merchant Configuration [Refer MLE.md on cybersource-rest-client-java github repo] + props.setProperty("enableRequestMLEForOptionalApisGlobally", "true"); //Enables request MLE globally for all APIs that have optional MLE support //same as older deprecated variable "useMLEGlobally" //APIs that has MLE Request mandatory is default has MLE support in SDK without any configuration but support with JWT auth type. + props.setProperty("requestMleKeyAlias", "CyberSource_SJC_US"); //this is optional parameter, not required to set the parameter if custom value is not required for MLE key alias. Default value is "CyberSource_SJC_US". //same as older deprecated variable "mleKeyAlias" + + //Set Response MLE Settings in Merchant Configuration [Refer MLE.md on cybersource-rest-client-java github repo] + props.setProperty("enableResponseMleGlobally", "false"); //Enables/Disable response MLE globally for all APIs that support MLE responses + props.setProperty("responseMlePrivateKeyFilePath", ""); //Path to the Response MLE private key file. Supported formats: .p12, .pfx, .pem, .key, .p8. Recommendation use encrypted private Key (password protection) for MLE response. + props.setProperty("responseMlePrivateKeyFilePassword", ""); //Password for the private key file (required for .p12/.pfx files or encrypted private keys). + props.setProperty("responseMleKID", ""); //This parameter is optional when responseMlePrivateKeyFilePath points to a CyberSource-generated P12 file. If not provided, the SDK will automatically fetch the Key ID from the P12 file. If provided, the SDK will use the user-provided value instead of the auto-fetched value. + //Required when using PEM format files (.pem, .key, .p8) or when providing responseMlePrivateKey object directly. // MetaKey Parameters props.setProperty("portfolioID", ""); @@ -71,54 +78,29 @@ public static Properties getMerchantDetailsWithMLE2() { props.setProperty("merchantID", "testrest"); props.setProperty("runEnvironment", "apitest.cybersource.com"); - props.setProperty("requestJsonPath", "src/main/resources/request.json"); - //Set MLE Settings in Merchant Configuration - Map mleMap = new HashMap<>(); - mleMap.put("createPayment", false); //only createPayment function will have MLE=false i.e. (/pts/v2/payments POST API) out of all MLE supported APIs - mleMap.put("capturePayment", true); //capturePayment function will have MLE=true i.e. (/pts/v2/payments/{id}/captures POST API), if it not in list of MLE supportedAPIs else it will already have MLE=true by global MLE parameter. + //Set Request MLE Settings in Merchant Configuration [Refer MLE.md on cybersource-rest-client-java github repo] + Map mleMap = new HashMap<>(); + mleMap.put("createPayment", "false"); //only createPayment function will have MLE=false i.e. (/pts/v2/payments POST API) out of all MLE supported APIs + mleMap.put("capturePayment", "true"); //capturePayment function will have MLE=true i.e. (/pts/v2/payments/{id}/captures POST API), if it not in list of MLE supportedAPIs else it will already have MLE=true by global MLE parameter. - props.setProperty("useMLEGlobally", "true"); //globally MLE will be enabled for all MLE supported APIs + props.setProperty("enableRequestMLEForOptionalApisGlobally", "true"); //Enables request MLE globally for all APIs that have optional MLE support //same as older deprecated variable "useMLEGlobally" props.put("mapToControlMLEonAPI", mleMap); //disable or enable the MLE for APIs which is in the list of mleMAP - props.setProperty("mleKeyAlias", "CyberSource_SJC_US"); //this is optional parameter, not required to set the parameter if custom value is not required for MLE key alias. Default value is "CyberSource_SJC_US". + props.setProperty("requestMleKeyAlias", "CyberSource_SJC_US"); //this is optional parameter, not required to set the parameter if custom value is not required for MLE key alias. Default value is "CyberSource_SJC_US". //same as older deprecated variable "mleKeyAlias" + + //Set Response MLE Settings in Merchant Configuration [Refer MLE.md on cybersource-rest-client-java github repo] + props.setProperty("enableResponseMleGlobally", "false"); //Enables/Disable response MLE globally for all APIs that support MLE responses + props.setProperty("responseMlePrivateKeyFilePath", ""); //Path to the Response MLE private key file. Supported formats: .p12, .pfx, .pem, .key, .p8. Recommendation use encrypted private Key (password protection) for MLE response. + props.setProperty("responseMlePrivateKeyFilePassword", ""); //Password for the private key file (required for .p12/.pfx files or encrypted private keys). + props.setProperty("responseMleKID", ""); //This parameter is optional when responseMlePrivateKeyFilePath points to a CyberSource-generated P12 file. If not provided, the SDK will automatically fetch the Key ID from the P12 file. If provided, the SDK will use the user-provided value instead of the auto-fetched value. + //Required when using PEM format files (.pem, .key, .p8) or when providing responseMlePrivateKey object directly. - // MetaKey Parameters - props.setProperty("portfolioID", ""); - props.setProperty("useMetaKey", "false"); - // JWT Parameters props.setProperty("keyAlias", "testrest"); props.setProperty("keyPass", "testrest"); props.setProperty("keyFileName", "testrest"); // P12 key path. Enter the folder path where the .p12 file is located. props.setProperty("keysDirectory", "src/main/resources"); - - // Logging to be enabled or not. - props.setProperty("enableLog", "true"); - // Log directory Path - props.setProperty("logDirectory", "log"); - props.setProperty("logFilename", "cybs"); - - // Log file size in KB - props.setProperty("logMaximumSize", "5M"); - - // OAuth related properties. - props.setProperty("enableClientCert", "false"); - props.setProperty("clientCertDirectory", "src/main/resources"); - props.setProperty("clientCertFile", ""); - props.setProperty("clientCertPassword", ""); - props.setProperty("clientId", ""); - props.setProperty("clientSecret", ""); - -// // HTTP Parameters -// props.setProperty("merchantKeyId", "08c94330-f618-42a3-b09d-e1e43be5efda"); -// props.setProperty("merchantsecretKey", "yBJxy6LjM2TmcPGu+GaJrHtkke25fPpUX+UY6/L/1tE="); - - /* - PEM Key file path for decoding JWE Response Enter the folder path where the .pem file is located. - It is optional property, require adding only during JWE decryption. - */ -// props.setProperty("jwePEMFileDirectory", "src/main/resources/NetworkTokenCert.pem"); return props; @@ -133,20 +115,23 @@ public static Properties getMerchantDetailsWithMLE3() { props.setProperty("merchantID", "testrest"); props.setProperty("runEnvironment", "apitest.cybersource.com"); - props.setProperty("requestJsonPath", "src/main/resources/request.json"); - //Set MLE Settings in Merchant Configuration - Map mleMap = new HashMap<>(); - mleMap.put("createPayment", true); //only createPayment function will have MLE=true i.e. (/pts/v2/payments POST API) - mleMap.put("capturePayment", true); //only capturePayment function will have MLE=true i.e. (/pts/v2/payments/{id}/captures POST API) + //Set Request MLE Settings in Merchant Configuration [Refer MLE.md on cybersource-rest-client-java github repo] + Map mleMap = new HashMap<>(); + mleMap.put("createPayment", "true"); //only createPayment function will have MLE=true i.e. (/pts/v2/payments POST API) + mleMap.put("capturePayment", "true"); //only capturePayment function will have MLE=true i.e. (/pts/v2/payments/{id}/captures POST API) - props.setProperty("useMLEGlobally", "false"); //globally MLE will be disabled for all the APIs in SDK + props.setProperty("enableRequestMLEForOptionalApisGlobally", "false"); //Disabled request MLE globally for all APIs that have optional MLE support //same as older deprecated variable "useMLEGlobally" props.put("mapToControlMLEonAPI", mleMap); //disable or enable the MLE for APIs which is in the list of mleMAP - props.setProperty("mleKeyAlias", "CyberSource_SJC_US"); //this is optional parameter, not required to set the parameter if custom value is not required for MLE key alias. Default value is "CyberSource_SJC_US". + props.setProperty("requestMleKeyAlias", "CyberSource_SJC_US"); //this is optional parameter, not required to set the parameter if custom value is not required for MLE key alias. Default value is "CyberSource_SJC_US". //same as older deprecated variable "mleKeyAlias" + + //Set Response MLE Settings in Merchant Configuration [Refer MLE.md on cybersource-rest-client-java github repo] + props.setProperty("enableResponseMleGlobally", "false"); //Enables/Disable response MLE globally for all APIs that support MLE responses + props.setProperty("responseMlePrivateKeyFilePath", ""); //Path to the Response MLE private key file. Supported formats: .p12, .pfx, .pem, .key, .p8. Recommendation use encrypted private Key (password protection) for MLE response. + props.setProperty("responseMlePrivateKeyFilePassword", ""); //Password for the private key file (required for .p12/.pfx files or encrypted private keys). + props.setProperty("responseMleKID", ""); //This parameter is optional when responseMlePrivateKeyFilePath points to a CyberSource-generated P12 file. If not provided, the SDK will automatically fetch the Key ID from the P12 file. If provided, the SDK will use the user-provided value instead of the auto-fetched value. + //Required when using PEM format files (.pem, .key, .p8) or when providing responseMlePrivateKey object directly. - // MetaKey Parameters - props.setProperty("portfolioID", ""); - props.setProperty("useMetaKey", "false"); // JWT Parameters props.setProperty("keyAlias", "testrest"); @@ -155,35 +140,88 @@ public static Properties getMerchantDetailsWithMLE3() { // P12 key path. Enter the folder path where the .p12 file is located. props.setProperty("keysDirectory", "src/main/resources"); - // Logging to be enabled or not. - props.setProperty("enableLog", "true"); - // Log directory Path - props.setProperty("logDirectory", "log"); - props.setProperty("logFilename", "cybs"); - - // Log file size in KB - props.setProperty("logMaximumSize", "5M"); - - // OAuth related properties. - props.setProperty("enableClientCert", "false"); - props.setProperty("clientCertDirectory", "src/main/resources"); - props.setProperty("clientCertFile", ""); - props.setProperty("clientCertPassword", ""); - props.setProperty("clientId", ""); - props.setProperty("clientSecret", ""); - -// // HTTP Parameters -// props.setProperty("merchantKeyId", "08c94330-f618-42a3-b09d-e1e43be5efda"); -// props.setProperty("merchantsecretKey", "yBJxy6LjM2TmcPGu+GaJrHtkke25fPpUX+UY6/L/1tE="); - - /* - PEM Key file path for decoding JWE Response Enter the folder path where the .pem file is located. - It is optional property, require adding only during JWE decryption. - */ -// props.setProperty("jwePEMFileDirectory", "src/main/resources/NetworkTokenCert.pem"); + return props; + + } + + public static Properties getMerchantDetailsWithRequestAndResponseMLE1() { + + Properties props = new Properties(); + + // MLE only support with JWT = jwt auth type only + props.setProperty("authenticationType", "JWT"); + + props.setProperty("merchantID", "agentic_mid_091225001"); + props.setProperty("runEnvironment", "apitest.cybersource.com"); + + //Set Request MLE Settings in Merchant Configuration [Refer MLE.md on cybersource-rest-client-java github repo] + props.setProperty("enableRequestMLEForOptionalApisGlobally", "true"); //Enables request MLE globally for all APIs that have optional MLE support //same as older deprecated variable "useMLEGlobally" //APIs that has MLE Request mandatory is default has MLE support in SDK without any configuration but support with JWT auth type. + + //Set Response MLE Settings in Merchant Configuration [Refer MLE.md on cybersource-rest-client-java github repo] + props.setProperty("enableResponseMleGlobally", "true"); //Enables response MLE globally for all APIs that support MLE responses + props.setProperty("responseMlePrivateKeyFilePath", "src/main/resources/agentic_mid_091225001_mle.p12"); //Path to the Response MLE private key file. Supported formats: .p12, .pfx, .pem, .key, .p8. Recommendation use encrypted private Key (password protection) for MLE response. + props.setProperty("responseMlePrivateKeyFilePassword", "Changeit@123"); //Password for the private key file (required for .p12/.pfx files or encrypted private keys). + props.setProperty("responseMleKID", "1757970970891045729358"); //Optional since p12 is Cybs Generated. + //This parameter is optional when responseMlePrivateKeyFilePath points to a CyberSource-generated P12 file. If not provided, the SDK will automatically fetch the Key ID from the P12 file. If provided, the SDK will use the user-provided value instead of the auto-fetched value. + //Required when using PEM format files (.pem, .key, .p8) or when providing responseMlePrivateKey object directly. + + + // JWT Parameters + props.setProperty("keyAlias", "agentic_mid_091225001"); + props.setProperty("keyPass", "Changeit@123"); + props.setProperty("keyFileName", "agentic_mid_091225001"); + // P12 key path. Enter the folder path where the .p12 file is located. + props.setProperty("keysDirectory", "src/main/resources"); + + return props; } + +public static Properties getMerchantDetailsWithRequestAndResponseMLE2() { + + Properties props = new Properties(); + + // MLE only support with JWT = jwt auth type only + props.setProperty("authenticationType", "JWT"); + + props.setProperty("merchantID", "agentic_mid_091225001"); + props.setProperty("runEnvironment", "apitest.cybersource.com"); + + //Set Request MLE Settings in Merchant Configuration [Refer MLE.md on cybersource-rest-client-java github repo] + props.setProperty("enableRequestMLEForOptionalApisGlobally", "false"); //Disable request MLE globally for all APIs that have optional MLE support //same as older deprecated variable "useMLEGlobally" //APIs that has MLE Request mandatory is default has MLE support in SDK without any configuration but support with JWT auth type. + + //Set Response MLE Settings in Merchant Configuration [Refer MLE.md on cybersource-rest-client-java github repo] + props.setProperty("enableResponseMleGlobally", "false"); //Disable response MLE globally for all APIs that support MLE responses + + //Set Request & Response MLE Settings in Merchant Configuration through MAP for API control level [Refer MLE.md on cybersource-rest-client-java github repo] + Map mleMap = new HashMap<>(); + mleMap.put("createPayment", "true::false"); //only createPayment function will have Request MLE=true and Response MLE = false i.e. (/pts/v2/payments POST API) + mleMap.put("enrollCard", "true::true"); //only enrollCard function will have Request MLE=true & Response MLE =true i.e. (/acp/v1/tokens POST API) + + props.put("mapToControlMLEonAPI", mleMap); //disable or enable the MLE for APIs which is in the list of mleMAP + + //since one of the API has Response MLE true, so below fields are required for Response MLE + props.setProperty("responseMlePrivateKeyFilePath", "src/main/resources/agentic_mid_091225001_mle.p12"); //Path to the Response MLE private key file. Supported formats: .p12, .pfx, .pem, .key, .p8. Recommendation use encrypted private Key (password protection) for MLE response. + props.setProperty("responseMlePrivateKeyFilePassword", "Changeit@123"); //Password for the private key file (required for .p12/.pfx files or encrypted private keys). + props.setProperty("responseMleKID", "1757970970891045729358"); //Optional since p12 is Cybs Generated. + //This parameter is optional when responseMlePrivateKeyFilePath points to a CyberSource-generated P12 file. If not provided, the SDK will automatically fetch the Key ID from the P12 file. If provided, the SDK will use the user-provided value instead of the auto-fetched value. + //Required when using PEM format files (.pem, .key, .p8) or when providing responseMlePrivateKey object directly. + + + // JWT Parameters + props.setProperty("keyAlias", "agentic_mid_091225001"); + props.setProperty("keyPass", "Changeit@123"); + props.setProperty("keyFileName", "agentic_mid_091225001"); + // P12 key path. Enter the folder path where the .p12 file is located. + props.setProperty("keysDirectory", "src/main/resources"); + + + + return props; + + } + } \ No newline at end of file diff --git a/src/main/java/samples/MLEFeature/AcpApiExampleWithRequestAndResponseMLE.java b/src/main/java/samples/MLEFeature/AcpApiExampleWithRequestAndResponseMLE.java new file mode 100644 index 0000000..c9025ea --- /dev/null +++ b/src/main/java/samples/MLEFeature/AcpApiExampleWithRequestAndResponseMLE.java @@ -0,0 +1,99 @@ +package samples.MLEFeature; + +import java.lang.invoke.MethodHandles; +import java.util.Properties; + +import com.cybersource.authsdk.core.MerchantConfig; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +import Api.EnrollmentApi; +import Data.ConfigurationWithMLE; +import Invokers.ApiClient; +import Invokers.ApiException; +import Model.AgenticCardEnrollmentRequest; +import Model.AgenticCardEnrollmentResponse200; + +public class AcpApiExampleWithRequestAndResponseMLE { + private static String responseCode = null; + private static String status = null; + private static Properties merchantProp; + public static boolean userCapture = false; + + public static void WriteLogAudit(int status) { + String filename = MethodHandles.lookup().lookupClass().getSimpleName(); + System.out.println("[Sample Code Testing] [" + filename + "] " + status); + } + + public static void main(String args[]) throws Exception { + run(); + } + + public static AgenticCardEnrollmentResponse200 run() throws JsonMappingException, JsonProcessingException { + + String request = "{\"clientCorrelationId\":\"3e1b7943-6567-4965-a32b-5aa93d057d35\",\"deviceInformation\":{\"userAgent\":\"SampleUserAgent\",\"applicationName\":\"MyMagicApp\",\"fingerprintSessionId\":\"finSessionId\",\"country\":\"US\",\"deviceData\":{\"type\":\"Mobile\",\"manufacturer\":\"Apple\",\"brand\":\"Apple\",\"model\":\"iPhone16ProMax\"},\"ipAddress\":\"192.168.0.100\",\"clientDeviceId\":\"000b2767814e4416999f4ee2b099491d2087\"},\"buyerInformation\":{\"merchantCustomerId\":\"3e1b7943-6567-4965-a32b-5aa93d057d35\",\"personalIdentification\":[{\"type\":\"Theidentificationtype\",\"id\":\"1\",\"issuedBy\":\"Thegovernmentagencythatissuedthedriver'slicenseorpassport\"}],\"language\":\"en\"},\"billTo\":{\"firstName\":\"John\",\"lastName\":\"Doe\",\"fullName\":\"JohnMichaelDoe\",\"email\":\"john.doe@example.com\",\"countryCallingCode\":\"1\",\"phoneNumber\":\"5551234567\",\"numberIsVoiceOnly\":false,\"country\":\"US\"},\"consumerIdentity\":{\"identityType\":\"EMAIL_ADDRESS\",\"identityValue\":\"john.doe@example.com\",\"identityProvider\":\"PARTNER\",\"identityProviderUrl\":\"https://identity.partner.com\"},\"paymentInformation\":{\"customer\":{\"id\":\"\"},\"paymentInstrument\":{\"id\":\"\"},\"instrumentIdentifier\":{\"id\":\"4044EB915C613A82E063AF598E0AE6EF\"}},\"enrollmentReferenceData\":{\"enrollmentReferenceType\":\"TOKEN_REFERENCE_ID\",\"enrollmentReferenceProvider\":\"VTS\"},\"assuranceData\":[{\"verificationType\":\"DEVICE\",\"verificationEntity\":\"10\",\"verificationEvents\":[\"01\"],\"verificationMethod\":\"02\",\"verificationResults\":\"01\",\"verificationTimestamp\":\"1735690745\",\"authenticationContext\":{\"action\":\"AUTHENTICATE\"},\"authenticatedIdentities\":{\"data\":\"authenticatedData\",\"provider\":\"VISA_PAYMENT_PASSKEY\",\"id\":\"f48ac10b-58cc-4372-a567-0e02b2c3d489\"},\"additionalData\":\"\"}],\"consentData\":[{\"id\":\"550e8400-e29b-41d4-a716-446655440000\",\"type\":\"PERSONALIZATION\",\"source\":\"CLIENT\",\"acceptedTime\":\"1719169800\",\"effectiveUntil\":\"1750705800\"}]}"; + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + AgenticCardEnrollmentRequest requestObj = objectMapper.readValue(request, AgenticCardEnrollmentRequest.class); + + AgenticCardEnrollmentResponse200 result = null; + + + //Case1: Simple way to configure the request and response MLE in SDK. + try { + merchantProp = ConfigurationWithMLE.getMerchantDetailsWithRequestAndResponseMLE1(); + ApiClient apiClient = new ApiClient(); + MerchantConfig merchantConfig = new MerchantConfig(merchantProp); + apiClient.merchantConfig = merchantConfig; + + EnrollmentApi apiInstance = new EnrollmentApi(apiClient); + result = apiInstance.enrollCard(requestObj); + + responseCode = apiClient.responseCode; + status = apiClient.status; + System.out.println("ResponseCode :" + responseCode); + System.out.println("ResponseMessage :" + status); + System.out.println(result); + WriteLogAudit(Integer.parseInt(responseCode)); + + } catch (ApiException e) { + e.printStackTrace(); + WriteLogAudit(e.getCode()); + } catch (Exception e) { + e.printStackTrace(); + } + + + + + + //Case2: Control Request and Response MLE through map on API level + try { + merchantProp = ConfigurationWithMLE.getMerchantDetailsWithRequestAndResponseMLE2(); + ApiClient apiClient = new ApiClient(); + MerchantConfig merchantConfig = new MerchantConfig(merchantProp); + apiClient.merchantConfig = merchantConfig; + + EnrollmentApi apiInstance = new EnrollmentApi(apiClient); + result = apiInstance.enrollCard(requestObj); + + responseCode = apiClient.responseCode; + status = apiClient.status; + System.out.println("ResponseCode :" + responseCode); + System.out.println("ResponseMessage :" + status); + System.out.println(result); + WriteLogAudit(Integer.parseInt(responseCode)); + + } catch (ApiException e) { + e.printStackTrace(); + WriteLogAudit(e.getCode()); + } catch (Exception e) { + e.printStackTrace(); + } + + + return result; + } +} From 424d799ac7dfa91c0ce5b056ea5b124e288d09c7 Mon Sep 17 00:00:00 2001 From: "Bansal, Gaurav" Date: Tue, 25 Nov 2025 16:40:14 +0530 Subject: [PATCH 3/3] adding mid --- src/main/resources/agentic_mid_091225001.p12 | Bin 0 -> 5008 bytes src/main/resources/agentic_mid_091225001_mle.p12 | Bin 0 -> 5008 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/main/resources/agentic_mid_091225001.p12 create mode 100644 src/main/resources/agentic_mid_091225001_mle.p12 diff --git a/src/main/resources/agentic_mid_091225001.p12 b/src/main/resources/agentic_mid_091225001.p12 new file mode 100644 index 0000000000000000000000000000000000000000..818ee4635a32c56029aceafdf8befc3b7ad59427 GIT binary patch literal 5008 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