UNPKG

@nibble-codes/id-checksum

Version:

A comprehensive library for generating and validating various types of identification numbers

1 lines 56.2 kB
class t{validate(t){throw new Error("validate method must be implemented")}}class e{constructor(t,e="",n={}){this.isValid=t,this.message=e,this.details=n}static valid(t="Valid",n={}){return new e(!0,t,n)}static invalid(t,n={}){return new e(!1,t,n)}toString(){return this.isValid?"Valid":`Invalid: ${this.message}`}}class n extends t{constructor(t){super(),this.config=t}validate(t){try{const e=this.validateBasic(t);if(!e.isValid)return e;const n=this.validateFormat(t);if(!n.isValid)return n;return this.validateChecksum(t)}catch(t){return e.invalid(`Validation error: ${t.message}`)}}validateBasic(t){if(!t)return e.invalid("ID cannot be empty");if("string"!=typeof t)return e.invalid("ID must be a string");return 0===t.trim().length?e.invalid("ID cannot be empty"):e.valid()}validateFormat(t){throw new Error("validateFormat must be implemented by subclass")}validateChecksum(t){throw new Error("validateChecksum must be implemented by subclass")}validateRegex(t,n,a){return n.test(t)?e.valid():e.invalid(a)}validateLength(t,n,a){return t.length!==n?e.invalid(a||`ID must be ${n} characters long`):e.valid()}}class a{static calculateHkidChecksum(t){const e=[8,7,6,5,4,3,2];let n=0;if(8===t.length){n+=9*(t.charCodeAt(0)-55);for(let a=1;a<7;a++)n+=parseInt(t[a])*e[a-1]}else{n+=10*(t.charCodeAt(0)-55),n+=9*(t.charCodeAt(1)-55);for(let a=2;a<8;a++)n+=parseInt(t[a])*e[a-2]}const a=n%11;return 0===a?"0":1===a?"A":(11-a).toString()}static calculateTwidChecksum(t){const e={A:10,B:11,C:12,D:13,E:14,F:15,G:16,H:17,I:34,J:18,K:19,L:20,M:21,N:22,O:35,P:23,Q:24,R:25,S:26,T:27,U:28,V:29,W:32,X:30,Y:31,Z:33}[t[0].toUpperCase()];let n=Math.floor(e/10)+e%10*9;for(let e=1;e<9;e++)n+=parseInt(t[e])*(9-e);return(10-n%10)%10}static calculateVerhoeffChecksum(t){const e=[[0,1,2,3,4,5,6,7,8,9],[1,2,3,4,0,6,7,8,9,5],[2,3,4,0,1,7,8,9,5,6],[3,4,0,1,2,8,9,5,6,7],[4,0,1,2,3,9,5,6,7,8],[5,9,8,7,6,0,4,3,2,1],[6,5,9,8,7,1,0,4,3,2],[7,6,5,9,8,2,1,0,4,3],[8,7,6,5,9,3,2,1,0,4],[9,8,7,6,5,4,3,2,1,0]],n=[[0,1,2,3,4,5,6,7,8,9],[1,5,7,6,2,8,3,0,9,4],[5,8,0,3,7,9,6,1,4,2],[8,9,1,6,0,4,3,5,2,7],[9,4,5,3,1,2,6,8,7,0],[4,2,8,6,5,7,3,9,0,1],[2,7,9,3,8,0,6,4,1,5],[7,0,4,6,9,1,3,2,5,8]];let a=0;const s=t.split("").reverse();for(let t=0;t<s.length;t++)a=e[a][n[(t+1)%8][parseInt(s[t])]];return a}static calculateNricChecksum(t){const e=[2,7,6,5,4,3,2],n=["A","B","C","D","E","F","G","H","I","Z","J"],a=["K","L","M","N","P","Q","R","T","U","W","X"];let s=0;for(let n=1;n<8;n++)s+=parseInt(t[n])*e[n-1];const i=s%11,r=t[0].toUpperCase();return"S"===r||"T"===r?n[i]:a[i]}static calculateLuhnChecksum(t){let e=0,n=!1;for(let a=t.length-1;a>=0;a--){let s=parseInt(t[a]);n&&(s*=2,s>9&&(s=s%10+1)),e+=s,n=!n}return(10-e%10)%10}static calculateMod11Checksum(t,e=null){e||(e=Array.from({length:t.length},(t,e)=>e%6+2));let n=0;for(let a=0;a<t.length;a++)n+=parseInt(t[a])*e[a];const a=n%11;return a<2?a:11-a}static calculateBsnChecksum(t){const e=[9,8,7,6,5,4,3,2,-1];let n=0;for(let a=0;a<9;a++)n+=parseInt(t[a])*e[a];return n%11==0}static calculateCpfChecksum(t){let e=0;for(let n=0;n<9;n++)e+=parseInt(t[n])*(10-n);let n=e%11;const a=n<2?0:11-n;e=0;for(let n=0;n<9;n++)e+=parseInt(t[n])*(11-n);e+=2*a,n=e%11;return[a,n<2?0:11-n]}static calculateRutChecksum(t){const e=[2,3,4,5,6,7];let n=0,a=0;for(let s=t.length-1;s>=0;s--)n+=parseInt(t[s])*e[a],a=(a+1)%e.length;const s=n%11;return 0===s?"0":1===s?"K":(11-s).toString()}static calculateCuilChecksum(t){const e=[5,4,3,2,7,6,5,4,3,2];let n=0;for(let a=0;a<10;a++)n+=parseInt(t[a])*e[a];const a=n%11;return 0===a?0:1===a?9:11-a}}class s extends n{constructor(){super({name:"Hong Kong Identity Card",pattern:/^[A-Z]{1,2}\d{6}[A-Z0-9]$/i,lengths:[8,9]})}validateFormat(t){const n=t.toUpperCase();return this.config.lengths.includes(n.length)?this.validateRegex(n,this.config.pattern,"HKID format must be 1-2 letters followed by 6 digits and a check character"):e.invalid("HKID must be 8 or 9 characters long")}validateChecksum(t){const n=t.toUpperCase(),s=a.calculateHkidChecksum(n),i=n.slice(-1);return s!==i?e.invalid(`Invalid HKID checksum. Expected: ${s}, Got: ${i}`):e.valid("Valid HKID")}}class i extends n{constructor(){super({name:"Taiwan Identity Card",pattern:/^[A-Z][12]\d{8}$/i,length:10})}validateFormat(t){const e=t.toUpperCase(),n=this.validateLength(e,this.config.length);return n.isValid?this.validateRegex(e,this.config.pattern,"TWID format must be a letter, followed by 1 or 2, then 8 digits"):n}validateChecksum(t){const n=t.toUpperCase(),s=a.calculateTwidChecksum(n),i=parseInt(n.slice(-1));return s!==i?e.invalid(`Invalid TWID checksum. Expected: ${s}, Got: ${i}`):e.valid("Valid TWID")}}class r extends n{constructor(){super({name:"Aadhaar Card",pattern:/^\d{12}$/,length:12})}validateFormat(t){const e=this.validateLength(t,this.config.length);return e.isValid?this.validateRegex(t,this.config.pattern,"Aadhaar must be exactly 12 digits"):e}validateChecksum(t){const n=t.slice(0,11),s=a.calculateVerhoeffChecksum(n),i=parseInt(t.slice(-1));return s!==i?e.invalid(`Invalid Aadhaar checksum. Expected: ${s}, Got: ${i}`):e.valid("Valid Aadhaar")}}class l extends n{constructor(){super({name:"Singapore NRIC",pattern:/^[STFG]\d{7}[A-Z]$/i,length:9})}validateFormat(t){const e=t.toUpperCase(),n=this.validateLength(e,this.config.length);return n.isValid?this.validateRegex(e,this.config.pattern,"NRIC format must start with S, T, F, or G, followed by 7 digits and a letter"):n}validateChecksum(t){const n=t.toUpperCase(),s=a.calculateNricChecksum(n),i=n.slice(-1);return s!==i?e.invalid(`Invalid NRIC checksum. Expected: ${s}, Got: ${i}`):e.valid("Valid NRIC")}}class d extends n{constructor(){super({name:"Singapore FIN",pattern:/^[FG]\d{7}[A-Z]$/i,length:9})}validateFormat(t){const e=t.toUpperCase(),n=this.validateLength(e,this.config.length);return n.isValid?this.validateRegex(e,this.config.pattern,"FIN format must start with F or G, followed by 7 digits and a letter"):n}validateChecksum(t){const n=t.toUpperCase(),s=a.calculateNricChecksum(n),i=n.slice(-1);return s!==i?e.invalid(`Invalid FIN checksum. Expected: ${s}, Got: ${i}`):e.valid("Valid FIN")}}class o extends n{constructor(){super({name:"Indian PAN",pattern:/^[A-Z]{5}\d{4}[A-Z]$/i,length:10}),this.entityTypes={P:"Individual",C:"Company",T:"Trust",F:"Firm/LLP",A:"Association of Persons (AOP)",B:"Body of Individuals (BOI)",G:"Government",J:"Artificial Juridical Person",L:"Local Authority",H:"Hindu Undivided Family (HUF)",K:"Krish (rarely used)"}}validateFormat(t){const n=t.toUpperCase(),a=this.validateLength(n,this.config.length);if(!a.isValid)return a;const s=this.validateRegex(n,this.config.pattern,"PAN format must be 5 letters, 4 digits, and 1 letter");if(!s.isValid)return s;const i=n[3];return this.entityTypes[i]?e.valid():e.invalid(`Invalid entity type '${i}'. Must be one of: ${Object.keys(this.entityTypes).join(", ")}`)}validateChecksum(t){return e.valid("Valid PAN structure")}getEntityType(t){if(!t||t.length<4)return null;const e=t.toUpperCase()[3];return this.entityTypes[e]||null}}class c extends n{constructor(){super({name:"US Social Security Number",pattern:/^\d{3}-?\d{2}-?\d{4}$/,length:9})}validateFormat(t){const n=t.replace(/-/g,""),a=this.validateLength(n,this.config.length);if(!a.isValid)return a;const s=this.validateRegex(t,this.config.pattern,"SSN format must be XXX-XX-XXXX or XXXXXXXXX");if(!s.isValid)return s;const i=n.substring(0,3),r=n.substring(3,5),l=n.substring(5,9);return"000"===i||"666"===i||i.startsWith("9")?e.invalid("Invalid SSN area number"):"00"===r?e.invalid("Invalid SSN group number"):"0000"===l?e.invalid("Invalid SSN serial number"):e.valid()}validateChecksum(t){return e.valid("Valid SSN")}}class h extends n{constructor(){super({name:"Canadian Social Insurance Number",pattern:/^\d{3}[\s-]?\d{3}[\s-]?\d{3}$/,length:9})}validateFormat(t){const e=t.replace(/[\s-]/g,""),n=this.validateLength(e,this.config.length);return n.isValid?this.validateRegex(t,this.config.pattern,"SIN format must be XXX XXX XXX or XXX-XXX-XXX or XXXXXXXXX"):n}validateChecksum(t){const n=t.replace(/[\s-]/g,"");let a=0;for(let t=0;t<9;t++){let e=parseInt(n[t]);t%2==1&&(e*=2,e>9&&(e=Math.floor(e/10)+e%10)),a+=e}return a%10!=0?e.invalid("Invalid SIN checksum"):e.valid("Valid SIN")}}class u extends n{constructor(){super({name:"UK National Insurance Number",pattern:/^[A-CEGHJ-PR-TW-Z][A-CEGHJ-NPR-TW-Z]\d{6}[A-D]$/i,length:9}),this.invalidPrefixes=["BG","GB","NK","KN","TN","NT","ZZ"]}validateFormat(t){const n=t.toUpperCase(),a=this.validateLength(n,this.config.length);if(!a.isValid)return a;const s=this.validateRegex(n,this.config.pattern,"NINO format must be 2 letters, 6 digits, and 1 letter (A-D)");if(!s.isValid)return s;const i=n.substring(0,2);return this.invalidPrefixes.includes(i)?e.invalid(`Invalid NINO prefix: ${i}`):e.valid()}validateChecksum(t){return e.valid("Valid NINO")}}class g extends n{constructor(){super({name:"Dutch BSN",pattern:/^\d{9}$/,length:9})}validateFormat(t){const e=this.validateLength(t,this.config.length);return e.isValid?this.validateRegex(t,this.config.pattern,"BSN must be exactly 9 digits"):e}validateChecksum(t){return a.calculateBsnChecksum(t)?e.valid("Valid BSN"):e.invalid("Invalid BSN checksum")}}class p extends n{constructor(){super({name:"Brazilian CPF",pattern:/^\d{3}\.?\d{3}\.?\d{3}-?\d{2}$/,length:11})}validateFormat(t){const n=t.replace(/[.-]/g,""),a=this.validateLength(n,this.config.length);if(!a.isValid)return a;const s=this.validateRegex(t,this.config.pattern,"CPF format must be XXX.XXX.XXX-XX or XXXXXXXXXXX");return s.isValid?/^(\d)\1{10}$/.test(n)?e.invalid("CPF cannot have all identical digits"):e.valid():s}validateChecksum(t){const n=t.replace(/[.-]/g,""),s=n.substring(0,9),[i,r]=a.calculateCpfChecksum(s),l=parseInt(n[9]),d=parseInt(n[10]);return i!==l||r!==d?e.invalid("Invalid CPF checksum"):e.valid("Valid CPF")}}class m extends n{constructor(){super({name:"Chilean RUT",pattern:/^\d{1,2}\.\d{3}\.\d{3}-[\dK]$/i,minLength:8,maxLength:12})}validateFormat(t){const n=t.toUpperCase();return n.length<this.config.minLength||n.length>this.config.maxLength?e.invalid("RUT length must be between 8 and 12 characters"):this.validateRegex(n,this.config.pattern,"RUT format must be XX.XXX.XXX-X")}validateChecksum(t){const n=t.toUpperCase().split("-"),s=n[0].replace(/\./g,""),i=a.calculateRutChecksum(s),r=n[1];return i!==r?e.invalid(`Invalid RUT checksum. Expected: ${i}, Got: ${r}`):e.valid("Valid RUT")}}class I extends n{constructor(){super({name:"Argentine CUIL",pattern:/^\d{2}-?\d{8}-?\d$/,length:11})}validateFormat(t){const e=t.replace(/-/g,""),n=this.validateLength(e,this.config.length);return n.isValid?this.validateRegex(t,this.config.pattern,"CUIL format must be XX-XXXXXXXX-X or XXXXXXXXXXX"):n}validateChecksum(t){const n=t.replace(/-/g,""),s=n.substring(0,10),i=a.calculateCuilChecksum(s),r=parseInt(n[10]);return i!==r?e.invalid(`Invalid CUIL checksum. Expected: ${i}, Got: ${r}`):e.valid("Valid CUIL")}}class v extends n{constructor(){super({name:"Mexican RFC",pattern:/^[A-Z&Ñ]{3,4}\d{6}[A-Z\d]{3}$/i,minLength:12,maxLength:13})}validateFormat(t){const n=t.toUpperCase();return n.length<this.config.minLength||n.length>this.config.maxLength?e.invalid("RFC length must be 12 or 13 characters"):this.validateRegex(n,this.config.pattern,"RFC format must be 3-4 letters, 6 digits, and 3 alphanumeric characters")}validateChecksum(t){return e.valid("Valid RFC format")}}class f extends n{constructor(){super({name:"Norwegian Personalnummer",pattern:/^\d{11}$/,length:11})}validateFormat(t){const e=this.validateLength(t,this.config.length);return e.isValid?this.validateRegex(t,this.config.pattern,"Personalnummer must be exactly 11 digits"):e}validateChecksum(t){const n=[3,7,6,1,8,9,4,5,2];let a=0;for(let e=0;e<9;e++)a+=parseInt(t[e])*n[e];const s=11-a%11;if((11===s?0:s)!==parseInt(t[9]))return e.invalid("Invalid first check digit");const i=[5,4,3,2,7,6,5,4,3,2];let r=0;for(let e=0;e<10;e++)r+=parseInt(t[e])*i[e];const l=11-r%11;return(11===l?0:l)!==parseInt(t[10])?e.invalid("Invalid second check digit"):e.valid("Valid Personalnummer")}}class X extends n{constructor(){super({name:"Swedish Personnummer",pattern:/^\d{6}-?\d{4}$/,length:10})}validateFormat(t){const e=t.replace(/-/g,""),n=this.validateLength(e,this.config.length);return n.isValid?this.validateRegex(t,this.config.pattern,"Personnummer format must be YYMMDD-XXXX or YYMMDDXXXX"):n}validateChecksum(t){const n=t.replace(/-/g,"");let a=0;for(let t=0;t<9;t++){let e=parseInt(n[t]);t%2==1&&(e*=2,e>9&&(e=Math.floor(e/10)+e%10)),a+=e}const s=(10-a%10)%10,i=parseInt(n[9]);return s!==i?e.invalid(`Invalid Personnummer checksum. Expected: ${s}, Got: ${i}`):e.valid("Valid Personnummer")}}class C extends n{constructor(){super({name:"Danish CPR",pattern:/^\d{6}-?\d{4}$/,length:10})}validateFormat(t){const e=t.replace(/-/g,""),n=this.validateLength(e,this.config.length);return n.isValid?this.validateRegex(t,this.config.pattern,"CPR format must be DDMMYY-XXXX or DDMMYYXXXX"):n}validateChecksum(t){const n=t.replace(/-/g,""),a=[4,3,2,7,6,5,4,3,2,1];let s=0;for(let t=0;t<10;t++)s+=parseInt(n[t])*a[t];return s%11!=0?e.invalid("Invalid CPR checksum"):e.valid("Valid CPR")}}class x extends n{constructor(){super({name:"Polish PESEL",pattern:/^\d{11}$/,length:11})}validateFormat(t){const e=this.validateLength(t,this.config.length);return e.isValid?this.validateRegex(t,this.config.pattern,"PESEL must be exactly 11 digits"):e}validateChecksum(t){const n=[1,3,7,9,1,3,7,9,1,3];let a=0;for(let e=0;e<10;e++)a+=parseInt(t[e])*n[e];const s=(10-a%10)%10,i=parseInt(t[10]);return s!==i?e.invalid(`Invalid PESEL checksum. Expected: ${s}, Got: ${i}`):e.valid("Valid PESEL")}}class D extends n{constructor(){super({name:"Romanian CNP",pattern:/^\d{13}$/,length:13})}validateFormat(t){const e=this.validateLength(t,this.config.length);return e.isValid?this.validateRegex(t,this.config.pattern,"CNP must be exactly 13 digits"):e}validateChecksum(t){const n=[2,7,9,1,4,6,3,5,8,2,7,9];let a=0;for(let e=0;e<12;e++)a+=parseInt(t[e])*n[e];let s=a%11;10===s&&(s=1);const i=parseInt(t[12]);return s!==i?e.invalid(`Invalid CNP checksum. Expected: ${s}, Got: ${i}`):e.valid("Valid CNP")}}class N extends n{constructor(){super({name:"Australian Tax File Number",pattern:/^\d{8,9}$/,minLength:8,maxLength:9})}validateFormat(t){return t.length<this.config.minLength||t.length>this.config.maxLength?e.invalid("TFN must be 8 or 9 digits"):this.validateRegex(t,this.config.pattern,"TFN must contain only digits")}validateChecksum(t){const n=[1,4,3,7,5,8,6,9,10];let a=0;for(let e=0;e<Math.min(t.length,8);e++)a+=parseInt(t[e])*n[e];const s=a%11;return 0===s||1===s?e.valid("Valid TFN"):e.invalid("Invalid TFN checksum")}}class $ extends n{constructor(){super({name:"New Zealand IRD Number",pattern:/^\d{8,9}$/,minLength:8,maxLength:9})}validateFormat(t){return t.length<this.config.minLength||t.length>this.config.maxLength?e.invalid("IRD must be 8 or 9 digits"):this.validateRegex(t,this.config.pattern,"IRD must contain only digits")}validateChecksum(t){const n=[3,2,7,6,5,4,3,2];let a=0;for(let e=0;e<Math.min(t.length-1,8);e++)a+=parseInt(t[e])*n[e];const s=a%11;let i;if(0===s)i=0;else{if(1===s)return e.invalid("Invalid IRD - remainder cannot be 1");i=11-s}const r=parseInt(t[t.length-1]);return i!==r?e.invalid(`Invalid IRD checksum. Expected: ${i}, Got: ${r}`):e.valid("Valid IRD")}}class b extends n{constructor(){super({name:"Japanese My Number",pattern:/^\d{12}$/,length:12})}validateFormat(t){const e=this.validateLength(t,this.config.length);return e.isValid?this.validateRegex(t,this.config.pattern,"My Number must be exactly 12 digits"):e}validateChecksum(t){const n=[6,5,4,3,2,7,6,5,4,3,2];let a=0;for(let e=0;e<11;e++)a+=parseInt(t[e])*n[e];const s=a%11;let i;i=s<=1?0:11-s;const r=parseInt(t[11]);return i!==r?e.invalid(`Invalid My Number checksum. Expected: ${i}, Got: ${r}`):e.valid("Valid My Number")}}class y extends n{constructor(){super({name:"Korean Resident Registration Number",pattern:/^\d{6}-?\d{7}$/,length:13})}validateFormat(t){const e=t.replace(/-/g,""),n=this.validateLength(e,this.config.length);return n.isValid?this.validateRegex(t,this.config.pattern,"RRN format must be YYMMDD-XXXXXXX or YYMMDDXXXXXXX"):n}validateChecksum(t){const n=t.replace(/-/g,""),a=[2,3,4,5,6,7,8,9,2,3,4,5];let s=0;for(let t=0;t<12;t++)s+=parseInt(n[t])*a[t];const i=(11-s%11)%10,r=parseInt(n[12]);return i!==r?e.invalid(`Invalid RRN checksum. Expected: ${i}, Got: ${r}`):e.valid("Valid RRN")}}class R extends n{constructor(){super({name:"Chinese Resident Identity Card",pattern:/^\d{17}[\dX]$/i,length:18})}validateFormat(t){const e=t.toUpperCase(),n=this.validateLength(e,this.config.length);return n.isValid?this.validateRegex(e,this.config.pattern,"Chinese ID must be 17 digits followed by a digit or X"):n}validateChecksum(t){const n=t.toUpperCase(),a=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];let s=0;for(let t=0;t<17;t++)s+=parseInt(n[t])*a[t];const i=["1","0","X","9","8","7","6","5","4","3","2"][s%11],r=n[17];return i!==r?e.invalid(`Invalid Chinese ID checksum. Expected: ${i}, Got: ${r}`):e.valid("Valid Chinese ID")}}class L extends n{constructor(){super({name:"Thai National ID",pattern:/^\d{13}$/,length:13})}validateFormat(t){const e=this.validateLength(t,this.config.length);return e.isValid?this.validateRegex(t,this.config.pattern,"Thai ID must be exactly 13 digits"):e}validateChecksum(t){let n=0;for(let e=0;e<12;e++)n+=parseInt(t[e])*(13-e);const a=(11-n%11)%10,s=parseInt(t[12]);return a!==s?e.invalid(`Invalid Thai ID checksum. Expected: ${a}, Got: ${s}`):e.valid("Valid Thai ID")}}class k extends n{constructor(){super({name:"Malaysian NRIC",pattern:/^\d{6}-?\d{2}-?\d{4}$/,length:12})}validateFormat(t){const e=t.replace(/-/g,""),n=this.validateLength(e,this.config.length);return n.isValid?this.validateRegex(t,this.config.pattern,"Malaysian NRIC format must be YYMMDD-SS-NNNN"):n}validateChecksum(t){const n=t.replace(/-/g,""),a=n.substring(0,6);n.substring(6,8),parseInt(a.substring(0,2));const s=parseInt(a.substring(2,4)),i=parseInt(a.substring(4,6));return s<1||s>12?e.invalid("Invalid birth month"):i<1||i>31?e.invalid("Invalid birth day"):e.valid("Valid Malaysian NRIC")}}class A extends n{constructor(){super({name:"Philippine UMID",pattern:/^\d{4}-?\d{7}-?\d$/,length:12})}validateFormat(t){const e=t.replace(/-/g,""),n=this.validateLength(e,this.config.length);return n.isValid?this.validateRegex(t,this.config.pattern,"Philippine UMID format must be XXXX-XXXXXXX-X"):n}validateChecksum(t){const n=t.replace(/-/g,"");let a=0,s=!1;for(let t=n.length-2;t>=0;t--){let e=parseInt(n[t]);s&&(e*=2,e>9&&(e=e%10+1)),a+=e,s=!s}const i=(10-a%10)%10,r=parseInt(n[n.length-1]);return i!==r?e.invalid(`Invalid UMID checksum. Expected: ${i}, Got: ${r}`):e.valid("Valid Philippine UMID")}}class Z extends n{constructor(){super({name:"Vietnamese Citizen Identity Card",pattern:/^\d{12}$/,length:12})}validateFormat(t){const e=this.validateLength(t,this.config.length);return e.isValid?this.validateRegex(t,this.config.pattern,"Vietnamese ID must be exactly 12 digits"):e}validateChecksum(t){const n=t.substring(0,3),a=t.substring(3,4);return t.substring(4,6),parseInt(n)<1||parseInt(n)>96?e.invalid("Invalid province code"):parseInt(a)<0||parseInt(a)>9?e.invalid("Invalid gender/century code"):e.valid("Valid Vietnamese ID")}}class V extends n{constructor(){super({name:"Indonesian NIK",pattern:/^\d{16}$/,length:16})}validateFormat(t){const e=this.validateLength(t,this.config.length);return e.isValid?this.validateRegex(t,this.config.pattern,"Indonesian NIK must be exactly 16 digits"):e}validateChecksum(t){t.substring(0,2),t.substring(2,4),t.substring(4,6);const n=t.substring(6,8),a=t.substring(8,10);t.substring(10,12);const s=parseInt(n),i=parseInt(a),r=s>40?s-40:s;return r<1||r>31?e.invalid("Invalid birth date"):i<1||i>12?e.invalid("Invalid birth month"):e.valid("Valid Indonesian NIK")}}class F extends n{constructor(){super({name:"South African ID Number",pattern:/^\d{13}$/,length:13})}validateFormat(t){const e=this.validateLength(t,this.config.length);return e.isValid?this.validateRegex(t,this.config.pattern,"South African ID must be exactly 13 digits"):e}validateChecksum(t){let n=0,a=!1;for(let e=t.length-2;e>=0;e--){let s=parseInt(t[e]);a&&(s*=2,s>9&&(s=s%10+1)),n+=s,a=!a}const s=(10-n%10)%10,i=parseInt(t[12]);return s!==i?e.invalid(`Invalid South African ID checksum. Expected: ${s}, Got: ${i}`):e.valid("Valid South African ID")}}class S extends n{constructor(){super({name:"Egyptian National ID",pattern:/^\d{14}$/,length:14})}validateFormat(t){const e=this.validateLength(t,this.config.length);return e.isValid?this.validateRegex(t,this.config.pattern,"Egyptian ID must be exactly 14 digits"):e}validateChecksum(t){const n=t.substring(0,1);t.substring(1,3);const a=t.substring(3,5),s=t.substring(5,7);return t.substring(7,9),"2"!==n&&"3"!==n?e.invalid("Invalid century code"):parseInt(a)<1||parseInt(a)>12?e.invalid("Invalid birth month"):parseInt(s)<1||parseInt(s)>31?e.invalid("Invalid birth day"):e.valid("Valid Egyptian ID")}}class E extends n{constructor(){super({name:"Nigerian NIN",pattern:/^\d{11}$/,length:11})}validateFormat(t){const e=this.validateLength(t,this.config.length);return e.isValid?this.validateRegex(t,this.config.pattern,"Nigerian NIN must be exactly 11 digits"):e}validateChecksum(t){const n=[3,7,3,7,3,7,3,7,3,7];let a=0;for(let e=0;e<10;e++)a+=parseInt(t[e])*n[e];const s=a%10,i=parseInt(t[10]);return s!==i?e.invalid(`Invalid NIN checksum. Expected: ${s}, Got: ${i}`):e.valid("Valid Nigerian NIN")}}class T extends n{constructor(){super({name:"Kenyan National ID",pattern:/^\d{7,8}$/,minLength:7,maxLength:8})}validateFormat(t){return t.length<this.config.minLength||t.length>this.config.maxLength?e.invalid("Kenyan ID must be 7 or 8 digits"):this.validateRegex(t,this.config.pattern,"Kenyan ID must contain only digits")}validateChecksum(t){const n=parseInt(t);return n<1e6||n>99999999?e.invalid("Invalid Kenyan ID number range"):e.valid("Valid Kenyan ID")}}class P extends n{constructor(){super({name:"Ghanaian Ghana Card",pattern:/^GHA-\d{9}-\d$/,length:15})}validateFormat(t){const e=t.toUpperCase(),n=this.validateLength(e,this.config.length);return n.isValid?this.validateRegex(e,this.config.pattern,"Ghana Card format must be GHA-XXXXXXXXX-X"):n}validateChecksum(t){const n=t.toUpperCase().replace(/[^0-9]/g,"");let a=0,s=!1;for(let t=n.length-2;t>=0;t--){let e=parseInt(n[t]);s&&(e*=2,e>9&&(e=e%10+1)),a+=e,s=!s}const i=(10-a%10)%10,r=parseInt(n[n.length-1]);return i!==r?e.invalid(`Invalid Ghana Card checksum. Expected: ${i}, Got: ${r}`):e.valid("Valid Ghana Card")}}class U extends n{constructor(){super({name:"French INSEE Number",pattern:/^\d{13}$/,length:13})}validateFormat(t){const e=this.validateLength(t,this.config.length);return e.isValid?this.validateRegex(t,this.config.pattern,"INSEE number must be exactly 13 digits"):e}validateChecksum(t){const n=t.substring(0,12),a=parseInt(t.substring(12,13)),s=97-parseInt(n)%97;return s!==a?e.invalid(`Invalid INSEE checksum. Expected: ${s}, Got: ${a}`):e.valid("Valid INSEE number")}}class M extends n{constructor(){super({name:"German Tax ID",pattern:/^\d{11}$/,length:11})}validateFormat(t){const e=this.validateLength(t,this.config.length);return e.isValid?this.validateRegex(t,this.config.pattern,"German Tax ID must be exactly 11 digits"):e}validateChecksum(t){let n=10;for(let e=0;e<10;e++){let a=(parseInt(t[e])+n)%10;0===a&&(a=10),n=2*a%11}const a=11-n,s=parseInt(t[10]);return 10===a&&0===s?e.valid("Valid German Tax ID"):a!==s?e.invalid(`Invalid German Tax ID checksum. Expected: ${a}, Got: ${s}`):e.valid("Valid German Tax ID")}}class G extends n{constructor(){super({name:"Italian Fiscal Code",pattern:/^[A-Z]{6}\d{2}[A-Z]\d{2}[A-Z]\d{3}[A-Z]$/i,length:16})}validateFormat(t){const e=t.toUpperCase(),n=this.validateLength(e,this.config.length);return n.isValid?this.validateRegex(e,this.config.pattern,"Italian Fiscal Code format must be LLLLLLNNLNNLNNNL"):n}validateChecksum(t){const n=t.toUpperCase(),a={0:1,1:0,2:5,3:7,4:9,5:13,6:15,7:17,8:19,9:21,A:1,B:0,C:5,D:7,E:9,F:13,G:15,H:17,I:19,J:21,K:2,L:4,M:18,N:20,O:11,P:3,Q:6,R:8,S:12,T:14,U:16,V:10,W:22,X:25,Y:24,Z:23},s={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:0,B:1,C:2,D:3,E:4,F:5,G:6,H:7,I:8,J:9,K:10,L:11,M:12,N:13,O:14,P:15,Q:16,R:17,S:18,T:19,U:20,V:21,W:22,X:23,Y:24,Z:25};let i=0;for(let t=0;t<15;t++){const e=n[t];i+=t%2==0?a[e]:s[e]}const r="ABCDEFGHIJKLMNOPQRSTUVWXYZ"[i%26],l=n[15];return r!==l?e.invalid(`Invalid Italian Fiscal Code checksum. Expected: ${r}, Got: ${l}`):e.valid("Valid Italian Fiscal Code")}}class w extends n{constructor(){super({name:"Spanish DNI",pattern:/^\d{8}[A-Z]$/i,length:9})}validateFormat(t){const e=t.toUpperCase(),n=this.validateLength(e,this.config.length);return n.isValid?this.validateRegex(e,this.config.pattern,"Spanish DNI format must be 8 digits followed by a letter"):n}validateChecksum(t){const n=t.toUpperCase(),a=n.substring(0,8),s="TRWAGMYFPDXBNJZSQVHLCKE"[parseInt(a)%23],i=n[8];return s!==i?e.invalid(`Invalid Spanish DNI checksum. Expected: ${s}, Got: ${i}`):e.valid("Valid Spanish DNI")}}class K extends n{constructor(){super({name:"Portuguese Citizen Card",pattern:/^\d{8}\s?\d{1}\s?[A-Z]{2}\d{1}$/i,length:12})}validateFormat(t){const e=t.replace(/\s/g,"").toUpperCase(),n=this.validateLength(e,this.config.length);return n.isValid?this.validateRegex(t,this.config.pattern,"Portuguese Citizen Card format must be XXXXXXXX X XXX"):n}validateChecksum(t){const n=t.replace(/\s/g,"").toUpperCase(),a=n.substring(0,8),s=parseInt(n[8]);let i=0;for(let t=0;t<8;t++)i+=parseInt(a[t])*(9-t);const r=11-i%11,l=r>=10?0:r;return l!==s?e.invalid(`Invalid Portuguese Citizen Card checksum. Expected: ${l}, Got: ${s}`):e.valid("Valid Portuguese Citizen Card")}}class H extends n{constructor(){super({name:"Russian Passport Number",pattern:/^\d{4}\s?\d{6}$/,length:10})}validateFormat(t){const e=t.replace(/\s/g,""),n=this.validateLength(e,this.config.length);return n.isValid?this.validateRegex(t,this.config.pattern,"Russian Passport format must be XXXX XXXXXX or XXXXXXXXXX"):n}validateChecksum(t){const n=t.replace(/\s/g,""),a=n.substring(0,4),s=n.substring(4,10),i=[7,2,4,10,3,5,9,4,6,8];let r=0;for(let t=0;t<4;t++)r+=parseInt(a[t])*i[t];for(let t=0;t<6;t++)r+=parseInt(s[t])*i[t+4];return e.valid("Valid Russian Passport format")}}class Y extends n{constructor(){super({name:"Ukrainian Tax Number",pattern:/^\d{10}$/,length:10})}validateFormat(t){const e=this.validateLength(t,this.config.length);return e.isValid?this.validateRegex(t,this.config.pattern,"Ukrainian Tax Number must be exactly 10 digits"):e}validateChecksum(t){const n=[-1,5,7,9,4,6,10,5,7];let a=0;for(let e=0;e<9;e++)a+=parseInt(t[e])*n[e];let s=a%11;if(s>=10){const e=[7,1,3,5,8,2,4,6,9];a=0;for(let n=0;n<9;n++)a+=parseInt(t[n])*e[n];s=a%11,s>=10&&(s=0)}const i=parseInt(t[9]);return s!==i?e.invalid(`Invalid Ukrainian Tax Number checksum. Expected: ${s}, Got: ${i}`):e.valid("Valid Ukrainian Tax Number")}}class B extends n{constructor(){super({name:"Turkish TC Kimlik No",pattern:/^\d{11}$/,length:11})}validateFormat(t){const n=this.validateLength(t,this.config.length);if(!n.isValid)return n;const a=this.validateRegex(t,this.config.pattern,"Turkish TC Kimlik No must be exactly 11 digits");return a.isValid?"0"===t[0]?e.invalid("Turkish TC Kimlik No cannot start with 0"):e.valid():a}validateChecksum(t){let n=0,a=0;for(let e=0;e<9;e++)e%2==0?n+=parseInt(t[e]):a+=parseInt(t[e]);if((7*n-a)%10!==parseInt(t[9]))return e.invalid("Invalid Turkish TC Kimlik No 10th digit");let s=0;for(let e=0;e<10;e++)s+=parseInt(t[e]);return s%10!==parseInt(t[10])?e.invalid("Invalid Turkish TC Kimlik No 11th digit"):e.valid("Valid Turkish TC Kimlik No")}}class O extends n{constructor(){super({name:"Israeli ID Number",pattern:/^\d{9}$/,length:9})}validateFormat(t){const e=this.validateLength(t,this.config.length);return e.isValid?this.validateRegex(t,this.config.pattern,"Israeli ID must be exactly 9 digits"):e}validateChecksum(t){let n=0;for(let e=0;e<9;e++){let a=parseInt(t[e]);e%2==1&&(a*=2,a>9&&(a=Math.floor(a/10)+a%10)),n+=a}return n%10!=0?e.invalid("Invalid Israeli ID checksum"):e.valid("Valid Israeli ID")}}class J extends n{constructor(){super({name:"UAE Emirates ID",pattern:/^784-\d{4}-\d{7}-\d$/,length:18})}validateFormat(t){const e=this.validateLength(t,this.config.length);return e.isValid?this.validateRegex(t,this.config.pattern,"UAE Emirates ID format must be 784-XXXX-XXXXXXX-X"):e}validateChecksum(t){const n=t.replace(/-/g,"").substring(3);let a=0,s=!1;for(let t=n.length-2;t>=0;t--){let e=parseInt(n[t]);s&&(e*=2,e>9&&(e=e%10+1)),a+=e,s=!s}const i=(10-a%10)%10,r=parseInt(n[n.length-1]);return i!==r?e.invalid(`Invalid UAE Emirates ID checksum. Expected: ${i}, Got: ${r}`):e.valid("Valid UAE Emirates ID")}}class W extends n{constructor(){super({name:"Saudi Arabian National ID",pattern:/^[12]\d{9}$/,length:10})}validateFormat(t){const e=this.validateLength(t,this.config.length);return e.isValid?this.validateRegex(t,this.config.pattern,"Saudi ID must start with 1 or 2 followed by 9 digits"):e}validateChecksum(t){let n=0,a=!1;for(let e=t.length-2;e>=0;e--){let s=parseInt(t[e]);a&&(s*=2,s>9&&(s=s%10+1)),n+=s,a=!a}const s=(10-n%10)%10,i=parseInt(t[t.length-1]);return s!==i?e.invalid(`Invalid Saudi ID checksum. Expected: ${s}, Got: ${i}`):e.valid("Valid Saudi Arabian National ID")}}class Q extends n{constructor(){super({name:"Pakistani CNIC",pattern:/^\d{5}-?\d{7}-?\d$/,length:13})}validateFormat(t){const e=t.replace(/-/g,""),n=this.validateLength(e,this.config.length);return n.isValid?this.validateRegex(t,this.config.pattern,"Pakistani CNIC format must be XXXXX-XXXXXXX-X"):n}validateChecksum(t){const n=t.replace(/-/g,""),a=[6,5,4,3,2,7,6,5,4,3,2,7];let s=0;for(let t=0;t<12;t++)s+=parseInt(n[t])*a[t];const i=s%11;let r;r=i<2?i:11-i;const l=parseInt(n[12]);return r!==l?e.invalid(`Invalid Pakistani CNIC checksum. Expected: ${r}, Got: ${l}`):e.valid("Valid Pakistani CNIC")}}class z extends n{constructor(){super({name:"Bangladeshi National ID",pattern:/^\d{10}|\d{13}|\d{17}$/,minLength:10,maxLength:17})}validateFormat(t){return[10,13,17].includes(t.length)?this.validateRegex(t,this.config.pattern,"Bangladeshi NID must contain only digits"):e.invalid("Bangladeshi NID must be 10, 13, or 17 digits")}validateChecksum(t){if(10===t.length){if(parseInt(t)<1e9)return e.invalid("Invalid 10-digit NID format")}return e.valid("Valid Bangladeshi NID")}}class j extends n{constructor(){super({name:"Sri Lankan National ID",pattern:/^\d{9}[VX]|\d{12}$/i,minLength:10,maxLength:12})}validateFormat(t){const n=t.toUpperCase();return n.length<this.config.minLength||n.length>this.config.maxLength?e.invalid("Sri Lankan NID must be 10 or 12 characters"):this.validateRegex(n,this.config.pattern,"Sri Lankan NID format must be XXXXXXXXXV/X or XXXXXXXXXXXX")}validateChecksum(t){const n=t.toUpperCase();if(10===n.length){n.substring(0,9);const t=n[9];if("V"!==t&&"X"!==t)return e.invalid("Invalid check character - must be V or X")}else if(12===n.length){const t=n.substring(0,4),a=n.substring(4,7);if(parseInt(t)<1900||parseInt(t)>2100)return e.invalid("Invalid birth year");if(parseInt(a)<1||parseInt(a)>366)return e.invalid("Invalid day of year")}return e.valid("Valid Sri Lankan NID")}}class q extends n{constructor(){super({name:"Myanmar NRC",pattern:/^\d{1,2}\/[A-Z]{6}\([A-Z]\)\d{6}$/i,minLength:14,maxLength:18})}validateFormat(t){const n=t.toUpperCase();return n.length<this.config.minLength||n.length>this.config.maxLength?e.invalid("Myanmar NRC length must be between 14-18 characters"):this.validateRegex(n,this.config.pattern,"Myanmar NRC format must be XX/XXXXXX(X)XXXXXX")}validateChecksum(t){const n=t.toUpperCase().split("/");if(2!==n.length)return e.invalid("Invalid NRC format - missing /");const a=n[0];n[1];const s=parseInt(a);return s<1||s>14?e.invalid("Invalid state code - must be 1-14"):e.valid("Valid Myanmar NRC")}}class _{constructor(){this.validators=new Map([["HKID",s],["TWID",i],["AADHAAR",r],["NRIC",l],["FIN",d],["PAN",o],["SSN",c],["SIN",h],["NINO",u],["BSN",g],["CPF",p],["RUT",m],["CUIL",I],["RFC",v],["PERSONNUMMER",X],["PERSONALNUMMER",f],["CPR",C],["PESEL",x],["CNP",D],["AUS",N],["NZ",$],["JP",b],["KR",y],["CN",R],["TH",L],["MY",k],["PH",A],["VN",Z],["ID",V],["ZA",F],["EG",S],["NG",E],["KE",T],["GH",P],["FR",U],["DE",M],["IT",G],["ES",w],["PT",K],["RU",H],["UA",Y],["TR",B],["IL",O],["AR",J],["SA",W],["PK",Q],["BD",z],["LK",j],["MM",q]])}create(t){const e=this.validators.get(t?.toUpperCase());if(!e)throw new Error(`Unsupported ID type: ${t}`);return new e}register(t,e){this.validators.set(t.toUpperCase(),e)}getSupportedTypes(){return Array.from(this.validators.keys())}}class tt{generate(t={}){throw new Error("generate method must be implemented")}}class et extends tt{constructor(t){super(),this.config=t}randomInt(t,e){return Math.floor(Math.random()*(e-t+1))+t}randomDigits(t){return Array.from({length:t},()=>this.randomInt(0,9)).join("")}randomLetter(t=!0){const e=t?"ABCDEFGHIJKLMNOPQRSTUVWXYZ":"abcdefghijklmnopqrstuvwxyz";return e[this.randomInt(0,e.length-1)]}padZero(t,e){return t.toString().padStart(e,"0")}}class nt extends et{generate(t={}){const{doublePrefix:e=!1}=t;let n;n=e?this.randomLetter()+this.randomLetter():this.randomLetter();const s=n+this.randomDigits(6);return s+a.calculateHkidChecksum(s+"0")}}class at extends et{generate(t={}){const{gender:e=null}=t,n="ABCDEFGHJKLMNPQRSTUVXYWZIO",s=n[this.randomInt(0,25)]+(e||this.randomInt(1,2))+this.randomDigits(7);return s+a.calculateTwidChecksum(s+"0")}}class st extends et{generate(){const t=this.randomInt(2,9)+this.randomDigits(10);return t+a.calculateVerhoeffChecksum(t)}}class it extends et{generate(t={}){const{prefix:e=null,birthYear:n=null}=t,s=["S","T"],i=e||s[this.randomInt(0,s.length-1)];let r;if(n){r=n.toString().slice(-2)+this.randomDigits(5)}else r=this.randomDigits(7);const l=i+r;return l+a.calculateNricChecksum(l+"A")}}class rt extends et{generate(t={}){const{prefix:e=null}=t,n=["F","G"],s=(e||n[this.randomInt(0,n.length-1)])+this.randomDigits(7);return s+a.calculateNricChecksum(s+"A")}}class lt extends et{constructor(){super(),this.entityTypes=["P","C","T","F","A","B","G","J","L","H","K"]}generate(t={}){const{entityType:e=null,prefix:n=null}=t;let a;a=n&&n.length>=3?n.substring(0,3).toUpperCase():this.randomLetter()+this.randomLetter()+this.randomLetter();return a+(e||this.entityTypes[this.randomInt(0,this.entityTypes.length-1)])+this.randomLetter()+this.randomDigits(4)+this.randomLetter()}generateForIndividual(){return this.generate({entityType:"P"})}generateForCompany(){return this.generate({entityType:"C"})}generateForTrust(){return this.generate({entityType:"T"})}}class dt extends et{generate(t={}){const{formatted:e=!0}=t;let n;n=this.randomInt(0,1)?this.padZero(this.randomInt(1,665),3):this.padZero(this.randomInt(667,899),3);const a=this.padZero(this.randomInt(1,99),2),s=this.padZero(this.randomInt(1,9999),4);return e?`${n}-${a}-${s}`:n+a+s}}class ot extends et{generate(t={}){const{formatted:e=!0}=t,n=this.randomDigits(8);let a=0;for(let t=0;t<8;t++){let e=parseInt(n[t]);t%2==1&&(e*=2,e>9&&(e=Math.floor(e/10)+e%10)),a+=e}const s=n+(10-a%10)%10;return e?`${s.substring(0,3)} ${s.substring(3,6)} ${s.substring(6,9)}`:s}}class ct extends et{constructor(){super(),this.validFirstLetters="ACEGHJ-PR-TW-Z".replace(/-/g,"").split(""),this.validSecondLetters="ACEGHJ-NPR-TW-Z".replace(/-/g,"").split(""),this.invalidPrefixes=["BG","GB","NK","KN","TN","NT","ZZ"],this.suffixLetters=["A","B","C","D"]}generate(){let t;do{t=this.validFirstLetters[this.randomInt(0,this.validFirstLetters.length-1)]+this.validSecondLetters[this.randomInt(0,this.validSecondLetters.length-1)]}while(this.invalidPrefixes.includes(t));return t+this.randomDigits(6)+this.suffixLetters[this.randomInt(0,this.suffixLetters.length-1)]}}class ht extends et{generate(){let t;do{t=this.randomDigits(9),"0"===t[0]&&(t=this.randomInt(1,9)+t.substring(1))}while(!a.calculateBsnChecksum(t));return t}}class ut extends et{generate(t={}){const{formatted:e=!0}=t,n=this.randomDigits(9),[s,i]=a.calculateCpfChecksum(n),r=n+s+i;return e?`${r.substring(0,3)}.${r.substring(3,6)}.${r.substring(6,9)}-${r.substring(9,11)}`:r}}class gt extends et{generate(t={}){const{formatted:e=!0}=t,n=this.randomInt(7,8),s=this.randomDigits(n),i=a.calculateRutChecksum(s);return e?7===s.length?`${s.substring(0,1)}.${s.substring(1,4)}.${s.substring(4,7)}-${i}`:`${s.substring(0,2)}.${s.substring(2,5)}.${s.substring(5,8)}-${i}`:s+i}}class pt extends et{generate(t={}){const{formatted:e=!0,gender:n=null}=t;let s;s="male"===n?["20","23","24"][this.randomInt(0,2)]:"female"===n?"27":["20","23","24","27"][this.randomInt(0,3)];const i=s+this.randomDigits(8),r=i+a.calculateCuilChecksum(i);return e?`${r.substring(0,2)}-${r.substring(2,10)}-${r.substring(10,11)}`:r}}class mt extends et{generate(t={}){const{isCompany:e=!1}=t,n=e?4:3;let a="";for(let t=0;t<n;t++)a+=this.randomLetter();return a+this.padZero(this.randomInt(50,99),2)+this.padZero(this.randomInt(1,12),2)+this.padZero(this.randomInt(1,28),2)+(this.randomLetter()+this.randomInt(0,9))+this.randomLetter()}}class It extends et{generate(t={}){const{birthDate:e=null}=t;let n;if(e){const t=new Date(e);n=this.padZero(t.getDate(),2)+this.padZero(t.getMonth()+1,2)+t.getFullYear().toString().slice(-2)}else{n=this.padZero(this.randomInt(1,28),2)+this.padZero(this.randomInt(1,12),2)+this.padZero(this.randomInt(0,99),2)}const a=n+this.randomDigits(3),s=[3,7,6,1,8,9,4,5,2];let i=0;for(let t=0;t<9;t++)i+=parseInt(a[t])*s[t];const r=11-i%11,l=a+(11===r?0:r),d=[5,4,3,2,7,6,5,4,3,2];let o=0;for(let t=0;t<10;t++)o+=parseInt(l[t])*d[t];const c=11-o%11;return l+(11===c?0:c)}}class vt extends et{generate(t={}){const{formatted:e=!0,birthYear:n=null}=t,a=(n?n.toString().slice(-2):this.padZero(this.randomInt(0,99),2))+this.padZero(this.randomInt(1,12),2)+this.padZero(this.randomInt(1,28),2)+this.randomDigits(3);let s=0;for(let t=0;t<9;t++){let e=parseInt(a[t]);t%2==1&&(e*=2,e>9&&(e=Math.floor(e/10)+e%10)),s+=e}const i=a+(10-s%10)%10;return e?`${i.substring(0,6)}-${i.substring(6,10)}`:i}}class ft extends et{generate(t={}){const{formatted:e=!0,birthDate:n=null}=t;let a,s;if(n){const t=new Date(n);a=this.padZero(t.getDate(),2)+this.padZero(t.getMonth()+1,2)+t.getFullYear().toString().slice(-2)}else{a=this.padZero(this.randomInt(1,28),2)+this.padZero(this.randomInt(1,12),2)+this.padZero(this.randomInt(0,99),2)}let i=0;do{s=a+this.randomDigits(3)+this.randomInt(0,9);const t=[4,3,2,7,6,5,4,3,2,1];let e=0;for(let n=0;n<10;n++)e+=parseInt(s[n])*t[n];i++}while(sum%11!=0&&i<100);return e?`${s.substring(0,6)}-${s.substring(6,10)}`:s}}class Xt extends et{generate(t={}){const{birthDate:e=null,gender:n=null}=t;let a;if(e){const t=new Date(e);let n=t.getFullYear(),s=t.getMonth()+1;const i=this.padZero(t.getDate(),2);n>=1800&&n<=1899?s+=80:n>=2e3&&n<=2099?s+=20:n>=2100&&n<=2199?s+=40:n>=2200&&n<=2299&&(s+=60),a=n.toString().slice(-2)+this.padZero(s,2)+i}else{a=this.padZero(this.randomInt(0,99),2)+this.padZero(this.randomInt(1,12),2)+this.padZero(this.randomInt(1,28),2)}let s=this.randomDigits(3);"male"===n?s=s.slice(0,2)+(parseInt(s[2])%2==0?parseInt(s[2])+1:s[2]):"female"===n&&(s=s.slice(0,2)+(parseInt(s[2])%2==1?parseInt(s[2])-1:s[2]));const i=a+s,r=[1,3,7,9,1,3,7,9,1,3];let l=0;for(let t=0;t<10;t++)l+=parseInt(i[t])*r[t];return i+(10-l%10)%10}}class Ct extends et{generate(t={}){const{birthDate:e=null,gender:n=null,county:a=null}=t;let s,i;if(s="male"===n?this.randomInt(0,1)?"1":"3":"female"===n?this.randomInt(0,1)?"2":"4":this.randomInt(1,4).toString(),e){const t=new Date(e);i=t.getFullYear().toString().slice(-2)+this.padZero(t.getMonth()+1,2)+this.padZero(t.getDate(),2)}else{i=this.padZero(this.randomInt(0,99),2)+this.padZero(this.randomInt(1,12),2)+this.padZero(this.randomInt(1,28),2)}const r=s+i+(a||this.padZero(this.randomInt(1,52),2))+this.padZero(this.randomInt(1,999),3),l=[2,7,9,1,4,6,3,5,8,2,7,9];let d=0;for(let t=0;t<12;t++)d+=parseInt(r[t])*l[t];let o=d%11;return 10===o&&(o=1),r+o}}class xt extends et{generate(){let t,e=0;do{t=this.randomDigits(8),e++}while(!this.isValidTfn(t)&&e<100);return t}isValidTfn(t){const e=[1,4,3,7,5,8,6,9,10];let n=0;for(let a=0;a<8;a++)n+=parseInt(t[a])*e[a];const a=n%11;return 0===a||1===a}}class Dt extends et{generate(){let t,e=0;do{t=this.randomDigits(8),e++}while(!this.isValidIrd(t)&&e<100);return t+this.calculateCheckDigit(t)}calculateCheckDigit(t){const e=[3,2,7,6,5,4,3,2];let n=0;for(let a=0;a<8;a++)n+=parseInt(t[a])*e[a];const a=n%11;return 0===a?"0":1===a?null:(11-a).toString()}isValidIrd(t){return null!==this.calculateCheckDigit(t)}}class Nt extends et{generate(){const t=this.randomDigits(11),e=[6,5,4,3,2,7,6,5,4,3,2];let n=0;for(let a=0;a<11;a++)n+=parseInt(t[a])*e[a];const a=n%11;return t+(a<=1?0:11-a)}}class $t extends et{generate(t={}){const{formatted:e=!0,birthDate:n=null}=t;let a;if(n){const t=new Date(n);a=t.getFullYear().toString().slice(-2)+this.padZero(t.getMonth()+1,2)+this.padZero(t.getDate(),2)}else{a=this.padZero(this.randomInt(0,99),2)+this.padZero(this.randomInt(1,12),2)+this.padZero(this.randomInt(1,28),2)}const s=a+this.randomDigits(6),i=[2,3,4,5,6,7,8,9,2,3,4,5];let r=0;for(let t=0;t<12;t++)r+=parseInt(s[t])*i[t];const l=s+(11-r%11)%10;return e?`${l.substring(0,6)}-${l.substring(6,13)}`:l}}class bt extends et{generate(t={}){const{birthDate:e=null,gender:n=null}=t,a=["110101","310101","440101","500101","120101"],s=a[this.randomInt(0,a.length-1)];let i;if(e){const t=new Date(e);i=t.getFullYear()+this.padZero(t.getMonth()+1,2)+this.padZero(t.getDate(),2)}else{i=this.randomInt(1950,2005)+this.padZero(this.randomInt(1,12),2)+this.padZero(this.randomInt(1,28),2)}let r,l=this.randomDigits(2);r="male"===n?2*this.randomInt(0,4)+1:"female"===n?2*this.randomInt(0,4):this.randomInt(0,9),l+=r;const d=s+i+l;return d+this.calculateCheckDigit(d)}calculateCheckDigit(t){const e=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];let n=0;for(let a=0;a<17;a++)n+=parseInt(t[a])*e[a];return["1","0","X","9","8","7","6","5","4","3","2"][n%11]}}class yt extends et{generate(){const t=this.randomDigits(12);let e=0;for(let n=0;n<12;n++)e+=parseInt(t[n])*(13-n);return t+(11-e%11)%10}}class Rt extends et{generate(t={}){const{formatted:e=!0,birthDate:n=null}=t;let a;if(n){const t=new Date(n);a=t.getFullYear().toString().slice(-2)+this.padZero(t.getMonth()+1,2)+this.padZero(t.getDate(),2)}else{a=this.padZero(this.randomInt(0,99),2)+this.padZero(this.randomInt(1,12),2)+this.padZero(this.randomInt(1,28),2)}const s=["01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16"],i=a+s[this.randomInt(0,s.length-1)]+this.randomDigits(4);return e?`${i.substring(0,6)}-${i.substring(6,8)}-${i.substring(8,12)}`:i}}class Lt extends et{generate(t={}){const{formatted:e=!0}=t,n=this.randomDigits(11);let a=0,s=!1;for(let t=n.length-1;t>=0;t--){let e=parseInt(n[t]);s&&(e*=2,e>9&&(e=e%10+1)),a+=e,s=!s}const i=n+(10-a%10)%10;return e?`${i.substring(0,4)}-${i.substring(4,11)}-${i.substring(11,12)}`:i}}class kt extends et{generate(t={}){const{birthYear:e=null,gender:n=null}=t,a=["001","002","004","006","008","010","011","012","014","015"],s=a[this.randomInt(0,a.length-1)];let i;i="male"===n?this.randomInt(0,1)?"0":"2":"female"===n?this.randomInt(0,1)?"1":"3":this.randomInt(0,3).toString();return s+i+(e?e.toString().slice(-2):this.padZero(this.randomInt(0,99),2))+this.randomDigits(6)}}class At extends et{generate(t={}){const{birthDate:e=null,gender:n=null}=t,a=["11","12","13","14","15","16","17","18","19","21"],s=a[this.randomInt(0,a.length-1)],i=this.padZero(this.randomInt(1,99),2),r=this.padZero(this.randomInt(1,99),2);let l;if(e){const t=new Date(e);let a=t.getDate();"female"===n&&(a+=40);const s=this.padZero(t.getMonth()+1,2),i=t.getFullYear().toString().slice(-2);l=this.padZero(a,2)+s+i}else{let t=this.randomInt(1,31);("female"===n||null===n&&this.randomInt(0,1))&&(t+=40);const e=this.padZero(this.randomInt(1,12),2),a=this.padZero(this.randomInt(0,99),2);l=this.padZero(t,2)+e+a}return s+i+r+l+this.randomDigits(4)}}class Zt extends et{generate(t={}){const{birthDate:e=null,gender:n=null}=t;let a,s;if(e){const t=new Date(e);a=t.getFullYear().toString().slice(-2)+this.padZero(t.getMonth()+1,2)+this.padZero(t.getDate(),2)}else{a=this.padZero(this.randomInt(0,99),2)+this.padZero(this.randomInt(1,12),2)+this.padZero(this.randomInt(1,28),2)}s="male"===n?this.randomInt(5,9):"female"===n?this.randomInt(0,4):this.randomInt(0,9);const i=a+s+this.randomDigits(3)+this.randomInt(0,1)+this.randomInt(8,9);let r=0,l=!1;for(let t=i.length-1;t>=0;t--){let e=parseInt(i[t]);l&&(e*=2,e>9&&(e=e%10+1)),r+=e,l=!l}return i+(10-r%10)%10}}class Vt extends et{generate(t={}){const{birthDate:e=null}=t;let n;if(e){const t=new Date(e),a=t.getFullYear();n=(a>=2e3?"3":"2")+a.toString().slice(-2)+this.padZero(t.getMonth()+1,2)+this.padZero(t.getDate(),2)}else{n=(this.randomInt(0,1)?"2":"3")+this.padZero(this.randomInt(0,99),2)+this.padZero(this.randomInt(1,12),2)+this.padZero(this.randomInt(1,28),2)}return n+this.padZero(this.randomInt(1,35),2)+this.randomDigits(6)}}class Ft extends et{generate(){const t=this.randomDigits(10),e=[3,7,3,7,3,7,3,7,3,7];let n=0;for(let a=0;a<10;a++)n+=parseInt(t[a])*e[a];return t+n%10}}class St extends et{generate(){const t=this.randomInt(7,8);return this.randomDigits(t)}}class Et extends et{generate(){const t=this.randomDigits(9);let e=0,n=!1;for(let a=t.length-1;a>=0;a--){let s=parseInt(t[a]);n&&(s*=2,s>9&&(s=s%10+1)),e+=s,n=!n}return`GHA-${t}-${(10-e%10)%10}`}}class Tt extends et{generate(t={}){const{gender:e=null,birthYear:n=null}=t;let a;a="male"===e?"1":"female"===e?"2":this.randomInt(1,2).toString();const s=["01","02","06","13","33","59","69","75","92","93"],i=a+(n?n.toString().slice(-2):this.padZero(this.randomInt(0,99),2))+this.padZero(this.randomInt(1,12),2)+s[this.randomInt(0,s.length-1)]+this.padZero(this.randomInt(1,999),3)+this.padZero(this.randomInt(1,999),3),r=parseInt(i)%97;return i+this.padZero(97-r,2)}}class Pt extends et{generate(){let t,e=0;do{const n=this.randomDigits(10);let a=10;for(let t=0;t<10;t++){let e=(parseInt(n[t])+a)%10;0===e&&(e=10),a=2*e%11}let s=11-a;10===s&&(s=0),t=n+s,e++}while(!this.isValidStructure(t)&&e<100);return t}isValidStructure(t){const e={};for(let n of t.substring(0,10))e[n]=(e[n]||0)+1;for(let t of Object.values(e))if(t>3)return!1;return!0}}class Ut extends et{generate(t={}){const{lastName:e=null,firstName:n=null,birthDate:a=null,gender:s=null,birthPlace:i=null}=t,r=e?this.extractConsonants(e,3):this.randomLetter()+this.randomLetter()+this.randomLetter(),l=n?this.extractConsonants(n,3):this.randomLetter()+this.randomLetter()+this.randomLetter();let d;d=a?new Date(a).getFullYear().toString().slice(-2):this.padZero(this.randomInt(0,99),2);const o="ABCDEHLMPRST";let c,h;if(a){c=o[new Date(a).getMonth()]}else c=o[this.randomInt(0,11)];if(a){let t=new Date(a).getDate();"female"===s&&(t+=40),h=this.padZero(t,2)}else{let t=this.randomInt(1,31);("female"===s||null===s&&this.randomInt(0,1))&&(t+=40),h=this.padZero(t,2)}const u=r+l+d+c+h+(i||"H"+this.padZero(this.randomInt(1,999),3));return u+this.calculateCheckDigit(u)}extractConsonants(t,e){const n=t.toUpperCase().replace(/[AEIOU\s]/g,""),a=t.toUpperCase().replace(/[^AEIOU]/g,"");let s=n.substring(0,e);for(s.length<e&&(s+=a.substring(0,e-s.length));s.length<e;)s+="X";return s.substring(0,e)}calculateCheckDigit(t){const e={0:1,1:0,2:5,3:7,4:9,5:13,6:15,7:17,8:19,9:21,A:1,B:0,C:5,D:7,E:9,F:13,G:15,H:17,I:19,J:21,K:2,L:4,M:18,N:20,O:11,P:3,Q:6,R:8,S:12,T:14,U:16,V:10,W:22,X:25,Y:24,Z:23},n={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:0,B:1,C:2,D:3,E:4,F:5,G:6,H:7,I:8,J:9,K:10,L:11,M:12,N:13,O:14,P:15,Q:16,R:17,S:18,T:19,U:20,V:21,W:22,X:23,Y:24,Z:25};let a=0;for(let s=0;s<15;s++){const i=t[s];a+=s%2==0?e[i]:n[i]}return"ABCDEFGHIJKLMNOPQRSTUVWXYZ"[a%26]}}class Mt extends et{generate(){const t=this.randomDigits(8);return t+"TRWAGMYFPDXBNJZSQVHLCKE"[parseInt(t)%23]}}class Gt extends et{generate(t={}){const{formatted:e=!0}=t,n=this.randomDigits(8);let a=0;for(let t=0;t<8;t++)a+=parseInt(n[t])*(9-t);const s=a%11,i=n+(s>=10?0:s)+this.randomInt(0,9)+(this.randomLetter()+this.randomLetter())+this.randomInt(0,9);return e?`${i.substring(0,8)} ${i.substring(8,9)} ${i.substring(9,12)}`:i}}class wt extends et{generate(t={}){const{formatted:e=!0}=t,n=this.randomDigits(4),a=this.randomDigits(6);return e?`${n} ${a}`:n+a}}class Kt extends et{generate(){const t=this.randomDigits(9),e=[-1,5,7,9,4,6,10,5,7];let n=0;for(let a=0;a<9;a++)n+=parseInt(t[a])*e[a];let a=n%11;if(a>=10){const e=[7,1,3,5,8,2,4,6,9];n=0;for(let a=0;a<9;a++)n+=parseInt(t[a])*e[a];a=n%11,a>=10&&(a=0)}return t+a}}class Ht extends et{generate(){const t=this.randomInt(1,9)+this.randomDigits(8);let e=0,n=0;for(let a=0;a<9;a++)a%2==0?e+=parseInt(t[a]):n+=parseInt(t[a]);const a=t+(7*e-n)%10;let s=0;for(let t=0;t<10;t++)s+=parseInt(a[t]);return a+s%10}}class Yt extends et{generate(){const t=this.randomDigits(8);let e=0;for(let n=0;n<8;n++){let a=parseInt(t[n]);n%2==1&&(a*=2,a>9&&(a=Math.floor(a/10)+a%10)),e+=a}return t+(10-e%10)%10}}class Bt extends et{generate(){const t=this.randomInt(1950,2010),e=this.randomDigits(7),n=t+e;let a=0,s=!1;for(let t=n.length-1;t>=0;t--){let e=parseInt(n[t]);s&&(e*=2,e>9&&(e=e%10+1)),a+=e,s=!s}return`784-${t}-${e}-${(10-a%10)%10}`}}class Ot extends et{generate(){const t=this.randomInt(1,2)+this.randomDigits(8);let e=0,n=!1;for(let a=t.length-1;a>=0;a--){let s=parseInt(t[a]);n&&(s*=2,s>9&&(s=s%10+1)),e+=s,n=!n}return t+(10-e%10)%10}}class Jt extends et{generate(t={}){const{formatted:e=!0}=t,n=this.randomDigits(12),a=[6,5,4,3,2,7,6,5,4,3,2,7];let s=0;for(let t=0;t<12;t++)s+=parseInt(n[t])*a[t];const i=s%11,r=n+(i<2?i:11-i);return e?`${r.substring(0,5)}-${r.substring(5,12)}-${r.substring(12,13)}`:r}}class Wt extends et{generate(t={}){const{length:e=10}=t;if(![10,13,17].includes(e))throw new Error("Bangladeshi NID leng