@transfergratis/react-native-sdk 0.1.33 → 0.1.35

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@transfergratis/react-native-sdk",
3
- "version": "0.1.33",
3
+ "version": "0.1.35",
4
4
  "description": "transfergratis react native sdk",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -1 +1 @@
1
- {"version":3,"file":"IDCardCapture.d.ts","sourceRoot":"","sources":["../../../../src/components/KYCElements/IDCardCapture.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAI5D,OAAO,EAAE,iBAAiB,EAAoI,MAAM,uBAAuB,CAAC;AAe5L,UAAU,cAAc;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,UAAU,kBAAkB;IAC1B,SAAS,EAAE,iBAAiB,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACvC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAAC,KAAK,IAAI,CAAC;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CA0wBtD,CAAC"}
1
+ {"version":3,"file":"IDCardCapture.d.ts","sourceRoot":"","sources":["../../../../src/components/KYCElements/IDCardCapture.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAI5D,OAAO,EAAE,iBAAiB,EAAoI,MAAM,uBAAuB,CAAC;AAe5L,UAAU,cAAc;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,UAAU,kBAAkB;IAC1B,SAAS,EAAE,iBAAiB,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACvC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAAC,KAAK,IAAI,CAAC;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAoyBtD,CAAC"}
@@ -185,6 +185,16 @@ export const IDCardCapture = ({ component, value = {}, onValueChange, error, lan
185
185
  const found = mapping[selectedDocumentType].find((item) => item.py_file === pyName);
186
186
  return found?.mrz_type || null;
187
187
  };
188
+ const getCorrespondingAuthMethod = (templatePath, mapping, selectedDocumentType = "root", side) => {
189
+ if (!mapping || !mapping[selectedDocumentType])
190
+ return null;
191
+ const fileName = templatePath.split("/").pop()?.replace(".jpg", "").replace(".png", "");
192
+ if (!fileName)
193
+ return null;
194
+ const pyName = `${fileName}.py`;
195
+ const found = mapping[selectedDocumentType].find((item) => item.py_file === pyName);
196
+ return found?.[side] || null;
197
+ };
188
198
  const handleSilentCapture = async (result) => {
189
199
  if (silentCaptureResult.isAnalyzing) {
190
200
  return;
@@ -193,6 +203,7 @@ export const IDCardCapture = ({ component, value = {}, onValueChange, error, lan
193
203
  setSilentCaptureResult((prev) => ({ ...prev, isAnalyzing: true, success: false, error: '' }));
194
204
  let templatePath = silentCaptureResult.templatePath || '';
195
205
  let templateBbox;
206
+ let templateResponse;
196
207
  if (!selectedDocumentType) {
197
208
  setSilentCaptureResult((prev) => ({ ...prev, isAnalyzing: false, success: false, error: 'Document type not selected' }));
198
209
  return;
@@ -207,6 +218,7 @@ export const IDCardCapture = ({ component, value = {}, onValueChange, error, lan
207
218
  docTypeToSend: selectedDocumentType?.type
208
219
  });
209
220
  const templateType = await checkTemplateType({ path: result.path || '', docType: selectedDocumentType?.type, docRegion: countryData?.code || "", postfix: currentSide }, env);
221
+ templateResponse = templateType;
210
222
  if (templateType.template_path) {
211
223
  templatePath = templateType.template_path;
212
224
  logger.log("templatePath", templatePath);
@@ -248,12 +260,17 @@ export const IDCardCapture = ({ component, value = {}, onValueChange, error, lan
248
260
  logger.log("Calling frontVerification", { templatePath, selectedDocumentType: selectedDocumentType?.type, regionMappings });
249
261
  console.log("About to call frontVerification", typeof frontVerification);
250
262
  try {
251
- const mrzType = getCorrespondingMrzType(templatePath, regionMappings.regionMapping, regionMappings.key || '') || '';
263
+ const matchedAuthMethod = getCorrespondingAuthMethod(templatePath, regionMappings.regionMapping, regionMappings.key || '', 'front');
264
+ const resolvedMrzType = getCorrespondingMrzType(templatePath, regionMappings.regionMapping, regionMappings.key || '');
265
+ const mrzType = resolvedMrzType || '';
266
+ const authMethod = matchedAuthMethod
267
+ ? regionMappings.authMethod.filter((method) => method === matchedAuthMethod)
268
+ : regionMappings.authMethod.filter((method) => method !== 'MRZ' && method !== '2D_barcode');
252
269
  console.log("mrzType calculated", mrzType);
253
270
  const verificationParams = {
254
271
  path: result.path,
255
272
  regionMapping: {
256
- authMethod: regionMappings.authMethod,
273
+ authMethod,
257
274
  mrzTypes: regionMappings.mrzTypes,
258
275
  },
259
276
  selectedDocumentType: GovernmentDocumentTypeShorted[selectedDocumentType?.type] || '',
@@ -305,17 +322,22 @@ export const IDCardCapture = ({ component, value = {}, onValueChange, error, lan
305
322
  else {
306
323
  const backRegionMappings = getCurrentSideVerification(currentSide);
307
324
  logger.log("Calling backVerification", { templatePath, selectedDocumentType: selectedDocumentType.type, backRegionMappings });
325
+ const matchedBackAuthMethod = getCorrespondingAuthMethod(templatePath, backRegionMappings.regionMapping, backRegionMappings.key || '', 'back');
326
+ const backMrzType = getCorrespondingMrzType(templatePath, backRegionMappings.regionMapping, backRegionMappings.key || '') || '';
308
327
  backVerification({
309
328
  path: result.path,
310
329
  regionMapping: {
311
- authMethod: backRegionMappings.authMethod,
330
+ authMethod: matchedBackAuthMethod
331
+ ? backRegionMappings.authMethod.filter((method) => method === matchedBackAuthMethod)
332
+ : backRegionMappings.authMethod.filter((method) => method !== 'MRZ' && method !== '2D_barcode'),
312
333
  mrzTypes: backRegionMappings.mrzTypes,
313
334
  },
314
335
  selectedDocumentType: GovernmentDocumentTypeShorted[selectedDocumentType.type] || '',
315
336
  code: countryData?.code || '',
316
337
  currentSide: currentSide,
317
338
  templatePath: templatePath,
318
- mrzType: getCorrespondingMrzType(templatePath, backRegionMappings.regionMapping, backRegionMappings.key || '') || '',
339
+ mrzType: backMrzType,
340
+ templateResponse,
319
341
  }, env).then((res) => {
320
342
  logger.log("back verification result", truncateFields(res));
321
343
  const bbox = res?.bbox || templateBbox;
@@ -1 +1 @@
1
- {"version":3,"file":"IDCardCapture.js","sourceRoot":"","sources":["../../../../src/components/KYCElements/IDCardCapture.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAC/H,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAyF,6BAA6B,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAC;AAC5L,OAAO,aAAa,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAChH,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,YAAY,MAAM,0BAA0B,CAAC;AACpD,OAAO,UAAU,EAAE,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,8BAA8B,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACjJ,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAmB5C,MAAM,CAAC,MAAM,aAAa,GAAiC,CAAC,EAC1D,SAAS,EACT,KAAK,GAAG,EAAE,EACV,aAAa,EACb,KAAK,EACL,QAAQ,GAAG,IAAI,GAChB,EAAE,EAAE;IACH,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC;IAChC,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAiC,KAAK,IAAI,EAAE,CAAC,CAAC;IAClG,gEAAgE;IAChE,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAmB,OAAO,CAAC,CAAC;IAC1E,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAwB,EAAE,CAAC,CAAC;IACxE,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,GAAG,QAAQ,CAAuB,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7H,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEtD,kDAAkD;IAClD,MAAM,mBAAmB,GAA2C;QAClE,YAAY,EAAE,aAAa;QAC3B,UAAU,EAAE,UAAU;QACtB,gBAAgB,EAAE,iBAAiB;QACnC,iBAAiB,EAAE,qBAAqB;QACxC,qBAAqB,EAAE,uBAAuB;KAC/C,CAAC;IACF,4GAA4G;IAE5G,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,yBAAyB,EAAE,CAAC;IAI5D,MAAM,gBAAgB,GAAG,CAAC,IAAmD,EAAU,EAAE;QACvF,iEAAiE;QACjE,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/E,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACzC,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;IAEF,8DAA8D;IAC9D,MAAM,oBAAoB,GAAG,OAAO,CAAC,GAAG,EAAE;QACxC,MAAM,yBAAyB,GAAG,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,mBAAmB,CAAC,CAAC;QACtG,IAAI,yBAAyB,EAAE,CAAC;YAC9B,OAAO,KAAK,CAAC,aAAa,CAAC,yBAAyB,CAAC,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;IAErD,4DAA4D;IAC5D,MAAM,oBAAoB,GAAG,OAAO,CAA0D,GAAG,EAAE;QACjG,IAAI,CAAC,oBAAoB,EAAE,YAAY;YAAE,OAAO,IAAI,CAAC;QAErD,MAAM,cAAc,GAAG,oBAAoB,CAAC,YAAY,CAAC;QACzD,MAAM,UAAU,GAAG,mBAAmB,CAAC,cAAc,CAAC,IAAI,cAAwC,CAAC;QACnG,MAAM,MAAM,GAAG,oBAAoB,CAAC,MAAM,IAAI,MAAM,CAAC;QAErD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;IACtC,CAAC,EAAE,CAAC,oBAAoB,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAEhD,iEAAiE;IACjE,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE;QAC/B,OAAO,oBAAoB,CAAC;IAC9B,CAAC,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAE7B,iBAAiB;IAEf,kGAAkG;IAClG,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3C,qCAAqC;YACrC,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;YAC9E,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,CAAC,GAAG,CAAC,qCAAqC,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;gBACtE,MAAM,CAAC,GAAG,CAAC,oBAAoB,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;gBACxD,MAAM,aAAa,GAAG,KAAuC,CAAC;gBAC9D,iBAAiB,CAAC,aAAa,CAAC,CAAC;gBAEjC,kFAAkF;gBAClF,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;oBAC1C,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;oBACtC,IAAI,SAAS,EAAE,GAAG,EAAE,CAAC;wBACnB,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;4BAC9B,GAAG,IAAI;4BACP,IAAI,EAAE,SAAS,CAAC,GAAG;4BACnB,OAAO,EAAE,IAAI;4BACb,WAAW,EAAE,KAAK;4BAClB,GAAG,EAAE,SAAS,CAAC,GAAG,IAAI,EAAE;4BACxB,YAAY,EAAE,SAAS,CAAC,YAAY,IAAI,EAAE;yBAC3C,CAAC,CAAC,CAAC;oBACN,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,GAAG,EAAE,mBAAmB,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAClG,IAAI,cAAc,CAAC,WAAW,CAAC,EAAE,GAAG,IAAI,mBAAmB,EAAE,IAAI,EAAE,CAAC;YAClE,iBAAiB,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,GAAG,EAAE,mBAAmB,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;gBACzF,wBAAwB;YAC1B,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,EAAE,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,GAAG,EAAE,mBAAmB,EAAE,IAAI,CAAC,CAAC,CAAA;IAIjE,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE;QAChC,MAAM,YAAY,GAAG,oBAAoB;YACvC,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC;YACrJ,CAAC,CAAC,gBAAgB,CAAC,SAAS,CAAC,YAA6C,CAAC,CAAC;QAE9E,OAAO;YACL,WAAW,EAAE,CAAC,GAAG,CAAC;YAClB,OAAO,EAAE,GAAG;YACZ,SAAS,EAAE,MAAe;YAC1B,UAAU,EAAE,MAAe;YAC3B,SAAS,EAAE,IAAI;YACf,YAAY,EAAE,MAAM;YACpB,WAAW,EAAE,IAAI;YACjB,UAAU,EAAE,CAAC;YACb,OAAO,EAAE;gBACP,SAAS,EAAE,IAAI;gBACf,SAAS,EAAE,YAAY;gBACvB,IAAI,EAAE;oBACJ,IAAI,EAAE,EAAE;oBACR,IAAI,EAAE,GAAG;oBACT,IAAI,EAAE,GAAG;oBACT,IAAI,EAAE,GAAG;oBACT,WAAW,EAAE,SAAS;oBACtB,WAAW,EAAE,CAAC;oBACd,YAAY,EAAE,CAAC;iBAChB;aACF;SACF,CAAC;IACJ,CAAC,EAAE,CAAC,oBAAoB,EAAE,MAAM,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC;IAE3D,MAAM,aAAa,GAAG,CAAC,YAA8B,EAAE,EAAE;QACvD,kDAAkD;QAClD,aAAa,CAAC,IAAI,CAAC,CAAC;QACpB,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAEjC,uEAAuE;QACvE,iBAAiB,CAAC,CAAC,IAAI,EAAE,EAAE;YACzB,MAAM,QAAQ,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;YAC7B,OAAO,QAAQ,CAAC,YAAY,CAAC,CAAC;YAC9B,OAAO,QAAQ,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,sBAAsB,CAAC;YACrB,IAAI,EAAE,EAAE;YACR,OAAO,EAAE,KAAK;YACd,WAAW,EAAE,KAAK;YAClB,KAAK,EAAE,EAAE;YACT,YAAY,EAAE,EAAE;YAChB,GAAG,EAAE,EAAE;YACP,IAAI,EAAE,SAAS;SAChB,CAAC,CAAC;QAGH,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,QAAQ,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;YAC9B,OAAO,QAAQ,CAAC,YAAY,CAAC,CAAC;YAC9B,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC;IAIF,MAAM,0BAA0B,GAAG,CAAC,WAAmB,EAAE,EAAE;QACzD,IAAI,CAAC,oBAAoB,IAAI,CAAC,WAAW,EAAE,aAAa,EAAE,CAAC;YACzD,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;QAC5E,CAAC;QAED,MAAM,aAAa,GAAG,WAAW,CAAC,aAAa,CAAC,oBAAoB,CAAC,IAA8B,CAAC,CAAC;QACrG,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAa,EAAE,CAAC;QAE9B,MAAM,GAAG,GAAG,oBAAoB,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;QAE1G,IAAI,aAAa,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC9D,aAAa,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,IAAS,EAAE,EAAE;gBACvC,IAAI,IAAI,CAAC,WAAgC,CAAC,EAAE,CAAC;oBAC3C,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAgC,CAAC,CAAC,CAAC;oBACxD,IAAI,IAAI,EAAE,QAAQ,EAAE,CAAC;wBACnB,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;oBAChC,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAED,MAAM,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,aAAa,EAAE,oBAAoB,EAAE,oBAAoB,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAEhJ,OAAO,EAAE,UAAU,EAAE,gBAAgB,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,gBAAgB,CAAC,QAAQ,CAAC,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IACpI,CAAC,CAAA;IAED,MAAM,uBAAuB,GAAG,CAAC,YAAoB,EAAE,OAAY,EAAE,uBAA+B,MAAM,EAAE,EAAE;QAC5G,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC;YAAE,OAAO,IAAI,CAAC;QAE5D,qDAAqD;QACrD,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAExF,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAE3B,oBAAoB;QACpB,MAAM,MAAM,GAAG,GAAG,QAAQ,KAAK,CAAC,CAAC,8BAA8B;QAE/D,yBAAyB;QACzB,MAAM,KAAK,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC;QAEzF,OAAO,KAAK,EAAE,QAAQ,IAAI,IAAI,CAAC;IACjC,CAAC,CAAA;IAED,MAAM,mBAAmB,GAAG,KAAK,EAAE,MAA2D,EAAE,EAAE;QAChG,IAAI,mBAAmB,CAAC,WAAW,EAAE,CAAC;YACpC,OAAO;QACT,CAAC;QACD,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAClC,sBAAsB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YAC9F,IAAI,YAAY,GAAG,mBAAmB,CAAC,YAAY,IAAI,EAAE,CAAC;YAC1D,IAAI,YAA+B,CAAC;YAEpC,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAC1B,sBAAsB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAC,CAAC,CAAC;gBACzH,OAAO;YACT,CAAC;YAED,MAAM,cAAc,GAAG,0BAA0B,CAAC,WAAW,CAAC,CAAA;YAC9D,yGAAyG;YACzG,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9B,IAAI,CAAC;oBACH,MAAM,CAAC,GAAG,CAAC,iCAAiC,EAAE;wBAC5C,wBAAwB,EAAE,oBAAoB,EAAE,IAAI;wBACpD,gCAAgC,EAAE,oBAAoB,EAAE,YAAY;wBACpE,aAAa,EAAE,oBAAoB,EAAE,IAAI;qBAC1C,CAAC,CAAC;oBACH,MAAM,YAAY,GAAG,MAAM,iBAAiB,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,OAAO,EAAE,oBAAoB,EAAE,IAA8B,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,GAAG,CAAC,CAAC;oBAExM,IAAI,YAAY,CAAC,aAAa,EAAE,CAAC;wBAC/B,YAAY,GAAG,YAAY,CAAC,aAAa,CAAC;wBAC1C,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;wBACzC,sBAAsB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;oBAC9E,CAAC;oBACD,IAAI,YAAY,CAAC,QAAQ,EAAE,CAAC;wBAC1B,MAAM,aAAa,GAAG,gBAAgB,CAAE,YAAoB,CAAC,QAAQ,CAAC,CAAC;wBACvE,IAAI,aAAa,KAAK,IAAI,IAAI,aAAa,GAAG,wBAAwB,EAAE,CAAC;4BACvE,sBAAsB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gCAChC,GAAG,IAAI;gCACP,WAAW,EAAE,KAAK;gCAClB,OAAO,EAAE,KAAK;gCACd,KAAK,EAAE,CAAC,CAAC,uCAAuC,CAAC;6BAClD,CAAC,CAAC,CAAC;4BACJ,OAAO;wBACT,CAAC;wBACD,IAAI,IAAuB,CAAC;wBAC5B,IAAI,CAAC;4BACH,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,EAAG,YAAoB,CAAC,QAAQ,CAAC,CAAC;4BACjF,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;4BACjB,YAAY,GAAG,IAAI,CAAC;wBACtB,CAAC;wBAAC,MAAM,CAAC,CAAC,CAAC;oBACb,CAAC;gBACH,CAAC;gBAAC,OAAO,CAAM,EAAE,CAAC;oBAChB,MAAM,CAAC,GAAG,CAAC,8BAA8B,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC9D,sBAAsB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,IAAI,oCAAoC,EAAE,CAAC,CAAC,CAAC;oBAC/I,OAAO,CAAC,0CAA0C;gBACpD,CAAC;YACH,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,kCAAkC,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;YACzF,IAAI,WAAW,KAAK,OAAO,EAAE,CAAC;gBAC5B,MAAM,CAAC,GAAG,CAAC,iCAAiC,EAAE;oBAC5C,wBAAwB,EAAE,oBAAoB,EAAE,IAAI;oBACpD,gCAAgC,EAAE,oBAAoB,EAAE,YAAY;oBACpE,aAAa,EAAE,oBAAoB,EAAE,IAAI;iBAC1C,CAAC,CAAC;gBACH,MAAM,CAAC,GAAG,CAAC,2BAA2B,EAAE,EAAE,YAAY,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;gBAC5H,OAAO,CAAC,GAAG,CAAC,iCAAiC,EAAE,OAAO,iBAAiB,CAAC,CAAC;gBACzE,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,uBAAuB,CAAC,YAAY,EAAE,cAAc,CAAC,aAAa,EAAE,cAAc,CAAC,GAAG,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;oBACpH,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;oBAC3C,MAAM,kBAAkB,GAAG;wBACzB,IAAI,EAAE,MAAM,CAAC,IAAI;wBACjB,aAAa,EAAE;4BACb,UAAU,EAAE,cAAc,CAAC,UAAU;4BACrC,QAAQ,EAAE,cAAc,CAAC,QAAQ;yBAClC;wBACD,oBAAoB,EAAE,6BAA6B,CAAC,oBAAoB,EAAE,IAAkD,CAAC,IAAI,EAAE;wBACnI,IAAI,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE;wBAC7B,WAAW,EAAE,WAAW;wBACxB,YAAY,EAAE,YAAY;wBAC1B,OAAO,EAAE,OAAO;qBACjB,CAAC;oBACF,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,kBAAkB,CAAC,CAAC;oBAC5D,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;oBAExD,MAAM,OAAO,GAAG,iBAAiB,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;oBAC3D,OAAO,CAAC,GAAG,CAAC,mCAAmC,EAAE,OAAO,CAAC,CAAC;oBAE1D,OAAO,CAAC,IAAI,CAAC,CAAC,GAAQ,EAAE,EAAE;wBACxB,MAAM,CAAC,GAAG,CAAC,2BAA2B,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;wBAC7D,MAAM,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,YAAY,CAAC;wBAEvC,sBAAsB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;4BAChC,GAAG,IAAI;4BACP,IAAI,EAAE,MAAM,CAAC,IAAI;4BACjB,YAAY,EAAE,YAAY;4BAC1B,IAAI,EAAE,IAAI;4BACV,OAAO,EAAE,IAAI;4BACb,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE;4BAC5C,WAAW,EAAE,KAAK;4BAClB,OAAO,EAAE,WAAW,EAAE,IAAI;4BAC1B,YAAY,EAAE,oBAAoB,CAAC,IAAI;yBACxC,CAAC,CAAC,CAAC;wBAEJ,+BAA+B;wBAC/B,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;4BACrC,aAAa,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;wBAC9D,CAAC;oBAEH,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAM,EAAE,EAAE;oBAEpB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAM,EAAE,EAAE;wBAClB,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,CAAC,CAAC,CAAC;wBAC3C,MAAM,CAAC,GAAG,CAAC,0BAA0B,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;wBAC1D,MAAM,qBAAqB,GACzB,CAAC,EAAE,OAAO,KAAK,yBAAyB;4BACxC,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,YAAY,CAAC;4BAClC,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAAC;wBACzC,MAAM,YAAY,GAAG,qBAAqB;4BACxC,CAAC,CAAC,CAAC,CAAC,uCAAuC,CAAC;4BAC5C,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,4BAA4B,CAAC,CAAC;wBACjD,sBAAsB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;oBACvI,CAAC,CAAC,CAAC;gBACL,CAAC;gBAAC,OAAO,KAAU,EAAE,CAAC;oBACpB,OAAO,CAAC,GAAG,CAAC,yCAAyC,EAAE,KAAK,CAAC,CAAC;oBAC9D,sBAAsB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,IAAI,oDAAoD,EAAE,CAAC,CAAC,CAAC;gBACrK,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,kBAAkB,GAAG,0BAA0B,CAAC,WAAW,CAAC,CAAC;gBACnE,MAAM,CAAC,GAAG,CAAC,0BAA0B,EAAE,EAAE,YAAY,EAAE,oBAAoB,EAAE,oBAAoB,CAAC,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAE9H,gBAAgB,CAAC;oBACf,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,aAAa,EAAE;wBACb,UAAU,EAAE,kBAAkB,CAAC,UAAU;wBACzC,QAAQ,EAAE,kBAAkB,CAAC,QAAQ;qBACtC;oBACD,oBAAoB,EAAE,6BAA6B,CAAC,oBAAoB,CAAC,IAAkD,CAAC,IAAI,EAAE;oBAClI,IAAI,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE;oBAC7B,WAAW,EAAE,WAAW;oBACxB,YAAY,EAAE,YAAY;oBAC1B,OAAO,EAAE,uBAAuB,CAAC,YAAY,EAAE,kBAAkB,CAAC,aAAa,EAAE,kBAAkB,CAAC,GAAG,IAAI,EAAE,CAAC,IAAI,EAAE;iBACrH,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAQ,EAAE,EAAE;oBACxB,MAAM,CAAC,GAAG,CAAC,0BAA0B,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;oBAC5D,MAAM,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,YAAY,CAAC;oBAEvC,sBAAsB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;wBAChC,GAAG,IAAI;wBACP,IAAI,EAAE,MAAM,CAAC,IAAI;wBACjB,IAAI,EAAE,IAAI;wBACV,OAAO,EAAE,IAAI;wBACb,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE;wBAC5C,WAAW,EAAE,KAAK;wBAClB,OAAO,EAAE,WAAW,EAAE,IAAI;wBAC1B,YAAY,EAAE,oBAAoB,CAAC,IAAI;qBACxC,CAAC,CAAC,CAAC;oBAEJ,+BAA+B;oBAC/B,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;wBACrC,aAAa,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;oBAC9D,CAAC;gBACH,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAM,EAAE,EAAE;oBAClB,MAAM,CAAC,GAAG,CAAC,yBAAyB,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;oBACzD,MAAM,qBAAqB,GACzB,CAAC,EAAE,OAAO,KAAK,yBAAyB;wBACxC,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,YAAY,CAAC;wBAClC,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAAC;oBACzC,MAAM,YAAY,GAAG,qBAAqB;wBACxC,CAAC,CAAC,CAAC,CAAC,uCAAuC,CAAC;wBAC5C,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,4BAA4B,CAAC,CAAC;oBACjD,sBAAsB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;gBACvI,CAAC,CAAC,CAAC;YACL,CAAC;QAEH,CAAC;IACH,CAAC,CAAA;IAED,MAAM,aAAa,GAAG,KAAK,EAAE,MAA2D,EAAE,EAAE;QAC1F,IAAI,mBAAmB,CAAC,IAAI,EAAE,CAAC;YAC7B,IAAI,kBAAkB,GAAG,mBAAmB,CAAC,IAAI,CAAC;YAClD,IAAI,mBAAmB,CAAC,IAAI,EAAE,CAAC;gBAC7B,IAAI,CAAC;oBACH,kBAAkB,GAAG,MAAM,8BAA8B,CAAC,mBAAmB,CAAC,IAAI,EAAE,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACtH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,kBAAkB,GAAG,mBAAmB,CAAC,IAAI,CAAC;gBAChD,CAAC;YACH,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,kBAAkB,CAAC,CAAC;YAEtD,uFAAuF;YACvF,MAAM,SAAS,GAAG;gBACd,GAAG,cAAc;gBACjB,CAAC,WAAW,CAAC,EAAE;oBACX,GAAG,EAAE,kBAAkB,EAAE,yBAAyB;oBAClD,IAAI,EAAE,MAAM;oBACZ,GAAG,EAAE,mBAAmB,CAAC,GAAG,IAAI,EAAE;oBAClC,YAAY,EAAE,mBAAmB,CAAC,YAAY;iBACjD;aACJ,CAAC;YAEF,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAE7B,IAAI,mBAAmB,CAAC,OAAO,IAAI,mBAAmB,CAAC,YAAY,EAAE,CAAC;gBACpE,aAAa,CAAC;oBACZ,GAAG,SAAS;oBACZ,OAAO,EAAE,mBAAmB,CAAC,OAAO;oBACpC,YAAY,EAAE,6BAA6B,CAAC,mBAAmB,CAAC,YAA0D,CAAC,IAAI,EAAE;iBAClI,CAAC,CAAC;YACL,CAAC;YACD,aAAa,CAAC,KAAK,CAAC,CAAC;YACrB,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,IAAI,gCAAgC,CAAC,CAAC;QACxE,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,CAAC,KAA0B,EAAE,EAAE;QACjD,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,aAAa,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,CAAC,iBAAiB,CAAC,CAAC,UAAU,CAAC,CAAC;IACzC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,6BAA6B;IAC7B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU;YAAE,OAAO;QAEtD,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;YAC1C,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,qBAAqB,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBAChF,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC;gBAE3D,IAAI,WAAW,EAAE,CAAC;oBAChB,gEAAgE;oBAChE,yFAAyF;oBACzF,+CAA+C;oBAC/C,+EAA+E;oBAC/E,yEAAyE;oBACzE,MAAM,CAAC,GAAG,CAAC,iBAAiB,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC;oBAE3D,IAAI,WAAW,CAAC,mBAAmB,KAAK,WAAW,IAAI,WAAW,CAAC,mBAAmB,KAAK,UAAU,IAAI,WAAW,CAAC,mBAAmB,KAAK,QAAQ,EAAE,CAAC;wBACtJ,aAAa,CAAC,YAAY,CAAC,CAAC;wBAC5B,cAAc,CAAC,KAAK,CAAC,CAAC;wBACtB,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC,oBAAoB;oBACpD,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;YACzC,CAAC;QACH,CAAC,EAAE,IAAI,CAAC,CAAC;QAET,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;IAC3C,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAErD,MAAM,YAAY,GAAG,GAAW,EAAE;QAChC,iCAAiC;QACjC,IAAI,QAAQ,CAAC,EAAE,KAAK,KAAK;YAAE,OAAO,EAAE,CAAC;QACrC,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI;YAAE,OAAO,EAAE,CAAC;QAE1F,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACjD,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;gBACvE,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAClE,CAAC;YACD,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;YACpF,IAAI,oBAAoB,EAAE,IAAI,EAAE,CAAC;gBAC/B,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,oBAAoB,CAAC,IAAI,CAAC,CAAC;gBAClE,IAAI,oBAAoB,CAAC,YAAY;oBAAE,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,EAAE,oBAAoB,CAAC,YAAY,CAAC,CAAC;gBACvH,IAAI,oBAAoB,CAAC,MAAM;oBAAE,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAC;YACtG,CAAC;YACD,OAAO,iEAAiE,kBAAkB,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC;QACtH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;YACrD,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CAAC;IAQF,kHAAkH;IAClH,MAAM,iBAAiB,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,IAAI,KAAK,CAAC,qBAAqB,GAAG,CAAC,CAAC,CAAC;IAC/F,MAAM,mBAAmB,GAAG,KAAK,CAAC,OAAO,CAAC,mBAAmB,KAAK,KAAK,CAAC;IACxE,IAAI,iBAAiB,IAAI,CAAC,mBAAmB,IAAI,CAAC,CAAC,oBAAoB,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC;QAClG,OAAO,CACL,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CACvB;QAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC,CAClF;UAAA,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,EAC/C;UAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC,CACnD;YAAA,CAAC,KAAK,CAAC,eAAe,KAAK,IAAI,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,gCAAgC,CAChG;UAAA,EAAE,IAAI,CACR;QAAA,EAAE,IAAI,CACR;MAAA,EAAE,IAAI,CAAC,CACR,CAAC;IACJ,CAAC;IAED,+EAA+E;IAC/E,IAAI,CAAC,oBAAoB,IAAI,CAAC,oBAAoB,EAAE,CAAC;QACnD,OAAO,CACL,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CACvB;QAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAC5B;UAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CACrE;UAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAC9B;YAAA,CAAC,KAAK,CAAC,eAAe,KAAK,IAAI;gBAC7B,CAAC,CAAC,2DAA2D;gBAC7D,CAAC,CAAC,iEAAiE,CACvE;UAAA,EAAE,IAAI,CACN;UAAA,CAAC,KAAK,IAAI,CACR,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAC9C,CACH;QAAA,EAAE,IAAI,CACR;MAAA,EAAE,IAAI,CAAC,CACR,CAAC;IACJ,CAAC;IAID,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CACL,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,CAClC;QAAA,CAAC,kBAAkB,CACjB,UAAU,CAAC,CAAC,IAAI,CAAC,CACjB,UAAU,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,CACpC,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CACrB,SAAS,CAAC,CAAC,aAAa,CAAC,CACzB,OAAO,CAAC,CAAC,WAAW,CAAC,CACrB,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CACpC,OAAO,CAAC,MAAM,CACd,iBAAiB,CAAC,CAAC,IAAI,CAAC,CACxB,gBAAgB,CAAC,CAAC,IAAI,CAAC,CACvB,eAAe,CAAC,CAAC,mBAAmB,CAAC,CACrC,mBAAmB,CAAC,CAAC,mBAAmB,CAAC,CACzC,2BAA2B,CAAC,CAAC,IAAI,CAAC,CAClC,WAAW,CAAC,CAAC,YAAY,CAAC,SAAS,KAAK,MAAM,IAAI,YAAY,CAAC,SAAS,KAAK,IAAI,CAAC,CAClF,gBAAgB,CAAC,CACf,CAAC,aAAa,CACZ,IAAI,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CACrC,IAAI,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CACrC,IAAI,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CACrC,IAAI,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CACrC,YAAY,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAC7C,aAAa,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,IAAI,CAAW,CAAC,CACrE,SAAS,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC,CACvC,QAAQ,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAChC,YAAY,CAAC,CAAC;oBACZ,IAAI,EAAE,GAAG,EAAE;wBACT,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;4BAC3B,cAAc,CAAC,OAAO,CAAC,CAAC;4BACxB,aAAa,CAAC,KAAK,CAAC,CAAC;4BACrB,4DAA4D;4BAC5D,IAAI,cAAc,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;gCACjC,6DAA6D;gCAC7D,MAAM,UAAU,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;gCAC3C,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;gCACtC,sBAAsB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oCAChC,IAAI,EAAE,UAAU,CAAC,GAAG;oCACpB,OAAO,EAAE,IAAI;oCACb,WAAW,EAAE,KAAK;oCAClB,KAAK,EAAE,EAAE;oCACT,GAAG,EAAE,UAAU,CAAC,GAAG,IAAI,EAAE;oCACzB,YAAY,EAAE,UAAU,CAAC,YAAY,IAAI,EAAE;oCAC3C,OAAO,EAAE,mBAAmB,CAAC,OAAO;oCACpC,YAAY,EAAE,mBAAmB,CAAC,YAAY;oCAC9C,IAAI,EAAE,SAAS,CAAC,oDAAoD;iCACrE,CAAC,CAAC,CAAC;4BACN,CAAC;iCAAM,CAAC;gCACN,qCAAqC;gCACrC,sBAAsB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;4BACpH,CAAC;wBACH,CAAC;6BAAM,CAAC;4BACN,oDAAoD;4BACpD,OAAO,CAAC,iBAAiB,EAAE,CAAC;wBAC9B,CAAC;oBACH,CAAC;oBACD,oBAAoB,EAAE,oBAAoB,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE;oBACrL,IAAI,EAAE,KAAK,CAAC,qBAAqB,GAAG,CAAC;oBACrC,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM;oBAC5C,IAAI,EAAE,WAAW;iBAClB,CAAC,EAEN,CAAC,EAGH;;QAAA,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,CAC3B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,CACtC;YAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,CACpC;cAAA,CAAC,mBAAmB,CAAC,KAAK,CAC5B;YAAA,EAAE,IAAI,CACR;UAAA,EAAE,IAAI,CAAC,CACR,CAAC,CAAC,CAAC,IAAI,CAEV;;MAAA,EAAE,IAAI,CAAC,CACR,CAAC;IACJ,CAAC;IAGD,OAAO,CACL,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CACvB;MAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CACnC;QAAA,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,4BAA4B,CAAC,CAAC,KAAK,CAAC,CAClF;UAAA,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAClD;YAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAC5B;cAAA,CAAC,CAAC,CAAC,gCAAgC,EAAE,EAAE,IAAI,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CACpJ;YAAA,EAAE,IAAI,CACN;YAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAClG;cAAA,CAAC,gBAAgB,CAAC,SAAS,CAAC,YAAY,CAAC,CAC3C;YAAA,EAAE,IAAI,CAEN;;YAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAChG;cAAA,CAAC,mBAAmB,EAAE,KAAK,KAAK,cAAc,IAAI,CAClD,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACX,eAAe,EAAE,SAAS;gBAC1B,OAAO,EAAE,EAAE;gBACX,YAAY,EAAE,CAAC;gBACf,KAAK,EAAE,MAAM;gBACb,WAAW,EAAE,MAAM;gBACnB,YAAY,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;gBACrC,aAAa,EAAE,GAAG;gBAClB,YAAY,EAAE,CAAC;gBACf,SAAS,EAAE,CAAC;aACb,CAAC,CACA;gBAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CACrF;kBAAA,CAAC,KAAK,CAAC,eAAe,KAAK,IAAI;gBAC7B,CAAC,CAAC,yCAAyC;gBAC3C,CAAC,CAAC,+CAA+C,CACrD;gBAAA,EAAE,IAAI,CACR;cAAA,EAAE,IAAI,CAAC,CACR,CAED;;YAAA,CAAC,IAAI,CACD,KAAK,CAAC,CAAC;YACL,KAAK,EAAE,MAAM;YACb,MAAM,EAAE,GAAG;YACX,YAAY,EAAE,EAAE;YAChB,OAAO,EAAE,CAAC;YACV,QAAQ,EAAE,QAAQ;YAClB,WAAW,EAAE,MAAM;YACnB,YAAY,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;YACrC,aAAa,EAAE,IAAI;YACnB,YAAY,EAAE,CAAC;YACf,SAAS,EAAE,CAAC;YACZ,eAAe,EAAE,MAAM;SACxB,CAAC,CAEF;gBAAA,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAClC,CAAC,KAAK,CACJ,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC,GAAG,EAAE,CAAC,CACjD,KAAK,CAAC,CAAC;gBACL,KAAK,EAAE,MAAM;gBACb,MAAM,EAAE,MAAM;gBACd,YAAY,EAAE,EAAE;gBAChB,UAAU,EAAE,SAAS;aACtB,CAAC,EACF,CACH,CAAC,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,CAC7B,CAAC,KAAK,CACJ,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,mBAAmB,CAAC,IAAI,EAAE,CAAC,CAC1C,KAAK,CAAC,CAAC;gBACL,KAAK,EAAE,MAAM;gBACb,MAAM,EAAE,MAAM;gBACd,YAAY,EAAE,EAAE;gBAChB,UAAU,EAAE,SAAS;aACtB,CAAC,EACF,CACH,CAAC,CAAC,CAAC,IAAI,CACV;cAAA,EAAE,IAAI,CACN;cAAA,CAAC,qDAAqD,CACtD;cAAA,CAAC,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,GAAG,IAAI,CACpC,CAAC,MAAM,CACL,KAAK,CAAC,CAAC,KAAK,CAAC,eAAe,KAAK,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAC3E,OAAO,CAAC,CAAC,GAAG,EAAE;gBACZ,aAAa,CAAC,IAAI,CAAC,CAAC;gBACpB,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACnC,CAAC,CAAC,CACF,OAAO,CAAC,SAAS,CACjB,IAAI,CAAC,OAAO,CACZ,SAAS,EACT,CACH,CACD;cAAA,CAAC,+CAA+C,CAChD;cAAA,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,GAAG,IAAI,CACnC,EACE;kBAAA,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE;gBAChE,aAAa,CAAC,WAAW,CAAC,CAAC;YAC7B,CAAC,CAAC,CACA,OAAO,CAAC,SAAS,CACjB,IAAI,CAAC,QAAQ,CACb,SAAS,EAEX;kBAAA,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE;gBAC7C,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBAC1B,SAAS,CAAC,OAAO,EAAE,4BAA4B,CAAC,CAAC;oBACjD,OAAO;gBACT,CAAC;gBACD,IAAI,WAAW,KAAK,MAAM,IAAI,oBAAoB,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;oBACvE,OAAO,CAAC,aAAa,EAAE,CAAC;oBACxB,OAAO;gBACT,CAAC;qBAAM,CAAC;oBACN,aAAa,CAAC,IAAI,CAAC,CAAC;oBACpB,cAAc,CAAC,MAAM,CAAC,CAAC;oBACvB,sBAAsB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;oBAC3H,uBAAuB;gBACzB,CAAC;YACH,CAAC,CAAC,CACA,OAAO,CAAC,SAAS,CACjB,IAAI,CAAC,OAAO,CACZ,SAAS,EAEb;gBAAA,GAAG,CACJ,CACH;YAAA,EAAE,IAAI,CACR;UAAA,EAAE,IAAI,CACR;QAAA,EAAE,UAAU,CAIZ;;;;QAAA,CAAC,KAAK,IAAI,CACR,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAC9C,CAED;;QAAA,CAAC,wDAAwD,CACzD;QAAA,CAAC,QAAQ,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,GAAG,IAAI,CAC/E,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,mCAAmC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,CAAA,CAAC,CAAC,CAAC,EAAG,CACnG,CAED;;QAAA,CAAC,8BAA8B,CAC/B;QAAA,CAAC,QAAQ,CAAC,EAAE,KAAK,KAAK,IAAI,CACxB,CAAC,KAAK,CACJ,OAAO,CAAC,CAAC,WAAW,CAAC,CACrB,WAAW,CAAC,CAAC,IAAI,CAAC,CAClB,aAAa,CAAC,MAAM,CACpB,cAAc,CAAC,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAE5C;YAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAC/B;cAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAC/B;gBAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAC7B;kBAAA,CAAC,CAAC,CAAC,oCAAoC,CAAC,CAC1C;gBAAA,EAAE,IAAI,CACN;gBAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CACnC;kBAAA,CAAC,CAAC,CAAC,8BAA8B,CAAC,CACpC;gBAAA,EAAE,IAAI,CAEN;;gBAAA,CAAC,WAAW,IAAI,YAAY,EAAE,CAAC,CAAC,CAAC,CAC/B,CAAC,KAAK,CACJ,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE,CAAC,CAChC,KAAK,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,EAC1B,CACH,CAAC,CAAC,CAAC,IAAI,CAER;;gBAAA,CAAC,gBAAgB,CACf,KAAK,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAC1B,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAErC;kBAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,CAClC;oBAAA,CAAC,CAAC,CAAC,cAAc,CAAC,CACpB;kBAAA,EAAE,IAAI,CACR;gBAAA,EAAE,gBAAgB,CACpB;cAAA,EAAE,IAAI,CACR;YAAA,EAAE,IAAI,CACR;UAAA,EAAE,KAAK,CAAC,CACT,CAEH;;MAAA,EAAE,IAAI,CACR;IAAA,EAAE,IAAI,CAAC,CACR,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IAC/B,IAAI,EAAE;QACJ,IAAI,EAAE,CAAC;QACP,QAAQ,EAAE,GAAG;QACb,KAAK,EAAE,MAAM;KACd;IACD,SAAS,EAAE;QACT,eAAe,EAAE,OAAO;QACxB,MAAM,EAAE,EAAE;QACV,YAAY,EAAE,EAAE;QAChB,eAAe,EAAE,EAAE;QACnB,iBAAiB,EAAE,EAAE;QACrB,SAAS;QACT,WAAW,EAAE,MAAM;QACnB,YAAY,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;QACrC,aAAa,EAAE,IAAI;QACnB,YAAY,EAAE,IAAI;QAClB,SAAS,EAAE,EAAE;QACb,eAAe;KAChB;IACD,eAAe,EAAE;QACf,IAAI,EAAE,CAAC;QACP,KAAK,EAAE,MAAM;QACb,MAAM,EAAE,MAAM;KACf;IACD,gBAAgB,EAAE;QAChB,KAAK,EAAE,KAAK;QACZ,eAAe,EAAE,OAAO;QACxB,MAAM,EAAE,EAAE;QACV,YAAY,EAAE,EAAE;QAChB,eAAe,EAAE,EAAE;QACnB,iBAAiB,EAAE,EAAE;KACtB;IACD,oBAAoB,EAAE;IAEpB,oBAAoB;KACrB;IACD,KAAK,EAAE;QACL,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,MAAM;QAClB,KAAK,EAAE,MAAM;QACb,YAAY,EAAE,CAAC;QACf,SAAS,EAAE,QAAQ;KACpB;IACD,QAAQ,EAAE;QACR,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,MAAM;QACb,SAAS,EAAE,QAAQ;QACnB,YAAY,EAAE,EAAE;KACjB;IACD,QAAQ,EAAE;QACR,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,MAAM;QACb,SAAS,EAAE,QAAQ;QACnB,YAAY,EAAE,EAAE;QAChB,SAAS,EAAE,QAAQ;KACpB;IACD,WAAW,EAAE;QACX,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,MAAM;QACb,SAAS,EAAE,QAAQ;QACnB,YAAY,EAAE,EAAE;QAChB,UAAU,EAAE,EAAE;KACf;IACD,cAAc,EAAE;QACd,IAAI,EAAE,CAAC;KACR;IACD,aAAa,EAAE;QACb,YAAY,EAAE,EAAE;KACjB;IACD,SAAS,EAAE;QACT,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,MAAM;QAClB,KAAK,EAAE,MAAM;QACb,YAAY,EAAE,EAAE;QAChB,SAAS,EAAE,QAAQ;KACpB;IACD,aAAa,EAAE;QACb,WAAW,EAAE,CAAC;QACd,WAAW,EAAE,SAAS;QACtB,WAAW,EAAE,QAAQ;QACrB,YAAY,EAAE,EAAE;QAChB,OAAO,EAAE,EAAE;QACX,UAAU,EAAE,QAAQ;QACpB,eAAe,EAAE,SAAS;KAC3B;IACD,WAAW,EAAE;QACX,QAAQ,EAAE,EAAE;QACZ,YAAY,EAAE,EAAE;KACjB;IACD,WAAW,EAAE;QACX,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,SAAS;QAChB,UAAU,EAAE,KAAK;KAClB;IACD,sBAAsB,EAAE;QACtB,QAAQ,EAAE,UAAU;KACrB;IACD,aAAa,EAAE;QACb,KAAK,EAAE,MAAM;QACb,MAAM,EAAE,GAAG;QACX,YAAY,EAAE,EAAE;QAChB,UAAU,EAAE,SAAS;QACrB,eAAe,EAAE,SAAS;KAC3B;IACD,YAAY,EAAE;QACZ,QAAQ,EAAE,UAAU;QACpB,GAAG,EAAE,CAAC;QACN,KAAK,EAAE,CAAC;QACR,eAAe,EAAE,oBAAoB;QACrC,iBAAiB,EAAE,EAAE;QACrB,eAAe,EAAE,CAAC;QAClB,YAAY,EAAE,CAAC;KAChB;IACD,gBAAgB,EAAE;QAChB,KAAK,EAAE,OAAO;QACd,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,KAAK;KAClB;IACD,MAAM,EAAE;QACN,IAAI,EAAE,CAAC;KACR;IACD,mBAAmB,EAAE;QACnB,SAAS,EAAE,EAAE;QACb,UAAU,EAAE,QAAQ;KACrB;IACD,cAAc,EAAE;QACd,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,SAAS;QAChB,UAAU,EAAE,KAAK;QACjB,YAAY,EAAE,EAAE;KACjB;IACD,aAAa,EAAE;QACb,iBAAiB,EAAE,EAAE;QACrB,eAAe,EAAE,EAAE;QACnB,YAAY,EAAE,CAAC;QACf,iBAAiB;QACjB,UAAU,EAAE,QAAQ;QACpB,eAAe,EAAE,SAAS;KAC3B;IACD,iBAAiB,EAAE;QACjB,KAAK,EAAE,OAAO;QACd,UAAU,EAAE,KAAK;QACjB,QAAQ,EAAE,EAAE;KACb;IACD,SAAS,EAAE;QACT,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,EAAE;QACZ,SAAS,EAAE,CAAC;QACZ,SAAS,EAAE,QAAQ;KACpB;IACD,iBAAiB,EAAE;QACjB,SAAS,EAAE,EAAE;QACb,OAAO,EAAE,EAAE;QACX,UAAU,EAAE,QAAQ;QACpB,WAAW,EAAE,CAAC;QACd,WAAW,EAAE,SAAS;QACtB,YAAY,EAAE,CAAC;QACf,eAAe,EAAE,SAAS;KAC3B;IACD,eAAe,EAAE;QACf,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,KAAK;KAClB;IACD,YAAY,EAAE;QACZ,IAAI,EAAE,CAAC;QACP,eAAe,EAAE,iBAAiB;QAClC,cAAc,EAAE,QAAQ;QACxB,UAAU,EAAE,QAAQ;KACrB;IACD,YAAY,EAAE;QACZ,eAAe,EAAE,OAAO;QACxB,YAAY,EAAE,EAAE;QAChB,OAAO,EAAE,EAAE;QACX,UAAU,EAAE,QAAQ;QACpB,KAAK,EAAE,KAAK;QACZ,QAAQ,EAAE,GAAG;QACb,WAAW,EAAE,MAAM;QACnB,YAAY,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;QACrC,aAAa,EAAE,IAAI;QACnB,YAAY,EAAE,CAAC;QACf,SAAS,EAAE,CAAC;KACb;IACD,UAAU,EAAE;QACV,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,MAAM;QAClB,YAAY,EAAE,EAAE;QAChB,KAAK,EAAE,MAAM;KACd;IACD,gBAAgB,EAAE;QAChB,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,MAAM;QACb,SAAS,EAAE,QAAQ;QACnB,YAAY,EAAE,EAAE;QAChB,UAAU,EAAE,EAAE;KACf;IACD,WAAW,EAAE;QACX,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,GAAG;QACX,YAAY,EAAE,EAAE;KACjB;IACD,WAAW,EAAE;QACX,eAAe,EAAE,EAAE;QACnB,iBAAiB,EAAE,EAAE;QACrB,eAAe,EAAE,SAAS;QAC1B,YAAY,EAAE,CAAC;KAChB;IACD,eAAe,EAAE;QACf,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,MAAM;QACb,UAAU,EAAE,KAAK;KAClB;IACD,mBAAmB,EAAE;QACnB,QAAQ,EAAE,UAAU;QACpB,GAAG,EAAE,EAAE,EAAE,0DAA0D;QACnE,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,KAAK;QACZ,eAAe,EAAE,yBAAyB,EAAE,aAAa;QACzD,eAAe,EAAE,EAAE;QACnB,iBAAiB,EAAE,EAAE;QACrB,YAAY,EAAE,CAAC;QACf,UAAU,EAAE,QAAQ;QACpB,cAAc,EAAE,QAAQ;QACxB,WAAW,EAAE,MAAM;QACnB,YAAY,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;QACrC,aAAa,EAAE,GAAG;QAClB,YAAY,EAAE,CAAC;QACf,SAAS,EAAE,CAAC;QACZ,MAAM,EAAE,GAAG;KACZ;IACD,iBAAiB,EAAE;QACjB,KAAK,EAAE,OAAO;QACd,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,KAAK;QACjB,SAAS,EAAE,QAAQ;KACpB;CACF,CAAC,CAAC","sourcesContent":["import React, { useEffect, useMemo, useState } from 'react';\nimport { View, Text, StyleSheet, Image, ScrollView, Platform, Modal, TouchableOpacity, ActivityIndicator } from 'react-native';\nimport { showAlert } from '../../utils/platformAlert';\nimport { EnhancedCameraView } from '../EnhancedCameraView';\nimport { TemplateComponent, LocalizedText, GovernmentDocumentType, ISilentCaptureResult, IBbox, GovernmentDocumentTypeShorted, GovernmentDocumentTypeBackend } from '../../types/KYC.types';\nimport IdCardOverlay from '../OverLay/IdCard';\nimport { useTemplateKYCFlowContext } from '../../hooks/useTemplateKYCFlow';\nimport { useI18n } from '../../hooks/useI18n';\nimport { Button } from '../ui/Button';\nimport { removeDuplicates } from '../../utils/remove-duplicate';\nimport { backVerification, checkTemplateType, frontVerification } from '../../modules/api/CardAuthentification';\nimport { getDocumentTypeInfo } from '../../utils/get-document-type-info';\nimport pathToBase64 from '../../utils/pathToBase64';\nimport kycService, { truncateFields } from '../../modules/api/KYCService';\nimport { cropByObb, cropImageWithBBox, cropImageWithBBoxWithTolerance, getObbConfidence, OBB_CONFIDENCE_THRESHOLD } from '../../utils/cropByObb';\nimport { isMobileWeb } from '../../utils/deviceDetection';\nimport { logger } from '../../utils/logger';\n\n\ninterface IIDCardPayload {\n dir: string;\n file: string;\n mrz: string;\n templatePath?: string;\n}\n\ninterface IDCardCaptureProps {\n component: TemplateComponent;\n value?: Record<string, IIDCardPayload>;\n onValueChange: (value: Record<string, IIDCardPayload | string>) => void;\n error?: string;\n language?: string;\n currentSide?: string; // Nouveau prop pour spécifier le côté actuel\n}\n\nexport const IDCardCapture: React.FC<IDCardCaptureProps> = ({\n component,\n value = {},\n onValueChange,\n error,\n language = 'en',\n}) => {\n const { t, locale } = useI18n();\n const [showCamera, setShowCamera] = useState(false);\n const [capturedImages, setCapturedImages] = useState<Record<string, IIDCardPayload>>(value || {});\n // const [cropImageUri, setCropImageUri] = useState<string>('');\n const [currentSide, setCurrentSide] = useState<'front' | 'back'>('front');\n const [bboxBySide, setBboxBySide] = useState<Record<string, IBbox>>({});\n const [silentCaptureResult, setSilentCaptureResult] = useState<ISilentCaptureResult>({ success: false, isAnalyzing: false });\n const [showQRModal, setShowQRModal] = useState(false);\n\n // Mapping des types de documents backend vers SDK\n const documentTypeMapping: Record<string, GovernmentDocumentType> = {\n 'nationalId': 'national_id',\n 'passport': 'passport',\n 'driversLicense': 'drivers_licence',\n 'residencePermit': 'permanent_residence',\n 'healthInsuranceCard': 'health_insurance_card',\n };\n // const [imageNaturalSize, setImageNaturalSize] = useState<{ width: number; height: number } | null>(null);\n\n const { actions, state, env } = useTemplateKYCFlowContext();\n\n\n\n const getLocalizedText = (text: LocalizedText | Record<string, LocalizedText>): string => {\n // console.log(\"text\", text, JSON.stringify(component, null, 2));\n if (text && typeof text[currentSide] === 'object' && text[currentSide][locale]) {\n return text[currentSide][locale] || '';\n }\n return \"\";\n };\n\n // Récupérer les données depuis le composant country_selection\n const countrySelectionData = useMemo(() => {\n const countrySelectionComponent = state.template.components.find(c => c.type === 'country_selection');\n if (countrySelectionComponent) {\n return state.componentData[countrySelectionComponent.id];\n }\n return null;\n }, [state.template.components, state.componentData]);\n\n // Extraire selectedDocumentType depuis countrySelectionData\n const selectedDocumentType = useMemo<{ type: GovernmentDocumentType; region: string } | null>(() => {\n if (!countrySelectionData?.documentType) return null;\n\n const backendDocType = countrySelectionData.documentType;\n const mappedType = documentTypeMapping[backendDocType] || backendDocType as GovernmentDocumentType;\n const region = countrySelectionData.region || 'root';\n\n return { type: mappedType, region };\n }, [countrySelectionData, documentTypeMapping]);\n\n // Récupérer countryData pour compatibilité avec le code existant\n const countryData = useMemo(() => {\n return countrySelectionData;\n }, [countrySelectionData]);\n\n// console.log();\n\n // Synchroniser capturedImages avec value quand les données sont chargées (ex: reprise de session)\n useEffect(() => {\n if (value && Object.keys(value).length > 0) {\n // Vérifier si les données ont changé\n const valueChanged = JSON.stringify(value) !== JSON.stringify(capturedImages);\n if (valueChanged) {\n logger.log(\"Updating capturedImages from value:\", Object.keys(value));\n logger.log(\"Value data sample:\", truncateFields(value));\n const updatedImages = value as Record<string, IIDCardPayload>;\n setCapturedImages(updatedImages);\n \n // Si on a des images chargées, mettre à jour silentCaptureResult pour l'affichage\n Object.keys(updatedImages).forEach((side) => {\n const imageData = updatedImages[side];\n if (imageData?.dir) {\n setSilentCaptureResult(prev => ({\n ...prev,\n path: imageData.dir,\n success: true,\n isAnalyzing: false,\n mrz: imageData.mrz || '',\n templatePath: imageData.templatePath || '',\n }));\n }\n });\n }\n }\n }, [value]);\n\n useEffect(() => {\n logger.log(\"cropImageUri\", JSON.stringify(truncateFields({ box: silentCaptureResult }), null, 2));\n if (capturedImages[currentSide]?.dir && silentCaptureResult?.bbox) {\n cropImageWithBBox(capturedImages[currentSide].dir, silentCaptureResult.bbox)?.then((uri) => {\n // setCropImageUri(uri);\n });\n }\n }, [capturedImages[currentSide]?.dir, silentCaptureResult?.bbox])\n\n\n\n const cameraConfig = useMemo(() => {\n const instructions = selectedDocumentType\n ? (locale === 'en' ? getDocumentTypeInfo(selectedDocumentType.type).instructions.en : getDocumentTypeInfo(selectedDocumentType.type).instructions.fr)\n : getLocalizedText(component.instructions as Record<string, LocalizedText>);\n\n return {\n aspectRatio: 4 / 3,\n quality: 0.7, \n flashMode: 'auto' as const,\n cameraType: 'back' as const,\n autoFocus: 'on', \n whiteBalance: 'auto', \n allowRetake: true,\n maxRetakes: 3,\n overlay: {\n showGuide: true,\n guideText: instructions,\n bbox: {\n xMin: 20,\n yMin: 140,\n xMax: 370,\n yMax: 340,\n borderColor: '#2DBD60',\n borderWidth: 3,\n cornerRadius: 8\n }\n }\n };\n }, [selectedDocumentType, locale, component.instructions]);\n\n const retakePicture = (sideToRetake: 'front' | 'back') => {\n // 1. Turn the camera back on and hide the stepper\n setShowCamera(true);\n actions.showCustomStepper(false);\n\n // 2. WIPE LOCAL STATE: Use functional update to prevent stale closures\n setCapturedImages((prev) => {\n const newState = { ...prev };\n delete newState[sideToRetake]; \n return newState;\n });\n\n setSilentCaptureResult({\n path: '',\n success: false,\n isAnalyzing: false,\n error: '',\n templatePath: '',\n mrz: '',\n bbox: undefined,\n });\n\n \n if (value) {\n const newValue = { ...value };\n delete newValue[sideToRetake]; \n onValueChange(newValue);\n }\n };\n\n\n\n const getCurrentSideVerification = (currentSide: string) => {\n if (!selectedDocumentType || !countryData?.regionMapping) {\n return { authMethod: [], mrzTypes: [], regionMapping: null, key: 'root' };\n }\n\n const regionMapping = countryData.regionMapping[selectedDocumentType.type as GovernmentDocumentType];\n const authMethod: string[] = [];\n const mrzTypes: string[] = [];\n\n const key = selectedDocumentType.region?.trim()?.length > 0 ? selectedDocumentType.region.trim() : 'root';\n\n if (regionMapping?.[key] && Array.isArray(regionMapping[key])) {\n regionMapping[key].forEach((item: any) => {\n if (item[currentSide as keyof typeof item]) {\n authMethod.push(item[currentSide as keyof typeof item]);\n if (item?.mrz_type) {\n mrzTypes.push(item?.mrz_type);\n }\n }\n });\n }\n\n logger.log(\"regionMapping\", JSON.stringify(truncateFields({ regionMapping, selectedDocumentType: selectedDocumentType.region, key }), null, 2));\n\n return { authMethod: removeDuplicates(authMethod), mrzTypes: removeDuplicates(mrzTypes), regionMapping: regionMapping, key: key };\n }\n\n const getCorrespondingMrzType = (templatePath: string, mapping: any, selectedDocumentType: string = \"root\") => {\n if (!mapping || !mapping[selectedDocumentType]) return null;\n\n // Extraire le nom du fichier depuis le template_path\n const fileName = templatePath.split(\"/\").pop()?.replace(\".jpg\", \"\").replace(\".png\", \"\");\n\n if (!fileName) return null;\n\n // Normaliser en .py\n const pyName = `${fileName}.py`; // ex: cameroon_id_back_3_1.py\n\n // Chercher dans la liste\n const found = mapping[selectedDocumentType].find((item: any) => item.py_file === pyName);\n\n return found?.mrz_type || null;\n }\n\n const handleSilentCapture = async (result: { success: boolean; path?: string; error?: string }) => {\n if (silentCaptureResult.isAnalyzing) {\n return;\n }\n if (result.success && result.path) {\n setSilentCaptureResult((prev) => ({ ...prev, isAnalyzing: true, success: false, error: '' }));\n let templatePath = silentCaptureResult.templatePath || '';\n let templateBbox: IBbox | undefined;\n\n if (!selectedDocumentType) {\n setSilentCaptureResult((prev) => ({ ...prev, isAnalyzing: false, success: false, error: 'Document type not selected' }));\n return;\n }\n\n const regionMappings = getCurrentSideVerification(currentSide)\n // logger.log(\"regionMappings\", JSON.stringify(truncateFields({regionMappings, templatePath}), null, 2));\n if (templatePath.length === 0) {\n try {\n logger.log(\"checkTemplateType - BEFORE call\", {\n selectedDocumentTypeType: selectedDocumentType?.type,\n countrySelectionDataDocumentType: countrySelectionData?.documentType,\n docTypeToSend: selectedDocumentType?.type\n });\n const templateType = await checkTemplateType({ path: result.path || '', docType: selectedDocumentType?.type as GovernmentDocumentType, docRegion: countryData?.code || \"\", postfix: currentSide }, env);\n\n if (templateType.template_path) {\n templatePath = templateType.template_path;\n logger.log(\"templatePath\", templatePath);\n setSilentCaptureResult((prev) => ({ ...prev, templatePath: templatePath }));\n }\n if (templateType.card_obb) {\n const obbConfidence = getObbConfidence((templateType as any).card_obb);\n if (obbConfidence !== null && obbConfidence < OBB_CONFIDENCE_THRESHOLD) {\n setSilentCaptureResult((prev) => ({\n ...prev,\n isAnalyzing: false,\n success: false,\n error: t('kyc.idCardCapture.cardNotFullyInFrame'),\n }));\n return;\n }\n let bbox: IBbox | undefined;\n try {\n const crop = await cropByObb(result?.path || '', (templateType as any).card_obb);\n bbox = crop.bbox;\n templateBbox = bbox;\n } catch { }\n }\n } catch (e: any) {\n logger.log(\"error checking template type\", truncateFields(e));\n setSilentCaptureResult((prev) => ({ ...prev, isAnalyzing: false, success: false, error: e?.message || 'Erreur de vérification du template' }));\n return; // Return early if checkTemplateType fails\n }\n }\n logger.log(\"templatePath before verification\", templatePath, \"currentSide\", currentSide);\n if (currentSide === 'front') {\n logger.log(\"frontVerification - BEFORE call\", {\n selectedDocumentTypeType: selectedDocumentType?.type,\n countrySelectionDataDocumentType: countrySelectionData?.documentType,\n docTypeToSend: selectedDocumentType?.type\n });\n logger.log(\"Calling frontVerification\", { templatePath, selectedDocumentType: selectedDocumentType?.type, regionMappings });\n console.log(\"About to call frontVerification\", typeof frontVerification);\n try {\n const mrzType = getCorrespondingMrzType(templatePath, regionMappings.regionMapping, regionMappings.key || '') || '';\n console.log(\"mrzType calculated\", mrzType);\n const verificationParams = {\n path: result.path,\n regionMapping: {\n authMethod: regionMappings.authMethod,\n mrzTypes: regionMappings.mrzTypes,\n },\n selectedDocumentType: GovernmentDocumentTypeShorted[selectedDocumentType?.type as keyof typeof GovernmentDocumentTypeShorted] || '',\n code: countryData?.code || '',\n currentSide: currentSide,\n templatePath: templatePath,\n mrzType: mrzType,\n };\n console.log(\"frontVerification params\", verificationParams);\n console.log(\"About to call frontVerification function\");\n\n const promise = frontVerification(verificationParams, env);\n console.log(\"frontVerification promise created\", promise);\n \n promise.then((res: any) => {\n logger.log(\"front verification result\", truncateFields(res));\n const bbox = res?.bbox || templateBbox;\n \n setSilentCaptureResult((prev) => ({\n ...prev,\n path: result.path,\n templatePath: templatePath,\n bbox: bbox, \n success: true,\n mrz: res?.mrz ? JSON.stringify(res.mrz) : \"\", \n isAnalyzing: false,\n country: countryData?.code,\n documentType: selectedDocumentType.type,\n }));\n \n // Stocker le bbox pour ce côté\n if (bbox && typeof bbox === 'object') {\n setBboxBySide((prev) => ({ ...prev, [currentSide]: bbox }));\n }\n\n }).catch((e: any) => {\n\n }).catch((e: any) => {\n console.log(\"error front verification\", e);\n logger.log(\"error front verification\", truncateFields(e));\n const isCardNotFullyInFrame =\n e?.message === 'CARD_NOT_FULLY_IN_FRAME' ||\n e?.message?.includes('entirement') ||\n e?.message?.includes('fully in frame');\n const errorMessage = isCardNotFullyInFrame\n ? t('kyc.idCardCapture.cardNotFullyInFrame')\n : (e?.message || 'Erreur de détection du MRZ');\n setSilentCaptureResult((prev) => ({ ...prev, isAnalyzing: false, templatePath: templatePath, success: false, error: errorMessage }));\n });\n } catch (error: any) {\n console.log(\"Error setting up frontVerification call\", error);\n setSilentCaptureResult((prev) => ({ ...prev, isAnalyzing: false, success: false, error: error?.message || 'Erreur lors de la configuration de la vérification' }));\n }\n } else {\n const backRegionMappings = getCurrentSideVerification(currentSide);\n logger.log(\"Calling backVerification\", { templatePath, selectedDocumentType: selectedDocumentType.type, backRegionMappings });\n \n backVerification({\n path: result.path,\n regionMapping: {\n authMethod: backRegionMappings.authMethod,\n mrzTypes: backRegionMappings.mrzTypes,\n },\n selectedDocumentType: GovernmentDocumentTypeShorted[selectedDocumentType.type as keyof typeof GovernmentDocumentTypeShorted] || '',\n code: countryData?.code || '',\n currentSide: currentSide,\n templatePath: templatePath,\n mrzType: getCorrespondingMrzType(templatePath, backRegionMappings.regionMapping, backRegionMappings.key || '') || '',\n }, env).then((res: any) => { \n logger.log(\"back verification result\", truncateFields(res));\n const bbox = res?.bbox || templateBbox;\n \n setSilentCaptureResult((prev) => ({\n ...prev, \n path: result.path, \n bbox: bbox,\n success: true, \n mrz: res?.mrz ? JSON.stringify(res.mrz) : \"\", \n isAnalyzing: false,\n country: countryData?.code,\n documentType: selectedDocumentType.type,\n }));\n \n // Stocker le bbox pour ce côté\n if (bbox && typeof bbox === 'object') {\n setBboxBySide((prev) => ({ ...prev, [currentSide]: bbox }));\n }\n }).catch((e: any) => {\n logger.log(\"error back verification\", truncateFields(e));\n const isCardNotFullyInFrame =\n e?.message === 'CARD_NOT_FULLY_IN_FRAME' ||\n e?.message?.includes('entirement') ||\n e?.message?.includes('fully in frame');\n const errorMessage = isCardNotFullyInFrame\n ? t('kyc.idCardCapture.cardNotFullyInFrame')\n : (e?.message || 'Erreur de détection du MRZ');\n setSilentCaptureResult((prev) => ({ ...prev, isAnalyzing: false, templatePath: templatePath, success: false, error: errorMessage }));\n });\n }\n\n }\n }\n\n const handleCapture = async (result: { success: boolean; path?: string; error?: string }) => {\n if (silentCaptureResult.path) {\n let imagePathForUpload = silentCaptureResult.path;\n if (silentCaptureResult.bbox) {\n try {\n imagePathForUpload = await cropImageWithBBoxWithTolerance(silentCaptureResult.path, silentCaptureResult.bbox, 0.05);\n } catch (error) {\n imagePathForUpload = silentCaptureResult.path;\n }\n }\n\n const base64 = await pathToBase64(imagePathForUpload);\n\n // ✅ FIX: Use 'imagePathForUpload' (the cropped image) for the local display directory!\n const newImages = { \n ...capturedImages, \n [currentSide]: { \n dir: imagePathForUpload, // <--- CHANGED THIS LINE\n file: base64, \n mrz: silentCaptureResult.mrz || \"\", \n templatePath: silentCaptureResult.templatePath \n } \n };\n \n setCapturedImages(newImages);\n \n if (silentCaptureResult.country && silentCaptureResult.documentType) {\n onValueChange({\n ...newImages,\n country: silentCaptureResult.country,\n documentType: GovernmentDocumentTypeBackend[silentCaptureResult.documentType as keyof typeof GovernmentDocumentTypeBackend] || '',\n });\n }\n setShowCamera(false);\n actions.showCustomStepper(true);\n } else {\n showAlert('Erreur', result.error || 'Impossible de prendre la photo');\n }\n };\n\n const handleError = (event: { message: string }) => {\n showAlert('Erreur', event.message);\n setShowCamera(false);\n };\n\n useEffect(() => {\n actions.showCustomStepper(!showCamera);\n }, [showCamera]);\n\n // Cross-device polling logic\n useEffect(() => {\n if (!showQRModal || !state.session.session_id) return;\n\n const pollInterval = setInterval(async () => {\n try {\n const result = await kycService.getVerificationResult(state.session.session_id);\n const sessionData = result[state.session.session_id]?.data;\n\n if (sessionData) {\n // Check if verification is completed or if we have ID card data\n // Since the requirement is \"verification restarts\", we might look for overall completion\n // or we could check if user_data is populated.\n // For now, let's assume if status is not PENDING/INITIALIZED it might be done.\n // Or simplier: if the mobile flow completes, the session status updates.\n logger.log('Polling result:', truncateFields(sessionData));\n\n if (sessionData.verification_status === 'completed' || sessionData.verification_status === 'approved' || sessionData.verification_status === 'review') {\n clearInterval(pollInterval);\n setShowQRModal(false);\n actions.submitVerification(); // Or handleComplete\n }\n }\n } catch (error) {\n console.error('Polling error:', error);\n }\n }, 5000);\n\n return () => clearInterval(pollInterval);\n }, [showQRModal, state.session.session_id, actions]);\n\n const getQrCodeUrl = (): string => {\n // Only available on web platform\n if (Platform.OS !== 'web') return '';\n if (typeof window === 'undefined' || !window.location || !window.location.href) return '';\n \n try {\n const currentUrl = new URL(window.location.href);\n if (!currentUrl.searchParams.has('kyc_id') && state.session.session_id) {\n currentUrl.searchParams.set('kyc_id', state.session.session_id);\n }\n currentUrl.searchParams.set('component_index', String(state.currentComponentIndex));\n if (countrySelectionData?.code) {\n currentUrl.searchParams.set('country', countrySelectionData.code);\n if (countrySelectionData.documentType) currentUrl.searchParams.set('document_type', countrySelectionData.documentType);\n if (countrySelectionData.region) currentUrl.searchParams.set('region', countrySelectionData.region);\n }\n return `https://api.qrserver.com/v1/create-qr-code/?size=250x250&data=${encodeURIComponent(currentUrl.toString())}`;\n } catch (error) {\n console.warn('Error generating QR code URL:', error);\n return '';\n }\n };\n\n\n\n\n\n\n\n // En reprise sur un autre appareil: afficher un chargement tant que les données de session ne sont pas restaurées\n const isResumingSession = Boolean(state.session.session_id && state.currentComponentIndex > 0);\n const sessionDataRestored = state.session.sessionDataRestored !== false;\n if (isResumingSession && !sessionDataRestored && (!countrySelectionData || !selectedDocumentType)) {\n return (\n <View style={styles.root}>\n <View style={[styles.container, { justifyContent: 'center', alignItems: 'center' }]}>\n <ActivityIndicator size=\"large\" color=\"#2DBD60\" />\n <Text style={[styles.description, { marginTop: 16 }]}>\n {state.currentLanguage === 'en' ? 'Loading your session...' : 'Chargement de votre session...'}\n </Text>\n </View>\n </View>\n );\n }\n\n // Vérifier si les données sont disponibles, sinon afficher un message d'erreur\n if (!countrySelectionData || !selectedDocumentType) {\n return (\n <View style={styles.root}>\n <View style={styles.container}>\n <Text style={styles.title}>{getLocalizedText(component.labels)}</Text>\n <Text style={styles.description}>\n {state.currentLanguage === \"en\"\n ? \"Please complete the country and document selection first.\"\n : \"Veuillez d'abord compléter la sélection du pays et du document.\"}\n </Text>\n {error && (\n <Text style={styles.errorText}>{error}</Text>\n )}\n </View>\n </View>\n );\n }\n\n\n\n if (showCamera) {\n return (\n <View style={styles.cameraContainer}>\n <EnhancedCameraView\n showCamera={true}\n cameraType={cameraConfig.cameraType}\n style={styles.camera}\n onCapture={handleCapture}\n onError={handleError}\n onClose={() => setShowCamera(false)}\n quality=\"high\"\n showCaptureButton={true}\n showSwitchCamera={true}\n onSilentCapture={handleSilentCapture}\n silentCaptureResult={silentCaptureResult}\n captureStabilizationDelayMs={3000}\n enableFlash={cameraConfig.flashMode === 'auto' || cameraConfig.flashMode === 'on'}\n overlayComponent={\n <IdCardOverlay\n xMin={cameraConfig.overlay.bbox.xMin}\n yMin={cameraConfig.overlay.bbox.yMin}\n xMax={cameraConfig.overlay.bbox.xMax}\n yMax={cameraConfig.overlay.bbox.yMax}\n instructions={cameraConfig.overlay.guideText}\n cornerOpacity={cameraConfig.overlay.bbox.cornerRadius || 0 as number}\n isSuccess={silentCaptureResult.success}\n language={state.currentLanguage}\n stepperProps={{\n back: () => {\n if (currentSide === 'back') {\n setCurrentSide('front');\n setShowCamera(false);\n // Si une image front existe, on la restaure pour l'afficher\n if (capturedImages['front']?.dir) {\n // Restaurer l'état de capture du front pour afficher l'image\n const frontImage = capturedImages['front'];\n const frontBbox = bboxBySide['front'];\n setSilentCaptureResult((prev) => ({\n path: frontImage.dir,\n success: true,\n isAnalyzing: false,\n error: '',\n mrz: frontImage.mrz || '',\n templatePath: frontImage.templatePath || '',\n country: silentCaptureResult.country,\n documentType: silentCaptureResult.documentType,\n bbox: frontBbox // Restaurer le bbox pour recalculer le cropImageUri\n }));\n } else {\n // Pas d'image front, on réinitialise\n setSilentCaptureResult((prev) => ({ path: '', success: false, isAnalyzing: false, error: '', templatePath: '' }));\n }\n } else {\n // Retour au composant précédent (country_selection)\n actions.previousComponent();\n }\n },\n selectedDocumentType: selectedDocumentType ? (locale === 'en' ? getDocumentTypeInfo(selectedDocumentType.type).name.en : getDocumentTypeInfo(selectedDocumentType.type).name.fr) : '',\n step: state.currentComponentIndex + 1,\n totalSteps: state.template.components.length,\n side: currentSide,\n }}\n />\n }\n />\n \n {silentCaptureResult.error ? (\n <View style={styles.floatingErrorBanner}>\n <Text style={styles.floatingErrorText}>\n {silentCaptureResult.error}\n </Text>\n </View>\n ) : null}\n\n </View>\n );\n }\n\n\n return (\n <View style={styles.root}>\n <View style={styles.previewContainer}>\n <ScrollView style={styles.previewItemContainer} showsVerticalScrollIndicator={false}>\n <View key={currentSide} style={styles.sideContainer}>\n <Text style={styles.sideTitle}>\n {t('kyc.idCardCapture.captureTitle', { side: currentSide === 'front' ? locale === 'en' ? 'Front' : 'Recto' : locale === 'en' ? 'Back' : 'Verso' })}\n </Text>\n <Text style={{ fontSize: 14, color: '#666', textAlign: 'center', marginBottom: 16, lineHeight: 22 }}>\n {getLocalizedText(component.instructions)}\n </Text>\n\n <View style={{ alignItems: 'center', justifyContent: 'center', flexDirection: \"column\", gap: 16 }}>\n {silentCaptureResult?.error === 'TOO_FAR_AWAY' && (\n <View style={{ \n backgroundColor: '#FF9500', \n padding: 12, \n borderRadius: 8, \n width: '100%',\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.2,\n shadowRadius: 4,\n elevation: 4\n }}>\n <Text style={{ color: 'white', fontWeight: 'bold', textAlign: 'center', fontSize: 16 }}>\n {state.currentLanguage === \"en\" \n ? \"Move the document closer to the camera.\" \n : \"Veuillez rapprocher le document de la caméra.\"}\n </Text>\n </View>\n )}\n\n <View\n style={{\n width: '100%',\n height: 200,\n borderRadius: 12,\n padding: 1,\n overflow: 'hidden',\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 4 },\n shadowOpacity: 0.18,\n shadowRadius: 8,\n elevation: 8,\n backgroundColor: '#000', \n }}\n >\n {capturedImages[currentSide]?.dir ? (\n <Image\n source={{ uri: capturedImages[currentSide].dir }}\n style={{\n width: '100%',\n height: '100%', \n borderRadius: 12,\n resizeMode: 'contain', \n }}\n />\n ) : silentCaptureResult.path ? (\n <Image\n source={{ uri: silentCaptureResult.path }}\n style={{\n width: '100%',\n height: '100%',\n borderRadius: 12,\n resizeMode: 'contain', \n }}\n />\n ) : null}\n </View>\n {/* Capture button si aucune image n'a été capturée */}\n {!capturedImages[currentSide]?.dir && (\n <Button\n title={state.currentLanguage === \"en\" ? \"Take Photo\" : \"Prendre une photo\"}\n onPress={() => {\n setShowCamera(true);\n actions.showCustomStepper(false);\n }}\n variant=\"primary\"\n size=\"large\"\n fullWidth\n />\n )}\n {/* retake button si une image a été capturée */}\n {capturedImages[currentSide]?.dir && (\n <>\n <Button title={t('kyc.idCardCapture.retakeButton')} onPress={() => {\n retakePicture(currentSide);\n }}\n variant=\"outline\"\n size=\"medium\"\n fullWidth\n />\n <Button title={t('common.next')} onPress={() => {\n if (!selectedDocumentType) {\n showAlert('Error', 'Document type not selected');\n return;\n }\n if (currentSide === 'back' || selectedDocumentType.type === 'passport') {\n actions.nextComponent();\n return;\n } else {\n setShowCamera(true);\n setCurrentSide('back');\n setSilentCaptureResult((prev) => ({ path: '', success: false, isAnalyzing: false, error: '', mrz: '', templatePath: '' }));\n // setCropImageUri('');\n }\n }}\n variant=\"primary\"\n size=\"large\"\n fullWidth\n />\n </>\n )}\n </View>\n </View>\n </ScrollView>\n\n\n\n {error && (\n <Text style={styles.errorText}>{error}</Text>\n )}\n\n {/* Cross-Device / Continue on Phone Button (Web Only) */}\n {Platform.OS === 'web' && !isMobileWeb() && !capturedImages[currentSide]?.dir && (\n <Button title={t('kyc.idCardCapture.continueOnPhone')} onPress={() => { setShowQRModal(true) }} />\n )}\n\n {/* QR Code Modal - Web Only */}\n {Platform.OS === 'web' && (\n <Modal\n visible={showQRModal}\n transparent={true}\n animationType=\"fade\"\n onRequestClose={() => setShowQRModal(false)}\n >\n <View style={styles.modalOverlay}>\n <View style={styles.modalContent}>\n <Text style={styles.modalTitle}>\n {t('kyc.idCardCapture.continueOnMobile')}\n </Text>\n <Text style={styles.modalDescription}>\n {t('kyc.idCardCapture.scanQrCode')}\n </Text>\n\n {showQRModal && getQrCodeUrl() ? (\n <Image\n source={{ uri: getQrCodeUrl() }}\n style={styles.qrCodeImage}\n />\n ) : null}\n\n <TouchableOpacity\n style={styles.closeButton}\n onPress={() => setShowQRModal(false)}\n >\n <Text style={styles.closeButtonText}>\n {t('common.close')}\n </Text>\n </TouchableOpacity>\n </View>\n </View>\n </Modal>\n )}\n\n </View>\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n root: {\n flex: 1,\n maxWidth: 760,\n width: '100%',\n },\n container: {\n backgroundColor: 'white',\n margin: 10,\n borderRadius: 10,\n paddingVertical: 16,\n paddingHorizontal: 16,\n // shadow\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.35,\n shadowRadius: 4.84,\n elevation: 10,\n // padding: 16,\n },\n cameraContainer: {\n flex: 1,\n width: '100%',\n height: '100%',\n },\n previewContainer: {\n width: '95%',\n backgroundColor: 'white',\n margin: 10,\n borderRadius: 10,\n paddingVertical: 16,\n paddingHorizontal: 16,\n },\n previewItemContainer: {\n\n // marginBottom: 24,\n },\n title: {\n fontSize: 24,\n fontWeight: 'bold',\n color: '#333',\n marginBottom: 8,\n textAlign: 'center',\n },\n subtitle: {\n fontSize: 18,\n color: '#666',\n textAlign: 'center',\n marginBottom: 16,\n },\n sideInfo: {\n fontSize: 14,\n color: '#888',\n textAlign: 'center',\n marginBottom: 16,\n fontStyle: 'italic',\n },\n description: {\n fontSize: 16,\n color: '#666',\n textAlign: 'center',\n marginBottom: 24,\n lineHeight: 22,\n },\n sidesContainer: {\n flex: 1,\n },\n sideContainer: {\n marginBottom: 24,\n },\n sideTitle: {\n fontSize: 25,\n fontWeight: 'bold',\n color: '#000',\n marginBottom: 12,\n textAlign: 'center',\n },\n captureButton: {\n borderWidth: 2,\n borderColor: '#2DBD60',\n borderStyle: 'dashed',\n borderRadius: 12,\n padding: 32,\n alignItems: 'center',\n backgroundColor: '#f0f9f0',\n },\n captureIcon: {\n fontSize: 48,\n marginBottom: 16,\n },\n captureText: {\n fontSize: 16,\n color: '#2DBD60',\n fontWeight: '600',\n },\n capturedImageContainer: {\n position: 'relative',\n },\n capturedImage: {\n width: '100%',\n height: 200,\n borderRadius: 12,\n resizeMode: 'contain',\n backgroundColor: '#f0f0f0',\n },\n retakeButton: {\n position: 'absolute',\n top: 8,\n right: 8,\n backgroundColor: 'rgba(0, 0, 0, 0.7)',\n paddingHorizontal: 12,\n paddingVertical: 6,\n borderRadius: 6,\n },\n retakeButtonText: {\n color: 'white',\n fontSize: 12,\n fontWeight: '600',\n },\n camera: {\n flex: 1,\n },\n completionContainer: {\n marginTop: 24,\n alignItems: 'center',\n },\n completionText: {\n fontSize: 16,\n color: '#2DBD60',\n fontWeight: '600',\n marginBottom: 16,\n },\n primaryButton: {\n paddingHorizontal: 32,\n paddingVertical: 16,\n borderRadius: 8,\n // minWidth: 120,\n alignItems: 'center',\n backgroundColor: '#2DBD60',\n },\n primaryButtonText: {\n color: 'white',\n fontWeight: '600',\n fontSize: 16,\n },\n errorText: {\n color: '#dc2626',\n fontSize: 14,\n marginTop: 8,\n textAlign: 'center',\n },\n crossDeviceButton: {\n marginTop: 16,\n padding: 12,\n alignItems: 'center',\n borderWidth: 1,\n borderColor: '#2DBD60',\n borderRadius: 8,\n backgroundColor: '#f0f9f0',\n },\n crossDeviceText: {\n color: '#2DBD60',\n fontSize: 16,\n fontWeight: '600',\n },\n modalOverlay: {\n flex: 1,\n backgroundColor: 'rgba(0,0,0,0.5)',\n justifyContent: 'center',\n alignItems: 'center',\n },\n modalContent: {\n backgroundColor: 'white',\n borderRadius: 16,\n padding: 24,\n alignItems: 'center',\n width: '90%',\n maxWidth: 340,\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.25,\n shadowRadius: 4,\n elevation: 5,\n },\n modalTitle: {\n fontSize: 20,\n fontWeight: 'bold',\n marginBottom: 12,\n color: '#333',\n },\n modalDescription: {\n fontSize: 16,\n color: '#666',\n textAlign: 'center',\n marginBottom: 20,\n lineHeight: 22,\n },\n qrCodeImage: {\n width: 200,\n height: 200,\n marginBottom: 20,\n },\n closeButton: {\n paddingVertical: 10,\n paddingHorizontal: 20,\n backgroundColor: '#f5f5f5',\n borderRadius: 8,\n },\n closeButtonText: {\n fontSize: 16,\n color: '#666',\n fontWeight: '600',\n },\n floatingErrorBanner: {\n position: 'absolute',\n top: 60, // Pushes it down slightly from the very top of the screen\n left: '10%',\n right: '10%',\n backgroundColor: 'rgba(220, 38, 38, 0.95)', // Bright red\n paddingVertical: 12,\n paddingHorizontal: 16,\n borderRadius: 8,\n alignItems: 'center',\n justifyContent: 'center',\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 4 },\n shadowOpacity: 0.3,\n shadowRadius: 5,\n elevation: 8,\n zIndex: 100,\n },\n floatingErrorText: {\n color: 'white',\n fontSize: 14,\n fontWeight: '700',\n textAlign: 'center',\n },\n}); "]}
1
+ {"version":3,"file":"IDCardCapture.js","sourceRoot":"","sources":["../../../../src/components/KYCElements/IDCardCapture.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useEffect, useMemo, useState } from 'react';\nimport { View, Text, StyleSheet, Image, ScrollView, Platform, Modal, TouchableOpacity, ActivityIndicator } from 'react-native';\nimport { showAlert } from '../../utils/platformAlert';\nimport { EnhancedCameraView } from '../EnhancedCameraView';\nimport { TemplateComponent, LocalizedText, GovernmentDocumentType, ISilentCaptureResult, IBbox, GovernmentDocumentTypeShorted, GovernmentDocumentTypeBackend } from '../../types/KYC.types';\nimport IdCardOverlay from '../OverLay/IdCard';\nimport { useTemplateKYCFlowContext } from '../../hooks/useTemplateKYCFlow';\nimport { useI18n } from '../../hooks/useI18n';\nimport { Button } from '../ui/Button';\nimport { removeDuplicates } from '../../utils/remove-duplicate';\nimport { backVerification, checkTemplateType, frontVerification } from '../../modules/api/CardAuthentification';\nimport { getDocumentTypeInfo } from '../../utils/get-document-type-info';\nimport pathToBase64 from '../../utils/pathToBase64';\nimport kycService, { truncateFields } from '../../modules/api/KYCService';\nimport { cropByObb, cropImageWithBBox, cropImageWithBBoxWithTolerance, getObbConfidence, OBB_CONFIDENCE_THRESHOLD } from '../../utils/cropByObb';\nimport { isMobileWeb } from '../../utils/deviceDetection';\nimport { logger } from '../../utils/logger';\n\n\ninterface IIDCardPayload {\n dir: string;\n file: string;\n mrz: string;\n templatePath?: string;\n}\n\ninterface IDCardCaptureProps {\n component: TemplateComponent;\n value?: Record<string, IIDCardPayload>;\n onValueChange: (value: Record<string, IIDCardPayload | string>) => void;\n error?: string;\n language?: string;\n currentSide?: string; // Nouveau prop pour spécifier le côté actuel\n}\n\nexport const IDCardCapture: React.FC<IDCardCaptureProps> = ({\n component,\n value = {},\n onValueChange,\n error,\n language = 'en',\n}) => {\n const { t, locale } = useI18n();\n const [showCamera, setShowCamera] = useState(false);\n const [capturedImages, setCapturedImages] = useState<Record<string, IIDCardPayload>>(value || {});\n // const [cropImageUri, setCropImageUri] = useState<string>('');\n const [currentSide, setCurrentSide] = useState<'front' | 'back'>('front');\n const [bboxBySide, setBboxBySide] = useState<Record<string, IBbox>>({});\n const [silentCaptureResult, setSilentCaptureResult] = useState<ISilentCaptureResult>({ success: false, isAnalyzing: false });\n const [showQRModal, setShowQRModal] = useState(false);\n\n // Mapping des types de documents backend vers SDK\n const documentTypeMapping: Record<string, GovernmentDocumentType> = {\n 'nationalId': 'national_id',\n 'passport': 'passport',\n 'driversLicense': 'drivers_licence',\n 'residencePermit': 'permanent_residence',\n 'healthInsuranceCard': 'health_insurance_card',\n };\n // const [imageNaturalSize, setImageNaturalSize] = useState<{ width: number; height: number } | null>(null);\n\n const { actions, state, env } = useTemplateKYCFlowContext();\n\n\n\n const getLocalizedText = (text: LocalizedText | Record<string, LocalizedText>): string => {\n // console.log(\"text\", text, JSON.stringify(component, null, 2));\n if (text && typeof text[currentSide] === 'object' && text[currentSide][locale]) {\n return text[currentSide][locale] || '';\n }\n return \"\";\n };\n\n // Récupérer les données depuis le composant country_selection\n const countrySelectionData = useMemo(() => {\n const countrySelectionComponent = state.template.components.find(c => c.type === 'country_selection');\n if (countrySelectionComponent) {\n return state.componentData[countrySelectionComponent.id];\n }\n return null;\n }, [state.template.components, state.componentData]);\n\n // Extraire selectedDocumentType depuis countrySelectionData\n const selectedDocumentType = useMemo<{ type: GovernmentDocumentType; region: string } | null>(() => {\n if (!countrySelectionData?.documentType) return null;\n\n const backendDocType = countrySelectionData.documentType;\n const mappedType = documentTypeMapping[backendDocType] || backendDocType as GovernmentDocumentType;\n const region = countrySelectionData.region || 'root';\n\n return { type: mappedType, region };\n }, [countrySelectionData, documentTypeMapping]);\n\n // Récupérer countryData pour compatibilité avec le code existant\n const countryData = useMemo(() => {\n return countrySelectionData;\n }, [countrySelectionData]);\n\n// console.log();\n\n // Synchroniser capturedImages avec value quand les données sont chargées (ex: reprise de session)\n useEffect(() => {\n if (value && Object.keys(value).length > 0) {\n // Vérifier si les données ont changé\n const valueChanged = JSON.stringify(value) !== JSON.stringify(capturedImages);\n if (valueChanged) {\n logger.log(\"Updating capturedImages from value:\", Object.keys(value));\n logger.log(\"Value data sample:\", truncateFields(value));\n const updatedImages = value as Record<string, IIDCardPayload>;\n setCapturedImages(updatedImages);\n \n // Si on a des images chargées, mettre à jour silentCaptureResult pour l'affichage\n Object.keys(updatedImages).forEach((side) => {\n const imageData = updatedImages[side];\n if (imageData?.dir) {\n setSilentCaptureResult(prev => ({\n ...prev,\n path: imageData.dir,\n success: true,\n isAnalyzing: false,\n mrz: imageData.mrz || '',\n templatePath: imageData.templatePath || '',\n }));\n }\n });\n }\n }\n }, [value]);\n\n useEffect(() => {\n logger.log(\"cropImageUri\", JSON.stringify(truncateFields({ box: silentCaptureResult }), null, 2));\n if (capturedImages[currentSide]?.dir && silentCaptureResult?.bbox) {\n cropImageWithBBox(capturedImages[currentSide].dir, silentCaptureResult.bbox)?.then((uri) => {\n // setCropImageUri(uri);\n });\n }\n }, [capturedImages[currentSide]?.dir, silentCaptureResult?.bbox])\n\n\n\n const cameraConfig = useMemo(() => {\n const instructions = selectedDocumentType\n ? (locale === 'en' ? getDocumentTypeInfo(selectedDocumentType.type).instructions.en : getDocumentTypeInfo(selectedDocumentType.type).instructions.fr)\n : getLocalizedText(component.instructions as Record<string, LocalizedText>);\n\n return {\n aspectRatio: 4 / 3,\n quality: 0.7, \n flashMode: 'auto' as const,\n cameraType: 'back' as const,\n autoFocus: 'on', \n whiteBalance: 'auto', \n allowRetake: true,\n maxRetakes: 3,\n overlay: {\n showGuide: true,\n guideText: instructions,\n bbox: {\n xMin: 20,\n yMin: 140,\n xMax: 370,\n yMax: 340,\n borderColor: '#2DBD60',\n borderWidth: 3,\n cornerRadius: 8\n }\n }\n };\n }, [selectedDocumentType, locale, component.instructions]);\n\n const retakePicture = (sideToRetake: 'front' | 'back') => {\n // 1. Turn the camera back on and hide the stepper\n setShowCamera(true);\n actions.showCustomStepper(false);\n\n // 2. WIPE LOCAL STATE: Use functional update to prevent stale closures\n setCapturedImages((prev) => {\n const newState = { ...prev };\n delete newState[sideToRetake]; \n return newState;\n });\n\n setSilentCaptureResult({\n path: '',\n success: false,\n isAnalyzing: false,\n error: '',\n templatePath: '',\n mrz: '',\n bbox: undefined,\n });\n\n \n if (value) {\n const newValue = { ...value };\n delete newValue[sideToRetake]; \n onValueChange(newValue);\n }\n };\n\n\n\n const getCurrentSideVerification = (currentSide: string) => {\n if (!selectedDocumentType || !countryData?.regionMapping) {\n return { authMethod: [], mrzTypes: [], regionMapping: null, key: 'root' };\n }\n\n const regionMapping = countryData.regionMapping[selectedDocumentType.type as GovernmentDocumentType];\n const authMethod: string[] = [];\n const mrzTypes: string[] = [];\n\n const key = selectedDocumentType.region?.trim()?.length > 0 ? selectedDocumentType.region.trim() : 'root';\n\n if (regionMapping?.[key] && Array.isArray(regionMapping[key])) {\n regionMapping[key].forEach((item: any) => {\n if (item[currentSide as keyof typeof item]) {\n authMethod.push(item[currentSide as keyof typeof item]);\n if (item?.mrz_type) {\n mrzTypes.push(item?.mrz_type);\n }\n }\n });\n }\n\n logger.log(\"regionMapping\", JSON.stringify(truncateFields({ regionMapping, selectedDocumentType: selectedDocumentType.region, key }), null, 2));\n\n return { authMethod: removeDuplicates(authMethod), mrzTypes: removeDuplicates(mrzTypes), regionMapping: regionMapping, key: key };\n }\n\n const getCorrespondingMrzType = (templatePath: string, mapping: any, selectedDocumentType: string = \"root\") => {\n if (!mapping || !mapping[selectedDocumentType]) return null;\n\n // Extraire le nom du fichier depuis le template_path\n const fileName = templatePath.split(\"/\").pop()?.replace(\".jpg\", \"\").replace(\".png\", \"\");\n\n if (!fileName) return null;\n\n // Normaliser en .py\n const pyName = `${fileName}.py`; // ex: cameroon_id_back_3_1.py\n\n // Chercher dans la liste\n const found = mapping[selectedDocumentType].find((item: any) => item.py_file === pyName);\n\n return found?.mrz_type || null;\n }\n\n const getCorrespondingAuthMethod = (\n templatePath: string,\n mapping: any,\n selectedDocumentType: string = \"root\",\n side: 'front' | 'back'\n ) => {\n if (!mapping || !mapping[selectedDocumentType]) return null;\n const fileName = templatePath.split(\"/\").pop()?.replace(\".jpg\", \"\").replace(\".png\", \"\");\n if (!fileName) return null;\n const pyName = `${fileName}.py`;\n const found = mapping[selectedDocumentType].find((item: any) => item.py_file === pyName);\n return found?.[side] || null;\n }\n\n const handleSilentCapture = async (result: { success: boolean; path?: string; error?: string }) => {\n if (silentCaptureResult.isAnalyzing) {\n return;\n }\n if (result.success && result.path) {\n setSilentCaptureResult((prev) => ({ ...prev, isAnalyzing: true, success: false, error: '' }));\n let templatePath = silentCaptureResult.templatePath || '';\n let templateBbox: IBbox | undefined;\n let templateResponse: any;\n\n if (!selectedDocumentType) {\n setSilentCaptureResult((prev) => ({ ...prev, isAnalyzing: false, success: false, error: 'Document type not selected' }));\n return;\n }\n\n const regionMappings = getCurrentSideVerification(currentSide)\n // logger.log(\"regionMappings\", JSON.stringify(truncateFields({regionMappings, templatePath}), null, 2));\n if (templatePath.length === 0) {\n try {\n logger.log(\"checkTemplateType - BEFORE call\", {\n selectedDocumentTypeType: selectedDocumentType?.type,\n countrySelectionDataDocumentType: countrySelectionData?.documentType,\n docTypeToSend: selectedDocumentType?.type\n });\n const templateType = await checkTemplateType({ path: result.path || '', docType: selectedDocumentType?.type as GovernmentDocumentType, docRegion: countryData?.code || \"\", postfix: currentSide }, env);\n templateResponse = templateType;\n\n if (templateType.template_path) {\n templatePath = templateType.template_path;\n logger.log(\"templatePath\", templatePath);\n setSilentCaptureResult((prev) => ({ ...prev, templatePath: templatePath }));\n }\n if (templateType.card_obb) {\n const obbConfidence = getObbConfidence((templateType as any).card_obb);\n if (obbConfidence !== null && obbConfidence < OBB_CONFIDENCE_THRESHOLD) {\n setSilentCaptureResult((prev) => ({\n ...prev,\n isAnalyzing: false,\n success: false,\n error: t('kyc.idCardCapture.cardNotFullyInFrame'),\n }));\n return;\n }\n let bbox: IBbox | undefined;\n try {\n const crop = await cropByObb(result?.path || '', (templateType as any).card_obb);\n bbox = crop.bbox;\n templateBbox = bbox;\n } catch { }\n }\n } catch (e: any) {\n logger.log(\"error checking template type\", truncateFields(e));\n setSilentCaptureResult((prev) => ({ ...prev, isAnalyzing: false, success: false, error: e?.message || 'Erreur de vérification du template' }));\n return; // Return early if checkTemplateType fails\n }\n }\n logger.log(\"templatePath before verification\", templatePath, \"currentSide\", currentSide);\n if (currentSide === 'front') {\n logger.log(\"frontVerification - BEFORE call\", {\n selectedDocumentTypeType: selectedDocumentType?.type,\n countrySelectionDataDocumentType: countrySelectionData?.documentType,\n docTypeToSend: selectedDocumentType?.type\n });\n logger.log(\"Calling frontVerification\", { templatePath, selectedDocumentType: selectedDocumentType?.type, regionMappings });\n console.log(\"About to call frontVerification\", typeof frontVerification);\n try {\n const matchedAuthMethod = getCorrespondingAuthMethod(templatePath, regionMappings.regionMapping, regionMappings.key || '', 'front');\n const resolvedMrzType = getCorrespondingMrzType(templatePath, regionMappings.regionMapping, regionMappings.key || '');\n const mrzType = resolvedMrzType || '';\n const authMethod = matchedAuthMethod\n ? regionMappings.authMethod.filter((method) => method === matchedAuthMethod)\n : regionMappings.authMethod.filter((method) => method !== 'MRZ' && method !== '2D_barcode');\n console.log(\"mrzType calculated\", mrzType);\n const verificationParams = {\n path: result.path,\n regionMapping: {\n authMethod,\n mrzTypes: regionMappings.mrzTypes,\n },\n selectedDocumentType: GovernmentDocumentTypeShorted[selectedDocumentType?.type as keyof typeof GovernmentDocumentTypeShorted] || '',\n code: countryData?.code || '',\n currentSide: currentSide,\n templatePath: templatePath,\n mrzType: mrzType,\n };\n console.log(\"frontVerification params\", verificationParams);\n console.log(\"About to call frontVerification function\");\n\n const promise = frontVerification(verificationParams, env);\n console.log(\"frontVerification promise created\", promise);\n \n promise.then((res: any) => {\n logger.log(\"front verification result\", truncateFields(res));\n const bbox = res?.bbox || templateBbox;\n \n setSilentCaptureResult((prev) => ({\n ...prev,\n path: result.path,\n templatePath: templatePath,\n bbox: bbox, \n success: true,\n mrz: res?.mrz ? JSON.stringify(res.mrz) : \"\", \n isAnalyzing: false,\n country: countryData?.code,\n documentType: selectedDocumentType.type,\n }));\n \n // Stocker le bbox pour ce côté\n if (bbox && typeof bbox === 'object') {\n setBboxBySide((prev) => ({ ...prev, [currentSide]: bbox }));\n }\n\n }).catch((e: any) => {\n\n }).catch((e: any) => {\n console.log(\"error front verification\", e);\n logger.log(\"error front verification\", truncateFields(e));\n const isCardNotFullyInFrame =\n e?.message === 'CARD_NOT_FULLY_IN_FRAME' ||\n e?.message?.includes('entirement') ||\n e?.message?.includes('fully in frame');\n const errorMessage = isCardNotFullyInFrame\n ? t('kyc.idCardCapture.cardNotFullyInFrame')\n : (e?.message || 'Erreur de détection du MRZ');\n setSilentCaptureResult((prev) => ({ ...prev, isAnalyzing: false, templatePath: templatePath, success: false, error: errorMessage }));\n });\n } catch (error: any) {\n console.log(\"Error setting up frontVerification call\", error);\n setSilentCaptureResult((prev) => ({ ...prev, isAnalyzing: false, success: false, error: error?.message || 'Erreur lors de la configuration de la vérification' }));\n }\n } else {\n const backRegionMappings = getCurrentSideVerification(currentSide);\n logger.log(\"Calling backVerification\", { templatePath, selectedDocumentType: selectedDocumentType.type, backRegionMappings });\n const matchedBackAuthMethod = getCorrespondingAuthMethod(templatePath, backRegionMappings.regionMapping, backRegionMappings.key || '', 'back');\n const backMrzType = getCorrespondingMrzType(templatePath, backRegionMappings.regionMapping, backRegionMappings.key || '') || '';\n \n backVerification({\n path: result.path,\n regionMapping: {\n authMethod: matchedBackAuthMethod\n ? backRegionMappings.authMethod.filter((method) => method === matchedBackAuthMethod)\n : backRegionMappings.authMethod.filter((method) => method !== 'MRZ' && method !== '2D_barcode'),\n mrzTypes: backRegionMappings.mrzTypes,\n },\n selectedDocumentType: GovernmentDocumentTypeShorted[selectedDocumentType.type as keyof typeof GovernmentDocumentTypeShorted] || '',\n code: countryData?.code || '',\n currentSide: currentSide,\n templatePath: templatePath,\n mrzType: backMrzType,\n templateResponse,\n }, env).then((res: any) => { \n logger.log(\"back verification result\", truncateFields(res));\n const bbox = res?.bbox || templateBbox;\n \n setSilentCaptureResult((prev) => ({\n ...prev, \n path: result.path, \n bbox: bbox,\n success: true, \n mrz: res?.mrz ? JSON.stringify(res.mrz) : \"\", \n isAnalyzing: false,\n country: countryData?.code,\n documentType: selectedDocumentType.type,\n }));\n \n // Stocker le bbox pour ce côté\n if (bbox && typeof bbox === 'object') {\n setBboxBySide((prev) => ({ ...prev, [currentSide]: bbox }));\n }\n }).catch((e: any) => {\n logger.log(\"error back verification\", truncateFields(e));\n const isCardNotFullyInFrame =\n e?.message === 'CARD_NOT_FULLY_IN_FRAME' ||\n e?.message?.includes('entirement') ||\n e?.message?.includes('fully in frame');\n const errorMessage = isCardNotFullyInFrame\n ? t('kyc.idCardCapture.cardNotFullyInFrame')\n : (e?.message || 'Erreur de détection du MRZ');\n setSilentCaptureResult((prev) => ({ ...prev, isAnalyzing: false, templatePath: templatePath, success: false, error: errorMessage }));\n });\n }\n\n }\n }\n\n const handleCapture = async (result: { success: boolean; path?: string; error?: string }) => {\n if (silentCaptureResult.path) {\n let imagePathForUpload = silentCaptureResult.path;\n if (silentCaptureResult.bbox) {\n try {\n imagePathForUpload = await cropImageWithBBoxWithTolerance(silentCaptureResult.path, silentCaptureResult.bbox, 0.05);\n } catch (error) {\n imagePathForUpload = silentCaptureResult.path;\n }\n }\n\n const base64 = await pathToBase64(imagePathForUpload);\n\n // ✅ FIX: Use 'imagePathForUpload' (the cropped image) for the local display directory!\n const newImages = { \n ...capturedImages, \n [currentSide]: { \n dir: imagePathForUpload, // <--- CHANGED THIS LINE\n file: base64, \n mrz: silentCaptureResult.mrz || \"\", \n templatePath: silentCaptureResult.templatePath \n } \n };\n \n setCapturedImages(newImages);\n \n if (silentCaptureResult.country && silentCaptureResult.documentType) {\n onValueChange({\n ...newImages,\n country: silentCaptureResult.country,\n documentType: GovernmentDocumentTypeBackend[silentCaptureResult.documentType as keyof typeof GovernmentDocumentTypeBackend] || '',\n });\n }\n setShowCamera(false);\n actions.showCustomStepper(true);\n } else {\n showAlert('Erreur', result.error || 'Impossible de prendre la photo');\n }\n };\n\n const handleError = (event: { message: string }) => {\n showAlert('Erreur', event.message);\n setShowCamera(false);\n };\n\n useEffect(() => {\n actions.showCustomStepper(!showCamera);\n }, [showCamera]);\n\n // Cross-device polling logic\n useEffect(() => {\n if (!showQRModal || !state.session.session_id) return;\n\n const pollInterval = setInterval(async () => {\n try {\n const result = await kycService.getVerificationResult(state.session.session_id);\n const sessionData = result[state.session.session_id]?.data;\n\n if (sessionData) {\n // Check if verification is completed or if we have ID card data\n // Since the requirement is \"verification restarts\", we might look for overall completion\n // or we could check if user_data is populated.\n // For now, let's assume if status is not PENDING/INITIALIZED it might be done.\n // Or simplier: if the mobile flow completes, the session status updates.\n logger.log('Polling result:', truncateFields(sessionData));\n\n if (sessionData.verification_status === 'completed' || sessionData.verification_status === 'approved' || sessionData.verification_status === 'review') {\n clearInterval(pollInterval);\n setShowQRModal(false);\n actions.submitVerification(); // Or handleComplete\n }\n }\n } catch (error) {\n console.error('Polling error:', error);\n }\n }, 5000);\n\n return () => clearInterval(pollInterval);\n }, [showQRModal, state.session.session_id, actions]);\n\n const getQrCodeUrl = (): string => {\n // Only available on web platform\n if (Platform.OS !== 'web') return '';\n if (typeof window === 'undefined' || !window.location || !window.location.href) return '';\n \n try {\n const currentUrl = new URL(window.location.href);\n if (!currentUrl.searchParams.has('kyc_id') && state.session.session_id) {\n currentUrl.searchParams.set('kyc_id', state.session.session_id);\n }\n currentUrl.searchParams.set('component_index', String(state.currentComponentIndex));\n if (countrySelectionData?.code) {\n currentUrl.searchParams.set('country', countrySelectionData.code);\n if (countrySelectionData.documentType) currentUrl.searchParams.set('document_type', countrySelectionData.documentType);\n if (countrySelectionData.region) currentUrl.searchParams.set('region', countrySelectionData.region);\n }\n return `https://api.qrserver.com/v1/create-qr-code/?size=250x250&data=${encodeURIComponent(currentUrl.toString())}`;\n } catch (error) {\n console.warn('Error generating QR code URL:', error);\n return '';\n }\n };\n\n\n\n\n\n\n\n // En reprise sur un autre appareil: afficher un chargement tant que les données de session ne sont pas restaurées\n const isResumingSession = Boolean(state.session.session_id && state.currentComponentIndex > 0);\n const sessionDataRestored = state.session.sessionDataRestored !== false;\n if (isResumingSession && !sessionDataRestored && (!countrySelectionData || !selectedDocumentType)) {\n return (\n <View style={styles.root}>\n <View style={[styles.container, { justifyContent: 'center', alignItems: 'center' }]}>\n <ActivityIndicator size=\"large\" color=\"#2DBD60\" />\n <Text style={[styles.description, { marginTop: 16 }]}>\n {state.currentLanguage === 'en' ? 'Loading your session...' : 'Chargement de votre session...'}\n </Text>\n </View>\n </View>\n );\n }\n\n // Vérifier si les données sont disponibles, sinon afficher un message d'erreur\n if (!countrySelectionData || !selectedDocumentType) {\n return (\n <View style={styles.root}>\n <View style={styles.container}>\n <Text style={styles.title}>{getLocalizedText(component.labels)}</Text>\n <Text style={styles.description}>\n {state.currentLanguage === \"en\"\n ? \"Please complete the country and document selection first.\"\n : \"Veuillez d'abord compléter la sélection du pays et du document.\"}\n </Text>\n {error && (\n <Text style={styles.errorText}>{error}</Text>\n )}\n </View>\n </View>\n );\n }\n\n\n\n if (showCamera) {\n return (\n <View style={styles.cameraContainer}>\n <EnhancedCameraView\n showCamera={true}\n cameraType={cameraConfig.cameraType}\n style={styles.camera}\n onCapture={handleCapture}\n onError={handleError}\n onClose={() => setShowCamera(false)}\n quality=\"high\"\n showCaptureButton={true}\n showSwitchCamera={true}\n onSilentCapture={handleSilentCapture}\n silentCaptureResult={silentCaptureResult}\n captureStabilizationDelayMs={3000}\n enableFlash={cameraConfig.flashMode === 'auto' || cameraConfig.flashMode === 'on'}\n overlayComponent={\n <IdCardOverlay\n xMin={cameraConfig.overlay.bbox.xMin}\n yMin={cameraConfig.overlay.bbox.yMin}\n xMax={cameraConfig.overlay.bbox.xMax}\n yMax={cameraConfig.overlay.bbox.yMax}\n instructions={cameraConfig.overlay.guideText}\n cornerOpacity={cameraConfig.overlay.bbox.cornerRadius || 0 as number}\n isSuccess={silentCaptureResult.success}\n language={state.currentLanguage}\n stepperProps={{\n back: () => {\n if (currentSide === 'back') {\n setCurrentSide('front');\n setShowCamera(false);\n // Si une image front existe, on la restaure pour l'afficher\n if (capturedImages['front']?.dir) {\n // Restaurer l'état de capture du front pour afficher l'image\n const frontImage = capturedImages['front'];\n const frontBbox = bboxBySide['front'];\n setSilentCaptureResult((prev) => ({\n path: frontImage.dir,\n success: true,\n isAnalyzing: false,\n error: '',\n mrz: frontImage.mrz || '',\n templatePath: frontImage.templatePath || '',\n country: silentCaptureResult.country,\n documentType: silentCaptureResult.documentType,\n bbox: frontBbox // Restaurer le bbox pour recalculer le cropImageUri\n }));\n } else {\n // Pas d'image front, on réinitialise\n setSilentCaptureResult((prev) => ({ path: '', success: false, isAnalyzing: false, error: '', templatePath: '' }));\n }\n } else {\n // Retour au composant précédent (country_selection)\n actions.previousComponent();\n }\n },\n selectedDocumentType: selectedDocumentType ? (locale === 'en' ? getDocumentTypeInfo(selectedDocumentType.type).name.en : getDocumentTypeInfo(selectedDocumentType.type).name.fr) : '',\n step: state.currentComponentIndex + 1,\n totalSteps: state.template.components.length,\n side: currentSide,\n }}\n />\n }\n />\n \n {silentCaptureResult.error ? (\n <View style={styles.floatingErrorBanner}>\n <Text style={styles.floatingErrorText}>\n {silentCaptureResult.error}\n </Text>\n </View>\n ) : null}\n\n </View>\n );\n }\n\n\n return (\n <View style={styles.root}>\n <View style={styles.previewContainer}>\n <ScrollView style={styles.previewItemContainer} showsVerticalScrollIndicator={false}>\n <View key={currentSide} style={styles.sideContainer}>\n <Text style={styles.sideTitle}>\n {t('kyc.idCardCapture.captureTitle', { side: currentSide === 'front' ? locale === 'en' ? 'Front' : 'Recto' : locale === 'en' ? 'Back' : 'Verso' })}\n </Text>\n <Text style={{ fontSize: 14, color: '#666', textAlign: 'center', marginBottom: 16, lineHeight: 22 }}>\n {getLocalizedText(component.instructions)}\n </Text>\n\n <View style={{ alignItems: 'center', justifyContent: 'center', flexDirection: \"column\", gap: 16 }}>\n {silentCaptureResult?.error === 'TOO_FAR_AWAY' && (\n <View style={{ \n backgroundColor: '#FF9500', \n padding: 12, \n borderRadius: 8, \n width: '100%',\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.2,\n shadowRadius: 4,\n elevation: 4\n }}>\n <Text style={{ color: 'white', fontWeight: 'bold', textAlign: 'center', fontSize: 16 }}>\n {state.currentLanguage === \"en\" \n ? \"Move the document closer to the camera.\" \n : \"Veuillez rapprocher le document de la caméra.\"}\n </Text>\n </View>\n )}\n\n <View\n style={{\n width: '100%',\n height: 200,\n borderRadius: 12,\n padding: 1,\n overflow: 'hidden',\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 4 },\n shadowOpacity: 0.18,\n shadowRadius: 8,\n elevation: 8,\n backgroundColor: '#000', \n }}\n >\n {capturedImages[currentSide]?.dir ? (\n <Image\n source={{ uri: capturedImages[currentSide].dir }}\n style={{\n width: '100%',\n height: '100%', \n borderRadius: 12,\n resizeMode: 'contain', \n }}\n />\n ) : silentCaptureResult.path ? (\n <Image\n source={{ uri: silentCaptureResult.path }}\n style={{\n width: '100%',\n height: '100%',\n borderRadius: 12,\n resizeMode: 'contain', \n }}\n />\n ) : null}\n </View>\n {/* Capture button si aucune image n'a été capturée */}\n {!capturedImages[currentSide]?.dir && (\n <Button\n title={state.currentLanguage === \"en\" ? \"Take Photo\" : \"Prendre une photo\"}\n onPress={() => {\n setShowCamera(true);\n actions.showCustomStepper(false);\n }}\n variant=\"primary\"\n size=\"large\"\n fullWidth\n />\n )}\n {/* retake button si une image a été capturée */}\n {capturedImages[currentSide]?.dir && (\n <>\n <Button title={t('kyc.idCardCapture.retakeButton')} onPress={() => {\n retakePicture(currentSide);\n }}\n variant=\"outline\"\n size=\"medium\"\n fullWidth\n />\n <Button title={t('common.next')} onPress={() => {\n if (!selectedDocumentType) {\n showAlert('Error', 'Document type not selected');\n return;\n }\n if (currentSide === 'back' || selectedDocumentType.type === 'passport') {\n actions.nextComponent();\n return;\n } else {\n setShowCamera(true);\n setCurrentSide('back');\n setSilentCaptureResult((prev) => ({ path: '', success: false, isAnalyzing: false, error: '', mrz: '', templatePath: '' }));\n // setCropImageUri('');\n }\n }}\n variant=\"primary\"\n size=\"large\"\n fullWidth\n />\n </>\n )}\n </View>\n </View>\n </ScrollView>\n\n\n\n {error && (\n <Text style={styles.errorText}>{error}</Text>\n )}\n\n {/* Cross-Device / Continue on Phone Button (Web Only) */}\n {Platform.OS === 'web' && !isMobileWeb() && !capturedImages[currentSide]?.dir && (\n <Button title={t('kyc.idCardCapture.continueOnPhone')} onPress={() => { setShowQRModal(true) }} />\n )}\n\n {/* QR Code Modal - Web Only */}\n {Platform.OS === 'web' && (\n <Modal\n visible={showQRModal}\n transparent={true}\n animationType=\"fade\"\n onRequestClose={() => setShowQRModal(false)}\n >\n <View style={styles.modalOverlay}>\n <View style={styles.modalContent}>\n <Text style={styles.modalTitle}>\n {t('kyc.idCardCapture.continueOnMobile')}\n </Text>\n <Text style={styles.modalDescription}>\n {t('kyc.idCardCapture.scanQrCode')}\n </Text>\n\n {showQRModal && getQrCodeUrl() ? (\n <Image\n source={{ uri: getQrCodeUrl() }}\n style={styles.qrCodeImage}\n />\n ) : null}\n\n <TouchableOpacity\n style={styles.closeButton}\n onPress={() => setShowQRModal(false)}\n >\n <Text style={styles.closeButtonText}>\n {t('common.close')}\n </Text>\n </TouchableOpacity>\n </View>\n </View>\n </Modal>\n )}\n\n </View>\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n root: {\n flex: 1,\n maxWidth: 760,\n width: '100%',\n },\n container: {\n backgroundColor: 'white',\n margin: 10,\n borderRadius: 10,\n paddingVertical: 16,\n paddingHorizontal: 16,\n // shadow\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.35,\n shadowRadius: 4.84,\n elevation: 10,\n // padding: 16,\n },\n cameraContainer: {\n flex: 1,\n width: '100%',\n height: '100%',\n },\n previewContainer: {\n width: '95%',\n backgroundColor: 'white',\n margin: 10,\n borderRadius: 10,\n paddingVertical: 16,\n paddingHorizontal: 16,\n },\n previewItemContainer: {\n\n // marginBottom: 24,\n },\n title: {\n fontSize: 24,\n fontWeight: 'bold',\n color: '#333',\n marginBottom: 8,\n textAlign: 'center',\n },\n subtitle: {\n fontSize: 18,\n color: '#666',\n textAlign: 'center',\n marginBottom: 16,\n },\n sideInfo: {\n fontSize: 14,\n color: '#888',\n textAlign: 'center',\n marginBottom: 16,\n fontStyle: 'italic',\n },\n description: {\n fontSize: 16,\n color: '#666',\n textAlign: 'center',\n marginBottom: 24,\n lineHeight: 22,\n },\n sidesContainer: {\n flex: 1,\n },\n sideContainer: {\n marginBottom: 24,\n },\n sideTitle: {\n fontSize: 25,\n fontWeight: 'bold',\n color: '#000',\n marginBottom: 12,\n textAlign: 'center',\n },\n captureButton: {\n borderWidth: 2,\n borderColor: '#2DBD60',\n borderStyle: 'dashed',\n borderRadius: 12,\n padding: 32,\n alignItems: 'center',\n backgroundColor: '#f0f9f0',\n },\n captureIcon: {\n fontSize: 48,\n marginBottom: 16,\n },\n captureText: {\n fontSize: 16,\n color: '#2DBD60',\n fontWeight: '600',\n },\n capturedImageContainer: {\n position: 'relative',\n },\n capturedImage: {\n width: '100%',\n height: 200,\n borderRadius: 12,\n resizeMode: 'contain',\n backgroundColor: '#f0f0f0',\n },\n retakeButton: {\n position: 'absolute',\n top: 8,\n right: 8,\n backgroundColor: 'rgba(0, 0, 0, 0.7)',\n paddingHorizontal: 12,\n paddingVertical: 6,\n borderRadius: 6,\n },\n retakeButtonText: {\n color: 'white',\n fontSize: 12,\n fontWeight: '600',\n },\n camera: {\n flex: 1,\n },\n completionContainer: {\n marginTop: 24,\n alignItems: 'center',\n },\n completionText: {\n fontSize: 16,\n color: '#2DBD60',\n fontWeight: '600',\n marginBottom: 16,\n },\n primaryButton: {\n paddingHorizontal: 32,\n paddingVertical: 16,\n borderRadius: 8,\n // minWidth: 120,\n alignItems: 'center',\n backgroundColor: '#2DBD60',\n },\n primaryButtonText: {\n color: 'white',\n fontWeight: '600',\n fontSize: 16,\n },\n errorText: {\n color: '#dc2626',\n fontSize: 14,\n marginTop: 8,\n textAlign: 'center',\n },\n crossDeviceButton: {\n marginTop: 16,\n padding: 12,\n alignItems: 'center',\n borderWidth: 1,\n borderColor: '#2DBD60',\n borderRadius: 8,\n backgroundColor: '#f0f9f0',\n },\n crossDeviceText: {\n color: '#2DBD60',\n fontSize: 16,\n fontWeight: '600',\n },\n modalOverlay: {\n flex: 1,\n backgroundColor: 'rgba(0,0,0,0.5)',\n justifyContent: 'center',\n alignItems: 'center',\n },\n modalContent: {\n backgroundColor: 'white',\n borderRadius: 16,\n padding: 24,\n alignItems: 'center',\n width: '90%',\n maxWidth: 340,\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.25,\n shadowRadius: 4,\n elevation: 5,\n },\n modalTitle: {\n fontSize: 20,\n fontWeight: 'bold',\n marginBottom: 12,\n color: '#333',\n },\n modalDescription: {\n fontSize: 16,\n color: '#666',\n textAlign: 'center',\n marginBottom: 20,\n lineHeight: 22,\n },\n qrCodeImage: {\n width: 200,\n height: 200,\n marginBottom: 20,\n },\n closeButton: {\n paddingVertical: 10,\n paddingHorizontal: 20,\n backgroundColor: '#f5f5f5',\n borderRadius: 8,\n },\n closeButtonText: {\n fontSize: 16,\n color: '#666',\n fontWeight: '600',\n },\n floatingErrorBanner: {\n position: 'absolute',\n top: 60, // Pushes it down slightly from the very top of the screen\n left: '10%',\n right: '10%',\n backgroundColor: 'rgba(220, 38, 38, 0.95)', // Bright red\n paddingVertical: 12,\n paddingHorizontal: 16,\n borderRadius: 8,\n alignItems: 'center',\n justifyContent: 'center',\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 4 },\n shadowOpacity: 0.3,\n shadowRadius: 5,\n elevation: 8,\n zIndex: 100,\n },\n floatingErrorText: {\n color: 'white',\n fontSize: 14,\n fontWeight: '700',\n textAlign: 'center',\n },\n}); "]}
@@ -6,6 +6,15 @@ interface CardObbData {
6
6
  card_in_frame?: boolean;
7
7
  cropped_sides?: string[];
8
8
  }
9
+ interface ApiVerificationResponse {
10
+ result?: boolean;
11
+ success?: boolean;
12
+ detail?: any[];
13
+ card_obb?: CardObbData[] | any;
14
+ template_path?: string;
15
+ Error?: any;
16
+ [key: string]: any;
17
+ }
9
18
  export declare function frontVerification(result: {
10
19
  path?: string;
11
20
  regionMapping: {
@@ -42,8 +51,11 @@ export declare function frontVerification(result: {
42
51
  croppedBase64: string | undefined;
43
52
  bbox: IBbox | undefined;
44
53
  result?: boolean;
54
+ success?: boolean;
45
55
  detail?: any[];
46
56
  card_obb?: CardObbData[] | any;
57
+ template_path?: string;
58
+ Error?: any;
47
59
  }>;
48
60
  export declare function backVerification(result: {
49
61
  path?: string;
@@ -56,6 +68,7 @@ export declare function backVerification(result: {
56
68
  currentSide: string;
57
69
  templatePath?: string;
58
70
  mrzType?: string;
71
+ templateResponse?: ApiVerificationResponse;
59
72
  }, env?: KycEnvironment): Promise<any>;
60
73
  /**
61
74
  * Check template type
@@ -1 +1 @@
1
- {"version":3,"file":"CardAuthentification.d.ts","sourceRoot":"","sources":["../../../../src/modules/api/CardAuthentification.ts"],"names":[],"mappings":"AAEA,OAAO,EAA0B,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAKvD,UAAU,WAAW;IACjB,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AASD,wBAAsB,iBAAiB,CACnC,MAAM,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE;QAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAAC,oBAAoB,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,EAChM,GAAG,GAAE,cAA6B;;;;;;;;;;;;;;;;;;;;;;;;aARzB,OAAO;aACP,GAAG,EAAE;eACH,WAAW,EAAE,GAAG,GAAG;GA8IjC;AA0HD,wBAAsB,gBAAgB,CAClC,MAAM,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE;QAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAAC,oBAAoB,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,EAChM,GAAG,GAAE,cAA6B,gBAoNrC;AAGD;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,GAAE,cAA6B,gBAoFzJ"}
1
+ {"version":3,"file":"CardAuthentification.d.ts","sourceRoot":"","sources":["../../../../src/modules/api/CardAuthentification.ts"],"names":[],"mappings":"AAEA,OAAO,EAA0B,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAKvD,UAAU,WAAW;IACjB,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,UAAU,uBAAuB;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,QAAQ,CAAC,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB;AAED,wBAAsB,iBAAiB,CACnC,MAAM,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE;QAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAAC,oBAAoB,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,EAChM,GAAG,GAAE,cAA6B;;;;;;;;;;;;;;;;;;;;;;;;aAXzB,OAAO;cACN,OAAO;aACR,GAAG,EAAE;eACH,WAAW,EAAE,GAAG,GAAG;oBACd,MAAM;YACd,GAAG;GAkJd;AAGD,wBAAsB,gBAAgB,CAClC,MAAM,EAAE;IACJ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,EAAE;QAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC5D,oBAAoB,EAAE,MAAM,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,uBAAuB,CAAA;CAC7C,EACD,GAAG,GAAE,cAA6B,gBAoNrC;AAGD;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,GAAE,cAA6B,gBAoFzJ"}
@@ -88,8 +88,11 @@ export async function frontVerification(result, env = 'PRODUCTION') {
88
88
  bbox = crop.bbox;
89
89
  }
90
90
  catch { }
91
- // MRZ Extraction
92
- if (result.regionMapping?.authMethod?.length > 0 && result.regionMapping.authMethod.includes('MRZ')) {
91
+ // MRZ Extraction: only run when a concrete mrzType is available
92
+ const shouldRunMrzExtraction = result.regionMapping?.authMethod?.length > 0 &&
93
+ result.regionMapping.authMethod.includes('MRZ') &&
94
+ !!result?.mrzType;
95
+ if (shouldRunMrzExtraction) {
93
96
  const mrzResponse = await kycService.extractMrzText({
94
97
  fileUri: result.path || '',
95
98
  docType: result?.selectedDocumentType || '',
@@ -114,110 +117,6 @@ export async function frontVerification(result, env = 'PRODUCTION') {
114
117
  throw new Error(e?.message || 'Erreur de détection du visage');
115
118
  }
116
119
  }
117
- // export async function frontVerification(
118
- // result: { path?: string, regionMapping: { authMethod: string[], mrzTypes: string[] }, selectedDocumentType: string, code: string, currentSide: string, templatePath?: string, mrzType?: string },
119
- // env: KycEnvironment = 'PRODUCTION'
120
- // ) {
121
- // try {
122
- // console.log("Front verification START", JSON.stringify({ result }, null, 2));
123
- // logger.log("Front verification", JSON.stringify({ result }, null, 2));
124
- // // SANDBOX mode
125
- // if (env === 'SANDBOX') {
126
- // console.log("SANDBOX mode: Skipping AI verification for front document");
127
- // logger.log("SANDBOX mode: Returning mock front verification response");
128
- // const mockBbox: IBbox = { minX: 400, minY: 800, width: 2200, height: 1400 };
129
- // // ==========================================
130
- // // 🧪 TEST OVERRIDE (SANDBOX) 🧪
131
- // // Immediately throw the error to test the UI
132
- // // ==========================================
133
- // throw new Error('CARD_NOT_FULLY_IN_FRAME');
134
- // const mockResponse = {
135
- // result: true,
136
- // detail: [{ confidence: 0.95 }],
137
- // card_obb: [{
138
- // obb: [[400,800], [2600,800], [2600,2200], [400,2200]],
139
- // confidence: 0.95,
140
- // card_in_frame: false, // Hardcoded to false
141
- // cropped_sides: ['left', 'top'] // Hardcoded cropped sides
142
- // }],
143
- // bbox: mockBbox,
144
- // ...(result.regionMapping?.authMethod?.includes('MRZ') ? {
145
- // mrz: {
146
- // success: true,
147
- // parsed_data: {
148
- // status: 'success',
149
- // document_type: result.selectedDocumentType,
150
- // mrz_type: result.mrzType || 'TD1'
151
- // }
152
- // }
153
- // } : {})
154
- // };
155
- // return mockResponse;
156
- // }
157
- // const token = await authentification();
158
- // // Cast the response so TypeScript knows about card_obb
159
- // const detected = await kycService.detectFaceOnId(result?.path || '', token, result?.selectedDocumentType || '', env) as ApiVerificationResponse;
160
- // // ==========================================
161
- // // 🧪 TEST OVERRIDE (PRODUCTION) 🧪
162
- // // Hijack the real API response and force it to look cropped
163
- // // ==========================================
164
- // if (detected.card_obb && Array.isArray(detected.card_obb) && detected.card_obb.length > 0) {
165
- // detected.card_obb[0].card_in_frame = false;
166
- // detected.card_obb[0].cropped_sides = ['left', 'top'];
167
- // console.warn("⚠️ FORCING CROPPED ERROR FOR UI TESTING ⚠️");
168
- // }
169
- // // ==========================================
170
- // if (!detected.result) {
171
- // throw new Error('Aucun visage détecté sur la carte. Veuillez reprendre.');
172
- // }
173
- // const cardData = detected.card_obb && Array.isArray(detected.card_obb) && detected.card_obb.length > 0
174
- // ? detected.card_obb[0]
175
- // : null;
176
- // // --- STRICT FRAMING CHECK ---
177
- // if (cardData && typeof cardData.card_in_frame !== 'undefined') {
178
- // const isCardInFrame = cardData.card_in_frame === true;
179
- // const hasCroppedSides = Array.isArray(cardData.cropped_sides) && cardData.cropped_sides.length > 0;
180
- // // If it is NOT in the frame, OR if any side is cropped, block progression
181
- // if (!isCardInFrame || hasCroppedSides) {
182
- // logger.log(`Framing failed. Cropped sides: ${hasCroppedSides ? cardData.cropped_sides?.join(', ') : 'none'}`);
183
- // throw new Error('CARD_NOT_FULLY_IN_FRAME');
184
- // }
185
- // }
186
- // // Check Confidence Threshold
187
- // const obbConfidence = getObbConfidence(detected.card_obb);
188
- // if (obbConfidence !== null && obbConfidence < OBB_CONFIDENCE_THRESHOLD) {
189
- // throw new Error('Carte non entièrement visible. Positionnez toute la carte dans le cadre.');
190
- // }
191
- // // Optional: crop image using card_obb for better MRZ/barcode extraction
192
- // let croppedBase64: string | undefined;
193
- // let bbox: IBbox | undefined;
194
- // let mrz: any | undefined;
195
- // try {
196
- // const crop = await cropByObb(result?.path || '', detected.card_obb);
197
- // croppedBase64 = crop.base64;
198
- // bbox = crop.bbox;
199
- // } catch { }
200
- // // MRZ Extraction
201
- // if (result.regionMapping?.authMethod?.length > 0 && result.regionMapping.authMethod.includes('MRZ')) {
202
- // mrz = await kycService.extractMrzText(
203
- // {
204
- // fileUri: result.path || '',
205
- // docType: result?.selectedDocumentType || '',
206
- // docRegion: result?.code || "",
207
- // postfix: result?.currentSide,
208
- // token: token,
209
- // template_path: result?.templatePath || '',
210
- // mrz_type: result?.mrzType || ''
211
- // },
212
- // env
213
- // );
214
- // }
215
- // return { ...detected, croppedBase64, bbox, ...(mrz ? { mrz } : {}) };
216
- // } catch (e: any) {
217
- // logger.error('Error front verification:', JSON.stringify(errorMessage(e), null, 2));
218
- // throw new Error(e?.message || 'Erreur de détection du visage');
219
- // }
220
- // }
221
120
  export async function backVerification(result, env = 'PRODUCTION') {
222
121
  try {
223
122
  if (!result.path)
@@ -259,7 +158,7 @@ export async function backVerification(result, env = 'PRODUCTION') {
259
158
  }
260
159
  const token = await authentification();
261
160
  logger.log("1. Checking template and framing for back document...");
262
- const templateResponse = await kycService.checkTemplateType({
161
+ const templateResponse = result.templateResponse || await kycService.checkTemplateType({
263
162
  fileUri: result.path,
264
163
  docType: result.selectedDocumentType,
265
164
  docRegion: result.code,
@@ -334,7 +233,7 @@ export async function backVerification(result, env = 'PRODUCTION') {
334
233
  }
335
234
  }
336
235
  logger.log("Framing and Country Template verified successfully. Proceeding to Data Extraction.");
337
- const hasMrz = result.regionMapping?.authMethod?.includes('MRZ') || !result.regionMapping?.authMethod?.length;
236
+ const hasMrz = result.regionMapping?.authMethod?.includes('MRZ') && result?.mrzType;
338
237
  const hasBarcode = result.regionMapping?.authMethod?.includes('2D_barcode');
339
238
  let extractionResult = {};
340
239
  // --- 4. Try MRZ First (If required or default) ---
@@ -1 +1 @@
1
- {"version":3,"file":"CardAuthentification.js","sourceRoot":"","sources":["../../../../src/modules/api/CardAuthentification.ts"],"names":[],"mappings":"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","sourcesContent":["import kycService, { authentification, errorMessage, truncateFields } from \"./KYCService\";\nimport { cropByObb, getObbConfidence, OBB_CONFIDENCE_THRESHOLD } from \"../../utils/cropByObb\";\nimport { GovernmentDocumentType, IBbox } from \"../../types/KYC.types\";\nimport { KycEnvironment } from \"../../types/env.types\";\nimport { logger } from \"../../utils/logger\";\nimport { countryData } from \"../../config/countriesData\";\n\n// 1. Add this interface to tell TypeScript what the AI response actually looks like\ninterface CardObbData {\n obb: number[][];\n confidence: number;\n card_in_frame?: boolean;\n cropped_sides?: string[];\n}\n\ninterface ApiVerificationResponse {\n result?: boolean;\n detail?: any[];\n card_obb?: CardObbData[] | any; \n [key: string]: any; \n}\n\nexport async function frontVerification(\n result: { path?: string, regionMapping: { authMethod: string[], mrzTypes: string[] }, selectedDocumentType: string, code: string, currentSide: string, templatePath?: string, mrzType?: string }, \n env: KycEnvironment = 'PRODUCTION'\n) {\n try {\n console.log(\"Front verification START\", JSON.stringify({ result }, null, 2));\n logger.log(\"Front verification\", JSON.stringify({ result }, null, 2));\n \n // SANDBOX mode\n if (env === 'SANDBOX') {\n console.log(\"SANDBOX mode: Skipping AI verification for front document\");\n logger.log(\"SANDBOX mode: Returning mock front verification response\");\n const mockBbox: IBbox = { minX: 400, minY: 800, width: 2200, height: 1400 };\n \n const mockResponse = {\n result: true,\n detail: [{ confidence: 0.95 }],\n card_obb: [{\n obb: [[400,800], [2600,800], [2600,2200], [400,2200]],\n confidence: 0.95,\n card_in_frame: true,\n cropped_sides: []\n }],\n bbox: mockBbox,\n ...(result.regionMapping?.authMethod?.includes('MRZ') ? {\n mrz: {\n success: true,\n parsed_data: {\n status: 'success',\n document_type: result.selectedDocumentType,\n mrz_type: result.mrzType || 'TD1'\n }\n }\n } : {})\n };\n return mockResponse;\n }\n \n const token = await authentification();\n \n // Cast the response so TypeScript knows about card_obb\n const detected = await kycService.detectFaceOnId(result?.path || '', token, result?.selectedDocumentType || '', env) as ApiVerificationResponse;\n\n if (!detected.result) {\n throw new Error('Aucun visage détecté sur la carte. Veuillez reprendre.');\n }\n\n const cardData = detected.card_obb && Array.isArray(detected.card_obb) && detected.card_obb.length > 0 \n ? detected.card_obb[0] \n : null;\n\n let points = null;\n let isCardInFrame = true;\n let hasCroppedSides = false;\n\n // Extract data safely\n if (cardData) {\n points = cardData.obb;\n if (typeof cardData.card_in_frame !== 'undefined') {\n isCardInFrame = cardData.card_in_frame === true;\n hasCroppedSides = Array.isArray(cardData.cropped_sides) && cardData.cropped_sides.length > 0;\n }\n }\n\n // --- 1. STRICT FRAMING CHECK (MUST HAPPEN FIRST) ---\n if (!isCardInFrame || hasCroppedSides) {\n logger.log(`Front Framing failed. Cropped sides detected.`);\n throw new Error('CARD_NOT_FULLY_IN_FRAME');\n }\n\n // --- 2. STRICT DISTANCE CHECK (ONLY RUNS IF FULLY IN FRAME) ---\n if (points && points.length === 4) {\n const getDistance = (p1: number[], p2: number[]) => Math.sqrt(Math.pow(p2[0] - p1[0], 2) + Math.pow(p2[1] - p1[1], 2));\n const longestCardEdge = Math.max(getDistance(points[0], points[1]), getDistance(points[1], points[2]));\n\n const maxX = Math.max(points[0][0], points[1][0], points[2][0], points[3][0]);\n const maxY = Math.max(points[0][1], points[1][1], points[2][1], points[3][1]);\n const estimatedImageScale = Math.max(maxX, maxY);\n\n const fillPercentage = longestCardEdge / estimatedImageScale;\n logger.log(`Front Card Fill Percentage: ${(fillPercentage * 100).toFixed(1)}%`);\n\n if (fillPercentage < 0.50) { \n logger.log(\"🛑 Front Image rejected: Document is too far away.\");\n throw new Error(\"TOO_FAR_AWAY\"); \n }\n }\n\n \n\n \n\n // Check Confidence Threshold\n const obbConfidence = getObbConfidence(detected.card_obb);\n if (obbConfidence !== null && obbConfidence < OBB_CONFIDENCE_THRESHOLD) {\n throw new Error('Carte non entièrement visible. Positionnez toute la carte dans le cadre.');\n }\n\n // Optional: crop image using card_obb for better MRZ/barcode extraction\n let croppedBase64: string | undefined;\n let bbox: IBbox | undefined;\n let mrz: any | undefined;\n try {\n const crop = await cropByObb(result?.path || '', detected.card_obb);\n croppedBase64 = crop.base64;\n bbox = crop.bbox;\n } catch { }\n\n // MRZ Extraction\n if (result.regionMapping?.authMethod?.length > 0 && result.regionMapping.authMethod.includes('MRZ')) {\n const mrzResponse = await kycService.extractMrzText(\n {\n fileUri: result.path || '',\n docType: result?.selectedDocumentType || '',\n docRegion: result?.code || \"\",\n postfix: result?.currentSide,\n token: token,\n template_path: result?.templatePath || '',\n mrz_type: result?.mrzType || ''\n },\n env\n );\n\n // Safety check: parse if it was returned as a raw string\n mrz = typeof mrzResponse === 'string' ? JSON.parse(mrzResponse) : mrzResponse;\n\n if (mrz && (!mrz.success || mrz.parsed_data?.status === 'FAILURE')) {\n logger.log(\"🛑 Front MRZ Extraction Failed:\", mrz.parsed_data?.status_message);\n throw new Error(`MRZ illisible: ${mrz.parsed_data?.status_message || 'Veuillez nettoyer l\\'objectif et réessayer'}`);\n }\n }\n\n return { ...detected, croppedBase64, bbox, ...(mrz ? { mrz } : {}) };\n } catch (e: any) {\n logger.error('Error front verification:', e?.message);\n // Do not use LogBox for background silent errors\n throw new Error(e?.message || 'Erreur de détection du visage');\n }\n}\n\n// export async function frontVerification(\n// result: { path?: string, regionMapping: { authMethod: string[], mrzTypes: string[] }, selectedDocumentType: string, code: string, currentSide: string, templatePath?: string, mrzType?: string }, \n// env: KycEnvironment = 'PRODUCTION'\n// ) {\n// try {\n// console.log(\"Front verification START\", JSON.stringify({ result }, null, 2));\n// logger.log(\"Front verification\", JSON.stringify({ result }, null, 2));\n \n// // SANDBOX mode\n// if (env === 'SANDBOX') {\n// console.log(\"SANDBOX mode: Skipping AI verification for front document\");\n// logger.log(\"SANDBOX mode: Returning mock front verification response\");\n// const mockBbox: IBbox = { minX: 400, minY: 800, width: 2200, height: 1400 };\n \n// // ==========================================\n// // 🧪 TEST OVERRIDE (SANDBOX) 🧪\n// // Immediately throw the error to test the UI\n// // ==========================================\n// throw new Error('CARD_NOT_FULLY_IN_FRAME'); \n\n// const mockResponse = {\n// result: true,\n// detail: [{ confidence: 0.95 }],\n// card_obb: [{\n// obb: [[400,800], [2600,800], [2600,2200], [400,2200]],\n// confidence: 0.95,\n// card_in_frame: false, // Hardcoded to false\n// cropped_sides: ['left', 'top'] // Hardcoded cropped sides\n// }],\n// bbox: mockBbox,\n// ...(result.regionMapping?.authMethod?.includes('MRZ') ? {\n// mrz: {\n// success: true,\n// parsed_data: {\n// status: 'success',\n// document_type: result.selectedDocumentType,\n// mrz_type: result.mrzType || 'TD1'\n// }\n// }\n// } : {})\n// };\n// return mockResponse;\n// }\n \n// const token = await authentification();\n \n// // Cast the response so TypeScript knows about card_obb\n// const detected = await kycService.detectFaceOnId(result?.path || '', token, result?.selectedDocumentType || '', env) as ApiVerificationResponse;\n\n// // ==========================================\n// // 🧪 TEST OVERRIDE (PRODUCTION) 🧪\n// // Hijack the real API response and force it to look cropped\n// // ==========================================\n// if (detected.card_obb && Array.isArray(detected.card_obb) && detected.card_obb.length > 0) {\n// detected.card_obb[0].card_in_frame = false;\n// detected.card_obb[0].cropped_sides = ['left', 'top'];\n// console.warn(\"⚠️ FORCING CROPPED ERROR FOR UI TESTING ⚠️\");\n// }\n// // ==========================================\n\n// if (!detected.result) {\n// throw new Error('Aucun visage détecté sur la carte. Veuillez reprendre.');\n// }\n\n// const cardData = detected.card_obb && Array.isArray(detected.card_obb) && detected.card_obb.length > 0 \n// ? detected.card_obb[0] \n// : null;\n\n// // --- STRICT FRAMING CHECK ---\n// if (cardData && typeof cardData.card_in_frame !== 'undefined') {\n// const isCardInFrame = cardData.card_in_frame === true;\n// const hasCroppedSides = Array.isArray(cardData.cropped_sides) && cardData.cropped_sides.length > 0;\n\n// // If it is NOT in the frame, OR if any side is cropped, block progression\n// if (!isCardInFrame || hasCroppedSides) {\n// logger.log(`Framing failed. Cropped sides: ${hasCroppedSides ? cardData.cropped_sides?.join(', ') : 'none'}`);\n// throw new Error('CARD_NOT_FULLY_IN_FRAME');\n// }\n// }\n\n// // Check Confidence Threshold\n// const obbConfidence = getObbConfidence(detected.card_obb);\n// if (obbConfidence !== null && obbConfidence < OBB_CONFIDENCE_THRESHOLD) {\n// throw new Error('Carte non entièrement visible. Positionnez toute la carte dans le cadre.');\n// }\n\n// // Optional: crop image using card_obb for better MRZ/barcode extraction\n// let croppedBase64: string | undefined;\n// let bbox: IBbox | undefined;\n// let mrz: any | undefined;\n// try {\n// const crop = await cropByObb(result?.path || '', detected.card_obb);\n// croppedBase64 = crop.base64;\n// bbox = crop.bbox;\n// } catch { }\n\n// // MRZ Extraction\n// if (result.regionMapping?.authMethod?.length > 0 && result.regionMapping.authMethod.includes('MRZ')) {\n// mrz = await kycService.extractMrzText(\n// {\n// fileUri: result.path || '',\n// docType: result?.selectedDocumentType || '',\n// docRegion: result?.code || \"\",\n// postfix: result?.currentSide,\n// token: token,\n// template_path: result?.templatePath || '',\n// mrz_type: result?.mrzType || ''\n// },\n// env\n// );\n// }\n\n// return { ...detected, croppedBase64, bbox, ...(mrz ? { mrz } : {}) };\n// } catch (e: any) {\n// logger.error('Error front verification:', JSON.stringify(errorMessage(e), null, 2));\n// throw new Error(e?.message || 'Erreur de détection du visage');\n// }\n// }\n\n\nexport async function backVerification(\n result: { path?: string, regionMapping: { authMethod: string[], mrzTypes: string[] }, selectedDocumentType: string, code: string, currentSide: string, templatePath?: string, mrzType?: string }, \n env: KycEnvironment = 'PRODUCTION'\n) {\n try {\n if (!result.path) throw new Error('No path provided');\n logger.log(\"result.regionMapping\", result.regionMapping, result.currentSide, result.code);\n \n if (env === 'SANDBOX') {\n console.log(\"SANDBOX mode: Skipping AI verification for back document\");\n \n const mockBbox: IBbox = { minX: 400, minY: 800, width: 2200, height: 1400 };\n const mockCardObb = [{\n obb: [[400,800], [2600,800], [2600,2200], [400,2200]],\n confidence: 0.95,\n card_in_frame: true,\n cropped_sides: []\n }];\n \n if (result.regionMapping?.authMethod?.includes('MRZ')) {\n return {\n success: true,\n mrz: { \n success: true,\n parsed_data: {\n status: 'SUCCESS', \n document_type: result.selectedDocumentType,\n mrz_type: result.mrzType || 'TD1'\n }\n },\n bbox: mockBbox,\n card_obb: mockCardObb\n };\n } else if (result.regionMapping?.authMethod?.includes('2D_barcode')) {\n return {\n success: true,\n barcode: { barcode_data: 'SANDBOX_MOCK_BARCODE' },\n bbox: mockBbox,\n card_obb: mockCardObb\n };\n }\n return { success: true, bbox: mockBbox, card_obb: mockCardObb };\n }\n \n const token = await authentification();\n\n logger.log(\"1. Checking template and framing for back document...\");\n \n const templateResponse = await kycService.checkTemplateType({\n fileUri: result.path,\n docType: result.selectedDocumentType as any,\n docRegion: result.code,\n postfix: 'back',\n token: token\n }, env) as ApiVerificationResponse;\n\n if (templateResponse.success === false || templateResponse.Error) {\n logger.log(\"Backend returned an error:\", templateResponse.Error);\n throw new Error('Impossible de lire le document. Veuillez vous rapprocher et stabiliser la caméra.');\n }\n\n const cardData = templateResponse?.card_obb && Array.isArray(templateResponse.card_obb) && templateResponse.card_obb.length > 0 \n ? templateResponse.card_obb[0] \n : null;\n\n if (!cardData) {\n throw new Error('CARD_NOT_FULLY_IN_FRAME');\n }\n\n let points = null;\n let isCardInFrame = false; \n let hasCroppedSides = true; \n\n // Safely extract coordinates and frame status\n if (cardData.obb) { \n points = cardData.obb;\n if (typeof cardData.card_in_frame !== 'undefined') {\n isCardInFrame = cardData.card_in_frame === true;\n hasCroppedSides = Array.isArray(cardData.cropped_sides) && cardData.cropped_sides.length > 0;\n }\n } else if (Array.isArray(cardData) && Array.isArray(cardData[0])) { \n points = cardData[0];\n isCardInFrame = true; \n hasCroppedSides = false;\n \n if (points && points.length === 4) {\n const minX = Math.min(...points.map((p: number[]) => p[0]));\n const minY = Math.min(...points.map((p: number[]) => p[1]));\n if (minX <= 15 || minY <= 15) {\n isCardInFrame = false;\n hasCroppedSides = true;\n }\n }\n }\n\n // --- 2. STRICT FRAMING CHECK (MUST HAPPEN FIRST) ---\n if (!isCardInFrame || hasCroppedSides) {\n logger.log(`Back Framing failed. Coordinates hit image boundary.`);\n throw new Error('CARD_NOT_FULLY_IN_FRAME');\n }\n\n // --- 3. STRICT DISTANCE CHECK (ONLY RUNS IF FULLY IN FRAME) ---\n if (points && points.length === 4) {\n const getDistance = (p1: number[], p2: number[]) => Math.sqrt(Math.pow(p2[0] - p1[0], 2) + Math.pow(p2[1] - p1[1], 2));\n const longestCardEdge = Math.max(getDistance(points[0], points[1]), getDistance(points[1], points[2]));\n\n const maxX = Math.max(points[0][0], points[1][0], points[2][0], points[3][0]);\n const maxY = Math.max(points[0][1], points[1][1], points[2][1], points[3][1]);\n const estimatedImageScale = Math.max(maxX, maxY);\n\n const fillPercentage = longestCardEdge / estimatedImageScale;\n logger.log(`Back Card Fill Percentage: ${(fillPercentage * 100).toFixed(1)}%`);\n\n if (fillPercentage < 0.50) { \n logger.log(\"🛑 Back Image rejected: Document is too far away.\");\n throw new Error(\"TOO_FAR_AWAY\"); \n }\n }\n \n const obbConf = getObbConfidence(templateResponse?.card_obb);\n if (obbConf !== null && obbConf < OBB_CONFIDENCE_THRESHOLD) {\n throw new Error('Carte non entièrement visible. Positionnez toute la carte dans le cadre.');\n }\n\n const activeTemplatePath = templateResponse.template_path || result.templatePath || '';\n \n if (activeTemplatePath) {\n const expectedCountryName = countryData[result.code]?.name_en || '';\n const hasCodeMatch = activeTemplatePath.includes(`_${result.code}_`);\n const hasNameMatch = expectedCountryName && activeTemplatePath.toLowerCase().includes(expectedCountryName.toLowerCase());\n\n if (!hasCodeMatch && !hasNameMatch) {\n logger.log(`Template mismatch! Expected country: ${result.code} (${expectedCountryName}), Detected: ${activeTemplatePath}`);\n throw new Error(`Le document ne correspond pas au pays sélectionné (${result.code}).`);\n }\n }\n\n logger.log(\"Framing and Country Template verified successfully. Proceeding to Data Extraction.\");\n\n const hasMrz = result.regionMapping?.authMethod?.includes('MRZ') || !result.regionMapping?.authMethod?.length;\n const hasBarcode = result.regionMapping?.authMethod?.includes('2D_barcode');\n\n let extractionResult: any = {};\n\n // --- 4. Try MRZ First (If required or default) ---\n if (hasMrz) {\n try {\n logger.log(\"Tentative d'extraction MRZ\");\n const mrzResponse = await kycService.extractMrzText({\n fileUri: result.path!,\n docType: result?.selectedDocumentType || '',\n docRegion: result?.code || '',\n postfix: 'back',\n token: token,\n template_path: activeTemplatePath, \n mrz_type: result?.mrzType || '' // Safe to send empty string\n }, env);\n \n const mrz = typeof mrzResponse === 'string' ? JSON.parse(mrzResponse) : mrzResponse;\n \n if (!mrz || !mrz.success || mrz.parsed_data?.status === 'FAILURE') {\n throw new Error(mrz?.parsed_data?.status_message || 'Lecture MRZ échouée');\n }\n \n extractionResult = { mrz };\n\n } catch (mrzError: any) {\n if (hasBarcode) {\n logger.log(`MRZ échoué (${mrzError?.message}), tentative d'extraction barcode...`);\n try {\n const barcode = await kycService.extractBarcode({ fileUri: result.path!, token: token }, env);\n extractionResult = { barcode };\n } catch (barcodeError: any) {\n throw new Error(`MRZ et Barcode ont échoué. Veuillez stabiliser la carte.`);\n }\n } else {\n throw new Error(`Lecture MRZ invalide: ${mrzError?.message}`);\n }\n }\n } \n // --- 5. Try Barcode Only ---\n else if (hasBarcode) {\n try {\n logger.log(\"Tentative d'extraction barcode seule\");\n const barcode = await kycService.extractBarcode({ fileUri: result.path!, token: token }, env);\n extractionResult = { barcode };\n } catch (e: any) {\n throw new Error(`Lecture Barcode échouée: ${e?.message}`);\n }\n }\n\n let bbox: IBbox | undefined;\n let croppedBase64: string | undefined;\n\n try {\n const crop = await cropByObb(result?.path || '', templateResponse.card_obb);\n bbox = crop.bbox;\n croppedBase64 = crop.base64;\n } catch { }\n\n return { \n success: true,\n ...extractionResult, \n bbox, \n croppedBase64, \n card_obb: templateResponse.card_obb \n };\n\n } catch (e: any) {\n if (e?.message === 'CARD_NOT_FULLY_IN_FRAME' || e?.message === 'TOO_FAR_AWAY') {\n throw e; \n }\n throw new Error(e?.message || 'Erreur de détection des données');\n }\n}\n\n\n/**\n * Check template type\n * @param result \n * @returns \n */\nexport async function checkTemplateType(result: { path?: string, docType: string, docRegion: string, postfix: string }, env: KycEnvironment = 'PRODUCTION') {\n try {\n if (env === 'SANDBOX') {\n return {\n template_path: `templates/${result.docType}_${result.docRegion}_${result.postfix}.jpg`,\n card_obb: [{\n obb: [[400,800], [2600,800], [2600,2200], [400,2200]],\n confidence: 0.95,\n card_in_frame: true,\n cropped_sides: []\n }]\n };\n }\n \n const token = await authentification();\n const templateType = await kycService.checkTemplateType({ fileUri: result.path || '', docType: result?.docType as GovernmentDocumentType, docRegion: result?.docRegion || \"\", postfix: result?.postfix, token: token }, env);\n\n if (templateType.success === false || templateType.Error) {\n logger.log(\"Backend returned an error:\", templateType.Error);\n throw new Error('Impossible de lire le document. Veuillez vous rapprocher et stabiliser la caméra.');\n }\n\n const cardData = templateType.card_obb && Array.isArray(templateType.card_obb) && templateType.card_obb.length > 0 \n ? templateType.card_obb[0] \n : null;\n\n if (!cardData) {\n throw new Error('CARD_NOT_FULLY_IN_FRAME');\n }\n\n // Default to FALSE so it must prove it is in the frame\n let points = null;\n let isCardInFrame = false; \n let hasCroppedSides = true; \n\n // Extract data safely based on API response format\n if (cardData.obb) { \n points = cardData.obb;\n if (typeof cardData.card_in_frame !== 'undefined') {\n isCardInFrame = cardData.card_in_frame === true;\n hasCroppedSides = Array.isArray(cardData.cropped_sides) && cardData.cropped_sides.length > 0;\n }\n } else if (Array.isArray(cardData) && Array.isArray(cardData[0])) { \n points = cardData[0];\n isCardInFrame = true; // Passed initial existence check\n hasCroppedSides = false;\n \n // MATH FALLBACK: Check if the coordinates are touching the absolute edge of the photo.\n if (points && points.length === 4) {\n const minX = Math.min(...points.map((p: number[]) => p[0]));\n const minY = Math.min(...points.map((p: number[]) => p[1]));\n // If any corner is within 15 pixels of the edge, it is physically cut off!\n if (minX <= 15 || minY <= 15) {\n isCardInFrame = false;\n hasCroppedSides = true;\n }\n }\n }\n\n // --- 3. STRICT FRAMING CHECK (MUST HAPPEN FIRST) ---\n if (!isCardInFrame || hasCroppedSides) {\n logger.log(`Template Framing failed. Coordinates hit image boundary.`);\n throw new Error('CARD_NOT_FULLY_IN_FRAME');\n }\n\n \n const LPIPS_THRESHOLD = 0.75; \n \n if (templateType.lpips_score !== undefined && templateType.lpips_score > LPIPS_THRESHOLD) {\n logger.log(`🛑 Country Mismatch! LPIPS Score too high: ${templateType.lpips_score}`);\n throw new Error(`Le document présenté ne correspond pas au pays sélectionné (${result.docRegion}).`);\n }\n\n logger.log(\"templateType result\", JSON.stringify(truncateFields(templateType), null, 2));\n return templateType;\n } catch (e: any) {\n logger.error('Error checking template type:', JSON.stringify(errorMessage(e), null, 2));\n \n if (e?.message === 'CARD_NOT_FULLY_IN_FRAME' || e?.message?.includes('ne correspond pas')) {\n throw e; \n }\n \n throw new Error(e?.message || 'Erreur de vérification du template');\n }\n}"]}
1
+ {"version":3,"file":"CardAuthentification.js","sourceRoot":"","sources":["../../../../src/modules/api/CardAuthentification.ts"],"names":[],"mappings":"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","sourcesContent":["import kycService, { authentification, errorMessage, truncateFields } from \"./KYCService\";\nimport { cropByObb, getObbConfidence, OBB_CONFIDENCE_THRESHOLD } from \"../../utils/cropByObb\";\nimport { GovernmentDocumentType, IBbox } from \"../../types/KYC.types\";\nimport { KycEnvironment } from \"../../types/env.types\";\nimport { logger } from \"../../utils/logger\";\nimport { countryData } from \"../../config/countriesData\";\n\n// 1. Add this interface to tell TypeScript what the AI response actually looks like\ninterface CardObbData {\n obb: number[][];\n confidence: number;\n card_in_frame?: boolean;\n cropped_sides?: string[];\n}\n\ninterface ApiVerificationResponse {\n result?: boolean;\n success?: boolean;\n detail?: any[];\n card_obb?: CardObbData[] | any; \n template_path?: string;\n Error?: any;\n [key: string]: any; \n}\n\nexport async function frontVerification(\n result: { path?: string, regionMapping: { authMethod: string[], mrzTypes: string[] }, selectedDocumentType: string, code: string, currentSide: string, templatePath?: string, mrzType?: string }, \n env: KycEnvironment = 'PRODUCTION'\n) {\n try {\n console.log(\"Front verification START\", JSON.stringify({ result }, null, 2));\n logger.log(\"Front verification\", JSON.stringify({ result }, null, 2));\n \n // SANDBOX mode\n if (env === 'SANDBOX') {\n console.log(\"SANDBOX mode: Skipping AI verification for front document\");\n logger.log(\"SANDBOX mode: Returning mock front verification response\");\n const mockBbox: IBbox = { minX: 400, minY: 800, width: 2200, height: 1400 };\n \n const mockResponse = {\n result: true,\n detail: [{ confidence: 0.95 }],\n card_obb: [{\n obb: [[400,800], [2600,800], [2600,2200], [400,2200]],\n confidence: 0.95,\n card_in_frame: true,\n cropped_sides: []\n }],\n bbox: mockBbox,\n ...(result.regionMapping?.authMethod?.includes('MRZ') ? {\n mrz: {\n success: true,\n parsed_data: {\n status: 'success',\n document_type: result.selectedDocumentType,\n mrz_type: result.mrzType || 'TD1'\n }\n }\n } : {})\n };\n return mockResponse;\n }\n \n const token = await authentification();\n \n // Cast the response so TypeScript knows about card_obb\n const detected = await kycService.detectFaceOnId(result?.path || '', token, result?.selectedDocumentType || '', env) as ApiVerificationResponse;\n\n if (!detected.result) {\n throw new Error('Aucun visage détecté sur la carte. Veuillez reprendre.');\n }\n\n const cardData = detected.card_obb && Array.isArray(detected.card_obb) && detected.card_obb.length > 0 \n ? detected.card_obb[0] \n : null;\n\n let points = null;\n let isCardInFrame = true;\n let hasCroppedSides = false;\n\n // Extract data safely\n if (cardData) {\n points = cardData.obb;\n if (typeof cardData.card_in_frame !== 'undefined') {\n isCardInFrame = cardData.card_in_frame === true;\n hasCroppedSides = Array.isArray(cardData.cropped_sides) && cardData.cropped_sides.length > 0;\n }\n }\n\n // --- 1. STRICT FRAMING CHECK (MUST HAPPEN FIRST) ---\n if (!isCardInFrame || hasCroppedSides) {\n logger.log(`Front Framing failed. Cropped sides detected.`);\n throw new Error('CARD_NOT_FULLY_IN_FRAME');\n }\n\n // --- 2. STRICT DISTANCE CHECK (ONLY RUNS IF FULLY IN FRAME) ---\n if (points && points.length === 4) {\n const getDistance = (p1: number[], p2: number[]) => Math.sqrt(Math.pow(p2[0] - p1[0], 2) + Math.pow(p2[1] - p1[1], 2));\n const longestCardEdge = Math.max(getDistance(points[0], points[1]), getDistance(points[1], points[2]));\n\n const maxX = Math.max(points[0][0], points[1][0], points[2][0], points[3][0]);\n const maxY = Math.max(points[0][1], points[1][1], points[2][1], points[3][1]);\n const estimatedImageScale = Math.max(maxX, maxY);\n\n const fillPercentage = longestCardEdge / estimatedImageScale;\n logger.log(`Front Card Fill Percentage: ${(fillPercentage * 100).toFixed(1)}%`);\n\n if (fillPercentage < 0.50) { \n logger.log(\"🛑 Front Image rejected: Document is too far away.\");\n throw new Error(\"TOO_FAR_AWAY\"); \n }\n }\n\n \n\n \n\n // Check Confidence Threshold\n const obbConfidence = getObbConfidence(detected.card_obb);\n if (obbConfidence !== null && obbConfidence < OBB_CONFIDENCE_THRESHOLD) {\n throw new Error('Carte non entièrement visible. Positionnez toute la carte dans le cadre.');\n }\n\n // Optional: crop image using card_obb for better MRZ/barcode extraction\n let croppedBase64: string | undefined;\n let bbox: IBbox | undefined;\n let mrz: any | undefined;\n try {\n const crop = await cropByObb(result?.path || '', detected.card_obb);\n croppedBase64 = crop.base64;\n bbox = crop.bbox;\n } catch { }\n\n // MRZ Extraction: only run when a concrete mrzType is available\n const shouldRunMrzExtraction =\n result.regionMapping?.authMethod?.length > 0 &&\n result.regionMapping.authMethod.includes('MRZ') &&\n !!result?.mrzType;\n if (shouldRunMrzExtraction) {\n const mrzResponse = await kycService.extractMrzText(\n {\n fileUri: result.path || '',\n docType: result?.selectedDocumentType || '',\n docRegion: result?.code || \"\",\n postfix: result?.currentSide,\n token: token,\n template_path: result?.templatePath || '',\n mrz_type: result?.mrzType || ''\n },\n env\n );\n\n // Safety check: parse if it was returned as a raw string\n mrz = typeof mrzResponse === 'string' ? JSON.parse(mrzResponse) : mrzResponse;\n\n if (mrz && (!mrz.success || mrz.parsed_data?.status === 'FAILURE')) {\n logger.log(\"🛑 Front MRZ Extraction Failed:\", mrz.parsed_data?.status_message);\n throw new Error(`MRZ illisible: ${mrz.parsed_data?.status_message || 'Veuillez nettoyer l\\'objectif et réessayer'}`);\n }\n }\n\n return { ...detected, croppedBase64, bbox, ...(mrz ? { mrz } : {}) };\n } catch (e: any) {\n logger.error('Error front verification:', e?.message);\n // Do not use LogBox for background silent errors\n throw new Error(e?.message || 'Erreur de détection du visage');\n }\n}\n\n\nexport async function backVerification(\n result: {\n path?: string,\n regionMapping: { authMethod: string[], mrzTypes: string[] },\n selectedDocumentType: string,\n code: string,\n currentSide: string,\n templatePath?: string,\n mrzType?: string,\n templateResponse?: ApiVerificationResponse\n }, \n env: KycEnvironment = 'PRODUCTION'\n) {\n try {\n if (!result.path) throw new Error('No path provided');\n logger.log(\"result.regionMapping\", result.regionMapping, result.currentSide, result.code);\n \n if (env === 'SANDBOX') {\n console.log(\"SANDBOX mode: Skipping AI verification for back document\");\n \n const mockBbox: IBbox = { minX: 400, minY: 800, width: 2200, height: 1400 };\n const mockCardObb = [{\n obb: [[400,800], [2600,800], [2600,2200], [400,2200]],\n confidence: 0.95,\n card_in_frame: true,\n cropped_sides: []\n }];\n \n if (result.regionMapping?.authMethod?.includes('MRZ')) {\n return {\n success: true,\n mrz: { \n success: true,\n parsed_data: {\n status: 'SUCCESS', \n document_type: result.selectedDocumentType,\n mrz_type: result.mrzType || 'TD1'\n }\n },\n bbox: mockBbox,\n card_obb: mockCardObb\n };\n } else if (result.regionMapping?.authMethod?.includes('2D_barcode')) {\n return {\n success: true,\n barcode: { barcode_data: 'SANDBOX_MOCK_BARCODE' },\n bbox: mockBbox,\n card_obb: mockCardObb\n };\n }\n return { success: true, bbox: mockBbox, card_obb: mockCardObb };\n }\n \n const token = await authentification();\n\n logger.log(\"1. Checking template and framing for back document...\");\n \n const templateResponse: ApiVerificationResponse = result.templateResponse || await kycService.checkTemplateType({\n fileUri: result.path,\n docType: result.selectedDocumentType as any,\n docRegion: result.code,\n postfix: 'back',\n token: token\n }, env);\n\n if (templateResponse.success === false || templateResponse.Error) {\n logger.log(\"Backend returned an error:\", templateResponse.Error);\n throw new Error('Impossible de lire le document. Veuillez vous rapprocher et stabiliser la caméra.');\n }\n\n const cardData = templateResponse?.card_obb && Array.isArray(templateResponse.card_obb) && templateResponse.card_obb.length > 0 \n ? templateResponse.card_obb[0] \n : null;\n\n if (!cardData) {\n throw new Error('CARD_NOT_FULLY_IN_FRAME');\n }\n\n let points = null;\n let isCardInFrame = false; \n let hasCroppedSides = true; \n\n // Safely extract coordinates and frame status\n if (cardData.obb) { \n points = cardData.obb;\n if (typeof cardData.card_in_frame !== 'undefined') {\n isCardInFrame = cardData.card_in_frame === true;\n hasCroppedSides = Array.isArray(cardData.cropped_sides) && cardData.cropped_sides.length > 0;\n }\n } else if (Array.isArray(cardData) && Array.isArray(cardData[0])) { \n points = cardData[0];\n isCardInFrame = true; \n hasCroppedSides = false;\n \n if (points && points.length === 4) {\n const minX = Math.min(...points.map((p: number[]) => p[0]));\n const minY = Math.min(...points.map((p: number[]) => p[1]));\n if (minX <= 15 || minY <= 15) {\n isCardInFrame = false;\n hasCroppedSides = true;\n }\n }\n }\n\n // --- 2. STRICT FRAMING CHECK (MUST HAPPEN FIRST) ---\n if (!isCardInFrame || hasCroppedSides) {\n logger.log(`Back Framing failed. Coordinates hit image boundary.`);\n throw new Error('CARD_NOT_FULLY_IN_FRAME');\n }\n\n // --- 3. STRICT DISTANCE CHECK (ONLY RUNS IF FULLY IN FRAME) ---\n if (points && points.length === 4) {\n const getDistance = (p1: number[], p2: number[]) => Math.sqrt(Math.pow(p2[0] - p1[0], 2) + Math.pow(p2[1] - p1[1], 2));\n const longestCardEdge = Math.max(getDistance(points[0], points[1]), getDistance(points[1], points[2]));\n\n const maxX = Math.max(points[0][0], points[1][0], points[2][0], points[3][0]);\n const maxY = Math.max(points[0][1], points[1][1], points[2][1], points[3][1]);\n const estimatedImageScale = Math.max(maxX, maxY);\n\n const fillPercentage = longestCardEdge / estimatedImageScale;\n logger.log(`Back Card Fill Percentage: ${(fillPercentage * 100).toFixed(1)}%`);\n\n if (fillPercentage < 0.50) { \n logger.log(\"🛑 Back Image rejected: Document is too far away.\");\n throw new Error(\"TOO_FAR_AWAY\"); \n }\n }\n \n const obbConf = getObbConfidence(templateResponse?.card_obb);\n if (obbConf !== null && obbConf < OBB_CONFIDENCE_THRESHOLD) {\n throw new Error('Carte non entièrement visible. Positionnez toute la carte dans le cadre.');\n }\n\n const activeTemplatePath = templateResponse.template_path || result.templatePath || '';\n \n if (activeTemplatePath) {\n const expectedCountryName = countryData[result.code]?.name_en || '';\n const hasCodeMatch = activeTemplatePath.includes(`_${result.code}_`);\n const hasNameMatch = expectedCountryName && activeTemplatePath.toLowerCase().includes(expectedCountryName.toLowerCase());\n\n if (!hasCodeMatch && !hasNameMatch) {\n logger.log(`Template mismatch! Expected country: ${result.code} (${expectedCountryName}), Detected: ${activeTemplatePath}`);\n throw new Error(`Le document ne correspond pas au pays sélectionné (${result.code}).`);\n }\n }\n\n logger.log(\"Framing and Country Template verified successfully. Proceeding to Data Extraction.\");\n\n const hasMrz = result.regionMapping?.authMethod?.includes('MRZ') && result?.mrzType;\n const hasBarcode = result.regionMapping?.authMethod?.includes('2D_barcode');\n\n let extractionResult: any = {};\n\n // --- 4. Try MRZ First (If required or default) ---\n if (hasMrz) {\n try {\n logger.log(\"Tentative d'extraction MRZ\");\n const mrzResponse = await kycService.extractMrzText({\n fileUri: result.path!,\n docType: result?.selectedDocumentType || '',\n docRegion: result?.code || '',\n postfix: 'back',\n token: token,\n template_path: activeTemplatePath, \n mrz_type: result?.mrzType || '' // Safe to send empty string\n }, env);\n \n const mrz = typeof mrzResponse === 'string' ? JSON.parse(mrzResponse) : mrzResponse;\n \n if (!mrz || !mrz.success || mrz.parsed_data?.status === 'FAILURE') {\n throw new Error(mrz?.parsed_data?.status_message || 'Lecture MRZ échouée');\n }\n \n extractionResult = { mrz };\n\n } catch (mrzError: any) {\n if (hasBarcode) {\n logger.log(`MRZ échoué (${mrzError?.message}), tentative d'extraction barcode...`);\n try {\n const barcode = await kycService.extractBarcode({ fileUri: result.path!, token: token }, env);\n extractionResult = { barcode };\n } catch (barcodeError: any) {\n throw new Error(`MRZ et Barcode ont échoué. Veuillez stabiliser la carte.`);\n }\n } else {\n throw new Error(`Lecture MRZ invalide: ${mrzError?.message}`);\n }\n }\n } \n // --- 5. Try Barcode Only ---\n else if (hasBarcode) {\n try {\n logger.log(\"Tentative d'extraction barcode seule\");\n const barcode = await kycService.extractBarcode({ fileUri: result.path!, token: token }, env);\n extractionResult = { barcode };\n } catch (e: any) {\n throw new Error(`Lecture Barcode échouée: ${e?.message}`);\n }\n }\n\n let bbox: IBbox | undefined;\n let croppedBase64: string | undefined;\n\n try {\n const crop = await cropByObb(result?.path || '', templateResponse.card_obb);\n bbox = crop.bbox;\n croppedBase64 = crop.base64;\n } catch { }\n\n return { \n success: true,\n ...extractionResult, \n bbox, \n croppedBase64, \n card_obb: templateResponse.card_obb \n };\n\n } catch (e: any) {\n if (e?.message === 'CARD_NOT_FULLY_IN_FRAME' || e?.message === 'TOO_FAR_AWAY') {\n throw e; \n }\n throw new Error(e?.message || 'Erreur de détection des données');\n }\n}\n\n\n/**\n * Check template type\n * @param result \n * @returns \n */\nexport async function checkTemplateType(result: { path?: string, docType: string, docRegion: string, postfix: string }, env: KycEnvironment = 'PRODUCTION') {\n try {\n if (env === 'SANDBOX') {\n return {\n template_path: `templates/${result.docType}_${result.docRegion}_${result.postfix}.jpg`,\n card_obb: [{\n obb: [[400,800], [2600,800], [2600,2200], [400,2200]],\n confidence: 0.95,\n card_in_frame: true,\n cropped_sides: []\n }]\n };\n }\n \n const token = await authentification();\n const templateType = await kycService.checkTemplateType({ fileUri: result.path || '', docType: result?.docType as GovernmentDocumentType, docRegion: result?.docRegion || \"\", postfix: result?.postfix, token: token }, env);\n\n if (templateType.success === false || templateType.Error) {\n logger.log(\"Backend returned an error:\", templateType.Error);\n throw new Error('Impossible de lire le document. Veuillez vous rapprocher et stabiliser la caméra.');\n }\n\n const cardData = templateType.card_obb && Array.isArray(templateType.card_obb) && templateType.card_obb.length > 0 \n ? templateType.card_obb[0] \n : null;\n\n if (!cardData) {\n throw new Error('CARD_NOT_FULLY_IN_FRAME');\n }\n\n // Default to FALSE so it must prove it is in the frame\n let points = null;\n let isCardInFrame = false; \n let hasCroppedSides = true; \n\n // Extract data safely based on API response format\n if (cardData.obb) { \n points = cardData.obb;\n if (typeof cardData.card_in_frame !== 'undefined') {\n isCardInFrame = cardData.card_in_frame === true;\n hasCroppedSides = Array.isArray(cardData.cropped_sides) && cardData.cropped_sides.length > 0;\n }\n } else if (Array.isArray(cardData) && Array.isArray(cardData[0])) { \n points = cardData[0];\n isCardInFrame = true; // Passed initial existence check\n hasCroppedSides = false;\n \n // MATH FALLBACK: Check if the coordinates are touching the absolute edge of the photo.\n if (points && points.length === 4) {\n const minX = Math.min(...points.map((p: number[]) => p[0]));\n const minY = Math.min(...points.map((p: number[]) => p[1]));\n // If any corner is within 15 pixels of the edge, it is physically cut off!\n if (minX <= 15 || minY <= 15) {\n isCardInFrame = false;\n hasCroppedSides = true;\n }\n }\n }\n\n // --- 3. STRICT FRAMING CHECK (MUST HAPPEN FIRST) ---\n if (!isCardInFrame || hasCroppedSides) {\n logger.log(`Template Framing failed. Coordinates hit image boundary.`);\n throw new Error('CARD_NOT_FULLY_IN_FRAME');\n }\n\n \n const LPIPS_THRESHOLD = 0.75; \n \n if (templateType.lpips_score !== undefined && templateType.lpips_score > LPIPS_THRESHOLD) {\n logger.log(`🛑 Country Mismatch! LPIPS Score too high: ${templateType.lpips_score}`);\n throw new Error(`Le document présenté ne correspond pas au pays sélectionné (${result.docRegion}).`);\n }\n\n logger.log(\"templateType result\", JSON.stringify(truncateFields(templateType), null, 2));\n return templateType;\n } catch (e: any) {\n logger.error('Error checking template type:', JSON.stringify(errorMessage(e), null, 2));\n \n if (e?.message === 'CARD_NOT_FULLY_IN_FRAME' || e?.message?.includes('ne correspond pas')) {\n throw e; \n }\n \n throw new Error(e?.message || 'Erreur de vérification du template');\n }\n}"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@transfergratis/react-native-sdk",
3
- "version": "0.1.33",
3
+ "version": "0.1.35",
4
4
  "description": "transfergratis react native sdk",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -244,6 +244,20 @@ export const IDCardCapture: React.FC<IDCardCaptureProps> = ({
244
244
  return found?.mrz_type || null;
245
245
  }
246
246
 
247
+ const getCorrespondingAuthMethod = (
248
+ templatePath: string,
249
+ mapping: any,
250
+ selectedDocumentType: string = "root",
251
+ side: 'front' | 'back'
252
+ ) => {
253
+ if (!mapping || !mapping[selectedDocumentType]) return null;
254
+ const fileName = templatePath.split("/").pop()?.replace(".jpg", "").replace(".png", "");
255
+ if (!fileName) return null;
256
+ const pyName = `${fileName}.py`;
257
+ const found = mapping[selectedDocumentType].find((item: any) => item.py_file === pyName);
258
+ return found?.[side] || null;
259
+ }
260
+
247
261
  const handleSilentCapture = async (result: { success: boolean; path?: string; error?: string }) => {
248
262
  if (silentCaptureResult.isAnalyzing) {
249
263
  return;
@@ -252,6 +266,7 @@ export const IDCardCapture: React.FC<IDCardCaptureProps> = ({
252
266
  setSilentCaptureResult((prev) => ({ ...prev, isAnalyzing: true, success: false, error: '' }));
253
267
  let templatePath = silentCaptureResult.templatePath || '';
254
268
  let templateBbox: IBbox | undefined;
269
+ let templateResponse: any;
255
270
 
256
271
  if (!selectedDocumentType) {
257
272
  setSilentCaptureResult((prev) => ({ ...prev, isAnalyzing: false, success: false, error: 'Document type not selected' }));
@@ -268,6 +283,7 @@ export const IDCardCapture: React.FC<IDCardCaptureProps> = ({
268
283
  docTypeToSend: selectedDocumentType?.type
269
284
  });
270
285
  const templateType = await checkTemplateType({ path: result.path || '', docType: selectedDocumentType?.type as GovernmentDocumentType, docRegion: countryData?.code || "", postfix: currentSide }, env);
286
+ templateResponse = templateType;
271
287
 
272
288
  if (templateType.template_path) {
273
289
  templatePath = templateType.template_path;
@@ -308,12 +324,17 @@ export const IDCardCapture: React.FC<IDCardCaptureProps> = ({
308
324
  logger.log("Calling frontVerification", { templatePath, selectedDocumentType: selectedDocumentType?.type, regionMappings });
309
325
  console.log("About to call frontVerification", typeof frontVerification);
310
326
  try {
311
- const mrzType = getCorrespondingMrzType(templatePath, regionMappings.regionMapping, regionMappings.key || '') || '';
327
+ const matchedAuthMethod = getCorrespondingAuthMethod(templatePath, regionMappings.regionMapping, regionMappings.key || '', 'front');
328
+ const resolvedMrzType = getCorrespondingMrzType(templatePath, regionMappings.regionMapping, regionMappings.key || '');
329
+ const mrzType = resolvedMrzType || '';
330
+ const authMethod = matchedAuthMethod
331
+ ? regionMappings.authMethod.filter((method) => method === matchedAuthMethod)
332
+ : regionMappings.authMethod.filter((method) => method !== 'MRZ' && method !== '2D_barcode');
312
333
  console.log("mrzType calculated", mrzType);
313
334
  const verificationParams = {
314
335
  path: result.path,
315
336
  regionMapping: {
316
- authMethod: regionMappings.authMethod,
337
+ authMethod,
317
338
  mrzTypes: regionMappings.mrzTypes,
318
339
  },
319
340
  selectedDocumentType: GovernmentDocumentTypeShorted[selectedDocumentType?.type as keyof typeof GovernmentDocumentTypeShorted] || '',
@@ -370,18 +391,23 @@ export const IDCardCapture: React.FC<IDCardCaptureProps> = ({
370
391
  } else {
371
392
  const backRegionMappings = getCurrentSideVerification(currentSide);
372
393
  logger.log("Calling backVerification", { templatePath, selectedDocumentType: selectedDocumentType.type, backRegionMappings });
394
+ const matchedBackAuthMethod = getCorrespondingAuthMethod(templatePath, backRegionMappings.regionMapping, backRegionMappings.key || '', 'back');
395
+ const backMrzType = getCorrespondingMrzType(templatePath, backRegionMappings.regionMapping, backRegionMappings.key || '') || '';
373
396
 
374
397
  backVerification({
375
398
  path: result.path,
376
399
  regionMapping: {
377
- authMethod: backRegionMappings.authMethod,
400
+ authMethod: matchedBackAuthMethod
401
+ ? backRegionMappings.authMethod.filter((method) => method === matchedBackAuthMethod)
402
+ : backRegionMappings.authMethod.filter((method) => method !== 'MRZ' && method !== '2D_barcode'),
378
403
  mrzTypes: backRegionMappings.mrzTypes,
379
404
  },
380
405
  selectedDocumentType: GovernmentDocumentTypeShorted[selectedDocumentType.type as keyof typeof GovernmentDocumentTypeShorted] || '',
381
406
  code: countryData?.code || '',
382
407
  currentSide: currentSide,
383
408
  templatePath: templatePath,
384
- mrzType: getCorrespondingMrzType(templatePath, backRegionMappings.regionMapping, backRegionMappings.key || '') || '',
409
+ mrzType: backMrzType,
410
+ templateResponse,
385
411
  }, env).then((res: any) => {
386
412
  logger.log("back verification result", truncateFields(res));
387
413
  const bbox = res?.bbox || templateBbox;
@@ -15,8 +15,11 @@ interface CardObbData {
15
15
 
16
16
  interface ApiVerificationResponse {
17
17
  result?: boolean;
18
+ success?: boolean;
18
19
  detail?: any[];
19
20
  card_obb?: CardObbData[] | any;
21
+ template_path?: string;
22
+ Error?: any;
20
23
  [key: string]: any;
21
24
  }
22
25
 
@@ -128,8 +131,12 @@ export async function frontVerification(
128
131
  bbox = crop.bbox;
129
132
  } catch { }
130
133
 
131
- // MRZ Extraction
132
- if (result.regionMapping?.authMethod?.length > 0 && result.regionMapping.authMethod.includes('MRZ')) {
134
+ // MRZ Extraction: only run when a concrete mrzType is available
135
+ const shouldRunMrzExtraction =
136
+ result.regionMapping?.authMethod?.length > 0 &&
137
+ result.regionMapping.authMethod.includes('MRZ') &&
138
+ !!result?.mrzType;
139
+ if (shouldRunMrzExtraction) {
133
140
  const mrzResponse = await kycService.extractMrzText(
134
141
  {
135
142
  fileUri: result.path || '',
@@ -160,128 +167,18 @@ export async function frontVerification(
160
167
  }
161
168
  }
162
169
 
163
- // export async function frontVerification(
164
- // result: { path?: string, regionMapping: { authMethod: string[], mrzTypes: string[] }, selectedDocumentType: string, code: string, currentSide: string, templatePath?: string, mrzType?: string },
165
- // env: KycEnvironment = 'PRODUCTION'
166
- // ) {
167
- // try {
168
- // console.log("Front verification START", JSON.stringify({ result }, null, 2));
169
- // logger.log("Front verification", JSON.stringify({ result }, null, 2));
170
-
171
- // // SANDBOX mode
172
- // if (env === 'SANDBOX') {
173
- // console.log("SANDBOX mode: Skipping AI verification for front document");
174
- // logger.log("SANDBOX mode: Returning mock front verification response");
175
- // const mockBbox: IBbox = { minX: 400, minY: 800, width: 2200, height: 1400 };
176
-
177
- // // ==========================================
178
- // // 🧪 TEST OVERRIDE (SANDBOX) 🧪
179
- // // Immediately throw the error to test the UI
180
- // // ==========================================
181
- // throw new Error('CARD_NOT_FULLY_IN_FRAME');
182
-
183
- // const mockResponse = {
184
- // result: true,
185
- // detail: [{ confidence: 0.95 }],
186
- // card_obb: [{
187
- // obb: [[400,800], [2600,800], [2600,2200], [400,2200]],
188
- // confidence: 0.95,
189
- // card_in_frame: false, // Hardcoded to false
190
- // cropped_sides: ['left', 'top'] // Hardcoded cropped sides
191
- // }],
192
- // bbox: mockBbox,
193
- // ...(result.regionMapping?.authMethod?.includes('MRZ') ? {
194
- // mrz: {
195
- // success: true,
196
- // parsed_data: {
197
- // status: 'success',
198
- // document_type: result.selectedDocumentType,
199
- // mrz_type: result.mrzType || 'TD1'
200
- // }
201
- // }
202
- // } : {})
203
- // };
204
- // return mockResponse;
205
- // }
206
-
207
- // const token = await authentification();
208
-
209
- // // Cast the response so TypeScript knows about card_obb
210
- // const detected = await kycService.detectFaceOnId(result?.path || '', token, result?.selectedDocumentType || '', env) as ApiVerificationResponse;
211
-
212
- // // ==========================================
213
- // // 🧪 TEST OVERRIDE (PRODUCTION) 🧪
214
- // // Hijack the real API response and force it to look cropped
215
- // // ==========================================
216
- // if (detected.card_obb && Array.isArray(detected.card_obb) && detected.card_obb.length > 0) {
217
- // detected.card_obb[0].card_in_frame = false;
218
- // detected.card_obb[0].cropped_sides = ['left', 'top'];
219
- // console.warn("⚠️ FORCING CROPPED ERROR FOR UI TESTING ⚠️");
220
- // }
221
- // // ==========================================
222
-
223
- // if (!detected.result) {
224
- // throw new Error('Aucun visage détecté sur la carte. Veuillez reprendre.');
225
- // }
226
-
227
- // const cardData = detected.card_obb && Array.isArray(detected.card_obb) && detected.card_obb.length > 0
228
- // ? detected.card_obb[0]
229
- // : null;
230
-
231
- // // --- STRICT FRAMING CHECK ---
232
- // if (cardData && typeof cardData.card_in_frame !== 'undefined') {
233
- // const isCardInFrame = cardData.card_in_frame === true;
234
- // const hasCroppedSides = Array.isArray(cardData.cropped_sides) && cardData.cropped_sides.length > 0;
235
-
236
- // // If it is NOT in the frame, OR if any side is cropped, block progression
237
- // if (!isCardInFrame || hasCroppedSides) {
238
- // logger.log(`Framing failed. Cropped sides: ${hasCroppedSides ? cardData.cropped_sides?.join(', ') : 'none'}`);
239
- // throw new Error('CARD_NOT_FULLY_IN_FRAME');
240
- // }
241
- // }
242
-
243
- // // Check Confidence Threshold
244
- // const obbConfidence = getObbConfidence(detected.card_obb);
245
- // if (obbConfidence !== null && obbConfidence < OBB_CONFIDENCE_THRESHOLD) {
246
- // throw new Error('Carte non entièrement visible. Positionnez toute la carte dans le cadre.');
247
- // }
248
-
249
- // // Optional: crop image using card_obb for better MRZ/barcode extraction
250
- // let croppedBase64: string | undefined;
251
- // let bbox: IBbox | undefined;
252
- // let mrz: any | undefined;
253
- // try {
254
- // const crop = await cropByObb(result?.path || '', detected.card_obb);
255
- // croppedBase64 = crop.base64;
256
- // bbox = crop.bbox;
257
- // } catch { }
258
-
259
- // // MRZ Extraction
260
- // if (result.regionMapping?.authMethod?.length > 0 && result.regionMapping.authMethod.includes('MRZ')) {
261
- // mrz = await kycService.extractMrzText(
262
- // {
263
- // fileUri: result.path || '',
264
- // docType: result?.selectedDocumentType || '',
265
- // docRegion: result?.code || "",
266
- // postfix: result?.currentSide,
267
- // token: token,
268
- // template_path: result?.templatePath || '',
269
- // mrz_type: result?.mrzType || ''
270
- // },
271
- // env
272
- // );
273
- // }
274
-
275
- // return { ...detected, croppedBase64, bbox, ...(mrz ? { mrz } : {}) };
276
- // } catch (e: any) {
277
- // logger.error('Error front verification:', JSON.stringify(errorMessage(e), null, 2));
278
- // throw new Error(e?.message || 'Erreur de détection du visage');
279
- // }
280
- // }
281
-
282
170
 
283
171
  export async function backVerification(
284
- result: { path?: string, regionMapping: { authMethod: string[], mrzTypes: string[] }, selectedDocumentType: string, code: string, currentSide: string, templatePath?: string, mrzType?: string },
172
+ result: {
173
+ path?: string,
174
+ regionMapping: { authMethod: string[], mrzTypes: string[] },
175
+ selectedDocumentType: string,
176
+ code: string,
177
+ currentSide: string,
178
+ templatePath?: string,
179
+ mrzType?: string,
180
+ templateResponse?: ApiVerificationResponse
181
+ },
285
182
  env: KycEnvironment = 'PRODUCTION'
286
183
  ) {
287
184
  try {
@@ -328,13 +225,13 @@ export async function backVerification(
328
225
 
329
226
  logger.log("1. Checking template and framing for back document...");
330
227
 
331
- const templateResponse = await kycService.checkTemplateType({
228
+ const templateResponse: ApiVerificationResponse = result.templateResponse || await kycService.checkTemplateType({
332
229
  fileUri: result.path,
333
230
  docType: result.selectedDocumentType as any,
334
231
  docRegion: result.code,
335
232
  postfix: 'back',
336
233
  token: token
337
- }, env) as ApiVerificationResponse;
234
+ }, env);
338
235
 
339
236
  if (templateResponse.success === false || templateResponse.Error) {
340
237
  logger.log("Backend returned an error:", templateResponse.Error);
@@ -419,7 +316,7 @@ export async function backVerification(
419
316
 
420
317
  logger.log("Framing and Country Template verified successfully. Proceeding to Data Extraction.");
421
318
 
422
- const hasMrz = result.regionMapping?.authMethod?.includes('MRZ') || !result.regionMapping?.authMethod?.length;
319
+ const hasMrz = result.regionMapping?.authMethod?.includes('MRZ') && result?.mrzType;
423
320
  const hasBarcode = result.regionMapping?.authMethod?.includes('2D_barcode');
424
321
 
425
322
  let extractionResult: any = {};