///|
fn registry() -> Array[CountrySpec] {
  [
    {
      code: "AD",
      length: 24,
      bban_pattern: "4n4n12c",
      bank: 4,
      branch: 4,
      account: 12,
    },
    {
      code: "AE",
      length: 23,
      bban_pattern: "3n16n",
      bank: 3,
      branch: 0,
      account: 16,
    },
    {
      code: "AL",
      length: 28,
      bban_pattern: "8n16c",
      bank: 8,
      branch: 0,
      account: 16,
    },
    {
      code: "AT",
      length: 20,
      bban_pattern: "5n11n",
      bank: 5,
      branch: 0,
      account: 11,
    },
    {
      code: "AZ",
      length: 28,
      bban_pattern: "4n20c",
      bank: 4,
      branch: 0,
      account: 20,
    },
    {
      code: "BA",
      length: 20,
      bban_pattern: "3n3n8n2n",
      bank: 3,
      branch: 3,
      account: 8,
    },
    {
      code: "BE",
      length: 16,
      bban_pattern: "3n7n2n",
      bank: 3,
      branch: 0,
      account: 7,
    },
    {
      code: "BG",
      length: 22,
      bban_pattern: "4a4n2n8c",
      bank: 4,
      branch: 4,
      account: 8,
    },
    {
      code: "BH",
      length: 22,
      bban_pattern: "4a14c",
      bank: 4,
      branch: 0,
      account: 14,
    },
    {
      code: "BR",
      length: 29,
      bban_pattern: "8n5n10n1a1c",
      bank: 8,
      branch: 5,
      account: 10,
    },
    {
      code: "CH",
      length: 21,
      bban_pattern: "5n12c",
      bank: 5,
      branch: 0,
      account: 12,
    },
    {
      code: "CR",
      length: 22,
      bban_pattern: "4n14n",
      bank: 4,
      branch: 0,
      account: 14,
    },
    {
      code: "CY",
      length: 28,
      bban_pattern: "3n5n16c",
      bank: 3,
      branch: 5,
      account: 16,
    },
    {
      code: "CZ",
      length: 24,
      bban_pattern: "4n6n10n",
      bank: 4,
      branch: 6,
      account: 10,
    },
    {
      code: "DE",
      length: 22,
      bban_pattern: "8n10n",
      bank: 8,
      branch: 0,
      account: 10,
    },
    {
      code: "DK",
      length: 18,
      bban_pattern: "4n9n1n",
      bank: 4,
      branch: 0,
      account: 9,
    },
    {
      code: "DO",
      length: 28,
      bban_pattern: "4c20n",
      bank: 4,
      branch: 0,
      account: 20,
    },
    {
      code: "EE",
      length: 20,
      bban_pattern: "2n14n",
      bank: 2,
      branch: 0,
      account: 14,
    },
    {
      code: "EG",
      length: 29,
      bban_pattern: "4n4n17n",
      bank: 4,
      branch: 4,
      account: 17,
    },
    {
      code: "ES",
      length: 24,
      bban_pattern: "4n4n1n1n10n",
      bank: 4,
      branch: 4,
      account: 10,
    },
    {
      code: "FI",
      length: 18,
      bban_pattern: "6n7n1n",
      bank: 6,
      branch: 0,
      account: 7,
    },
    {
      code: "FO",
      length: 18,
      bban_pattern: "4n9n1n",
      bank: 4,
      branch: 0,
      account: 9,
    },
    {
      code: "FR",
      length: 27,
      bban_pattern: "5n5n11c2n",
      bank: 5,
      branch: 5,
      account: 11,
    },
    {
      code: "GB",
      length: 22,
      bban_pattern: "4a6n8n",
      bank: 4,
      branch: 6,
      account: 8,
    },
    {
      code: "GE",
      length: 22,
      bban_pattern: "2a16n",
      bank: 2,
      branch: 0,
      account: 16,
    },
    {
      code: "GI",
      length: 23,
      bban_pattern: "4a15c",
      bank: 4,
      branch: 0,
      account: 15,
    },
    {
      code: "GL",
      length: 18,
      bban_pattern: "4n9n1n",
      bank: 4,
      branch: 0,
      account: 9,
    },
    {
      code: "GR",
      length: 27,
      bban_pattern: "3n4n16c",
      bank: 3,
      branch: 4,
      account: 16,
    },
    {
      code: "GT",
      length: 28,
      bban_pattern: "4c20c",
      bank: 4,
      branch: 0,
      account: 20,
    },
    {
      code: "HR",
      length: 21,
      bban_pattern: "7n10n",
      bank: 7,
      branch: 0,
      account: 10,
    },
    {
      code: "HU",
      length: 28,
      bban_pattern: "3n4n1n15n1n",
      bank: 3,
      branch: 4,
      account: 15,
    },
    {
      code: "IE",
      length: 22,
      bban_pattern: "4a6n8n",
      bank: 4,
      branch: 6,
      account: 8,
    },
    {
      code: "IL",
      length: 23,
      bban_pattern: "3n3n13n",
      bank: 3,
      branch: 3,
      account: 13,
    },
    {
      code: "IQ",
      length: 23,
      bban_pattern: "4a3n12n",
      bank: 4,
      branch: 3,
      account: 12,
    },
    {
      code: "IS",
      length: 26,
      bban_pattern: "4n2n6n10n",
      bank: 4,
      branch: 2,
      account: 10,
    },
    {
      code: "IT",
      length: 27,
      bban_pattern: "1a5n5n12c",
      bank: 5,
      branch: 5,
      account: 12,
    },
    {
      code: "JO",
      length: 30,
      bban_pattern: "4a4n18c",
      bank: 4,
      branch: 4,
      account: 18,
    },
    {
      code: "KW",
      length: 30,
      bban_pattern: "4a22c",
      bank: 4,
      branch: 0,
      account: 22,
    },
    {
      code: "KZ",
      length: 20,
      bban_pattern: "3n13c",
      bank: 3,
      branch: 0,
      account: 13,
    },
    {
      code: "LB",
      length: 28,
      bban_pattern: "4n20c",
      bank: 4,
      branch: 0,
      account: 20,
    },
    {
      code: "LC",
      length: 32,
      bban_pattern: "4a24c",
      bank: 4,
      branch: 0,
      account: 24,
    },
    {
      code: "LI",
      length: 21,
      bban_pattern: "5n12c",
      bank: 5,
      branch: 0,
      account: 12,
    },
    {
      code: "LT",
      length: 20,
      bban_pattern: "5n11n",
      bank: 5,
      branch: 0,
      account: 11,
    },
    {
      code: "LU",
      length: 20,
      bban_pattern: "3n13c",
      bank: 3,
      branch: 0,
      account: 13,
    },
    {
      code: "LV",
      length: 21,
      bban_pattern: "4a13c",
      bank: 4,
      branch: 0,
      account: 13,
    },
    {
      code: "MC",
      length: 27,
      bban_pattern: "5n5n11c2n",
      bank: 5,
      branch: 5,
      account: 11,
    },
    {
      code: "MD",
      length: 24,
      bban_pattern: "2c18c",
      bank: 2,
      branch: 0,
      account: 18,
    },
    {
      code: "ME",
      length: 22,
      bban_pattern: "3n13n2n",
      bank: 3,
      branch: 0,
      account: 13,
    },
    {
      code: "MK",
      length: 19,
      bban_pattern: "3n10n2n",
      bank: 3,
      branch: 0,
      account: 10,
    },
    {
      code: "MT",
      length: 31,
      bban_pattern: "4a5n18c",
      bank: 4,
      branch: 5,
      account: 18,
    },
    {
      code: "MU",
      length: 30,
      bban_pattern: "4a2n2n12n3n3a",
      bank: 4,
      branch: 2,
      account: 12,
    },
    {
      code: "NL",
      length: 18,
      bban_pattern: "4a10n",
      bank: 4,
      branch: 0,
      account: 10,
    },
    {
      code: "NO",
      length: 15,
      bban_pattern: "4n6n1n",
      bank: 4,
      branch: 0,
      account: 6,
    },
    {
      code: "PK",
      length: 24,
      bban_pattern: "4a16c",
      bank: 4,
      branch: 0,
      account: 16,
    },
    {
      code: "PL",
      length: 28,
      bban_pattern: "8n16n",
      bank: 8,
      branch: 0,
      account: 16,
    },
    {
      code: "PS",
      length: 29,
      bban_pattern: "4a21c",
      bank: 4,
      branch: 0,
      account: 21,
    },
    {
      code: "PT",
      length: 25,
      bban_pattern: "4n4n11n2n",
      bank: 4,
      branch: 4,
      account: 11,
    },
    {
      code: "QA",
      length: 29,
      bban_pattern: "4a21c",
      bank: 4,
      branch: 0,
      account: 21,
    },
    {
      code: "RO",
      length: 24,
      bban_pattern: "4a16c",
      bank: 4,
      branch: 0,
      account: 16,
    },
    {
      code: "RS",
      length: 22,
      bban_pattern: "3n13n2n",
      bank: 3,
      branch: 0,
      account: 13,
    },
    {
      code: "SA",
      length: 24,
      bban_pattern: "2n18c",
      bank: 2,
      branch: 0,
      account: 18,
    },
    {
      code: "SC",
      length: 31,
      bban_pattern: "4a2n2n16n3a",
      bank: 4,
      branch: 2,
      account: 16,
    },
    {
      code: "SE",
      length: 24,
      bban_pattern: "3n16n1n",
      bank: 3,
      branch: 0,
      account: 16,
    },
    {
      code: "SI",
      length: 19,
      bban_pattern: "5n8n2n",
      bank: 5,
      branch: 0,
      account: 8,
    },
    {
      code: "SK",
      length: 24,
      bban_pattern: "4n6n10n",
      bank: 4,
      branch: 6,
      account: 10,
    },
    {
      code: "SM",
      length: 27,
      bban_pattern: "1a5n5n12c",
      bank: 5,
      branch: 5,
      account: 12,
    },
    {
      code: "TN",
      length: 24,
      bban_pattern: "2n3n13n2n",
      bank: 2,
      branch: 3,
      account: 13,
    },
    {
      code: "TR",
      length: 26,
      bban_pattern: "5n1c16c",
      bank: 5,
      branch: 0,
      account: 16,
    },
    {
      code: "UA",
      length: 29,
      bban_pattern: "6n19c",
      bank: 6,
      branch: 0,
      account: 19,
    },
    {
      code: "VA",
      length: 22,
      bban_pattern: "3n15n",
      bank: 3,
      branch: 0,
      account: 15,
    },
    {
      code: "VG",
      length: 24,
      bban_pattern: "4a16n",
      bank: 4,
      branch: 0,
      account: 16,
    },
    {
      code: "XK",
      length: 20,
      bban_pattern: "4n10n2n",
      bank: 4,
      branch: 0,
      account: 10,
    },
  ]
}

///|
pub fn country_spec(code : String) -> CountrySpec? {
  let needle = code.to_upper()
  for spec in registry() {
    if spec.code == needle {
      return Some(spec)
    }
  }
  None
}

///|
pub fn registered_countries() -> Array[String] {
  registry().map(fn(spec) { spec.code })
}