@mikashboks/capture-intelligence-core 0.1.6 → 0.1.7
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/dist/cjs/document-classifier.d.ts.map +1 -1
- package/dist/cjs/document-classifier.js +73 -21
- package/dist/cjs/document-classifier.js.map +1 -1
- package/dist/cjs/index.d.ts +2 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +12 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/mrz-band-detector.d.ts +82 -0
- package/dist/cjs/mrz-band-detector.d.ts.map +1 -0
- package/dist/cjs/mrz-band-detector.js +245 -0
- package/dist/cjs/mrz-band-detector.js.map +1 -0
- package/dist/cjs/quality-checks.d.ts.map +1 -1
- package/dist/cjs/quality-checks.js +14 -2
- package/dist/cjs/quality-checks.js.map +1 -1
- package/dist/esm/document-classifier.d.ts.map +1 -1
- package/dist/esm/document-classifier.js +73 -21
- package/dist/esm/document-classifier.js.map +1 -1
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/mrz-band-detector.d.ts +82 -0
- package/dist/esm/mrz-band-detector.d.ts.map +1 -0
- package/dist/esm/mrz-band-detector.js +241 -0
- package/dist/esm/mrz-band-detector.js.map +1 -0
- package/dist/esm/quality-checks.d.ts.map +1 -1
- package/dist/esm/quality-checks.js +15 -3
- package/dist/esm/quality-checks.js.map +1 -1
- package/package.json +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-classifier.d.ts","sourceRoot":"","sources":["../../src/document-classifier.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AA+BlF,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACtC,qBAAqB,CAkDvB;AAID;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,iBAAiB,EAC1B,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,GAC3B,wBAAwB,
|
|
1
|
+
{"version":3,"file":"document-classifier.d.ts","sourceRoot":"","sources":["../../src/document-classifier.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AA+BlF,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACtC,qBAAqB,CAkDvB;AAID;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,iBAAiB,EAC1B,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,GAC3B,wBAAwB,CA6K1B"}
|
|
@@ -37,12 +37,12 @@ function normalizeDocType(docType) {
|
|
|
37
37
|
/* -- Per-document-type aspect ratio profiles ------------------------------ */
|
|
38
38
|
function getDocumentReviewProfile(documentType) {
|
|
39
39
|
const normalizedType = normalizeDocType(documentType);
|
|
40
|
-
// Passports -- biodata page is
|
|
40
|
+
// Passports -- biodata/photo page is landscape (~1.42:1).
|
|
41
41
|
if (normalizedType === 'passport') {
|
|
42
42
|
return {
|
|
43
43
|
aspectTargets: [1.42],
|
|
44
44
|
threshold: 58,
|
|
45
|
-
expectedOrientation: '
|
|
45
|
+
expectedOrientation: 'landscape',
|
|
46
46
|
};
|
|
47
47
|
}
|
|
48
48
|
// ID card, voter ID, driver's licence -- standard card-shaped documents
|
|
@@ -89,6 +89,8 @@ function getDocumentReviewProfile(documentType) {
|
|
|
89
89
|
* @param documentType - Optional document type hint for aspect-ratio matching
|
|
90
90
|
*/
|
|
91
91
|
function checkDocumentLikelihood(grey, imgData, w, h, documentType) {
|
|
92
|
+
const normalizedType = normalizeDocType(documentType);
|
|
93
|
+
const isPassport = normalizedType === 'passport';
|
|
92
94
|
const reviewProfile = getDocumentReviewProfile(documentType);
|
|
93
95
|
let score = 0;
|
|
94
96
|
// Single-pass Sobel: build edge map AND track gradient direction for
|
|
@@ -123,13 +125,25 @@ function checkDocumentLikelihood(grey, imgData, w, h, documentType) {
|
|
|
123
125
|
}
|
|
124
126
|
// 1. Edge density (widened for worn/faded Sierra Leone national IDs)
|
|
125
127
|
const edgeDensity = totalPixels > 0 ? edgePixels / totalPixels : 0;
|
|
126
|
-
if (
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
128
|
+
if (isPassport) {
|
|
129
|
+
// Passport biodata pages often contain watermarks, MRZ bands, and rotated
|
|
130
|
+
// note text. Treat dense-but-structured edges as valid evidence.
|
|
131
|
+
if (edgeDensity >= 0.05 && edgeDensity <= 0.36)
|
|
132
|
+
score += 25;
|
|
133
|
+
else if (edgeDensity >= 0.03 && edgeDensity <= 0.48)
|
|
134
|
+
score += 10;
|
|
135
|
+
else if (edgeDensity > 0.55)
|
|
136
|
+
score -= 10;
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
if (edgeDensity >= 0.05 && edgeDensity <= 0.22)
|
|
140
|
+
score += 25;
|
|
141
|
+
else if (edgeDensity >= 0.03 && edgeDensity <= 0.28)
|
|
142
|
+
score += 10;
|
|
143
|
+
// E10: Widened penalty threshold -- textured SL surfaces inflate edge density
|
|
144
|
+
else if (edgeDensity > 0.3)
|
|
145
|
+
score -= 10;
|
|
146
|
+
}
|
|
133
147
|
// 2. Aspect ratio -- match against the nearest supported document profile
|
|
134
148
|
const aspect = w > h ? w / h : h / w;
|
|
135
149
|
let bestAspectDiff = Number.POSITIVE_INFINITY;
|
|
@@ -186,22 +200,52 @@ function checkDocumentLikelihood(grey, imgData, w, h, documentType) {
|
|
|
186
200
|
}
|
|
187
201
|
const centerDensity = centerTotal > 0 ? centerEdges / centerTotal : 0;
|
|
188
202
|
const hasGlare = maxBrightness > 245;
|
|
189
|
-
if (
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
203
|
+
if (isPassport) {
|
|
204
|
+
if (centerDensity >= 0.06 && centerDensity <= 0.34)
|
|
205
|
+
score += 15;
|
|
206
|
+
else if (centerDensity >= 0.03 && centerDensity <= 0.44)
|
|
207
|
+
score += 5;
|
|
208
|
+
else if (centerDensity > 0.5)
|
|
209
|
+
score -= 10;
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
if (centerDensity >= 0.06 && centerDensity <= 0.2)
|
|
213
|
+
score += 15;
|
|
214
|
+
else if (centerDensity >= 0.03 && centerDensity <= 0.18)
|
|
215
|
+
score += 5;
|
|
216
|
+
else if (centerDensity > 0.2)
|
|
217
|
+
score -= 10;
|
|
218
|
+
}
|
|
195
219
|
// 5. Horizontal-edge dominance (text signature)
|
|
196
220
|
const edgeTotal = hEdgeSum + vEdgeSum;
|
|
221
|
+
let hasTextSignature = false;
|
|
197
222
|
if (edgeTotal > 0) {
|
|
198
223
|
const hRatio = hEdgeSum / edgeTotal;
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
224
|
+
const vRatio = vEdgeSum / edgeTotal;
|
|
225
|
+
if (isPassport) {
|
|
226
|
+
// Passport pages can be captured with note text or page header rotated
|
|
227
|
+
// relative to the phone, so either dominant text direction is useful.
|
|
228
|
+
if (hRatio >= 0.56 || vRatio >= 0.56) {
|
|
229
|
+
score += 15;
|
|
230
|
+
hasTextSignature = true;
|
|
231
|
+
}
|
|
232
|
+
else if (hRatio >= 0.52 || vRatio >= 0.52) {
|
|
233
|
+
score += 5;
|
|
234
|
+
hasTextSignature = true;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
if (hRatio >= 0.56) {
|
|
239
|
+
score += 15;
|
|
240
|
+
hasTextSignature = true;
|
|
241
|
+
}
|
|
242
|
+
else if (hRatio >= 0.52) {
|
|
243
|
+
score += 5;
|
|
244
|
+
hasTextSignature = true;
|
|
245
|
+
}
|
|
246
|
+
else if (hRatio < 0.46)
|
|
247
|
+
score -= 10;
|
|
248
|
+
}
|
|
205
249
|
}
|
|
206
250
|
// Rescue path: if aspect ratio matches strongly and some edges exist,
|
|
207
251
|
// set a minimum score -- handles clearly card-shaped objects that are too
|
|
@@ -209,6 +253,14 @@ function checkDocumentLikelihood(grey, imgData, w, h, documentType) {
|
|
|
209
253
|
if (bestAspectDiff < 0.1 && edgeDensity > 0.03 && score < 15) {
|
|
210
254
|
score = 15;
|
|
211
255
|
}
|
|
256
|
+
if (isPassport &&
|
|
257
|
+
bestAspectDiff < 0.16 &&
|
|
258
|
+
edgeDensity >= 0.03 &&
|
|
259
|
+
edgeDensity <= 0.52 &&
|
|
260
|
+
centerDensity >= 0.03 &&
|
|
261
|
+
(hasTextSignature || centerDensity >= 0.12)) {
|
|
262
|
+
score = Math.max(score, reviewProfile.threshold + 2);
|
|
263
|
+
}
|
|
212
264
|
return {
|
|
213
265
|
isLikelyDoc: score >= reviewProfile.threshold,
|
|
214
266
|
confidence: score,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-classifier.js","sourceRoot":"","sources":["../../src/document-classifier.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAiCH,4DAoDC;AAaD,
|
|
1
|
+
{"version":3,"file":"document-classifier.js","sourceRoot":"","sources":["../../src/document-classifier.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/index.d.ts
CHANGED
|
@@ -24,6 +24,8 @@ export type { EdgeEnergyProfile } from './sobel.js';
|
|
|
24
24
|
export { rgbaToGreyscale, rgbaToGreyscalePico, computeEdgeEnergyProfile, detectDocumentCropFromGrey, } from './sobel.js';
|
|
25
25
|
export type { EdgeAnalysisResult } from './metrics.js';
|
|
26
26
|
export { rgbaToGreyInPlace, computeBrightness, computeLaplacianVariance, computeLaplacianVarianceFloat, computeEdgeEnergy, detectDocumentRect, computeFrameDiff, analyzeFrame, looksLikeDocument, } from './metrics.js';
|
|
27
|
+
export type { MrzBandDetectionInput, MrzBandDetectionResult, MrzBandBoundingBox, } from './mrz-band-detector.js';
|
|
28
|
+
export { detectPassportMrzBand, MRZ_HORIZONTAL_GRADIENT_THRESHOLD, MRZ_ROW_DENSITY_RATIO_THRESHOLD, MRZ_MIN_BAND_HEIGHT, MRZ_MAX_BAND_HEIGHT, MRZ_MIN_BAND_WIDTH_FRAC, MRZ_MIN_BAND_ASPECT, MRZ_MAX_BAND_ASPECT, MRZ_SEARCH_TOP_FRAC, MRZ_DENSITY_SCORE_SATURATION, } from './mrz-band-detector.js';
|
|
27
29
|
export type { QualityFailureState, DocumentQualityInput, DocumentQualityResult, SelfieQualityInput, } from './quality-checks.js';
|
|
28
30
|
export { getQualityBucket, getSubmitAnywayThreshold, createQualityFailureState, countFailedReview, shouldShowSubmitAnyway, hasHardBlockingQualityFailure, getReviewModeFromDocumentType, runDocumentQualityChecks, runSelfieQualityChecks, checkFaceInImage, isFaceCentered, evaluateDocumentFailure, evaluateSelfieFailure, evaluateReviewFailure, getNextButtonDisabledReason, getOverrideButtonText, getOverrideBannerMessage, } from './quality-checks.js';
|
|
29
31
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/cjs/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/index.js
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
*/
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.computeLaplacianVarianceFloat = exports.computeLaplacianVariance = exports.computeBrightness = exports.rgbaToGreyInPlace = exports.detectDocumentCropFromGrey = exports.computeEdgeEnergyProfile = exports.rgbaToGreyscalePico = exports.rgbaToGreyscale = exports.getDocumentCaptureFrameAspectRatio = exports.buildCaptureNormalizationPlan = exports.getRotationToExpectedOrientation = exports.mapPreviewRectToImageCrop = exports.analyzeImageMetadata = exports.checkDocumentLikelihood = exports.getDocumentReviewProfile = exports.getPreviousFlowStepId = exports.getNextFlowStepId = exports.validateKycMobileWorkflowConfigContract = exports.KYC_MOBILE_VALID_ADDRESS_METHODS = exports.KYC_MOBILE_SIERRA_LEONE_STEP_ORDER = exports.KYC_MOBILE_REQUIRED_TERMINAL_STEP_IDS = exports.KYC_MOBILE_KNOWN_STEP_IDS = exports.KYC_MOBILE_ADDRESS_STEP_IDS = exports.isAddressStepComplete = exports.hasStructuredAddress = exports.hasAddressProofCoordinates = exports.getEffectiveAddressMethod = exports.getAddressMethodStartBehavior = exports.getRecommendedAddressMethod = exports.sanitizeAllowedAddressMethods = exports.isAddressMethod = exports.ADDRESS_METHOD_ORDER = exports.PICO_ANALYSIS_H = exports.PICO_ANALYSIS_W = exports.ADDRESS_SUBMIT_ANYWAY_FAILURE_THRESHOLD = exports.SELFIE_SUBMIT_ANYWAY_FAILURE_THRESHOLD = exports.DOC_SUBMIT_ANYWAY_FAILURE_THRESHOLD = exports.DOC_GALLERY_FAILURE_THRESHOLD = exports.CAM_DOC_CENTER_OFFSET_MAX = exports.CAM_EDGE_COVERAGE_THRESHOLD = exports.CAM_EDGE_PIXEL_THRESHOLD = exports.CAM_FRAME_DIFF_THRESHOLD = exports.CAM_STABLE_FRAMES_NEEDED = exports.CAM_EDGE_THRESHOLD = exports.CAM_BLUR_THRESHOLD = exports.CAM_BRIGHTNESS_MAX = exports.CAM_BRIGHTNESS_MIN = exports.CAM_ANALYSIS_H = exports.CAM_ANALYSIS_W = exports.CamState = void 0;
|
|
13
|
-
exports.getOverrideBannerMessage = exports.getOverrideButtonText = exports.getNextButtonDisabledReason = exports.evaluateReviewFailure = exports.evaluateSelfieFailure = exports.evaluateDocumentFailure = exports.isFaceCentered = exports.checkFaceInImage = exports.runSelfieQualityChecks = exports.runDocumentQualityChecks = exports.getReviewModeFromDocumentType = exports.hasHardBlockingQualityFailure = exports.shouldShowSubmitAnyway = exports.countFailedReview = exports.createQualityFailureState = exports.getSubmitAnywayThreshold = exports.getQualityBucket = exports.looksLikeDocument = exports.analyzeFrame = exports.computeFrameDiff = exports.detectDocumentRect = exports.computeEdgeEnergy = void 0;
|
|
13
|
+
exports.getOverrideBannerMessage = exports.getOverrideButtonText = exports.getNextButtonDisabledReason = exports.evaluateReviewFailure = exports.evaluateSelfieFailure = exports.evaluateDocumentFailure = exports.isFaceCentered = exports.checkFaceInImage = exports.runSelfieQualityChecks = exports.runDocumentQualityChecks = exports.getReviewModeFromDocumentType = exports.hasHardBlockingQualityFailure = exports.shouldShowSubmitAnyway = exports.countFailedReview = exports.createQualityFailureState = exports.getSubmitAnywayThreshold = exports.getQualityBucket = exports.MRZ_DENSITY_SCORE_SATURATION = exports.MRZ_SEARCH_TOP_FRAC = exports.MRZ_MAX_BAND_ASPECT = exports.MRZ_MIN_BAND_ASPECT = exports.MRZ_MIN_BAND_WIDTH_FRAC = exports.MRZ_MAX_BAND_HEIGHT = exports.MRZ_MIN_BAND_HEIGHT = exports.MRZ_ROW_DENSITY_RATIO_THRESHOLD = exports.MRZ_HORIZONTAL_GRADIENT_THRESHOLD = exports.detectPassportMrzBand = exports.looksLikeDocument = exports.analyzeFrame = exports.computeFrameDiff = exports.detectDocumentRect = exports.computeEdgeEnergy = void 0;
|
|
14
14
|
var types_js_1 = require("./types.js");
|
|
15
15
|
Object.defineProperty(exports, "CamState", { enumerable: true, get: function () { return types_js_1.CamState; } });
|
|
16
16
|
Object.defineProperty(exports, "CAM_ANALYSIS_W", { enumerable: true, get: function () { return types_js_1.CAM_ANALYSIS_W; } });
|
|
@@ -76,6 +76,17 @@ Object.defineProperty(exports, "detectDocumentRect", { enumerable: true, get: fu
|
|
|
76
76
|
Object.defineProperty(exports, "computeFrameDiff", { enumerable: true, get: function () { return metrics_js_1.computeFrameDiff; } });
|
|
77
77
|
Object.defineProperty(exports, "analyzeFrame", { enumerable: true, get: function () { return metrics_js_1.analyzeFrame; } });
|
|
78
78
|
Object.defineProperty(exports, "looksLikeDocument", { enumerable: true, get: function () { return metrics_js_1.looksLikeDocument; } });
|
|
79
|
+
var mrz_band_detector_js_1 = require("./mrz-band-detector.js");
|
|
80
|
+
Object.defineProperty(exports, "detectPassportMrzBand", { enumerable: true, get: function () { return mrz_band_detector_js_1.detectPassportMrzBand; } });
|
|
81
|
+
Object.defineProperty(exports, "MRZ_HORIZONTAL_GRADIENT_THRESHOLD", { enumerable: true, get: function () { return mrz_band_detector_js_1.MRZ_HORIZONTAL_GRADIENT_THRESHOLD; } });
|
|
82
|
+
Object.defineProperty(exports, "MRZ_ROW_DENSITY_RATIO_THRESHOLD", { enumerable: true, get: function () { return mrz_band_detector_js_1.MRZ_ROW_DENSITY_RATIO_THRESHOLD; } });
|
|
83
|
+
Object.defineProperty(exports, "MRZ_MIN_BAND_HEIGHT", { enumerable: true, get: function () { return mrz_band_detector_js_1.MRZ_MIN_BAND_HEIGHT; } });
|
|
84
|
+
Object.defineProperty(exports, "MRZ_MAX_BAND_HEIGHT", { enumerable: true, get: function () { return mrz_band_detector_js_1.MRZ_MAX_BAND_HEIGHT; } });
|
|
85
|
+
Object.defineProperty(exports, "MRZ_MIN_BAND_WIDTH_FRAC", { enumerable: true, get: function () { return mrz_band_detector_js_1.MRZ_MIN_BAND_WIDTH_FRAC; } });
|
|
86
|
+
Object.defineProperty(exports, "MRZ_MIN_BAND_ASPECT", { enumerable: true, get: function () { return mrz_band_detector_js_1.MRZ_MIN_BAND_ASPECT; } });
|
|
87
|
+
Object.defineProperty(exports, "MRZ_MAX_BAND_ASPECT", { enumerable: true, get: function () { return mrz_band_detector_js_1.MRZ_MAX_BAND_ASPECT; } });
|
|
88
|
+
Object.defineProperty(exports, "MRZ_SEARCH_TOP_FRAC", { enumerable: true, get: function () { return mrz_band_detector_js_1.MRZ_SEARCH_TOP_FRAC; } });
|
|
89
|
+
Object.defineProperty(exports, "MRZ_DENSITY_SCORE_SATURATION", { enumerable: true, get: function () { return mrz_band_detector_js_1.MRZ_DENSITY_SCORE_SATURATION; } });
|
|
79
90
|
var quality_checks_js_1 = require("./quality-checks.js");
|
|
80
91
|
Object.defineProperty(exports, "getQualityBucket", { enumerable: true, get: function () { return quality_checks_js_1.getQualityBucket; } });
|
|
81
92
|
Object.defineProperty(exports, "getSubmitAnywayThreshold", { enumerable: true, get: function () { return quality_checks_js_1.getSubmitAnywayThreshold; } });
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;;AAuBH,uCAmBoB;AAlBlB,oGAAA,QAAQ,OAAA;AACR,0GAAA,cAAc,OAAA;AACd,0GAAA,cAAc,OAAA;AACd,8GAAA,kBAAkB,OAAA;AAClB,8GAAA,kBAAkB,OAAA;AAClB,8GAAA,kBAAkB,OAAA;AAClB,8GAAA,kBAAkB,OAAA;AAClB,oHAAA,wBAAwB,OAAA;AACxB,oHAAA,wBAAwB,OAAA;AACxB,oHAAA,wBAAwB,OAAA;AACxB,uHAAA,2BAA2B,OAAA;AAC3B,qHAAA,yBAAyB,OAAA;AACzB,yHAAA,6BAA6B,OAAA;AAC7B,+HAAA,mCAAmC,OAAA;AACnC,kIAAA,sCAAsC,OAAA;AACtC,mIAAA,uCAAuC,OAAA;AACvC,2GAAA,eAAe,OAAA;AACf,2GAAA,eAAe,OAAA;AAWjB,uDAU4B;AAT1B,wHAAA,oBAAoB,OAAA;AACpB,mHAAA,eAAe,OAAA;AACf,iIAAA,6BAA6B,OAAA;AAC7B,+HAAA,2BAA2B,OAAA;AAC3B,iIAAA,6BAA6B,OAAA;AAC7B,6HAAA,yBAAyB,OAAA;AACzB,8HAAA,0BAA0B,OAAA;AAC1B,wHAAA,oBAAoB,OAAA;AACpB,yHAAA,qBAAqB,OAAA;AASvB,mEAOkC;AANhC,qIAAA,2BAA2B,OAAA;AAC3B,mIAAA,yBAAyB,OAAA;AACzB,+IAAA,qCAAqC,OAAA;AACrC,4IAAA,kCAAkC,OAAA;AAClC,0IAAA,gCAAgC,OAAA;AAChC,iJAAA,uCAAuC,OAAA;AAKzC,qDAA6E;AAApE,oHAAA,iBAAiB,OAAA;AAAE,wHAAA,qBAAqB,OAAA;AAEjD,+EAA+E;AAC/E,mEAGkC;AAFhC,kIAAA,wBAAwB,OAAA;AACxB,iIAAA,uBAAuB,OAAA;AAKzB,2DAA4D;AAAnD,0HAAA,oBAAoB,OAAA;AAgB7B,uEAKoC;AAJlC,qIAAA,yBAAyB,OAAA;AACzB,4IAAA,gCAAgC,OAAA;AAChC,yIAAA,6BAA6B,OAAA;AAC7B,8IAAA,kCAAkC,OAAA;AAKpC,uCAKoB;AAJlB,2GAAA,eAAe,OAAA;AACf,+GAAA,mBAAmB,OAAA;AACnB,oHAAA,wBAAwB,OAAA;AACxB,sHAAA,0BAA0B,OAAA;AAK5B,2CAUsB;AATpB,+GAAA,iBAAiB,OAAA;AACjB,+GAAA,iBAAiB,OAAA;AACjB,sHAAA,wBAAwB,OAAA;AACxB,2HAAA,6BAA6B,OAAA;AAC7B,+GAAA,iBAAiB,OAAA;AACjB,gHAAA,kBAAkB,OAAA;AAClB,8GAAA,gBAAgB,OAAA;AAChB,0GAAA,YAAY,OAAA;AACZ,+GAAA,iBAAiB,OAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;;AAuBH,uCAmBoB;AAlBlB,oGAAA,QAAQ,OAAA;AACR,0GAAA,cAAc,OAAA;AACd,0GAAA,cAAc,OAAA;AACd,8GAAA,kBAAkB,OAAA;AAClB,8GAAA,kBAAkB,OAAA;AAClB,8GAAA,kBAAkB,OAAA;AAClB,8GAAA,kBAAkB,OAAA;AAClB,oHAAA,wBAAwB,OAAA;AACxB,oHAAA,wBAAwB,OAAA;AACxB,oHAAA,wBAAwB,OAAA;AACxB,uHAAA,2BAA2B,OAAA;AAC3B,qHAAA,yBAAyB,OAAA;AACzB,yHAAA,6BAA6B,OAAA;AAC7B,+HAAA,mCAAmC,OAAA;AACnC,kIAAA,sCAAsC,OAAA;AACtC,mIAAA,uCAAuC,OAAA;AACvC,2GAAA,eAAe,OAAA;AACf,2GAAA,eAAe,OAAA;AAWjB,uDAU4B;AAT1B,wHAAA,oBAAoB,OAAA;AACpB,mHAAA,eAAe,OAAA;AACf,iIAAA,6BAA6B,OAAA;AAC7B,+HAAA,2BAA2B,OAAA;AAC3B,iIAAA,6BAA6B,OAAA;AAC7B,6HAAA,yBAAyB,OAAA;AACzB,8HAAA,0BAA0B,OAAA;AAC1B,wHAAA,oBAAoB,OAAA;AACpB,yHAAA,qBAAqB,OAAA;AASvB,mEAOkC;AANhC,qIAAA,2BAA2B,OAAA;AAC3B,mIAAA,yBAAyB,OAAA;AACzB,+IAAA,qCAAqC,OAAA;AACrC,4IAAA,kCAAkC,OAAA;AAClC,0IAAA,gCAAgC,OAAA;AAChC,iJAAA,uCAAuC,OAAA;AAKzC,qDAA6E;AAApE,oHAAA,iBAAiB,OAAA;AAAE,wHAAA,qBAAqB,OAAA;AAEjD,+EAA+E;AAC/E,mEAGkC;AAFhC,kIAAA,wBAAwB,OAAA;AACxB,iIAAA,uBAAuB,OAAA;AAKzB,2DAA4D;AAAnD,0HAAA,oBAAoB,OAAA;AAgB7B,uEAKoC;AAJlC,qIAAA,yBAAyB,OAAA;AACzB,4IAAA,gCAAgC,OAAA;AAChC,yIAAA,6BAA6B,OAAA;AAC7B,8IAAA,kCAAkC,OAAA;AAKpC,uCAKoB;AAJlB,2GAAA,eAAe,OAAA;AACf,+GAAA,mBAAmB,OAAA;AACnB,oHAAA,wBAAwB,OAAA;AACxB,sHAAA,0BAA0B,OAAA;AAK5B,2CAUsB;AATpB,+GAAA,iBAAiB,OAAA;AACjB,+GAAA,iBAAiB,OAAA;AACjB,sHAAA,wBAAwB,OAAA;AACxB,2HAAA,6BAA6B,OAAA;AAC7B,+GAAA,iBAAiB,OAAA;AACjB,gHAAA,kBAAkB,OAAA;AAClB,8GAAA,gBAAgB,OAAA;AAChB,0GAAA,YAAY,OAAA;AACZ,+GAAA,iBAAiB,OAAA;AASnB,+DAWgC;AAV9B,6HAAA,qBAAqB,OAAA;AACrB,yIAAA,iCAAiC,OAAA;AACjC,uIAAA,+BAA+B,OAAA;AAC/B,2HAAA,mBAAmB,OAAA;AACnB,2HAAA,mBAAmB,OAAA;AACnB,+HAAA,uBAAuB,OAAA;AACvB,2HAAA,mBAAmB,OAAA;AACnB,2HAAA,mBAAmB,OAAA;AACnB,2HAAA,mBAAmB,OAAA;AACnB,oIAAA,4BAA4B,OAAA;AAU9B,yDAkB6B;AAjB3B,qHAAA,gBAAgB,OAAA;AAChB,6HAAA,wBAAwB,OAAA;AACxB,8HAAA,yBAAyB,OAAA;AACzB,sHAAA,iBAAiB,OAAA;AACjB,2HAAA,sBAAsB,OAAA;AACtB,kIAAA,6BAA6B,OAAA;AAC7B,kIAAA,6BAA6B,OAAA;AAC7B,6HAAA,wBAAwB,OAAA;AACxB,2HAAA,sBAAsB,OAAA;AACtB,qHAAA,gBAAgB,OAAA;AAChB,mHAAA,cAAc,OAAA;AACd,4HAAA,uBAAuB,OAAA;AACvB,0HAAA,qBAAqB,OAAA;AACrB,0HAAA,qBAAqB,OAAA;AACrB,gIAAA,2BAA2B,OAAA;AAC3B,0HAAA,qBAAqB,OAAA;AACrB,6HAAA,wBAAwB,OAAA"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Passport MRZ-band detector — pure JS, no OpenCV.
|
|
3
|
+
*
|
|
4
|
+
* The Machine Readable Zone of a passport is a uniquely identifiable signature
|
|
5
|
+
* that no other document type carries: 2 (TD3) or 3 (TD2/TD1) lines of
|
|
6
|
+
* fixed-width OCR-B characters at the bottom of the photo page. Each character
|
|
7
|
+
* has multiple vertical strokes, so the MRZ band shows up in any frame as a
|
|
8
|
+
* very dense cluster of horizontal-gradient pixels in a wide, thin
|
|
9
|
+
* horizontal slab in the lower portion of the document.
|
|
10
|
+
*
|
|
11
|
+
* This detector is the Phase 2 positive signal: if it fires, the passport
|
|
12
|
+
* photo page is unambiguously present in the frame, regardless of whether
|
|
13
|
+
* the contour detector found a clean quad.
|
|
14
|
+
*
|
|
15
|
+
* Algorithm (cheap enough for 15 fps on 320×240 mid-range Android):
|
|
16
|
+
* 1. Restrict search to the bottom ~40% of the overlay region.
|
|
17
|
+
* 2. For each row in that slice, count pixels where the absolute
|
|
18
|
+
* horizontal gradient |I(x+1) − I(x−1)| exceeds a fixed threshold,
|
|
19
|
+
* and record the leftmost / rightmost strong-gradient column.
|
|
20
|
+
* 3. Find the longest run of consecutive rows whose density exceeds
|
|
21
|
+
* a fraction of the slice's max row density.
|
|
22
|
+
* 4. If the run is in the expected band-height range AND the union of
|
|
23
|
+
* its strong-gradient columns covers a wide-enough horizontal span
|
|
24
|
+
* AND the band's aspect ratio (width / height) is in MRZ range
|
|
25
|
+
* (typically 4:1 – 25:1), report it as found.
|
|
26
|
+
*
|
|
27
|
+
* Inspired by Adrian Rosebrock, "Detecting machine-readable zones in passport
|
|
28
|
+
* images" (PyImageSearch, 2015) — adapted to a per-row density profile to
|
|
29
|
+
* avoid the expensive bottom-hat morphology while keeping the same intuition.
|
|
30
|
+
*/
|
|
31
|
+
export declare const MRZ_HORIZONTAL_GRADIENT_THRESHOLD = 30;
|
|
32
|
+
export declare const MRZ_ROW_DENSITY_RATIO_THRESHOLD = 0.55;
|
|
33
|
+
export declare const MRZ_MIN_BAND_HEIGHT = 6;
|
|
34
|
+
export declare const MRZ_MAX_BAND_HEIGHT = 50;
|
|
35
|
+
export declare const MRZ_MIN_LINE_HEIGHT = 3;
|
|
36
|
+
export declare const MRZ_MAX_LINE_GAP = 8;
|
|
37
|
+
export declare const MRZ_MIN_BAND_WIDTH_FRAC = 0.4;
|
|
38
|
+
export declare const MRZ_MIN_BAND_ASPECT = 4;
|
|
39
|
+
export declare const MRZ_MAX_BAND_ASPECT = 30;
|
|
40
|
+
/** MRZ search window: bottom 0.55 → 1.0 of the overlay region (excludes the photo half). */
|
|
41
|
+
export declare const MRZ_SEARCH_TOP_FRAC = 0.55;
|
|
42
|
+
/** Density at which the row-density score saturates (1.0). */
|
|
43
|
+
export declare const MRZ_DENSITY_SCORE_SATURATION = 0.45;
|
|
44
|
+
export interface MrzBandDetectionInput {
|
|
45
|
+
/** Greyscale buffer, row-major, length = greyW × greyH. */
|
|
46
|
+
grey: Uint8Array | Uint8ClampedArray;
|
|
47
|
+
/** Width of the greyscale buffer. */
|
|
48
|
+
greyW: number;
|
|
49
|
+
/** Height of the greyscale buffer. */
|
|
50
|
+
greyH: number;
|
|
51
|
+
/**
|
|
52
|
+
* Region of interest in greyW×greyH pixel coords. The MRZ is searched in
|
|
53
|
+
* the bottom `MRZ_SEARCH_TOP_FRAC..1.0` of this region.
|
|
54
|
+
*/
|
|
55
|
+
region: {
|
|
56
|
+
x1: number;
|
|
57
|
+
y1: number;
|
|
58
|
+
x2: number;
|
|
59
|
+
y2: number;
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
export interface MrzBandBoundingBox {
|
|
63
|
+
x: number;
|
|
64
|
+
y: number;
|
|
65
|
+
w: number;
|
|
66
|
+
h: number;
|
|
67
|
+
}
|
|
68
|
+
export interface MrzBandDetectionResult {
|
|
69
|
+
found: boolean;
|
|
70
|
+
/** 0–1 confidence; 0 when not found. */
|
|
71
|
+
confidence: number;
|
|
72
|
+
/** Bounding box in greyW×greyH pixel coords; null when not found. */
|
|
73
|
+
bbox: MrzBandBoundingBox | null;
|
|
74
|
+
/** Maximum row-density observed in the search slice (0–1). Useful for tracing. */
|
|
75
|
+
peakRowDensity: number;
|
|
76
|
+
/** Width of the detected band as a fraction of region width (0–1). 0 when not found. */
|
|
77
|
+
bandWidthFraction: number;
|
|
78
|
+
/** Width / height of the detected band; 0 when not found. */
|
|
79
|
+
bandAspectRatio: number;
|
|
80
|
+
}
|
|
81
|
+
export declare function detectPassportMrzBand(input: MrzBandDetectionInput): MrzBandDetectionResult;
|
|
82
|
+
//# sourceMappingURL=mrz-band-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mrz-band-detector.d.ts","sourceRoot":"","sources":["../../src/mrz-band-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,eAAO,MAAM,iCAAiC,KAAK,CAAC;AACpD,eAAO,MAAM,+BAA+B,OAAO,CAAC;AACpD,eAAO,MAAM,mBAAmB,IAAI,CAAC;AACrC,eAAO,MAAM,mBAAmB,KAAK,CAAC;AACtC,eAAO,MAAM,mBAAmB,IAAI,CAAC;AACrC,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAClC,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAC3C,eAAO,MAAM,mBAAmB,IAAI,CAAC;AACrC,eAAO,MAAM,mBAAmB,KAAK,CAAC;AACtC,4FAA4F;AAC5F,eAAO,MAAM,mBAAmB,OAAO,CAAC;AACxC,8DAA8D;AAC9D,eAAO,MAAM,4BAA4B,OAAO,CAAC;AAEjD,MAAM,WAAW,qBAAqB;IACpC,2DAA2D;IAC3D,IAAI,EAAE,UAAU,GAAG,iBAAiB,CAAC;IACrC,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5D;AAED,MAAM,WAAW,kBAAkB;IACjC,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,OAAO,CAAC;IACf,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,IAAI,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAChC,kFAAkF;IAClF,cAAc,EAAE,MAAM,CAAC;IACvB,wFAAwF;IACxF,iBAAiB,EAAE,MAAM,CAAC;IAC1B,6DAA6D;IAC7D,eAAe,EAAE,MAAM,CAAC;CACzB;AAWD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,qBAAqB,GAAG,sBAAsB,CAmN1F"}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Passport MRZ-band detector — pure JS, no OpenCV.
|
|
4
|
+
*
|
|
5
|
+
* The Machine Readable Zone of a passport is a uniquely identifiable signature
|
|
6
|
+
* that no other document type carries: 2 (TD3) or 3 (TD2/TD1) lines of
|
|
7
|
+
* fixed-width OCR-B characters at the bottom of the photo page. Each character
|
|
8
|
+
* has multiple vertical strokes, so the MRZ band shows up in any frame as a
|
|
9
|
+
* very dense cluster of horizontal-gradient pixels in a wide, thin
|
|
10
|
+
* horizontal slab in the lower portion of the document.
|
|
11
|
+
*
|
|
12
|
+
* This detector is the Phase 2 positive signal: if it fires, the passport
|
|
13
|
+
* photo page is unambiguously present in the frame, regardless of whether
|
|
14
|
+
* the contour detector found a clean quad.
|
|
15
|
+
*
|
|
16
|
+
* Algorithm (cheap enough for 15 fps on 320×240 mid-range Android):
|
|
17
|
+
* 1. Restrict search to the bottom ~40% of the overlay region.
|
|
18
|
+
* 2. For each row in that slice, count pixels where the absolute
|
|
19
|
+
* horizontal gradient |I(x+1) − I(x−1)| exceeds a fixed threshold,
|
|
20
|
+
* and record the leftmost / rightmost strong-gradient column.
|
|
21
|
+
* 3. Find the longest run of consecutive rows whose density exceeds
|
|
22
|
+
* a fraction of the slice's max row density.
|
|
23
|
+
* 4. If the run is in the expected band-height range AND the union of
|
|
24
|
+
* its strong-gradient columns covers a wide-enough horizontal span
|
|
25
|
+
* AND the band's aspect ratio (width / height) is in MRZ range
|
|
26
|
+
* (typically 4:1 – 25:1), report it as found.
|
|
27
|
+
*
|
|
28
|
+
* Inspired by Adrian Rosebrock, "Detecting machine-readable zones in passport
|
|
29
|
+
* images" (PyImageSearch, 2015) — adapted to a per-row density profile to
|
|
30
|
+
* avoid the expensive bottom-hat morphology while keeping the same intuition.
|
|
31
|
+
*/
|
|
32
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
33
|
+
exports.MRZ_DENSITY_SCORE_SATURATION = exports.MRZ_SEARCH_TOP_FRAC = exports.MRZ_MAX_BAND_ASPECT = exports.MRZ_MIN_BAND_ASPECT = exports.MRZ_MIN_BAND_WIDTH_FRAC = exports.MRZ_MAX_LINE_GAP = exports.MRZ_MIN_LINE_HEIGHT = exports.MRZ_MAX_BAND_HEIGHT = exports.MRZ_MIN_BAND_HEIGHT = exports.MRZ_ROW_DENSITY_RATIO_THRESHOLD = exports.MRZ_HORIZONTAL_GRADIENT_THRESHOLD = void 0;
|
|
34
|
+
exports.detectPassportMrzBand = detectPassportMrzBand;
|
|
35
|
+
exports.MRZ_HORIZONTAL_GRADIENT_THRESHOLD = 30;
|
|
36
|
+
exports.MRZ_ROW_DENSITY_RATIO_THRESHOLD = 0.55;
|
|
37
|
+
exports.MRZ_MIN_BAND_HEIGHT = 6;
|
|
38
|
+
exports.MRZ_MAX_BAND_HEIGHT = 50;
|
|
39
|
+
exports.MRZ_MIN_LINE_HEIGHT = 3;
|
|
40
|
+
exports.MRZ_MAX_LINE_GAP = 8;
|
|
41
|
+
exports.MRZ_MIN_BAND_WIDTH_FRAC = 0.4;
|
|
42
|
+
exports.MRZ_MIN_BAND_ASPECT = 4;
|
|
43
|
+
exports.MRZ_MAX_BAND_ASPECT = 30;
|
|
44
|
+
/** MRZ search window: bottom 0.55 → 1.0 of the overlay region (excludes the photo half). */
|
|
45
|
+
exports.MRZ_SEARCH_TOP_FRAC = 0.55;
|
|
46
|
+
/** Density at which the row-density score saturates (1.0). */
|
|
47
|
+
exports.MRZ_DENSITY_SCORE_SATURATION = 0.45;
|
|
48
|
+
const EMPTY_RESULT = Object.freeze({
|
|
49
|
+
found: false,
|
|
50
|
+
confidence: 0,
|
|
51
|
+
bbox: null,
|
|
52
|
+
peakRowDensity: 0,
|
|
53
|
+
bandWidthFraction: 0,
|
|
54
|
+
bandAspectRatio: 0,
|
|
55
|
+
});
|
|
56
|
+
function detectPassportMrzBand(input) {
|
|
57
|
+
const { grey, greyW, greyH, region } = input;
|
|
58
|
+
if (!grey || grey.length < greyW * greyH)
|
|
59
|
+
return EMPTY_RESULT;
|
|
60
|
+
const rx1 = Math.max(1, Math.min(greyW - 2, Math.round(region.x1)));
|
|
61
|
+
const ry1 = Math.max(1, Math.min(greyH - 2, Math.round(region.y1)));
|
|
62
|
+
const rx2 = Math.max(rx1 + 2, Math.min(greyW - 1, Math.round(region.x2)));
|
|
63
|
+
const ry2 = Math.max(ry1 + 2, Math.min(greyH - 1, Math.round(region.y2)));
|
|
64
|
+
const regionW = rx2 - rx1;
|
|
65
|
+
const regionH = ry2 - ry1;
|
|
66
|
+
if (regionW < 32 || regionH < 18)
|
|
67
|
+
return EMPTY_RESULT;
|
|
68
|
+
const sliceY1 = ry1 + Math.floor(regionH * exports.MRZ_SEARCH_TOP_FRAC);
|
|
69
|
+
const sliceY2 = ry2;
|
|
70
|
+
const sliceH = sliceY2 - sliceY1;
|
|
71
|
+
if (sliceH < exports.MRZ_MIN_BAND_HEIGHT)
|
|
72
|
+
return EMPTY_RESULT;
|
|
73
|
+
const rowDensity = new Float32Array(sliceH);
|
|
74
|
+
const rowFirst = new Int32Array(sliceH);
|
|
75
|
+
const rowLast = new Int32Array(sliceH);
|
|
76
|
+
rowFirst.fill(-1);
|
|
77
|
+
rowLast.fill(-1);
|
|
78
|
+
let maxDensity = 0;
|
|
79
|
+
for (let dy = 0; dy < sliceH; dy++) {
|
|
80
|
+
const y = sliceY1 + dy;
|
|
81
|
+
const rowOffset = y * greyW;
|
|
82
|
+
let count = 0;
|
|
83
|
+
let first = -1;
|
|
84
|
+
let last = -1;
|
|
85
|
+
for (let x = rx1; x < rx2; x++) {
|
|
86
|
+
const gx = Math.abs(grey[rowOffset + x + 1] - grey[rowOffset + x - 1]);
|
|
87
|
+
if (gx > exports.MRZ_HORIZONTAL_GRADIENT_THRESHOLD) {
|
|
88
|
+
count++;
|
|
89
|
+
if (first === -1)
|
|
90
|
+
first = x;
|
|
91
|
+
last = x;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Density measures the strong-edge ratio WITHIN the detected text span,
|
|
95
|
+
// not across the full region. Real MRZ text rarely spans the entire
|
|
96
|
+
// overlay width (margins, hand position) — normalizing by the text span
|
|
97
|
+
// gives a truer "how dense are the strokes here" signal that's
|
|
98
|
+
// comparable across different overlay sizes and document positions.
|
|
99
|
+
//
|
|
100
|
+
// Falls back to region-width normalization when:
|
|
101
|
+
// - no edges fired (blank rows stay at 0 density), OR
|
|
102
|
+
// - the detected span is too narrow / count is too low to be a
|
|
103
|
+
// credible MRZ row. Without this guard, a single isolated noise
|
|
104
|
+
// pixel would produce density=1/1=1.0, saturating the trace's
|
|
105
|
+
// `peakRowDensity` field with a misleading "MRZ-strong" reading.
|
|
106
|
+
// The bandWidthFraction / bandAspectRatio gates further down would
|
|
107
|
+
// still reject the candidate, but the trace would lie about why.
|
|
108
|
+
const span = first === -1 ? regionW : Math.max(1, last - first + 1);
|
|
109
|
+
const isPlausibleTextRow = count >= 6 && last - first >= 8;
|
|
110
|
+
const density = isPlausibleTextRow ? count / span : count / regionW;
|
|
111
|
+
rowDensity[dy] = density;
|
|
112
|
+
rowFirst[dy] = first;
|
|
113
|
+
rowLast[dy] = last;
|
|
114
|
+
if (density > maxDensity)
|
|
115
|
+
maxDensity = density;
|
|
116
|
+
}
|
|
117
|
+
if (maxDensity <= 0)
|
|
118
|
+
return { ...EMPTY_RESULT, peakRowDensity: 0 };
|
|
119
|
+
// Find runs of "dense" rows. Real TD3 passport MRZs are usually two OCR
|
|
120
|
+
// rows with a small interline gap, not one continuous slab. We therefore
|
|
121
|
+
// keep every plausible run and score either a single run or two adjacent
|
|
122
|
+
// runs merged across a small gap.
|
|
123
|
+
const denseThreshold = Math.max(0.05, maxDensity * exports.MRZ_ROW_DENSITY_RATIO_THRESHOLD);
|
|
124
|
+
const runs = [];
|
|
125
|
+
let curStart = -1;
|
|
126
|
+
for (let i = 0; i <= sliceH; i++) {
|
|
127
|
+
const isDense = i < sliceH && rowDensity[i] >= denseThreshold;
|
|
128
|
+
if (isDense) {
|
|
129
|
+
if (curStart === -1)
|
|
130
|
+
curStart = i;
|
|
131
|
+
}
|
|
132
|
+
else if (curStart !== -1) {
|
|
133
|
+
const start = curStart;
|
|
134
|
+
const end = i - 1;
|
|
135
|
+
let left = Infinity;
|
|
136
|
+
let right = -Infinity;
|
|
137
|
+
let peakDensity = 0;
|
|
138
|
+
for (let r = start; r <= end; r++) {
|
|
139
|
+
if (rowFirst[r] >= 0 && rowFirst[r] < left)
|
|
140
|
+
left = rowFirst[r];
|
|
141
|
+
if (rowLast[r] > right)
|
|
142
|
+
right = rowLast[r];
|
|
143
|
+
if (rowDensity[r] > peakDensity)
|
|
144
|
+
peakDensity = rowDensity[r];
|
|
145
|
+
}
|
|
146
|
+
if (end - start + 1 >= exports.MRZ_MIN_LINE_HEIGHT && Number.isFinite(left) && right >= left) {
|
|
147
|
+
runs.push({
|
|
148
|
+
start,
|
|
149
|
+
end,
|
|
150
|
+
denseRows: end - start + 1,
|
|
151
|
+
left,
|
|
152
|
+
right,
|
|
153
|
+
peakDensity,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
curStart = -1;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
if (runs.length === 0) {
|
|
160
|
+
return { ...EMPTY_RESULT, peakRowDensity: maxDensity };
|
|
161
|
+
}
|
|
162
|
+
const scoreBand = (band) => {
|
|
163
|
+
const visualHeight = band.end - band.start + 1;
|
|
164
|
+
const bandW = band.right - band.left + 1;
|
|
165
|
+
const bandWFrac = bandW / regionW;
|
|
166
|
+
const bandAspect = bandW / Math.max(1, visualHeight);
|
|
167
|
+
const heightOk = band.denseRows >= exports.MRZ_MIN_BAND_HEIGHT &&
|
|
168
|
+
visualHeight >= exports.MRZ_MIN_BAND_HEIGHT &&
|
|
169
|
+
visualHeight <= exports.MRZ_MAX_BAND_HEIGHT;
|
|
170
|
+
const widthOk = bandWFrac >= exports.MRZ_MIN_BAND_WIDTH_FRAC;
|
|
171
|
+
const aspectOk = bandAspect >= exports.MRZ_MIN_BAND_ASPECT && bandAspect <= exports.MRZ_MAX_BAND_ASPECT;
|
|
172
|
+
const densityScore = Math.min(1, band.peakDensity / exports.MRZ_DENSITY_SCORE_SATURATION);
|
|
173
|
+
const widthScore = Math.min(1, Math.max(0, (bandWFrac - exports.MRZ_MIN_BAND_WIDTH_FRAC) / 0.4));
|
|
174
|
+
const aspectScore = bandAspect >= 6 && bandAspect <= 20 ? 1 : 0.6;
|
|
175
|
+
const lineScore = band.lineCount >= 2 ? 1 : 0.82;
|
|
176
|
+
const confidence = Math.max(0, Math.min(1, 0.34 * densityScore + 0.26 * widthScore + 0.24 * aspectScore + 0.16 * lineScore));
|
|
177
|
+
return {
|
|
178
|
+
...band,
|
|
179
|
+
visualHeight,
|
|
180
|
+
bandW,
|
|
181
|
+
bandWFrac,
|
|
182
|
+
bandAspect,
|
|
183
|
+
found: heightOk && widthOk && aspectOk,
|
|
184
|
+
confidence,
|
|
185
|
+
};
|
|
186
|
+
};
|
|
187
|
+
const candidates = [];
|
|
188
|
+
for (let i = 0; i < runs.length; i++) {
|
|
189
|
+
const run = runs[i];
|
|
190
|
+
candidates.push(scoreBand({
|
|
191
|
+
start: run.start,
|
|
192
|
+
end: run.end,
|
|
193
|
+
denseRows: run.denseRows,
|
|
194
|
+
left: run.left,
|
|
195
|
+
right: run.right,
|
|
196
|
+
lineCount: 1,
|
|
197
|
+
peakDensity: run.peakDensity,
|
|
198
|
+
}));
|
|
199
|
+
const next = runs[i + 1];
|
|
200
|
+
if (!next)
|
|
201
|
+
continue;
|
|
202
|
+
const gap = next.start - run.end - 1;
|
|
203
|
+
if (gap < 0 || gap > exports.MRZ_MAX_LINE_GAP)
|
|
204
|
+
continue;
|
|
205
|
+
candidates.push(scoreBand({
|
|
206
|
+
start: run.start,
|
|
207
|
+
end: next.end,
|
|
208
|
+
denseRows: run.denseRows + next.denseRows,
|
|
209
|
+
left: Math.min(run.left, next.left),
|
|
210
|
+
right: Math.max(run.right, next.right),
|
|
211
|
+
lineCount: 2,
|
|
212
|
+
peakDensity: Math.max(run.peakDensity, next.peakDensity),
|
|
213
|
+
}));
|
|
214
|
+
}
|
|
215
|
+
candidates.sort((a, b) => {
|
|
216
|
+
if (Number(a.found) !== Number(b.found))
|
|
217
|
+
return Number(b.found) - Number(a.found);
|
|
218
|
+
return b.confidence - a.confidence;
|
|
219
|
+
});
|
|
220
|
+
const best = candidates[0];
|
|
221
|
+
if (!best)
|
|
222
|
+
return { ...EMPTY_RESULT, peakRowDensity: maxDensity };
|
|
223
|
+
if (!best.found) {
|
|
224
|
+
return {
|
|
225
|
+
...EMPTY_RESULT,
|
|
226
|
+
peakRowDensity: maxDensity,
|
|
227
|
+
bandWidthFraction: best.bandWFrac,
|
|
228
|
+
bandAspectRatio: best.bandAspect,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
return {
|
|
232
|
+
found: true,
|
|
233
|
+
confidence: best.confidence,
|
|
234
|
+
bbox: {
|
|
235
|
+
x: best.left,
|
|
236
|
+
y: sliceY1 + best.start,
|
|
237
|
+
w: best.bandW,
|
|
238
|
+
h: best.visualHeight,
|
|
239
|
+
},
|
|
240
|
+
peakRowDensity: maxDensity,
|
|
241
|
+
bandWidthFraction: best.bandWFrac,
|
|
242
|
+
bandAspectRatio: best.bandAspect,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=mrz-band-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mrz-band-detector.js","sourceRoot":"","sources":["../../src/mrz-band-detector.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;;;AA4DH,sDAmNC;AA7QY,QAAA,iCAAiC,GAAG,EAAE,CAAC;AACvC,QAAA,+BAA+B,GAAG,IAAI,CAAC;AACvC,QAAA,mBAAmB,GAAG,CAAC,CAAC;AACxB,QAAA,mBAAmB,GAAG,EAAE,CAAC;AACzB,QAAA,mBAAmB,GAAG,CAAC,CAAC;AACxB,QAAA,gBAAgB,GAAG,CAAC,CAAC;AACrB,QAAA,uBAAuB,GAAG,GAAG,CAAC;AAC9B,QAAA,mBAAmB,GAAG,CAAC,CAAC;AACxB,QAAA,mBAAmB,GAAG,EAAE,CAAC;AACtC,4FAA4F;AAC/E,QAAA,mBAAmB,GAAG,IAAI,CAAC;AACxC,8DAA8D;AACjD,QAAA,4BAA4B,GAAG,IAAI,CAAC;AAqCjD,MAAM,YAAY,GAA2B,MAAM,CAAC,MAAM,CAAC;IACzD,KAAK,EAAE,KAAK;IACZ,UAAU,EAAE,CAAC;IACb,IAAI,EAAE,IAAI;IACV,cAAc,EAAE,CAAC;IACjB,iBAAiB,EAAE,CAAC;IACpB,eAAe,EAAE,CAAC;CACnB,CAAC,CAAC;AAEH,SAAgB,qBAAqB,CAAC,KAA4B;IAChE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAC7C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,KAAK,GAAG,KAAK;QAAE,OAAO,YAAY,CAAC;IAE9D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACpE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACpE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1E,MAAM,OAAO,GAAG,GAAG,GAAG,GAAG,CAAC;IAC1B,MAAM,OAAO,GAAG,GAAG,GAAG,GAAG,CAAC;IAC1B,IAAI,OAAO,GAAG,EAAE,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,YAAY,CAAC;IAEtD,MAAM,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,2BAAmB,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,GAAG,CAAC;IACpB,MAAM,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;IACjC,IAAI,MAAM,GAAG,2BAAmB;QAAE,OAAO,YAAY,CAAC;IAEtD,MAAM,UAAU,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IACvC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAEjB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;QACnC,MAAM,CAAC,GAAG,OAAO,GAAG,EAAE,CAAC;QACvB,MAAM,SAAS,GAAG,CAAC,GAAG,KAAK,CAAC;QAC5B,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;QACf,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC;QACd,KAAK,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACvE,IAAI,EAAE,GAAG,yCAAiC,EAAE,CAAC;gBAC3C,KAAK,EAAE,CAAC;gBACR,IAAI,KAAK,KAAK,CAAC,CAAC;oBAAE,KAAK,GAAG,CAAC,CAAC;gBAC5B,IAAI,GAAG,CAAC,CAAC;YACX,CAAC;QACH,CAAC;QACD,wEAAwE;QACxE,oEAAoE;QACpE,wEAAwE;QACxE,+DAA+D;QAC/D,oEAAoE;QACpE,EAAE;QACF,iDAAiD;QACjD,wDAAwD;QACxD,iEAAiE;QACjE,oEAAoE;QACpE,kEAAkE;QAClE,qEAAqE;QACrE,uEAAuE;QACvE,qEAAqE;QACrE,MAAM,IAAI,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC;QACpE,MAAM,kBAAkB,GAAG,KAAK,IAAI,CAAC,IAAI,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC;QAC3D,MAAM,OAAO,GAAG,kBAAkB,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,OAAO,CAAC;QACpE,UAAU,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC;QACzB,QAAQ,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC;QACrB,OAAO,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;QACnB,IAAI,OAAO,GAAG,UAAU;YAAE,UAAU,GAAG,OAAO,CAAC;IACjD,CAAC;IAED,IAAI,UAAU,IAAI,CAAC;QAAE,OAAO,EAAE,GAAG,YAAY,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;IAEnE,wEAAwE;IACxE,yEAAyE;IACzE,yEAAyE;IACzE,kCAAkC;IAClC,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,GAAG,uCAA+B,CAAC,CAAC;IACpF,MAAM,IAAI,GAOL,EAAE,CAAC;IACR,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC;IAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,CAAC,GAAG,MAAM,IAAI,UAAU,CAAC,CAAC,CAAC,IAAI,cAAc,CAAC;QAC9D,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,QAAQ,KAAK,CAAC,CAAC;gBAAE,QAAQ,GAAG,CAAC,CAAC;QACpC,CAAC;aAAM,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,QAAQ,CAAC;YACvB,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;YAClB,IAAI,IAAI,GAAG,QAAQ,CAAC;YACpB,IAAI,KAAK,GAAG,CAAC,QAAQ,CAAC;YACtB,IAAI,WAAW,GAAG,CAAC,CAAC;YACpB,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;gBAClC,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI;oBAAE,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC/D,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK;oBAAE,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBAC3C,IAAI,UAAU,CAAC,CAAC,CAAC,GAAG,WAAW;oBAAE,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAC/D,CAAC;YACD,IAAI,GAAG,GAAG,KAAK,GAAG,CAAC,IAAI,2BAAmB,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;gBACrF,IAAI,CAAC,IAAI,CAAC;oBACR,KAAK;oBACL,GAAG;oBACH,SAAS,EAAE,GAAG,GAAG,KAAK,GAAG,CAAC;oBAC1B,IAAI;oBACJ,KAAK;oBACL,WAAW;iBACZ,CAAC,CAAC;YACL,CAAC;YACD,QAAQ,GAAG,CAAC,CAAC,CAAC;QAChB,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,GAAG,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC;IACzD,CAAC;IAED,MAAM,SAAS,GAAG,CAAC,IAQlB,EAAE,EAAE;QACH,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QACzC,MAAM,SAAS,GAAG,KAAK,GAAG,OAAO,CAAC;QAClC,MAAM,UAAU,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;QACrD,MAAM,QAAQ,GACZ,IAAI,CAAC,SAAS,IAAI,2BAAmB;YACrC,YAAY,IAAI,2BAAmB;YACnC,YAAY,IAAI,2BAAmB,CAAC;QACtC,MAAM,OAAO,GAAG,SAAS,IAAI,+BAAuB,CAAC;QACrD,MAAM,QAAQ,GAAG,UAAU,IAAI,2BAAmB,IAAI,UAAU,IAAI,2BAAmB,CAAC;QACxF,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,GAAG,oCAA4B,CAAC,CAAC;QAClF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,SAAS,GAAG,+BAAuB,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QACzF,MAAM,WAAW,GAAG,UAAU,IAAI,CAAC,IAAI,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAClE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACjD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CACzB,CAAC,EACD,IAAI,CAAC,GAAG,CACN,CAAC,EACD,IAAI,GAAG,YAAY,GAAG,IAAI,GAAG,UAAU,GAAG,IAAI,GAAG,WAAW,GAAG,IAAI,GAAG,SAAS,CAChF,CACF,CAAC;QACF,OAAO;YACL,GAAG,IAAI;YACP,YAAY;YACZ,KAAK;YACL,SAAS;YACT,UAAU;YACV,KAAK,EAAE,QAAQ,IAAI,OAAO,IAAI,QAAQ;YACtC,UAAU;SACX,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,UAAU,GAAmC,EAAE,CAAC;IACtD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,UAAU,CAAC,IAAI,CACb,SAAS,CAAC;YACR,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,SAAS,EAAE,CAAC;YACZ,WAAW,EAAE,GAAG,CAAC,WAAW;SAC7B,CAAC,CACH,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACzB,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;QACrC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,wBAAgB;YAAE,SAAS;QAChD,UAAU,CAAC,IAAI,CACb,SAAS,CAAC;YACR,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,SAAS,EAAE,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS;YACzC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC;YACnC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC;YACtC,SAAS,EAAE,CAAC;YACZ,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC;SACzD,CAAC,CACH,CAAC;IACJ,CAAC;IAED,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACvB,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAClF,OAAO,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;IACrC,CAAC,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,GAAG,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC;IAElE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO;YACL,GAAG,YAAY;YACf,cAAc,EAAE,UAAU;YAC1B,iBAAiB,EAAE,IAAI,CAAC,SAAS;YACjC,eAAe,EAAE,IAAI,CAAC,UAAU;SACjC,CAAC;IACJ,CAAC;IAED,OAAO;QACL,KAAK,EAAE,IAAI;QACX,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,IAAI,EAAE;YACJ,CAAC,EAAE,IAAI,CAAC,IAAI;YACZ,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC,KAAK;YACvB,CAAC,EAAE,IAAI,CAAC,KAAK;YACb,CAAC,EAAE,IAAI,CAAC,YAAY;SACrB;QACD,cAAc,EAAE,UAAU;QAC1B,iBAAiB,EAAE,IAAI,CAAC,SAAS;QACjC,eAAe,EAAE,IAAI,CAAC,UAAU;KACjC,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quality-checks.d.ts","sourceRoot":"","sources":["../../src/quality-checks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EACV,mBAAmB,EACnB,YAAY,EAEZ,aAAa,EACb,qBAAqB,EACrB,UAAU,EACX,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"quality-checks.d.ts","sourceRoot":"","sources":["../../src/quality-checks.ts"],"names":[],"mappings":"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"}
|