ibankit
Version:
Validation, field extraction and creation of IBAN, BBAN, BIC numbers
278 lines • 67.8 kB
JavaScript
import { CharacterType, BbanStructurePart, PartType } from "./structurePart";
import { CountryCode } from "./country";
import { FormatException, FormatViolation, RequiredPartTypeMissing } from "./exceptions";
function mod11(value, weights) {
return ((11 - (value.split("").reduce((acc, s, idx) => acc + parseInt(s, 10) * weights[idx % weights.length], 0) % 11)) % 11);
}
function nationalES(bban, structure) {
const weights = [1, 2, 4, 8, 5, 10, 9, 7, 3, 6];
const combined = [PartType.BANK_CODE, PartType.BRANCH_CODE].map((p) => structure.extractValueMust(bban, p)).join("");
function to11(v) {
if (v === 10) {
return 1;
}
else if (v === 11) {
return 0;
}
return v;
}
const d1 = to11(mod11(`00${combined}`, weights));
const d2 = to11(mod11(structure.extractValueMust(bban, PartType.ACCOUNT_NUMBER), weights));
return `${d1}${d2}`;
}
function nationalFR(bban, structure) {
const replaceChars = {
["[AJ]"]: "1",
["[BKS]"]: "2",
["[CLT]"]: "3",
["[DMU]"]: "4",
["[ENV]"]: "5",
["[FOW]"]: "6",
["[GPX]"]: "7",
["[HQY]"]: "8",
["[IRZ]"]: "9",
};
let combined = [PartType.BANK_CODE, PartType.BRANCH_CODE, PartType.ACCOUNT_NUMBER]
.map((p) => String(structure.extractValue(bban, p)))
.join("") + "00";
Object.entries(replaceChars).map(([k, v]) => (combined = combined.replace(new RegExp(k, "g"), v)));
const expected = 97 - combined.split("").reduce((acc, v) => (acc * 10 + parseInt(v)) % 97, 0);
return String(expected).padStart(2, "0");
}
function nationalIT(bban, structure) {
const even = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25];
const odd = [1, 0, 5, 7, 9, 13, 15, 17, 19, 21, 2, 4, 18, 20, 11, 3, 6, 8, 12, 14, 16, 10, 22, 25, 24, 23];
const V0 = "0".charCodeAt(0);
const V9 = "9".charCodeAt(0);
const VA = "A".charCodeAt(0);
const value = [PartType.BANK_CODE, PartType.BRANCH_CODE, PartType.ACCOUNT_NUMBER]
.map((p) => structure.extractValueMust(bban, p))
.join("")
.split("")
.map((v) => v.toUpperCase().charCodeAt(0))
.map((v) => v - (V0 <= v && v <= V9 ? V0 : VA))
.reduce((acc, v, idx) => acc + (idx % 2 === 0 ? odd[v] : even[v]), 0) % 26;
return String.fromCharCode(VA + value);
}
function nationalNO(bban, structure) {
const value = [PartType.BANK_CODE, PartType.ACCOUNT_NUMBER].map((p) => structure.extractValueMust(bban, p)).join("");
return String(mod11(value, [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]) % 10);
}
function nationalPT(bban, structure) {
const V0 = "0".charCodeAt(0);
const weights = [73, 17, 89, 38, 62, 45, 53, 15, 50, 5, 49, 34, 81, 76, 27, 90, 9, 30, 3];
const remainder = [PartType.BANK_CODE, PartType.BRANCH_CODE, PartType.ACCOUNT_NUMBER]
.map((p) => structure.extractValueMust(bban, p))
.join("")
.split("")
.map((v) => v.charCodeAt(0))
.reduce((acc, v, idx) => (acc + (v - V0) * weights[idx]) % 97, 0);
return String(98 - remainder).padStart(2, "0");
}
export class BbanStructure {
constructor(...entries) {
this.entries = entries;
}
getParts() {
return this.entries;
}
validate(bban) {
this.validateBbanLength(bban);
this.validateBbanEntries(bban);
}
extractValue(bban, partType) {
let bbanPartOffset = 0;
let result = null;
for (const part of this.getParts()) {
const partLength = part.getLength();
const partValue = bban.substring(bbanPartOffset, bbanPartOffset + partLength);
bbanPartOffset = bbanPartOffset + partLength;
if (part.getPartType() == partType) {
result = (result || "") + partValue;
}
}
return result;
}
extractValueMust(bban, partType) {
const value = this.extractValue(bban, partType);
if (value === null) {
throw new RequiredPartTypeMissing(`Required part type [${partType}] missing`);
}
return value;
}
static forCountry(countryCode) {
if (!countryCode) {
return null;
}
return this.structures[countryCode] || null;
}
static getEntries() {
return Object.values(this.structures);
}
static supportedCountries() {
return Object.keys(this.structures);
}
getBbanLength() {
return this.entries.reduce((acc, e) => acc + e.getLength(), 0);
}
validateBbanLength(bban) {
const expectedBbanLength = this.getBbanLength();
const bbanLength = bban.length;
if (expectedBbanLength != bbanLength) {
throw new FormatException(FormatViolation.BBAN_LENGTH, `[${bban}] length is ${bbanLength}, expected BBAN length is: ${expectedBbanLength}`, String(bbanLength), String(expectedBbanLength));
}
}
validateBbanEntries(bban) {
let offset = 0;
for (const part of this.getParts()) {
const partLength = part.getLength();
const entryValue = bban.substring(offset, offset + partLength);
offset = offset + partLength;
this.validateBbanEntryCharacterType(bban, part, entryValue);
}
}
validateBbanEntryCharacterType(bban, part, entryValue) {
if (!part.validate(entryValue)) {
switch (part.getCharacterType()) {
case CharacterType.a:
throw new FormatException(FormatViolation.BBAN_ONLY_UPPER_CASE_LETTERS, `[${entryValue}] must contain only upper case letters.`, entryValue);
case CharacterType.c:
throw new FormatException(FormatViolation.BBAN_ONLY_DIGITS_OR_LETTERS, `[${entryValue}] must contain only digits or letters.`, entryValue);
case CharacterType.n:
throw new FormatException(FormatViolation.BBAN_ONLY_DIGITS, `[${entryValue}] must contain only digits.`, entryValue);
}
}
if (part.getPartType() === PartType.NATIONAL_CHECK_DIGIT && part.hasGenerator) {
const expected = part.generate(bban, this);
if (entryValue !== expected) {
throw new FormatException(FormatViolation.NATIONAL_CHECK_DIGIT, `national check digit(s) don't match expect=[${expected}] actual=[${entryValue}]`, expected, entryValue);
}
}
}
}
BbanStructure.bbanFR = new BbanStructure(BbanStructurePart.bankCode(5, CharacterType.n), BbanStructurePart.branchCode(5, CharacterType.n), BbanStructurePart.accountNumber(11, CharacterType.c), BbanStructurePart.nationalCheckDigit(2, CharacterType.n, nationalFR));
BbanStructure.structures = {
[CountryCode.AD]: new BbanStructure(BbanStructurePart.bankCode(4, CharacterType.n), BbanStructurePart.branchCode(4, CharacterType.n), BbanStructurePart.accountNumber(12, CharacterType.c)),
[CountryCode.AE]: new BbanStructure(BbanStructurePart.bankCode(3, CharacterType.n), BbanStructurePart.accountNumber(16, CharacterType.c)),
[CountryCode.AL]: new BbanStructure(BbanStructurePart.bankCode(3, CharacterType.n), BbanStructurePart.branchCode(4, CharacterType.n), BbanStructurePart.nationalCheckDigit(1, CharacterType.n), BbanStructurePart.accountNumber(16, CharacterType.c)),
[CountryCode.AO]: new BbanStructure(BbanStructurePart.accountNumber(21, CharacterType.n)),
[CountryCode.AT]: new BbanStructure(BbanStructurePart.bankCode(5, CharacterType.n), BbanStructurePart.accountNumber(11, CharacterType.n)),
[CountryCode.AZ]: new BbanStructure(BbanStructurePart.bankCode(4, CharacterType.a), BbanStructurePart.accountNumber(20, CharacterType.c)),
[CountryCode.BA]: new BbanStructure(BbanStructurePart.bankCode(3, CharacterType.n), BbanStructurePart.branchCode(3, CharacterType.n), BbanStructurePart.accountNumber(8, CharacterType.n), BbanStructurePart.nationalCheckDigit(2, CharacterType.n)),
[CountryCode.BE]: new BbanStructure(BbanStructurePart.bankCode(3, CharacterType.n), BbanStructurePart.accountNumber(7, CharacterType.n), BbanStructurePart.nationalCheckDigit(2, CharacterType.n, (bban, structure) => {
const accountNumber = structure.extractValue(bban, PartType.ACCOUNT_NUMBER);
const bankCode = structure.extractValue(bban, PartType.BANK_CODE);
if (accountNumber === null || bankCode === null) {
throw new FormatException(FormatViolation.NOT_EMPTY, "account number or bank code missing");
}
const value = parseInt(`${bankCode}${accountNumber}`, 10);
const remainder = Math.floor(value / 97);
let expected = value - remainder * 97;
if (expected === 0) {
expected = 97;
}
return String(expected).padStart(2, "0");
})),
[CountryCode.BF]: new BbanStructure(BbanStructurePart.accountNumber(23, CharacterType.n)),
[CountryCode.BG]: new BbanStructure(BbanStructurePart.bankCode(4, CharacterType.a), BbanStructurePart.branchCode(4, CharacterType.n), BbanStructurePart.accountType(2, CharacterType.n), BbanStructurePart.accountNumber(8, CharacterType.c)),
[CountryCode.BH]: new BbanStructure(BbanStructurePart.bankCode(4, CharacterType.a), BbanStructurePart.accountNumber(14, CharacterType.c)),
[CountryCode.BI]: new BbanStructure(BbanStructurePart.bankCode(5, CharacterType.n), BbanStructurePart.branchCode(5, CharacterType.n), BbanStructurePart.accountNumber(11, CharacterType.n), BbanStructurePart.nationalCheckDigit(2, CharacterType.n)),
[CountryCode.BJ]: new BbanStructure(BbanStructurePart.bankCode(5, CharacterType.c), BbanStructurePart.branchCode(5, CharacterType.n), BbanStructurePart.accountNumber(12, CharacterType.n), BbanStructurePart.nationalCheckDigit(2, CharacterType.n, nationalFR)),
[CountryCode.BR]: new BbanStructure(BbanStructurePart.bankCode(8, CharacterType.n), BbanStructurePart.branchCode(5, CharacterType.n), BbanStructurePart.accountNumber(10, CharacterType.n), BbanStructurePart.accountType(1, CharacterType.a), BbanStructurePart.ownerAccountNumber(1, CharacterType.c)),
[CountryCode.BY]: new BbanStructure(BbanStructurePart.bankCode(4, CharacterType.c), BbanStructurePart.accountType(4, CharacterType.n), BbanStructurePart.accountNumber(16, CharacterType.c)),
[CountryCode.CF]: new BbanStructure(BbanStructurePart.accountNumber(23, CharacterType.n)),
[CountryCode.CG]: new BbanStructure(BbanStructurePart.accountNumber(23, CharacterType.n)),
[CountryCode.CH]: new BbanStructure(BbanStructurePart.bankCode(5, CharacterType.n), BbanStructurePart.accountNumber(12, CharacterType.c)),
[CountryCode.CI]: new BbanStructure(BbanStructurePart.bankCode(2, CharacterType.c), BbanStructurePart.accountNumber(22, CharacterType.n)),
[CountryCode.CM]: new BbanStructure(BbanStructurePart.accountNumber(23, CharacterType.n)),
[CountryCode.CR]: new BbanStructure(BbanStructurePart.bankCode(4, CharacterType.n), BbanStructurePart.accountNumber(14, CharacterType.n)),
[CountryCode.CV]: new BbanStructure(BbanStructurePart.accountNumber(21, CharacterType.n)),
[CountryCode.CY]: new BbanStructure(BbanStructurePart.bankCode(3, CharacterType.n), BbanStructurePart.branchCode(5, CharacterType.n), BbanStructurePart.accountNumber(16, CharacterType.c)),
[CountryCode.CZ]: new BbanStructure(BbanStructurePart.bankCode(4, CharacterType.n), BbanStructurePart.branchCode(6, CharacterType.n), BbanStructurePart.accountNumber(10, CharacterType.n)),
[CountryCode.DE]: new BbanStructure(BbanStructurePart.bankCode(8, CharacterType.n), BbanStructurePart.accountNumber(10, CharacterType.n)),
[CountryCode.DJ]: new BbanStructure(BbanStructurePart.bankCode(5, CharacterType.n), BbanStructurePart.branchCode(5, CharacterType.n), BbanStructurePart.accountNumber(11, CharacterType.n), BbanStructurePart.nationalCheckDigit(2, CharacterType.n)),
[CountryCode.DK]: new BbanStructure(BbanStructurePart.bankCode(4, CharacterType.n), BbanStructurePart.accountNumber(10, CharacterType.n)),
[CountryCode.DO]: new BbanStructure(BbanStructurePart.bankCode(4, CharacterType.c), BbanStructurePart.accountNumber(20, CharacterType.n)),
[CountryCode.DZ]: new BbanStructure(BbanStructurePart.accountNumber(20, CharacterType.n)),
[CountryCode.EE]: new BbanStructure(BbanStructurePart.bankCode(2, CharacterType.n), BbanStructurePart.branchCode(2, CharacterType.n), BbanStructurePart.accountNumber(11, CharacterType.n), BbanStructurePart.nationalCheckDigit(1, CharacterType.n)),
[CountryCode.EG]: new BbanStructure(BbanStructurePart.bankCode(4, CharacterType.n), BbanStructurePart.branchCode(4, CharacterType.n), BbanStructurePart.accountNumber(17, CharacterType.n)),
[CountryCode.ES]: new BbanStructure(BbanStructurePart.bankCode(4, CharacterType.n), BbanStructurePart.branchCode(4, CharacterType.n), BbanStructurePart.nationalCheckDigit(2, CharacterType.n, nationalES), BbanStructurePart.accountNumber(10, CharacterType.n)),
[CountryCode.FI]: new BbanStructure(BbanStructurePart.bankCode(3, CharacterType.n), BbanStructurePart.accountNumber(11, CharacterType.n)),
[CountryCode.FK]: new BbanStructure(BbanStructurePart.bankCode(2, CharacterType.a), BbanStructurePart.accountNumber(12, CharacterType.n)),
[CountryCode.FO]: new BbanStructure(BbanStructurePart.bankCode(4, CharacterType.n), BbanStructurePart.accountNumber(9, CharacterType.n), BbanStructurePart.nationalCheckDigit(1, CharacterType.n)),
[CountryCode.FR]: BbanStructure.bbanFR,
[CountryCode.GA]: BbanStructure.bbanFR,
[CountryCode.GB]: new BbanStructure(BbanStructurePart.bankCode(4, CharacterType.a), BbanStructurePart.branchCode(6, CharacterType.n), BbanStructurePart.accountNumber(8, CharacterType.n)),
[CountryCode.GE]: new BbanStructure(BbanStructurePart.bankCode(2, CharacterType.a), BbanStructurePart.accountNumber(16, CharacterType.n)),
[CountryCode.GI]: new BbanStructure(BbanStructurePart.bankCode(4, CharacterType.a), BbanStructurePart.accountNumber(15, CharacterType.c)),
[CountryCode.GL]: new BbanStructure(BbanStructurePart.bankCode(4, CharacterType.n), BbanStructurePart.accountNumber(10, CharacterType.n)),
[CountryCode.GQ]: BbanStructure.bbanFR,
[CountryCode.GR]: new BbanStructure(BbanStructurePart.bankCode(3, CharacterType.n), BbanStructurePart.branchCode(4, CharacterType.n), BbanStructurePart.accountNumber(16, CharacterType.c)),
[CountryCode.GT]: new BbanStructure(BbanStructurePart.bankCode(4, CharacterType.c), BbanStructurePart.currencyType(2, CharacterType.n), BbanStructurePart.accountType(2, CharacterType.n), BbanStructurePart.accountNumber(16, CharacterType.c)),
[CountryCode.HR]: new BbanStructure(BbanStructurePart.bankCode(7, CharacterType.n), BbanStructurePart.accountNumber(10, CharacterType.n)),
[CountryCode.HN]: new BbanStructure(BbanStructurePart.bankCode(4, CharacterType.a), BbanStructurePart.accountNumber(20, CharacterType.n)),
[CountryCode.HU]: new BbanStructure(BbanStructurePart.bankCode(3, CharacterType.n), BbanStructurePart.branchCode(4, CharacterType.n), BbanStructurePart.branchCheckDigit(1, CharacterType.n), BbanStructurePart.accountNumber(15, CharacterType.n), BbanStructurePart.nationalCheckDigit(1, CharacterType.n)),
[CountryCode.IE]: new BbanStructure(BbanStructurePart.bankCode(4, CharacterType.a), BbanStructurePart.branchCode(6, CharacterType.n), BbanStructurePart.accountNumber(8, CharacterType.n)),
[CountryCode.IL]: new BbanStructure(BbanStructurePart.bankCode(3, CharacterType.n), BbanStructurePart.branchCode(3, CharacterType.n), BbanStructurePart.accountNumber(13, CharacterType.n)),
[CountryCode.IQ]: new BbanStructure(BbanStructurePart.bankCode(4, CharacterType.a), BbanStructurePart.branchCode(3, CharacterType.n), BbanStructurePart.accountNumber(12, CharacterType.n)),
[CountryCode.IR]: new BbanStructure(BbanStructurePart.bankCode(3, CharacterType.n), BbanStructurePart.accountNumber(19, CharacterType.n)),
[CountryCode.IS]: new BbanStructure(BbanStructurePart.bankCode(4, CharacterType.n), BbanStructurePart.branchCode(2, CharacterType.n), BbanStructurePart.accountNumber(6, CharacterType.n), BbanStructurePart.identificationNumber(10, CharacterType.n)),
[CountryCode.IT]: new BbanStructure(BbanStructurePart.nationalCheckDigit(1, CharacterType.a, nationalIT), BbanStructurePart.bankCode(5, CharacterType.n), BbanStructurePart.branchCode(5, CharacterType.n), BbanStructurePart.accountNumber(12, CharacterType.c)),
[CountryCode.JO]: new BbanStructure(BbanStructurePart.bankCode(4, CharacterType.a), BbanStructurePart.branchCode(4, CharacterType.n), BbanStructurePart.accountNumber(18, CharacterType.c)),
[CountryCode.KM]: new BbanStructure(BbanStructurePart.accountNumber(23, CharacterType.n)),
[CountryCode.KW]: new BbanStructure(BbanStructurePart.bankCode(4, CharacterType.a), BbanStructurePart.accountNumber(22, CharacterType.c)),
[CountryCode.KZ]: new BbanStructure(BbanStructurePart.bankCode(3, CharacterType.n), BbanStructurePart.accountNumber(13, CharacterType.c)),
[CountryCode.LB]: new BbanStructure(BbanStructurePart.bankCode(4, CharacterType.n), BbanStructurePart.accountNumber(20, CharacterType.c)),
[CountryCode.LC]: new BbanStructure(BbanStructurePart.bankCode(4, CharacterType.a), BbanStructurePart.accountNumber(24, CharacterType.n)),
[CountryCode.LI]: new BbanStructure(BbanStructurePart.bankCode(5, CharacterType.n), BbanStructurePart.accountNumber(12, CharacterType.c)),
[CountryCode.LT]: new BbanStructure(BbanStructurePart.bankCode(5, CharacterType.n), BbanStructurePart.accountNumber(11, CharacterType.n)),
[CountryCode.LU]: new BbanStructure(BbanStructurePart.bankCode(3, CharacterType.n), BbanStructurePart.accountNumber(13, CharacterType.c)),
[CountryCode.LV]: new BbanStructure(BbanStructurePart.bankCode(4, CharacterType.a), BbanStructurePart.accountNumber(13, CharacterType.c)),
[CountryCode.LY]: new BbanStructure(BbanStructurePart.bankCode(3, CharacterType.n), BbanStructurePart.branchCode(3, CharacterType.n), BbanStructurePart.accountNumber(15, CharacterType.n)),
[CountryCode.MA]: new BbanStructure(BbanStructurePart.accountNumber(24, CharacterType.n)),
[CountryCode.MC]: new BbanStructure(BbanStructurePart.bankCode(5, CharacterType.n), BbanStructurePart.branchCode(5, CharacterType.n), BbanStructurePart.accountNumber(11, CharacterType.c), BbanStructurePart.nationalCheckDigit(2, CharacterType.n, nationalFR)),
[CountryCode.MD]: new BbanStructure(BbanStructurePart.bankCode(2, CharacterType.c), BbanStructurePart.accountNumber(18, CharacterType.c)),
[CountryCode.ME]: new BbanStructure(BbanStructurePart.bankCode(3, CharacterType.n), BbanStructurePart.accountNumber(13, CharacterType.n), BbanStructurePart.nationalCheckDigit(2, CharacterType.n)),
[CountryCode.MG]: new BbanStructure(BbanStructurePart.bankCode(5, CharacterType.n), BbanStructurePart.branchCode(5, CharacterType.n), BbanStructurePart.accountNumber(11, CharacterType.c), BbanStructurePart.nationalCheckDigit(2, CharacterType.n)),
[CountryCode.MK]: new BbanStructure(BbanStructurePart.bankCode(3, CharacterType.n), BbanStructurePart.accountNumber(10, CharacterType.c), BbanStructurePart.nationalCheckDigit(2, CharacterType.n)),
[CountryCode.ML]: new BbanStructure(BbanStructurePart.bankCode(1, CharacterType.a), BbanStructurePart.accountNumber(25, CharacterType.n)),
[CountryCode.MN]: new BbanStructure(BbanStructurePart.bankCode(4, CharacterType.n), BbanStructurePart.accountNumber(12, CharacterType.n)),
[CountryCode.MR]: new BbanStructure(BbanStructurePart.bankCode(5, CharacterType.n), BbanStructurePart.branchCode(5, CharacterType.n), BbanStructurePart.accountNumber(11, CharacterType.n), BbanStructurePart.nationalCheckDigit(2, CharacterType.n)),
[CountryCode.MT]: new BbanStructure(BbanStructurePart.bankCode(4, CharacterType.a), BbanStructurePart.branchCode(5, CharacterType.n), BbanStructurePart.accountNumber(18, CharacterType.c)),
[CountryCode.MU]: new BbanStructure(BbanStructurePart.bankCode(6, CharacterType.c), BbanStructurePart.branchCode(2, CharacterType.n), BbanStructurePart.accountNumber(12, CharacterType.c), BbanStructurePart.accountType(3, CharacterType.n), BbanStructurePart.currencyType(3, CharacterType.a)),
[CountryCode.MZ]: new BbanStructure(BbanStructurePart.accountNumber(21, CharacterType.n)),
[CountryCode.NE]: new BbanStructure(BbanStructurePart.bankCode(2, CharacterType.a), BbanStructurePart.accountNumber(22, CharacterType.n)),
[CountryCode.NI]: new BbanStructure(BbanStructurePart.bankCode(4, CharacterType.a), BbanStructurePart.accountNumber(20, CharacterType.n)),
[CountryCode.NL]: new BbanStructure(BbanStructurePart.bankCode(4, CharacterType.a), BbanStructurePart.accountNumber(10, CharacterType.n)),
[CountryCode.NO]: new BbanStructure(BbanStructurePart.bankCode(4, CharacterType.n), BbanStructurePart.accountNumber(6, CharacterType.n), BbanStructurePart.nationalCheckDigit(1, CharacterType.n, nationalNO)),
[CountryCode.OM]: new BbanStructure(BbanStructurePart.bankCode(3, CharacterType.n), BbanStructurePart.accountNumber(16, CharacterType.n)),
[CountryCode.PK]: new BbanStructure(BbanStructurePart.bankCode(4, CharacterType.c), BbanStructurePart.accountNumber(16, CharacterType.c)),
[CountryCode.PL]: new BbanStructure(BbanStructurePart.bankCode(3, CharacterType.n), BbanStructurePart.branchCode(4, CharacterType.n), BbanStructurePart.nationalCheckDigit(1, CharacterType.n), BbanStructurePart.accountNumber(16, CharacterType.n)),
[CountryCode.PS]: new BbanStructure(BbanStructurePart.bankCode(4, CharacterType.a), BbanStructurePart.accountNumber(21, CharacterType.c)),
[CountryCode.PT]: new BbanStructure(BbanStructurePart.bankCode(4, CharacterType.n), BbanStructurePart.branchCode(4, CharacterType.n), BbanStructurePart.accountNumber(11, CharacterType.n), BbanStructurePart.nationalCheckDigit(2, CharacterType.n, nationalPT)),
[CountryCode.QA]: new BbanStructure(BbanStructurePart.bankCode(4, CharacterType.a), BbanStructurePart.accountNumber(21, CharacterType.c)),
[CountryCode.RO]: new BbanStructure(BbanStructurePart.bankCode(4, CharacterType.a), BbanStructurePart.accountNumber(16, CharacterType.c)),
[CountryCode.RS]: new BbanStructure(BbanStructurePart.bankCode(3, CharacterType.n), BbanStructurePart.accountNumber(13, CharacterType.n), BbanStructurePart.nationalCheckDigit(2, CharacterType.n)),
[CountryCode.RU]: new BbanStructure(BbanStructurePart.bankCode(9, CharacterType.n), BbanStructurePart.branchCode(5, CharacterType.n), BbanStructurePart.accountNumber(15, CharacterType.c)),
[CountryCode.SA]: new BbanStructure(BbanStructurePart.bankCode(2, CharacterType.n), BbanStructurePart.accountNumber(18, CharacterType.c)),
[CountryCode.SC]: new BbanStructure(BbanStructurePart.bankCode(4, CharacterType.a), BbanStructurePart.branchCode(2, CharacterType.n), BbanStructurePart.branchCheckDigit(2, CharacterType.n), BbanStructurePart.accountNumber(16, CharacterType.n), BbanStructurePart.currencyType(3, CharacterType.a)),
[CountryCode.SD]: new BbanStructure(BbanStructurePart.bankCode(2, CharacterType.n), BbanStructurePart.accountNumber(12, CharacterType.n)),
[CountryCode.SE]: new BbanStructure(BbanStructurePart.bankCode(3, CharacterType.n), BbanStructurePart.accountNumber(16, CharacterType.n), BbanStructurePart.nationalCheckDigit(1, CharacterType.n)),
[CountryCode.SI]: new BbanStructure(BbanStructurePart.bankCode(2, CharacterType.n), BbanStructurePart.branchCode(3, CharacterType.n), BbanStructurePart.accountNumber(8, CharacterType.n), BbanStructurePart.nationalCheckDigit(2, CharacterType.n)),
[CountryCode.SK]: new BbanStructure(BbanStructurePart.bankCode(4, CharacterType.n), BbanStructurePart.accountNumber(16, CharacterType.n)),
[CountryCode.SM]: new BbanStructure(BbanStructurePart.nationalCheckDigit(1, CharacterType.a, nationalIT), BbanStructurePart.bankCode(5, CharacterType.n), BbanStructurePart.branchCode(5, CharacterType.n), BbanStructurePart.accountNumber(12, CharacterType.c)),
[CountryCode.SN]: new BbanStructure(BbanStructurePart.bankCode(5, CharacterType.c), BbanStructurePart.branchCode(5, CharacterType.n), BbanStructurePart.accountNumber(14, CharacterType.n)),
[CountryCode.SO]: new BbanStructure(BbanStructurePart.bankCode(4, CharacterType.n), BbanStructurePart.branchCode(3, CharacterType.n), BbanStructurePart.accountNumber(12, CharacterType.n)),
[CountryCode.ST]: new BbanStructure(BbanStructurePart.bankCode(4, CharacterType.n), BbanStructurePart.branchCode(4, CharacterType.n), BbanStructurePart.accountNumber(13, CharacterType.n)),
[CountryCode.SV]: new BbanStructure(BbanStructurePart.bankCode(4, CharacterType.a), BbanStructurePart.branchCode(4, CharacterType.n), BbanStructurePart.accountNumber(16, CharacterType.n)),
[CountryCode.TG]: new BbanStructure(BbanStructurePart.bankCode(2, CharacterType.a), BbanStructurePart.accountNumber(22, CharacterType.n)),
[CountryCode.TD]: new BbanStructure(BbanStructurePart.accountNumber(23, CharacterType.n)),
[CountryCode.TL]: new BbanStructure(BbanStructurePart.bankCode(3, CharacterType.n), BbanStructurePart.accountNumber(14, CharacterType.n), BbanStructurePart.nationalCheckDigit(2, CharacterType.n)),
[CountryCode.TN]: new BbanStructure(BbanStructurePart.bankCode(2, CharacterType.n), BbanStructurePart.branchCode(3, CharacterType.n), BbanStructurePart.accountNumber(13, CharacterType.c), BbanStructurePart.nationalCheckDigit(2, CharacterType.c)),
[CountryCode.TR]: new BbanStructure(BbanStructurePart.bankCode(5, CharacterType.n), BbanStructurePart.nationalCheckDigit(1, CharacterType.c), BbanStructurePart.accountNumber(16, CharacterType.c)),
[CountryCode.UA]: new BbanStructure(BbanStructurePart.bankCode(6, CharacterType.n), BbanStructurePart.accountNumber(19, CharacterType.n)),
[CountryCode.VA]: new BbanStructure(BbanStructurePart.bankCode(3, CharacterType.c), BbanStructurePart.accountNumber(15, CharacterType.n)),
[CountryCode.VG]: new BbanStructure(BbanStructurePart.bankCode(4, CharacterType.a), BbanStructurePart.accountNumber(16, CharacterType.n)),
[CountryCode.XK]: new BbanStructure(BbanStructurePart.bankCode(2, CharacterType.n), BbanStructurePart.branchCode(2, CharacterType.n), BbanStructurePart.accountNumber(10, CharacterType.n), BbanStructurePart.nationalCheckDigit(2, CharacterType.n)),
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmJhblN0cnVjdHVyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iYmFuU3RydWN0dXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0UsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN4QyxPQUFPLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUt6RixTQUFTLEtBQUssQ0FBQyxLQUFhLEVBQUUsT0FBaUI7SUFDN0MsT0FBTyxDQUNMLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQ3JILENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsSUFBWSxFQUFFLFNBQXdCO0lBQ3hELE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDaEQsTUFBTSxRQUFRLEdBQUcsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFckgsU0FBUyxJQUFJLENBQUMsQ0FBUztRQUNyQixJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDWixPQUFPLENBQUMsQ0FBQztTQUNWO2FBQU0sSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ25CLE9BQU8sQ0FBQyxDQUFDO1NBQ1Y7UUFDRCxPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssUUFBUSxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNqRCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLGNBQWMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFFM0YsT0FBTyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztBQUN0QixDQUFDO0FBS0QsU0FBUyxVQUFVLENBQUMsSUFBWSxFQUFFLFNBQXdCO0lBQ3hELE1BQU0sWUFBWSxHQUFHO1FBQ25CLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRztRQUNiLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRztRQUNkLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRztRQUNkLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRztRQUNkLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRztRQUNkLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRztRQUNkLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRztRQUNkLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRztRQUNkLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRztLQUNmLENBQUM7SUFDRixJQUFJLFFBQVEsR0FDVixDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsY0FBYyxDQUFDO1NBQ2hFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDbkQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUNyQixNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFHbkcsTUFBTSxRQUFRLEdBQUcsRUFBRSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUU5RixPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzNDLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxJQUFZLEVBQUUsU0FBd0I7SUFDeEQsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDNUcsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDM0csTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QixNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdCLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0IsTUFBTSxLQUFLLEdBQ1QsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLGNBQWMsQ0FBQztTQUNoRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDL0MsSUFBSSxDQUFDLEVBQUUsQ0FBQztTQUNSLEtBQUssQ0FBQyxFQUFFLENBQUM7U0FDVCxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDekMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMs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QWEsQ0FBQyxDQUFDLENBQUMsRUFDOUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLEVBQUUsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQ3JEO0lBR0QsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxhQUFhLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLEVBQUUsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFekYsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxhQUFhLENBQ2pDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUM5QyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFDaEQsaUJBQWlCLENBQUMsYUFBYSxDQUFDLEVBQUUsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQ3BELGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQ3pEO0lBRUQsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxhQUFhLENBQ2pDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUM5QyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFDaEQsaUJBQWlCLENBQUMsYUFBYSxDQUFDLEVBQUUsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQ3JEO0lBR0QsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxhQUFhLENBQ2pDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUM5QyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFDaEQsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxFQUFF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YUFBYSxDQUNqQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFDOUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQ2xELGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUNqRCxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FDckQ7SUFFRCxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLGFBQWEsQ0FDakMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQzlDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxFQUFFLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUNyRDtJQUdELENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksYUFBYSxDQUNqQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUF