diff --git a/README.md b/README.md
index abef0f6..84993f0 100644
--- a/README.md
+++ b/README.md
@@ -18,6 +18,8 @@ formats.
- Upgrade an ISBN-10 to its equivalent ISBN-13.
- Compare ISBNs across formats: an ISBN-10 is equal to its 13-digit
equivalent.
+- Format ISBNs with proper hyphenation, using the International ISBN
+ Agency's registration group and registrant range data.
## Requirements
@@ -55,6 +57,12 @@ const upgraded = ten.upgrade();
// Comparison works across formats.
std.debug.assert(ten.eql(&thirteen));
+
+// Hyphenate explicitly, or format with {f}.
+var buf: [ISBN.max_hyphenated_len]u8 = undefined;
+const hyphenated = try upgraded.hyphenate(&buf);
+std.debug.print("{s}\n", .{hyphenated}); // 978-0-306-40615-7
+std.debug.print("{f}\n", .{ten}); // 0-306-40615-2
```
`parse` returns `error.ParseError` for malformed input and
@@ -65,6 +73,16 @@ std.debug.assert(ten.eql(&thirteen));
- `-Dsimd=[bool]` — use SIMD vector operations for computing check
digits (default: `true`).
+## Range data
+
+Hyphenation uses the registration group and registrant ranges published
+by the [International ISBN Agency](https://www.isbn-international.org/),
+embedded at build time as `src/ranges.zig`. To update them:
+
+```sh
+zig build update-ranges
+```
+
## Testing
```sh
diff --git a/build.zig b/build.zig
index f137a22..897284f 100644
--- a/build.zig
+++ b/build.zig
@@ -58,4 +58,27 @@ pub fn build(b: *std.Build) void {
const bench_step = b.step("bench", "Run benchmarks comparing SIMD and scalar check digit computation");
bench_step.dependOn(&run_bench.step);
+
+ // The generator runs on the build host and writes into the source
+ // tree, so it ignores -Dtarget and -Doptimize.
+ const generate_exe = b.addExecutable(.{
+ .name = "generate_ranges",
+ .root_module = b.createModule(.{
+ .root_source_file = b.path("tools/generate_ranges.zig"),
+ .target = b.graph.host,
+ .optimize = .Debug,
+ }),
+ });
+
+ const run_generate = b.addRunArtifact(generate_exe);
+ const generated = run_generate.addOutputFileArg("ranges.zig");
+ // Declaring an output makes the run step cacheable, but the fetch
+ // must happen every time the step is requested.
+ run_generate.has_side_effects = true;
+
+ const update_source = b.addUpdateSourceFiles();
+ update_source.addCopyFileToSource(generated, "src/ranges.zig");
+
+ const update_ranges_step = b.step("update-ranges", "Fetch the ISBN range data and regenerate src/ranges.zig");
+ update_ranges_step.dependOn(&update_source.step);
}
diff --git a/src/isbn.zig b/src/isbn.zig
index 4b4c384..402c0e2 100644
--- a/src/isbn.zig
+++ b/src/isbn.zig
@@ -6,6 +6,7 @@
const std = @import("std");
const options = @import("options");
+const ranges = @import("ranges.zig");
/// An International Standard Book Number in either the legacy 10-digit
/// format or the current 13-digit (EAN-13) format.
@@ -195,6 +196,106 @@ pub const ISBN = union(enum) {
}
}
+ /// The maximum length of a hyphenated ISBN: 13 digits plus 4 hyphens.
+ pub const max_hyphenated_len = 17;
+
+ pub const HyphenateError = error{
+ /// The ISBN does not fall in a range assigned by the
+ /// International ISBN Agency, so the element boundaries are
+ /// unknown.
+ UnknownRange,
+ };
+
+ /// Writes the canonically hyphenated form into `out` and returns the
+ /// written slice: prefix, registration group, registrant, and
+ /// publication elements separated by `-` (the prefix element only for
+ /// an ISBN-13), followed by the check digit.
+ ///
+ /// The element boundaries come from the International ISBN Agency's
+ /// range data embedded at build time (see `tools/generate_ranges.py`);
+ /// returns `error.UnknownRange` for an ISBN outside the assigned
+ /// ranges.
+ pub fn hyphenate(self: *const ISBN, out: *[max_hyphenated_len]u8) HyphenateError![]const u8 {
+ switch (self.*) {
+ .@"10" => |buf| return writeHyphenated(out, null, buf[0..9], buf[9]),
+ .@"13" => |buf| return writeHyphenated(out, buf[0..3], buf[3..12], buf[12]),
+ }
+ }
+
+ /// Splits `digits` (registration group + registrant + publication)
+ /// per the range data and writes `prefix-group-registrant-publication-check`
+ /// (without the prefix element when `prefix` is null, for ISBN-10s,
+ /// which all live in the 978 prefix).
+ fn writeHyphenated(
+ out: *[max_hyphenated_len]u8,
+ prefix: ?*const [3]u8,
+ digits: *const [9]u8,
+ check: u8,
+ ) HyphenateError![]const u8 {
+ const ean: u16 = if (prefix) |p| ean: {
+ var v: u16 = 0;
+ for (p) |c| v = v * 10 + (c - '0');
+ break :ean v;
+ } else 978;
+
+ const group = for (ranges.groups) |*g| {
+ if (g.ean == ean and std.mem.startsWith(u8, digits, g.digits)) break g;
+ } else return error.UnknownRange;
+ const group_len = group.digits.len;
+
+ // The registrant length is determined by the value of the seven
+ // digits that follow the group, padded with zeros on the right.
+ var v: u32 = 0;
+ for (0..7) |i| {
+ const idx = group_len + i;
+ const d: u32 = if (idx < 9) digits[idx] - '0' else 0;
+ v = v * 10 + d;
+ }
+ const registrant_len = for (group.rules) |r| {
+ if (v >= r.min and v <= r.max) break r.len;
+ } else 0;
+ if (registrant_len == 0 or group_len + registrant_len >= 9) return error.UnknownRange;
+
+ var n: usize = 0;
+ if (prefix) |p| {
+ @memcpy(out[n..][0..3], p);
+ n += 3;
+ out[n] = '-';
+ n += 1;
+ }
+ @memcpy(out[n..][0..group_len], group.digits);
+ n += group_len;
+ out[n] = '-';
+ n += 1;
+ @memcpy(out[n..][0..registrant_len], digits[group_len..][0..registrant_len]);
+ n += registrant_len;
+ out[n] = '-';
+ n += 1;
+ const publication_len = 9 - group_len - registrant_len;
+ @memcpy(out[n..][0..publication_len], digits[group_len + registrant_len ..][0..publication_len]);
+ n += publication_len;
+ out[n] = '-';
+ n += 1;
+ out[n] = check;
+ n += 1;
+ return out[0..n];
+ }
+
+ /// Formats the ISBN for `{f}`: hyphenated when it falls in a range
+ /// assigned by the International ISBN Agency, as bare digits
+ /// otherwise.
+ pub fn format(self: *const ISBN, writer: *std.Io.Writer) std.Io.Writer.Error!void {
+ var buf: [max_hyphenated_len]u8 = undefined;
+ if (self.hyphenate(&buf)) |s| {
+ try writer.writeAll(s);
+ } else |_| {
+ try writer.writeAll(switch (self.*) {
+ .@"10" => |*b| b[0..],
+ .@"13" => |*b| b[0..],
+ });
+ }
+ }
+
/// Returns true if the two ISBNs identify the same book. ISBNs of
/// different formats are compared by upgrading both to ISBN-13, so an
/// ISBN-10 is equal to its 13-digit equivalent.
@@ -317,6 +418,38 @@ test "upgrade and eql" {
try std.testing.expect(!thirteen.eql(&other));
}
+test "hyphenate" {
+ var buf: [ISBN.max_hyphenated_len]u8 = undefined;
+
+ const ten: ISBN = try .parse("0306406152");
+ try std.testing.expectEqualStrings("0-306-40615-2", try ten.hyphenate(&buf));
+
+ const ten_x: ISBN = try .parse("080442957X");
+ try std.testing.expectEqualStrings("0-8044-2957-X", try ten_x.hyphenate(&buf));
+
+ const thirteen: ISBN = try .parse("9780306406157");
+ try std.testing.expectEqualStrings("978-0-306-40615-7", try thirteen.hyphenate(&buf));
+
+ const nine_seven_nine: ISBN = try .parse("9791090636071");
+ try std.testing.expectEqualStrings("979-10-90636-07-1", try nine_seven_nine.hyphenate(&buf));
+
+ // 978-99999 is not an assigned registration group.
+ const unknown: ISBN = try .parse("9999999999");
+ try std.testing.expectError(error.UnknownRange, unknown.hyphenate(&buf));
+}
+
+test "format" {
+ const thirteen: ISBN = try .parse("978-0-306-40615-7");
+ try std.testing.expectFmt("978-0-306-40615-7", "{f}", .{thirteen});
+
+ const ten: ISBN = try .parse("0-306-40615-2");
+ try std.testing.expectFmt("0-306-40615-2", "{f}", .{ten});
+
+ // An ISBN outside the assigned ranges falls back to bare digits.
+ const unknown: ISBN = try .parse("9999999999");
+ try std.testing.expectFmt("9999999999", "{f}", .{unknown});
+}
+
fn fuzz(_: void, smith: *std.testing.Smith) !void {
{
const len_weights: []const std.testing.Smith.Weight = &.{
diff --git a/src/ranges.zig b/src/ranges.zig
new file mode 100644
index 0000000..87c83f4
--- /dev/null
+++ b/src/ranges.zig
@@ -0,0 +1,3619 @@
+// SPDX-FileCopyrightText: © 2026 Jeffrey C. Ollie
+// SPDX-License-Identifier: MIT
+
+//! ISBN registration group and registrant ranges, generated by
+//! tools/generate_ranges.zig from the International ISBN Agency's
+//! range data (https://www.isbn-international.org/export_rangemessage.xml).
+//! Do not edit by hand.
+//!
+//! Message date: Sat, 29 Aug 2026 03:51:33 BST
+//! Serial number: ef91a48c-8ce8-476a-b73b-250a936f23a9
+
+/// Determines the length of the registrant element from the value of
+/// the seven digits that follow the registration group.
+pub const Rule = struct {
+ /// Inclusive lower bound on the seven-digit value.
+ min: u32,
+ /// Inclusive upper bound on the seven-digit value.
+ max: u32,
+ /// Number of digits in the registrant element; 0 means the range
+ /// has not been assigned and cannot be hyphenated.
+ len: u8,
+};
+
+/// A registration group (a country, region, or language area).
+pub const Group = struct {
+ /// The EAN prefix, 978 or 979.
+ ean: u16,
+ /// The registration group digits that follow the EAN prefix.
+ digits: []const u8,
+ /// Registrant length rules for this group.
+ rules: []const Rule,
+};
+
+pub const groups: []const Group = &.{
+ .{
+ .ean = 978,
+ .digits = "0",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 2 },
+ .{ .min = 2000000, .max = 2279999, .len = 3 },
+ .{ .min = 2280000, .max = 2289999, .len = 4 },
+ .{ .min = 2290000, .max = 3689999, .len = 3 },
+ .{ .min = 3690000, .max = 3699999, .len = 4 },
+ .{ .min = 3700000, .max = 6389999, .len = 3 },
+ .{ .min = 6390000, .max = 6397999, .len = 4 },
+ .{ .min = 6398000, .max = 6399999, .len = 7 },
+ .{ .min = 6400000, .max = 6449999, .len = 3 },
+ .{ .min = 6450000, .max = 6459999, .len = 7 },
+ .{ .min = 6460000, .max = 6479999, .len = 3 },
+ .{ .min = 6480000, .max = 6489999, .len = 7 },
+ .{ .min = 6490000, .max = 6549999, .len = 3 },
+ .{ .min = 6550000, .max = 6559999, .len = 4 },
+ .{ .min = 6560000, .max = 6999999, .len = 3 },
+ .{ .min = 7000000, .max = 8499999, .len = 4 },
+ .{ .min = 8500000, .max = 8999999, .len = 5 },
+ .{ .min = 9000000, .max = 9003709, .len = 6 },
+ .{ .min = 9003710, .max = 9003719, .len = 7 },
+ .{ .min = 9003720, .max = 9499999, .len = 6 },
+ .{ .min = 9500000, .max = 9999999, .len = 7 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "1",
+ .rules = &.{
+ .{ .min = 0, .max = 99999, .len = 3 },
+ .{ .min = 100000, .max = 299999, .len = 2 },
+ .{ .min = 300000, .max = 349999, .len = 3 },
+ .{ .min = 350000, .max = 399999, .len = 4 },
+ .{ .min = 400000, .max = 459999, .len = 3 },
+ .{ .min = 460000, .max = 469999, .len = 4 },
+ .{ .min = 470000, .max = 479999, .len = 3 },
+ .{ .min = 480000, .max = 499999, .len = 4 },
+ .{ .min = 500000, .max = 599999, .len = 2 },
+ .{ .min = 600000, .max = 664999, .len = 0 },
+ .{ .min = 665000, .max = 665749, .len = 7 },
+ .{ .min = 665750, .max = 665999, .len = 7 },
+ .{ .min = 666000, .max = 669999, .len = 7 },
+ .{ .min = 670000, .max = 699999, .len = 7 },
+ .{ .min = 700000, .max = 999999, .len = 4 },
+ .{ .min = 1000000, .max = 3979999, .len = 3 },
+ .{ .min = 3980000, .max = 5499999, .len = 4 },
+ .{ .min = 5500000, .max = 6499999, .len = 5 },
+ .{ .min = 6500000, .max = 6799999, .len = 4 },
+ .{ .min = 6800000, .max = 6859999, .len = 5 },
+ .{ .min = 6860000, .max = 7139999, .len = 4 },
+ .{ .min = 7140000, .max = 7169999, .len = 3 },
+ .{ .min = 7170000, .max = 7319999, .len = 4 },
+ .{ .min = 7320000, .max = 7399999, .len = 7 },
+ .{ .min = 7400000, .max = 7619999, .len = 5 },
+ .{ .min = 7620000, .max = 7634999, .len = 4 },
+ .{ .min = 7635000, .max = 7649999, .len = 7 },
+ .{ .min = 7650000, .max = 7749999, .len = 5 },
+ .{ .min = 7750000, .max = 7753999, .len = 7 },
+ .{ .min = 7754000, .max = 7763999, .len = 5 },
+ .{ .min = 7764000, .max = 7764999, .len = 7 },
+ .{ .min = 7765000, .max = 7769999, .len = 5 },
+ .{ .min = 7770000, .max = 7782999, .len = 7 },
+ .{ .min = 7783000, .max = 7899999, .len = 5 },
+ .{ .min = 7900000, .max = 7999999, .len = 4 },
+ .{ .min = 8000000, .max = 8004999, .len = 5 },
+ .{ .min = 8005000, .max = 8049999, .len = 5 },
+ .{ .min = 8050000, .max = 8379999, .len = 5 },
+ .{ .min = 8380000, .max = 8384999, .len = 7 },
+ .{ .min = 8385000, .max = 8671999, .len = 5 },
+ .{ .min = 8672000, .max = 8675999, .len = 4 },
+ .{ .min = 8676000, .max = 8697999, .len = 5 },
+ .{ .min = 8698000, .max = 9159999, .len = 6 },
+ .{ .min = 9160000, .max = 9165059, .len = 7 },
+ .{ .min = 9165060, .max = 9168699, .len = 6 },
+ .{ .min = 9168700, .max = 9169079, .len = 7 },
+ .{ .min = 9169080, .max = 9191639, .len = 6 },
+ .{ .min = 9191640, .max = 9195649, .len = 7 },
+ .{ .min = 9195650, .max = 9195999, .len = 6 },
+ .{ .min = 9196000, .max = 9196549, .len = 7 },
+ .{ .min = 9196550, .max = 9729999, .len = 6 },
+ .{ .min = 9730000, .max = 9877999, .len = 4 },
+ .{ .min = 9878000, .max = 9911499, .len = 6 },
+ .{ .min = 9911500, .max = 9911999, .len = 7 },
+ .{ .min = 9912000, .max = 9989899, .len = 6 },
+ .{ .min = 9989900, .max = 9999999, .len = 7 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "2",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 2 },
+ .{ .min = 2000000, .max = 3499999, .len = 3 },
+ .{ .min = 3500000, .max = 3999999, .len = 5 },
+ .{ .min = 4000000, .max = 4869999, .len = 3 },
+ .{ .min = 4870000, .max = 4949999, .len = 6 },
+ .{ .min = 4950000, .max = 4959999, .len = 3 },
+ .{ .min = 4960000, .max = 4966999, .len = 4 },
+ .{ .min = 4967000, .max = 4969999, .len = 5 },
+ .{ .min = 4970000, .max = 5279999, .len = 3 },
+ .{ .min = 5280000, .max = 5299999, .len = 4 },
+ .{ .min = 5300000, .max = 6999999, .len = 3 },
+ .{ .min = 7000000, .max = 8399999, .len = 4 },
+ .{ .min = 8400000, .max = 8999999, .len = 5 },
+ .{ .min = 9000000, .max = 9197999, .len = 6 },
+ .{ .min = 9198000, .max = 9198099, .len = 5 },
+ .{ .min = 9198100, .max = 9199429, .len = 6 },
+ .{ .min = 9199430, .max = 9199689, .len = 7 },
+ .{ .min = 9199690, .max = 9499999, .len = 6 },
+ .{ .min = 9500000, .max = 9999999, .len = 7 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "3",
+ .rules = &.{
+ .{ .min = 0, .max = 299999, .len = 2 },
+ .{ .min = 300000, .max = 339999, .len = 3 },
+ .{ .min = 340000, .max = 369999, .len = 4 },
+ .{ .min = 370000, .max = 399999, .len = 5 },
+ .{ .min = 400000, .max = 1999999, .len = 2 },
+ .{ .min = 2000000, .max = 3129999, .len = 3 },
+ .{ .min = 3130000, .max = 3139999, .len = 4 },
+ .{ .min = 3140000, .max = 3899999, .len = 3 },
+ .{ .min = 3900000, .max = 3999999, .len = 2 },
+ .{ .min = 4000000, .max = 6759999, .len = 3 },
+ .{ .min = 6760000, .max = 6879999, .len = 5 },
+ .{ .min = 6880000, .max = 6889999, .len = 3 },
+ .{ .min = 6890000, .max = 6949999, .len = 5 },
+ .{ .min = 6950000, .max = 8499999, .len = 4 },
+ .{ .min = 8500000, .max = 8999999, .len = 5 },
+ .{ .min = 9000000, .max = 9499999, .len = 6 },
+ .{ .min = 9500000, .max = 9539999, .len = 7 },
+ .{ .min = 9540000, .max = 9699999, .len = 5 },
+ .{ .min = 9700000, .max = 9849999, .len = 7 },
+ .{ .min = 9850000, .max = 9995999, .len = 5 },
+ .{ .min = 9996000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "4",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 2 },
+ .{ .min = 2000000, .max = 6999999, .len = 3 },
+ .{ .min = 7000000, .max = 8499999, .len = 4 },
+ .{ .min = 8500000, .max = 8999999, .len = 5 },
+ .{ .min = 9000000, .max = 9499999, .len = 6 },
+ .{ .min = 9500000, .max = 9999999, .len = 7 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "5",
+ .rules = &.{
+ .{ .min = 0, .max = 49999, .len = 5 },
+ .{ .min = 50000, .max = 99999, .len = 4 },
+ .{ .min = 100000, .max = 1999999, .len = 2 },
+ .{ .min = 2000000, .max = 3619999, .len = 3 },
+ .{ .min = 3620000, .max = 3623999, .len = 4 },
+ .{ .min = 3624000, .max = 3629999, .len = 5 },
+ .{ .min = 3630000, .max = 4209999, .len = 3 },
+ .{ .min = 4210000, .max = 4299999, .len = 4 },
+ .{ .min = 4300000, .max = 4309999, .len = 3 },
+ .{ .min = 4310000, .max = 4399999, .len = 4 },
+ .{ .min = 4400000, .max = 4409999, .len = 3 },
+ .{ .min = 4410000, .max = 4499999, .len = 4 },
+ .{ .min = 4500000, .max = 6029999, .len = 3 },
+ .{ .min = 6030000, .max = 6049999, .len = 7 },
+ .{ .min = 6050000, .max = 6999999, .len = 3 },
+ .{ .min = 7000000, .max = 8499999, .len = 4 },
+ .{ .min = 8500000, .max = 8999999, .len = 5 },
+ .{ .min = 9000000, .max = 9099999, .len = 6 },
+ .{ .min = 9100000, .max = 9199999, .len = 5 },
+ .{ .min = 9200000, .max = 9299999, .len = 4 },
+ .{ .min = 9300000, .max = 9499999, .len = 5 },
+ .{ .min = 9500000, .max = 9500999, .len = 7 },
+ .{ .min = 9501000, .max = 9799999, .len = 4 },
+ .{ .min = 9800000, .max = 9899999, .len = 5 },
+ .{ .min = 9900000, .max = 9909999, .len = 7 },
+ .{ .min = 9910000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "600",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 2 },
+ .{ .min = 1000000, .max = 4999999, .len = 3 },
+ .{ .min = 5000000, .max = 8999999, .len = 4 },
+ .{ .min = 9000000, .max = 9867999, .len = 5 },
+ .{ .min = 9868000, .max = 9929999, .len = 4 },
+ .{ .min = 9930000, .max = 9959999, .len = 3 },
+ .{ .min = 9960000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "601",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 2 },
+ .{ .min = 2000000, .max = 6999999, .len = 3 },
+ .{ .min = 7000000, .max = 7999999, .len = 4 },
+ .{ .min = 8000000, .max = 8499999, .len = 5 },
+ .{ .min = 8500000, .max = 9999999, .len = 2 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "602",
+ .rules = &.{
+ .{ .min = 0, .max = 699999, .len = 2 },
+ .{ .min = 700000, .max = 1399999, .len = 4 },
+ .{ .min = 1400000, .max = 1499999, .len = 5 },
+ .{ .min = 1500000, .max = 1699999, .len = 4 },
+ .{ .min = 1700000, .max = 1999999, .len = 5 },
+ .{ .min = 2000000, .max = 4999999, .len = 3 },
+ .{ .min = 5000000, .max = 5399999, .len = 5 },
+ .{ .min = 5400000, .max = 5999999, .len = 4 },
+ .{ .min = 6000000, .max = 6199999, .len = 5 },
+ .{ .min = 6200000, .max = 6999999, .len = 4 },
+ .{ .min = 7000000, .max = 7499999, .len = 5 },
+ .{ .min = 7500000, .max = 9499999, .len = 4 },
+ .{ .min = 9500000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "603",
+ .rules = &.{
+ .{ .min = 0, .max = 499999, .len = 2 },
+ .{ .min = 500000, .max = 4999999, .len = 2 },
+ .{ .min = 5000000, .max = 7999999, .len = 3 },
+ .{ .min = 8000000, .max = 8999999, .len = 4 },
+ .{ .min = 9000000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "604",
+ .rules = &.{
+ .{ .min = 0, .max = 2999999, .len = 1 },
+ .{ .min = 3000000, .max = 3999999, .len = 3 },
+ .{ .min = 4000000, .max = 4699999, .len = 2 },
+ .{ .min = 4700000, .max = 4979999, .len = 3 },
+ .{ .min = 4980000, .max = 4999999, .len = 4 },
+ .{ .min = 5000000, .max = 8999999, .len = 2 },
+ .{ .min = 9000000, .max = 9799999, .len = 3 },
+ .{ .min = 9800000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "605",
+ .rules = &.{
+ .{ .min = 0, .max = 299999, .len = 2 },
+ .{ .min = 300000, .max = 399999, .len = 3 },
+ .{ .min = 400000, .max = 599999, .len = 2 },
+ .{ .min = 600000, .max = 699999, .len = 5 },
+ .{ .min = 700000, .max = 999999, .len = 2 },
+ .{ .min = 1000000, .max = 1999999, .len = 3 },
+ .{ .min = 2000000, .max = 2399999, .len = 4 },
+ .{ .min = 2400000, .max = 3999999, .len = 3 },
+ .{ .min = 4000000, .max = 5999999, .len = 4 },
+ .{ .min = 6000000, .max = 7499999, .len = 5 },
+ .{ .min = 7500000, .max = 7999999, .len = 4 },
+ .{ .min = 8000000, .max = 8999999, .len = 5 },
+ .{ .min = 9000000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "606",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 3 },
+ .{ .min = 1000000, .max = 4999999, .len = 2 },
+ .{ .min = 5000000, .max = 7999999, .len = 3 },
+ .{ .min = 8000000, .max = 9099999, .len = 4 },
+ .{ .min = 9100000, .max = 9199999, .len = 3 },
+ .{ .min = 9200000, .max = 9599999, .len = 5 },
+ .{ .min = 9600000, .max = 9749999, .len = 4 },
+ .{ .min = 9750000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "607",
+ .rules = &.{
+ .{ .min = 0, .max = 2599999, .len = 2 },
+ .{ .min = 2600000, .max = 2649999, .len = 4 },
+ .{ .min = 2650000, .max = 2699999, .len = 5 },
+ .{ .min = 2700000, .max = 3999999, .len = 2 },
+ .{ .min = 4000000, .max = 5889999, .len = 3 },
+ .{ .min = 5890000, .max = 5929999, .len = 4 },
+ .{ .min = 5930000, .max = 5999999, .len = 5 },
+ .{ .min = 6000000, .max = 6919999, .len = 3 },
+ .{ .min = 6920000, .max = 6999999, .len = 5 },
+ .{ .min = 7000000, .max = 7499999, .len = 3 },
+ .{ .min = 7500000, .max = 9499999, .len = 4 },
+ .{ .min = 9500000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "608",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 1 },
+ .{ .min = 1000000, .max = 1999999, .len = 2 },
+ .{ .min = 2000000, .max = 4499999, .len = 3 },
+ .{ .min = 4500000, .max = 6499999, .len = 4 },
+ .{ .min = 6500000, .max = 6999999, .len = 5 },
+ .{ .min = 7000000, .max = 9999999, .len = 1 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "609",
+ .rules = &.{
+ .{ .min = 0, .max = 3999999, .len = 2 },
+ .{ .min = 4000000, .max = 7999999, .len = 3 },
+ .{ .min = 8000000, .max = 9499999, .len = 4 },
+ .{ .min = 9500000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "611",
+ .rules = &.{
+ .{ .min = 0, .max = 9999999, .len = 0 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "612",
+ .rules = &.{
+ .{ .min = 0, .max = 2999999, .len = 2 },
+ .{ .min = 3000000, .max = 3999999, .len = 3 },
+ .{ .min = 4000000, .max = 4499999, .len = 4 },
+ .{ .min = 4500000, .max = 4999999, .len = 5 },
+ .{ .min = 5000000, .max = 5299999, .len = 4 },
+ .{ .min = 5300000, .max = 9899999, .len = 0 },
+ .{ .min = 9900000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "613",
+ .rules = &.{
+ .{ .min = 0, .max = 9999999, .len = 1 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "614",
+ .rules = &.{
+ .{ .min = 0, .max = 3999999, .len = 2 },
+ .{ .min = 4000000, .max = 7999999, .len = 3 },
+ .{ .min = 8000000, .max = 9499999, .len = 4 },
+ .{ .min = 9500000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "615",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 2 },
+ .{ .min = 1000000, .max = 4999999, .len = 3 },
+ .{ .min = 5000000, .max = 7999999, .len = 4 },
+ .{ .min = 8000000, .max = 8999999, .len = 5 },
+ .{ .min = 9000000, .max = 9999999, .len = 0 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "616",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 2 },
+ .{ .min = 2000000, .max = 6999999, .len = 3 },
+ .{ .min = 7000000, .max = 8999999, .len = 4 },
+ .{ .min = 9000000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "617",
+ .rules = &.{
+ .{ .min = 0, .max = 4999999, .len = 2 },
+ .{ .min = 5000000, .max = 6999999, .len = 3 },
+ .{ .min = 7000000, .max = 8999999, .len = 4 },
+ .{ .min = 9000000, .max = 9049999, .len = 4 },
+ .{ .min = 9050000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "618",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 2 },
+ .{ .min = 2000000, .max = 4999999, .len = 3 },
+ .{ .min = 5000000, .max = 7999999, .len = 4 },
+ .{ .min = 8000000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "619",
+ .rules = &.{
+ .{ .min = 0, .max = 1499999, .len = 2 },
+ .{ .min = 1500000, .max = 6999999, .len = 3 },
+ .{ .min = 7000000, .max = 8999999, .len = 4 },
+ .{ .min = 9000000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "620",
+ .rules = &.{
+ .{ .min = 0, .max = 9999999, .len = 1 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "621",
+ .rules = &.{
+ .{ .min = 0, .max = 2999999, .len = 2 },
+ .{ .min = 3000000, .max = 3999999, .len = 0 },
+ .{ .min = 4000000, .max = 5999999, .len = 3 },
+ .{ .min = 6000000, .max = 7999999, .len = 0 },
+ .{ .min = 8000000, .max = 8999999, .len = 4 },
+ .{ .min = 9000000, .max = 9499999, .len = 0 },
+ .{ .min = 9500000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "622",
+ .rules = &.{
+ .{ .min = 0, .max = 1099999, .len = 2 },
+ .{ .min = 1100000, .max = 1299999, .len = 3 },
+ .{ .min = 1300000, .max = 1799999, .len = 4 },
+ .{ .min = 1800000, .max = 1829999, .len = 3 },
+ .{ .min = 1830000, .max = 1899999, .len = 4 },
+ .{ .min = 1900000, .max = 1949999, .len = 3 },
+ .{ .min = 1950000, .max = 1999999, .len = 5 },
+ .{ .min = 2000000, .max = 4599999, .len = 3 },
+ .{ .min = 4600000, .max = 8749999, .len = 4 },
+ .{ .min = 8750000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "623",
+ .rules = &.{
+ .{ .min = 0, .max = 1099999, .len = 2 },
+ .{ .min = 1100000, .max = 5249999, .len = 3 },
+ .{ .min = 5250000, .max = 8799999, .len = 4 },
+ .{ .min = 8800000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "624",
+ .rules = &.{
+ .{ .min = 0, .max = 499999, .len = 2 },
+ .{ .min = 500000, .max = 1999999, .len = 0 },
+ .{ .min = 2000000, .max = 2499999, .len = 3 },
+ .{ .min = 2500000, .max = 4849999, .len = 0 },
+ .{ .min = 4850000, .max = 6899999, .len = 4 },
+ .{ .min = 6900000, .max = 9099999, .len = 0 },
+ .{ .min = 9100000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "625",
+ .rules = &.{
+ .{ .min = 0, .max = 199999, .len = 2 },
+ .{ .min = 200000, .max = 3199999, .len = 0 },
+ .{ .min = 3200000, .max = 4429999, .len = 3 },
+ .{ .min = 4430000, .max = 4449999, .len = 5 },
+ .{ .min = 4450000, .max = 4499999, .len = 3 },
+ .{ .min = 4500000, .max = 4999999, .len = 0 },
+ .{ .min = 5000000, .max = 7793999, .len = 4 },
+ .{ .min = 7794000, .max = 7794999, .len = 5 },
+ .{ .min = 7795000, .max = 8999999, .len = 4 },
+ .{ .min = 9000000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "626",
+ .rules = &.{
+ .{ .min = 0, .max = 499999, .len = 2 },
+ .{ .min = 500000, .max = 2999999, .len = 0 },
+ .{ .min = 3000000, .max = 4999999, .len = 3 },
+ .{ .min = 5000000, .max = 6499999, .len = 0 },
+ .{ .min = 6500000, .max = 7999999, .len = 4 },
+ .{ .min = 8000000, .max = 9249999, .len = 0 },
+ .{ .min = 9250000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "627",
+ .rules = &.{
+ .{ .min = 0, .max = 2799999, .len = 0 },
+ .{ .min = 2800000, .max = 3199999, .len = 2 },
+ .{ .min = 3200000, .max = 4999999, .len = 0 },
+ .{ .min = 5000000, .max = 5349999, .len = 3 },
+ .{ .min = 5350000, .max = 7399999, .len = 0 },
+ .{ .min = 7400000, .max = 7999999, .len = 4 },
+ .{ .min = 8000000, .max = 9449999, .len = 0 },
+ .{ .min = 9450000, .max = 9514999, .len = 5 },
+ .{ .min = 9515000, .max = 9999999, .len = 0 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "628",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 2 },
+ .{ .min = 1000000, .max = 4999999, .len = 0 },
+ .{ .min = 5000000, .max = 5499999, .len = 3 },
+ .{ .min = 5500000, .max = 7499999, .len = 0 },
+ .{ .min = 7500000, .max = 8499999, .len = 4 },
+ .{ .min = 8500000, .max = 9499999, .len = 0 },
+ .{ .min = 9500000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "629",
+ .rules = &.{
+ .{ .min = 0, .max = 299999, .len = 2 },
+ .{ .min = 300000, .max = 4549999, .len = 0 },
+ .{ .min = 4550000, .max = 4999999, .len = 3 },
+ .{ .min = 5000000, .max = 7099999, .len = 0 },
+ .{ .min = 7100000, .max = 7999999, .len = 4 },
+ .{ .min = 8000000, .max = 9199999, .len = 0 },
+ .{ .min = 9200000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "630",
+ .rules = &.{
+ .{ .min = 0, .max = 2999999, .len = 0 },
+ .{ .min = 3000000, .max = 3999999, .len = 3 },
+ .{ .min = 4000000, .max = 6499999, .len = 0 },
+ .{ .min = 6500000, .max = 6849999, .len = 4 },
+ .{ .min = 6850000, .max = 9499999, .len = 0 },
+ .{ .min = 9500000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "631",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 2 },
+ .{ .min = 1000000, .max = 2999999, .len = 0 },
+ .{ .min = 3000000, .max = 3999999, .len = 3 },
+ .{ .min = 4000000, .max = 6499999, .len = 0 },
+ .{ .min = 6500000, .max = 7499999, .len = 4 },
+ .{ .min = 7500000, .max = 8999999, .len = 0 },
+ .{ .min = 9000000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "632",
+ .rules = &.{
+ .{ .min = 0, .max = 1199999, .len = 2 },
+ .{ .min = 1200000, .max = 5999999, .len = 0 },
+ .{ .min = 6000000, .max = 6799999, .len = 3 },
+ .{ .min = 6800000, .max = 9999999, .len = 0 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "633",
+ .rules = &.{
+ .{ .min = 0, .max = 199999, .len = 2 },
+ .{ .min = 200000, .max = 2999999, .len = 0 },
+ .{ .min = 3000000, .max = 3499999, .len = 3 },
+ .{ .min = 3500000, .max = 8249999, .len = 0 },
+ .{ .min = 8250000, .max = 8999999, .len = 4 },
+ .{ .min = 9000000, .max = 9949999, .len = 0 },
+ .{ .min = 9950000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "634",
+ .rules = &.{
+ .{ .min = 0, .max = 599999, .len = 2 },
+ .{ .min = 600000, .max = 1999999, .len = 0 },
+ .{ .min = 2000000, .max = 3499999, .len = 3 },
+ .{ .min = 3500000, .max = 6999999, .len = 0 },
+ .{ .min = 7000000, .max = 7999999, .len = 4 },
+ .{ .min = 8000000, .max = 9599999, .len = 0 },
+ .{ .min = 9600000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "635",
+ .rules = &.{
+ .{ .min = 0, .max = 499999, .len = 2 },
+ .{ .min = 500000, .max = 2499999, .len = 0 },
+ .{ .min = 2500000, .max = 3249999, .len = 3 },
+ .{ .min = 3250000, .max = 5799999, .len = 0 },
+ .{ .min = 5800000, .max = 6999999, .len = 4 },
+ .{ .min = 7000000, .max = 9599999, .len = 0 },
+ .{ .min = 9600000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "65",
+ .rules = &.{
+ .{ .min = 0, .max = 299999, .len = 2 },
+ .{ .min = 300000, .max = 2499999, .len = 0 },
+ .{ .min = 2500000, .max = 2999999, .len = 3 },
+ .{ .min = 3000000, .max = 3029999, .len = 3 },
+ .{ .min = 3030000, .max = 4999999, .len = 0 },
+ .{ .min = 5000000, .max = 6349999, .len = 4 },
+ .{ .min = 6350000, .max = 7999999, .len = 0 },
+ .{ .min = 8000000, .max = 8182499, .len = 5 },
+ .{ .min = 8182500, .max = 8199999, .len = 0 },
+ .{ .min = 8200000, .max = 8999999, .len = 5 },
+ .{ .min = 9000000, .max = 9024499, .len = 6 },
+ .{ .min = 9024500, .max = 9754999, .len = 0 },
+ .{ .min = 9755000, .max = 9999999, .len = 6 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "66",
+ .rules = &.{
+ .{ .min = 0, .max = 2999999, .len = 0 },
+ .{ .min = 3000000, .max = 3099999, .len = 2 },
+ .{ .min = 3100000, .max = 9999999, .len = 0 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "69990",
+ .rules = &.{
+ .{ .min = 0, .max = 4999999, .len = 0 },
+ .{ .min = 5000000, .max = 5199999, .len = 2 },
+ .{ .min = 5200000, .max = 9899999, .len = 0 },
+ .{ .min = 9900000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "7",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 2 },
+ .{ .min = 1000000, .max = 4999999, .len = 3 },
+ .{ .min = 5000000, .max = 7999999, .len = 4 },
+ .{ .min = 8000000, .max = 8999999, .len = 5 },
+ .{ .min = 9000000, .max = 9999999, .len = 6 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "80",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 2 },
+ .{ .min = 2000000, .max = 5299999, .len = 3 },
+ .{ .min = 5300000, .max = 5499999, .len = 5 },
+ .{ .min = 5500000, .max = 6899999, .len = 3 },
+ .{ .min = 6900000, .max = 6999999, .len = 5 },
+ .{ .min = 7000000, .max = 8499999, .len = 4 },
+ .{ .min = 8500000, .max = 8999999, .len = 5 },
+ .{ .min = 9000000, .max = 9989999, .len = 6 },
+ .{ .min = 9990000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "81",
+ .rules = &.{
+ .{ .min = 0, .max = 1899999, .len = 2 },
+ .{ .min = 1900000, .max = 1999999, .len = 5 },
+ .{ .min = 2000000, .max = 6479999, .len = 3 },
+ .{ .min = 6480000, .max = 6699999, .len = 4 },
+ .{ .min = 6700000, .max = 6799999, .len = 4 },
+ .{ .min = 6800000, .max = 6849999, .len = 5 },
+ .{ .min = 6850000, .max = 6899999, .len = 6 },
+ .{ .min = 6900000, .max = 6999999, .len = 5 },
+ .{ .min = 7000000, .max = 8499999, .len = 4 },
+ .{ .min = 8500000, .max = 8999999, .len = 5 },
+ .{ .min = 9000000, .max = 9999999, .len = 6 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "82",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 2 },
+ .{ .min = 2000000, .max = 6899999, .len = 3 },
+ .{ .min = 6900000, .max = 6999999, .len = 6 },
+ .{ .min = 7000000, .max = 8999999, .len = 4 },
+ .{ .min = 9000000, .max = 9899999, .len = 5 },
+ .{ .min = 9900000, .max = 9999999, .len = 6 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "83",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 2 },
+ .{ .min = 2000000, .max = 5999999, .len = 3 },
+ .{ .min = 6000000, .max = 6999999, .len = 5 },
+ .{ .min = 7000000, .max = 8499999, .len = 4 },
+ .{ .min = 8500000, .max = 8999999, .len = 5 },
+ .{ .min = 9000000, .max = 9999999, .len = 6 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "84",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 2 },
+ .{ .min = 1000000, .max = 1049999, .len = 5 },
+ .{ .min = 1050000, .max = 1199999, .len = 4 },
+ .{ .min = 1200000, .max = 1299999, .len = 6 },
+ .{ .min = 1300000, .max = 1399999, .len = 4 },
+ .{ .min = 1400000, .max = 1499999, .len = 3 },
+ .{ .min = 1500000, .max = 1999999, .len = 5 },
+ .{ .min = 2000000, .max = 6999999, .len = 3 },
+ .{ .min = 7000000, .max = 8499999, .len = 4 },
+ .{ .min = 8500000, .max = 8999999, .len = 5 },
+ .{ .min = 9000000, .max = 9199999, .len = 4 },
+ .{ .min = 9200000, .max = 9239999, .len = 6 },
+ .{ .min = 9240000, .max = 9299999, .len = 5 },
+ .{ .min = 9300000, .max = 9499999, .len = 6 },
+ .{ .min = 9500000, .max = 9699999, .len = 5 },
+ .{ .min = 9700000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "85",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 2 },
+ .{ .min = 2000000, .max = 4549999, .len = 3 },
+ .{ .min = 4550000, .max = 4552999, .len = 6 },
+ .{ .min = 4553000, .max = 4559999, .len = 5 },
+ .{ .min = 4560000, .max = 5289999, .len = 3 },
+ .{ .min = 5290000, .max = 5319999, .len = 5 },
+ .{ .min = 5320000, .max = 5339999, .len = 4 },
+ .{ .min = 5340000, .max = 5399999, .len = 3 },
+ .{ .min = 5400000, .max = 5402999, .len = 5 },
+ .{ .min = 5403000, .max = 5403999, .len = 5 },
+ .{ .min = 5404000, .max = 5404999, .len = 6 },
+ .{ .min = 5405000, .max = 5408999, .len = 5 },
+ .{ .min = 5409000, .max = 5409999, .len = 6 },
+ .{ .min = 5410000, .max = 5439999, .len = 5 },
+ .{ .min = 5440000, .max = 5479999, .len = 4 },
+ .{ .min = 5480000, .max = 5499999, .len = 5 },
+ .{ .min = 5500000, .max = 5999999, .len = 4 },
+ .{ .min = 6000000, .max = 6999999, .len = 5 },
+ .{ .min = 7000000, .max = 8499999, .len = 4 },
+ .{ .min = 8500000, .max = 8999999, .len = 5 },
+ .{ .min = 9000000, .max = 9249999, .len = 6 },
+ .{ .min = 9250000, .max = 9449999, .len = 5 },
+ .{ .min = 9450000, .max = 9599999, .len = 4 },
+ .{ .min = 9600000, .max = 9799999, .len = 2 },
+ .{ .min = 9800000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "86",
+ .rules = &.{
+ .{ .min = 0, .max = 2999999, .len = 2 },
+ .{ .min = 3000000, .max = 5999999, .len = 3 },
+ .{ .min = 6000000, .max = 7999999, .len = 4 },
+ .{ .min = 8000000, .max = 8999999, .len = 5 },
+ .{ .min = 9000000, .max = 9999999, .len = 6 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "87",
+ .rules = &.{
+ .{ .min = 0, .max = 2999999, .len = 2 },
+ .{ .min = 3000000, .max = 3999999, .len = 0 },
+ .{ .min = 4000000, .max = 6499999, .len = 3 },
+ .{ .min = 6500000, .max = 6999999, .len = 0 },
+ .{ .min = 7000000, .max = 7999999, .len = 4 },
+ .{ .min = 8000000, .max = 8499999, .len = 0 },
+ .{ .min = 8500000, .max = 9499999, .len = 5 },
+ .{ .min = 9500000, .max = 9699999, .len = 0 },
+ .{ .min = 9700000, .max = 9999999, .len = 6 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "88",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 2 },
+ .{ .min = 2000000, .max = 3119999, .len = 3 },
+ .{ .min = 3120000, .max = 3149999, .len = 5 },
+ .{ .min = 3150000, .max = 3189999, .len = 3 },
+ .{ .min = 3190000, .max = 3229999, .len = 5 },
+ .{ .min = 3230000, .max = 3269999, .len = 3 },
+ .{ .min = 3270000, .max = 3389999, .len = 4 },
+ .{ .min = 3390000, .max = 3609999, .len = 3 },
+ .{ .min = 3610000, .max = 3629999, .len = 4 },
+ .{ .min = 3630000, .max = 5489999, .len = 3 },
+ .{ .min = 5490000, .max = 5549999, .len = 4 },
+ .{ .min = 5550000, .max = 5999999, .len = 3 },
+ .{ .min = 6000000, .max = 8499999, .len = 4 },
+ .{ .min = 8500000, .max = 8999999, .len = 5 },
+ .{ .min = 9000000, .max = 9099999, .len = 6 },
+ .{ .min = 9100000, .max = 9269999, .len = 3 },
+ .{ .min = 9270000, .max = 9399999, .len = 4 },
+ .{ .min = 9400000, .max = 9479999, .len = 6 },
+ .{ .min = 9480000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "89",
+ .rules = &.{
+ .{ .min = 0, .max = 2499999, .len = 2 },
+ .{ .min = 2500000, .max = 5499999, .len = 3 },
+ .{ .min = 5500000, .max = 8499999, .len = 4 },
+ .{ .min = 8500000, .max = 9499999, .len = 5 },
+ .{ .min = 9500000, .max = 9699999, .len = 6 },
+ .{ .min = 9700000, .max = 9899999, .len = 5 },
+ .{ .min = 9900000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "90",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 2 },
+ .{ .min = 2000000, .max = 4999999, .len = 3 },
+ .{ .min = 5000000, .max = 6999999, .len = 4 },
+ .{ .min = 7000000, .max = 7999999, .len = 5 },
+ .{ .min = 8000000, .max = 8499999, .len = 6 },
+ .{ .min = 8500000, .max = 8999999, .len = 4 },
+ .{ .min = 9000000, .max = 9099999, .len = 2 },
+ .{ .min = 9100000, .max = 9399999, .len = 0 },
+ .{ .min = 9400000, .max = 9499999, .len = 2 },
+ .{ .min = 9500000, .max = 9999999, .len = 0 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "91",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 1 },
+ .{ .min = 2000000, .max = 4999999, .len = 2 },
+ .{ .min = 5000000, .max = 6499999, .len = 3 },
+ .{ .min = 6500000, .max = 6849999, .len = 0 },
+ .{ .min = 6850000, .max = 8199999, .len = 4 },
+ .{ .min = 8200000, .max = 8499999, .len = 0 },
+ .{ .min = 8500000, .max = 9499999, .len = 5 },
+ .{ .min = 9500000, .max = 9699999, .len = 0 },
+ .{ .min = 9700000, .max = 9999999, .len = 6 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "92",
+ .rules = &.{
+ .{ .min = 0, .max = 5999999, .len = 1 },
+ .{ .min = 6000000, .max = 7999999, .len = 2 },
+ .{ .min = 8000000, .max = 8999999, .len = 3 },
+ .{ .min = 9000000, .max = 9499999, .len = 4 },
+ .{ .min = 9500000, .max = 9899999, .len = 5 },
+ .{ .min = 9900000, .max = 9999999, .len = 6 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "93",
+ .rules = &.{
+ .{ .min = 0, .max = 899999, .len = 2 },
+ .{ .min = 900000, .max = 999999, .len = 4 },
+ .{ .min = 1000000, .max = 4699999, .len = 3 },
+ .{ .min = 4700000, .max = 4799999, .len = 5 },
+ .{ .min = 4800000, .max = 4999999, .len = 5 },
+ .{ .min = 5000000, .max = 7999999, .len = 4 },
+ .{ .min = 8000000, .max = 9599999, .len = 5 },
+ .{ .min = 9600000, .max = 9999999, .len = 6 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "94",
+ .rules = &.{
+ .{ .min = 0, .max = 5999999, .len = 3 },
+ .{ .min = 6000000, .max = 6387999, .len = 4 },
+ .{ .min = 6388000, .max = 6388099, .len = 6 },
+ .{ .min = 6388100, .max = 6388199, .len = 5 },
+ .{ .min = 6388200, .max = 6388399, .len = 6 },
+ .{ .min = 6388400, .max = 6388599, .len = 5 },
+ .{ .min = 6388600, .max = 6388699, .len = 6 },
+ .{ .min = 6388700, .max = 6388999, .len = 5 },
+ .{ .min = 6389000, .max = 6395999, .len = 4 },
+ .{ .min = 6396000, .max = 6396099, .len = 6 },
+ .{ .min = 6396100, .max = 6396299, .len = 5 },
+ .{ .min = 6396300, .max = 6396399, .len = 6 },
+ .{ .min = 6396400, .max = 6396499, .len = 5 },
+ .{ .min = 6396500, .max = 6396599, .len = 6 },
+ .{ .min = 6396600, .max = 6396999, .len = 5 },
+ .{ .min = 6397000, .max = 6399999, .len = 4 },
+ .{ .min = 6400000, .max = 6400099, .len = 6 },
+ .{ .min = 6400100, .max = 6400499, .len = 5 },
+ .{ .min = 6400500, .max = 6400599, .len = 6 },
+ .{ .min = 6400600, .max = 6400699, .len = 5 },
+ .{ .min = 6400700, .max = 6400899, .len = 6 },
+ .{ .min = 6400900, .max = 6400999, .len = 5 },
+ .{ .min = 6401000, .max = 6406999, .len = 4 },
+ .{ .min = 6407000, .max = 6407399, .len = 6 },
+ .{ .min = 6407400, .max = 6407499, .len = 5 },
+ .{ .min = 6407500, .max = 6407599, .len = 6 },
+ .{ .min = 6407600, .max = 6407799, .len = 5 },
+ .{ .min = 6407800, .max = 6407999, .len = 6 },
+ .{ .min = 6408000, .max = 6419999, .len = 4 },
+ .{ .min = 6420000, .max = 6420199, .len = 5 },
+ .{ .min = 6420200, .max = 6420299, .len = 6 },
+ .{ .min = 6420300, .max = 6420399, .len = 5 },
+ .{ .min = 6420400, .max = 6420499, .len = 6 },
+ .{ .min = 6420500, .max = 6420699, .len = 5 },
+ .{ .min = 6420700, .max = 6420799, .len = 6 },
+ .{ .min = 6420800, .max = 6420899, .len = 5 },
+ .{ .min = 6420900, .max = 6420999, .len = 6 },
+ .{ .min = 6421000, .max = 6432999, .len = 4 },
+ .{ .min = 6433000, .max = 6433199, .len = 5 },
+ .{ .min = 6433200, .max = 6433299, .len = 6 },
+ .{ .min = 6433300, .max = 6433399, .len = 5 },
+ .{ .min = 6433400, .max = 6433599, .len = 6 },
+ .{ .min = 6433600, .max = 6433699, .len = 5 },
+ .{ .min = 6433700, .max = 6433799, .len = 6 },
+ .{ .min = 6433800, .max = 6433999, .len = 5 },
+ .{ .min = 6434000, .max = 6435999, .len = 4 },
+ .{ .min = 6436000, .max = 6436099, .len = 6 },
+ .{ .min = 6436100, .max = 6436399, .len = 5 },
+ .{ .min = 6436400, .max = 6436599, .len = 6 },
+ .{ .min = 6436600, .max = 6436699, .len = 5 },
+ .{ .min = 6436700, .max = 6436799, .len = 6 },
+ .{ .min = 6436800, .max = 6436999, .len = 5 },
+ .{ .min = 6437000, .max = 6443999, .len = 4 },
+ .{ .min = 6444000, .max = 6444099, .len = 6 },
+ .{ .min = 6444100, .max = 6444199, .len = 5 },
+ .{ .min = 6444200, .max = 6444299, .len = 6 },
+ .{ .min = 6444300, .max = 6444399, .len = 5 },
+ .{ .min = 6444400, .max = 6444499, .len = 6 },
+ .{ .min = 6444500, .max = 6444699, .len = 5 },
+ .{ .min = 6444700, .max = 6444899, .len = 6 },
+ .{ .min = 6444900, .max = 6444999, .len = 5 },
+ .{ .min = 6445000, .max = 6450999, .len = 4 },
+ .{ .min = 6451000, .max = 6451299, .len = 5 },
+ .{ .min = 6451300, .max = 6451399, .len = 6 },
+ .{ .min = 6451400, .max = 6451599, .len = 5 },
+ .{ .min = 6451600, .max = 6451999, .len = 6 },
+ .{ .min = 6452000, .max = 6458999, .len = 4 },
+ .{ .min = 6459000, .max = 6459099, .len = 6 },
+ .{ .min = 6459100, .max = 6459299, .len = 5 },
+ .{ .min = 6459300, .max = 6459499, .len = 6 },
+ .{ .min = 6459500, .max = 6459699, .len = 5 },
+ .{ .min = 6459700, .max = 6459899, .len = 6 },
+ .{ .min = 6459900, .max = 6459999, .len = 5 },
+ .{ .min = 6460000, .max = 6465999, .len = 4 },
+ .{ .min = 6466000, .max = 6466099, .len = 6 },
+ .{ .min = 6466100, .max = 6466299, .len = 5 },
+ .{ .min = 6466300, .max = 6466599, .len = 6 },
+ .{ .min = 6466600, .max = 6466699, .len = 5 },
+ .{ .min = 6466700, .max = 6466899, .len = 6 },
+ .{ .min = 6466900, .max = 6466999, .len = 5 },
+ .{ .min = 6467000, .max = 6474999, .len = 4 },
+ .{ .min = 6475000, .max = 6475199, .len = 5 },
+ .{ .min = 6475200, .max = 6475399, .len = 6 },
+ .{ .min = 6475400, .max = 6475499, .len = 5 },
+ .{ .min = 6475500, .max = 6475599, .len = 6 },
+ .{ .min = 6475600, .max = 6475799, .len = 5 },
+ .{ .min = 6475800, .max = 6475899, .len = 6 },
+ .{ .min = 6475900, .max = 6475999, .len = 5 },
+ .{ .min = 6476000, .max = 6476999, .len = 4 },
+ .{ .min = 6477000, .max = 6477089, .len = 6 },
+ .{ .min = 6477090, .max = 6477099, .len = 0 },
+ .{ .min = 6477100, .max = 6477199, .len = 5 },
+ .{ .min = 6477200, .max = 6477229, .len = 0 },
+ .{ .min = 6477230, .max = 6477299, .len = 6 },
+ .{ .min = 6477300, .max = 6477399, .len = 5 },
+ .{ .min = 6477400, .max = 6477699, .len = 6 },
+ .{ .min = 6477700, .max = 6477999, .len = 5 },
+ .{ .min = 6478000, .max = 6478099, .len = 6 },
+ .{ .min = 6478100, .max = 6478199, .len = 5 },
+ .{ .min = 6478200, .max = 6478299, .len = 6 },
+ .{ .min = 6478300, .max = 6478699, .len = 5 },
+ .{ .min = 6478700, .max = 6478799, .len = 6 },
+ .{ .min = 6478800, .max = 6478999, .len = 5 },
+ .{ .min = 6479000, .max = 6493999, .len = 4 },
+ .{ .min = 6494000, .max = 6494099, .len = 6 },
+ .{ .min = 6494100, .max = 6494299, .len = 5 },
+ .{ .min = 6494300, .max = 6494499, .len = 6 },
+ .{ .min = 6494500, .max = 6494699, .len = 5 },
+ .{ .min = 6494700, .max = 6494799, .len = 6 },
+ .{ .min = 6494800, .max = 6494899, .len = 5 },
+ .{ .min = 6494900, .max = 6494999, .len = 6 },
+ .{ .min = 6495000, .max = 6497999, .len = 4 },
+ .{ .min = 6498000, .max = 6498099, .len = 5 },
+ .{ .min = 6498100, .max = 6498299, .len = 6 },
+ .{ .min = 6498300, .max = 6498499, .len = 5 },
+ .{ .min = 6498500, .max = 6498699, .len = 6 },
+ .{ .min = 6498700, .max = 6498799, .len = 5 },
+ .{ .min = 6498800, .max = 6498999, .len = 6 },
+ .{ .min = 6499000, .max = 8999999, .len = 4 },
+ .{ .min = 9000000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "950",
+ .rules = &.{
+ .{ .min = 0, .max = 4999999, .len = 2 },
+ .{ .min = 5000000, .max = 8999999, .len = 3 },
+ .{ .min = 9000000, .max = 9899999, .len = 4 },
+ .{ .min = 9900000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "951",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 1 },
+ .{ .min = 2000000, .max = 5499999, .len = 2 },
+ .{ .min = 5500000, .max = 8899999, .len = 3 },
+ .{ .min = 8900000, .max = 9499999, .len = 4 },
+ .{ .min = 9500000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "952",
+ .rules = &.{
+ .{ .min = 0, .max = 1799999, .len = 2 },
+ .{ .min = 1800000, .max = 1899999, .len = 3 },
+ .{ .min = 1900000, .max = 1949999, .len = 0 },
+ .{ .min = 1950000, .max = 1999999, .len = 5 },
+ .{ .min = 2000000, .max = 4999999, .len = 3 },
+ .{ .min = 5000000, .max = 5999999, .len = 4 },
+ .{ .min = 6000000, .max = 6499999, .len = 2 },
+ .{ .min = 6500000, .max = 6599999, .len = 5 },
+ .{ .min = 6600000, .max = 6699999, .len = 4 },
+ .{ .min = 6700000, .max = 6999999, .len = 5 },
+ .{ .min = 7000000, .max = 7999999, .len = 4 },
+ .{ .min = 8000000, .max = 9499999, .len = 2 },
+ .{ .min = 9500000, .max = 9899999, .len = 4 },
+ .{ .min = 9900000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "953",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 1 },
+ .{ .min = 1000000, .max = 1499999, .len = 2 },
+ .{ .min = 1500000, .max = 4599999, .len = 3 },
+ .{ .min = 4600000, .max = 4999999, .len = 5 },
+ .{ .min = 5000000, .max = 5009999, .len = 3 },
+ .{ .min = 5010000, .max = 5099999, .len = 5 },
+ .{ .min = 5100000, .max = 5499999, .len = 2 },
+ .{ .min = 5500000, .max = 5999999, .len = 5 },
+ .{ .min = 6000000, .max = 9499999, .len = 4 },
+ .{ .min = 9500000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "954",
+ .rules = &.{
+ .{ .min = 0, .max = 2899999, .len = 2 },
+ .{ .min = 2900000, .max = 2999999, .len = 4 },
+ .{ .min = 3000000, .max = 7999999, .len = 3 },
+ .{ .min = 8000000, .max = 8999999, .len = 4 },
+ .{ .min = 9000000, .max = 9299999, .len = 5 },
+ .{ .min = 9300000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "955",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 4 },
+ .{ .min = 2000000, .max = 3399999, .len = 2 },
+ .{ .min = 3400000, .max = 3549999, .len = 4 },
+ .{ .min = 3550000, .max = 3599999, .len = 5 },
+ .{ .min = 3600000, .max = 3799999, .len = 4 },
+ .{ .min = 3800000, .max = 3899999, .len = 5 },
+ .{ .min = 3900000, .max = 4099999, .len = 4 },
+ .{ .min = 4100000, .max = 4499999, .len = 5 },
+ .{ .min = 4500000, .max = 4999999, .len = 4 },
+ .{ .min = 5000000, .max = 5499999, .len = 5 },
+ .{ .min = 5500000, .max = 7109999, .len = 3 },
+ .{ .min = 7110000, .max = 7149999, .len = 5 },
+ .{ .min = 7150000, .max = 9499999, .len = 4 },
+ .{ .min = 9500000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "956",
+ .rules = &.{
+ .{ .min = 0, .max = 799999, .len = 2 },
+ .{ .min = 800000, .max = 999999, .len = 5 },
+ .{ .min = 1000000, .max = 1999999, .len = 2 },
+ .{ .min = 2000000, .max = 5999999, .len = 3 },
+ .{ .min = 6000000, .max = 6999999, .len = 4 },
+ .{ .min = 7000000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "957",
+ .rules = &.{
+ .{ .min = 0, .max = 299999, .len = 2 },
+ .{ .min = 300000, .max = 499999, .len = 4 },
+ .{ .min = 500000, .max = 1999999, .len = 2 },
+ .{ .min = 2000000, .max = 2099999, .len = 4 },
+ .{ .min = 2100000, .max = 2799999, .len = 2 },
+ .{ .min = 2800000, .max = 3099999, .len = 5 },
+ .{ .min = 3100000, .max = 4399999, .len = 2 },
+ .{ .min = 4400000, .max = 8199999, .len = 3 },
+ .{ .min = 8200000, .max = 9699999, .len = 4 },
+ .{ .min = 9700000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "958",
+ .rules = &.{
+ .{ .min = 0, .max = 4999999, .len = 2 },
+ .{ .min = 5000000, .max = 5099999, .len = 3 },
+ .{ .min = 5100000, .max = 5199999, .len = 4 },
+ .{ .min = 5200000, .max = 5399999, .len = 5 },
+ .{ .min = 5400000, .max = 5599999, .len = 4 },
+ .{ .min = 5600000, .max = 5999999, .len = 5 },
+ .{ .min = 6000000, .max = 7999999, .len = 3 },
+ .{ .min = 8000000, .max = 9499999, .len = 4 },
+ .{ .min = 9500000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "959",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 2 },
+ .{ .min = 2000000, .max = 6999999, .len = 3 },
+ .{ .min = 7000000, .max = 8499999, .len = 4 },
+ .{ .min = 8500000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "960",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 2 },
+ .{ .min = 2000000, .max = 6599999, .len = 3 },
+ .{ .min = 6600000, .max = 6899999, .len = 4 },
+ .{ .min = 6900000, .max = 6999999, .len = 3 },
+ .{ .min = 7000000, .max = 8499999, .len = 4 },
+ .{ .min = 8500000, .max = 9299999, .len = 5 },
+ .{ .min = 9300000, .max = 9399999, .len = 2 },
+ .{ .min = 9400000, .max = 9799999, .len = 4 },
+ .{ .min = 9800000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "961",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 2 },
+ .{ .min = 2000000, .max = 5999999, .len = 3 },
+ .{ .min = 6000000, .max = 8999999, .len = 4 },
+ .{ .min = 9000000, .max = 9799999, .len = 5 },
+ .{ .min = 9800000, .max = 9999999, .len = 0 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "962",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 2 },
+ .{ .min = 2000000, .max = 6999999, .len = 3 },
+ .{ .min = 7000000, .max = 8499999, .len = 4 },
+ .{ .min = 8500000, .max = 8699999, .len = 5 },
+ .{ .min = 8700000, .max = 8999999, .len = 4 },
+ .{ .min = 9000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "963",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 2 },
+ .{ .min = 2000000, .max = 6999999, .len = 3 },
+ .{ .min = 7000000, .max = 8499999, .len = 4 },
+ .{ .min = 8500000, .max = 8999999, .len = 5 },
+ .{ .min = 9000000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "964",
+ .rules = &.{
+ .{ .min = 0, .max = 1499999, .len = 2 },
+ .{ .min = 1500000, .max = 2499999, .len = 3 },
+ .{ .min = 2500000, .max = 2999999, .len = 4 },
+ .{ .min = 3000000, .max = 5499999, .len = 3 },
+ .{ .min = 5500000, .max = 8999999, .len = 4 },
+ .{ .min = 9000000, .max = 9699999, .len = 5 },
+ .{ .min = 9700000, .max = 9899999, .len = 3 },
+ .{ .min = 9900000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "965",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 2 },
+ .{ .min = 2000000, .max = 5999999, .len = 3 },
+ .{ .min = 6000000, .max = 6999999, .len = 0 },
+ .{ .min = 7000000, .max = 7999999, .len = 4 },
+ .{ .min = 8000000, .max = 8999999, .len = 0 },
+ .{ .min = 9000000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "966",
+ .rules = &.{
+ .{ .min = 0, .max = 1299999, .len = 2 },
+ .{ .min = 1300000, .max = 1399999, .len = 3 },
+ .{ .min = 1400000, .max = 1499999, .len = 2 },
+ .{ .min = 1500000, .max = 1699999, .len = 4 },
+ .{ .min = 1700000, .max = 1999999, .len = 3 },
+ .{ .min = 2000000, .max = 2789999, .len = 4 },
+ .{ .min = 2790000, .max = 2899999, .len = 3 },
+ .{ .min = 2900000, .max = 2999999, .len = 4 },
+ .{ .min = 3000000, .max = 6999999, .len = 3 },
+ .{ .min = 7000000, .max = 8999999, .len = 4 },
+ .{ .min = 9000000, .max = 9099999, .len = 5 },
+ .{ .min = 9100000, .max = 9499999, .len = 3 },
+ .{ .min = 9500000, .max = 9799999, .len = 5 },
+ .{ .min = 9800000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "967",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 4 },
+ .{ .min = 1000000, .max = 1999999, .len = 5 },
+ .{ .min = 2000000, .max = 2499999, .len = 4 },
+ .{ .min = 2500000, .max = 2549999, .len = 3 },
+ .{ .min = 2550000, .max = 2699999, .len = 5 },
+ .{ .min = 2700000, .max = 2799999, .len = 4 },
+ .{ .min = 2800000, .max = 2999999, .len = 4 },
+ .{ .min = 3000000, .max = 4999999, .len = 3 },
+ .{ .min = 5000000, .max = 5999999, .len = 4 },
+ .{ .min = 6000000, .max = 8999999, .len = 2 },
+ .{ .min = 9000000, .max = 9899999, .len = 3 },
+ .{ .min = 9900000, .max = 9989999, .len = 4 },
+ .{ .min = 9990000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "968",
+ .rules = &.{
+ .{ .min = 100000, .max = 3999999, .len = 2 },
+ .{ .min = 4000000, .max = 4999999, .len = 3 },
+ .{ .min = 5000000, .max = 7999999, .len = 4 },
+ .{ .min = 8000000, .max = 8999999, .len = 3 },
+ .{ .min = 9000000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "969",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 1 },
+ .{ .min = 2000000, .max = 2099999, .len = 2 },
+ .{ .min = 2100000, .max = 2199999, .len = 3 },
+ .{ .min = 2200000, .max = 2299999, .len = 4 },
+ .{ .min = 2300000, .max = 2399999, .len = 5 },
+ .{ .min = 2400000, .max = 3999999, .len = 2 },
+ .{ .min = 4000000, .max = 7499999, .len = 3 },
+ .{ .min = 7500000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "970",
+ .rules = &.{
+ .{ .min = 100000, .max = 5999999, .len = 2 },
+ .{ .min = 6000000, .max = 8999999, .len = 3 },
+ .{ .min = 9000000, .max = 9099999, .len = 4 },
+ .{ .min = 9100000, .max = 9699999, .len = 5 },
+ .{ .min = 9700000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "971",
+ .rules = &.{
+ .{ .min = 0, .max = 159999, .len = 3 },
+ .{ .min = 160000, .max = 199999, .len = 4 },
+ .{ .min = 200000, .max = 299999, .len = 2 },
+ .{ .min = 300000, .max = 599999, .len = 4 },
+ .{ .min = 600000, .max = 4999999, .len = 2 },
+ .{ .min = 5000000, .max = 8499999, .len = 3 },
+ .{ .min = 8500000, .max = 9099999, .len = 4 },
+ .{ .min = 9100000, .max = 9599999, .len = 5 },
+ .{ .min = 9600000, .max = 9699999, .len = 4 },
+ .{ .min = 9700000, .max = 9899999, .len = 2 },
+ .{ .min = 9900000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "972",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 1 },
+ .{ .min = 2000000, .max = 5499999, .len = 2 },
+ .{ .min = 5500000, .max = 7999999, .len = 3 },
+ .{ .min = 8000000, .max = 9499999, .len = 4 },
+ .{ .min = 9500000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "973",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 1 },
+ .{ .min = 1000000, .max = 1699999, .len = 3 },
+ .{ .min = 1700000, .max = 1999999, .len = 4 },
+ .{ .min = 2000000, .max = 5499999, .len = 2 },
+ .{ .min = 5500000, .max = 7599999, .len = 3 },
+ .{ .min = 7600000, .max = 8499999, .len = 4 },
+ .{ .min = 8500000, .max = 8899999, .len = 5 },
+ .{ .min = 8900000, .max = 9499999, .len = 4 },
+ .{ .min = 9500000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "974",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 2 },
+ .{ .min = 2000000, .max = 6999999, .len = 3 },
+ .{ .min = 7000000, .max = 8499999, .len = 4 },
+ .{ .min = 8500000, .max = 8999999, .len = 5 },
+ .{ .min = 9000000, .max = 9499999, .len = 5 },
+ .{ .min = 9500000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "975",
+ .rules = &.{
+ .{ .min = 0, .max = 199999, .len = 5 },
+ .{ .min = 200000, .max = 2399999, .len = 2 },
+ .{ .min = 2400000, .max = 2499999, .len = 4 },
+ .{ .min = 2500000, .max = 5999999, .len = 3 },
+ .{ .min = 6000000, .max = 9199999, .len = 4 },
+ .{ .min = 9200000, .max = 9899999, .len = 5 },
+ .{ .min = 9900000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "976",
+ .rules = &.{
+ .{ .min = 0, .max = 3999999, .len = 1 },
+ .{ .min = 4000000, .max = 5999999, .len = 2 },
+ .{ .min = 6000000, .max = 7999999, .len = 3 },
+ .{ .min = 8000000, .max = 9499999, .len = 4 },
+ .{ .min = 9500000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "977",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 2 },
+ .{ .min = 2000000, .max = 4999999, .len = 3 },
+ .{ .min = 5000000, .max = 6999999, .len = 4 },
+ .{ .min = 7000000, .max = 8499999, .len = 3 },
+ .{ .min = 8500000, .max = 8739999, .len = 5 },
+ .{ .min = 8740000, .max = 8899999, .len = 4 },
+ .{ .min = 8900000, .max = 8949999, .len = 3 },
+ .{ .min = 8950000, .max = 8999999, .len = 4 },
+ .{ .min = 9000000, .max = 9599999, .len = 2 },
+ .{ .min = 9600000, .max = 9699999, .len = 4 },
+ .{ .min = 9700000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "978",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 3 },
+ .{ .min = 2000000, .max = 2999999, .len = 4 },
+ .{ .min = 3000000, .max = 6699999, .len = 5 },
+ .{ .min = 6700000, .max = 6899999, .len = 2 },
+ .{ .min = 6900000, .max = 6999999, .len = 3 },
+ .{ .min = 7000000, .max = 7649999, .len = 0 },
+ .{ .min = 7650000, .max = 7999999, .len = 3 },
+ .{ .min = 8000000, .max = 8999999, .len = 4 },
+ .{ .min = 9000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "979",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 3 },
+ .{ .min = 1000000, .max = 1499999, .len = 4 },
+ .{ .min = 1500000, .max = 1999999, .len = 5 },
+ .{ .min = 2000000, .max = 2999999, .len = 2 },
+ .{ .min = 3000000, .max = 3999999, .len = 4 },
+ .{ .min = 4000000, .max = 7999999, .len = 3 },
+ .{ .min = 8000000, .max = 9499999, .len = 4 },
+ .{ .min = 9500000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "980",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 2 },
+ .{ .min = 2000000, .max = 5999999, .len = 3 },
+ .{ .min = 6000000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "981",
+ .rules = &.{
+ .{ .min = 0, .max = 1699999, .len = 2 },
+ .{ .min = 1700000, .max = 1799999, .len = 5 },
+ .{ .min = 1800000, .max = 1999999, .len = 2 },
+ .{ .min = 2000000, .max = 2999999, .len = 3 },
+ .{ .min = 3000000, .max = 3099999, .len = 4 },
+ .{ .min = 3100000, .max = 3999999, .len = 3 },
+ .{ .min = 4000000, .max = 5999999, .len = 4 },
+ .{ .min = 6000000, .max = 9199999, .len = 0 },
+ .{ .min = 9200000, .max = 9999999, .len = 2 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "982",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 2 },
+ .{ .min = 1000000, .max = 6999999, .len = 3 },
+ .{ .min = 7000000, .max = 8999999, .len = 2 },
+ .{ .min = 9000000, .max = 9799999, .len = 4 },
+ .{ .min = 9800000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "983",
+ .rules = &.{
+ .{ .min = 0, .max = 199999, .len = 2 },
+ .{ .min = 200000, .max = 1999999, .len = 3 },
+ .{ .min = 2000000, .max = 3999999, .len = 4 },
+ .{ .min = 4000000, .max = 4499999, .len = 5 },
+ .{ .min = 4500000, .max = 4999999, .len = 2 },
+ .{ .min = 5000000, .max = 7999999, .len = 2 },
+ .{ .min = 8000000, .max = 8999999, .len = 3 },
+ .{ .min = 9000000, .max = 9899999, .len = 4 },
+ .{ .min = 9900000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "984",
+ .rules = &.{
+ .{ .min = 0, .max = 2199999, .len = 2 },
+ .{ .min = 2200000, .max = 2249999, .len = 3 },
+ .{ .min = 2250000, .max = 2599999, .len = 4 },
+ .{ .min = 2600000, .max = 2899999, .len = 2 },
+ .{ .min = 2900000, .max = 2999999, .len = 5 },
+ .{ .min = 3000000, .max = 3899999, .len = 2 },
+ .{ .min = 3900000, .max = 3999999, .len = 4 },
+ .{ .min = 4000000, .max = 7999999, .len = 3 },
+ .{ .min = 8000000, .max = 8999999, .len = 4 },
+ .{ .min = 9000000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "985",
+ .rules = &.{
+ .{ .min = 0, .max = 3999999, .len = 2 },
+ .{ .min = 4000000, .max = 5999999, .len = 3 },
+ .{ .min = 6000000, .max = 8799999, .len = 4 },
+ .{ .min = 8800000, .max = 8999999, .len = 3 },
+ .{ .min = 9000000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "986",
+ .rules = &.{
+ .{ .min = 0, .max = 599999, .len = 2 },
+ .{ .min = 600000, .max = 699999, .len = 5 },
+ .{ .min = 700000, .max = 799999, .len = 4 },
+ .{ .min = 800000, .max = 1199999, .len = 2 },
+ .{ .min = 1200000, .max = 5399999, .len = 3 },
+ .{ .min = 5400000, .max = 7999999, .len = 4 },
+ .{ .min = 8000000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "987",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 2 },
+ .{ .min = 1000000, .max = 1999999, .len = 4 },
+ .{ .min = 2000000, .max = 2999999, .len = 5 },
+ .{ .min = 3000000, .max = 3599999, .len = 2 },
+ .{ .min = 3600000, .max = 4199999, .len = 4 },
+ .{ .min = 4200000, .max = 4399999, .len = 2 },
+ .{ .min = 4400000, .max = 4499999, .len = 4 },
+ .{ .min = 4500000, .max = 4899999, .len = 5 },
+ .{ .min = 4900000, .max = 4999999, .len = 4 },
+ .{ .min = 5000000, .max = 8249999, .len = 3 },
+ .{ .min = 8250000, .max = 8279999, .len = 4 },
+ .{ .min = 8280000, .max = 8299999, .len = 5 },
+ .{ .min = 8300000, .max = 8499999, .len = 4 },
+ .{ .min = 8500000, .max = 8899999, .len = 2 },
+ .{ .min = 8900000, .max = 9499999, .len = 4 },
+ .{ .min = 9500000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "988",
+ .rules = &.{
+ .{ .min = 0, .max = 1199999, .len = 2 },
+ .{ .min = 1200000, .max = 1999999, .len = 5 },
+ .{ .min = 2000000, .max = 6999999, .len = 3 },
+ .{ .min = 7000000, .max = 7999999, .len = 5 },
+ .{ .min = 8000000, .max = 9699999, .len = 4 },
+ .{ .min = 9700000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "989",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 1 },
+ .{ .min = 1000000, .max = 1999999, .len = 0 },
+ .{ .min = 2000000, .max = 3499999, .len = 2 },
+ .{ .min = 3500000, .max = 3699999, .len = 5 },
+ .{ .min = 3700000, .max = 4899999, .len = 2 },
+ .{ .min = 4900000, .max = 4999999, .len = 5 },
+ .{ .min = 5000000, .max = 5299999, .len = 2 },
+ .{ .min = 5300000, .max = 5499999, .len = 5 },
+ .{ .min = 5500000, .max = 7999999, .len = 3 },
+ .{ .min = 8000000, .max = 9499999, .len = 4 },
+ .{ .min = 9500000, .max = 9999999, .len = 5 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9905",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 1 },
+ .{ .min = 1000000, .max = 1999999, .len = 0 },
+ .{ .min = 2000000, .max = 2399999, .len = 2 },
+ .{ .min = 2400000, .max = 5999999, .len = 0 },
+ .{ .min = 6000000, .max = 6249999, .len = 3 },
+ .{ .min = 6250000, .max = 9899999, .len = 0 },
+ .{ .min = 9900000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9906",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 0 },
+ .{ .min = 2000000, .max = 2299999, .len = 2 },
+ .{ .min = 2300000, .max = 6999999, .len = 0 },
+ .{ .min = 7000000, .max = 7249999, .len = 3 },
+ .{ .min = 7250000, .max = 9899999, .len = 0 },
+ .{ .min = 9900000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9907",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 1 },
+ .{ .min = 1000000, .max = 4999999, .len = 0 },
+ .{ .min = 5000000, .max = 6499999, .len = 2 },
+ .{ .min = 6500000, .max = 7999999, .len = 0 },
+ .{ .min = 8000000, .max = 8749999, .len = 3 },
+ .{ .min = 8750000, .max = 9499999, .len = 0 },
+ .{ .min = 9500000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9908",
+ .rules = &.{
+ .{ .min = 0, .max = 3999999, .len = 1 },
+ .{ .min = 4000000, .max = 6999999, .len = 2 },
+ .{ .min = 7000000, .max = 8249999, .len = 0 },
+ .{ .min = 8250000, .max = 8999999, .len = 3 },
+ .{ .min = 9000000, .max = 9699999, .len = 0 },
+ .{ .min = 9700000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9909",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 2 },
+ .{ .min = 2000000, .max = 7499999, .len = 0 },
+ .{ .min = 7500000, .max = 8499999, .len = 3 },
+ .{ .min = 8500000, .max = 9799999, .len = 0 },
+ .{ .min = 9800000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9910",
+ .rules = &.{
+ .{ .min = 0, .max = 99999, .len = 0 },
+ .{ .min = 100000, .max = 1899999, .len = 2 },
+ .{ .min = 1900000, .max = 2249999, .len = 0 },
+ .{ .min = 2250000, .max = 3749999, .len = 3 },
+ .{ .min = 3750000, .max = 4499999, .len = 0 },
+ .{ .min = 4500000, .max = 5499999, .len = 4 },
+ .{ .min = 5500000, .max = 7999999, .len = 3 },
+ .{ .min = 8000000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9911",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 0 },
+ .{ .min = 2000000, .max = 2499999, .len = 2 },
+ .{ .min = 2500000, .max = 5499999, .len = 0 },
+ .{ .min = 5500000, .max = 7499999, .len = 3 },
+ .{ .min = 7500000, .max = 9499999, .len = 0 },
+ .{ .min = 9500000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9912",
+ .rules = &.{
+ .{ .min = 0, .max = 3999999, .len = 0 },
+ .{ .min = 4000000, .max = 4499999, .len = 2 },
+ .{ .min = 4500000, .max = 7499999, .len = 0 },
+ .{ .min = 7500000, .max = 7999999, .len = 3 },
+ .{ .min = 8000000, .max = 9799999, .len = 0 },
+ .{ .min = 9800000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9913",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 2 },
+ .{ .min = 1000000, .max = 5999999, .len = 0 },
+ .{ .min = 6000000, .max = 7099999, .len = 3 },
+ .{ .min = 7100000, .max = 9499999, .len = 0 },
+ .{ .min = 9500000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9914",
+ .rules = &.{
+ .{ .min = 0, .max = 2699999, .len = 0 },
+ .{ .min = 2700000, .max = 5599999, .len = 2 },
+ .{ .min = 5600000, .max = 6999999, .len = 0 },
+ .{ .min = 7000000, .max = 7999999, .len = 3 },
+ .{ .min = 8000000, .max = 9199999, .len = 0 },
+ .{ .min = 9200000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9915",
+ .rules = &.{
+ .{ .min = 0, .max = 3999999, .len = 0 },
+ .{ .min = 4000000, .max = 5999999, .len = 2 },
+ .{ .min = 6000000, .max = 6499999, .len = 0 },
+ .{ .min = 6500000, .max = 7999999, .len = 3 },
+ .{ .min = 8000000, .max = 9299999, .len = 0 },
+ .{ .min = 9300000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9916",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 1 },
+ .{ .min = 1000000, .max = 3999999, .len = 2 },
+ .{ .min = 4000000, .max = 5999999, .len = 1 },
+ .{ .min = 6000000, .max = 7899999, .len = 3 },
+ .{ .min = 7900000, .max = 9199999, .len = 2 },
+ .{ .min = 9200000, .max = 9399999, .len = 4 },
+ .{ .min = 9400000, .max = 9499999, .len = 2 },
+ .{ .min = 9500000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9917",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 1 },
+ .{ .min = 1000000, .max = 2999999, .len = 0 },
+ .{ .min = 3000000, .max = 3499999, .len = 2 },
+ .{ .min = 3500000, .max = 5999999, .len = 0 },
+ .{ .min = 6000000, .max = 6999999, .len = 3 },
+ .{ .min = 7000000, .max = 9624999, .len = 0 },
+ .{ .min = 9625000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9918",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 1 },
+ .{ .min = 1000000, .max = 1999999, .len = 0 },
+ .{ .min = 2000000, .max = 2999999, .len = 2 },
+ .{ .min = 3000000, .max = 5999999, .len = 0 },
+ .{ .min = 6000000, .max = 7999999, .len = 3 },
+ .{ .min = 8000000, .max = 9499999, .len = 0 },
+ .{ .min = 9500000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9919",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 1 },
+ .{ .min = 1000000, .max = 1999999, .len = 0 },
+ .{ .min = 2000000, .max = 2999999, .len = 2 },
+ .{ .min = 3000000, .max = 4999999, .len = 0 },
+ .{ .min = 5000000, .max = 5999999, .len = 3 },
+ .{ .min = 6000000, .max = 8999999, .len = 0 },
+ .{ .min = 9000000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9920",
+ .rules = &.{
+ .{ .min = 0, .max = 299999, .len = 2 },
+ .{ .min = 300000, .max = 1299999, .len = 0 },
+ .{ .min = 1300000, .max = 1999999, .len = 3 },
+ .{ .min = 2000000, .max = 2299999, .len = 3 },
+ .{ .min = 2300000, .max = 4299999, .len = 2 },
+ .{ .min = 4300000, .max = 7999999, .len = 3 },
+ .{ .min = 8000000, .max = 8299999, .len = 0 },
+ .{ .min = 8300000, .max = 8549999, .len = 4 },
+ .{ .min = 8550000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9921",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 1 },
+ .{ .min = 1000000, .max = 2999999, .len = 0 },
+ .{ .min = 3000000, .max = 3999999, .len = 2 },
+ .{ .min = 4000000, .max = 6999999, .len = 0 },
+ .{ .min = 7000000, .max = 8999999, .len = 3 },
+ .{ .min = 9000000, .max = 9699999, .len = 0 },
+ .{ .min = 9700000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9922",
+ .rules = &.{
+ .{ .min = 0, .max = 1499999, .len = 0 },
+ .{ .min = 1500000, .max = 2999999, .len = 2 },
+ .{ .min = 3000000, .max = 4999999, .len = 0 },
+ .{ .min = 5000000, .max = 5499999, .len = 3 },
+ .{ .min = 5500000, .max = 5999999, .len = 4 },
+ .{ .min = 6000000, .max = 7999999, .len = 3 },
+ .{ .min = 8000000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9923",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 1 },
+ .{ .min = 1000000, .max = 6999999, .len = 2 },
+ .{ .min = 7000000, .max = 8999999, .len = 3 },
+ .{ .min = 9000000, .max = 9399999, .len = 0 },
+ .{ .min = 9400000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9924",
+ .rules = &.{
+ .{ .min = 0, .max = 2799999, .len = 0 },
+ .{ .min = 2800000, .max = 3999999, .len = 2 },
+ .{ .min = 4000000, .max = 4999999, .len = 0 },
+ .{ .min = 5000000, .max = 6599999, .len = 3 },
+ .{ .min = 6600000, .max = 8949999, .len = 0 },
+ .{ .min = 8950000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9925",
+ .rules = &.{
+ .{ .min = 0, .max = 2999999, .len = 1 },
+ .{ .min = 3000000, .max = 5499999, .len = 2 },
+ .{ .min = 5500000, .max = 7349999, .len = 3 },
+ .{ .min = 7350000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9926",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 1 },
+ .{ .min = 2000000, .max = 3999999, .len = 2 },
+ .{ .min = 4000000, .max = 7999999, .len = 3 },
+ .{ .min = 8000000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9927",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 2 },
+ .{ .min = 1000000, .max = 3999999, .len = 3 },
+ .{ .min = 4000000, .max = 4999999, .len = 4 },
+ .{ .min = 5000000, .max = 9999999, .len = 0 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9928",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 2 },
+ .{ .min = 1000000, .max = 3999999, .len = 3 },
+ .{ .min = 4000000, .max = 4999999, .len = 4 },
+ .{ .min = 5000000, .max = 7999999, .len = 0 },
+ .{ .min = 8000000, .max = 8999999, .len = 3 },
+ .{ .min = 9000000, .max = 9999999, .len = 2 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9929",
+ .rules = &.{
+ .{ .min = 0, .max = 3999999, .len = 1 },
+ .{ .min = 4000000, .max = 5499999, .len = 2 },
+ .{ .min = 5500000, .max = 7999999, .len = 3 },
+ .{ .min = 8000000, .max = 9799999, .len = 4 },
+ .{ .min = 9800000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9930",
+ .rules = &.{
+ .{ .min = 0, .max = 4999999, .len = 2 },
+ .{ .min = 5000000, .max = 9399999, .len = 3 },
+ .{ .min = 9400000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9931",
+ .rules = &.{
+ .{ .min = 0, .max = 2399999, .len = 2 },
+ .{ .min = 2400000, .max = 8999999, .len = 3 },
+ .{ .min = 9000000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9932",
+ .rules = &.{
+ .{ .min = 0, .max = 3999999, .len = 2 },
+ .{ .min = 4000000, .max = 8499999, .len = 3 },
+ .{ .min = 8500000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9933",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 1 },
+ .{ .min = 1000000, .max = 3999999, .len = 2 },
+ .{ .min = 4000000, .max = 8699999, .len = 3 },
+ .{ .min = 8700000, .max = 8999999, .len = 2 },
+ .{ .min = 9000000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9934",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 1 },
+ .{ .min = 1000000, .max = 4999999, .len = 2 },
+ .{ .min = 5000000, .max = 7999999, .len = 3 },
+ .{ .min = 8000000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9935",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 1 },
+ .{ .min = 1000000, .max = 3999999, .len = 2 },
+ .{ .min = 4000000, .max = 8999999, .len = 3 },
+ .{ .min = 9000000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9936",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 1 },
+ .{ .min = 2000000, .max = 3999999, .len = 2 },
+ .{ .min = 4000000, .max = 7999999, .len = 3 },
+ .{ .min = 8000000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9937",
+ .rules = &.{
+ .{ .min = 0, .max = 2999999, .len = 1 },
+ .{ .min = 3000000, .max = 4999999, .len = 2 },
+ .{ .min = 5000000, .max = 7999999, .len = 3 },
+ .{ .min = 8000000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9938",
+ .rules = &.{
+ .{ .min = 0, .max = 7999999, .len = 2 },
+ .{ .min = 8000000, .max = 9499999, .len = 3 },
+ .{ .min = 9500000, .max = 9749999, .len = 4 },
+ .{ .min = 9750000, .max = 9909999, .len = 3 },
+ .{ .min = 9910000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9939",
+ .rules = &.{
+ .{ .min = 0, .max = 3999999, .len = 1 },
+ .{ .min = 4000000, .max = 4799999, .len = 2 },
+ .{ .min = 4800000, .max = 4999999, .len = 3 },
+ .{ .min = 5000000, .max = 7999999, .len = 2 },
+ .{ .min = 8000000, .max = 8999999, .len = 3 },
+ .{ .min = 9000000, .max = 9599999, .len = 4 },
+ .{ .min = 9600000, .max = 9799999, .len = 3 },
+ .{ .min = 9800000, .max = 9999999, .len = 2 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9940",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 1 },
+ .{ .min = 2000000, .max = 4999999, .len = 2 },
+ .{ .min = 5000000, .max = 8399999, .len = 3 },
+ .{ .min = 8400000, .max = 8699999, .len = 2 },
+ .{ .min = 8700000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9941",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 1 },
+ .{ .min = 1000000, .max = 3999999, .len = 2 },
+ .{ .min = 4000000, .max = 7899999, .len = 3 },
+ .{ .min = 7900000, .max = 7999999, .len = 4 },
+ .{ .min = 8000000, .max = 8999999, .len = 1 },
+ .{ .min = 9000000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9942",
+ .rules = &.{
+ .{ .min = 0, .max = 5599999, .len = 2 },
+ .{ .min = 5600000, .max = 6999999, .len = 3 },
+ .{ .min = 7000000, .max = 7499999, .len = 4 },
+ .{ .min = 7500000, .max = 8499999, .len = 3 },
+ .{ .min = 8500000, .max = 8999999, .len = 4 },
+ .{ .min = 9000000, .max = 9849999, .len = 3 },
+ .{ .min = 9850000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9943",
+ .rules = &.{
+ .{ .min = 0, .max = 2999999, .len = 2 },
+ .{ .min = 3000000, .max = 3999999, .len = 3 },
+ .{ .min = 4000000, .max = 9749999, .len = 4 },
+ .{ .min = 9750000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9944",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 4 },
+ .{ .min = 1000000, .max = 4999999, .len = 3 },
+ .{ .min = 5000000, .max = 5999999, .len = 4 },
+ .{ .min = 6000000, .max = 6999999, .len = 2 },
+ .{ .min = 7000000, .max = 7999999, .len = 3 },
+ .{ .min = 8000000, .max = 8999999, .len = 2 },
+ .{ .min = 9000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9945",
+ .rules = &.{
+ .{ .min = 0, .max = 99999, .len = 2 },
+ .{ .min = 100000, .max = 799999, .len = 3 },
+ .{ .min = 800000, .max = 3999999, .len = 2 },
+ .{ .min = 4000000, .max = 5699999, .len = 3 },
+ .{ .min = 5700000, .max = 5799999, .len = 2 },
+ .{ .min = 5800000, .max = 7999999, .len = 3 },
+ .{ .min = 8000000, .max = 8099999, .len = 2 },
+ .{ .min = 8100000, .max = 8499999, .len = 3 },
+ .{ .min = 8500000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9946",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 1 },
+ .{ .min = 2000000, .max = 3999999, .len = 2 },
+ .{ .min = 4000000, .max = 8999999, .len = 3 },
+ .{ .min = 9000000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9947",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 1 },
+ .{ .min = 2000000, .max = 7999999, .len = 2 },
+ .{ .min = 8000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9948",
+ .rules = &.{
+ .{ .min = 0, .max = 3999999, .len = 2 },
+ .{ .min = 4000000, .max = 5199999, .len = 3 },
+ .{ .min = 5200000, .max = 5399999, .len = 2 },
+ .{ .min = 5400000, .max = 6099999, .len = 3 },
+ .{ .min = 6100000, .max = 6199999, .len = 3 },
+ .{ .min = 6200000, .max = 8499999, .len = 3 },
+ .{ .min = 8500000, .max = 9949999, .len = 4 },
+ .{ .min = 9950000, .max = 9974999, .len = 4 },
+ .{ .min = 9975000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9949",
+ .rules = &.{
+ .{ .min = 0, .max = 899999, .len = 2 },
+ .{ .min = 900000, .max = 999999, .len = 3 },
+ .{ .min = 1000000, .max = 3999999, .len = 2 },
+ .{ .min = 4000000, .max = 6999999, .len = 3 },
+ .{ .min = 7000000, .max = 7199999, .len = 2 },
+ .{ .min = 7200000, .max = 7499999, .len = 4 },
+ .{ .min = 7500000, .max = 8999999, .len = 2 },
+ .{ .min = 9000000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9950",
+ .rules = &.{
+ .{ .min = 0, .max = 2999999, .len = 2 },
+ .{ .min = 3000000, .max = 8499999, .len = 3 },
+ .{ .min = 8500000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9951",
+ .rules = &.{
+ .{ .min = 0, .max = 3899999, .len = 2 },
+ .{ .min = 3900000, .max = 8499999, .len = 3 },
+ .{ .min = 8500000, .max = 9799999, .len = 4 },
+ .{ .min = 9800000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9952",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 1 },
+ .{ .min = 1000000, .max = 1499999, .len = 0 },
+ .{ .min = 1500000, .max = 3999999, .len = 2 },
+ .{ .min = 4000000, .max = 7999999, .len = 3 },
+ .{ .min = 8000000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9953",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 1 },
+ .{ .min = 1000000, .max = 3999999, .len = 2 },
+ .{ .min = 4000000, .max = 5999999, .len = 3 },
+ .{ .min = 6000000, .max = 8999999, .len = 2 },
+ .{ .min = 9000000, .max = 9299999, .len = 4 },
+ .{ .min = 9300000, .max = 9699999, .len = 2 },
+ .{ .min = 9700000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9954",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 1 },
+ .{ .min = 2000000, .max = 3999999, .len = 2 },
+ .{ .min = 4000000, .max = 7999999, .len = 3 },
+ .{ .min = 8000000, .max = 9899999, .len = 4 },
+ .{ .min = 9900000, .max = 9999999, .len = 2 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9955",
+ .rules = &.{
+ .{ .min = 0, .max = 3999999, .len = 2 },
+ .{ .min = 4000000, .max = 9299999, .len = 3 },
+ .{ .min = 9300000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9956",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 1 },
+ .{ .min = 1000000, .max = 3999999, .len = 2 },
+ .{ .min = 4000000, .max = 8999999, .len = 3 },
+ .{ .min = 9000000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9957",
+ .rules = &.{
+ .{ .min = 0, .max = 3999999, .len = 2 },
+ .{ .min = 4000000, .max = 6499999, .len = 3 },
+ .{ .min = 6500000, .max = 6799999, .len = 2 },
+ .{ .min = 6800000, .max = 6999999, .len = 3 },
+ .{ .min = 7000000, .max = 8499999, .len = 2 },
+ .{ .min = 8500000, .max = 8799999, .len = 4 },
+ .{ .min = 8800000, .max = 9999999, .len = 2 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9958",
+ .rules = &.{
+ .{ .min = 0, .max = 199999, .len = 2 },
+ .{ .min = 200000, .max = 299999, .len = 3 },
+ .{ .min = 300000, .max = 399999, .len = 4 },
+ .{ .min = 400000, .max = 899999, .len = 3 },
+ .{ .min = 900000, .max = 999999, .len = 4 },
+ .{ .min = 1000000, .max = 1899999, .len = 2 },
+ .{ .min = 1900000, .max = 1999999, .len = 4 },
+ .{ .min = 2000000, .max = 4999999, .len = 2 },
+ .{ .min = 5000000, .max = 8999999, .len = 3 },
+ .{ .min = 9000000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9959",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 1 },
+ .{ .min = 2000000, .max = 7999999, .len = 2 },
+ .{ .min = 8000000, .max = 9499999, .len = 3 },
+ .{ .min = 9500000, .max = 9699999, .len = 4 },
+ .{ .min = 9700000, .max = 9799999, .len = 3 },
+ .{ .min = 9800000, .max = 9999999, .len = 2 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9960",
+ .rules = &.{
+ .{ .min = 0, .max = 5999999, .len = 2 },
+ .{ .min = 6000000, .max = 8999999, .len = 3 },
+ .{ .min = 9000000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9961",
+ .rules = &.{
+ .{ .min = 0, .max = 2999999, .len = 1 },
+ .{ .min = 3000000, .max = 6999999, .len = 2 },
+ .{ .min = 7000000, .max = 9499999, .len = 3 },
+ .{ .min = 9500000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9962",
+ .rules = &.{
+ .{ .min = 0, .max = 5499999, .len = 2 },
+ .{ .min = 5500000, .max = 5599999, .len = 4 },
+ .{ .min = 5600000, .max = 5999999, .len = 2 },
+ .{ .min = 6000000, .max = 8499999, .len = 3 },
+ .{ .min = 8500000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9963",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 1 },
+ .{ .min = 2000000, .max = 2499999, .len = 4 },
+ .{ .min = 2500000, .max = 2799999, .len = 3 },
+ .{ .min = 2800000, .max = 2999999, .len = 4 },
+ .{ .min = 3000000, .max = 5499999, .len = 2 },
+ .{ .min = 5500000, .max = 7349999, .len = 3 },
+ .{ .min = 7350000, .max = 7499999, .len = 4 },
+ .{ .min = 7500000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9964",
+ .rules = &.{
+ .{ .min = 0, .max = 6999999, .len = 1 },
+ .{ .min = 7000000, .max = 9499999, .len = 2 },
+ .{ .min = 9500000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9965",
+ .rules = &.{
+ .{ .min = 0, .max = 3999999, .len = 2 },
+ .{ .min = 4000000, .max = 8999999, .len = 3 },
+ .{ .min = 9000000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9966",
+ .rules = &.{
+ .{ .min = 0, .max = 1399999, .len = 3 },
+ .{ .min = 1400000, .max = 1499999, .len = 2 },
+ .{ .min = 1500000, .max = 1999999, .len = 4 },
+ .{ .min = 2000000, .max = 6999999, .len = 2 },
+ .{ .min = 7000000, .max = 7499999, .len = 4 },
+ .{ .min = 7500000, .max = 8209999, .len = 3 },
+ .{ .min = 8210000, .max = 8249999, .len = 4 },
+ .{ .min = 8250000, .max = 8259999, .len = 3 },
+ .{ .min = 8260000, .max = 8289999, .len = 4 },
+ .{ .min = 8290000, .max = 9599999, .len = 3 },
+ .{ .min = 9600000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9967",
+ .rules = &.{
+ .{ .min = 0, .max = 3999999, .len = 2 },
+ .{ .min = 4000000, .max = 8999999, .len = 3 },
+ .{ .min = 9000000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9968",
+ .rules = &.{
+ .{ .min = 0, .max = 4999999, .len = 2 },
+ .{ .min = 5000000, .max = 9399999, .len = 3 },
+ .{ .min = 9400000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9969",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 2 },
+ .{ .min = 2000000, .max = 4999999, .len = 0 },
+ .{ .min = 5000000, .max = 7499999, .len = 3 },
+ .{ .min = 7500000, .max = 9299999, .len = 0 },
+ .{ .min = 9300000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9970",
+ .rules = &.{
+ .{ .min = 0, .max = 3999999, .len = 2 },
+ .{ .min = 4000000, .max = 8999999, .len = 3 },
+ .{ .min = 9000000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9971",
+ .rules = &.{
+ .{ .min = 0, .max = 5999999, .len = 1 },
+ .{ .min = 6000000, .max = 8999999, .len = 2 },
+ .{ .min = 9000000, .max = 9899999, .len = 3 },
+ .{ .min = 9900000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9972",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 2 },
+ .{ .min = 1000000, .max = 1999999, .len = 1 },
+ .{ .min = 2000000, .max = 2499999, .len = 3 },
+ .{ .min = 2500000, .max = 2999999, .len = 4 },
+ .{ .min = 3000000, .max = 5999999, .len = 2 },
+ .{ .min = 6000000, .max = 8999999, .len = 3 },
+ .{ .min = 9000000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9973",
+ .rules = &.{
+ .{ .min = 0, .max = 599999, .len = 2 },
+ .{ .min = 600000, .max = 899999, .len = 3 },
+ .{ .min = 900000, .max = 999999, .len = 4 },
+ .{ .min = 1000000, .max = 6999999, .len = 2 },
+ .{ .min = 7000000, .max = 9699999, .len = 3 },
+ .{ .min = 9700000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9974",
+ .rules = &.{
+ .{ .min = 0, .max = 2999999, .len = 1 },
+ .{ .min = 3000000, .max = 5499999, .len = 2 },
+ .{ .min = 5500000, .max = 7499999, .len = 3 },
+ .{ .min = 7500000, .max = 8799999, .len = 4 },
+ .{ .min = 8800000, .max = 9099999, .len = 3 },
+ .{ .min = 9100000, .max = 9499999, .len = 2 },
+ .{ .min = 9500000, .max = 9999999, .len = 2 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9975",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 1 },
+ .{ .min = 1000000, .max = 2999999, .len = 3 },
+ .{ .min = 3000000, .max = 3999999, .len = 4 },
+ .{ .min = 4000000, .max = 4499999, .len = 4 },
+ .{ .min = 4500000, .max = 8999999, .len = 2 },
+ .{ .min = 9000000, .max = 9499999, .len = 3 },
+ .{ .min = 9500000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9976",
+ .rules = &.{
+ .{ .min = 0, .max = 4999999, .len = 1 },
+ .{ .min = 5000000, .max = 5799999, .len = 4 },
+ .{ .min = 5800000, .max = 5899999, .len = 3 },
+ .{ .min = 5900000, .max = 8999999, .len = 2 },
+ .{ .min = 9000000, .max = 9899999, .len = 3 },
+ .{ .min = 9900000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9977",
+ .rules = &.{
+ .{ .min = 0, .max = 8999999, .len = 2 },
+ .{ .min = 9000000, .max = 9899999, .len = 3 },
+ .{ .min = 9900000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9978",
+ .rules = &.{
+ .{ .min = 0, .max = 2999999, .len = 2 },
+ .{ .min = 3000000, .max = 3999999, .len = 3 },
+ .{ .min = 4000000, .max = 9499999, .len = 2 },
+ .{ .min = 9500000, .max = 9899999, .len = 3 },
+ .{ .min = 9900000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9979",
+ .rules = &.{
+ .{ .min = 0, .max = 4999999, .len = 1 },
+ .{ .min = 5000000, .max = 6499999, .len = 2 },
+ .{ .min = 6500000, .max = 6599999, .len = 3 },
+ .{ .min = 6600000, .max = 7599999, .len = 2 },
+ .{ .min = 7600000, .max = 8999999, .len = 3 },
+ .{ .min = 9000000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9980",
+ .rules = &.{
+ .{ .min = 0, .max = 3999999, .len = 1 },
+ .{ .min = 4000000, .max = 8999999, .len = 2 },
+ .{ .min = 9000000, .max = 9899999, .len = 3 },
+ .{ .min = 9900000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9981",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 2 },
+ .{ .min = 1000000, .max = 1599999, .len = 3 },
+ .{ .min = 1600000, .max = 1999999, .len = 4 },
+ .{ .min = 2000000, .max = 7999999, .len = 2 },
+ .{ .min = 8000000, .max = 9499999, .len = 3 },
+ .{ .min = 9500000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9982",
+ .rules = &.{
+ .{ .min = 0, .max = 7999999, .len = 2 },
+ .{ .min = 8000000, .max = 9899999, .len = 3 },
+ .{ .min = 9900000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9983",
+ .rules = &.{
+ .{ .min = 0, .max = 7999999, .len = 0 },
+ .{ .min = 8000000, .max = 9499999, .len = 2 },
+ .{ .min = 9500000, .max = 9899999, .len = 3 },
+ .{ .min = 9900000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9984",
+ .rules = &.{
+ .{ .min = 0, .max = 4999999, .len = 2 },
+ .{ .min = 5000000, .max = 8999999, .len = 3 },
+ .{ .min = 9000000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9985",
+ .rules = &.{
+ .{ .min = 0, .max = 4999999, .len = 1 },
+ .{ .min = 5000000, .max = 7999999, .len = 2 },
+ .{ .min = 8000000, .max = 8999999, .len = 3 },
+ .{ .min = 9000000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9986",
+ .rules = &.{
+ .{ .min = 0, .max = 3999999, .len = 2 },
+ .{ .min = 4000000, .max = 8999999, .len = 3 },
+ .{ .min = 9000000, .max = 9399999, .len = 4 },
+ .{ .min = 9400000, .max = 9699999, .len = 3 },
+ .{ .min = 9700000, .max = 9999999, .len = 2 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9987",
+ .rules = &.{
+ .{ .min = 0, .max = 3999999, .len = 2 },
+ .{ .min = 4000000, .max = 8799999, .len = 3 },
+ .{ .min = 8800000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9988",
+ .rules = &.{
+ .{ .min = 0, .max = 3999999, .len = 1 },
+ .{ .min = 4000000, .max = 5499999, .len = 2 },
+ .{ .min = 5500000, .max = 7499999, .len = 3 },
+ .{ .min = 7500000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "9989",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 1 },
+ .{ .min = 1000000, .max = 1999999, .len = 3 },
+ .{ .min = 2000000, .max = 2999999, .len = 4 },
+ .{ .min = 3000000, .max = 5999999, .len = 2 },
+ .{ .min = 6000000, .max = 9499999, .len = 3 },
+ .{ .min = 9500000, .max = 9999999, .len = 4 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99901",
+ .rules = &.{
+ .{ .min = 0, .max = 4999999, .len = 2 },
+ .{ .min = 5000000, .max = 7999999, .len = 3 },
+ .{ .min = 8000000, .max = 9999999, .len = 2 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99902",
+ .rules = &.{
+ .{ .min = 0, .max = 9999999, .len = 0 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99903",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 1 },
+ .{ .min = 2000000, .max = 8999999, .len = 2 },
+ .{ .min = 9000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99904",
+ .rules = &.{
+ .{ .min = 0, .max = 5999999, .len = 1 },
+ .{ .min = 6000000, .max = 8999999, .len = 2 },
+ .{ .min = 9000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99905",
+ .rules = &.{
+ .{ .min = 0, .max = 3999999, .len = 1 },
+ .{ .min = 4000000, .max = 7999999, .len = 2 },
+ .{ .min = 8000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99906",
+ .rules = &.{
+ .{ .min = 0, .max = 2999999, .len = 1 },
+ .{ .min = 3000000, .max = 5999999, .len = 2 },
+ .{ .min = 6000000, .max = 6999999, .len = 3 },
+ .{ .min = 7000000, .max = 8999999, .len = 2 },
+ .{ .min = 9000000, .max = 9499999, .len = 2 },
+ .{ .min = 9500000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99908",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 1 },
+ .{ .min = 1000000, .max = 8999999, .len = 2 },
+ .{ .min = 9000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99909",
+ .rules = &.{
+ .{ .min = 0, .max = 3999999, .len = 1 },
+ .{ .min = 4000000, .max = 9499999, .len = 2 },
+ .{ .min = 9500000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99910",
+ .rules = &.{
+ .{ .min = 0, .max = 2999999, .len = 1 },
+ .{ .min = 3000000, .max = 8999999, .len = 2 },
+ .{ .min = 9000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99911",
+ .rules = &.{
+ .{ .min = 0, .max = 4699999, .len = 2 },
+ .{ .min = 4700000, .max = 4799999, .len = 3 },
+ .{ .min = 4800000, .max = 5999999, .len = 2 },
+ .{ .min = 6000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99912",
+ .rules = &.{
+ .{ .min = 0, .max = 3999999, .len = 1 },
+ .{ .min = 4000000, .max = 5999999, .len = 3 },
+ .{ .min = 6000000, .max = 8999999, .len = 2 },
+ .{ .min = 9000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99913",
+ .rules = &.{
+ .{ .min = 0, .max = 2999999, .len = 1 },
+ .{ .min = 3000000, .max = 3599999, .len = 2 },
+ .{ .min = 3600000, .max = 5999999, .len = 0 },
+ .{ .min = 6000000, .max = 6049999, .len = 3 },
+ .{ .min = 6050000, .max = 9999999, .len = 0 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99914",
+ .rules = &.{
+ .{ .min = 0, .max = 4999999, .len = 1 },
+ .{ .min = 5000000, .max = 6999999, .len = 2 },
+ .{ .min = 7000000, .max = 7999999, .len = 1 },
+ .{ .min = 8000000, .max = 8699999, .len = 2 },
+ .{ .min = 8700000, .max = 8799999, .len = 3 },
+ .{ .min = 8800000, .max = 8999999, .len = 2 },
+ .{ .min = 9000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99915",
+ .rules = &.{
+ .{ .min = 0, .max = 4999999, .len = 1 },
+ .{ .min = 5000000, .max = 7999999, .len = 2 },
+ .{ .min = 8000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99916",
+ .rules = &.{
+ .{ .min = 0, .max = 2999999, .len = 1 },
+ .{ .min = 3000000, .max = 6999999, .len = 2 },
+ .{ .min = 7000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99917",
+ .rules = &.{
+ .{ .min = 0, .max = 2999999, .len = 1 },
+ .{ .min = 3000000, .max = 8899999, .len = 2 },
+ .{ .min = 8900000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99918",
+ .rules = &.{
+ .{ .min = 0, .max = 3999999, .len = 1 },
+ .{ .min = 4000000, .max = 7999999, .len = 2 },
+ .{ .min = 8000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99919",
+ .rules = &.{
+ .{ .min = 0, .max = 2999999, .len = 1 },
+ .{ .min = 3000000, .max = 3999999, .len = 3 },
+ .{ .min = 4000000, .max = 7999999, .len = 2 },
+ .{ .min = 8000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99920",
+ .rules = &.{
+ .{ .min = 0, .max = 4999999, .len = 1 },
+ .{ .min = 5000000, .max = 8999999, .len = 2 },
+ .{ .min = 9000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99921",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 1 },
+ .{ .min = 2000000, .max = 6999999, .len = 2 },
+ .{ .min = 7000000, .max = 7999999, .len = 3 },
+ .{ .min = 8000000, .max = 8999999, .len = 1 },
+ .{ .min = 9000000, .max = 9999999, .len = 2 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99922",
+ .rules = &.{
+ .{ .min = 0, .max = 3999999, .len = 1 },
+ .{ .min = 4000000, .max = 6999999, .len = 2 },
+ .{ .min = 7000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99923",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 1 },
+ .{ .min = 2000000, .max = 7999999, .len = 2 },
+ .{ .min = 8000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99924",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 1 },
+ .{ .min = 2000000, .max = 7999999, .len = 2 },
+ .{ .min = 8000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99925",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 1 },
+ .{ .min = 1000000, .max = 1999999, .len = 2 },
+ .{ .min = 2000000, .max = 2999999, .len = 3 },
+ .{ .min = 3000000, .max = 3999999, .len = 1 },
+ .{ .min = 4000000, .max = 7999999, .len = 2 },
+ .{ .min = 8000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99926",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 1 },
+ .{ .min = 1000000, .max = 5999999, .len = 2 },
+ .{ .min = 6000000, .max = 8699999, .len = 3 },
+ .{ .min = 8700000, .max = 8999999, .len = 2 },
+ .{ .min = 9000000, .max = 9999999, .len = 2 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99927",
+ .rules = &.{
+ .{ .min = 0, .max = 2999999, .len = 1 },
+ .{ .min = 3000000, .max = 5999999, .len = 2 },
+ .{ .min = 6000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99928",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 1 },
+ .{ .min = 1000000, .max = 7999999, .len = 2 },
+ .{ .min = 8000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99929",
+ .rules = &.{
+ .{ .min = 0, .max = 4999999, .len = 1 },
+ .{ .min = 5000000, .max = 7999999, .len = 2 },
+ .{ .min = 8000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99930",
+ .rules = &.{
+ .{ .min = 0, .max = 4999999, .len = 1 },
+ .{ .min = 5000000, .max = 7999999, .len = 2 },
+ .{ .min = 8000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99931",
+ .rules = &.{
+ .{ .min = 0, .max = 4999999, .len = 1 },
+ .{ .min = 5000000, .max = 7999999, .len = 2 },
+ .{ .min = 8000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99932",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 1 },
+ .{ .min = 1000000, .max = 5999999, .len = 2 },
+ .{ .min = 6000000, .max = 6999999, .len = 3 },
+ .{ .min = 7000000, .max = 7999999, .len = 1 },
+ .{ .min = 8000000, .max = 9999999, .len = 2 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99933",
+ .rules = &.{
+ .{ .min = 0, .max = 2999999, .len = 1 },
+ .{ .min = 3000000, .max = 5999999, .len = 2 },
+ .{ .min = 6000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99934",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 1 },
+ .{ .min = 2000000, .max = 7999999, .len = 2 },
+ .{ .min = 8000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99935",
+ .rules = &.{
+ .{ .min = 0, .max = 2999999, .len = 1 },
+ .{ .min = 3000000, .max = 5999999, .len = 2 },
+ .{ .min = 6000000, .max = 6999999, .len = 3 },
+ .{ .min = 7000000, .max = 8999999, .len = 1 },
+ .{ .min = 9000000, .max = 9999999, .len = 2 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99936",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 1 },
+ .{ .min = 1000000, .max = 5999999, .len = 2 },
+ .{ .min = 6000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99937",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 1 },
+ .{ .min = 2000000, .max = 5999999, .len = 2 },
+ .{ .min = 6000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99938",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 1 },
+ .{ .min = 2000000, .max = 5999999, .len = 2 },
+ .{ .min = 6000000, .max = 8999999, .len = 3 },
+ .{ .min = 9000000, .max = 9999999, .len = 2 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99939",
+ .rules = &.{
+ .{ .min = 0, .max = 2999999, .len = 1 },
+ .{ .min = 3000000, .max = 5999999, .len = 2 },
+ .{ .min = 6000000, .max = 8999999, .len = 2 },
+ .{ .min = 9000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99940",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 1 },
+ .{ .min = 1000000, .max = 6999999, .len = 2 },
+ .{ .min = 7000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99941",
+ .rules = &.{
+ .{ .min = 0, .max = 2999999, .len = 1 },
+ .{ .min = 3000000, .max = 7999999, .len = 2 },
+ .{ .min = 8000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99942",
+ .rules = &.{
+ .{ .min = 0, .max = 4999999, .len = 1 },
+ .{ .min = 5000000, .max = 7999999, .len = 2 },
+ .{ .min = 8000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99943",
+ .rules = &.{
+ .{ .min = 0, .max = 2999999, .len = 1 },
+ .{ .min = 3000000, .max = 5999999, .len = 2 },
+ .{ .min = 6000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99944",
+ .rules = &.{
+ .{ .min = 0, .max = 4999999, .len = 1 },
+ .{ .min = 5000000, .max = 7999999, .len = 2 },
+ .{ .min = 8000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99945",
+ .rules = &.{
+ .{ .min = 0, .max = 4999999, .len = 1 },
+ .{ .min = 5000000, .max = 8999999, .len = 2 },
+ .{ .min = 9000000, .max = 9799999, .len = 3 },
+ .{ .min = 9800000, .max = 9999999, .len = 2 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99946",
+ .rules = &.{
+ .{ .min = 0, .max = 2999999, .len = 1 },
+ .{ .min = 3000000, .max = 5999999, .len = 2 },
+ .{ .min = 6000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99947",
+ .rules = &.{
+ .{ .min = 0, .max = 2999999, .len = 1 },
+ .{ .min = 3000000, .max = 6999999, .len = 2 },
+ .{ .min = 7000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99948",
+ .rules = &.{
+ .{ .min = 0, .max = 4999999, .len = 1 },
+ .{ .min = 5000000, .max = 7999999, .len = 2 },
+ .{ .min = 8000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99949",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 1 },
+ .{ .min = 2000000, .max = 7999999, .len = 2 },
+ .{ .min = 8000000, .max = 8999999, .len = 1 },
+ .{ .min = 9000000, .max = 9899999, .len = 3 },
+ .{ .min = 9900000, .max = 9999999, .len = 2 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99950",
+ .rules = &.{
+ .{ .min = 0, .max = 4999999, .len = 1 },
+ .{ .min = 5000000, .max = 7999999, .len = 2 },
+ .{ .min = 8000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99951",
+ .rules = &.{
+ .{ .min = 0, .max = 9999999, .len = 0 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99952",
+ .rules = &.{
+ .{ .min = 0, .max = 4999999, .len = 1 },
+ .{ .min = 5000000, .max = 7999999, .len = 2 },
+ .{ .min = 8000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99953",
+ .rules = &.{
+ .{ .min = 0, .max = 2999999, .len = 1 },
+ .{ .min = 3000000, .max = 7999999, .len = 2 },
+ .{ .min = 8000000, .max = 9399999, .len = 3 },
+ .{ .min = 9400000, .max = 9999999, .len = 2 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99954",
+ .rules = &.{
+ .{ .min = 0, .max = 2999999, .len = 1 },
+ .{ .min = 3000000, .max = 6999999, .len = 2 },
+ .{ .min = 7000000, .max = 8799999, .len = 3 },
+ .{ .min = 8800000, .max = 9999999, .len = 2 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99955",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 1 },
+ .{ .min = 2000000, .max = 5999999, .len = 2 },
+ .{ .min = 6000000, .max = 7999999, .len = 3 },
+ .{ .min = 8000000, .max = 9999999, .len = 2 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99956",
+ .rules = &.{
+ .{ .min = 0, .max = 5999999, .len = 2 },
+ .{ .min = 6000000, .max = 8599999, .len = 3 },
+ .{ .min = 8600000, .max = 9999999, .len = 2 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99957",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 1 },
+ .{ .min = 2000000, .max = 7999999, .len = 2 },
+ .{ .min = 8000000, .max = 9499999, .len = 3 },
+ .{ .min = 9500000, .max = 9999999, .len = 2 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99958",
+ .rules = &.{
+ .{ .min = 0, .max = 4999999, .len = 1 },
+ .{ .min = 5000000, .max = 9399999, .len = 2 },
+ .{ .min = 9400000, .max = 9499999, .len = 3 },
+ .{ .min = 9500000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99959",
+ .rules = &.{
+ .{ .min = 0, .max = 2999999, .len = 1 },
+ .{ .min = 3000000, .max = 5999999, .len = 2 },
+ .{ .min = 6000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99960",
+ .rules = &.{
+ .{ .min = 0, .max = 699999, .len = 0 },
+ .{ .min = 700000, .max = 999999, .len = 3 },
+ .{ .min = 1000000, .max = 9499999, .len = 2 },
+ .{ .min = 9500000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99961",
+ .rules = &.{
+ .{ .min = 0, .max = 2999999, .len = 1 },
+ .{ .min = 3000000, .max = 3699999, .len = 3 },
+ .{ .min = 3700000, .max = 8999999, .len = 2 },
+ .{ .min = 9000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99962",
+ .rules = &.{
+ .{ .min = 0, .max = 4999999, .len = 1 },
+ .{ .min = 5000000, .max = 7999999, .len = 2 },
+ .{ .min = 8000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99963",
+ .rules = &.{
+ .{ .min = 0, .max = 4999999, .len = 2 },
+ .{ .min = 5000000, .max = 9199999, .len = 3 },
+ .{ .min = 9200000, .max = 9999999, .len = 2 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99964",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 1 },
+ .{ .min = 2000000, .max = 7999999, .len = 2 },
+ .{ .min = 8000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99965",
+ .rules = &.{
+ .{ .min = 0, .max = 2999999, .len = 1 },
+ .{ .min = 3000000, .max = 3599999, .len = 3 },
+ .{ .min = 3600000, .max = 6299999, .len = 2 },
+ .{ .min = 6300000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99966",
+ .rules = &.{
+ .{ .min = 0, .max = 2999999, .len = 1 },
+ .{ .min = 3000000, .max = 6999999, .len = 2 },
+ .{ .min = 7000000, .max = 7999999, .len = 3 },
+ .{ .min = 8000000, .max = 9699999, .len = 2 },
+ .{ .min = 9700000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99967",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 1 },
+ .{ .min = 1000000, .max = 5999999, .len = 2 },
+ .{ .min = 6000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99968",
+ .rules = &.{
+ .{ .min = 0, .max = 3999999, .len = 1 },
+ .{ .min = 4000000, .max = 5999999, .len = 3 },
+ .{ .min = 6000000, .max = 8999999, .len = 2 },
+ .{ .min = 9000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99969",
+ .rules = &.{
+ .{ .min = 0, .max = 4999999, .len = 1 },
+ .{ .min = 5000000, .max = 7999999, .len = 2 },
+ .{ .min = 8000000, .max = 9499999, .len = 3 },
+ .{ .min = 9500000, .max = 9999999, .len = 2 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99970",
+ .rules = &.{
+ .{ .min = 0, .max = 4999999, .len = 1 },
+ .{ .min = 5000000, .max = 8999999, .len = 2 },
+ .{ .min = 9000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99971",
+ .rules = &.{
+ .{ .min = 0, .max = 3999999, .len = 1 },
+ .{ .min = 4000000, .max = 8499999, .len = 2 },
+ .{ .min = 8500000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99972",
+ .rules = &.{
+ .{ .min = 0, .max = 4999999, .len = 1 },
+ .{ .min = 5000000, .max = 8999999, .len = 2 },
+ .{ .min = 9000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99973",
+ .rules = &.{
+ .{ .min = 0, .max = 3999999, .len = 1 },
+ .{ .min = 4000000, .max = 7999999, .len = 2 },
+ .{ .min = 8000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99974",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 1 },
+ .{ .min = 1000000, .max = 2599999, .len = 2 },
+ .{ .min = 2600000, .max = 3999999, .len = 3 },
+ .{ .min = 4000000, .max = 6399999, .len = 2 },
+ .{ .min = 6400000, .max = 6499999, .len = 3 },
+ .{ .min = 6500000, .max = 7999999, .len = 2 },
+ .{ .min = 8000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99975",
+ .rules = &.{
+ .{ .min = 0, .max = 2999999, .len = 1 },
+ .{ .min = 3000000, .max = 3999999, .len = 3 },
+ .{ .min = 4000000, .max = 7999999, .len = 2 },
+ .{ .min = 8000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99976",
+ .rules = &.{
+ .{ .min = 0, .max = 399999, .len = 2 },
+ .{ .min = 400000, .max = 999999, .len = 3 },
+ .{ .min = 1000000, .max = 1599999, .len = 2 },
+ .{ .min = 1600000, .max = 1999999, .len = 3 },
+ .{ .min = 2000000, .max = 5999999, .len = 2 },
+ .{ .min = 6000000, .max = 8199999, .len = 3 },
+ .{ .min = 8200000, .max = 8999999, .len = 2 },
+ .{ .min = 9000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99977",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 1 },
+ .{ .min = 2000000, .max = 3999999, .len = 0 },
+ .{ .min = 4000000, .max = 6999999, .len = 2 },
+ .{ .min = 7000000, .max = 7999999, .len = 3 },
+ .{ .min = 8000000, .max = 8999999, .len = 0 },
+ .{ .min = 9000000, .max = 9249999, .len = 3 },
+ .{ .min = 9250000, .max = 9749999, .len = 0 },
+ .{ .min = 9750000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99978",
+ .rules = &.{
+ .{ .min = 0, .max = 4999999, .len = 1 },
+ .{ .min = 5000000, .max = 6999999, .len = 2 },
+ .{ .min = 7000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99979",
+ .rules = &.{
+ .{ .min = 0, .max = 3999999, .len = 1 },
+ .{ .min = 4000000, .max = 7999999, .len = 2 },
+ .{ .min = 8000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99980",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 1 },
+ .{ .min = 1000000, .max = 2499999, .len = 0 },
+ .{ .min = 2500000, .max = 6499999, .len = 2 },
+ .{ .min = 6500000, .max = 6699999, .len = 0 },
+ .{ .min = 6700000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99981",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 1 },
+ .{ .min = 1000000, .max = 1099999, .len = 2 },
+ .{ .min = 1100000, .max = 1499999, .len = 3 },
+ .{ .min = 1500000, .max = 1999999, .len = 2 },
+ .{ .min = 2000000, .max = 2199999, .len = 3 },
+ .{ .min = 2200000, .max = 7499999, .len = 2 },
+ .{ .min = 7500000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99982",
+ .rules = &.{
+ .{ .min = 0, .max = 4999999, .len = 1 },
+ .{ .min = 5000000, .max = 7999999, .len = 2 },
+ .{ .min = 8000000, .max = 8449999, .len = 0 },
+ .{ .min = 8450000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99983",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 1 },
+ .{ .min = 1000000, .max = 3499999, .len = 0 },
+ .{ .min = 3500000, .max = 6999999, .len = 2 },
+ .{ .min = 7000000, .max = 8499999, .len = 0 },
+ .{ .min = 8500000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99984",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 1 },
+ .{ .min = 1000000, .max = 4999999, .len = 0 },
+ .{ .min = 5000000, .max = 6999999, .len = 2 },
+ .{ .min = 7000000, .max = 9499999, .len = 0 },
+ .{ .min = 9500000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99985",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 1 },
+ .{ .min = 2000000, .max = 2299999, .len = 3 },
+ .{ .min = 2300000, .max = 7999999, .len = 2 },
+ .{ .min = 8000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99986",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 1 },
+ .{ .min = 1000000, .max = 4999999, .len = 0 },
+ .{ .min = 5000000, .max = 6999999, .len = 2 },
+ .{ .min = 7000000, .max = 9499999, .len = 0 },
+ .{ .min = 9500000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99987",
+ .rules = &.{
+ .{ .min = 0, .max = 3999999, .len = 0 },
+ .{ .min = 4000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99988",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 1 },
+ .{ .min = 1000000, .max = 1199999, .len = 2 },
+ .{ .min = 1200000, .max = 4999999, .len = 0 },
+ .{ .min = 5000000, .max = 5499999, .len = 2 },
+ .{ .min = 5500000, .max = 7999999, .len = 0 },
+ .{ .min = 8000000, .max = 8249999, .len = 3 },
+ .{ .min = 8250000, .max = 9999999, .len = 0 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99989",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 1 },
+ .{ .min = 2000000, .max = 4999999, .len = 0 },
+ .{ .min = 5000000, .max = 7999999, .len = 2 },
+ .{ .min = 8000000, .max = 8999999, .len = 0 },
+ .{ .min = 9000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99990",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 1 },
+ .{ .min = 2000000, .max = 4499999, .len = 0 },
+ .{ .min = 4500000, .max = 5799999, .len = 2 },
+ .{ .min = 5800000, .max = 9299999, .len = 0 },
+ .{ .min = 9300000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99991",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 1 },
+ .{ .min = 1000000, .max = 4999999, .len = 0 },
+ .{ .min = 5000000, .max = 6099999, .len = 2 },
+ .{ .min = 6100000, .max = 9599999, .len = 0 },
+ .{ .min = 9600000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99992",
+ .rules = &.{
+ .{ .min = 0, .max = 2999999, .len = 1 },
+ .{ .min = 3000000, .max = 4999999, .len = 0 },
+ .{ .min = 5000000, .max = 6999999, .len = 2 },
+ .{ .min = 7000000, .max = 8999999, .len = 0 },
+ .{ .min = 9000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99993",
+ .rules = &.{
+ .{ .min = 0, .max = 4999999, .len = 1 },
+ .{ .min = 5000000, .max = 5499999, .len = 2 },
+ .{ .min = 5500000, .max = 9799999, .len = 0 },
+ .{ .min = 9800000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99994",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 1 },
+ .{ .min = 1000000, .max = 4999999, .len = 0 },
+ .{ .min = 5000000, .max = 5699999, .len = 2 },
+ .{ .min = 5700000, .max = 9599999, .len = 0 },
+ .{ .min = 9600000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99995",
+ .rules = &.{
+ .{ .min = 0, .max = 4999999, .len = 0 },
+ .{ .min = 5000000, .max = 5599999, .len = 2 },
+ .{ .min = 5600000, .max = 9749999, .len = 0 },
+ .{ .min = 9750000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99996",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 1 },
+ .{ .min = 2000000, .max = 3999999, .len = 0 },
+ .{ .min = 4000000, .max = 5999999, .len = 2 },
+ .{ .min = 6000000, .max = 8999999, .len = 0 },
+ .{ .min = 9000000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99997",
+ .rules = &.{
+ .{ .min = 0, .max = 999999, .len = 1 },
+ .{ .min = 1000000, .max = 3999999, .len = 0 },
+ .{ .min = 4000000, .max = 6199999, .len = 2 },
+ .{ .min = 6200000, .max = 9199999, .len = 0 },
+ .{ .min = 9200000, .max = 9999999, .len = 3 },
+ },
+ },
+ .{
+ .ean = 978,
+ .digits = "99998",
+ .rules = &.{
+ .{ .min = 0, .max = 7999999, .len = 0 },
+ .{ .min = 8000000, .max = 8999999, .len = 2 },
+ .{ .min = 9000000, .max = 9999999, .len = 0 },
+ },
+ },
+ .{
+ .ean = 979,
+ .digits = "10",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 2 },
+ .{ .min = 2000000, .max = 6999999, .len = 3 },
+ .{ .min = 7000000, .max = 8999999, .len = 4 },
+ .{ .min = 9000000, .max = 9759999, .len = 5 },
+ .{ .min = 9760000, .max = 9999999, .len = 6 },
+ },
+ },
+ .{
+ .ean = 979,
+ .digits = "11",
+ .rules = &.{
+ .{ .min = 0, .max = 2199999, .len = 2 },
+ .{ .min = 2200000, .max = 2299999, .len = 6 },
+ .{ .min = 2300000, .max = 2499999, .len = 5 },
+ .{ .min = 2500000, .max = 5499999, .len = 3 },
+ .{ .min = 5500000, .max = 8499999, .len = 4 },
+ .{ .min = 8500000, .max = 9499999, .len = 5 },
+ .{ .min = 9500000, .max = 9999999, .len = 6 },
+ },
+ },
+ .{
+ .ean = 979,
+ .digits = "12",
+ .rules = &.{
+ .{ .min = 0, .max = 1999999, .len = 0 },
+ .{ .min = 2000000, .max = 2999999, .len = 3 },
+ .{ .min = 3000000, .max = 5449999, .len = 0 },
+ .{ .min = 5450000, .max = 5999999, .len = 4 },
+ .{ .min = 6000000, .max = 7999999, .len = 0 },
+ .{ .min = 8000000, .max = 8499999, .len = 5 },
+ .{ .min = 8500000, .max = 9849999, .len = 0 },
+ .{ .min = 9850000, .max = 9999999, .len = 6 },
+ },
+ },
+ .{
+ .ean = 979,
+ .digits = "13",
+ .rules = &.{
+ .{ .min = 0, .max = 99999, .len = 2 },
+ .{ .min = 100000, .max = 5999999, .len = 0 },
+ .{ .min = 6000000, .max = 6049999, .len = 3 },
+ .{ .min = 6050000, .max = 6999999, .len = 0 },
+ .{ .min = 7000000, .max = 7349999, .len = 4 },
+ .{ .min = 7350000, .max = 8749999, .len = 0 },
+ .{ .min = 8750000, .max = 8999999, .len = 5 },
+ .{ .min = 9000000, .max = 9899999, .len = 0 },
+ .{ .min = 9900000, .max = 9999999, .len = 6 },
+ },
+ },
+ .{
+ .ean = 979,
+ .digits = "8",
+ .rules = &.{
+ .{ .min = 0, .max = 299999, .len = 0 },
+ .{ .min = 300000, .max = 349999, .len = 3 },
+ .{ .min = 350000, .max = 1699999, .len = 0 },
+ .{ .min = 1700000, .max = 1799999, .len = 4 },
+ .{ .min = 1800000, .max = 1949999, .len = 4 },
+ .{ .min = 1950000, .max = 1999999, .len = 4 },
+ .{ .min = 2000000, .max = 2399999, .len = 3 },
+ .{ .min = 2400000, .max = 2599999, .len = 4 },
+ .{ .min = 2600000, .max = 2799999, .len = 4 },
+ .{ .min = 2800000, .max = 2999999, .len = 4 },
+ .{ .min = 3000000, .max = 8849999, .len = 4 },
+ .{ .min = 8850000, .max = 8999999, .len = 5 },
+ .{ .min = 9000000, .max = 9099999, .len = 5 },
+ .{ .min = 9100000, .max = 9499999, .len = 0 },
+ .{ .min = 9500000, .max = 9699999, .len = 6 },
+ .{ .min = 9700000, .max = 9849999, .len = 0 },
+ .{ .min = 9850000, .max = 9929999, .len = 7 },
+ .{ .min = 9930000, .max = 9959999, .len = 7 },
+ .{ .min = 9960000, .max = 9984999, .len = 7 },
+ .{ .min = 9985000, .max = 9999999, .len = 7 },
+ },
+ },
+};
diff --git a/tools/generate_ranges.zig b/tools/generate_ranges.zig
new file mode 100644
index 0000000..2362b1c
--- /dev/null
+++ b/tools/generate_ranges.zig
@@ -0,0 +1,195 @@
+// SPDX-FileCopyrightText: © 2026 Jeffrey C. Ollie
+// SPDX-License-Identifier: MIT
+
+//! Generates src/ranges.zig from the International ISBN Agency's range
+//! data, fetched from https://www.isbn-international.org/.
+//!
+//! Usage:
+//! zig build update-ranges
+//!
+//! or directly, optionally with a previously downloaded range file
+//! instead of the network:
+//! zig run tools/generate_ranges.zig -- src/ranges.zig [RangeMessage.xml]
+
+const std = @import("std");
+
+const range_message_url = "https://www.isbn-international.org/export_rangemessage.xml";
+
+const Rule = struct {
+ min: u32,
+ max: u32,
+ len: u8,
+};
+
+const Group = struct {
+ ean: u16,
+ digits: []const u8,
+ rules: []const Rule,
+};
+
+/// A sequential scanner over the XML text. The range message's regular,
+/// machine-generated structure lets us get by with tag matching instead
+/// of a full XML parser.
+const Cursor = struct {
+ text: []const u8,
+ pos: usize = 0,
+
+ /// Returns the text between the next `` and `` at or
+ /// after `pos` but before `limit`, advancing past the closing tag.
+ fn between(c: *Cursor, comptime tag: []const u8, limit: usize) ?[]const u8 {
+ const open = "<" ++ tag ++ ">";
+ const close = "" ++ tag ++ ">";
+ const start = std.mem.indexOfPos(u8, c.text[0..limit], c.pos, open) orelse return null;
+ const inner = start + open.len;
+ const end = std.mem.indexOfPos(u8, c.text[0..limit], inner, close) orelse return null;
+ c.pos = end + close.len;
+ return c.text[inner..end];
+ }
+};
+
+fn splitOnDash(s: []const u8) ?struct { []const u8, []const u8 } {
+ const dash = std.mem.indexOfScalar(u8, s, '-') orelse return null;
+ return .{ s[0..dash], s[dash + 1 ..] };
+}
+
+pub fn main(init: std.process.Init) !void {
+ const arena = init.arena.allocator();
+ const io = init.io;
+
+ var it: std.process.Args.Iterator = .init(init.minimal.args);
+ _ = it.next();
+ const output_path = it.next();
+ const input_path = it.next();
+ if (output_path == null or it.next() != null) {
+ std.debug.print("usage: generate_ranges [RangeMessage.xml]\n", .{});
+ return error.InvalidArguments;
+ }
+
+ const xml = if (input_path) |path|
+ try std.Io.Dir.cwd().readFileAlloc(io, path, arena, .limited(16 * 1024 * 1024))
+ else xml: {
+ var client: std.http.Client = .{ .allocator = init.gpa, .io = io };
+ defer client.deinit();
+ var body: std.Io.Writer.Allocating = .init(arena);
+ const result = try client.fetch(.{
+ .location = .{ .url = range_message_url },
+ .response_writer = &body.writer,
+ });
+ if (result.status != .ok) {
+ std.debug.print("HTTP {d} fetching {s}\n", .{ @intFromEnum(result.status), range_message_url });
+ return error.HttpRequestFailed;
+ }
+ break :xml body.written();
+ };
+
+ var c: Cursor = .{ .text = xml };
+ const serial = c.between("MessageSerialNumber", xml.len) orelse return error.MalformedXml;
+ const date = c.between("MessageDate", xml.len) orelse return error.MalformedXml;
+
+ // Skip the EAN.UCCPrefixes section; only the registration groups are
+ // needed.
+ c.pos = std.mem.indexOfPos(u8, xml, c.pos, "") orelse return error.MalformedXml;
+
+ var groups: std.ArrayList(Group) = .empty;
+ while (std.mem.indexOfPos(u8, xml, c.pos, "")) |group_start| {
+ c.pos = group_start;
+ const group_end = std.mem.indexOfPos(u8, xml, c.pos, "") orelse return error.MalformedXml;
+
+ const prefix = c.between("Prefix", group_end) orelse return error.MalformedXml;
+ const ean_str, const digits = splitOnDash(prefix) orelse return error.MalformedXml;
+ const ean = try std.fmt.parseInt(u16, ean_str, 10);
+ if (ean != 978 and ean != 979) return error.MalformedXml;
+
+ var rules: std.ArrayList(Rule) = .empty;
+ while (c.between("Range", group_end)) |range| {
+ const lo, const hi = splitOnDash(range) orelse return error.MalformedXml;
+ if (lo.len != 7 or hi.len != 7) return error.MalformedXml;
+ const length = c.between("Length", group_end) orelse return error.MalformedXml;
+ try rules.append(arena, .{
+ .min = try std.fmt.parseInt(u32, lo, 10),
+ .max = try std.fmt.parseInt(u32, hi, 10),
+ .len = try std.fmt.parseInt(u8, length, 10),
+ });
+ }
+
+ try groups.append(arena, .{ .ean = ean, .digits = digits, .rules = rules.items });
+ c.pos = group_end;
+ }
+ if (groups.items.len == 0) return error.MalformedXml;
+
+ std.mem.sort(Group, groups.items, {}, struct {
+ fn lessThan(_: void, a: Group, b: Group) bool {
+ if (a.ean != b.ean) return a.ean < b.ean;
+ return std.mem.order(u8, a.digits, b.digits) == .lt;
+ }
+ }.lessThan);
+
+ // Group lookup relies on group prefixes being prefix-free per EAN
+ // prefix.
+ for (groups.items) |a| {
+ for (groups.items) |b| {
+ if (a.ean == b.ean and !std.mem.eql(u8, a.digits, b.digits) and
+ std.mem.startsWith(u8, b.digits, a.digits))
+ {
+ std.debug.print("group {d}-{s} is a prefix of {d}-{s}\n", .{ a.ean, a.digits, b.ean, b.digits });
+ return error.GroupsNotPrefixFree;
+ }
+ }
+ }
+
+ var out: std.Io.Writer.Allocating = .init(arena);
+ const w = &out.writer;
+ // REUSE-IgnoreStart
+ try w.writeAll("// SPDX-FileCopyrightText: © 2026 Jeffrey C. Ollie\n");
+ try w.writeAll("// SPDX-License-Identifier: MIT\n");
+ // REUSE-IgnoreEnd
+ try w.writeAll("\n");
+ try w.writeAll("//! ISBN registration group and registrant ranges, generated by\n");
+ try w.writeAll("//! tools/generate_ranges.zig from the International ISBN Agency's\n");
+ try w.writeAll("//! range data (https://www.isbn-international.org/export_rangemessage.xml).\n");
+ try w.writeAll("//! Do not edit by hand.\n");
+ try w.writeAll("//!\n");
+ try w.print("//! Message date: {s}\n", .{date});
+ try w.print("//! Serial number: {s}\n", .{serial});
+ try w.writeAll("\n");
+ try w.writeAll("/// Determines the length of the registrant element from the value of\n");
+ try w.writeAll("/// the seven digits that follow the registration group.\n");
+ try w.writeAll("pub const Rule = struct {\n");
+ try w.writeAll(" /// Inclusive lower bound on the seven-digit value.\n");
+ try w.writeAll(" min: u32,\n");
+ try w.writeAll(" /// Inclusive upper bound on the seven-digit value.\n");
+ try w.writeAll(" max: u32,\n");
+ try w.writeAll(" /// Number of digits in the registrant element; 0 means the range\n");
+ try w.writeAll(" /// has not been assigned and cannot be hyphenated.\n");
+ try w.writeAll(" len: u8,\n");
+ try w.writeAll("};\n");
+ try w.writeAll("\n");
+ try w.writeAll("/// A registration group (a country, region, or language area).\n");
+ try w.writeAll("pub const Group = struct {\n");
+ try w.writeAll(" /// The EAN prefix, 978 or 979.\n");
+ try w.writeAll(" ean: u16,\n");
+ try w.writeAll(" /// The registration group digits that follow the EAN prefix.\n");
+ try w.writeAll(" digits: []const u8,\n");
+ try w.writeAll(" /// Registrant length rules for this group.\n");
+ try w.writeAll(" rules: []const Rule,\n");
+ try w.writeAll("};\n");
+ try w.writeAll("\n");
+ try w.writeAll("pub const groups: []const Group = &.{\n");
+ for (groups.items) |group| {
+ try w.writeAll(" .{\n");
+ try w.print(" .ean = {d},\n", .{group.ean});
+ try w.print(" .digits = \"{s}\",\n", .{group.digits});
+ try w.writeAll(" .rules = &.{\n");
+ for (group.rules) |rule| {
+ try w.print(" .{{ .min = {d}, .max = {d}, .len = {d} }},\n", .{ rule.min, rule.max, rule.len });
+ }
+ try w.writeAll(" },\n");
+ try w.writeAll(" },\n");
+ }
+ try w.writeAll("};\n");
+
+ try std.Io.Dir.cwd().writeFile(io, .{
+ .sub_path = output_path.?,
+ .data = out.written(),
+ });
+}