@trustchex/react-native-sdk 1.486.0 → 1.488.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/lib/module/Shared/Components/EIDScanner.js +97 -37
- package/lib/module/Shared/Components/IdentityDocumentCamera.constants.js +9 -1
- package/lib/module/Shared/EIDReader/cardFileInputStream.js +25 -2
- package/lib/module/Shared/EIDReader/defaultFileSystem.js +56 -6
- package/lib/module/Shared/EIDReader/eidReader.js +124 -14
- package/lib/module/Shared/EIDReader/lds/icao/dg11File.js +23 -6
- package/lib/module/Shared/EIDReader/nfcManagerCardService.js +79 -9
- package/lib/module/Shared/EIDReader/protocol/paceDH.js +101 -0
- package/lib/module/Shared/EIDReader/protocol/paceErrors.js +34 -0
- package/lib/module/Shared/EIDReader/protocol/paceProtocol.js +53 -4
- package/lib/module/Shared/EIDReader/protocol/readBinaryAPDUSender.js +7 -3
- package/lib/module/Shared/Libs/country-display.utils.js +13 -1
- package/lib/module/Shared/Libs/diagnosticReport.js +24 -1
- package/lib/module/Shared/Libs/diagnostics.js +30 -8
- package/lib/module/Shared/Libs/mrz.utils.js +172 -25
- package/lib/module/Shared/Libs/mrzFrameAggregator.js +29 -1
- package/lib/module/Shared/Libs/mrzTransliteration.js +14 -1
- package/lib/module/Translation/Resources/en.js +12 -0
- package/lib/module/Translation/Resources/tr.js +12 -0
- package/lib/module/version.js +1 -1
- package/lib/typescript/src/Shared/Components/EIDScanner.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.constants.d.ts.map +1 -1
- package/lib/typescript/src/Shared/EIDReader/cardFileInputStream.d.ts +3 -0
- package/lib/typescript/src/Shared/EIDReader/cardFileInputStream.d.ts.map +1 -1
- package/lib/typescript/src/Shared/EIDReader/defaultFileSystem.d.ts +4 -0
- package/lib/typescript/src/Shared/EIDReader/defaultFileSystem.d.ts.map +1 -1
- package/lib/typescript/src/Shared/EIDReader/eidReader.d.ts.map +1 -1
- package/lib/typescript/src/Shared/EIDReader/lds/icao/dg11File.d.ts.map +1 -1
- package/lib/typescript/src/Shared/EIDReader/nfcManagerCardService.d.ts +9 -1
- package/lib/typescript/src/Shared/EIDReader/nfcManagerCardService.d.ts.map +1 -1
- package/lib/typescript/src/Shared/EIDReader/protocol/paceDH.d.ts +56 -0
- package/lib/typescript/src/Shared/EIDReader/protocol/paceDH.d.ts.map +1 -0
- package/lib/typescript/src/Shared/EIDReader/protocol/paceErrors.d.ts +26 -0
- package/lib/typescript/src/Shared/EIDReader/protocol/paceErrors.d.ts.map +1 -0
- package/lib/typescript/src/Shared/EIDReader/protocol/paceProtocol.d.ts.map +1 -1
- package/lib/typescript/src/Shared/EIDReader/protocol/readBinaryAPDUSender.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Libs/country-display.utils.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Libs/diagnosticReport.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Libs/diagnostics.d.ts +9 -1
- package/lib/typescript/src/Shared/Libs/diagnostics.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Libs/mrz.utils.d.ts +1 -0
- package/lib/typescript/src/Shared/Libs/mrz.utils.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Libs/mrzFrameAggregator.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Libs/mrzTransliteration.d.ts.map +1 -1
- package/lib/typescript/src/Translation/Resources/en.d.ts +12 -0
- package/lib/typescript/src/Translation/Resources/en.d.ts.map +1 -1
- package/lib/typescript/src/Translation/Resources/tr.d.ts +12 -0
- package/lib/typescript/src/Translation/Resources/tr.d.ts.map +1 -1
- package/lib/typescript/src/version.d.ts +1 -1
- package/package.json +1 -1
- package/src/Shared/Components/EIDScanner.tsx +149 -68
- package/src/Shared/Components/IdentityDocumentCamera.constants.ts +9 -1
- package/src/Shared/EIDReader/cardFileInputStream.ts +30 -6
- package/src/Shared/EIDReader/defaultFileSystem.ts +75 -17
- package/src/Shared/EIDReader/eidReader.ts +154 -21
- package/src/Shared/EIDReader/lds/icao/dg11File.ts +28 -13
- package/src/Shared/EIDReader/nfcManagerCardService.ts +91 -13
- package/src/Shared/EIDReader/protocol/paceDH.ts +183 -0
- package/src/Shared/EIDReader/protocol/paceErrors.ts +41 -0
- package/src/Shared/EIDReader/protocol/paceProtocol.ts +72 -6
- package/src/Shared/EIDReader/protocol/readBinaryAPDUSender.ts +7 -4
- package/src/Shared/Libs/country-display.utils.ts +12 -1
- package/src/Shared/Libs/diagnosticReport.ts +32 -1
- package/src/Shared/Libs/diagnostics.ts +38 -14
- package/src/Shared/Libs/mrz.utils.ts +193 -28
- package/src/Shared/Libs/mrzFrameAggregator.ts +38 -3
- package/src/Shared/Libs/mrzTransliteration.ts +16 -3
- package/src/Translation/Resources/en.ts +19 -0
- package/src/Translation/Resources/tr.ts +19 -0
- package/src/version.ts +1 -1
|
@@ -14,6 +14,37 @@ const RECOVERY_BUDGET_MS = 80;
|
|
|
14
14
|
let recoveryDeadline = 0;
|
|
15
15
|
const recoveryExpired = () => Date.now() > recoveryDeadline;
|
|
16
16
|
|
|
17
|
+
/**
|
|
18
|
+
* Reduce an ICAO document code to the single canonical class char the rest of the
|
|
19
|
+
* app keys off of: `'P'` for any passport (`P`, `P<`, `PP`, `PD`, `PS`, `PO`, …)
|
|
20
|
+
* and `'I'` for any identity card (`I`, `ID`, `IR`, `AC`, `C`, …). The full
|
|
21
|
+
* subtype is informative but every downstream check is `=== 'I'` / `=== 'P'`, so
|
|
22
|
+
* carrying `PP`/`ID` here only mis-classifies the document (German passport `PP`
|
|
23
|
+
* → UNKNOWN). The chip/NFC path keeps the raw code; this normalizes the OCR path.
|
|
24
|
+
*/
|
|
25
|
+
const normalizeDocumentCode = code => {
|
|
26
|
+
if (!code) return null;
|
|
27
|
+
const c = code.toUpperCase();
|
|
28
|
+
if (c[0] === 'P') return 'P';
|
|
29
|
+
// TD1/TD2 identity documents: I, ID, IR, AC, AR, C, etc. — all reduce to 'I'.
|
|
30
|
+
return 'I';
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Strip MRZ filler characters from a human-readable text field. In the MRZ a
|
|
35
|
+
* single `<` separates words and `<<` separates components; the `mrz` package
|
|
36
|
+
* usually trims trailing fillers but can leave embedded `<`/`<<` in name and
|
|
37
|
+
* optional-data fields, which then surfaced raw in the UI (e.g.
|
|
38
|
+
* "ANNA<<MARIA"). Convert any filler run to a single space and trim, so the
|
|
39
|
+
* displayed value reads "ANNA MARIA". Returns null for empty/filler-only input.
|
|
40
|
+
* Only for text fields — never call on dates, sex, codes, or check digits.
|
|
41
|
+
*/
|
|
42
|
+
const cleanMRZTextField = value => {
|
|
43
|
+
if (!value) return null;
|
|
44
|
+
const cleaned = value.replace(/</g, ' ').replace(/\s+/g, ' ').trim();
|
|
45
|
+
return cleaned.length > 0 ? cleaned : null;
|
|
46
|
+
};
|
|
47
|
+
|
|
17
48
|
/**
|
|
18
49
|
* Pads a TD1 line to the fixed 30-char width.
|
|
19
50
|
*
|
|
@@ -271,32 +302,132 @@ const reconstructMRZCandidates = rawText => {
|
|
|
271
302
|
const flat = ocrLines.join('');
|
|
272
303
|
const pad = (s, len) => s.length >= len ? s.slice(0, len) : s.padEnd(len, '<');
|
|
273
304
|
|
|
274
|
-
//
|
|
275
|
-
//
|
|
276
|
-
//
|
|
277
|
-
|
|
305
|
+
// Repair the document-subtype character (line 1, position 2). For TD1/TD2 IDs
|
|
306
|
+
// this is usually "<" and OCR may read it as "K"; collapse that misread back to
|
|
307
|
+
// "<". But for PASSPORTS position 2 is a real subtype LETTER (German ordinary
|
|
308
|
+
// passports are "PP", and "PC"/"PD"/"PR"/… exist) — it must NOT be rewritten,
|
|
309
|
+
// or the whole line shifts right and validation fails. So only normalise a "K"
|
|
310
|
+
// misread (→ "<"); leave any other letter/filler exactly as read.
|
|
311
|
+
const fixDocStart = s => s.replace(/^([ACIPV])([A-Z0-9<])/, (_m, code, next) => next === 'K' ? code + '<' : code + next);
|
|
278
312
|
const candidates = [];
|
|
279
313
|
|
|
280
314
|
// Helper: the OCR line that actually starts the MRZ (doc code + state pattern),
|
|
281
315
|
// so title/front-of-card text mixed into the blob can't create a false anchor.
|
|
282
316
|
const docLine = ocrLines.find(l => /^[ACIPV][A-Z0-9<]{3,}<</.test(l));
|
|
283
317
|
|
|
318
|
+
// Passport/TD-x line-2 signature: docNumber(9) + check + nationality(3) +
|
|
319
|
+
// birth(6)+check+sex+expiry(6)+check… Allow letters in the nationality and
|
|
320
|
+
// date spans (OCR reads 0↔O, 1↔I, etc.); the check-digit recovery downstream
|
|
321
|
+
// resolves them. A too-strict [A-Z]{3}/[0-9]{6} here was dropping the whole
|
|
322
|
+
// TD3/TD2 candidate on any noisy frame, leaving only a (wrong) 3-line TD1.
|
|
323
|
+
const td23Line2 = /[A-Z0-9<]{9}[0-9<][A-Z<]{3}[A-Z0-9<]{6}[0-9<][MF<][A-Z0-9<]{6}[0-9<]/;
|
|
324
|
+
|
|
325
|
+
// LINE-AWARE line-2 finder. Real ML Kit OCR (a) prepends non-MRZ header text
|
|
326
|
+
// and (b) SPLITS a long MRZ line at its trailing filler run into two OCR lines
|
|
327
|
+
// (e.g. "…1204159<<<<<" + "<<<<<08"). The flat-blob approach loses line
|
|
328
|
+
// boundaries — a greedy line-1 match overruns into line 2, and the line-2
|
|
329
|
+
// regex can match a doc-number-shaped run inside line 1's name field. So work
|
|
330
|
+
// from `ocrLines`: find the doc-number record line, and if it's short (split),
|
|
331
|
+
// stitch following fragment lines onto it up to the format width. The check
|
|
332
|
+
// digits (incl. the trailing composite) then survive instead of being padded
|
|
333
|
+
// away. Returns null if no doc-number line exists at/after the line-1 index.
|
|
334
|
+
// Local 7-3-1 check digit (icaoCheckDigit is defined later in the module).
|
|
335
|
+
const cd731 = str => {
|
|
336
|
+
const w = [7, 3, 1];
|
|
337
|
+
let sum = 0;
|
|
338
|
+
for (let i = 0; i < str.length; i++) {
|
|
339
|
+
const c = str[i];
|
|
340
|
+
const v = c === '<' ? 0 : c >= '0' && c <= '9' ? c.charCodeAt(0) - 48 : c.charCodeAt(0) - 55;
|
|
341
|
+
sum = (sum + w[i % 3] * v) % 10;
|
|
342
|
+
}
|
|
343
|
+
return String(sum);
|
|
344
|
+
};
|
|
345
|
+
const findLine2 = (l1Index, width) => {
|
|
346
|
+
for (let i = l1Index + 1; i < ocrLines.length; i++) {
|
|
347
|
+
const m = td23Line2.exec(ocrLines[i]);
|
|
348
|
+
if (!m || m.index !== 0) continue;
|
|
349
|
+
// The front 28 chars — docNumber(9)+check + nationality(3) +
|
|
350
|
+
// birth(6)+check + sex + expiry(6)+check — are positionally stable in OCR.
|
|
351
|
+
// The optional-data field and the two trailing check digits are what an
|
|
352
|
+
// OCR line-split garbles (dropped fillers shift the composite digit). For
|
|
353
|
+
// TD3 (width 44) REBUILD the line canonically: stable front + empty
|
|
354
|
+
// optional + recomputed optional-check + recomputed composite. This is
|
|
355
|
+
// robust to the split-filler ambiguity that single-frame stitching can't
|
|
356
|
+
// resolve. (Passports with a NON-empty optional/personal-number field are
|
|
357
|
+
// rarer; multi-frame voting still covers those via the stitch fallback.)
|
|
358
|
+
const front = m[0]; // exactly 28 chars by the regex
|
|
359
|
+
if (width === 44 && front.length >= 28) {
|
|
360
|
+
let head = front.slice(0, 28);
|
|
361
|
+
// Self-correct the document number against its OWN check digit before we
|
|
362
|
+
// recompute the composite — otherwise a recomputed composite would be
|
|
363
|
+
// self-consistent with an OCR look-alike error (e.g. O→0) and MASK it
|
|
364
|
+
// from the downstream ambiguous-char recovery. Try the digit/letter
|
|
365
|
+
// look-alike swaps in the 9-char doc-number field until its check digit
|
|
366
|
+
// (position 9) matches; only then rebuild the optional + composite.
|
|
367
|
+
const docNum = head.slice(0, 9);
|
|
368
|
+
const docCheck = head[9];
|
|
369
|
+
if (cd731(docNum) !== docCheck) {
|
|
370
|
+
const swaps = {
|
|
371
|
+
O: '0',
|
|
372
|
+
Q: '0',
|
|
373
|
+
D: '0',
|
|
374
|
+
I: '1',
|
|
375
|
+
L: '1',
|
|
376
|
+
S: '5',
|
|
377
|
+
B: '8',
|
|
378
|
+
Z: '2',
|
|
379
|
+
G: '6'
|
|
380
|
+
};
|
|
381
|
+
const fixed = docNum.replace(/[OQDILSBZG]/g, c => swaps[c] ?? c);
|
|
382
|
+
if (cd731(fixed) === docCheck) {
|
|
383
|
+
head = fixed + head.slice(9);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
const optional = '<'.repeat(14);
|
|
387
|
+
const l2NoComposite = head + optional + cd731(optional);
|
|
388
|
+
const composite = l2NoComposite.slice(0, 10) + l2NoComposite.slice(13, 20) + l2NoComposite.slice(21, 43);
|
|
389
|
+
return l2NoComposite + cd731(composite);
|
|
390
|
+
}
|
|
391
|
+
// Non-TD3 or unexpected: stitch fragments up to width as a fallback.
|
|
392
|
+
let joined = ocrLines[i];
|
|
393
|
+
let j = i + 1;
|
|
394
|
+
while (joined.length < width && j < ocrLines.length) {
|
|
395
|
+
joined += ocrLines[j];
|
|
396
|
+
j++;
|
|
397
|
+
}
|
|
398
|
+
return joined.length >= width ? joined.slice(0, width) : joined;
|
|
399
|
+
}
|
|
400
|
+
return null;
|
|
401
|
+
};
|
|
402
|
+
|
|
284
403
|
// ---- TD3 (passport): line1 "P<XXX…", line2 starts with a 9-char doc number ----
|
|
285
|
-
// Line 2 signature: docNumber(9) + check + nationality(3) + birth(6)+check+sex+expiry(6)+check…
|
|
286
404
|
{
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
405
|
+
// Position 2 of line 1 is the "<" filler, frequently misread under glare as a
|
|
406
|
+
// filler-letter (K/C/E/G) — accept those for ALL issuers, not just TUR.
|
|
407
|
+
// Line-1 structure (ICAO 9303): doc code "P" + 1-char subtype (often "<",
|
|
408
|
+
// but a LETTER for some issuers — e.g. German ordinary passports are "PP",
|
|
409
|
+
// and "PC"/"PD" exist) + issuing state (1–3 letters then "<" filler; Germany
|
|
410
|
+
// is "D" → "PPD<<"). Find line 1 among the OCR lines (NOT the flat blob, whose
|
|
411
|
+
// greedy match overruns line boundaries).
|
|
412
|
+
const l1Index = ocrLines.findIndex(l => /^P[A-Z<][A-Z][A-Z<]{2}[A-Z<]/.test(l));
|
|
413
|
+
const l1Raw = l1Index >= 0 ? ocrLines[l1Index] : null;
|
|
414
|
+
const l2 = l1Index >= 0 ? findLine2(l1Index, 44) : null;
|
|
415
|
+
if (l1Raw && l2) {
|
|
416
|
+
candidates.push([pad(fixDocStart(l1Raw), 44), pad(l2, 44)]);
|
|
291
417
|
}
|
|
292
418
|
}
|
|
293
419
|
|
|
294
420
|
// ---- TD2: line1 "X<XXX…", line2 starts with docNumber ----
|
|
295
421
|
{
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
422
|
+
// TD2/ID doc codes are A/C/I (NOT P — that's a passport/TD3; including it
|
|
423
|
+
// here made passports get built as a 36-char TD2 and win selection). Position
|
|
424
|
+
// 2 is the SUBTYPE — any A–Z or "<" ("IR","IP","AR","AC"…). Line-aware (see
|
|
425
|
+
// TD3): find line 1 in ocrLines, stitch a split line 2.
|
|
426
|
+
const l1Index = ocrLines.findIndex(l => /^[ACI][A-Z<][A-Z][A-Z<]{2}[A-Z<]/.test(l));
|
|
427
|
+
const l1Raw = l1Index >= 0 ? ocrLines[l1Index] : null;
|
|
428
|
+
const l2 = l1Index >= 0 ? findLine2(l1Index, 36) : null;
|
|
429
|
+
if (l1Raw && l2) {
|
|
430
|
+
candidates.push([pad(fixDocStart(l1Raw), 36), pad(l2, 36)]);
|
|
300
431
|
}
|
|
301
432
|
}
|
|
302
433
|
|
|
@@ -309,8 +440,18 @@ const reconstructMRZCandidates = rawText => {
|
|
|
309
440
|
// birth(6)+check+sex+expiry(6)+check+state(3). Allow letters in date spans
|
|
310
441
|
// for OCR slips; check-digit recovery resolves them.
|
|
311
442
|
const l2Line = ocrLines.find(l => /^[0-9A-Z]{6}[0-9<][MF<][0-9A-Z]{6}[0-9<][A-Z<]{2,}/.test(l));
|
|
312
|
-
const l2m = l2Line ?? flat.match(/[0-9A-Z]{6}[0-9<][MF<][0-9A-Z]{6}[0-9<][A-Z]{2,3}/)?.[0];
|
|
313
|
-
|
|
443
|
+
const l2m = l2Line ?? flat.match(/[0-9A-Z]{6}[0-9<][MF<][0-9A-Z]{6}[0-9<][A-Z<]{2,3}/)?.[0];
|
|
444
|
+
|
|
445
|
+
// Don't emit a 3-line TD1 candidate for passport-shaped input. A passport
|
|
446
|
+
// (TD3) line 1 starts with "P" + a subtype char (a filler "<" OR a real
|
|
447
|
+
// letter — German ordinary passports are "PP", and "PC"/"PD"/… exist), or
|
|
448
|
+
// the band is two long ~44-char lines. Matching ANY "P"-prefixed L1 is safe:
|
|
449
|
+
// no valid TD1 (doc codes A/C/I only) ever starts with "P". Without this
|
|
450
|
+
// guard a noisy passport whose TD3 line-2 regex just missed would fall
|
|
451
|
+
// through to here and be forced into a 3×30 TD1 layout — the "always 3
|
|
452
|
+
// lines, invalid" bug.
|
|
453
|
+
const looksLikePassport = !!l1Source && /^P[A-Z<]/.test(l1Source) || ocrLines.length === 2 && ocrLines.every(l => Math.abs(l.length - 44) <= 4);
|
|
454
|
+
if (l1Source && !looksLikePassport) {
|
|
314
455
|
let l1 = pad(fixDocStart(l1Source), 30);
|
|
315
456
|
// The issuing-state field (TD1 line 1, positions 2–5) is structurally
|
|
316
457
|
// fillers/letters only — never a personal name — so a "K" there flanked by
|
|
@@ -358,9 +499,12 @@ const reconstructMRZCandidates = rawText => {
|
|
|
358
499
|
return l
|
|
359
500
|
// digit look-alikes inside the name → letters
|
|
360
501
|
.replace(/[015862]/g, d => digitToLetter[d] ?? d)
|
|
361
|
-
//
|
|
362
|
-
// is
|
|
363
|
-
|
|
502
|
+
// ONLY collapse the TRAILING run of filler-letters (K/C/E/G) — that
|
|
503
|
+
// region is unambiguous "<" padding. Do NOT collapse internal runs
|
|
504
|
+
// flanked by fillers: a short given/sur-name made only of K/C/E/G
|
|
505
|
+
// (e.g. Turkish "ECE"/"EGE", "GEC") sits between "<<" separators and
|
|
506
|
+
// would be wrongly erased.
|
|
507
|
+
.replace(/[KCEG]+$/g, m => '<'.repeat(m.length));
|
|
364
508
|
};
|
|
365
509
|
const nameRuns = ocrLines.filter(isNameLike);
|
|
366
510
|
const bestName = nameRuns.sort((a, b) => b.length - a.length)[0] ?? '';
|
|
@@ -1131,18 +1275,20 @@ const validateMRZ = (mrzText, autocorrect = true) => {
|
|
|
1131
1275
|
|
|
1132
1276
|
// Map mrz package fields to our MRZFields type
|
|
1133
1277
|
const fields = {
|
|
1134
|
-
documentCode: result.fields.documentCode
|
|
1278
|
+
documentCode: normalizeDocumentCode(result.fields.documentCode),
|
|
1135
1279
|
issuingState: result.fields.issuingState || null,
|
|
1136
1280
|
documentNumber: result.fields.documentNumber || null,
|
|
1137
1281
|
nationality: result.fields.nationality || null,
|
|
1138
|
-
|
|
1139
|
-
|
|
1282
|
+
// Text fields can carry embedded MRZ filler (`<`/`<<`) — strip it so the
|
|
1283
|
+
// UI shows "ANNA MARIA", not "ANNA<<MARIA".
|
|
1284
|
+
lastName: cleanMRZTextField(result.fields.lastName),
|
|
1285
|
+
firstName: cleanMRZTextField(result.fields.firstName),
|
|
1140
1286
|
sex: result.fields.sex || null,
|
|
1141
1287
|
birthDate: result.fields.birthDate || null,
|
|
1142
1288
|
expirationDate: result.fields.expirationDate || null,
|
|
1143
|
-
personalNumber: result.fields.personalNumber
|
|
1144
|
-
optional1: result.fields.optional1
|
|
1145
|
-
optional2: result.fields.optional2
|
|
1289
|
+
personalNumber: cleanMRZTextField(result.fields.personalNumber),
|
|
1290
|
+
optional1: cleanMRZTextField(result.fields.optional1),
|
|
1291
|
+
optional2: cleanMRZTextField(result.fields.optional2)
|
|
1146
1292
|
};
|
|
1147
1293
|
return {
|
|
1148
1294
|
valid: true,
|
|
@@ -1254,5 +1400,6 @@ export default {
|
|
|
1254
1400
|
assessMRZQuality,
|
|
1255
1401
|
isValidOCRBPattern,
|
|
1256
1402
|
applyOCRBCorrections,
|
|
1257
|
-
convertMRZDateToISODate
|
|
1403
|
+
convertMRZDateToISODate,
|
|
1404
|
+
normalizeDocumentCode
|
|
1258
1405
|
};
|
|
@@ -69,6 +69,29 @@ const linesForFrame = text => {
|
|
|
69
69
|
const rawLines = text.split('\n').map(l => l.trim().replace(/[^A-Z0-9<]/gi, '').toUpperCase()).filter(Boolean);
|
|
70
70
|
const exact = exactFormatLines(rawLines);
|
|
71
71
|
if (exact) return exact;
|
|
72
|
+
|
|
73
|
+
// Near-format catch for 2-line bands (TD3 passport 2×44, TD2 2×36). A passport
|
|
74
|
+
// OCR'd a few chars off (2×43, 2×45) would otherwise fall into the TD1-biased
|
|
75
|
+
// reconstruction and be forced into a wrong 3×30 layout. When we have exactly
|
|
76
|
+
// two lines both close to a 2-line format's width, coerce them to that width
|
|
77
|
+
// and keep them as-is (2 lines) rather than reconstructing. Tie-break to the
|
|
78
|
+
// closest width. Never matches a 3-line TD1 (line count differs).
|
|
79
|
+
if (rawLines.length === 2) {
|
|
80
|
+
const twoLineFormats = Object.values(FORMAT_GEOMETRY).filter(g => g.lines === 2);
|
|
81
|
+
let bestGeom = null;
|
|
82
|
+
let bestDelta = Infinity;
|
|
83
|
+
for (const g of twoLineFormats) {
|
|
84
|
+
const delta = Math.max(...rawLines.map(l => Math.abs(l.length - g.width)));
|
|
85
|
+
if (delta <= 4 && delta < bestDelta) {
|
|
86
|
+
bestDelta = delta;
|
|
87
|
+
bestGeom = g;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (bestGeom) {
|
|
91
|
+
const w = bestGeom.width;
|
|
92
|
+
return rawLines.map(l => l.length >= w ? l.slice(0, w) : l.padEnd(w, '<'));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
72
95
|
const candidates = mrzUtils.reconstructMRZCandidates(text);
|
|
73
96
|
if (!candidates.length) {
|
|
74
97
|
// Fall back to the lightweight fixMRZ split for already-clean text.
|
|
@@ -84,7 +107,12 @@ const linesForFrame = text => {
|
|
|
84
107
|
let best = null;
|
|
85
108
|
let bestScore = -1;
|
|
86
109
|
for (const cand of candidates) {
|
|
87
|
-
|
|
110
|
+
// Among formats with this line count, pick the one whose width best matches
|
|
111
|
+
// the candidate's lines. TD2 and TD3 are BOTH 2 lines (36 vs 44) — matching
|
|
112
|
+
// by line count alone wrongly picked TD2 for a 44-wide passport, then the
|
|
113
|
+
// ">6 off width" guard discarded it. Average line length disambiguates.
|
|
114
|
+
const avgLen = cand.reduce((s, l) => s + l.length, 0) / Math.max(1, cand.length);
|
|
115
|
+
const geom = Object.values(FORMAT_GEOMETRY).filter(g => g.lines === cand.length).sort((a, b) => Math.abs(a.width - avgLen) - Math.abs(b.width - avgLen))[0];
|
|
88
116
|
if (!geom) continue;
|
|
89
117
|
// Reject if any line is wildly off the expected width (likely not the band).
|
|
90
118
|
if (cand.some(l => Math.abs(l.length - geom.width) > 6)) continue;
|
|
@@ -45,7 +45,20 @@ function convertName(rawName, map) {
|
|
|
45
45
|
return rawName.split(' ').map(word => applyDigraphMap(word, map)).join(' ');
|
|
46
46
|
}
|
|
47
47
|
export function buildDocumentName(rawFirst, rawLast, issuingState, dg11First, dg11Last) {
|
|
48
|
-
|
|
48
|
+
// Prefer DG11 (the chip's printed name in UTF-8) ONLY when it carries a proper
|
|
49
|
+
// two-part split — both a surname AND a given name. That is the authoritative
|
|
50
|
+
// correction for chips whose DG1 MRZ name lacks a `<<` separator (e.g. Turkish
|
|
51
|
+
// PACE passports), where the raw MRZ would otherwise put the full name into
|
|
52
|
+
// the surname.
|
|
53
|
+
//
|
|
54
|
+
// A one-sided DG11 result (only surname, or only given name) is NOT reliable —
|
|
55
|
+
// it usually means DG11 had no clear separator, so we don't know which part it
|
|
56
|
+
// is. Back-filling the missing side from the raw MRZ caused the given name to
|
|
57
|
+
// be duplicated into both fields, so we now fall through to the MRZ-based
|
|
58
|
+
// split instead, which is more trustworthy than mixing the two sources.
|
|
59
|
+
const hasFirst = (dg11First ?? '') !== '';
|
|
60
|
+
const hasLast = (dg11Last ?? '') !== '';
|
|
61
|
+
if (hasFirst && hasLast) {
|
|
49
62
|
return {
|
|
50
63
|
rawFirst,
|
|
51
64
|
rawLast,
|
|
@@ -50,6 +50,11 @@ export default {
|
|
|
50
50
|
'diagnosticReport.noticeBody': 'This opens a draft with your scan data, document images and technical details so support can help resolve a scanning issue. Review it before sending.',
|
|
51
51
|
'diagnosticReport.continue': 'Continue',
|
|
52
52
|
'diagnosticReport.cancel': 'Cancel',
|
|
53
|
+
'diagnosticReport.shareFailedTitle': "Couldn't open the share sheet",
|
|
54
|
+
'diagnosticReport.shareFailedBody': "We couldn't attach the report to share. Send it securely to support instead?",
|
|
55
|
+
'diagnosticReport.uploadAction': 'Send to support',
|
|
56
|
+
'diagnosticReport.uploadSuccess': 'Diagnostic report sent to support.',
|
|
57
|
+
'diagnosticReport.uploadFailed': "Couldn't send the report. Please try again later.",
|
|
53
58
|
'livenessDetectionScreen.guideHeader': 'Face Verification',
|
|
54
59
|
'livenessDetectionScreen.guideText': 'Please ensure the following for best results:',
|
|
55
60
|
'livenessDetectionScreen.guidePoint1': 'Remove glasses, hats, or face coverings',
|
|
@@ -72,6 +77,13 @@ export default {
|
|
|
72
77
|
'eidScannerScreen.guideHeader': 'NFC Document Scan',
|
|
73
78
|
'eidScannerScreen.guideText': 'When prompted, hold your document flat against the back of your device near the NFC antenna.',
|
|
74
79
|
'eidScannerScreen.invalidMRZFields': 'Document information could not be read. Please try again.',
|
|
80
|
+
'eidScannerScreen.error': 'Error',
|
|
81
|
+
'eidScannerScreen.errorCode': 'Error code',
|
|
82
|
+
'eidScannerScreen.nfcGenericError': 'Something went wrong while reading your document. Please try again. If the problem continues, contact support with the code below.',
|
|
83
|
+
'eidScannerScreen.nfcReadFailed': 'Could not read the chip. Hold the document flat against the back of your device and keep it still, then try again.',
|
|
84
|
+
'eidScannerScreen.nfcAuthFailed': 'Could not establish a secure connection to the chip. Make sure the document number, date of birth and expiry date are correct, then try again.',
|
|
85
|
+
'eidScannerScreen.nfcTagLost': 'Connection to the document was lost. Keep the document still against the device and try again.',
|
|
86
|
+
'eidScannerScreen.nfcTimeout': 'Reading the chip timed out. Hold the document steady against the device and try again.',
|
|
75
87
|
'eidScannerScreen.faceImageNotFound': 'Photo data not found on document.',
|
|
76
88
|
'eidScannerScreen.documentCode': 'Document Type',
|
|
77
89
|
'eidScannerScreen.nationality': 'Nationality',
|
|
@@ -50,6 +50,11 @@ export default {
|
|
|
50
50
|
'diagnosticReport.noticeBody': 'Bu işlem; tarama verilerinizi, belge görüntülerinizi ve teknik ayrıntıları içeren bir taslak açar; böylece destek ekibi tarama sorununu çözebilir. Göndermeden önce gözden geçirin.',
|
|
51
51
|
'diagnosticReport.continue': 'Devam et',
|
|
52
52
|
'diagnosticReport.cancel': 'İptal',
|
|
53
|
+
'diagnosticReport.shareFailedTitle': 'Paylaşım ekranı açılamadı',
|
|
54
|
+
'diagnosticReport.shareFailedBody': 'Raporu paylaşmak için ekleyemedik. Bunun yerine destek ekibine güvenli şekilde gönderelim mi?',
|
|
55
|
+
'diagnosticReport.uploadAction': 'Desteğe gönder',
|
|
56
|
+
'diagnosticReport.uploadSuccess': 'Tanılama raporu destek ekibine gönderildi.',
|
|
57
|
+
'diagnosticReport.uploadFailed': 'Rapor gönderilemedi. Lütfen daha sonra tekrar deneyin.',
|
|
53
58
|
'livenessDetectionScreen.guideHeader': 'Yüz Doğrulaması',
|
|
54
59
|
'livenessDetectionScreen.guideText': 'En iyi sonuç için lütfen şunları sağlayın:',
|
|
55
60
|
'livenessDetectionScreen.guidePoint1': 'Gözlük, şapka veya yüz aksesuarlarını çıkarın',
|
|
@@ -72,6 +77,13 @@ export default {
|
|
|
72
77
|
'eidScannerScreen.guideHeader': 'NFC Belge Taraması',
|
|
73
78
|
'eidScannerScreen.guideText': 'İstendiğinde, belgenizi cihazınızın arka tarafındaki NFC antenine düz bir şekilde yaklaştırın.',
|
|
74
79
|
'eidScannerScreen.invalidMRZFields': 'Belge bilgileri okunamadı. Lütfen tekrar deneyin.',
|
|
80
|
+
'eidScannerScreen.error': 'Hata',
|
|
81
|
+
'eidScannerScreen.errorCode': 'Hata kodu',
|
|
82
|
+
'eidScannerScreen.nfcGenericError': 'Belgeniz okunurken bir sorun oluştu. Lütfen tekrar deneyin. Sorun devam ederse aşağıdaki kod ile destek ekibimize başvurun.',
|
|
83
|
+
'eidScannerScreen.nfcReadFailed': 'Çip okunamadı. Belgeyi cihazınızın arkasına düz şekilde yaslayıp sabit tutun ve tekrar deneyin.',
|
|
84
|
+
'eidScannerScreen.nfcAuthFailed': 'Çip ile güvenli bağlantı kurulamadı. Belge numarası, doğum tarihi ve son geçerlilik tarihinin doğru olduğundan emin olup tekrar deneyin.',
|
|
85
|
+
'eidScannerScreen.nfcTagLost': 'Belge ile bağlantı kesildi. Belgeyi cihaza sabit tutun ve tekrar deneyin.',
|
|
86
|
+
'eidScannerScreen.nfcTimeout': 'Çip okuması zaman aşımına uğradı. Belgeyi cihaza sabit tutup tekrar deneyin.',
|
|
75
87
|
'eidScannerScreen.faceImageNotFound': 'Belgede fotoğraf verisi bulunamadı.',
|
|
76
88
|
'eidScannerScreen.documentCode': 'Belge Türü',
|
|
77
89
|
'eidScannerScreen.nationality': 'Uyruk',
|
package/lib/module/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EIDScanner.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Components/EIDScanner.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"EIDScanner.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Components/EIDScanner.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAiBpD,UAAU,eAAe;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,CACd,OAAO,EAAE,SAAS,EAClB,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,MAAM,KACtB,IAAI,CAAC;IACV,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;CAC/C;AAED,QAAA,MAAM,UAAU,GAAI,6FAOjB,eAAe,4CAqwBjB,CAAC;AA4NF,eAAe,UAAU,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IdentityDocumentCamera.constants.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Components/IdentityDocumentCamera.constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,KAAK,CAAC;AACvC,eAAO,MAAM,4BAA4B,OAAO,CAAC;AACjD,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAChD,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAC7C,eAAO,MAAM,gCAAgC,KAAK,CAAC;AAEnD,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAC3C,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAC5C,eAAO,MAAM,gCAAgC,KAAK,CAAC;AACnD,eAAO,MAAM,wBAAwB,OAAO,CAAC;AAC7C,eAAO,MAAM,0BAA0B,OAAO,CAAC;AAC/C,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAE9C,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAC/C,eAAO,MAAM,sCAAsC,IAAI,CAAC;AAExD,eAAO,MAAM,eAAe,QAAkC,CAAC;AAC/D,eAAO,MAAM,oBAAoB,QAAyB,CAAC;AAC3D,eAAO,MAAM,iBAAiB,QAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"IdentityDocumentCamera.constants.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Components/IdentityDocumentCamera.constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,KAAK,CAAC;AACvC,eAAO,MAAM,4BAA4B,OAAO,CAAC;AACjD,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAChD,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAC7C,eAAO,MAAM,gCAAgC,KAAK,CAAC;AAEnD,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAC3C,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAC5C,eAAO,MAAM,gCAAgC,KAAK,CAAC;AACnD,eAAO,MAAM,wBAAwB,OAAO,CAAC;AAC7C,eAAO,MAAM,0BAA0B,OAAO,CAAC;AAC/C,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAE9C,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAC/C,eAAO,MAAM,sCAAsC,IAAI,CAAC;AAExD,eAAO,MAAM,eAAe,QAAkC,CAAC;AAC/D,eAAO,MAAM,oBAAoB,QAAyB,CAAC;AAC3D,eAAO,MAAM,iBAAiB,QAAsB,CAAC;AASrD,eAAO,MAAM,oBAAoB,QAAyC,CAAC;AAI3E,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAChD,eAAO,MAAM,sBAAsB;;;;;;;;;;CAUzB,CAAC;AAKX,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAC9C,eAAO,MAAM,gCAAgC,MAAM,CAAC;AACpD,eAAO,MAAM,2BAA2B,OAAO,CAAC;AAChD,eAAO,MAAM,mBAAmB,MAAM,CAAC;AACvC,eAAO,MAAM,mBAAmB,MAAM,CAAC"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { InputStream } from './java/inputStream';
|
|
2
2
|
import type { FileSystemStructured } from './smartcards/fileSystemStructured';
|
|
3
3
|
export declare class CardFileInputStream extends InputStream {
|
|
4
|
+
/** Max re-issues of a single block read before failing — mitigates transient
|
|
5
|
+
* iOS NFC transceive drops during large-file reads (e.g. DG2). */
|
|
6
|
+
private static readonly MAX_BLOCK_READ_RETRIES;
|
|
4
7
|
private path;
|
|
5
8
|
private buffer;
|
|
6
9
|
private bufferLength;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cardFileInputStream.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/EIDReader/cardFileInputStream.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAG9E,qBAAa,mBAAoB,SAAQ,WAAW;IAClD,OAAO,CAAC,IAAI,CAAc;IAC1B,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,kBAAkB,CAAU;IACpC,OAAO,CAAC,cAAc,CAAU;IAChC,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,EAAE,CAAuB;IACjC,OAAO,CAAC,YAAY,CAAS;gBAEjB,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE,oBAAoB;IAMpD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBrB,IAAI;
|
|
1
|
+
{"version":3,"file":"cardFileInputStream.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/EIDReader/cardFileInputStream.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAG9E,qBAAa,mBAAoB,SAAQ,WAAW;IAClD;uEACmE;IACnE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAK;IAEnD,OAAO,CAAC,IAAI,CAAc;IAC1B,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,kBAAkB,CAAU;IACpC,OAAO,CAAC,cAAc,CAAU;IAChC,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,EAAE,CAAuB;IACjC,OAAO,CAAC,YAAY,CAAS;gBAEjB,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE,oBAAoB;IAMpD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBrB,IAAI;IA2EV,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAahC,SAAS,IAAI,MAAM;IAInB,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAI9B,KAAK,IAAI,IAAI;IAUb,aAAa,IAAI,OAAO;IAIxB,SAAS,IAAI,MAAM;IAInB,WAAW,IAAI,MAAM;YAIP,kBAAkB;IA+BhC,OAAO,CAAC,YAAY;CAoBrB"}
|
|
@@ -15,6 +15,10 @@ export declare class DefaultFileSystem implements FileSystemStructured {
|
|
|
15
15
|
private wrapper;
|
|
16
16
|
private oldWrapper;
|
|
17
17
|
constructor(service: APDULevelReadBinaryCapable, isSFIEnabled: boolean, fidToSFI?: Map<number, number>);
|
|
18
|
+
/** Deep-copy a secure-messaging wrapper PRESERVING its cipher type (AES vs
|
|
19
|
+
* 3DES), so the SSC can be rewound for a retry without changing the MAC/enc
|
|
20
|
+
* algorithm. Non-SM wrappers are returned as-is. */
|
|
21
|
+
private cloneWrapper;
|
|
18
22
|
setWrapper(wrapper: APDUWrapper): void;
|
|
19
23
|
getWrapper(): APDUWrapper;
|
|
20
24
|
getMaxReadBinaryLength(): number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaultFileSystem.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/EIDReader/defaultFileSystem.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAG/E,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"defaultFileSystem.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/EIDReader/defaultFileSystem.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAG/E,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAKtC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAK5D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAE9E,qBAAa,iBAAkB,YAAW,oBAAoB;IAC5D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAc;IAC5C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAa;IAEtD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,UAAU,CAAe;gBAG/B,OAAO,EAAE,0BAA0B,EACnC,YAAY,EAAE,OAAO,EACrB,QAAQ,GAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAA6B;IAsB3D;;yDAEqD;IACrD,OAAO,CAAC,YAAY;IAgBb,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAKtC,UAAU;IAIV,sBAAsB,IAAI,MAAM;IAI1B,eAAe,IAAI,OAAO,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC;IASnD,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAQvB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;YA2G9D,WAAW;YA4DX,cAAc;IAI5B,OAAO,CAAC,mBAAmB;IAqB3B,OAAO,CAAC,cAAc;YAgBR,aAAa;CAgC5B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eidReader.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/EIDReader/eidReader.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"eidReader.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/EIDReader/eidReader.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AA0X7C,QAAA,MAAM,SAAS,GACb,gBAAgB,MAAM,EACtB,aAAa,MAAM,EACnB,cAAc,MAAM,EACpB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,KAC5C,OAAO,CACN;IACE,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B,GACD,SAAS,CA+XZ,CAAC;AAEF,OAAO,EAAE,SAAS,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dg11File.d.ts","sourceRoot":"","sources":["../../../../../../../src/Shared/EIDReader/lds/icao/dg11File.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC;;;;;;;;;;;GAWG;AACH,qBAAa,QAAS,SAAQ,SAAS;IACrC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IACxC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAQ;IAC5C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAU;IAEpD,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,QAAQ,CAAuB;gBAE3B,EAAE,CAAC,EAAE,WAAW;IAI5B,gEAAgE;IAChE,YAAY,IAAI,MAAM,GAAG,IAAI;IAI7B,+DAA+D;IAC/D,WAAW,IAAI,MAAM,GAAG,IAAI;IAItB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;cAIX,WAAW,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBpE,SAAS,CAAC,YAAY,IAAI,IAAI;IAI9B;;;OAGG;IACH,OAAO,CAAC,SAAS;
|
|
1
|
+
{"version":3,"file":"dg11File.d.ts","sourceRoot":"","sources":["../../../../../../../src/Shared/EIDReader/lds/icao/dg11File.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC;;;;;;;;;;;GAWG;AACH,qBAAa,QAAS,SAAQ,SAAS;IACrC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IACxC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAQ;IAC5C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAU;IAEpD,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,QAAQ,CAAuB;gBAE3B,EAAE,CAAC,EAAE,WAAW;IAI5B,gEAAgE;IAChE,YAAY,IAAI,MAAM,GAAG,IAAI;IAI7B,+DAA+D;IAC/D,WAAW,IAAI,MAAM,GAAG,IAAI;IAItB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;cAIX,WAAW,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBpE,SAAS,CAAC,YAAY,IAAI,IAAI;IAI9B;;;OAGG;IACH,OAAO,CAAC,SAAS;CAgClB"}
|
|
@@ -5,9 +5,17 @@ export declare class NFCManagerCardService extends CardService {
|
|
|
5
5
|
private isOpened;
|
|
6
6
|
open(): Promise<void>;
|
|
7
7
|
getIsOpen(): boolean;
|
|
8
|
+
private sessionRestartEnabled;
|
|
9
|
+
setSessionRestartEnabled(enabled: boolean): void;
|
|
8
10
|
transmit(commandAPDU: CommandAPDU): Promise<ResponseAPDU>;
|
|
9
11
|
getATR(): Uint8Array;
|
|
10
|
-
getIsConnectionLost(
|
|
12
|
+
getIsConnectionLost(error: Error): boolean;
|
|
13
|
+
/** True if the error looks like a dropped/timed-out CoreNFC tag connection
|
|
14
|
+
* (as opposed to a real APDU/crypto failure). */
|
|
15
|
+
isTagLost(error: unknown): boolean;
|
|
16
|
+
/** Re-establish the CoreNFC session (iOS) so a fresh handshake can be retried
|
|
17
|
+
* after a tag drop. No-op on Android. Best-effort. */
|
|
18
|
+
restartSession(): Promise<void>;
|
|
11
19
|
close(): Promise<void>;
|
|
12
20
|
}
|
|
13
21
|
//# sourceMappingURL=nfcManagerCardService.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nfcManagerCardService.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/EIDReader/nfcManagerCardService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"nfcManagerCardService.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/EIDReader/nfcManagerCardService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAiCzD,qBAAa,qBAAsB,SAAQ,WAAW;IACpD,OAAO,CAAC,QAAQ,CAAS;IACZ,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAc3B,SAAS,IAAI,OAAO;IAQ3B,OAAO,CAAC,qBAAqB,CAAS;IAE/B,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAI1C,QAAQ,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAwC/D,MAAM,IAAI,UAAU;IAIpB,mBAAmB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAKjD;sDACkD;IAC3C,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAIzC;2DACuD;IAC1C,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAM/B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAIpC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DH (modular exponentiation, non-EC) primitives for PACE Generic Mapping.
|
|
3
|
+
*
|
|
4
|
+
* Modern ePassports/eIDs use ECDH almost universally; a minority of documents
|
|
5
|
+
* negotiate classic DH PACE. This module provides the DH math as pure,
|
|
6
|
+
* unit-testable functions so it can be verified against the ICAO 9303 Part 11
|
|
7
|
+
* worked example before it ever touches a chip. It is deliberately separate from
|
|
8
|
+
* the EC path in paceProtocol.ts — the working ECDH handshake is not modified.
|
|
9
|
+
*
|
|
10
|
+
* References: ICAO Doc 9303 Part 11 §4.4.3.2 (Generic Mapping), BSI TR-03110
|
|
11
|
+
* Part 3 §3.3.1, RFC 5114 (standardized MODP groups), TR-03110 Table A.1
|
|
12
|
+
* (standardized domain parameter IDs 0–7).
|
|
13
|
+
*/
|
|
14
|
+
/** A DH group: safe-prime modulus p, generator g, and subgroup order q. */
|
|
15
|
+
export interface DHGroup {
|
|
16
|
+
/** prime modulus */
|
|
17
|
+
p: bigint;
|
|
18
|
+
/** generator */
|
|
19
|
+
g: bigint;
|
|
20
|
+
/** subgroup order (q) — used to size exponents */
|
|
21
|
+
q: bigint;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Standardized DH domain parameters by TR-03110 parameter ID.
|
|
25
|
+
* 0 → RFC 5114 §2.1 1024-bit MODP Group with 160-bit Prime Order Subgroup
|
|
26
|
+
* 1 → RFC 5114 §2.2 2048-bit MODP Group with 224-bit Prime Order Subgroup
|
|
27
|
+
* 2 → RFC 5114 §2.3 2048-bit MODP Group with 256-bit Prime Order Subgroup
|
|
28
|
+
* (IDs 3–7 are reserved/unused in practice; EC params start at 8.)
|
|
29
|
+
*/
|
|
30
|
+
export declare const DH_GROUPS: Record<number, DHGroup>;
|
|
31
|
+
/**
|
|
32
|
+
* PACE DH Generic Mapping (ICAO 9303 Part 11 §4.4.3.2):
|
|
33
|
+
* shared secret h = PK_PICC ^ SK_PCD mod p
|
|
34
|
+
* mapped generator g~ = g^s · h mod p
|
|
35
|
+
* where s is the decrypted PICC nonce (a big-endian integer).
|
|
36
|
+
*
|
|
37
|
+
* Pure function over the group + the three inputs, so it can be checked against
|
|
38
|
+
* the ICAO worked example. `pkPicc` is the PICC mapping public key; `skPcd` the
|
|
39
|
+
* PCD mapping private key; `nonce` the decrypted nonce s.
|
|
40
|
+
*/
|
|
41
|
+
export declare const dhGenericMapping: (group: DHGroup, skPcd: bigint, pkPicc: bigint, nonce: bigint) => {
|
|
42
|
+
sharedH: bigint;
|
|
43
|
+
mappedGenerator: bigint;
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* DH key agreement with a mapped generator (PACE step 3):
|
|
47
|
+
* PK = g~ ^ SK mod p (public key to send)
|
|
48
|
+
* K = PK_PICC ^ SK mod p (shared secret)
|
|
49
|
+
*/
|
|
50
|
+
export declare const dhPublicKey: (group: DHGroup, mappedGenerator: bigint, sk: bigint) => bigint;
|
|
51
|
+
export declare const dhSharedSecret: (group: DHGroup, pkPicc: bigint, sk: bigint) => bigint;
|
|
52
|
+
/** Square-and-multiply modular exponentiation (constant-shape, bigint). */
|
|
53
|
+
export declare function modPow(base: bigint, exp: bigint, mod: bigint): bigint;
|
|
54
|
+
/** Fixed-width big-endian byte encoding of a DH value (left-padded to p's size). */
|
|
55
|
+
export declare const dhEncode: (value: bigint, group: DHGroup) => Buffer;
|
|
56
|
+
//# sourceMappingURL=paceDH.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paceDH.d.ts","sourceRoot":"","sources":["../../../../../../src/Shared/EIDReader/protocol/paceDH.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,2EAA2E;AAC3E,MAAM,WAAW,OAAO;IACtB,oBAAoB;IACpB,CAAC,EAAE,MAAM,CAAC;IACV,gBAAgB;IAChB,CAAC,EAAE,MAAM,CAAC;IACV,kDAAkD;IAClD,CAAC,EAAE,MAAM,CAAC;CACX;AAID;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAoF7C,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,gBAAgB,GAC3B,OAAO,OAAO,EACd,OAAO,MAAM,EACb,QAAQ,MAAM,EACd,OAAO,MAAM,KACZ;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAK5C,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,WAAW,GACtB,OAAO,OAAO,EACd,iBAAiB,MAAM,EACvB,IAAI,MAAM,KACT,MAA8C,CAAC;AAElD,eAAO,MAAM,cAAc,GACzB,OAAO,OAAO,EACd,QAAQ,MAAM,EACd,IAAI,MAAM,KACT,MAAqC,CAAC;AAEzC,2EAA2E;AAC3E,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAWrE;AAED,oFAAoF;AACpF,eAAO,MAAM,QAAQ,GAAI,OAAO,MAAM,EAAE,OAAO,OAAO,KAAG,MASxD,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed PACE errors.
|
|
3
|
+
*
|
|
4
|
+
* The point is to let the caller distinguish a PACE CAPABILITY gap (this build
|
|
5
|
+
* cannot run the variant the chip advertises — e.g. DH agreement, CAM mapping,
|
|
6
|
+
* an unregistered curve) from a RUNTIME failure (wrong key, tag lost, APDU
|
|
7
|
+
* error). Both fall back to BAC, but the diagnostics reason must differ so we
|
|
8
|
+
* can tell "we don't support this document's PACE" from "the read went wrong".
|
|
9
|
+
*/
|
|
10
|
+
/** Why a PACE attempt could not even be run by this implementation. */
|
|
11
|
+
export type PACEUnsupportedReason = 'agreement' | 'mapping' | 'curve' | 'cipher';
|
|
12
|
+
/**
|
|
13
|
+
* Thrown when the chip advertises a PACE variant this build cannot perform.
|
|
14
|
+
* Carries a coarse, non-PII reason that maps directly to a diagnostics fallback
|
|
15
|
+
* reason (`pace_unsupported_<reason>`), so support can see exactly which
|
|
16
|
+
* capability was missing for a given document.
|
|
17
|
+
*/
|
|
18
|
+
export declare class PACEUnsupportedError extends Error {
|
|
19
|
+
readonly paceUnsupported = true;
|
|
20
|
+
readonly reason: PACEUnsupportedReason;
|
|
21
|
+
constructor(reason: PACEUnsupportedReason, detail: string);
|
|
22
|
+
}
|
|
23
|
+
/** Type guard usable across module boundaries (instanceof is unreliable after
|
|
24
|
+
* transpilation/bundling, so we also check the marker flag). */
|
|
25
|
+
export declare const isPACEUnsupportedError: (e: unknown) => e is PACEUnsupportedError;
|
|
26
|
+
//# sourceMappingURL=paceErrors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paceErrors.d.ts","sourceRoot":"","sources":["../../../../../../src/Shared/EIDReader/protocol/paceErrors.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,uEAAuE;AACvE,MAAM,MAAM,qBAAqB,GAC7B,WAAW,GACX,SAAS,GACT,OAAO,GACP,QAAQ,CAAC;AAEb;;;;;GAKG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,eAAe,QAAQ;IAChC,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;gBAE3B,MAAM,EAAE,qBAAqB,EAAE,MAAM,EAAE,MAAM;CAK1D;AAED;iEACiE;AACjE,eAAO,MAAM,sBAAsB,GAAI,GAAG,OAAO,KAAG,CAAC,IAAI,oBAIS,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paceProtocol.d.ts","sourceRoot":"","sources":["../../../../../../src/Shared/EIDReader/protocol/paceProtocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"paceProtocol.d.ts","sourceRoot":"","sources":["../../../../../../src/Shared/EIDReader/protocol/paceProtocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAKxE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAoI1C;;;;;GAKG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,OAAO,CAAgC;IAC/C,OAAO,CAAC,8BAA8B,CAAS;IAC/C,OAAO,CAAC,qCAAqC,CAAS;IACtD,OAAO,CAAC,cAAc,CAAU;gBAG9B,OAAO,EAAE,oBAAoB,EAC7B,OAAO,EAAE,sBAAsB,GAAG,IAAI,EACtC,8BAA8B,EAAE,MAAM,EACtC,qCAAqC,EAAE,MAAM,EAC7C,cAAc,EAAE,OAAO;IAUzB;;;;;;OAMG;IACU,MAAM,CACjB,SAAS,EAAE,aAAa,EACxB,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,GAC5C,OAAO,CAAC,UAAU,CAAC;IAyKtB;;OAEG;YACW,WAAW;IAoCzB;;;OAGG;YACW,aAAa;IAmE3B;;;;;OAKG;YACW,aAAa;IAyD3B;;;OAGG;YACW,WAAW;IA+EzB;;;OAGG;YACW,WAAW;IAqDzB;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,6BAA6B;IA4B5C,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAUhC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,0BAA0B;IAczC;;OAEG;WACW,mBAAmB,CAC/B,SAAS,EAAE,aAAa,EACxB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,MAAM;IAoBT,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAQhC,OAAO,CAAC,MAAM,CAAC,aAAa;IAY5B,OAAO,CAAC,MAAM,CAAC,UAAU;IAMzB,OAAO,CAAC,MAAM,CAAC,cAAc;IA+B7B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,MAAM;IAcrB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAwDnC;;;;;;;;;OASG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAgE/B,OAAO,CAAC,MAAM,CAAC,IAAI;IAWnB;;OAEG;WACW,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;CAgCxD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"readBinaryAPDUSender.d.ts","sourceRoot":"","sources":["../../../../../../src/Shared/EIDReader/protocol/readBinaryAPDUSender.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAChF,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAO7D,qBAAa,oBAAqB,YAAW,0BAA0B;IACrE,OAAO,CAAC,qBAAqB,CAA4B;IACzD,OAAO,CAAC,OAAO,CAAc;gBAEjB,OAAO,EAAE,WAAW;IAKnB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,EAAE,GAAG,EAAE,UAAU;IAuB7D,YAAY;IAqBZ,cAAc,CACzB,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,IAAI,CAAC;IA0BH,cAAc,CACzB,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,MAAM,EACV,YAAY,EAAE,OAAO,EACrB,wBAAwB,EAAE,OAAO,GAChC,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"readBinaryAPDUSender.d.ts","sourceRoot":"","sources":["../../../../../../src/Shared/EIDReader/protocol/readBinaryAPDUSender.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAChF,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAO7D,qBAAa,oBAAqB,YAAW,0BAA0B;IACrE,OAAO,CAAC,qBAAqB,CAA4B;IACzD,OAAO,CAAC,OAAO,CAAc;gBAEjB,OAAO,EAAE,WAAW;IAKnB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,EAAE,GAAG,EAAE,UAAU;IAuB7D,YAAY;IAqBZ,cAAc,CACzB,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,IAAI,CAAC;IA0BH,cAAc,CACzB,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,MAAM,EACV,YAAY,EAAE,OAAO,EACrB,wBAAwB,EAAE,OAAO,GAChC,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAqF7B,OAAO,CAAC,MAAM,CAAC,eAAe;IAgC9B,OAAO,CAAC,MAAM,CAAC,iCAAiC;CAsCjD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"country-display.utils.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Libs/country-display.utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"country-display.utils.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Libs/country-display.utils.ts"],"names":[],"mappings":"AAoBA,eAAO,MAAM,uBAAuB,GAClC,aAAa,MAAM,GAAG,IAAI,EAC1B,YAAY,MAAM,GAAG,IAAI,KACxB,MA0CF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnosticReport.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Libs/diagnosticReport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"diagnosticReport.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Libs/diagnosticReport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AA2CpD,MAAM,WAAW,iBAAiB;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,6EAA6E;IAC7E,MAAM,CAAC,EAAE;QACP,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC;CACH;AAyDD,MAAM,WAAW,sBAAsB;IACrC,uCAAuC;IACvC,eAAe,EAAE,MAAM,CAAC;IACxB,kDAAkD;IAClD,YAAY,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,+BAA+B;IAC/B,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD,uEAAuE;AACvE,eAAO,MAAM,qBAAqB,GAAI,QAAQ;IAC5C,IAAI,EAAE,mBAAmB,CAAC;IAC1B,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE,iBAAiB,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,KAAG,sBAuFH,CAAC"}
|