@transfergratis/react-native-sdk 0.1.33 → 0.1.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/package.json +1 -1
- package/build/src/components/KYCElements/IDCardCapture.d.ts.map +1 -1
- package/build/src/components/KYCElements/IDCardCapture.js +26 -4
- package/build/src/components/KYCElements/IDCardCapture.js.map +1 -1
- package/build/src/modules/api/CardAuthentification.d.ts +13 -0
- package/build/src/modules/api/CardAuthentification.d.ts.map +1 -1
- package/build/src/modules/api/CardAuthentification.js +6 -107
- package/build/src/modules/api/CardAuthentification.js.map +1 -1
- package/package.json +1 -1
- package/src/components/KYCElements/IDCardCapture.tsx +30 -4
- package/src/modules/api/CardAuthentification.ts +21 -124
package/build/package.json
CHANGED
|
@@ -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,
|
|
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
|
|
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
|
|
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:
|
|
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:
|
|
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":"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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 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":"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,0BAA0B,GAAG,CACjC,YAAoB,EACpB,OAAY,EACZ,uBAA+B,MAAM,EACrC,IAAsB,EACtB,EAAE;QACF,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC;YAAE,OAAO,IAAI,CAAC;QAC5D,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;QACxF,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC3B,MAAM,MAAM,GAAG,GAAG,QAAQ,KAAK,CAAC;QAChC,MAAM,KAAK,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC;QACzF,OAAO,KAAK,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;IAC/B,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;YACpC,IAAI,gBAAqB,CAAC;YAE1B,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;oBACxM,gBAAgB,GAAG,YAAY,CAAC;oBAEhC,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,iBAAiB,GAAG,0BAA0B,CAAC,YAAY,EAAE,cAAc,CAAC,aAAa,EAAE,cAAc,CAAC,GAAG,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;oBACpI,MAAM,eAAe,GAAG,uBAAuB,CAAC,YAAY,EAAE,cAAc,CAAC,aAAa,EAAE,cAAc,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;oBACtH,MAAM,OAAO,GAAG,eAAe,IAAI,EAAE,CAAC;oBACtC,MAAM,UAAU,GAAG,iBAAiB;wBAClC,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,iBAAiB,CAAC;wBAC5E,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,YAAY,CAAC,CAAC;oBAC9F,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;oBAC3C,MAAM,kBAAkB,GAAG;wBACzB,IAAI,EAAE,MAAM,CAAC,IAAI;wBACjB,aAAa,EAAE;4BACb,UAAU;4BACV,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;gBAC9H,MAAM,qBAAqB,GAAG,0BAA0B,CAAC,YAAY,EAAE,kBAAkB,CAAC,aAAa,EAAE,kBAAkB,CAAC,GAAG,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;gBAC/I,MAAM,WAAW,GAAG,uBAAuB,CAAC,YAAY,EAAE,kBAAkB,CAAC,aAAa,EAAE,kBAAkB,CAAC,GAAG,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;gBAEhI,gBAAgB,CAAC;oBACf,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,aAAa,EAAE;wBACb,UAAU,EAAE,qBAAqB;4BAC/B,CAAC,CAAC,kBAAkB,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,qBAAqB,CAAC;4BACpF,CAAC,CAAC,kBAAkB,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,YAAY,CAAC;wBACjG,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,WAAW;oBACpB,gBAAgB;iBACjB,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 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;
|
|
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
|
-
|
|
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,
|
|
@@ -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.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}"]}
|
package/package.json
CHANGED
|
@@ -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
|
|
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
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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: {
|
|
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)
|
|
234
|
+
}, env);
|
|
338
235
|
|
|
339
236
|
if (templateResponse.success === false || templateResponse.Error) {
|
|
340
237
|
logger.log("Backend returned an error:", templateResponse.Error);
|