@trustchex/react-native-sdk 1.409.0 → 1.464.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/src/main/java/com/trustchex/reactnativesdk/TrustchexSDKModule.kt +2 -8
- package/android/src/main/java/com/trustchex/reactnativesdk/camera/TrustchexCameraView.kt +59 -1
- package/ios/Camera/TrustchexCameraView.swift +9 -1
- package/lib/module/Screens/Debug/NFCScanTestScreen.js +635 -0
- package/lib/module/Screens/Dynamic/ContractAcceptanceScreen.js +1 -4
- package/lib/module/Screens/Dynamic/IdentityDocumentEIDScanningScreen.js +17 -4
- package/lib/module/Screens/Dynamic/LivenessDetectionScreen.js +102 -23
- package/lib/module/Screens/Dynamic/VerbalConsentScreen.js +1079 -0
- package/lib/module/Screens/Dynamic/VideoCallScreen.js +3 -1
- package/lib/module/Screens/Static/ResultScreen.js +128 -22
- package/lib/module/Screens/Static/VerificationSessionCheckScreen.js +8 -0
- package/lib/module/Shared/Animations/recording.json +1 -0
- package/lib/module/Shared/Components/DebugNavigationPanel.js +69 -71
- package/lib/module/Shared/Components/EIDScanner.js +212 -108
- package/lib/module/Shared/Components/IdentityDocumentCamera.flows.js +5 -3
- package/lib/module/Shared/Components/IdentityDocumentCamera.js +53 -36
- package/lib/module/Shared/Components/IdentityDocumentCamera.utils.js +13 -4
- package/lib/module/Shared/Components/NavigationManager.js +24 -16
- package/lib/module/Shared/EIDReader/aesSecureMessagingWrapper.js +51 -0
- package/lib/module/Shared/EIDReader/apduLevelPACECapable.js +3 -0
- package/lib/module/Shared/EIDReader/bacKey.js +16 -2
- package/lib/module/Shared/EIDReader/eidReader.js +354 -13
- package/lib/module/Shared/EIDReader/eidService.js +25 -1
- package/lib/module/Shared/EIDReader/nfcManagerCardService.js +4 -7
- package/lib/module/Shared/EIDReader/paceInfo.js +85 -0
- package/lib/module/Shared/EIDReader/paceKeySpec.js +51 -0
- package/lib/module/Shared/EIDReader/protocol/paceAPDUSender.js +100 -0
- package/lib/module/Shared/EIDReader/protocol/paceProtocol.js +655 -0
- package/lib/module/Shared/EIDReader/protocol/paceResult.js +37 -0
- package/lib/module/Shared/EIDReader/secureMessagingWrapper.js +27 -4
- package/lib/module/Shared/EIDReader/smartcards/commandAPDU.js +2 -1
- package/lib/module/Shared/EIDReader/tlv/tlv.helpers.js +1 -1
- package/lib/module/Shared/EIDReader/tlv/tlv.utils.js +6 -3
- package/lib/module/Shared/EIDReader/utils/aesCrypto.utils.js +189 -0
- package/lib/module/Shared/Libs/analytics.utils.js +4 -0
- package/lib/module/Shared/Libs/contains.js +1 -40
- package/lib/module/Shared/Libs/country-display.utils.js +34 -0
- package/lib/module/Shared/Libs/demo.utils.js +8 -0
- package/lib/module/Shared/Libs/mrz.utils.js +3 -2
- package/lib/module/Shared/Libs/status-bar.utils.js +4 -2
- package/lib/module/Shared/Types/analytics.types.js +2 -0
- package/lib/module/Translation/Resources/en.js +41 -2
- package/lib/module/Translation/Resources/tr.js +41 -2
- package/lib/module/Trustchex.js +54 -20
- package/lib/module/version.js +1 -1
- package/lib/typescript/src/Screens/Debug/NFCScanTestScreen.d.ts +3 -0
- package/lib/typescript/src/Screens/Debug/NFCScanTestScreen.d.ts.map +1 -0
- package/lib/typescript/src/Screens/Dynamic/ContractAcceptanceScreen.d.ts.map +1 -1
- package/lib/typescript/src/Screens/Dynamic/IdentityDocumentEIDScanningScreen.d.ts.map +1 -1
- package/lib/typescript/src/Screens/Dynamic/LivenessDetectionScreen.d.ts.map +1 -1
- package/lib/typescript/src/Screens/Dynamic/VerbalConsentScreen.d.ts +3 -0
- package/lib/typescript/src/Screens/Dynamic/VerbalConsentScreen.d.ts.map +1 -0
- package/lib/typescript/src/Screens/Dynamic/VideoCallScreen.d.ts.map +1 -1
- package/lib/typescript/src/Screens/Static/ResultScreen.d.ts.map +1 -1
- package/lib/typescript/src/Screens/Static/VerificationSessionCheckScreen.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Components/DebugNavigationPanel.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Components/EIDScanner.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.flows.d.ts +1 -1
- package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.flows.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.utils.d.ts +5 -0
- package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.utils.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Components/NavigationManager.d.ts.map +1 -1
- package/lib/typescript/src/Shared/EIDReader/aesSecureMessagingWrapper.d.ts +18 -0
- package/lib/typescript/src/Shared/EIDReader/aesSecureMessagingWrapper.d.ts.map +1 -0
- package/lib/typescript/src/Shared/EIDReader/apduLevelPACECapable.d.ts +23 -0
- package/lib/typescript/src/Shared/EIDReader/apduLevelPACECapable.d.ts.map +1 -0
- package/lib/typescript/src/Shared/EIDReader/bacKey.d.ts +6 -0
- package/lib/typescript/src/Shared/EIDReader/bacKey.d.ts.map +1 -1
- package/lib/typescript/src/Shared/EIDReader/eidReader.d.ts.map +1 -1
- package/lib/typescript/src/Shared/EIDReader/eidService.d.ts +9 -0
- package/lib/typescript/src/Shared/EIDReader/eidService.d.ts.map +1 -1
- package/lib/typescript/src/Shared/EIDReader/nfcManagerCardService.d.ts.map +1 -1
- package/lib/typescript/src/Shared/EIDReader/paceInfo.d.ts +50 -0
- package/lib/typescript/src/Shared/EIDReader/paceInfo.d.ts.map +1 -0
- package/lib/typescript/src/Shared/EIDReader/paceKeySpec.d.ts +30 -0
- package/lib/typescript/src/Shared/EIDReader/paceKeySpec.d.ts.map +1 -0
- package/lib/typescript/src/Shared/EIDReader/protocol/paceAPDUSender.d.ts +17 -0
- package/lib/typescript/src/Shared/EIDReader/protocol/paceAPDUSender.d.ts.map +1 -0
- package/lib/typescript/src/Shared/EIDReader/protocol/paceProtocol.d.ts +105 -0
- package/lib/typescript/src/Shared/EIDReader/protocol/paceProtocol.d.ts.map +1 -0
- package/lib/typescript/src/Shared/EIDReader/protocol/paceResult.d.ts +24 -0
- package/lib/typescript/src/Shared/EIDReader/protocol/paceResult.d.ts.map +1 -0
- package/lib/typescript/src/Shared/EIDReader/secureMessagingWrapper.d.ts +15 -0
- package/lib/typescript/src/Shared/EIDReader/secureMessagingWrapper.d.ts.map +1 -1
- package/lib/typescript/src/Shared/EIDReader/smartcards/commandAPDU.d.ts.map +1 -1
- package/lib/typescript/src/Shared/EIDReader/tlv/tlv.utils.d.ts.map +1 -1
- package/lib/typescript/src/Shared/EIDReader/utils/aesCrypto.utils.d.ts +39 -0
- package/lib/typescript/src/Shared/EIDReader/utils/aesCrypto.utils.d.ts.map +1 -0
- package/lib/typescript/src/Shared/Libs/analytics.utils.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Libs/contains.d.ts +0 -7
- package/lib/typescript/src/Shared/Libs/contains.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Libs/country-display.utils.d.ts +2 -0
- package/lib/typescript/src/Shared/Libs/country-display.utils.d.ts.map +1 -0
- package/lib/typescript/src/Shared/Libs/demo.utils.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Libs/http-client.d.ts +1 -1
- package/lib/typescript/src/Shared/Libs/http-client.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Libs/mrz.utils.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Libs/status-bar.utils.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Types/analytics.types.d.ts +2 -0
- package/lib/typescript/src/Shared/Types/analytics.types.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Types/identificationInfo.d.ts +10 -1
- package/lib/typescript/src/Shared/Types/identificationInfo.d.ts.map +1 -1
- package/lib/typescript/src/Translation/Resources/en.d.ts +40 -1
- package/lib/typescript/src/Translation/Resources/en.d.ts.map +1 -1
- package/lib/typescript/src/Translation/Resources/tr.d.ts +40 -1
- package/lib/typescript/src/Translation/Resources/tr.d.ts.map +1 -1
- package/lib/typescript/src/Trustchex.d.ts.map +1 -1
- package/lib/typescript/src/version.d.ts +1 -1
- package/package.json +7 -4
- package/src/Screens/Debug/NFCScanTestScreen.tsx +692 -0
- package/src/Screens/Dynamic/ContractAcceptanceScreen.tsx +1 -4
- package/src/Screens/Dynamic/IdentityDocumentEIDScanningScreen.tsx +21 -4
- package/src/Screens/Dynamic/LivenessDetectionScreen.tsx +124 -23
- package/src/Screens/Dynamic/VerbalConsentScreen.tsx +1401 -0
- package/src/Screens/Dynamic/VideoCallScreen.tsx +3 -1
- package/src/Screens/Static/ResultScreen.tsx +183 -31
- package/src/Screens/Static/VerificationSessionCheckScreen.tsx +9 -0
- package/src/Shared/Animations/recording.json +1 -0
- package/src/Shared/Components/DebugNavigationPanel.tsx +73 -48
- package/src/Shared/Components/EIDScanner.tsx +222 -111
- package/src/Shared/Components/IdentityDocumentCamera.flows.ts +7 -4
- package/src/Shared/Components/IdentityDocumentCamera.tsx +199 -184
- package/src/Shared/Components/IdentityDocumentCamera.utils.ts +13 -4
- package/src/Shared/Components/NavigationManager.tsx +27 -18
- package/src/Shared/EIDReader/aesSecureMessagingWrapper.ts +69 -0
- package/src/Shared/EIDReader/apduLevelPACECapable.ts +34 -0
- package/src/Shared/EIDReader/bacKey.ts +24 -8
- package/src/Shared/EIDReader/eidReader.ts +398 -12
- package/src/Shared/EIDReader/eidService.ts +49 -1
- package/src/Shared/EIDReader/nfcManagerCardService.ts +4 -6
- package/src/Shared/EIDReader/paceInfo.ts +159 -0
- package/src/Shared/EIDReader/paceKeySpec.ts +56 -0
- package/src/Shared/EIDReader/protocol/paceAPDUSender.ts +163 -0
- package/src/Shared/EIDReader/protocol/paceProtocol.ts +946 -0
- package/src/Shared/EIDReader/protocol/paceResult.ts +62 -0
- package/src/Shared/EIDReader/secureMessagingWrapper.ts +28 -10
- package/src/Shared/EIDReader/smartcards/commandAPDU.ts +2 -1
- package/src/Shared/EIDReader/tlv/tlv.helpers.ts +1 -1
- package/src/Shared/EIDReader/tlv/tlv.utils.ts +8 -5
- package/src/Shared/EIDReader/utils/aesCrypto.utils.ts +217 -0
- package/src/Shared/Libs/analytics.utils.ts +4 -0
- package/src/Shared/Libs/contains.ts +0 -53
- package/src/Shared/Libs/country-display.utils.ts +55 -0
- package/src/Shared/Libs/crypto.utils.ts +2 -2
- package/src/Shared/Libs/demo.utils.ts +10 -0
- package/src/Shared/Libs/http-client.ts +12 -4
- package/src/Shared/Libs/mrz.utils.ts +3 -2
- package/src/Shared/Libs/status-bar.utils.ts +4 -2
- package/src/Shared/Services/VideoSessionService.ts +1 -1
- package/src/Shared/Types/analytics.types.ts +2 -0
- package/src/Shared/Types/identificationInfo.ts +11 -0
- package/src/Translation/Resources/en.ts +63 -3
- package/src/Translation/Resources/tr.ts +62 -3
- package/src/Trustchex.tsx +53 -17
- package/src/version.ts +1 -1
|
@@ -63,7 +63,9 @@ const VideoCallScreen = ({ navigation }: any) => {
|
|
|
63
63
|
} else {
|
|
64
64
|
// Guide screen with white background - use dark icons
|
|
65
65
|
StatusBar.setBarStyle('dark-content', true);
|
|
66
|
-
|
|
66
|
+
if (Platform.OS === 'android') {
|
|
67
|
+
StatusBar.setBackgroundColor('#ffffff', true);
|
|
68
|
+
}
|
|
67
69
|
}
|
|
68
70
|
}, [hasGuideShown]);
|
|
69
71
|
const serviceRef = useRef<WebRTCService | null>(null);
|
|
@@ -25,12 +25,14 @@ import type {
|
|
|
25
25
|
IdentificationInfo,
|
|
26
26
|
LivenessDetection,
|
|
27
27
|
ScannedIdentityDocument,
|
|
28
|
+
VerbalConsentVideo,
|
|
28
29
|
} from '../../Shared/Types/identificationInfo';
|
|
29
30
|
import { runWithRetry } from '../../Shared/Libs/promise.utils';
|
|
30
31
|
import { useStatusBarWhiteBackground } from '../../Shared/Libs/status-bar.utils';
|
|
31
32
|
import NavigationManager, {
|
|
32
33
|
type NavigationManagerRef,
|
|
33
34
|
} from '../../Shared/Components/NavigationManager';
|
|
35
|
+
import { getLocalizedCountryName } from '../../Shared/Libs/country-display.utils';
|
|
34
36
|
import mrzUtils from '../../Shared/Libs/mrz.utils';
|
|
35
37
|
import { useTranslation } from 'react-i18next';
|
|
36
38
|
import { Video as VideoCompressor } from 'react-native-compressor';
|
|
@@ -54,9 +56,10 @@ const ResultScreen = () => {
|
|
|
54
56
|
const [isSubmitting, setIsSubmitting] = useState(false);
|
|
55
57
|
const [progress, setProgress] = useState(0);
|
|
56
58
|
const navigationManagerRef = React.useRef<NavigationManagerRef>(null);
|
|
59
|
+
const hasSubmittedRef = React.useRef(false);
|
|
57
60
|
const [shouldShowDemoData, setShouldShowDemoData] = useState(false);
|
|
58
61
|
const [deviceIdentifier, setDeviceIdentifier] = useState<string>('');
|
|
59
|
-
const { t } = useTranslation();
|
|
62
|
+
const { t, i18n } = useTranslation();
|
|
60
63
|
const insets = useSafeAreaInsets();
|
|
61
64
|
|
|
62
65
|
// Track screen view and exit
|
|
@@ -76,7 +79,7 @@ const ResultScreen = () => {
|
|
|
76
79
|
const dd = dateStr.substring(4, 6);
|
|
77
80
|
|
|
78
81
|
// Assume 19xx if YY >= 50, else 20xx
|
|
79
|
-
const year = parseInt(yy) >= 50 ? `19${yy}` : `20${yy}`;
|
|
82
|
+
const year = parseInt(yy, 10) >= 50 ? `19${yy}` : `20${yy}`;
|
|
80
83
|
return `${dd}/${mm}/${year}`;
|
|
81
84
|
}
|
|
82
85
|
|
|
@@ -95,6 +98,40 @@ const ResultScreen = () => {
|
|
|
95
98
|
}
|
|
96
99
|
}, []);
|
|
97
100
|
|
|
101
|
+
const formatGender = useCallback(
|
|
102
|
+
(code?: string | null) => {
|
|
103
|
+
switch (code?.toUpperCase()) {
|
|
104
|
+
case 'M':
|
|
105
|
+
return t('eidScannerScreen.genderMale');
|
|
106
|
+
case 'F':
|
|
107
|
+
return t('eidScannerScreen.genderFemale');
|
|
108
|
+
default:
|
|
109
|
+
return t('eidScannerScreen.genderUnspecified');
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
[t]
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
const formatDocumentType = useCallback(
|
|
116
|
+
(code?: string | null) => {
|
|
117
|
+
if (!code) return '';
|
|
118
|
+
const upper = code.toUpperCase();
|
|
119
|
+
if (upper.startsWith('P')) return t('eidScannerScreen.docTypePassport');
|
|
120
|
+
if (upper.startsWith('I')) return t('eidScannerScreen.docTypeID');
|
|
121
|
+
if (upper.startsWith('A')) return t('eidScannerScreen.docTypeResidence');
|
|
122
|
+
if (upper.startsWith('V')) return t('eidScannerScreen.docTypeVisa');
|
|
123
|
+
return code;
|
|
124
|
+
},
|
|
125
|
+
[t]
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
const formatNationality = useCallback(
|
|
129
|
+
(code?: string | null) => {
|
|
130
|
+
return getLocalizedCountryName(code, i18n.language);
|
|
131
|
+
},
|
|
132
|
+
[i18n.language]
|
|
133
|
+
);
|
|
134
|
+
|
|
98
135
|
const apiUrl = useMemo(
|
|
99
136
|
() => `${appContext.baseUrl}/api/app/mobile`,
|
|
100
137
|
[appContext.baseUrl]
|
|
@@ -192,22 +229,22 @@ const ResultScreen = () => {
|
|
|
192
229
|
throw new Error('MRZ fields not found');
|
|
193
230
|
}
|
|
194
231
|
|
|
232
|
+
// Backend payload must contain raw MRZ data only.
|
|
233
|
+
// Human-friendly formatting is strictly for UI rendering paths.
|
|
234
|
+
const rawMrzFields = scannedDocument.mrzFields;
|
|
235
|
+
|
|
195
236
|
const identificationDocument = {
|
|
196
|
-
type:
|
|
197
|
-
name:
|
|
198
|
-
surname:
|
|
199
|
-
gender: getGenderEnumType(
|
|
200
|
-
number:
|
|
201
|
-
country:
|
|
237
|
+
type: rawMrzFields.documentCode,
|
|
238
|
+
name: rawMrzFields.firstName,
|
|
239
|
+
surname: rawMrzFields.lastName,
|
|
240
|
+
gender: getGenderEnumType(rawMrzFields.sex),
|
|
241
|
+
number: rawMrzFields.documentNumber,
|
|
242
|
+
country: rawMrzFields.issuingState,
|
|
202
243
|
barcodeValue: scannedDocument.barcodeValue,
|
|
203
|
-
personalNumber:
|
|
204
|
-
|
|
205
|
-
scannedDocument.mrzFields.optional1,
|
|
206
|
-
birthDate: mrzUtils.convertMRZDateToISODate(
|
|
207
|
-
scannedDocument.mrzFields.birthDate
|
|
208
|
-
),
|
|
244
|
+
personalNumber: rawMrzFields.personalNumber || rawMrzFields.optional1,
|
|
245
|
+
birthDate: mrzUtils.convertMRZDateToISODate(rawMrzFields.birthDate),
|
|
209
246
|
expiryDate: mrzUtils.convertMRZDateToISODate(
|
|
210
|
-
|
|
247
|
+
rawMrzFields.expirationDate
|
|
211
248
|
),
|
|
212
249
|
dataSource: scannedDocument.dataSource,
|
|
213
250
|
mrzText: scannedDocument.mrzText,
|
|
@@ -301,7 +338,9 @@ const ResultScreen = () => {
|
|
|
301
338
|
const extension =
|
|
302
339
|
scannedIdentityDocument.faceImageMimeType === 'image/jp2'
|
|
303
340
|
? 'jp2'
|
|
304
|
-
: '
|
|
341
|
+
: scannedIdentityDocument.faceImageMimeType === 'image/png'
|
|
342
|
+
? 'png'
|
|
343
|
+
: 'jpg';
|
|
305
344
|
await RNFS.writeFile(
|
|
306
345
|
decodeURIComponent(
|
|
307
346
|
`${RNFS.TemporaryDirectoryPath}/FACE_IMAGE.${extension}`
|
|
@@ -392,10 +431,9 @@ const ResultScreen = () => {
|
|
|
392
431
|
if (livenessVideoPath) {
|
|
393
432
|
let videoFilePath: string;
|
|
394
433
|
if (Platform.OS === 'ios') {
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
videoFilePath = `${RNFS.TemporaryDirectoryPath}/${new Date().getTime()}/LIVENESS_VIDEO.mp4`;
|
|
434
|
+
const tmpTimestamp = new Date().getTime();
|
|
435
|
+
await RNFS.mkdir(`${RNFS.TemporaryDirectoryPath}/${tmpTimestamp}`);
|
|
436
|
+
videoFilePath = `${RNFS.TemporaryDirectoryPath}/${tmpTimestamp}/LIVENESS_VIDEO.mp4`;
|
|
399
437
|
} else {
|
|
400
438
|
videoFilePath = `${RNFS.TemporaryDirectoryPath}/LIVENESS_VIDEO.mp4`;
|
|
401
439
|
}
|
|
@@ -428,6 +466,10 @@ const ResultScreen = () => {
|
|
|
428
466
|
}
|
|
429
467
|
}
|
|
430
468
|
|
|
469
|
+
if (uploadFileOptions.files.length === 0) {
|
|
470
|
+
return;
|
|
471
|
+
}
|
|
472
|
+
|
|
431
473
|
const response = await RNFS.uploadFiles(uploadFileOptions).promise;
|
|
432
474
|
|
|
433
475
|
if (![200, 201, 204].includes(response.statusCode)) {
|
|
@@ -437,6 +479,68 @@ const ResultScreen = () => {
|
|
|
437
479
|
[apiUrl]
|
|
438
480
|
);
|
|
439
481
|
|
|
482
|
+
const uploadVerbalConsentVideos = useCallback(
|
|
483
|
+
async (
|
|
484
|
+
identificationId: string,
|
|
485
|
+
verbalConsentVideos?: VerbalConsentVideo[]
|
|
486
|
+
) => {
|
|
487
|
+
if (!verbalConsentVideos?.length) {
|
|
488
|
+
return;
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
for (const consentVideo of verbalConsentVideos) {
|
|
492
|
+
const normalizedPath = consentVideo.videoPath.replace('file://', '');
|
|
493
|
+
let targetPath: string;
|
|
494
|
+
if (Platform.OS === 'ios') {
|
|
495
|
+
const tmpTimestamp = new Date().getTime();
|
|
496
|
+
await RNFS.mkdir(`${RNFS.TemporaryDirectoryPath}/${tmpTimestamp}`);
|
|
497
|
+
targetPath = `${RNFS.TemporaryDirectoryPath}/${tmpTimestamp}/VERBAL_CONSENT_VIDEO.mp4`;
|
|
498
|
+
} else {
|
|
499
|
+
targetPath = `${RNFS.TemporaryDirectoryPath}/VERBAL_CONSENT_VIDEO.mp4`;
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
await RNFS.copyFile(normalizedPath, targetPath);
|
|
503
|
+
|
|
504
|
+
const compressedVideoPath = await VideoCompressor.compress(targetPath, {
|
|
505
|
+
compressionMethod: 'manual',
|
|
506
|
+
bitrate: 500000, // 500 kbps
|
|
507
|
+
maxSize: 1280, // HD 720p
|
|
508
|
+
minimumFileSizeForCompress: 0, // Always compress
|
|
509
|
+
});
|
|
510
|
+
|
|
511
|
+
const compressedNormalizedPath = compressedVideoPath.replace(
|
|
512
|
+
'file://',
|
|
513
|
+
''
|
|
514
|
+
);
|
|
515
|
+
|
|
516
|
+
const response = await RNFS.uploadFiles({
|
|
517
|
+
toUrl: `${apiUrl}/identifications/${identificationId}/media`,
|
|
518
|
+
method: 'POST',
|
|
519
|
+
headers: {
|
|
520
|
+
Accept: 'application/json',
|
|
521
|
+
},
|
|
522
|
+
fields: {
|
|
523
|
+
consentTitle: consentVideo.title,
|
|
524
|
+
consentText: consentVideo.text,
|
|
525
|
+
},
|
|
526
|
+
files: [
|
|
527
|
+
{
|
|
528
|
+
name: 'files',
|
|
529
|
+
filename: 'VERBAL_CONSENT_VIDEO.mp4',
|
|
530
|
+
filepath: compressedNormalizedPath,
|
|
531
|
+
filetype: 'video/mp4',
|
|
532
|
+
},
|
|
533
|
+
],
|
|
534
|
+
}).promise;
|
|
535
|
+
|
|
536
|
+
if (![200, 201, 204].includes(response.statusCode)) {
|
|
537
|
+
throw new Error('Verbal consent video upload failed');
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
},
|
|
541
|
+
[apiUrl]
|
|
542
|
+
);
|
|
543
|
+
|
|
440
544
|
const submit = useCallback(
|
|
441
545
|
async (identificationInfo: IdentificationInfo) => {
|
|
442
546
|
try {
|
|
@@ -489,6 +593,13 @@ const ResultScreen = () => {
|
|
|
489
593
|
)
|
|
490
594
|
);
|
|
491
595
|
}
|
|
596
|
+
|
|
597
|
+
await runWithRetry(() =>
|
|
598
|
+
uploadVerbalConsentVideos(
|
|
599
|
+
identificationId,
|
|
600
|
+
identificationInfo.verbalConsentVideos
|
|
601
|
+
)
|
|
602
|
+
);
|
|
492
603
|
setProgress(90);
|
|
493
604
|
|
|
494
605
|
await runWithRetry(() =>
|
|
@@ -546,6 +657,7 @@ const ResultScreen = () => {
|
|
|
546
657
|
createIdentification,
|
|
547
658
|
apiUrl,
|
|
548
659
|
uploadIdentificationMedia,
|
|
660
|
+
uploadVerbalConsentVideos,
|
|
549
661
|
finishIdentification,
|
|
550
662
|
submitIdentificationDocument,
|
|
551
663
|
submitIdentificationConsent,
|
|
@@ -558,8 +670,10 @@ const ResultScreen = () => {
|
|
|
558
670
|
if (
|
|
559
671
|
appContext.identificationInfo &&
|
|
560
672
|
!appContext.isDemoSession &&
|
|
561
|
-
!appContext.isTestVideoSession
|
|
673
|
+
!appContext.isTestVideoSession &&
|
|
674
|
+
!hasSubmittedRef.current
|
|
562
675
|
) {
|
|
676
|
+
hasSubmittedRef.current = true;
|
|
563
677
|
submit(appContext.identificationInfo);
|
|
564
678
|
}
|
|
565
679
|
}, [
|
|
@@ -636,10 +750,10 @@ const ResultScreen = () => {
|
|
|
636
750
|
{t('eidScannerScreen.documentCode')}:
|
|
637
751
|
</Text>
|
|
638
752
|
<Text style={styles.mrzInfoText}>
|
|
639
|
-
{
|
|
753
|
+
{formatDocumentType(
|
|
640
754
|
appContext.identificationInfo.scannedDocument
|
|
641
755
|
.mrzFields?.documentCode
|
|
642
|
-
}
|
|
756
|
+
)}
|
|
643
757
|
</Text>
|
|
644
758
|
</View>
|
|
645
759
|
<View style={styles.mrzInfoItem}>
|
|
@@ -647,10 +761,12 @@ const ResultScreen = () => {
|
|
|
647
761
|
{t('eidScannerScreen.nationality')}:
|
|
648
762
|
</Text>
|
|
649
763
|
<Text style={styles.mrzInfoText}>
|
|
650
|
-
{
|
|
764
|
+
{formatNationality(
|
|
651
765
|
appContext.identificationInfo.scannedDocument
|
|
652
|
-
.mrzFields?.
|
|
653
|
-
|
|
766
|
+
.mrzFields?.nationality ||
|
|
767
|
+
appContext.identificationInfo.scannedDocument
|
|
768
|
+
.mrzFields?.issuingState
|
|
769
|
+
)}
|
|
654
770
|
</Text>
|
|
655
771
|
</View>
|
|
656
772
|
<View style={styles.mrzInfoItem}>
|
|
@@ -713,10 +829,10 @@ const ResultScreen = () => {
|
|
|
713
829
|
{t('eidScannerScreen.gender')}:
|
|
714
830
|
</Text>
|
|
715
831
|
<Text style={styles.mrzInfoText}>
|
|
716
|
-
{
|
|
832
|
+
{formatGender(
|
|
717
833
|
appContext.identificationInfo.scannedDocument
|
|
718
834
|
.mrzFields?.sex
|
|
719
|
-
}
|
|
835
|
+
)}
|
|
720
836
|
</Text>
|
|
721
837
|
</View>
|
|
722
838
|
<View style={styles.mrzInfoItem}>
|
|
@@ -918,6 +1034,41 @@ const ResultScreen = () => {
|
|
|
918
1034
|
</ScrollView>
|
|
919
1035
|
</>
|
|
920
1036
|
)}
|
|
1037
|
+
|
|
1038
|
+
{!!appContext.identificationInfo.verbalConsentVideos
|
|
1039
|
+
?.length && (
|
|
1040
|
+
<>
|
|
1041
|
+
<Text style={styles.sectionHeader}>
|
|
1042
|
+
{t('resultScreen.demoVerbalConsent')}
|
|
1043
|
+
</Text>
|
|
1044
|
+
{appContext.identificationInfo.verbalConsentVideos.map(
|
|
1045
|
+
(consentVideo, index) => (
|
|
1046
|
+
<View key={`${consentVideo.videoPath}-${index}`}>
|
|
1047
|
+
<Text style={styles.sectionText}>
|
|
1048
|
+
{t('resultScreen.demoVerbalConsentTitle')}:{' '}
|
|
1049
|
+
{consentVideo.title}
|
|
1050
|
+
</Text>
|
|
1051
|
+
<Text style={styles.sectionText}>
|
|
1052
|
+
{t('resultScreen.demoVerbalConsentText')}:{' '}
|
|
1053
|
+
{consentVideo.text}
|
|
1054
|
+
</Text>
|
|
1055
|
+
<Text style={styles.sectionText}>
|
|
1056
|
+
{t('resultScreen.demoVideo')}
|
|
1057
|
+
</Text>
|
|
1058
|
+
<Video
|
|
1059
|
+
source={{
|
|
1060
|
+
uri: consentVideo.videoPath,
|
|
1061
|
+
}}
|
|
1062
|
+
resizeMode="contain"
|
|
1063
|
+
style={styles.video}
|
|
1064
|
+
controls={true}
|
|
1065
|
+
muted={false}
|
|
1066
|
+
/>
|
|
1067
|
+
</View>
|
|
1068
|
+
)
|
|
1069
|
+
)}
|
|
1070
|
+
</>
|
|
1071
|
+
)}
|
|
921
1072
|
</View>
|
|
922
1073
|
</ScrollView>
|
|
923
1074
|
<View style={{ paddingBottom: insets.bottom }}>
|
|
@@ -1008,9 +1159,10 @@ const styles = StyleSheet.create({
|
|
|
1008
1159
|
},
|
|
1009
1160
|
image: {
|
|
1010
1161
|
width: 100,
|
|
1011
|
-
height:
|
|
1012
|
-
objectFit: '
|
|
1013
|
-
borderRadius:
|
|
1162
|
+
height: 140,
|
|
1163
|
+
objectFit: 'cover',
|
|
1164
|
+
borderRadius: 12,
|
|
1165
|
+
overflow: 'hidden',
|
|
1014
1166
|
},
|
|
1015
1167
|
imageItem: {
|
|
1016
1168
|
display: 'flex',
|
|
@@ -164,6 +164,11 @@ const VerificationSessionCheckScreen = () => {
|
|
|
164
164
|
appContextRef.current = appContext;
|
|
165
165
|
|
|
166
166
|
useEffect(() => {
|
|
167
|
+
// Skip session check when navigated from debug panel — the debug panel
|
|
168
|
+
// already set up workflowSteps and currentWorkflowStep directly.
|
|
169
|
+
if (appContext.isDebugNavigated) {
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
167
172
|
const sid = appContext.identificationInfo.sessionId;
|
|
168
173
|
if (!sid || checkedSessionIdRef.current === sid) {
|
|
169
174
|
return;
|
|
@@ -278,6 +283,10 @@ const VerificationSessionCheckScreen = () => {
|
|
|
278
283
|
const sessionResponse =
|
|
279
284
|
await getSessionByCode(alphanumericText);
|
|
280
285
|
if (sessionResponse?.id) {
|
|
286
|
+
// Mark as checked before setting sessionId to prevent
|
|
287
|
+
// the useEffect from triggering a duplicate navigation.
|
|
288
|
+
checkedSessionIdRef.current = sessionResponse.id;
|
|
289
|
+
|
|
281
290
|
if (appContext.setSessionId) {
|
|
282
291
|
appContext.setSessionId(sessionResponse.id);
|
|
283
292
|
} else {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"v":"5.5.2","fr":29.9700012207031,"ip":0,"op":60.0000024438501,"w":488,"h":488,"nm":"recording spectrum_MAIN","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[360.5,249,0],"ix":2},"a":{"a":0,"k":[-73,8.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":0,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":5,"s":[30,163]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":10,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":15,"s":[30,45]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":20,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":25,"s":[30,104]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":30,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":35,"s":[30,42]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":40,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":45,"s":[30,83]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":50,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":55,"s":[30,37]},{"t":60.0000024438501,"s":[30,100]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.20392156862745098,0.22745098039215686,0.25098039215686274,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.20392156862745098,0.22745098039215686,0.25098039215686274,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-73.472,8.472],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60.0000024438501,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[300.5,249,0],"ix":2},"a":{"a":0,"k":[-73,8.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":0,"s":[30,63]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":5,"s":[30,211]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":10,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":15,"s":[30,128]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":20,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":25,"s":[30,160]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":30,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":35,"s":[30,126]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":40,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":45,"s":[30,154]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":50,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":55,"s":[30,83]},{"t":60.0000024438501,"s":[30,63]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.20392156862745098,0.22745098039215686,0.25098039215686274,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.20392156862745098,0.22745098039215686,0.25098039215686274,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-73.472,8.472],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[30,63],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60.0000024438501,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[240.5,249,0],"ix":2},"a":{"a":0,"k":[-73,8.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":0,"s":[30,63]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":5,"s":[30,155]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":10,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":15,"s":[30,91]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":20,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":25,"s":[30,186]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":30,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":35,"s":[30,256]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":40,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":45,"s":[30,209]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":50,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":55,"s":[30,124]},{"t":60.0000024438501,"s":[30,63]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.20392156862745098,0.22745098039215686,0.25098039215686274,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.20392156862745098,0.22745098039215686,0.25098039215686274,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-73.472,8.472],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[30,63],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60.0000024438501,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[180.5,249,0],"ix":2},"a":{"a":0,"k":[-73,8.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":0,"s":[30,63]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":5,"s":[30,83]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":10,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":15,"s":[30,154]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":20,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":25,"s":[30,126]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":30,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":35,"s":[30,160]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":40,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":45,"s":[30,128]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":50,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":55,"s":[30,211]},{"t":60.0000024438501,"s":[30,63]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.20392156862745098,0.22745098039215686,0.25098039215686274,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.20392156862745098,0.22745098039215686,0.25098039215686274,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-73.472,8.472],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[30,63],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60.0000024438501,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[120.5,249,0],"ix":2},"a":{"a":0,"k":[-73,8.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":0,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":5,"s":[30,37]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":10,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":15,"s":[30,83]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":20,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":25,"s":[30,42]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":30,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":35,"s":[30,104]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":40,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":45,"s":[30,45]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":50,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":55,"s":[30,163]},{"t":60.0000024438501,"s":[30,100]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.20392156862745098,0.22745098039215686,0.25098039215686274,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.20392156862745098,0.22745098039215686,0.25098039215686274,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-73.472,8.472],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60.0000024438501,"st":0,"bm":0}],"markers":[]}
|