vehicles 0.4.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (189) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +164 -0
  3. data/CHANGELOG.md +321 -0
  4. data/README.md +88 -15
  5. data/data/PROVENANCE-vehicles.md +12 -0
  6. data/data/plates/PROVENANCE.md +10 -0
  7. data/data/plates/_decode/at-districts.yml +287 -0
  8. data/data/plates/_decode/ch-cantons.yml +110 -0
  9. data/data/plates/_decode/cn-issuing-offices.yml +463 -0
  10. data/data/plates/_decode/cn-provinces.yml +614 -0
  11. data/data/plates/_decode/cz-kraj.yml +159 -0
  12. data/data/plates/_decode/dk-serial-blocks.yml +327 -0
  13. data/data/plates/_decode/es-provinces.yml +116 -0
  14. data/data/plates/_decode/fr-departements.yml +191 -0
  15. data/data/plates/_decode/gb-age-identifiers.yml +170 -0
  16. data/data/plates/_decode/gb-memory-tags.yml +202 -0
  17. data/data/plates/_decode/gr-prefectures.yml +1408 -0
  18. data/data/plates/_decode/hr-cities.yml +315 -0
  19. data/data/plates/_decode/ie-counties.yml +227 -0
  20. data/data/plates/_decode/in-state-codes.yml +169 -0
  21. data/data/plates/_decode/is-districts-1938.yml +116 -0
  22. data/data/plates/_decode/it-provinces.yml +348 -0
  23. data/data/plates/_decode/jp-office-marks.yml +960 -0
  24. data/data/plates/_decode/jp-use-marks.yml +205 -0
  25. data/data/plates/_decode/kr-authority-marks.yml +146 -0
  26. data/data/plates/_decode/kr-use-syllables.yml +194 -0
  27. data/data/plates/_decode/lu-series-order.yml +638 -0
  28. data/data/plates/_decode/mx-entity-series.yml +380 -0
  29. data/data/plates/_decode/my-index-marks.yml +271 -0
  30. data/data/plates/_decode/no-counties-1913.yml +148 -0
  31. data/data/plates/_decode/no-districts.yml +901 -0
  32. data/data/plates/_decode/pl-powiats.yml +567 -0
  33. data/data/plates/_decode/pt-trailer-services.yml +96 -0
  34. data/data/plates/_decode/ro-counties.yml +213 -0
  35. data/data/plates/_decode/se-diplomatic.yml +220 -0
  36. data/data/plates/_decode/si-regions.yml +123 -0
  37. data/data/plates/_decode/sk-districts.yml +314 -0
  38. data/data/plates/_decode/th-registration-elements.yml +208 -0
  39. data/data/plates/_decode/ua-regions.yml +393 -0
  40. data/data/plates/_decode/za-licence-marks.yml +215 -0
  41. data/data/plates/_meta/classes.yml +26 -0
  42. data/data/plates/_meta/separators.yml +102 -0
  43. data/data/plates/ad.yml +961 -0
  44. data/data/plates/ar.yml +762 -0
  45. data/data/plates/at.yml +1424 -0
  46. data/data/plates/au-act.yml +472 -0
  47. data/data/plates/au-nsw.yml +282 -0
  48. data/data/plates/au-nt.yml +431 -0
  49. data/data/plates/au-qld.yml +272 -0
  50. data/data/plates/au-sa.yml +248 -0
  51. data/data/plates/au-tas.yml +302 -0
  52. data/data/plates/au-vic.yml +215 -0
  53. data/data/plates/au-wa.yml +309 -0
  54. data/data/plates/be.yml +1840 -0
  55. data/data/plates/br.yml +1152 -0
  56. data/data/plates/ca-ab.yml +430 -0
  57. data/data/plates/ca-bc.yml +697 -0
  58. data/data/plates/ca-mb.yml +499 -0
  59. data/data/plates/ca-nb.yml +537 -0
  60. data/data/plates/ca-nl.yml +743 -0
  61. data/data/plates/ca-ns.yml +808 -0
  62. data/data/plates/ca-nt.yml +610 -0
  63. data/data/plates/ca-nu.yml +280 -0
  64. data/data/plates/ca-on.yml +881 -0
  65. data/data/plates/ca-pe.yml +592 -0
  66. data/data/plates/ca-qc.yml +1036 -0
  67. data/data/plates/ca-sk.yml +256 -0
  68. data/data/plates/ca-yt.yml +656 -0
  69. data/data/plates/ch.yml +1273 -0
  70. data/data/plates/cn.yml +1431 -0
  71. data/data/plates/cy.yml +688 -0
  72. data/data/plates/cz.yml +1179 -0
  73. data/data/plates/de.yml +1107 -0
  74. data/data/plates/dk.yml +1647 -0
  75. data/data/plates/ee.yml +1275 -0
  76. data/data/plates/es.yml +888 -0
  77. data/data/plates/fi.yml +1271 -0
  78. data/data/plates/fr.yml +1265 -0
  79. data/data/plates/gb.yml +1188 -0
  80. data/data/plates/gr.yml +721 -0
  81. data/data/plates/hr.yml +860 -0
  82. data/data/plates/hu.yml +959 -0
  83. data/data/plates/ie.yml +775 -0
  84. data/data/plates/in.yml +1172 -0
  85. data/data/plates/is.yml +667 -0
  86. data/data/plates/it.yml +1317 -0
  87. data/data/plates/jp.yml +3650 -0
  88. data/data/plates/kr.yml +1375 -0
  89. data/data/plates/li.yml +1010 -0
  90. data/data/plates/lt.yml +879 -0
  91. data/data/plates/lu.yml +842 -0
  92. data/data/plates/lv.yml +924 -0
  93. data/data/plates/mc.yml +1024 -0
  94. data/data/plates/mt.yml +854 -0
  95. data/data/plates/mx.yml +1372 -0
  96. data/data/plates/my.yml +685 -0
  97. data/data/plates/nl.yml +1016 -0
  98. data/data/plates/no.yml +1018 -0
  99. data/data/plates/nz.yml +1699 -0
  100. data/data/plates/pl.yml +1296 -0
  101. data/data/plates/pt.yml +847 -0
  102. data/data/plates/ro.yml +785 -0
  103. data/data/plates/se.yml +1091 -0
  104. data/data/plates/si.yml +1105 -0
  105. data/data/plates/sk.yml +1439 -0
  106. data/data/plates/sm.yml +1119 -0
  107. data/data/plates/th.yml +1150 -0
  108. data/data/plates/ua.yml +1672 -0
  109. data/data/plates/us-ak.yml +763 -0
  110. data/data/plates/us-al.yml +457 -0
  111. data/data/plates/us-ar.yml +427 -0
  112. data/data/plates/us-as.yml +454 -0
  113. data/data/plates/us-az.yml +430 -0
  114. data/data/plates/us-ca.yml +892 -0
  115. data/data/plates/us-co.yml +452 -0
  116. data/data/plates/us-ct.yml +427 -0
  117. data/data/plates/us-dc.yml +614 -0
  118. data/data/plates/us-de.yml +551 -0
  119. data/data/plates/us-fl.yml +741 -0
  120. data/data/plates/us-ga.yml +644 -0
  121. data/data/plates/us-gu.yml +658 -0
  122. data/data/plates/us-hi.yml +585 -0
  123. data/data/plates/us-ia.yml +438 -0
  124. data/data/plates/us-id.yml +531 -0
  125. data/data/plates/us-il.yml +516 -0
  126. data/data/plates/us-in.yml +324 -0
  127. data/data/plates/us-ks.yml +351 -0
  128. data/data/plates/us-ky.yml +770 -0
  129. data/data/plates/us-la.yml +568 -0
  130. data/data/plates/us-ma.yml +379 -0
  131. data/data/plates/us-md.yml +536 -0
  132. data/data/plates/us-me.yml +445 -0
  133. data/data/plates/us-mi.yml +408 -0
  134. data/data/plates/us-mn.yml +411 -0
  135. data/data/plates/us-mo.yml +356 -0
  136. data/data/plates/us-mp.yml +402 -0
  137. data/data/plates/us-ms.yml +432 -0
  138. data/data/plates/us-mt.yml +619 -0
  139. data/data/plates/us-nc.yml +602 -0
  140. data/data/plates/us-nd.yml +419 -0
  141. data/data/plates/us-ne.yml +483 -0
  142. data/data/plates/us-nh.yml +394 -0
  143. data/data/plates/us-nj.yml +547 -0
  144. data/data/plates/us-nm.yml +574 -0
  145. data/data/plates/us-nv.yml +655 -0
  146. data/data/plates/us-ny.yml +592 -0
  147. data/data/plates/us-oh.yml +404 -0
  148. data/data/plates/us-ok.yml +513 -0
  149. data/data/plates/us-or.yml +392 -0
  150. data/data/plates/us-pa.yml +506 -0
  151. data/data/plates/us-pr.yml +507 -0
  152. data/data/plates/us-ri.yml +445 -0
  153. data/data/plates/us-sc.yml +605 -0
  154. data/data/plates/us-sd.yml +428 -0
  155. data/data/plates/us-tn.yml +471 -0
  156. data/data/plates/us-tx.yml +535 -0
  157. data/data/plates/us-ut.yml +384 -0
  158. data/data/plates/us-va.yml +567 -0
  159. data/data/plates/us-vi.yml +489 -0
  160. data/data/plates/us-vt.yml +458 -0
  161. data/data/plates/us-wa.yml +484 -0
  162. data/data/plates/us-wi.yml +509 -0
  163. data/data/plates/us-wv.yml +446 -0
  164. data/data/plates/us-wy.yml +523 -0
  165. data/data/plates/va.yml +604 -0
  166. data/data/plates/za.yml +1141 -0
  167. data/data/vehicles.json +160653 -105090
  168. data/lib/vehicles/configuration.rb +18 -2
  169. data/lib/vehicles/dataset.rb +73 -18
  170. data/lib/vehicles/fuzzy.rb +115 -0
  171. data/lib/vehicles/http.rb +48 -0
  172. data/lib/vehicles/make.rb +36 -6
  173. data/lib/vehicles/mcp_server.rb +5 -5
  174. data/lib/vehicles/model.rb +42 -6
  175. data/lib/vehicles/plates/jurisdiction.rb +32 -0
  176. data/lib/vehicles/plates/series.rb +291 -0
  177. data/lib/vehicles/plates/template_fill.rb +188 -0
  178. data/lib/vehicles/plates/templates.rb +162 -0
  179. data/lib/vehicles/plates.rb +122 -0
  180. data/lib/vehicles/providers/hosted_provider.rb +49 -58
  181. data/lib/vehicles/providers/local_provider.rb +4 -3
  182. data/lib/vehicles/validators/vehicle_make_validator.rb +3 -1
  183. data/lib/vehicles/validators/vehicle_model_validator.rb +1 -1
  184. data/lib/vehicles/version.rb +1 -1
  185. data/lib/vehicles.rb +53 -16
  186. data/rakelib/data_refresh.rake +109 -0
  187. data/rakelib/plates_refresh.rake +29 -0
  188. data/sig/vehicles.rbs +18 -0
  189. metadata +174 -2
@@ -0,0 +1,1016 @@
1
+ # plates/nl.yml — Netherlands (PRD-PLATES gate L0 pilot, COMPLETION PASS).
2
+ #
3
+ # Supersedes the 4-entry L0 seed. Entry ids from the seed are preserved
4
+ # verbatim (nl-sidecode11-moped, nl-sidecode11-agricultural,
5
+ # nl-sidecode11-car, nl-historic-darkblue) per the id contract
6
+ # (PRD-QUALITY I-5/I-6); their DATA is corrected where the RDW pages
7
+ # contradicted the seed — corrections are called out in each `notes`.
8
+ #
9
+ # THE NL MODELLING RULE (EU dossier finding 6, binding): a sidecode is a
10
+ # PATTERN identity, not a period — the same pattern reaches each vehicle
11
+ # category on its own date (RDW's official series table). One pattern ×
12
+ # one category-group = one series entry. Age inference is one-sided (a
13
+ # pattern gives the EARLIEST date; series run until exhausted). RDW says
14
+ # so in its own words on the series page: "Bij een nieuwe kentekenserie
15
+ # krijgen niet direct alle voertuigcategorieën deze combinatie. Eerst maken
16
+ # we de huidige serie 'vol', wat soms lang duurt."
17
+ #
18
+ # Dutch plates encode NO geography. Category IS encoded, in the first letter
19
+ # of the registration (RDW cijfers-en-letters page):
20
+ # M motorcycle · D/F moped · E special moped · V light commercial ·
21
+ # B heavy commercial · W trailer · O semi-trailer · GV border traffic ·
22
+ # T agricultural tractor/mobile machine/MMBS ·
23
+ # L agricultural trailer & interchangeable towed equipment ·
24
+ # passenger cars: G H J K L N P R S T X Z (L and T dropped from sidecode 11).
25
+ #
26
+ # REGEX POLICY IN THIS FILE (schema stressor, see the L0 report):
27
+ # `format.regex` is the LINT-ROUND-TRIPPABLE regex — the lint generates
28
+ # serials from `format.pattern` (L -> any A-Z, 9 -> any 0-9) and requires
29
+ # the regex to accept every one of them, so the regex can never be
30
+ # narrower than the pattern's own alphabet.
31
+ # `format.regex_strict` (NOT yet lint-validated — proposed amendment) is
32
+ # the regex the AUTHORITY actually supports: no vowels since sidecode 4,
33
+ # no C, no Q, and the category first-letter sets above. Consumers doing
34
+ # validation should prefer regex_strict; consumers doing recall should use
35
+ # regex. Where a single first letter is mandated and that letter is not
36
+ # "L" or "9", it is written as a literal in the pattern and regex needs no
37
+ # strict twin.
38
+ jurisdiction: nl
39
+ authority:
40
+ name: RDW (Dienst Wegverkeer)
41
+ url: "https://www.rdw.nl/de-kentekenplaat"
42
+ binding: vehicle # NL plates bind to the VEHICLE (contrast CH: owner)
43
+
44
+ # ---------------------------------------------------------------------------
45
+ # Jurisdiction-wide charset facts, cited once and referenced per series.
46
+ # ---------------------------------------------------------------------------
47
+ charset_defaults:
48
+ letters: [B, D, F, G, H, J, K, L, M, N, P, R, S, T, V, W, X, Y, Z]
49
+ excluded_letters: [A, E, I, O, U, C, Q]
50
+ excluded_letters_note: >-
51
+ "Sinds kentekencombinatie 4 gebruiken we geen klinkers meer in het kenteken
52
+ (met uitzondering van het kenteken voor opleggers). De letter C en Q
53
+ gebruiken we ook niet omdat deze letters teveel op een nul lijken."
54
+ Semi-trailer (oplegger) registrations are the stated exception and DO use
55
+ the vowel O.
56
+ excluded_combinations: [GVD, KKK, NSB, PKK, PSV, TBS, SS, SD, PVV, SGP, VVD, FVD, BBB]
57
+ source: "https://www.rdw.nl/de-kentekenplaat/cijfers-en-letters-op-de-kentekenplaat # no vowels since combination 4 (opleggers excepted); no C/Q; the 13 forbidden letter combinations"
58
+
59
+ series:
60
+
61
+ # =========================================================================
62
+ # PASSENGER CARS — RDW table "Auto's". class standard, categories [car].
63
+ # First letter from {G H J K L N P R S T X Z}; L and T withdrawn from
64
+ # sidecode 11 onward.
65
+ # =========================================================================
66
+ - id: nl-sidecode6-car
67
+ class: standard
68
+ categories: [car]
69
+ period: { start: 2000 } # 20-01-2000; open — series run until exhausted
70
+ matching: strict
71
+ format:
72
+ pattern: "99-LL-LL"
73
+ regex: '\A\d{2}-[A-Z]{2}-[A-Z]{2}\z'
74
+ regex_strict: '\A\d{2}-[GHJKLNPRSTXZ][BDFGHJKLMNPRSTVWXYZ]-[BDFGHJKLMNPRSTVWXYZ]{2}\z'
75
+ charset:
76
+ first_letter: [G, H, J, K, L, N, P, R, S, T, X, Z]
77
+ notes: "no vowels, no C/Q — see charset_defaults"
78
+ progression: "letter groups advance; RDW does not publish the intra-series allocation order"
79
+ design:
80
+ plate: { w: 520, h: 110, unit: mm }
81
+ plate_variants:
82
+ - { w: 340, h: 210, unit: mm, note: "rechthoekig (two-line) model 27.2" }
83
+ - { w: 310, h: 110, unit: mm, note: "'Amerikaans model' 18.2 — only where the vehicle record carries code 55 'kentekenplaat model 18.2 toegestaan'" }
84
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
85
+ foreground: "#000000"
86
+ border: { color: "#000000", note: "zwart kader voor de leesbaarheid" }
87
+ band: { side: left, color: "#003399", content: eu-stars+NL }
88
+ emblem: { present: false }
89
+ rear_differs: false
90
+ region_encoding: none
91
+ variants:
92
+ - class: taxi
93
+ design: { background: { color: "#7CB9E8", finish: retroreflective, hex_basis: observed }, foreground: "#000000", plate: { w: 520, h: 110, unit: mm } }
94
+ note: >-
95
+ Light-blue taxi plates carry the vehicle's OWN registration — colour-only
96
+ variant of this series, so a sub-entry per PRD-PLATES §2.3, not a series.
97
+ Models 27.30 (long), 27.31 (rectangular), 18.2 (American, light blue).
98
+ sources:
99
+ - "https://www.rdw.nl/de-kentekenplaat/soorten-kentekenplaten # taxikentekenplaat lichtblauw met zwarte letters en cijfers; 520x110 / 340x210 / 310x110"
100
+ - "https://www.rdw.nl/zakelijke-partners/erkende-bedrijven/kentekenplaatfabrikanten/extra-eisen-per-kleur-en-model/kentekenplaat-voor-auto-motorfiets-trike-of-quad # taxi models 27.30 / 27.31 / 18.2"
101
+ - class: trailer
102
+ design: { background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }, foreground: "#000000" }
103
+ note: >-
104
+ Trailers and appendages (bike racks) up to 750 kg have NO registration of
105
+ their own — they repeat the towing vehicle's registration on a WHITE plate.
106
+ Colour-only variant, hence a sub-entry.
107
+ sources:
108
+ - "https://www.rdw.nl/de-kentekenplaat/soorten-kentekenplaten # witte kentekenplaat, aanhangwagens <751 kg, zelfde kenteken als het trekkende voertuig"
109
+ sources:
110
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Auto's: serie 6, combinatie 99-XX-XX, ingangsdatum 20-01-2000"
111
+ - "https://www.rdw.nl/de-kentekenplaat/cijfers-en-letters-op-de-kentekenplaat # personenauto first letters G H J K L N P R S T X Z"
112
+ - "https://www.rdw.nl/de-kentekenplaat/soorten-kentekenplaten # gele plaat, zwart kader, blauw EU-vlak met NL; 520x110 of 340x210"
113
+ notes: >-
114
+ Sidecode 6 for PASSENGER CARS, from 20-01-2000. The first NL series to be
115
+ issued under the EU-band yellow design. Parallel with sidecodes 7-11: RDW
116
+ exhausts a series before switching, so all six car series remain live stock.
117
+
118
+ - id: nl-sidecode7-car
119
+ class: standard
120
+ categories: [car]
121
+ period: { start: 2008 } # 19-05-2008
122
+ matching: strict
123
+ format:
124
+ pattern: "99-LLL-9"
125
+ regex: '\A\d{2}-[A-Z]{3}-\d\z'
126
+ regex_strict: '\A\d{2}-[GHJKLNPRSTXZ][BDFGHJKLMNPRSTVWXYZ]{2}-\d\z'
127
+ charset: { first_letter: [G, H, J, K, L, N, P, R, S, T, X, Z], notes: "no vowels, no C/Q" }
128
+ design:
129
+ plate: { w: 520, h: 110, unit: mm }
130
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
131
+ foreground: "#000000"
132
+ band: { side: left, color: "#003399", content: eu-stars+NL }
133
+ region_encoding: none
134
+ sources:
135
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Auto's: serie 7, combinatie 99-XXX-9, ingangsdatum 19-05-2008"
136
+ - "https://www.rdw.nl/de-kentekenplaat/soorten-kentekenplaten # colours + dimensions"
137
+ notes: >-
138
+ Sidecode 7 for PASSENGER CARS, from 19-05-2008. Same pattern reached HEAVY
139
+ commercial vehicles four years later (20-07-2012) — the pattern-x-category
140
+ rule; see nl-sidecode7-heavycommercial.
141
+
142
+ - id: nl-sidecode8-car
143
+ class: standard
144
+ categories: [car]
145
+ period: { start: 2013 } # 05-03-2013
146
+ matching: strict
147
+ format:
148
+ pattern: "9-LLL-99"
149
+ regex: '\A\d-[A-Z]{3}-\d{2}\z'
150
+ regex_strict: '\A\d-[GHJKLNPRSTXZ][BDFGHJKLMNPRSTVWXYZ]{2}-\d{2}\z'
151
+ charset: { first_letter: [G, H, J, K, L, N, P, R, S, T, X, Z], notes: "no vowels, no C/Q" }
152
+ design:
153
+ plate: { w: 520, h: 110, unit: mm }
154
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
155
+ foreground: "#000000"
156
+ band: { side: left, color: "#003399", content: eu-stars+NL }
157
+ region_encoding: none
158
+ sources:
159
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Auto's: serie 8, combinatie 9-XXX-99, ingangsdatum 05-03-2013"
160
+ notes: >-
161
+ Sidecode 8 for PASSENGER CARS, from 05-03-2013. The same pattern had already
162
+ been running for LIGHT commercial vehicles since 26-02-2009 — a four-year
163
+ lead, and the clearest single counter-example to "sidecode = era".
164
+
165
+ - id: nl-sidecode9-car
166
+ class: standard
167
+ categories: [car]
168
+ period: { start: 2015 } # 30-03-2015
169
+ matching: strict
170
+ format:
171
+ pattern: "LL-999-L"
172
+ regex: '\A[A-Z]{2}-\d{3}-[A-Z]\z'
173
+ regex_strict: '\A[GHJKLNPRSTXZ][BDFGHJKLMNPRSTVWXYZ]-\d{3}-[BDFGHJKLMNPRSTVWXYZ]\z'
174
+ charset: { first_letter: [G, H, J, K, L, N, P, R, S, T, X, Z], notes: "no vowels, no C/Q" }
175
+ design:
176
+ plate: { w: 520, h: 110, unit: mm }
177
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
178
+ foreground: "#000000"
179
+ band: { side: left, color: "#003399", content: eu-stars+NL }
180
+ region_encoding: none
181
+ sources:
182
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Auto's: serie 9, combinatie XX-999-X, ingangsdatum 30-03-2015"
183
+ notes: >-
184
+ Sidecode 9 for PASSENGER CARS, from 30-03-2015. Mopeds got this pattern in
185
+ 2006 and light commercials in 2012 — cars are the LAST category to reach it.
186
+
187
+ - id: nl-sidecode10-car
188
+ class: standard
189
+ categories: [car]
190
+ period: { start: 2019 } # 19-08-2019
191
+ matching: strict
192
+ format:
193
+ pattern: "L-999-LL"
194
+ regex: '\A[A-Z]-\d{3}-[A-Z]{2}\z'
195
+ regex_strict: '\A[GHJKLNPRSTXZ]-\d{3}-[BDFGHJKLMNPRSTVWXYZ]{2}\z'
196
+ charset: { first_letter: [G, H, J, K, L, N, P, R, S, T, X, Z], notes: "no vowels, no C/Q" }
197
+ design:
198
+ plate: { w: 520, h: 110, unit: mm }
199
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
200
+ foreground: "#000000"
201
+ band: { side: left, color: "#003399", content: eu-stars+NL }
202
+ region_encoding: none
203
+ sources:
204
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Auto's: serie 10, combinatie X-999-XX, ingangsdatum 19-08-2019"
205
+ notes: >-
206
+ Sidecode 10 for PASSENGER CARS, from 19-08-2019. Note the single-letter first
207
+ group: the category first-letter rule still applies to it.
208
+
209
+ - id: nl-sidecode11-car # seed id — PRESERVED
210
+ class: standard
211
+ categories: [car] # CORRECTED from the seed's [car, van]: RDW's
212
+ # "Auto's" table is passenger cars only; light
213
+ # commercials reached sidecode 11 on 13-06-2019
214
+ # (see nl-sidecode11-lightcommercial).
215
+ period: { start: 2024 } # 04-06-2024
216
+ matching: strict
217
+ format:
218
+ pattern: "LLL-99-L"
219
+ regex: '\A[A-Z]{3}-\d{2}-[A-Z]\z'
220
+ regex_strict: '\A[GHJKNPRSXZ][BDFGHJKLMNPRSTVWXYZ]{2}-\d{2}-[BDFGHJKLMNPRSTVWXYZ]\z'
221
+ charset:
222
+ first_letter: [G, H, J, K, N, P, R, S, X, Z]
223
+ notes: >-
224
+ "Vanaf kentekenserie 11 worden de medeklinkers L en T niet langer gebruikt
225
+ als eerste letter voor personenauto's" — L and T are withdrawn for CARS
226
+ from sidecode 11, which is why this series' first-letter set is 10 letters
227
+ where sidecodes 6-10 have 12.
228
+ design:
229
+ plate: { w: 520, h: 110, unit: mm }
230
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
231
+ foreground: "#000000"
232
+ band: { side: left, color: "#003399", content: eu-stars+NL }
233
+ region_encoding: none
234
+ sources:
235
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Auto's: serie 11, combinatie XXX-99-X, ingangsdatum 04-06-2024"
236
+ - "https://www.rdw.nl/de-kentekenplaat/cijfers-en-letters-op-de-kentekenplaat # L and T withdrawn as car first letters from serie 11"
237
+ notes: >-
238
+ Sidecode 11 for PASSENGER CARS, from 04-06-2024 — the current car issue.
239
+ The same pattern reached mopeds in 2015 and agricultural trailers in 2021;
240
+ the trio is the pattern-x-category rule demonstrated. Seed correction: the
241
+ seed listed categories [car, van] and no first-letter narrowing.
242
+
243
+ # =========================================================================
244
+ # LIGHT COMMERCIAL — RDW "Bedrijfsauto's licht" (<= 3500 kg). First letter V.
245
+ # V is not a pattern metacharacter, so the literal goes in the pattern and
246
+ # the regex is exact without a strict twin.
247
+ # =========================================================================
248
+ - id: nl-sidecode8-lightcommercial
249
+ class: standard
250
+ categories: [van]
251
+ period: { start: 2009 } # 26-02-2009
252
+ matching: strict
253
+ format:
254
+ pattern: "9-VLL-99"
255
+ regex: '\A\d-V[A-Z]{2}-\d{2}\z'
256
+ regex_strict: '\A\d-V[BDFGHJKLMNPRSTVWXYZ]{2}-\d{2}\z'
257
+ charset: { first_letter: [V], notes: "light commercial registrations always begin with V" }
258
+ design:
259
+ plate: { w: 520, h: 110, unit: mm }
260
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
261
+ foreground: "#000000"
262
+ band: { side: left, color: "#003399", content: eu-stars+NL }
263
+ region_encoding: none
264
+ sources:
265
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Lichte bedrijfsauto's: serie 8, combinatie 9-XXX-99, ingangsdatum 26-02-2009"
266
+ - "https://www.rdw.nl/de-kentekenplaat/cijfers-en-letters-op-de-kentekenplaat # Lichte bedrijfsauto's (tot 3500 kg): eerste letter V"
267
+ notes: >-
268
+ Sidecode 8 for LIGHT COMMERCIAL vehicles, from 26-02-2009 — four years ahead
269
+ of the same pattern's car rollout. Campers registered as light commercial
270
+ also carry V.
271
+
272
+ - id: nl-sidecode9-lightcommercial
273
+ class: standard
274
+ categories: [van]
275
+ period: { start: 2012 } # 12-12-2012
276
+ matching: strict
277
+ format:
278
+ pattern: "VL-999-L"
279
+ regex: '\AV[A-Z]-\d{3}-[A-Z]\z'
280
+ regex_strict: '\AV[BDFGHJKLMNPRSTVWXYZ]-\d{3}-[BDFGHJKLMNPRSTVWXYZ]\z'
281
+ charset: { first_letter: [V] }
282
+ design:
283
+ plate: { w: 520, h: 110, unit: mm }
284
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
285
+ foreground: "#000000"
286
+ band: { side: left, color: "#003399", content: eu-stars+NL }
287
+ region_encoding: none
288
+ sources:
289
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Lichte bedrijfsauto's: serie 9, combinatie XX-999-X, ingangsdatum 12-12-2012"
290
+ notes: Sidecode 9 for LIGHT COMMERCIAL vehicles, from 12-12-2012.
291
+
292
+ - id: nl-sidecode10-lightcommercial
293
+ class: standard
294
+ categories: [van]
295
+ period: { start: 2016 } # 14-10-2016
296
+ matching: strict
297
+ format:
298
+ pattern: "V-999-LL"
299
+ regex: '\AV-\d{3}-[A-Z]{2}\z'
300
+ regex_strict: '\AV-\d{3}-[BDFGHJKLMNPRSTVWXYZ]{2}\z'
301
+ charset: { first_letter: [V] }
302
+ design:
303
+ plate: { w: 520, h: 110, unit: mm }
304
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
305
+ foreground: "#000000"
306
+ band: { side: left, color: "#003399", content: eu-stars+NL }
307
+ region_encoding: none
308
+ sources:
309
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Lichte bedrijfsauto's: serie 10, combinatie X-999-XX, ingangsdatum 14-10-2016"
310
+ notes: Sidecode 10 for LIGHT COMMERCIAL vehicles, from 14-10-2016.
311
+
312
+ - id: nl-sidecode11-lightcommercial
313
+ class: standard
314
+ categories: [van]
315
+ period: { start: 2019 } # 13-06-2019
316
+ matching: strict
317
+ format:
318
+ pattern: "VLL-99-L"
319
+ regex: '\AV[A-Z]{2}-\d{2}-[A-Z]\z'
320
+ regex_strict: '\AV[BDFGHJKLMNPRSTVWXYZ]{2}-\d{2}-[BDFGHJKLMNPRSTVWXYZ]\z'
321
+ charset: { first_letter: [V] }
322
+ design:
323
+ plate: { w: 520, h: 110, unit: mm }
324
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
325
+ foreground: "#000000"
326
+ band: { side: left, color: "#003399", content: eu-stars+NL }
327
+ region_encoding: none
328
+ sources:
329
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Lichte bedrijfsauto's: serie 11, combinatie XXX-99-X, ingangsdatum 13-06-2019"
330
+ notes: >-
331
+ Sidecode 11 for LIGHT COMMERCIAL vehicles, from 13-06-2019 — FIVE YEARS
332
+ before the same pattern reached cars (04-06-2024). The single most useful
333
+ NL age-inference fact: a XXX-99-X plate starting with V can be 2019+, while
334
+ the same pattern on a car cannot predate June 2024.
335
+
336
+ - id: nl-sidecode12-lightcommercial
337
+ class: standard
338
+ categories: [van]
339
+ period: { start: 2024 } # 08-01-2024
340
+ matching: strict
341
+ format:
342
+ pattern: "V-99-LLL"
343
+ regex: '\AV-\d{2}-[A-Z]{3}\z'
344
+ regex_strict: '\AV-\d{2}-[BDFGHJKLMNPRSTVWXYZ]{3}\z'
345
+ charset: { first_letter: [V] }
346
+ design:
347
+ plate: { w: 520, h: 110, unit: mm }
348
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
349
+ foreground: "#000000"
350
+ band: { side: left, color: "#003399", content: eu-stars+NL }
351
+ region_encoding: none
352
+ sources:
353
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Lichte bedrijfsauto's: serie 12, combinatie X-99-XXX, ingangsdatum 08-01-2024"
354
+ notes: >-
355
+ Sidecode 12 for LIGHT COMMERCIAL vehicles, from 08-01-2024 — light
356
+ commercials are the ONLY road category on sidecode 12 besides special mopeds
357
+ (2025) and agricultural tractors (2021). Cars have never reached it.
358
+
359
+ # =========================================================================
360
+ # HEAVY COMMERCIAL — RDW "Bedrijfsauto's zwaar" (> 3500 kg). First letter B.
361
+ # =========================================================================
362
+ - id: nl-sidecode5-heavycommercial
363
+ class: standard
364
+ categories: [truck, bus]
365
+ period: { start: 1994 } # 03-01-1994 — the oldest date RDW publishes
366
+ # for a still-listed series other than the
367
+ # 1951 GV block.
368
+ matching: strict
369
+ format:
370
+ pattern: "BL-LL-99"
371
+ regex: '\AB[A-Z]-[A-Z]{2}-\d{2}\z'
372
+ regex_strict: '\AB[BDFGHJKLMNPRSTVWXYZ]-[BDFGHJKLMNPRSTVWXYZ]{2}-\d{2}\z'
373
+ charset: { first_letter: [B], notes: "heavy commercial registrations always begin with B" }
374
+ design:
375
+ plate: { w: 520, h: 110, unit: mm }
376
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
377
+ foreground: "#000000"
378
+ band: { side: left, color: "#003399", content: eu-stars+NL }
379
+ band_note: >-
380
+ The EU band is a property of the CURRENT plate, not of the 1994 series:
381
+ plates made today for a 1994-series registration carry it. RDW does not
382
+ publish the date the band became mandatory in NL — recorded gap.
383
+ region_encoding: none
384
+ sources:
385
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Zware bedrijfsauto's: serie 5, combinatie XX-XX-99, ingangsdatum 03-01-1994"
386
+ - "https://www.rdw.nl/de-kentekenplaat/cijfers-en-letters-op-de-kentekenplaat # Zware bedrijfsauto's (boven 3500 kg): eerste letter B"
387
+ notes: >-
388
+ Sidecode 5 for HEAVY COMMERCIAL vehicles, from 03-01-1994. This is the ONLY
389
+ sidecode-5 rollout RDW publishes — the pattern's car-era dates are not on
390
+ any RDW page (recorded gap).
391
+
392
+ - id: nl-sidecode7-heavycommercial
393
+ class: standard
394
+ categories: [truck, bus]
395
+ period: { start: 2012 } # 20-07-2012
396
+ matching: strict
397
+ format:
398
+ pattern: "99-BLL-9"
399
+ regex: '\A\d{2}-B[A-Z]{2}-\d\z'
400
+ regex_strict: '\A\d{2}-B[BDFGHJKLMNPRSTVWXYZ]{2}-\d\z'
401
+ charset: { first_letter: [B] }
402
+ design:
403
+ plate: { w: 520, h: 110, unit: mm }
404
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
405
+ foreground: "#000000"
406
+ band: { side: left, color: "#003399", content: eu-stars+NL }
407
+ region_encoding: none
408
+ sources:
409
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Zware bedrijfsauto's: serie 7, combinatie 99-XXX-9, ingangsdatum 20-07-2012"
410
+ notes: >-
411
+ Sidecode 7 for HEAVY COMMERCIAL vehicles, from 20-07-2012 — four years after
412
+ the car rollout of the same pattern. Heavy commercials skipped sidecode 6.
413
+
414
+ # =========================================================================
415
+ # MOTORCYCLES — RDW "Motoren". First letter M.
416
+ # =========================================================================
417
+ - id: nl-sidecode6-motorcycle
418
+ class: motorcycle
419
+ categories: [motorcycle]
420
+ period: { start: 2011 } # 19-08-2011
421
+ matching: strict
422
+ format:
423
+ pattern: "99-ML-LL"
424
+ regex: '\A\d{2}-M[A-Z]-[A-Z]{2}\z'
425
+ regex_strict: '\A\d{2}-M[BDFGHJKLMNPRSTVWXYZ]-[BDFGHJKLMNPRSTVWXYZ]{2}\z'
426
+ charset: { first_letter: [M], notes: "motorcycle registrations always begin with M" }
427
+ design:
428
+ plate: { w: 210, h: 143, unit: mm }
429
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
430
+ foreground: "#000000"
431
+ band: { side: left, color: "#003399", content: eu-stars+NL }
432
+ rear_differs: false
433
+ note: "one plate, rear only (motorcycle model 27.10)"
434
+ region_encoding: none
435
+ sources:
436
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Motoren: serie 6, combinatie 99-XX-XX, ingangsdatum 19-08-2011"
437
+ - "https://www.rdw.nl/de-kentekenplaat/cijfers-en-letters-op-de-kentekenplaat # Motoren: eerste letter M"
438
+ - "https://www.rdw.nl/de-kentekenplaat/soorten-kentekenplaten # motorkentekenplaat 210x143 mm"
439
+ notes: >-
440
+ Sidecode 6 for MOTORCYCLES, from 19-08-2011 — eleven years after the same
441
+ pattern reached cars (20-01-2000). This is the ONLY motorcycle rollout on
442
+ RDW's table: motorcycles registered before 2011 carry earlier sidecodes
443
+ whose motorcycle dates RDW does not publish (recorded gap). The
444
+ 210x143 mm plate also serves three-wheelers, agricultural vehicles, MMBS,
445
+ mobile machines and agricultural trailers.
446
+
447
+ # =========================================================================
448
+ # MOPEDS — RDW "Brom- en snorfietsen". First letters D and F.
449
+ # Two options, so the pattern keeps its generic L and regex carries [DF].
450
+ # =========================================================================
451
+ - id: nl-sidecode7-moped
452
+ class: moped
453
+ categories: [moped]
454
+ period: { start: 2005 } # 01-09-2005
455
+ matching: strict
456
+ format:
457
+ pattern: "99-LLL-9"
458
+ regex: '\A\d{2}-[A-Z]{3}-\d\z'
459
+ regex_strict: '\A\d{2}-[DF][BDFGHJKLMNPRSTVWXYZ]{2}-\d\z'
460
+ charset: { first_letter: [D, F], notes: "moped registrations begin with D or F" }
461
+ design:
462
+ plate: { w: 145, h: 125, unit: mm }
463
+ plate_variants:
464
+ - { w: 100, h: 175, unit: mm, note: "staand (portrait) model 30.1" }
465
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
466
+ foreground: "#000000"
467
+ band: { side: left, color: "#003399", content: eu-stars+NL }
468
+ region_encoding: none
469
+ variants:
470
+ - class: moped
471
+ design: { background: { color: "#7CB9E8", finish: retroreflective, hex_basis: observed }, foreground: "#000000" }
472
+ note: >-
473
+ SNORFIETS (25 km/h max) carries the same registration on a LIGHT BLUE
474
+ plate — models 30.3 (portrait) / 30.4 (landscape). Yellow is the
475
+ 45 km/h bromfiets and the speed-pedelec. Colour-only variant, so a
476
+ sub-entry, but note this loses the light-blue/yellow distinction to
477
+ class-keyed queries (see the L0 report's schema stressors).
478
+ sources:
479
+ - "https://www.rdw.nl/zakelijke-partners/erkende-bedrijven/kentekenplaatfabrikanten/extra-eisen-per-kleur-en-model/kentekenplaat-voor-snor-of-bromfiets # 45 km/h = geel model 30.1/30.2; 25 km/h snorfiets = lichtblauw model 30.3/30.4"
480
+ sources:
481
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Brom- en snorfietsen: serie 7, combinatie 99-XXX-9, ingangsdatum 01-09-2005"
482
+ - "https://www.rdw.nl/de-kentekenplaat/cijfers-en-letters-op-de-kentekenplaat # Brom- en snorfietsen: eerste letters D en F"
483
+ - "https://www.rdw.nl/de-kentekenplaat/soorten-kentekenplaten # bromfietsplaat 145x125 liggend of 100x175 staand"
484
+ notes: >-
485
+ Sidecode 7 for MOPEDS, from 01-09-2005 — the NL moped registration
486
+ obligation's first series, and three years ahead of the car rollout of the
487
+ same pattern.
488
+
489
+ - id: nl-sidecode9-moped
490
+ class: moped
491
+ categories: [moped]
492
+ period: { start: 2006 } # 11-08-2006
493
+ matching: strict
494
+ format:
495
+ pattern: "LL-999-L"
496
+ regex: '\A[A-Z]{2}-\d{3}-[A-Z]\z'
497
+ regex_strict: '\A[DF][BDFGHJKLMNPRSTVWXYZ]-\d{3}-[BDFGHJKLMNPRSTVWXYZ]\z'
498
+ charset: { first_letter: [D, F] }
499
+ design:
500
+ plate: { w: 145, h: 125, unit: mm }
501
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
502
+ foreground: "#000000"
503
+ band: { side: left, color: "#003399", content: eu-stars+NL }
504
+ region_encoding: none
505
+ sources:
506
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Brom- en snorfietsen: serie 9, combinatie XX-999-X, ingangsdatum 11-08-2006"
507
+ notes: >-
508
+ Sidecode 9 for MOPEDS, from 11-08-2006 — NINE YEARS before cars reached the
509
+ same pattern (30-03-2015). Mopeds skipped sidecode 8 entirely.
510
+
511
+ - id: nl-sidecode10-moped
512
+ class: moped
513
+ categories: [moped]
514
+ period: { start: 2008 } # 11-12-2008
515
+ matching: strict
516
+ format:
517
+ pattern: "L-999-LL"
518
+ regex: '\A[A-Z]-\d{3}-[A-Z]{2}\z'
519
+ regex_strict: '\A[DF]-\d{3}-[BDFGHJKLMNPRSTVWXYZ]{2}\z'
520
+ charset: { first_letter: [D, F] }
521
+ design:
522
+ plate: { w: 145, h: 125, unit: mm }
523
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
524
+ foreground: "#000000"
525
+ band: { side: left, color: "#003399", content: eu-stars+NL }
526
+ region_encoding: none
527
+ sources:
528
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Brom- en snorfietsen: serie 10, combinatie X-999-XX, ingangsdatum 11-12-2008"
529
+ notes: Sidecode 10 for MOPEDS, from 11-12-2008 — eleven years ahead of the car rollout.
530
+
531
+ - id: nl-sidecode11-moped # seed id — PRESERVED
532
+ class: moped
533
+ categories: [moped]
534
+ period: { start: 2015 } # 16-01-2015 (seed said 2015 — confirmed)
535
+ matching: strict
536
+ format:
537
+ pattern: "LLL-99-L"
538
+ regex: '\A[A-Z]{3}-\d{2}-[A-Z]\z'
539
+ regex_strict: '\A[DF][BDFGHJKLMNPRSTVWXYZ]{2}-\d{2}-[BDFGHJKLMNPRSTVWXYZ]\z'
540
+ charset: { first_letter: [D, F] }
541
+ design:
542
+ plate: { w: 145, h: 125, unit: mm }
543
+ plate_variants:
544
+ - { w: 100, h: 175, unit: mm, note: "staand model" }
545
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
546
+ foreground: "#000000"
547
+ band: { side: left, color: "#003399", content: eu-stars+NL }
548
+ region_encoding: none
549
+ sources:
550
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Brom- en snorfietsen: serie 11, combinatie XXX-99-X, ingangsdatum 16-01-2015"
551
+ - "https://www.rdw.nl/de-kentekenplaat/soorten-kentekenplaten # colours + dimensions"
552
+ notes: >-
553
+ Sidecode 11 for MOPEDS, from 16-01-2015 — the pattern's FIRST rollout of all,
554
+ nine years before cars. Seed correction: the seed gave 520x110 as an implied
555
+ default and the D/F rule only in prose; dimensions here are the moped models.
556
+
557
+ - id: nl-sidecode12-specialmoped
558
+ class: moped
559
+ categories: [moped]
560
+ period: { start: 2025 } # 01-07-2025
561
+ matching: strict
562
+ format:
563
+ pattern: "E-99-LLL"
564
+ regex: '\AE-\d{2}-[A-Z]{3}\z'
565
+ regex_strict: '\AE-\d{2}-[BDFGHJKLMNPRSTVWXYZ]{3}\z'
566
+ charset: { first_letter: [E], notes: "bijzondere bromfietsen begin with E — the one place a VOWEL is issued outside the oplegger exception" }
567
+ design:
568
+ plate: { w: 100, h: 120, unit: mm }
569
+ background: { color: "#7CB9E8", finish: retroreflective, hex_basis: observed }
570
+ foreground: "#000000"
571
+ band: { side: left, color: "#003399", content: eu-stars+NL }
572
+ note: "model 31.1; mounted at the rear, but front-mounted on Ninebot Urban, Ninebot type E, Trikke and Paukool S1"
573
+ region_encoding: none
574
+ sources:
575
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Bijzondere bromfietsen: serie 12, combinatie X-99-XXX, ingangsdatum 01-07-2025"
576
+ - "https://www.rdw.nl/de-kentekenplaat/cijfers-en-letters-op-de-kentekenplaat # Bijzondere bromfietsen: eerste letter E"
577
+ - "https://www.rdw.nl/de-kentekenplaat/soorten-kentekenplaten # bijzondere bromfiets 100x120 mm; lichtblauw for 25 km/h"
578
+ - "https://www.rdw.nl/zakelijke-partners/erkende-bedrijven/kentekenplaatfabrikanten/extra-eisen-per-kleur-en-model/kentekenplaat-voor-snor-of-bromfiets # bijzondere bromfiets = lichtblauw, model 31.1"
579
+ notes: >-
580
+ Sidecode 12 for BIJZONDERE BROMFIETSEN (special mopeds — e-scooters and
581
+ similar light electric vehicles), from 01-07-2025. The newest NL series and
582
+ the smallest NL plate. Distinct from the 45 km/h bromfiets and the 25 km/h
583
+ snorfiets, both of which carry ordinary moped registrations.
584
+
585
+ # =========================================================================
586
+ # TRAILERS AND SEMI-TRAILERS — RDW "Aanhangwagens" / "Opleggers", both
587
+ # sidecode 4 from 01-10-1988, but different first letters (W vs O), which is
588
+ # exactly why they are two entries and not one.
589
+ # =========================================================================
590
+ - id: nl-sidecode4-trailer
591
+ class: trailer
592
+ categories: [trailer]
593
+ period: { start: 1988 } # 01-10-1988
594
+ matching: strict
595
+ format:
596
+ pattern: "WL-99-LL"
597
+ regex: '\AW[A-Z]-\d{2}-[A-Z]{2}\z'
598
+ regex_strict: '\AW[BDFGHJKLMNPRSTVWXYZ]-\d{2}-[BDFGHJKLMNPRSTVWXYZ]{2}\z'
599
+ charset: { first_letter: [W], notes: "trailer registrations always begin with W" }
600
+ design:
601
+ plate: { w: 520, h: 110, unit: mm }
602
+ plate_variants:
603
+ - { w: 340, h: 210, unit: mm }
604
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
605
+ foreground: "#000000"
606
+ band: { side: left, color: "#003399", content: eu-stars+NL }
607
+ note: "yellow plate + own registration only ABOVE 750 kg maximum permitted mass; at or below 750 kg the trailer repeats the towing vehicle's registration on a white plate"
608
+ region_encoding: none
609
+ sources:
610
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Aanhangwagens: serie 4, combinatie XX-99-XX, ingangsdatum 01-10-1988"
611
+ - "https://www.rdw.nl/de-kentekenplaat/cijfers-en-letters-op-de-kentekenplaat # Aanhangwagens: eerste letter W"
612
+ - "https://www.rdw.nl/zakelijke-partners/erkende-bedrijven/kentekenplaatfabrikanten/extra-eisen-per-kleur-en-model/kentekenplaat-voor-aanhangwagen-of-caravan # 'Het kenteken van een aanhangwagen begint altijd met de letter W'; >750 kg = eigen kenteken"
613
+ notes: >-
614
+ Sidecode 4 for TRAILERS AND CARAVANS over 750 kg, from 01-10-1988 — the
615
+ oldest continuously-issuing NL series on RDW's table, still not exhausted
616
+ after 38 years.
617
+
618
+ - id: nl-sidecode4-semitrailer
619
+ class: trailer
620
+ categories: [semitrailer]
621
+ period: { start: 1988 } # 01-10-1988
622
+ matching: strict
623
+ format:
624
+ pattern: "OL-99-LL"
625
+ regex: '\AO[A-Z]-\d{2}-[A-Z]{2}\z'
626
+ regex_strict: '\AO[ABDEFGHIJKLMNOPRSTUVWXYZ]-\d{2}-[ABDEFGHIJKLMNOPRSTUVWXYZ]{2}\z'
627
+ charset:
628
+ first_letter: [O]
629
+ notes: >-
630
+ Semi-trailer registrations always begin with O — and the no-vowels rule
631
+ is expressly disapplied for opleggers ("met uitzondering van het kenteken
632
+ voor opleggers"), so this is the one NL series whose regex_strict keeps
633
+ the vowels. C and Q remain excluded (nought-lookalikes).
634
+ design:
635
+ plate: { w: 520, h: 110, unit: mm }
636
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
637
+ foreground: "#000000"
638
+ band: { side: left, color: "#003399", content: eu-stars+NL }
639
+ region_encoding: none
640
+ sources:
641
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Opleggers: serie 4, combinatie XX-99-XX, ingangsdatum 01-10-1988"
642
+ - "https://www.rdw.nl/de-kentekenplaat/cijfers-en-letters-op-de-kentekenplaat # Opleggers: eerste letter O; no-vowels rule excepted for opleggers"
643
+ notes: >-
644
+ Sidecode 4 for SEMI-TRAILERS, from 01-10-1988 — same pattern and same date as
645
+ trailers but a different letter space, which is why RDW publishes them as two
646
+ tables and why they are two series here.
647
+
648
+ # =========================================================================
649
+ # AGRICULTURAL / MOBILE MACHINERY. First letter T for tractors, mobile
650
+ # machines and MMBS; L for agricultural trailers and interchangeable towed
651
+ # equipment. "L" collides with the pattern DSL's letter placeholder, so the
652
+ # L-prefix survives only in charset + regex_strict (schema stressor).
653
+ # =========================================================================
654
+ - id: nl-sidecode12-agritractor
655
+ class: agricultural
656
+ categories: [tractor, machine]
657
+ period: { start: 2021 } # 01-12-2021
658
+ matching: strict
659
+ format:
660
+ pattern: "T-99-LLL"
661
+ regex: '\AT-\d{2}-[A-Z]{3}\z'
662
+ regex_strict: '\AT-\d{2}-[BDFGHJKLMNPRSTVWXYZ]{3}\z'
663
+ charset: { first_letter: [T], notes: "agricultural/forestry tractors, mobile machines and MMBS all begin with T" }
664
+ design:
665
+ plate: { w: 520, h: 110, unit: mm }
666
+ plate_variants:
667
+ - { w: 340, h: 210, unit: mm }
668
+ - { w: 210, h: 143, unit: mm, note: "motorcycle-size model permitted for agricultural vehicles" }
669
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
670
+ foreground: "#000000"
671
+ band: { side: left, color: "#003399", content: eu-stars+NL }
672
+ region_encoding: none
673
+ sources:
674
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Land- en bosbouwtrekkers (trekkend): serie 12, combinatie X-99-XXX, ingangsdatum 01-12-2021"
675
+ - "https://www.rdw.nl/de-kentekenplaat/cijfers-en-letters-op-de-kentekenplaat # Land-/bosbouwtrekkers, mobiele machines, MMBS'en: eerste letter T"
676
+ - "https://www.rdw.nl/de-kentekenplaat/soorten-kentekenplaten # 520x110 / 340x210 / 210x143 for (land)bouwvoertuigen, MMBS, mobiele machines"
677
+ notes: >-
678
+ Sidecode 12 for AGRICULTURAL AND FORESTRY TRACTORS, mobile machines and MMBS,
679
+ from 01-12-2021 — the NL agricultural registration obligation. Sidecode 12
680
+ reached tractors before it reached light commercials (2024) or special
681
+ mopeds (2025).
682
+
683
+ - id: nl-sidecode11-agricultural # seed id — PRESERVED
684
+ class: agricultural
685
+ categories: [trailer] # CORRECTED from the seed's [truck]: this is the
686
+ # agricultural TRAILER / interchangeable towed
687
+ # equipment series (RDW's own table heading).
688
+ period: { start: 2021 } # 01-01-2021 (seed said 2021 — confirmed)
689
+ matching: strict
690
+ format:
691
+ pattern: "LLL-99-L"
692
+ regex: '\A[A-Z]{3}-\d{2}-[A-Z]\z'
693
+ regex_strict: '\AL[BDFGHJKLMNPRSTVWXYZ]{2}-\d{2}-[BDFGHJKLMNPRSTVWXYZ]\z'
694
+ charset:
695
+ first_letter: [L]
696
+ notes: >-
697
+ "Het kenteken van een aanhangwagen of verwisselbaar getrokken
698
+ uitrustingsstuk van een land- of bosbouwtrekker, MMBS of mobiele machine
699
+ begint altijd met de letter 'L'." The literal L CANNOT be written into
700
+ format.pattern because L is the pattern DSL's letter placeholder — it
701
+ survives only here and in regex_strict. See the L0 report.
702
+ design:
703
+ plate: { w: 520, h: 110, unit: mm }
704
+ plate_variants:
705
+ - { w: 340, h: 210, unit: mm }
706
+ - { w: 210, h: 143, unit: mm, note: "model 27.10 permitted for agricultural trailers" }
707
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
708
+ foreground: "#000000"
709
+ band: { side: left, color: "#003399", content: eu-stars+NL }
710
+ region_encoding: none
711
+ sources:
712
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Land- en bosbouwaanhangwagens en verwisselbare getrokken uitrustingsstukken: serie 11, combinatie XXX-99-X, ingangsdatum 01-01-2021"
713
+ - "https://www.rdw.nl/de-kentekenplaat/cijfers-en-letters-op-de-kentekenplaat # Land-/bosbouwaanhangwagens: eerste letter L"
714
+ - "https://www.rdw.nl/zakelijke-partners/erkende-bedrijven/kentekenplaatfabrikanten/extra-eisen-per-kleur-en-model/kentekenplaat-voor-aanhangwagen-of-caravan # 'begint altijd met de letter L'"
715
+ notes: >-
716
+ Sidecode 11 for AGRICULTURAL TRAILERS and interchangeable towed equipment,
717
+ from 01-01-2021. Seed correction: the seed carried categories [truck] and
718
+ called this "agricultural vehicles/trailers"; RDW's table separates the
719
+ TOWING agricultural vehicles (sidecode 12, first letter T, 01-12-2021) from
720
+ the TOWED ones (this entry, first letter L, 01-01-2021).
721
+
722
+ # =========================================================================
723
+ # GRENSVERKEER (GV). The only place RDW dates sidecodes 1, 2 and 3, and the
724
+ # only NL series whose LETTER GROUP IS A LITERAL: "GV - altijd in combinatie
725
+ # met 4 cijfers" (cijfers-en-letters). All five GV patterns carry exactly
726
+ # four digits and the pair GV, which is self-consistent with the shapes.
727
+ # =========================================================================
728
+ - id: nl-gv-sidecode1
729
+ class: agricultural
730
+ categories: [tractor, machine]
731
+ period: { start: 1951 }
732
+ matching: strict
733
+ format:
734
+ pattern: "GV-99-99"
735
+ regex: '\AGV-\d{2}-\d{2}\z'
736
+ charset: { fixed_letters: "GV", notes: "the letter pair is literally GV" }
737
+ design:
738
+ plate: { w: 520, h: 110, unit: mm }
739
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
740
+ foreground: "#000000"
741
+ band: { side: left, color: "#003399", content: eu-stars+NL }
742
+ region_encoding: none
743
+ sources:
744
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Grensverkeer (GV-serie): 1951, afwisselend series 1, 2 en 3; serie 1 = XX-99-99"
745
+ - "https://www.rdw.nl/de-kentekenplaat/cijfers-en-letters-op-de-kentekenplaat # 'Grensverkeer: GV - altijd in combinatie met 4 cijfers'"
746
+ notes: >-
747
+ GV series on SIDECODE 1 (XX-99-99), from 1951 — RDW's series page states the
748
+ national kenteken began in 1951 and that the GV series ran series 1, 2 and 3
749
+ alternately ("Afwisselend 1, 2 en 3"). CLASS CAVEAT: RDW publishes the GV
750
+ table under its "Landbouwvoertuigen, mobiele machines en MMBS'en" heading, so
751
+ the class is recorded as agricultural on that placement; RDW's plate pages do
752
+ not define the grensverkeer series' scope. Flagged for L1 verification.
753
+
754
+ - id: nl-gv-sidecode2
755
+ class: agricultural
756
+ categories: [tractor, machine]
757
+ period: { start: 1951 }
758
+ matching: strict
759
+ format:
760
+ pattern: "99-99-GV"
761
+ regex: '\A\d{2}-\d{2}-GV\z'
762
+ charset: { fixed_letters: "GV" }
763
+ design:
764
+ plate: { w: 520, h: 110, unit: mm }
765
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
766
+ foreground: "#000000"
767
+ band: { side: left, color: "#003399", content: eu-stars+NL }
768
+ region_encoding: none
769
+ sources:
770
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Grensverkeer: serie 2 = 99-99-XX, from 1951"
771
+ - "https://www.rdw.nl/de-kentekenplaat/cijfers-en-letters-op-de-kentekenplaat # GV always with 4 digits"
772
+ notes: >-
773
+ GV series on SIDECODE 2 (99-99-XX), from 1951. One of the three alternating
774
+ 1951 shapes; separate entry because a series is one PATTERN, and the parse
775
+ API must be able to score each shape independently.
776
+
777
+ - id: nl-gv-sidecode3
778
+ class: agricultural
779
+ categories: [tractor, machine]
780
+ period: { start: 1951 }
781
+ matching: strict
782
+ format:
783
+ pattern: "99-GV-99"
784
+ regex: '\A\d{2}-GV-\d{2}\z'
785
+ charset: { fixed_letters: "GV" }
786
+ design:
787
+ plate: { w: 520, h: 110, unit: mm }
788
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
789
+ foreground: "#000000"
790
+ band: { side: left, color: "#003399", content: eu-stars+NL }
791
+ region_encoding: none
792
+ sources:
793
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Grensverkeer: serie 3 = 99-XX-99, from 1951"
794
+ - "https://www.rdw.nl/de-kentekenplaat/cijfers-en-letters-op-de-kentekenplaat # GV always with 4 digits"
795
+ notes: >-
796
+ GV series on SIDECODE 3 (99-XX-99), from 1951. Third of the three alternating
797
+ 1951 shapes.
798
+
799
+ - id: nl-gv-sidecode13
800
+ class: agricultural
801
+ categories: [tractor, machine]
802
+ period: { start: 2016 } # 23-05-2016
803
+ matching: strict
804
+ format:
805
+ pattern: "9-GV-999"
806
+ regex: '\A\d-GV-\d{3}\z'
807
+ charset: { fixed_letters: "GV" }
808
+ design:
809
+ plate: { w: 520, h: 110, unit: mm }
810
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
811
+ foreground: "#000000"
812
+ band: { side: left, color: "#003399", content: eu-stars+NL }
813
+ region_encoding: none
814
+ sources:
815
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Grensverkeer: serie 13, combinatie 9-XX-999, ingangsdatum 23-05-2016"
816
+ - "https://www.rdw.nl/de-kentekenplaat/cijfers-en-letters-op-de-kentekenplaat # GV always with 4 digits"
817
+ notes: >-
818
+ GV series on SIDECODE 13, from 23-05-2016. Sidecode 13 exists ONLY for the GV
819
+ series — no other NL category has ever been issued this pattern, which makes
820
+ a 9-GV-999 plate a one-shot identification.
821
+
822
+ - id: nl-gv-sidecode14
823
+ class: agricultural
824
+ categories: [tractor, machine]
825
+ period: { start: 2019 } # 13-06-2019
826
+ matching: strict
827
+ format:
828
+ pattern: "999-GV-9"
829
+ regex: '\A\d{3}-GV-\d\z'
830
+ charset: { fixed_letters: "GV" }
831
+ design:
832
+ plate: { w: 520, h: 110, unit: mm }
833
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
834
+ foreground: "#000000"
835
+ band: { side: left, color: "#003399", content: eu-stars+NL }
836
+ region_encoding: none
837
+ sources:
838
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Grensverkeer: serie 14, combinatie 999-XX-9, ingangsdatum 13-06-2019"
839
+ - "https://www.rdw.nl/de-kentekenplaat/cijfers-en-letters-op-de-kentekenplaat # GV always with 4 digits"
840
+ notes: >-
841
+ GV series on SIDECODE 14, from 13-06-2019 — the highest sidecode RDW
842
+ publishes, and like sidecode 13 exclusive to the GV series.
843
+
844
+ # =========================================================================
845
+ # HISTORIC (donkerblauw). A DESIGN REGIME laid over pre-existing sidecode
846
+ # 1/2/3 registrations, not a serial series of its own: RDW requires the
847
+ # registration to consist of "2 groepen van 2 cijfers en 1 groep van 2
848
+ # letters", which is exactly sidecodes 1, 2 and 3. Hence three entries plus
849
+ # one for the agricultural exemption.
850
+ # =========================================================================
851
+ - id: nl-historic-darkblue # seed id — PRESERVED
852
+ class: historic
853
+ categories: [car, van, motorcycle]
854
+ period: { start: 1978 }
855
+ period_evidence: eligibility-cutoff # NOT an issuance-start claim; see notes
856
+ matching: strict
857
+ format:
858
+ pattern: "LL-99-99"
859
+ regex: '\A[A-Z]{2}-\d{2}-\d{2}\z'
860
+ regex_strict: '\A[BDFGHJKLMNPRSTVWXYZ]{2}-\d{2}-\d{2}\z'
861
+ charset: { notes: "sidecode-1 shape; the historic regime accepts only registrations of 2+2 digits and 2 letters" }
862
+ design:
863
+ plate: { w: 445, h: 105, unit: mm }
864
+ plate_variants:
865
+ - { w: 275, h: 195, unit: mm, note: "rechthoekig" }
866
+ - { w: 200, h: 145, unit: mm, note: "motorcycle, 200 mm maximum" }
867
+ - { w: 310, h: 110, unit: mm, note: "American model 18.2 in dark blue" }
868
+ background: { color: "#1D2E5B", finish: painted, hex_basis: observed }
869
+ foreground: "#FFFFFF"
870
+ band: { side: none }
871
+ note: "models 1.1 to 18.1; no duplicaatcode and no lamineercode, and not registered in GAIK"
872
+ region_encoding: none
873
+ sources:
874
+ - "https://www.rdw.nl/de-kentekenplaat/soorten-kentekenplaten # donkerblauwe plaat, DET before 1-1-1978, kenteken = 2 groepen van 2 cijfers en 1 groep van 2 letters; 445x105 / 275x195 / 200x145 / 310x110"
875
+ - "https://www.rdw.nl/de-kentekenplaat/kentekenplaten-voor-oldtimer-aanvragen # eligibility (auto, bedrijfsauto, kampeerauto, motor, landbouwvoertuig, mobiele machine, aanhangwagen >=751 kg); mopeds excluded; EUR 50 to swap to a historisch kenteken"
876
+ - "https://www.rdw.nl/zakelijke-partners/erkende-bedrijven/kentekenplaatfabrikanten/extra-eisen-per-kleur-en-model/donkerblauwe-kentekenplaten-historisch # models 1.1 t/m 18.1; no duplicaatcode/lamineercode; not registered in GAIK"
877
+ notes: >-
878
+ Oldtimer regime on a SIDECODE-1 registration (XX-99-99). SEED CORRECTIONS,
879
+ both material: (1) the seed set `ended: true`; RDW still issues these today
880
+ (the oldtimer page takes applications and prices the swap at EUR 50), so the
881
+ series is OPEN. (2) The seed's pattern was flagged "refine in the L0
882
+ completion pass" — refined here: RDW's eligibility text pins the accepted
883
+ shapes to exactly sidecodes 1, 2 and 3, so the regime is modelled as three
884
+ format entries plus the agricultural exemption. period.start 1978 records the
885
+ ELIGIBILITY CUTOFF ("datum eerste toelating" before 1 January 1978), not an
886
+ issuance start — the date the dark-blue regime itself began is on no RDW page
887
+ and is a recorded gap.
888
+
889
+ - id: nl-historic-darkblue-sidecode2
890
+ class: historic
891
+ categories: [car, van, motorcycle]
892
+ period: { start: 1978 }
893
+ period_evidence: eligibility-cutoff
894
+ matching: strict
895
+ format:
896
+ pattern: "99-99-LL"
897
+ regex: '\A\d{2}-\d{2}-[A-Z]{2}\z'
898
+ regex_strict: '\A\d{2}-\d{2}-[BDFGHJKLMNPRSTVWXYZ]{2}\z'
899
+ design:
900
+ plate: { w: 445, h: 105, unit: mm }
901
+ background: { color: "#1D2E5B", finish: painted, hex_basis: observed }
902
+ foreground: "#FFFFFF"
903
+ band: { side: none }
904
+ region_encoding: none
905
+ sources:
906
+ - "https://www.rdw.nl/de-kentekenplaat/soorten-kentekenplaten # the 2+2 digits / 2 letters rule admits the sidecode-2 shape 99-99-XX"
907
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # sidecode 2 = 99-99-XX"
908
+ notes: >-
909
+ Oldtimer regime on a SIDECODE-2 registration (99-99-XX). Second of the three
910
+ shapes RDW's "2 groepen van 2 cijfers en 1 groep van 2 letters" rule admits.
911
+
912
+ - id: nl-historic-darkblue-sidecode3
913
+ class: historic
914
+ categories: [car, van, motorcycle]
915
+ period: { start: 1978 }
916
+ period_evidence: eligibility-cutoff
917
+ matching: strict
918
+ format:
919
+ pattern: "99-LL-99"
920
+ regex: '\A\d{2}-[A-Z]{2}-\d{2}\z'
921
+ regex_strict: '\A\d{2}-[BDFGHJKLMNPRSTVWXYZ]{2}-\d{2}\z'
922
+ design:
923
+ plate: { w: 445, h: 105, unit: mm }
924
+ background: { color: "#1D2E5B", finish: painted, hex_basis: observed }
925
+ foreground: "#FFFFFF"
926
+ band: { side: none }
927
+ region_encoding: none
928
+ sources:
929
+ - "https://www.rdw.nl/de-kentekenplaat/soorten-kentekenplaten # the 2+2 digits / 2 letters rule admits the sidecode-3 shape 99-XX-99"
930
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # sidecode 3 = 99-XX-99"
931
+ notes: >-
932
+ Oldtimer regime on a SIDECODE-3 registration (99-XX-99). Third of the three
933
+ admitted shapes. A vehicle whose registration has another shape must first
934
+ swap to a "historisch kenteken" before blue plates can be made.
935
+
936
+ - id: nl-historic-darkblue-agricultural
937
+ class: historic
938
+ categories: [tractor, machine, trailer]
939
+ period: { start: 1978 }
940
+ period_evidence: eligibility-cutoff
941
+ # RECALL-ONLY (PRD-PLATES §2.7): RDW exempts these vehicles from the
942
+ # 2+2+2 registration-shape rule, so the regex is the same fourteen-shape
943
+ # union as nl-export. A match is a SHAPE hit — it says the string has a
944
+ # shape the Netherlands has issued, not that it is a valid historic
945
+ # agricultural registration.
946
+ matching: recall-only
947
+ format:
948
+ pattern: "LLL-99-L"
949
+ regex: '\A(?:[A-Z]{2}-\d{2}-\d{2}|\d{2}-\d{2}-[A-Z]{2}|\d{2}-[A-Z]{2}-\d{2}|[A-Z]{2}-\d{2}-[A-Z]{2}|[A-Z]{2}-[A-Z]{2}-\d{2}|\d{2}-[A-Z]{2}-[A-Z]{2}|\d{2}-[A-Z]{3}-\d|\d-[A-Z]{3}-\d{2}|[A-Z]{2}-\d{3}-[A-Z]|[A-Z]-\d{3}-[A-Z]{2}|[A-Z]{3}-\d{2}-[A-Z]|[A-Z]-\d{2}-[A-Z]{3}|\d-[A-Z]{2}-\d{3}|\d{3}-[A-Z]{2}-\d)\z'
950
+ pattern_note: >-
951
+ The pattern shown is ONE representative shape (sidecode 11). This series has
952
+ no format of its own: RDW expressly exempts agricultural vehicles, mobile
953
+ machines and >=751 kg trailers from the 2+2+2 rule ("Bij een landbouwvoertuig
954
+ hoeft het kenteken niet 'historisch' te zijn"), so ANY current NL sidecode may
955
+ appear on a dark-blue plate here. The regex is therefore the union of all
956
+ fourteen RDW-published sidecode shapes.
957
+ design:
958
+ plate: { w: 445, h: 105, unit: mm }
959
+ background: { color: "#1D2E5B", finish: painted, hex_basis: observed }
960
+ foreground: "#FFFFFF"
961
+ band: { side: none }
962
+ region_encoding: none
963
+ sources:
964
+ - "https://www.rdw.nl/de-kentekenplaat/kentekenplaten-voor-oldtimer-aanvragen # agricultural vehicles, mobile machines and trailers >=751 kg need only pre-1978 first admission"
965
+ - "https://www.rdw.nl/zakelijke-partners/erkende-bedrijven/kentekenplaatfabrikanten/extra-eisen-per-kleur-en-model/donkerblauwe-kentekenplaten-historisch # 'Bij een landbouwvoertuig hoeft het kenteken niet historisch te zijn'"
966
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # the fourteen sidecode shapes the union regex is built from"
967
+ notes: >-
968
+ Oldtimer regime for AGRICULTURAL vehicles, mobile machines, MMBS and trailers
969
+ of 751 kg or more, which RDW exempts from the 2+2+2 registration-shape rule.
970
+ The only NL entry whose regex is a union rather than a single shape.
971
+
972
+ # =========================================================================
973
+ # EXPORT. RDW: the export plate REUSES the vehicle's existing registration,
974
+ # so its regex is the union of all NL shapes, exactly like the agricultural
975
+ # historic entry above, and for the same sourced reason.
976
+ # =========================================================================
977
+ - id: nl-export
978
+ class: export
979
+ categories: [car, van, truck, bus, motorcycle, moped, trailer, semitrailer, tractor, machine]
980
+ period: { start: 1951 }
981
+ period_evidence: earliest-underlying-series # the regime's own start is unsourced
982
+ # RECALL-ONLY (PRD-PLATES §2.7): the export plate carries the vehicle's
983
+ # OWN existing registration, so the regex is the union of all fourteen
984
+ # RDW sidecode shapes. A match is a SHAPE hit, never the claim that the
985
+ # string is a valid export registration — the union admits vowel serials
986
+ # the standard series reject. This is the field the vehicles gem's
987
+ # Match#strict? needs and could not previously read (issue #124).
988
+ matching: recall-only
989
+ format:
990
+ pattern: "LLL-99-L"
991
+ regex: '\A(?:[A-Z]{2}-\d{2}-\d{2}|\d{2}-\d{2}-[A-Z]{2}|\d{2}-[A-Z]{2}-\d{2}|[A-Z]{2}-\d{2}-[A-Z]{2}|[A-Z]{2}-[A-Z]{2}-\d{2}|\d{2}-[A-Z]{2}-[A-Z]{2}|\d{2}-[A-Z]{3}-\d|\d-[A-Z]{3}-\d{2}|[A-Z]{2}-\d{3}-[A-Z]|[A-Z]-\d{3}-[A-Z]{2}|[A-Z]{3}-\d{2}-[A-Z]|[A-Z]-\d{2}-[A-Z]{3}|\d-[A-Z]{2}-\d{3}|\d{3}-[A-Z]{2}-\d)\z'
992
+ pattern_note: "representative shape only; the regex is the union of all fourteen RDW sidecode shapes because the export plate carries the vehicle's existing registration"
993
+ design:
994
+ plate: { w: 520, h: 110, unit: mm }
995
+ plate_variants:
996
+ - { w: 340, h: 210, unit: mm }
997
+ - { w: 210, h: 143, unit: mm, note: "motorcycle" }
998
+ - { w: 100, h: 175, unit: mm, note: "moped, portrait" }
999
+ - { w: 145, h: 125, unit: mm, note: "moped, landscape" }
1000
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
1001
+ foreground: "#000000"
1002
+ band: { side: none }
1003
+ note: "models 27.24 (long) / 27.25 (rectangular) / 27.26 (motorcycle) / 30.13 / 30.14; owners may make these plates themselves; no duplicaatcode, no lamineercode, not registered in GAIK"
1004
+ validity: { days: 14, note: "valid 14 days, and never longer than the vehicle's APK (roadworthiness) certificate" }
1005
+ region_encoding: none
1006
+ sources:
1007
+ - "https://www.rdw.nl/de-kentekenplaat/soorten-kentekenplaten # uitvoerkentekenplaat: wit met zwarte cijfers en letters; 'U mag hiervoor het bestaande kenteken van het voertuig gebruiken'; 14 dagen geldig, niet langer dan de APK"
1008
+ - "https://www.rdw.nl/zakelijke-partners/erkende-bedrijven/kentekenplaatfabrikanten/extra-eisen-per-kleur-en-model/witte-kentekenplaten-tijdelijk # export models 27.24/27.25/27.26/30.13/30.14; checked against papieren kentekenbewijs deel II voor uitvoer"
1009
+ notes: >-
1010
+ EXPORT plates (uitvoerkentekenplaat). White with black characters, carrying
1011
+ the vehicle's OWN existing registration, valid 14 days. period.start records
1012
+ the earliest date any reusable NL registration was issued (1951), not the
1013
+ date the export regime began — that date is on no RDW page and is a recorded
1014
+ gap. Distinct from the TRANSIT (transito) plate, which issues a NEW number to
1015
+ a vehicle that never held a Dutch registration; the transit number's grammar
1016
+ is not published by RDW and is therefore NOT modelled here (see the L0 report).