@ham2k/lib-operation-data 1.1.3 → 1.2.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.
package/dist/index.cjs CHANGED
@@ -200,8 +200,28 @@ function frequencyForBand(band, mode) {
200
200
  // src/data/bandPlans.json
201
201
  var bandPlans_default = {
202
202
  bands: {
203
+ "2190m": {
204
+ mhz: [135.7, 137.8],
205
+ exceptLevels: ["at:3", "at:4", "au:F", "au:S", "be:C", "be:B", "bg:2", "ca:B", "ch:HB3", "cl:ASP", "cl:N", "cn:A", "cz:N", "de:N", "de:E", "dk:D", "hr:P", "hu:KEZDO", "hu:NOVICE", "id:SIAGA", "my:C", "my:B", "nl:N", "no:begrenset", "rs:C", "rs:B", "ru:4", "se:insteg", "si:N", "ua:C", "ua:B", "us:N", "us:T"],
206
+ segments: [
207
+ { name: "JP 4th Class: DATA only", mhz: [135.7, 137.8], levels: ["jp:4"], superModes: ["DATA"] }
208
+ ]
209
+ },
210
+ "630m": {
211
+ mhz: [472, 479],
212
+ exceptLevels: ["at:3", "at:4", "au:F", "au:S", "be:C", "be:B", "bg:2", "ca:B", "ch:HB3", "cl:ASP", "cl:N", "de:N", "de:E", "dk:D", "gb:F", "gb:I", "hr:P", "hu:KEZDO", "hu:NOVICE", "id:SIAGA", "my:C", "my:B", "nl:N", "no:begrenset", "rs:C", "rs:B", "se:insteg", "si:N", "us:N", "us:T"],
213
+ segments: [
214
+ { name: "JP 4th Class: DATA only", mhz: [472, 479], levels: ["jp:4"], superModes: ["DATA"] }
215
+ ]
216
+ },
217
+ "560m": {
218
+ mhz: [501, 504],
219
+ exceptLevels: ["be:C", "be:B"],
220
+ segments: []
221
+ },
203
222
  "160m": {
204
223
  mhz: [1800, 2e3],
224
+ exceptLevels: ["at:3", "au:F", "au:S", "be:C", "bg:2", "ca:B", "cl:ASP", "cl:N", "cn:A", "de:N", "dk:D", "hr:P", "hu:KEZDO", "id:SIAGA", "kr:4", "my:C", "my:B", "nl:N", "no:begrenset", "rs:C", "rs:B", "ru:4", "se:insteg", "si:N", "us:N", "us:T"],
205
225
  segments: [
206
226
  { name: "Out of band Reg1", mhz: [1800, 1810], mode: false, regions: [1] },
207
227
  { name: "CW Reg1", mhz: [1810, 1838], mode: "CW", regions: [1] },
@@ -209,11 +229,18 @@ var bandPlans_default = {
209
229
  { name: "CW", mhz: [1800, 1843], mode: "CW" },
210
230
  { name: "FT8", mhz: [1840, 1843], mode: "FT8", priority: 100 },
211
231
  { name: "Phone", mhz: [1843, 2e3], mode: "SSB", submode: "LSB" },
212
- { name: "Australia", mhz: [1800, 1875], mode: null, countries: ["au"] }
232
+ { name: "Australia", mhz: [1800, 1875], mode: null, countries: ["au"] },
233
+ { name: "BR: Class A only", mhz: [1850, 2e3], exceptLevels: ["br:C", "br:B"] },
234
+ { name: "CZ: Class A only", mhz: [1810, 1830], exceptLevels: ["cz:N"] },
235
+ { name: "HU: CEPT (full) only", mhz: [1850, 2e3], exceptLevels: ["hu:NOVICE"] },
236
+ { name: "JP 4th Class: DATA only", mhz: [1907.5, 1912.5], levels: ["jp:4"], superModes: ["DATA"] },
237
+ { name: "UA Entry level (student): DATA only", mhz: [1840, 1842], levels: ["ua:C"], superModes: ["DATA"] },
238
+ { name: "UA: Novice, Higher qualification (HAREC) only", mhz: [1842, 1850], exceptLevels: ["ua:C"] }
213
239
  ]
214
240
  },
215
241
  "80m": {
216
- mhz: [3500, 3800],
242
+ mhz: [3500, 4e3],
243
+ exceptLevels: ["at:3", "bg:2", "ca:B", "cn:A", "de:N", "dk:D", "kr:4", "my:C", "nl:N", "ru:4", "se:insteg"],
217
244
  segments: [
218
245
  { name: "CW Reg1", mhz: [3500, 3570], mode: "CW", regions: [1] },
219
246
  { name: "CW", mhz: [3500, 3600], mode: "CW" },
@@ -222,11 +249,27 @@ var bandPlans_default = {
222
249
  { name: "Data", mhz: [3570, 3600], mode: "RTTY" },
223
250
  { name: "FT8", mhz: [3573, 3576], mode: "FT8", priority: 100 },
224
251
  { name: "Phone", mhz: [3600, 4e3], mode: "SSB", submode: "LSB" },
225
- { name: "Australia", mhz: [3500, 3800], mode: null, countries: ["au"] }
252
+ { name: "Australia", mhz: [3500, 3800], mode: null, countries: ["au"] },
253
+ { name: "AU: Advanced only", mhz: [3776, 3800], exceptLevels: ["au:F", "au:S"] },
254
+ { name: "BR: Class A only", mhz: [3800, 4e3], exceptLevels: ["br:C", "br:B"] },
255
+ { name: "CZ: Class A only", mhz: [3500, 3550], exceptLevels: ["cz:N"] },
256
+ { name: "CZ: Class A only", mhz: [3700, 3800], exceptLevels: ["cz:N"] },
257
+ { name: "UA: Novice, Higher qualification (HAREC) only", mhz: [3650, 3700], exceptLevels: ["ua:C"] },
258
+ { name: "UA: Higher qualification (HAREC) only", mhz: [3700, 3730], exceptLevels: ["ua:C", "ua:B"] },
259
+ { name: "UA: Novice, Higher qualification (HAREC) only", mhz: [3730, 3740], exceptLevels: ["ua:C"] },
260
+ { name: "UA Novice: DATA only", mhz: [3730, 3740], levels: ["ua:B"], superModes: ["DATA"] },
261
+ { name: "UA: Higher qualification (HAREC) only", mhz: [3740, 3800], exceptLevels: ["ua:C", "ua:B"] },
262
+ { name: "US: Amateur Extra only", mhz: [3500, 3525], exceptLevels: ["us:N", "us:T", "us:G", "us:A"] },
263
+ { name: "US Novice, Technician: CW only", mhz: [3525, 3600], levels: ["us:N", "us:T"], superModes: ["CW"] },
264
+ { name: "US: Amateur Extra only", mhz: [3600, 3700], exceptLevels: ["us:N", "us:T", "us:G", "us:A"] },
265
+ { name: "US: Advanced, Amateur Extra only", mhz: [3700, 3800], exceptLevels: ["us:N", "us:T", "us:G"] },
266
+ { name: "US: General, Advanced, Amateur Extra only", mhz: [3800, 3900], exceptLevels: ["us:N", "us:T"] },
267
+ { name: "US: General, Advanced, Amateur Extra only", mhz: [3900, 4e3], regions: [2], exceptLevels: ["us:N", "us:T"] }
226
268
  ]
227
269
  },
228
270
  "60m": {
229
- mhz: [5330.5, 3406.5],
271
+ mhz: [5250, 5450],
272
+ exceptLevels: ["at:3", "at:4", "be:C", "be:B", "bg:2", "br:C", "br:B", "ca:B", "ch:HB3", "cl:ASP", "cl:N", "cn:A", "de:N", "de:E", "dk:D", "gb:F", "gb:I", "hr:P", "hu:KEZDO", "hu:NOVICE", "id:SIAGA", "id:PENGGALANG", "my:C", "nl:N", "no:begrenset", "rs:C", "rs:B", "se:insteg", "si:N", "us:N", "us:T"],
230
273
  segments: [
231
274
  { name: "60m Channel 1", mhz: [5330.5, 5333.5] },
232
275
  { name: "60m Channel 2", mhz: [5346.5, 5349.5] },
@@ -237,6 +280,7 @@ var bandPlans_default = {
237
280
  },
238
281
  "40m": {
239
282
  mhz: [7e3, 7300],
283
+ exceptLevels: ["at:3", "at:4", "bg:2", "ca:B", "ch:HB3", "cn:A", "cz:N", "de:N", "de:E", "dk:D", "kr:4", "my:C", "ru:4"],
240
284
  segments: [
241
285
  { name: "CW", mhz: [7e3, 7060], mode: "CW" },
242
286
  { name: "CW Reg1", mhz: [7e3, 7040], mode: "CW", regions: [1] },
@@ -247,11 +291,22 @@ var bandPlans_default = {
247
291
  { name: "Data", mhz: [7080, 7125], mode: "RTTY", countries: ["us"] },
248
292
  { name: "Phone", mhz: [7125, 7300], mode: "SSB", submode: "LSB", countries: ["us"] },
249
293
  { name: "Australia", mhz: [7e3, 7300], mode: null, countries: ["au"] },
250
- { name: "Out of band Reg1", mhz: [7200, 7300], mode: false, regions: [1] }
294
+ { name: "Out of band Reg1", mhz: [7200, 7300], mode: false, regions: [1] },
295
+ { name: "BR: Class B, Class A only", mhz: [7047, 7300], exceptLevels: ["br:C"] },
296
+ { name: "HU: CEPT Novice, CEPT (full) only", mhz: [7100, 7175], exceptLevels: ["hu:KEZDO"] },
297
+ { name: "UA Entry level (student): CW only", mhz: [7040, 7050], levels: ["ua:C"], superModes: ["CW"] },
298
+ { name: "UA Entry level (student): CW/PHONE only", mhz: [7050, 7080], levels: ["ua:C"], superModes: ["CW", "PHONE"] },
299
+ { name: "UA: Higher qualification (HAREC) only", mhz: [7100, 7200], exceptLevels: ["ua:C", "ua:B"] },
300
+ { name: "US: Amateur Extra only", mhz: [7e3, 7025], exceptLevels: ["us:N", "us:T", "us:G", "us:A"] },
301
+ { name: "US Novice, Technician: CW only", mhz: [7025, 7125], levels: ["us:N", "us:T"], superModes: ["CW"] },
302
+ { name: "US: Advanced, Amateur Extra only", mhz: [7125, 7175], exceptLevels: ["us:N", "us:T", "us:G"] },
303
+ { name: "US: General, Advanced, Amateur Extra only", mhz: [7175, 7200], exceptLevels: ["us:N", "us:T"] },
304
+ { name: "US: General, Advanced, Amateur Extra only", mhz: [7200, 7300], regions: [2], exceptLevels: ["us:N", "us:T"] }
251
305
  ]
252
306
  },
253
307
  "30m": {
254
308
  mhz: [10100, 10150],
309
+ exceptLevels: ["ar:N", "ar:G", "at:3", "at:4", "au:F", "au:S", "bg:2", "br:C", "br:B", "ca:B", "ch:HB3", "cl:ASP", "cn:A", "cz:N", "de:N", "de:E", "dk:D", "hr:P", "hu:KEZDO", "hu:NOVICE", "id:SIAGA", "id:PENGGALANG", "jp:4", "jp:3", "kr:4", "kr:3P", "kr:3T", "my:C", "nl:N", "no:begrenset", "rs:C", "rs:B", "ru:4", "se:insteg", "si:N", "us:N", "us:T"],
255
310
  segments: [
256
311
  { name: "CW", mhz: [10100, 10150], mode: "CW" },
257
312
  { name: "CW Reg1", mhz: [10100, 10130], mode: "CW", regions: [1] },
@@ -259,11 +314,13 @@ var bandPlans_default = {
259
314
  { name: "FT8", mhz: [10136, 10139], mode: "FT8", priority: 100 },
260
315
  { name: "FT4", mhz: [10140, 10143], mode: "FT4", priority: 100 },
261
316
  { name: "Australia & New Zealand", mhz: [10100, 10150], mode: null, countries: ["au", "nz"] },
262
- { name: "Africa south of the Equator", mhz: [10100, 10150], mode: null, countries: ["ao", "bi", "bw", "cd", "cg", "ga", "ke", "km", "ls", "mg", "mu", "mw", "mz", "na", "rw", "sc", "so", "st", "sz", "tz", "ug", "za", "zm", "zw"] }
317
+ { name: "Africa south of the Equator", mhz: [10100, 10150], mode: null, countries: ["ao", "bi", "bw", "cd", "cg", "ga", "ke", "km", "ls", "mg", "mu", "mw", "mz", "na", "rw", "sc", "so", "st", "sz", "tz", "ug", "za", "zm", "zw"] },
318
+ { name: "UA Entry level (student): CW only", mhz: [10136, 10150], levels: ["ua:C"], superModes: ["CW"] }
263
319
  ]
264
320
  },
265
321
  "20m": {
266
322
  mhz: [14e3, 14350],
323
+ exceptLevels: ["at:3", "at:4", "au:F", "bg:2", "br:C", "br:B", "ca:B", "ch:HB3", "cl:ASP", "cl:N", "cn:A", "cz:N", "de:N", "de:E", "dk:D", "id:SIAGA", "jp:4", "jp:3", "kr:4", "kr:3P", "kr:3T", "my:C", "rs:C", "ru:4", "si:N", "ua:C", "us:N", "us:T"],
267
324
  segments: [
268
325
  { name: "CW", mhz: [14e3, 14150], mode: "CW" },
269
326
  { name: "CW Reg1", mhz: [14e3, 14070], mode: "CW", regions: [1] },
@@ -273,11 +330,27 @@ var bandPlans_default = {
273
330
  { name: "FT4", mhz: [14080, 14083], mode: "FT4", priority: 100 },
274
331
  { name: "Phone", mhz: [14112, 14350], mode: "SSB", submode: "USB", regions: [1, 2] },
275
332
  { name: "Phone", mhz: [14150, 14350], mode: "SSB", submode: "USB", countries: ["us"] },
276
- { name: "Australia", mhz: [14e3, 14350], mode: null, countries: ["au"] }
333
+ { name: "Australia", mhz: [14e3, 14350], mode: null, countries: ["au"] },
334
+ { name: "AR: General, Superior, Special only", mhz: [14e3, 14070], exceptLevels: ["ar:N"] },
335
+ { name: "AR Novice: CW/DATA only", mhz: [14070, 14099], levels: ["ar:N"], superModes: ["CW", "DATA"] },
336
+ { name: "AR: General, Superior, Special only", mhz: [14099, 14350], exceptLevels: ["ar:N"] },
337
+ { name: "HR: Class A only", mhz: [14e3, 14040], exceptLevels: ["hr:P"] },
338
+ { name: "HR: Class A only", mhz: [14150, 14280], exceptLevels: ["hr:P"] },
339
+ { name: "HU: CEPT Novice, CEPT (full) only", mhz: [14300, 14350], exceptLevels: ["hu:KEZDO"] },
340
+ { name: "ID Advanced: CW only", mhz: [14e3, 14070], levels: ["id:PENGGALANG"], superModes: ["CW"] },
341
+ { name: "ID Advanced: DATA only", mhz: [14070, 14110], levels: ["id:PENGGALANG"], superModes: ["DATA"] },
342
+ { name: "ID: Extra Class only", mhz: [14150, 14350], exceptLevels: ["id:PENGGALANG"] },
343
+ { name: "UA Novice: CW/DATA only", mhz: [14100, 14112], levels: ["ua:B"], superModes: ["CW", "DATA"] },
344
+ { name: "UA Novice: CW only", mhz: [14112, 14250], levels: ["ua:B"], superModes: ["CW"] },
345
+ { name: "UA: Higher qualification (HAREC) only", mhz: [14250, 14350], exceptLevels: ["ua:B"] },
346
+ { name: "US: Amateur Extra only", mhz: [14e3, 14025], exceptLevels: ["us:G", "us:A"] },
347
+ { name: "US: Amateur Extra only", mhz: [14150, 14175], exceptLevels: ["us:G", "us:A"] },
348
+ { name: "US: Advanced, Amateur Extra only", mhz: [14175, 14225], exceptLevels: ["us:G"] }
277
349
  ]
278
350
  },
279
351
  "17m": {
280
352
  mhz: [18068, 18168],
353
+ exceptLevels: ["ar:N", "at:3", "at:4", "au:F", "au:S", "be:C", "bg:2", "br:C", "br:B", "ca:B", "ch:HB3", "cl:ASP", "cl:N", "cn:A", "cz:N", "de:N", "de:E", "dk:D", "hr:P", "hu:KEZDO", "hu:NOVICE", "id:SIAGA", "id:PENGGALANG", "jp:4", "kr:4", "kr:3P", "kr:3T", "my:C", "nl:N", "rs:C", "rs:B", "ru:4", "se:insteg", "si:N", "us:N", "us:T"],
281
354
  segments: [
282
355
  { name: "CW", mhz: [18068, 18110], mode: "CW" },
283
356
  { name: "CW Reg1", mhz: [18068, 18095], mode: "CW", regions: [1] },
@@ -287,11 +360,13 @@ var bandPlans_default = {
287
360
  { name: "Beacons only", mhz: [18109, 18111], priority: 100 },
288
361
  { name: "Phone", mhz: [18111, 18168], mode: "SSB", submode: "USB" },
289
362
  { name: "Phone US", mhz: [18110, 18168], mode: "SSB", submode: "USB", countries: ["us"] },
290
- { name: "Australia", mhz: [18068, 18168], mode: null, countries: ["au"] }
363
+ { name: "Australia", mhz: [18068, 18168], mode: null, countries: ["au"] },
364
+ { name: "UA Entry level (student): CW only", mhz: [18100, 18168], levels: ["ua:C"], superModes: ["CW"] }
291
365
  ]
292
366
  },
293
367
  "15m": {
294
368
  mhz: [21e3, 21450],
369
+ exceptLevels: ["at:3", "bg:2", "ca:B", "cl:ASP", "cl:N", "cn:A", "de:N", "dk:D", "kr:4", "my:C", "nl:N", "rs:C", "ru:4"],
295
370
  segments: [
296
371
  { name: "CW", mhz: [21e3, 21150], mode: "CW" },
297
372
  { name: "CW Reg1", mhz: [21e3, 21070], mode: "CW", regions: [1] },
@@ -301,11 +376,31 @@ var bandPlans_default = {
301
376
  { name: "Beacons only", mhz: [21149, 21151], priority: 100 },
302
377
  { name: "Phone", mhz: [21151, 21450], mode: "SSB", submode: "USB" },
303
378
  { name: "Phone US", mhz: [21150, 21450], mode: "SSB", submode: "USB", countries: ["us"] },
304
- { name: "Australia", mhz: [21e3, 21450], mode: null, countries: ["au"] }
379
+ { name: "Australia", mhz: [21e3, 21450], mode: null, countries: ["au"] },
380
+ { name: "AR: General, Superior, Special only", mhz: [21e3, 21070], exceptLevels: ["ar:N"] },
381
+ { name: "AR Novice: CW/DATA only", mhz: [21070, 21125], levels: ["ar:N"], superModes: ["CW", "DATA"] },
382
+ { name: "AR Novice: CW only", mhz: [21125, 21149], levels: ["ar:N"], superModes: ["CW"] },
383
+ { name: "AR: General, Superior, Special only", mhz: [21149, 21200], exceptLevels: ["ar:N"] },
384
+ { name: "AR: Superior, Special only", mhz: [21310, 21450], exceptLevels: ["ar:N", "ar:G"] },
385
+ { name: "BR: Class B, Class A only", mhz: [21150, 21300], exceptLevels: ["br:C"] },
386
+ { name: "BR: Class A only", mhz: [21300, 21450], exceptLevels: ["br:C", "br:B"] },
387
+ { name: "CZ: Class A only", mhz: [21e3, 21050], exceptLevels: ["cz:N"] },
388
+ { name: "CZ: Class A only", mhz: [21200, 21450], exceptLevels: ["cz:N"] },
389
+ { name: "ID General: CW only", mhz: [21e3, 21070], levels: ["id:SIAGA"], superModes: ["CW"] },
390
+ { name: "ID General: CW/DATA only", mhz: [21070, 21125], levels: ["id:SIAGA"], superModes: ["CW", "DATA"] },
391
+ { name: "ID General: CW only", mhz: [21125, 21200], levels: ["id:SIAGA"], superModes: ["CW"] },
392
+ { name: "ID: Advanced, Extra Class only", mhz: [21200, 21450], exceptLevels: ["id:SIAGA"] },
393
+ { name: "UA Entry level (student), Novice: CW only", mhz: [21250, 21450], levels: ["ua:C", "ua:B"], superModes: ["CW"] },
394
+ { name: "US: Amateur Extra only", mhz: [21e3, 21025], exceptLevels: ["us:N", "us:T", "us:G", "us:A"] },
395
+ { name: "US Novice, Technician: CW only", mhz: [21025, 21200], levels: ["us:N", "us:T"], superModes: ["CW"] },
396
+ { name: "US: Amateur Extra only", mhz: [21200, 21225], exceptLevels: ["us:N", "us:T", "us:G", "us:A"] },
397
+ { name: "US: Advanced, Amateur Extra only", mhz: [21225, 21275], exceptLevels: ["us:N", "us:T", "us:G"] },
398
+ { name: "US: General, Advanced, Amateur Extra only", mhz: [21275, 21450], exceptLevels: ["us:N", "us:T"] }
305
399
  ]
306
400
  },
307
401
  "12m": {
308
- mhz: [24890, 24990],
402
+ mhz: [24740, 24990],
403
+ exceptLevels: ["ar:N", "at:3", "at:4", "au:F", "au:S", "be:C", "bg:2", "ca:B", "ch:HB3", "cl:ASP", "cl:N", "cn:A", "cz:N", "de:N", "de:E", "dk:D", "hr:P", "hu:KEZDO", "id:SIAGA", "id:PENGGALANG", "kr:4", "my:C", "nl:N", "no:begrenset", "rs:C", "rs:B", "ru:4", "se:insteg", "si:N", "us:N", "us:T"],
309
404
  segments: [
310
405
  { name: "CW", mhz: [24890, 24930], mode: "CW" },
311
406
  { name: "CW Reg1", mhz: [24890, 24915], mode: "CW", regions: [1] },
@@ -315,11 +410,13 @@ var bandPlans_default = {
315
410
  { name: "Phone", mhz: [24930, 24990], mode: "SSB", submode: "USB" },
316
411
  { name: "Beacons only", mhz: [24929, 24931], priority: 100 },
317
412
  { name: "Phone US", mhz: [24930, 24990], mode: "SSB", submode: "USB", countries: ["us"] },
318
- { name: "Australia", mhz: [24890, 24990], mode: null, countries: ["au"] }
413
+ { name: "Australia", mhz: [24890, 24990], mode: null, countries: ["au"] },
414
+ { name: "UA Entry level (student): CW only", mhz: [24915, 24990], levels: ["ua:C"], superModes: ["CW"] }
319
415
  ]
320
416
  },
321
417
  "10m": {
322
418
  mhz: [28e3, 29700],
419
+ exceptLevels: ["at:3", "bg:2", "ca:B", "cn:A", "kr:4", "my:C", "rs:C", "ru:4"],
323
420
  segments: [
324
421
  { name: "CW", mhz: [28e3, 28190], mode: "CW" },
325
422
  { name: "CW Reg1", mhz: [28e3, 28070], mode: "CW", regions: [1] },
@@ -334,11 +431,23 @@ var bandPlans_default = {
334
431
  { name: "Repeater Uplinks", mhz: [29520, 29590] },
335
432
  { name: "FM", mhz: [29520, 29700], mode: "FM" },
336
433
  { name: "Repeater Downlinks", mhz: [29620, 29700] },
337
- { name: "Australia", mhz: [28e3, 29700], mode: null, countries: ["au"] }
434
+ { name: "Australia", mhz: [28e3, 29700], mode: null, countries: ["au"] },
435
+ { name: "CZ: Class A only", mhz: [28e3, 28050], exceptLevels: ["cz:N"] },
436
+ { name: "CZ: Class A only", mhz: [28400, 29700], exceptLevels: ["cz:N"] },
437
+ { name: "UA Entry level (student), Novice: CW/PHONE only", mhz: [28675, 28685], levels: ["ua:C", "ua:B"], superModes: ["CW", "PHONE"] },
438
+ { name: "UA: Novice, Higher qualification (HAREC) only", mhz: [29300, 29520], exceptLevels: ["ua:C"] },
439
+ { name: "US Novice, Technician: CW/PHONE only", mhz: [28300, 28500], levels: ["us:N", "us:T"], superModes: ["CW", "PHONE"] },
440
+ { name: "US: General, Advanced, Amateur Extra only", mhz: [28500, 29700], exceptLevels: ["us:N", "us:T"] }
338
441
  ]
339
442
  },
443
+ "8m": {
444
+ mhz: [40660, 40700],
445
+ exceptLevels: ["be:C", "be:B", "si:N"],
446
+ segments: []
447
+ },
340
448
  "6m": {
341
449
  mhz: [5e4, 54e3],
450
+ exceptLevels: ["at:3", "at:4", "au:F", "be:C", "bg:2", "ch:HB3", "cl:ASP", "cz:N", "de:N", "de:E", "hr:P", "hu:KEZDO", "hu:NOVICE", "id:SIAGA", "nl:N", "rs:C", "rs:B", "ua:C", "ua:B", "us:N"],
342
451
  segments: [
343
452
  { name: "Beacon project Reg1", mhz: [5e4, 50010], mode: null, regions: [1] },
344
453
  { name: "Beacon project Reg2", mhz: [50010, 50020], mode: null, regions: [2] },
@@ -354,11 +463,13 @@ var bandPlans_default = {
354
463
  { name: "FT8", mhz: [50313, 50316], mode: "FT8", priority: 100 },
355
464
  { name: "FT4", mhz: [50318, 50321], mode: "FT4", priority: 100 },
356
465
  { name: "FT8", mhz: [50323, 50326], mode: "FT8", priority: 100 },
357
- { name: "Australia", mhz: [5e4, 54e3], mode: null, countries: ["au"] }
466
+ { name: "Australia", mhz: [5e4, 54e3], mode: null, countries: ["au"] },
467
+ { name: "AR Novice: CW only", mhz: [51e3, 51100], levels: ["ar:N"], superModes: ["CW"] }
358
468
  ]
359
469
  },
360
470
  "4m": {
361
- mhz: [7e4, 70500],
471
+ mhz: [69887.5, 70512.5],
472
+ exceptLevels: ["be:C", "be:B", "bg:2", "ch:HB3", "hr:P", "hu:KEZDO", "hu:NOVICE", "nl:N", "no:begrenset", "rs:C", "rs:B"],
362
473
  segments: [
363
474
  { name: "Beacons only Reg1", mhz: [70090, 70100], mode: "CW", regions: [1] },
364
475
  { name: "CW Reg1", mhz: [7e4, 70090], mode: "CW", regions: [1] },
@@ -371,6 +482,7 @@ var bandPlans_default = {
371
482
  },
372
483
  "2m": {
373
484
  mhz: [144e3, 148e3],
485
+ exceptLevels: ["us:N"],
374
486
  segments: [
375
487
  { name: "CW", mhz: [144e3, 144100], mode: "CW" },
376
488
  { name: "Satellite downlink Reg1", mhz: [144e3, 144025], mode: null, regions: [1] },
@@ -385,19 +497,26 @@ var bandPlans_default = {
385
497
  { name: "Reg1", mhz: [144500, 144794], mode: null, regions: [1] },
386
498
  { name: "FM Satellite Reg1", mhz: [145194, 145206], mode: "FM", regions: [1] },
387
499
  { name: "FM Reg1", mhz: [145206, 145563], mode: "FM", regions: [1] },
388
- { name: "Out of band Reg1", mhz: [146e3, 148e3], mode: false, regions: [1] }
500
+ { name: "Out of band Reg1", mhz: [146e3, 148e3], mode: false, regions: [1] },
501
+ { name: "HU: CEPT (full) only", mhz: [144400, 144500], exceptLevels: ["hu:KEZDO", "hu:NOVICE"] },
502
+ { name: "HU: CEPT (full) only", mhz: [145562.5, 145794], exceptLevels: ["hu:KEZDO", "hu:NOVICE"] },
503
+ { name: "UA: Higher qualification (HAREC) only", mhz: [144e3, 144035], exceptLevels: ["ua:C", "ua:B"] }
389
504
  ]
390
505
  },
391
506
  "1.25m": {
392
- mhz: [222e3, 225e3],
507
+ mhz: [219e3, 225e3],
508
+ exceptLevels: ["cl:ASP"],
393
509
  segments: [
394
510
  { name: "CW", mhz: [222e3, 222070], mode: "CW" },
395
511
  { name: "Phone", mhz: [222070, 222150], mode: "SSB", submode: "USB" },
396
- { name: "FM", mhz: [222200, 225e3], mode: "FM" }
512
+ { name: "FM", mhz: [222200, 225e3], mode: "FM" },
513
+ { name: "AR Novice: DATA only", mhz: [220500, 221e3], levels: ["ar:N"], superModes: ["DATA"] },
514
+ { name: "US: Technician, General, Advanced, Amateur Extra only", mhz: [219e3, 22e4], regions: [2], exceptLevels: ["us:N"] }
397
515
  ]
398
516
  },
399
517
  "70cm": {
400
518
  mhz: [42e4, 45e4],
519
+ exceptLevels: ["cl:ASP", "se:insteg", "us:N"],
401
520
  segments: [
402
521
  { name: "Out of band Reg1", mhz: [42e4, 43e4], mode: false, regions: [1] },
403
522
  { name: "CW", mhz: [432e3, 432100], mode: "CW" },
@@ -406,14 +525,90 @@ var bandPlans_default = {
406
525
  { name: "Phone", mhz: [432100, 432400], mode: "SSB", submode: "USB", regions: [1] },
407
526
  { name: "FM", mhz: [42e4, 45e4], mode: "FM" },
408
527
  { name: "FM Reg1", mhz: [433400, 433575], mode: "FM", regions: [1] },
409
- { name: "Out of band Reg1", mhz: [44e4, 45e4], mode: false, regions: [1] }
528
+ { name: "Out of band Reg1", mhz: [44e4, 45e4], mode: false, regions: [1] },
529
+ { name: "HU: CEPT (full) only", mhz: [431975, 432e3], exceptLevels: ["hu:KEZDO", "hu:NOVICE"] },
530
+ { name: "HU: CEPT (full) only", mhz: [432400, 432500], exceptLevels: ["hu:KEZDO", "hu:NOVICE"] },
531
+ { name: "HU: CEPT (full) only", mhz: [438e3, 44e4], exceptLevels: ["hu:KEZDO", "hu:NOVICE"] },
532
+ { name: "UA: Higher qualification (HAREC) only", mhz: [432e3, 432025], exceptLevels: ["ua:C", "ua:B"] }
410
533
  ]
411
534
  },
412
535
  "33cm": {
413
536
  mhz: [902e3, 928e3],
414
537
  segments: [
415
- { name: "FM", mhz: [927e3, 928e3], mode: "FM" }
538
+ { name: "FM", mhz: [927e3, 928e3], mode: "FM" },
539
+ { name: "US: Technician, General, Advanced, Amateur Extra only", mhz: [902e3, 928e3], regions: [2], exceptLevels: ["us:N"] }
540
+ ]
541
+ },
542
+ "23cm": {
543
+ mhz: [124e4, 1325e3],
544
+ exceptLevels: ["at:3", "at:4", "au:F", "be:C", "be:B", "bg:2", "ch:HB3", "cl:ASP", "de:N", "gb:F", "kr:3P", "kr:3T", "my:C", "my:B", "nl:N", "no:begrenset", "rs:C", "rs:B", "se:insteg", "si:N"],
545
+ segments: [
546
+ { name: "HU: CEPT (full) only", mhz: [124e4, 1290994], exceptLevels: ["hu:KEZDO", "hu:NOVICE"] },
547
+ { name: "HU Beginner (Kezd\u0151), CEPT Novice: PHONE only", mhz: [1290994, 1291494], levels: ["hu:KEZDO", "hu:NOVICE"], superModes: ["PHONE"] },
548
+ { name: "HU: CEPT (full) only", mhz: [1291494, 1297494], exceptLevels: ["hu:KEZDO", "hu:NOVICE"] },
549
+ { name: "HU Beginner (Kezd\u0151), CEPT Novice: PHONE only", mhz: [1297494, 1298e3], levels: ["hu:KEZDO", "hu:NOVICE"], superModes: ["PHONE"] },
550
+ { name: "HU: CEPT (full) only", mhz: [1298e3, 13e5], exceptLevels: ["hu:KEZDO", "hu:NOVICE"] },
551
+ { name: "US: Technician, General, Advanced, Amateur Extra only", mhz: [124e4, 127e4], exceptLevels: ["us:N"] },
552
+ { name: "US: Technician, General, Advanced, Amateur Extra only", mhz: [1295e3, 13e5], exceptLevels: ["us:N"] }
553
+ ]
554
+ },
555
+ "13cm": {
556
+ mhz: [23e5, 245e4],
557
+ exceptLevels: ["at:3", "at:4", "au:F", "be:C", "be:B", "ch:HB3", "cl:ASP", "de:N", "dk:D", "hu:KEZDO", "hu:NOVICE", "kr:3P", "kr:3T", "my:C", "my:B", "nl:N", "se:insteg", "si:N", "us:N"],
558
+ segments: [
559
+ { name: "AU: Advanced only", mhz: [23e5, 2302e3], exceptLevels: ["au:S"] },
560
+ { name: "GB: Intermediate, Full only", mhz: [231e4, 235e4], exceptLevels: ["gb:F"] },
561
+ { name: "GB: Intermediate, Full only", mhz: [239e4, 24e5], exceptLevels: ["gb:F"] }
562
+ ]
563
+ },
564
+ "9cm": {
565
+ mhz: [33e5, 36e5],
566
+ exceptLevels: ["at:3", "at:4", "au:F", "au:S", "cl:ASP", "cl:N", "cn:A", "de:N", "dk:D", "gb:F", "hr:P", "my:C", "my:B", "nl:N", "no:begrenset", "si:N"],
567
+ segments: []
568
+ },
569
+ "6cm": {
570
+ mhz: [565e4, 5925e3],
571
+ exceptLevels: ["at:3", "at:4", "au:F", "be:C", "be:B", "ch:HB3", "cl:ASP", "cn:A", "de:N", "dk:D", "hu:KEZDO", "hu:NOVICE", "my:C", "my:B", "nl:N", "no:begrenset", "se:insteg", "si:N", "us:N"],
572
+ segments: [
573
+ { name: "GB: Intermediate, Full only", mhz: [583e4, 585e4], exceptLevels: ["gb:F"] },
574
+ { name: "UA: Entry level (student), Higher qualification (HAREC) only", mhz: [566e4, 567e4], exceptLevels: ["ua:B"] },
575
+ { name: "UA: Higher qualification (HAREC) only", mhz: [583e4, 585e4], exceptLevels: ["ua:C", "ua:B"] }
416
576
  ]
577
+ },
578
+ "3cm": {
579
+ mhz: [1e7, 105e5],
580
+ exceptLevels: ["at:3", "at:4", "au:F", "au:S", "be:C", "be:B", "ch:HB3", "cl:ASP", "cl:N", "cn:A", "de:N", "dk:D", "hu:KEZDO", "hu:NOVICE", "id:SIAGA", "kr:3P", "kr:3T", "my:C", "my:B", "nl:N", "pl:1", "se:insteg", "si:N", "us:N"],
581
+ segments: []
582
+ },
583
+ "1.25cm": {
584
+ mhz: [24e6, 2425e4],
585
+ exceptLevels: ["at:3", "at:4", "au:F", "au:S", "be:C", "be:B", "ch:HB3", "cl:ASP", "cl:N", "cn:A", "de:N", "dk:D", "gb:F", "hu:KEZDO", "hu:NOVICE", "id:SIAGA", "kr:4", "kr:3P", "kr:3T", "my:C", "my:B", "nl:N", "no:begrenset", "se:insteg", "si:N", "us:N"],
586
+ segments: []
587
+ },
588
+ "6mm": {
589
+ mhz: [47e6, 485e5],
590
+ exceptLevels: ["at:3", "at:4", "au:F", "au:S", "be:C", "be:B", "ch:HB3", "cn:A", "de:N", "gb:F", "hu:KEZDO", "hu:NOVICE", "id:SIAGA", "kr:4", "kr:3P", "kr:3T", "my:C", "my:B", "nl:N", "si:N", "us:N"],
591
+ segments: []
592
+ },
593
+ "4mm": {
594
+ mhz: [755e5, 815e5],
595
+ exceptLevels: ["at:3", "at:4", "au:F", "au:S", "be:C", "be:B", "ch:HB3", "cn:A", "de:N", "gb:F", "hu:KEZDO", "hu:NOVICE", "id:SIAGA", "kr:4", "kr:3P", "kr:3T", "my:C", "my:B", "nl:N", "si:N", "us:N"],
596
+ segments: []
597
+ },
598
+ "2.5mm": {
599
+ mhz: [11998e4, 123e6],
600
+ exceptLevels: ["at:3", "at:4", "au:F", "au:S", "be:C", "be:B", "ch:HB3", "de:N", "gb:F", "hu:KEZDO", "hu:NOVICE", "id:SIAGA", "nl:N", "si:N", "us:N"],
601
+ segments: []
602
+ },
603
+ "2mm": {
604
+ mhz: [134e6, 149e6],
605
+ exceptLevels: ["at:3", "at:4", "au:F", "au:S", "be:C", "be:B", "ch:HB3", "cn:A", "de:N", "gb:F", "hu:KEZDO", "hu:NOVICE", "id:SIAGA", "kr:4", "kr:3P", "kr:3T", "nl:N", "si:N", "us:N"],
606
+ segments: []
607
+ },
608
+ "1mm": {
609
+ mhz: [241e6, 25e7],
610
+ exceptLevels: ["at:3", "at:4", "au:F", "au:S", "be:C", "be:B", "ch:HB3", "cn:A", "de:N", "gb:F", "hu:KEZDO", "hu:NOVICE", "kr:4", "kr:3P", "kr:3T", "my:C", "my:B", "nl:N", "si:N", "us:N"],
611
+ segments: []
417
612
  }
418
613
  }
419
614
  };
@@ -580,9 +775,12 @@ function superModeForMode(mode) {
580
775
  }
581
776
  }
582
777
  var bandPlansData = bandPlans_default;
778
+ function isLicenseSegment(segment) {
779
+ return Boolean(segment.exceptLevels || segment.levels);
780
+ }
583
781
  var AllSegments = Object.keys(bandPlansData.bands).reduce((segments, band) => {
584
782
  return segments.concat(
585
- bandPlansData.bands[band].segments.map((segment) => {
783
+ bandPlansData.bands[band].segments.filter((segment) => !isLicenseSegment(segment)).map((segment) => {
586
784
  const mhz = Array.isArray(segment.mhz) && segment.mhz.length >= 2 ? [segment.mhz[0], segment.mhz[1]] : [0, 0];
587
785
  return {
588
786
  name: segment.name,
@@ -625,6 +823,540 @@ function modeForFrequency(frequency, options = {}) {
625
823
  return sortedSegments[0]?.mode;
626
824
  }
627
825
 
826
+ // src/data/licenseLevels.json
827
+ var licenseLevels_default = {
828
+ jurisdictions: [
829
+ {
830
+ key: "ar",
831
+ name: "Argentina",
832
+ regulator: "ENACOM",
833
+ rules: "Resoluci\xF3n ENACOM 3635-E/2017 (Reglamento General de Radioaficionados, Anexo A band plan) as amended by Res. ENACOM 1186/2024",
834
+ term: "License Category",
835
+ termLocal: "categor\xEDa",
836
+ entities: ["LU"],
837
+ levels: [
838
+ { code: "N", name: "Novice", nameLocal: "Novicio", tier: "intermediate", aliases: ["Inicial"], maxPowerW: 200 },
839
+ { code: "G", name: "General", tier: "intermediate", aliases: ["Intermedia"], maxPowerW: 1e3 },
840
+ { code: "S", name: "Superior", tier: "full", maxPowerW: 1500 },
841
+ { code: "E", name: "Special", nameLocal: "Especial", tier: "full", maxPowerW: 1500 }
842
+ ]
843
+ },
844
+ {
845
+ key: "at",
846
+ name: "Austria",
847
+ regulator: "Fernmeldeb\xFCros (Fernmeldebeh\xF6rde, Bundesministerium f\xFCr Finanzen)",
848
+ term: "License Class",
849
+ termLocal: "Bewilligungsklasse",
850
+ entities: ["OE"],
851
+ levels: [
852
+ { code: "3", name: "Class 3", nameLocal: "Bewilligungsklasse 3", tier: "basic", maxPowerW: 100 },
853
+ { code: "4", name: "Class 4", nameLocal: "Bewilligungsklasse 4", tier: "intermediate", maxPowerW: 100 },
854
+ { code: "1", name: "Class 1", nameLocal: "Bewilligungsklasse 1", tier: "full", maxPowerW: 1e3 }
855
+ ]
856
+ },
857
+ {
858
+ key: "au",
859
+ name: "Australia",
860
+ regulator: "ACMA",
861
+ term: "Licence Level",
862
+ termLocal: "qualification",
863
+ entities: ["VK", "VK9X", "VK9C", "VK9N", "VK9L", "VK9W", "VK9M", "VK0H", "VK0M"],
864
+ levels: [
865
+ { code: "F", name: "Foundation", nameLocal: "ACMA recognition certificate (Foundation)", tier: "intermediate", maxPowerW: 10 },
866
+ { code: "S", name: "Standard", nameLocal: "ACMA recognition certificate (Standard)", tier: "intermediate", maxPowerW: 100 },
867
+ { code: "A", name: "Advanced", nameLocal: "ACMA recognition certificate (Advanced)", tier: "full", maxPowerW: 400 }
868
+ ],
869
+ callsigns: [
870
+ { pattern: "^VK[0-9][A-Z]{2}$", level: "A", entities: ["VK"] }
871
+ ]
872
+ },
873
+ {
874
+ key: "be",
875
+ name: "Belgium",
876
+ regulator: "BIPT/IBPT",
877
+ term: "Licence Class",
878
+ termLocal: "certificat d'op\xE9rateur de classe A/B/C",
879
+ entities: ["ON"],
880
+ levels: [
881
+ { code: "C", name: "Entry (Basic)", nameLocal: "Certificat d'op\xE9rateur de classe C (ex licence de base)", tier: "intermediate", maxPowerW: 25 },
882
+ { code: "B", name: "Novice", nameLocal: "Certificat d'op\xE9rateur de classe B", tier: "intermediate", maxPowerW: 100 },
883
+ { code: "A", name: "HAREC", nameLocal: "Certificat d'op\xE9rateur de classe A (ex certificat HAREC)", tier: "full", maxPowerW: 1500 }
884
+ ],
885
+ callsigns: [
886
+ { pattern: "^ON3[A-Z]{2,3}$", level: "C" },
887
+ { pattern: "^ON2[A-Z]{2,3}$", level: "B", atLeast: true },
888
+ { pattern: "^ON[14-9][A-Z]{1,3}$", level: "A" }
889
+ ]
890
+ },
891
+ {
892
+ key: "bg",
893
+ name: "Bulgaria",
894
+ regulator: "CRC (\u041A\u043E\u043C\u0438\u0441\u0438\u044F \u0437\u0430 \u0440\u0435\u0433\u0443\u043B\u0438\u0440\u0430\u043D\u0435 \u043D\u0430 \u0441\u044A\u043E\u0431\u0449\u0435\u043D\u0438\u044F\u0442\u0430)",
895
+ term: "License Class",
896
+ termLocal: "\u0440\u0430\u0434\u0438\u043E\u043B\u044E\u0431\u0438\u0442\u0435\u043B\u0441\u043A\u0438 \u043A\u043B\u0430\u0441",
897
+ entities: ["LZ"],
898
+ levels: [
899
+ { code: "2", name: "Class 2", nameLocal: "\u041A\u043B\u0430\u0441 2", tier: "basic", maxPowerW: 5, superModes: ["PHONE", "DATA"] },
900
+ { code: "1", name: "Class 1", nameLocal: "\u041A\u043B\u0430\u0441 1", tier: "full", maxPowerW: 350 }
901
+ ],
902
+ callsigns: [
903
+ { pattern: "^LZ[0-9][A-Z]{2}$", level: "1" }
904
+ ]
905
+ },
906
+ {
907
+ key: "br",
908
+ name: "Brazil",
909
+ regulator: "Anatel",
910
+ rules: "Res. Anatel 777/2025 (RGST) Art. 277 (classes); Ato SOR 926/2024 (bands/power by class); Ato 3448/2026 (operations, exams, callsigns)",
911
+ term: "License Class",
912
+ termLocal: "classe",
913
+ entities: ["PY", "PY0F", "PY0S", "PY0T"],
914
+ levels: [
915
+ { code: "C", name: "Class C", nameLocal: "Classe C", tier: "intermediate", aliases: ["Classe D"], maxPowerW: 100 },
916
+ { code: "B", name: "Class B", nameLocal: "Classe B", tier: "intermediate", maxPowerW: 1e3 },
917
+ { code: "A", name: "Class A", nameLocal: "Classe A", tier: "full", maxPowerW: 1500 }
918
+ ],
919
+ callsigns: [
920
+ { pattern: "^PU[0-9][A-Z]{3}$", level: "C" },
921
+ { pattern: "^PV2[K-Y][A-Z]{2}$", level: "C" }
922
+ ]
923
+ },
924
+ {
925
+ key: "ca",
926
+ name: "Canada",
927
+ regulator: "ISED",
928
+ rules: "RBR-4 Issue 3 (July 2022); RIC-3 Issue 5 (March 2022); Radiocommunication Regulations",
929
+ term: "Qualification",
930
+ termLocal: "qualification",
931
+ entities: ["VE"],
932
+ levels: [
933
+ { code: "B", name: "Basic", nameLocal: "Basic Qualification / comp\xE9tence de base", tier: "basic", maxPowerW: 560 },
934
+ { code: "B/H", name: "Basic with Honours", nameLocal: "Basic Qualification with Honours / comp\xE9tence de base re\xE7ue avec distinction", tier: "full", maxPowerW: 560 },
935
+ { code: "B+5", name: "Basic + Morse (5 wpm)", nameLocal: "Morse Code Qualification / comp\xE9tence en code Morse", tier: "full", maxPowerW: 560 },
936
+ { code: "B+A", name: "Basic + Advanced", nameLocal: "Advanced Qualification / comp\xE9tence sup\xE9rieure", tier: "full", maxPowerW: 2250 }
937
+ ]
938
+ },
939
+ {
940
+ key: "ch",
941
+ name: "Switzerland",
942
+ regulator: "OFCOM/BAKOM",
943
+ term: "Licence Class",
944
+ termLocal: "F\xE4higkeitszeugnis (DE) / certificat de capacit\xE9 (FR); formerly Konzession",
945
+ entities: ["HB"],
946
+ levels: [
947
+ { code: "HB3", name: "Novice", nameLocal: "Einsteigerausweis f\xFCr Funkamateurinnen und Funkamateure (F\xE4higkeitszeugnis Novice)", tier: "intermediate", maxPowerW: 100 },
948
+ { code: "HB9", name: "Full (CEPT)", nameLocal: "F\xE4higkeitszeugnis f\xFCr den Amateurfunk (CEPT)", tier: "full", maxPowerW: 1e3 }
949
+ ],
950
+ callsigns: [
951
+ { pattern: "^HB3[A-Z]{3}$", level: "HB3" },
952
+ { pattern: "^HB9[A-Z]{3}$", level: "HB9" }
953
+ ]
954
+ },
955
+ {
956
+ key: "cl",
957
+ name: "Chile",
958
+ regulator: "SUBTEL",
959
+ rules: "DS 523/2006 (Reglamento del Servicio de Aficionados a las Radiocomunicaciones) as amended by DS 213/2012; Res. Exenta 1228/2008 + 175/2014 (callsigns); DS 127/2006 + DS 192/2023 (band plan)",
960
+ term: "License Category",
961
+ termLocal: "categor\xEDa",
962
+ entities: ["CE", "CE0Y", "CE0X", "CE0Z"],
963
+ levels: [
964
+ { code: "ASP", name: "Aspirant", nameLocal: "Aspirante", tier: "intermediate", maxPowerW: 100 },
965
+ { code: "N", name: "Novice", nameLocal: "Novicio", tier: "intermediate", maxPowerW: 200 },
966
+ { code: "G", name: "General", tier: "full", maxPowerW: 1200 },
967
+ { code: "S", name: "Superior", tier: "full", maxPowerW: 1200 }
968
+ ],
969
+ callsigns: [
970
+ { pattern: "^CD[0-9][A-Z]{3}$", level: "ASP" },
971
+ { pattern: "^CA[0-9][A-Z]{3}$", level: "N" },
972
+ { pattern: "^CE[0-9][A-Z]{1,3}$", level: "G", entities: ["CE"] },
973
+ { pattern: "^XQ[0-9][A-Z]{1,3}$", level: "S" }
974
+ ]
975
+ },
976
+ {
977
+ key: "cn",
978
+ name: "China",
979
+ regulator: "MIIT (\u5DE5\u4E1A\u548C\u4FE1\u606F\u5316\u90E8)",
980
+ term: "Operator Class",
981
+ termLocal: "\u4E1A\u4F59\u65E0\u7EBF\u7535\u53F0\u64CD\u4F5C\u6280\u672F\u80FD\u529B\u7C7B\u522B",
982
+ entities: ["BY"],
983
+ levels: [
984
+ { code: "A", name: "Class A", nameLocal: "A\u7C7B", tier: "basic", maxPowerW: 25 },
985
+ { code: "B", name: "Class B", nameLocal: "B\u7C7B", tier: "full", maxPowerW: 15 },
986
+ { code: "B-pre2024", name: "Class B (obtained before 2024-03-01)", nameLocal: "B\u7C7B (2024\u5E743\u67081\u65E5\u524D\u53D6\u5F97)", tier: "full", legacy: true, maxPowerW: 100 },
987
+ { code: "C", name: "Class C", nameLocal: "C\u7C7B", tier: "full", maxPowerW: 1e3 }
988
+ ]
989
+ },
990
+ {
991
+ key: "cz",
992
+ name: "Czech Republic",
993
+ regulator: "\u010CT\xDA (\u010Cesk\xFD telekomunika\u010Dn\xED \xFA\u0159ad)",
994
+ term: "Operator Class",
995
+ termLocal: "t\u0159\xEDda oper\xE1tora",
996
+ entities: ["OK"],
997
+ levels: [
998
+ { code: "N", name: "Class N (Novice)", nameLocal: "Oper\xE1torsk\xE1 t\u0159\xEDda N", tier: "intermediate", maxPowerW: 10 },
999
+ { code: "A", name: "Class A", nameLocal: "Oper\xE1torsk\xE1 t\u0159\xEDda A", tier: "full", maxPowerW: 750 }
1000
+ ],
1001
+ callsigns: [
1002
+ { pattern: "^OK9[A-Z]{3}$", level: "N", atLeast: true },
1003
+ { pattern: "^OK[1-7][A-Z]{2,3}$", level: "A" }
1004
+ ]
1005
+ },
1006
+ {
1007
+ key: "de",
1008
+ name: "Germany",
1009
+ regulator: "BNetzA (Bundesnetzagentur)",
1010
+ term: "License Class",
1011
+ termLocal: "Klasse",
1012
+ entities: ["DL"],
1013
+ levels: [
1014
+ { code: "N", name: "Class N", nameLocal: "Klasse N", tier: "basic", maxPowerW: 10 },
1015
+ { code: "E", name: "Class E", nameLocal: "Klasse E", tier: "intermediate", maxPowerW: 100 },
1016
+ { code: "A", name: "Class A", nameLocal: "Klasse A", tier: "full", maxPowerW: 750 }
1017
+ ],
1018
+ callsigns: [
1019
+ { pattern: "^DN9[A-Z]{2,3}$", level: "N", atLeast: true },
1020
+ { pattern: "^(DO[1-9]|DA6)[A-Z]{2,3}$", level: "E", atLeast: true },
1021
+ { pattern: "^(DA[12]|DB[1-9]|DC[0-9]|DD[0-9]|DF[1-9]|DG[0-9]|DH[0-9]|DJ[0-9]|DK[1-9]|DL[1-9]|DM[1-9])[A-Z]{1,3}$", level: "A" }
1022
+ ]
1023
+ },
1024
+ {
1025
+ key: "dk",
1026
+ name: "Denmark",
1027
+ regulator: "Digitaliseringsstyrelsen (formerly SDFI)",
1028
+ rules: "BEK nr 499 af 29/05/2026 (in force 2026-07-01), Bilag 4",
1029
+ term: "Certificate category",
1030
+ termLocal: "certifikat, kategori",
1031
+ entities: ["OZ"],
1032
+ levels: [
1033
+ { code: "D", name: "Category D", nameLocal: "Certifikat kategori D", tier: "basic", maxPowerW: 50 },
1034
+ { code: "B", name: "Category B", nameLocal: "Certifikat kategori B", tier: "full", maxPowerW: 100 },
1035
+ { code: "A", name: "Category A", nameLocal: "Certifikat kategori A", tier: "full", aliases: ["Certifikat kategori C"], maxPowerW: 1e3 }
1036
+ ]
1037
+ },
1038
+ {
1039
+ key: "gb",
1040
+ name: "United Kingdom",
1041
+ regulator: "Ofcom",
1042
+ term: "Licence Class",
1043
+ termLocal: "licence class",
1044
+ entities: ["G", "GM", "GW", "GI"],
1045
+ levels: [
1046
+ { code: "F", name: "Foundation", nameLocal: "Foundation Licence", tier: "intermediate", maxPowerW: 25 },
1047
+ { code: "I", name: "Intermediate", nameLocal: "Intermediate Licence", tier: "intermediate", maxPowerW: 100 },
1048
+ { code: "FULL", name: "Full", nameLocal: "Full Licence", tier: "full", maxPowerW: 1e3 }
1049
+ ],
1050
+ callsigns: [
1051
+ { pattern: "^M[A-Z]?[367][A-Z]{3}$", level: "F" },
1052
+ { pattern: "^M[A-Z]?[89][A-Z]{3}$", level: "I" },
1053
+ { pattern: "^2[A-Z][01][A-Z]{3}$", level: "I" },
1054
+ { pattern: "^G[A-Z]?[0-8][A-Z]{2,3}$", level: "FULL" },
1055
+ { pattern: "^M[A-Z]?[015][A-Z]{2,3}$", level: "FULL" }
1056
+ ]
1057
+ },
1058
+ {
1059
+ key: "hr",
1060
+ name: "Croatia",
1061
+ regulator: "HAKOM (Hrvatska regulatorna agencija za mre\u017Ene djelatnosti)",
1062
+ term: "Operator Class",
1063
+ termLocal: "radioamaterski razred",
1064
+ entities: ["9A"],
1065
+ levels: [
1066
+ { code: "P", name: "Class P (Beginner)", nameLocal: "po\u010Detni\u010Dki P razred", tier: "intermediate", maxPowerW: 100 },
1067
+ { code: "A", name: "Class A", nameLocal: "A razred", tier: "full", maxPowerW: 1500 }
1068
+ ]
1069
+ },
1070
+ {
1071
+ key: "hu",
1072
+ name: "Hungary",
1073
+ regulator: "NMHH (Nemzeti M\xE9dia- \xE9s H\xEDrk\xF6zl\xE9si Hat\xF3s\xE1g)",
1074
+ term: "License Grade",
1075
+ termLocal: "enged\xE9ly fokozata",
1076
+ entities: ["HA"],
1077
+ levels: [
1078
+ { code: "KEZDO", name: "Beginner (Kezd\u0151)", nameLocal: "Kezd\u0151 fokozat\xFA enged\xE9ly", tier: "intermediate", maxPowerW: 100 },
1079
+ { code: "NOVICE", name: "CEPT Novice", nameLocal: "CEPT Novice fokozat\xFA enged\xE9ly", tier: "intermediate", maxPowerW: 200 },
1080
+ { code: "CEPT", name: "CEPT (full)", nameLocal: "CEPT fokozat\xFA enged\xE9ly", tier: "full", maxPowerW: 1500 }
1081
+ ]
1082
+ },
1083
+ {
1084
+ key: "id",
1085
+ name: "Indonesia",
1086
+ regulator: "Komdigi (formerly Kominfo), Ditjen SDPPI",
1087
+ term: "Licence Level",
1088
+ termLocal: "Tingkat IAR",
1089
+ entities: ["YB"],
1090
+ levels: [
1091
+ { code: "SIAGA", name: "General", nameLocal: "Tingkat Siaga", tier: "intermediate", maxPowerW: 100 },
1092
+ { code: "PENGGALANG", name: "Advanced", nameLocal: "Tingkat Penggalang", tier: "intermediate", maxPowerW: 500 },
1093
+ { code: "PENEGAK", name: "Extra Class", nameLocal: "Tingkat Penegak", tier: "full", maxPowerW: 1e3 }
1094
+ ],
1095
+ callsigns: [
1096
+ { pattern: "^Y[DG][0-9][A-Z]{1,3}$", level: "SIAGA" },
1097
+ { pattern: "^Y[CF][0-9][A-Z]{1,3}$", level: "PENGGALANG" },
1098
+ { pattern: "^Y[BE][0-9][A-Z]{1,3}$", level: "PENEGAK" }
1099
+ ]
1100
+ },
1101
+ {
1102
+ key: "jp",
1103
+ name: "Japan",
1104
+ regulator: "MIC (\u7DCF\u52D9\u7701)",
1105
+ term: "Operator Class",
1106
+ termLocal: "\u8CC7\u683C / \u7D1A",
1107
+ entities: ["JA", "JD/o", "JD/m"],
1108
+ levels: [
1109
+ { code: "4", name: "4th Class", nameLocal: "\u7B2C\u56DB\u7D1A\u30A2\u30DE\u30C1\u30E5\u30A2\u7121\u7DDA\u6280\u58EB", tier: "intermediate", maxPowerW: 20, superModes: ["PHONE", "DATA"] },
1110
+ { code: "3", name: "3rd Class", nameLocal: "\u7B2C\u4E09\u7D1A\u30A2\u30DE\u30C1\u30E5\u30A2\u7121\u7DDA\u6280\u58EB", tier: "intermediate", maxPowerW: 50 },
1111
+ { code: "2", name: "2nd Class", nameLocal: "\u7B2C\u4E8C\u7D1A\u30A2\u30DE\u30C1\u30E5\u30A2\u7121\u7DDA\u6280\u58EB", tier: "full", maxPowerW: 200 },
1112
+ { code: "1", name: "1st Class", nameLocal: "\u7B2C\u4E00\u7D1A\u30A2\u30DE\u30C1\u30E5\u30A2\u7121\u7DDA\u6280\u58EB", tier: "full", maxPowerW: 1e3 }
1113
+ ]
1114
+ },
1115
+ {
1116
+ key: "kr",
1117
+ name: "Republic of Korea",
1118
+ regulator: "MSIT (\uACFC\uD559\uAE30\uC220\uC815\uBCF4\uD1B5\uC2E0\uBD80) / \uC911\uC559\uC804\uD30C\uAD00\uB9AC\uC18C; exams KCA",
1119
+ term: "Operator Class",
1120
+ termLocal: "\uC544\uB9C8\uCD94\uC5B4\uBB34\uC120\uAE30\uC0AC \uC790\uACA9 \uB4F1\uAE09",
1121
+ entities: ["HL"],
1122
+ levels: [
1123
+ { code: "4", name: "4th Class", nameLocal: "\uC81C4\uAE09 \uC544\uB9C8\uCD94\uC5B4\uBB34\uC120\uAE30\uC0AC", tier: "basic", maxPowerW: 10, superModes: ["PHONE", "DATA"] },
1124
+ { code: "3P", name: "3rd Class (Telephony)", nameLocal: "\uC81C3\uAE09 \uC544\uB9C8\uCD94\uC5B4\uBB34\uC120\uAE30\uC0AC(\uC804\uD654\uAE09)", tier: "intermediate", maxPowerW: 100, superModes: ["PHONE", "DATA"] },
1125
+ { code: "3T", name: "3rd Class (Telegraphy)", nameLocal: "\uC81C3\uAE09 \uC544\uB9C8\uCD94\uC5B4\uBB34\uC120\uAE30\uC0AC(\uC804\uC2E0\uAE09)", tier: "intermediate", maxPowerW: 100 },
1126
+ { code: "2", name: "2nd Class", nameLocal: "\uC81C2\uAE09 \uC544\uB9C8\uCD94\uC5B4\uBB34\uC120\uAE30\uC0AC", tier: "full", maxPowerW: 200 },
1127
+ { code: "1", name: "1st Class", nameLocal: "\uC81C1\uAE09 \uC544\uB9C8\uCD94\uC5B4\uBB34\uC120\uAE30\uC0AC", tier: "full", maxPowerW: 1e3 }
1128
+ ]
1129
+ },
1130
+ {
1131
+ key: "my",
1132
+ name: "Malaysia",
1133
+ regulator: "MCMC",
1134
+ term: "Licence Class",
1135
+ termLocal: "Kelas",
1136
+ entities: ["9M2", "9M6"],
1137
+ levels: [
1138
+ { code: "C", name: "Class C", nameLocal: "Kelas C", tier: "basic", maxPowerW: 25, superModes: ["PHONE", "DATA"] },
1139
+ { code: "B", name: "Class B", nameLocal: "Kelas B", tier: "intermediate", maxPowerW: 50 },
1140
+ { code: "A", name: "Class A", nameLocal: "Kelas A", tier: "full", maxPowerW: 1e3 }
1141
+ ],
1142
+ callsigns: [
1143
+ { pattern: "^9W3[A-Z]{2,3}$", level: "C" },
1144
+ { pattern: "^9W[268][A-Z]{2,3}$", level: "B" },
1145
+ { pattern: "^9M[268][A-Z]{2,3}$", level: "A" }
1146
+ ]
1147
+ },
1148
+ {
1149
+ key: "nl",
1150
+ name: "Netherlands",
1151
+ regulator: "RDI (Rijksinspectie Digitale Infrastructuur)",
1152
+ term: "Licence Class",
1153
+ termLocal: "categorie registratie",
1154
+ entities: ["PA"],
1155
+ levels: [
1156
+ { code: "N", name: "Novice", nameLocal: "N-registratie (beperkte toegang)", tier: "intermediate", maxPowerW: 100 },
1157
+ { code: "F", name: "Full", nameLocal: "F-registratie (volledige toegang)", tier: "full", maxPowerW: 400 }
1158
+ ],
1159
+ callsigns: [
1160
+ { pattern: "^PD[0-9][A-Z]{2,3}$", level: "N" }
1161
+ ]
1162
+ },
1163
+ {
1164
+ key: "no",
1165
+ name: "Norway",
1166
+ regulator: "Nasjonal kommunikasjonsmyndighet (Nkom)",
1167
+ rules: "Forskrift om radioamat\xF8rvirksomhet FOR-2026-03-23-465 (in force 2026-03-23)",
1168
+ term: "Licence class",
1169
+ termLocal: "lisensklasse",
1170
+ entities: ["LA", "JW", "JX", "3Y/b", "3Y/p"],
1171
+ levels: [
1172
+ { code: "begrenset", name: "Limited licence", nameLocal: "Begrenset lisens", tier: "intermediate", maxPowerW: 10 },
1173
+ { code: "A", name: "Full licence", nameLocal: "Full lisens (HAREC klasse A)", tier: "full", maxPowerW: 1e3 }
1174
+ ],
1175
+ callsigns: [
1176
+ { pattern: "^L[AB][0-9][A-Z]{1,3}$", level: "A", entities: ["LA"] }
1177
+ ]
1178
+ },
1179
+ {
1180
+ key: "pl",
1181
+ name: "Poland",
1182
+ regulator: "UKE (Urz\u0105d Komunikacji Elektronicznej)",
1183
+ term: "License Category",
1184
+ termLocal: "kategoria pozwolenia",
1185
+ entities: ["SP"],
1186
+ levels: [
1187
+ { code: "3", name: "Category 3", nameLocal: "pozwolenie kategorii 3", tier: "full", maxPowerW: 100 },
1188
+ { code: "1", name: "Category 1", nameLocal: "pozwolenie kategorii 1", tier: "full", maxPowerW: 500 }
1189
+ ]
1190
+ },
1191
+ {
1192
+ key: "ro",
1193
+ name: "Romania",
1194
+ regulator: "ANCOM",
1195
+ term: "License Class",
1196
+ termLocal: "clasa",
1197
+ entities: ["YO"],
1198
+ levels: [
1199
+ { code: "IV", name: "Class IV", nameLocal: "Clasa a IV-a", tier: "full", maxPowerW: 50 },
1200
+ { code: "III", name: "Class III", nameLocal: "Clasa a III-a", tier: "full", maxPowerW: 100 },
1201
+ { code: "II", name: "Class II", nameLocal: "Clasa a II-a", tier: "full", maxPowerW: 200 },
1202
+ { code: "I", name: "Class I", nameLocal: "Clasa I", tier: "full", maxPowerW: 400 }
1203
+ ]
1204
+ },
1205
+ {
1206
+ key: "rs",
1207
+ name: "Serbia",
1208
+ regulator: "RATEL",
1209
+ term: "License Class",
1210
+ termLocal: "\u043A\u043B\u0430\u0441\u0430 \u0440\u0430\u0434\u0438\u043E-\u0430\u043C\u0430\u0442\u0435\u0440\u0430",
1211
+ entities: ["YU"],
1212
+ levels: [
1213
+ { code: "C", name: "Class C (basic)", nameLocal: "\u041A\u043B\u0430\u0441\u0430 C", tier: "intermediate", maxPowerW: 100 },
1214
+ { code: "B", name: "Class B (advanced)", nameLocal: "\u041A\u043B\u0430\u0441\u0430 B", tier: "intermediate", maxPowerW: 100 },
1215
+ { code: "A", name: "Class A", nameLocal: "\u041A\u043B\u0430\u0441\u0430 A", tier: "full", maxPowerW: 1500 }
1216
+ ]
1217
+ },
1218
+ {
1219
+ key: "ru",
1220
+ name: "Russia",
1221
+ regulator: "\u0413\u041A\u0420\u0427 / \u041C\u0438\u043D\u0446\u0438\u0444\u0440\u044B \u0420\u043E\u0441\u0441\u0438\u0438 (allocation), \u0420\u043E\u0441\u043A\u043E\u043C\u043D\u0430\u0434\u0437\u043E\u0440 + \u0424\u0413\u0423\u041F \u0413\u0420\u0427\u0426 (registration, callsigns), \u0421\u0420\u0420 (qualification exams)",
1222
+ rules: "\u0420\u0435\u0448\u0435\u043D\u0438\u0435 \u0413\u041A\u0420\u0427 10-07-01 \u0440\u0435\u0434. 18-45-02 (2018-04-16, valid to 2028-04-01); \u041F\u0440\u0438\u043A\u0430\u0437 \u041C\u0438\u043D\u043A\u043E\u043C\u0441\u0432\u044F\u0437\u0438 \u2116184 (2012); \u041F\u0440\u0438\u043A\u0430\u0437 \u21164 (2012) \u0440\u0435\u0434. 2019",
1223
+ term: "Category",
1224
+ termLocal: "\u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u044F",
1225
+ entities: ["UA", "UA2", "UA9"],
1226
+ levels: [
1227
+ { code: "4", name: "Category 4", nameLocal: "4 \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u044F (\u043D\u0430\u0447\u0430\u043B\u044C\u043D\u0430\u044F \u043A\u0432\u0430\u043B\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u044F)", tier: "basic", maxPowerW: 5 },
1228
+ { code: "3", name: "Category 3", nameLocal: "3 \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u044F (\u043A\u0432\u0430\u043B\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u044F \u043D\u043E\u0432\u0438\u0447\u043A\u0430)", tier: "full", maxPowerW: 10 },
1229
+ { code: "2", name: "Category 2", nameLocal: "2 \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u044F (\u043E\u0441\u043D\u043E\u0432\u043D\u0430\u044F/\u0431\u0430\u0437\u043E\u0432\u0430\u044F \u043A\u0432\u0430\u043B\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u044F)", tier: "full", maxPowerW: 1e3 },
1230
+ { code: "1", name: "Category 1", nameLocal: "1 \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u044F (\u0432\u044B\u0441\u0448\u0430\u044F \u043A\u0432\u0430\u043B\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u044F)", tier: "full", maxPowerW: 1e3 }
1231
+ ],
1232
+ callsigns: [
1233
+ { pattern: "^R[0-9][A-Z]{4}$", level: "4" },
1234
+ { pattern: "^U[BCD][0-9][A-Z]{3}$", level: "3", atLeast: true },
1235
+ { pattern: "^(R[A-Z]?|U[A-I])[0-9][A-Z]{1,2}$", level: "1" },
1236
+ { pattern: "^(R[ACDGJ-NOQT-Z]|UA)[0-9][A-Z]{3}$", level: "2", atLeast: true }
1237
+ ]
1238
+ },
1239
+ {
1240
+ key: "se",
1241
+ name: "Sweden",
1242
+ regulator: "Post- och telestyrelsen (PTS); certificates/callsigns issued by SSA under delegation",
1243
+ rules: "PTSFS 2025:1 (licence exemption; in force 2025-03-17)",
1244
+ term: "Certificate",
1245
+ termLocal: "certifikat",
1246
+ entities: ["SM"],
1247
+ levels: [
1248
+ { code: "insteg", name: "Entry-level certificate", nameLocal: "Instegscertifikat f\xF6r amat\xF6rradio", tier: "intermediate", maxPowerW: 25 },
1249
+ { code: "1", name: "Amateur radio certificate (HAREC)", nameLocal: "Amat\xF6rradiocertifikat", tier: "full", maxPowerW: 200 }
1250
+ ],
1251
+ callsigns: [
1252
+ { pattern: "^SH[0-9][A-Z]{3}$", level: "insteg" },
1253
+ { pattern: "^S[AM][0-9][A-Z]{1,3}$", level: "1" }
1254
+ ]
1255
+ },
1256
+ {
1257
+ key: "si",
1258
+ name: "Slovenia",
1259
+ regulator: "AKOS (Agencija za komunikacijska omre\u017Eja in storitve RS)",
1260
+ term: "Operator Class",
1261
+ termLocal: "razred radioamaterja",
1262
+ entities: ["S5"],
1263
+ levels: [
1264
+ { code: "N", name: "Class N (Novice)", nameLocal: "razred N", tier: "intermediate", maxPowerW: 100 },
1265
+ { code: "A", name: "Class A", nameLocal: "razred A", tier: "full", maxPowerW: 1500 }
1266
+ ],
1267
+ callsigns: [
1268
+ { pattern: "^S52[A-XZ][A-Z]{2}$", level: "N", atLeast: true },
1269
+ { pattern: "^S58[A-X][A-Z]{2}$", level: "N", atLeast: true }
1270
+ ]
1271
+ },
1272
+ {
1273
+ key: "ua",
1274
+ name: "Ukraine",
1275
+ regulator: "\u041D\u041A\u0415\u041A (National Commission for State Regulation of Electronic Communications...), \u0423\u0414\u0426\u0420 (callsigns/permits)",
1276
+ rules: "\u0420\u0435\u0433\u043B\u0430\u043C\u0435\u043D\u0442 \u0430\u043C\u0430\u0442\u043E\u0440\u0441\u044C\u043A\u043E\u0433\u043E \u0440\u0430\u0434\u0456\u043E\u0437\u0432'\u044F\u0437\u043A\u0443 \u0423\u043A\u0440\u0430\u0457\u043D\u0438, \u041F\u043E\u0441\u0442\u0430\u043D\u043E\u0432\u0430 \u041D\u041A\u0415\u041A 10.05.2023 \u2116173 (\u041C\u042E 29.06.2023 \u21161106/40162), Annex 2 Table 12",
1277
+ term: "Qualification",
1278
+ termLocal: "\u043A\u0432\u0430\u043B\u0456\u0444\u0456\u043A\u0430\u0446\u0456\u044F \u0440\u0430\u0434\u0456\u043E\u0430\u043C\u0430\u0442\u043E\u0440\u0430",
1279
+ entities: ["UR"],
1280
+ levels: [
1281
+ { code: "C", name: "Entry level (student)", nameLocal: "C \u2014 \u0440\u0430\u0434\u0456\u043E\u0430\u043C\u0430\u0442\u043E\u0440-\u0443\u0447\u0435\u043D\u044C", tier: "intermediate", maxPowerW: 40 },
1282
+ { code: "B", name: "Novice", nameLocal: "B \u2014 \u0440\u0430\u0434\u0456\u043E\u0430\u043C\u0430\u0442\u043E\u0440-\u043F\u043E\u0447\u0430\u0442\u043A\u0456\u0432\u0435\u0446\u044C", tier: "intermediate", aliases: ["3 \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0456\u044F"], maxPowerW: 100 },
1283
+ { code: "A", name: "Higher qualification (HAREC)", nameLocal: "A \u2014 \u0432\u0438\u0449\u0430 \u043A\u0432\u0430\u043B\u0456\u0444\u0456\u043A\u0430\u0446\u0456\u044F \u0440\u0430\u0434\u0456\u043E\u0430\u043C\u0430\u0442\u043E\u0440\u0430", tier: "full", aliases: ["1 \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0456\u044F", "2 \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0456\u044F"], maxPowerW: 200 }
1284
+ ],
1285
+ callsigns: [
1286
+ { pattern: "^U[R-Z][0-9][A-Z]{2}$", level: "A" }
1287
+ ]
1288
+ },
1289
+ {
1290
+ key: "us",
1291
+ name: "United States",
1292
+ regulator: "FCC",
1293
+ rules: "47 CFR Part 97 (eCFR, current to 2026-10-09)",
1294
+ term: "License Class",
1295
+ termLocal: "operator license class",
1296
+ entities: ["K", "KL", "KH6", "KP4", "KP2", "KP1", "KP5", "KG4", "KH0", "KH1", "KH2", "KH3", "KH4", "KH5", "KH7K", "KH8", "KH8/s", "KH9"],
1297
+ levels: [
1298
+ { code: "N", name: "Novice", tier: "basic", legacy: true, maxPowerW: 200 },
1299
+ { code: "T", name: "Technician", tier: "basic", maxPowerW: 1500 },
1300
+ { code: "G", name: "General", tier: "intermediate", maxPowerW: 1500 },
1301
+ { code: "A", name: "Advanced", tier: "intermediate", legacy: true, maxPowerW: 1500 },
1302
+ { code: "E", name: "Amateur Extra", tier: "full", maxPowerW: 1500 }
1303
+ ],
1304
+ callsigns: [
1305
+ { pattern: "^[KNW][0-9][A-Z]{2}$", level: "E", entities: ["K"] },
1306
+ { pattern: "^[AKNW][A-Z][0-9][A-Z]$", level: "E", entities: ["K"] },
1307
+ { pattern: "^A[A-K][0-9][A-Z]{2}$", level: "E", entities: ["K"] },
1308
+ { pattern: "^[KNW][A-Z][0-9][A-Z]{2}$", level: "A", atLeast: true, entities: ["K"] },
1309
+ { pattern: "^[KNW][0-9][A-Z]{3}$", level: "T", atLeast: true, entities: ["K"] },
1310
+ { pattern: "^[KNW]P[0-9][A-Z]$", level: "E", entities: ["KP4", "KP2", "KP1", "KP5"] },
1311
+ { pattern: "^KP[0-9][A-Z]{2}$", level: "A", atLeast: true, entities: ["KP4", "KP2", "KP1", "KP5"] },
1312
+ { pattern: "^[NW]P[0-9][A-Z]{2}$", level: "T", atLeast: true, entities: ["KP4", "KP2", "KP1", "KP5"] }
1313
+ ]
1314
+ }
1315
+ ]
1316
+ };
1317
+
1318
+ // src/lib/licenseLevels.ts
1319
+ var LICENSE_LEVELS = licenseLevels_default;
1320
+ var bandPlansData2 = bandPlans_default;
1321
+ function licenseJurisdictionForEntity(entityPrefix) {
1322
+ return LICENSE_LEVELS.jurisdictions.find((jurisdiction) => jurisdiction.entities.includes(entityPrefix));
1323
+ }
1324
+ function licenseLevelKey(jurisdiction, level) {
1325
+ return `${jurisdiction.key}:${level.code}`;
1326
+ }
1327
+ function resolveLicenseLevel(key) {
1328
+ const colon = key.indexOf(":");
1329
+ if (colon <= 0) return void 0;
1330
+ const jurisdiction = LICENSE_LEVELS.jurisdictions.find((j) => j.key === key.slice(0, colon));
1331
+ const level = jurisdiction?.levels.find((l) => l.code === key.slice(colon + 1));
1332
+ return jurisdiction && level ? { jurisdiction, level } : void 0;
1333
+ }
1334
+ function licenseLevelForCallsign(call, entityPrefix) {
1335
+ const jurisdiction = licenseJurisdictionForEntity(entityPrefix);
1336
+ if (!jurisdiction) return void 0;
1337
+ const bare = call.toUpperCase().split("/").reduce((best, part) => part.length > best.length ? part : best, "");
1338
+ const rule = jurisdiction.callsigns?.find((r) => (!r.entities || r.entities.includes(entityPrefix)) && new RegExp(r.pattern).test(bare));
1339
+ const level = rule && jurisdiction.levels.find((l) => l.code === rule.level);
1340
+ return rule && level ? { jurisdiction, level, atLeast: Boolean(rule.atLeast) } : void 0;
1341
+ }
1342
+ function isOutsideLicensePrivileges(khz, options) {
1343
+ const { level: key, entityPrefix, ituRegion, mode } = options;
1344
+ const resolved = resolveLicenseLevel(key);
1345
+ if (!resolved || !resolved.jurisdiction.entities.includes(entityPrefix)) return void 0;
1346
+ const band = Object.values(bandPlansData2.bands).find((b) => b.mhz[0] <= khz && khz <= b.mhz[1]);
1347
+ if (!band) return void 0;
1348
+ if (band.exceptLevels?.includes(key)) return true;
1349
+ let allowed = resolved.level.superModes ?? SUPER_MODES;
1350
+ for (const segment of band.segments) {
1351
+ if (!(segment.mhz[0] < khz && khz < segment.mhz[1])) continue;
1352
+ if (segment.entities && !segment.entities.includes(entityPrefix)) continue;
1353
+ if (segment.regions && !(ituRegion && segment.regions.includes(ituRegion))) continue;
1354
+ if (segment.exceptLevels?.includes(key)) return true;
1355
+ if (segment.levels?.includes(key)) allowed = allowed.filter((m) => segment.superModes?.includes(m));
1356
+ }
1357
+ return mode ? !allowed.includes(superModeForMode(mode)) : false;
1358
+ }
1359
+
628
1360
  exports.ADIF_MODES = ADIF_MODES;
629
1361
  exports.ADIF_MODES_AND_SUBMODES = ADIF_MODES_AND_SUBMODES;
630
1362
  exports.ADIF_MODE_FOR_SUBMODE = ADIF_MODE_FOR_SUBMODE;
@@ -635,6 +1367,7 @@ exports.CONTEST_BANDS = CONTEST_BANDS;
635
1367
  exports.EHF_BANDS = EHF_BANDS;
636
1368
  exports.EXTENDED_BANDS = EXTENDED_BANDS;
637
1369
  exports.HF_BANDS = HF_BANDS;
1370
+ exports.LICENSE_LEVELS = LICENSE_LEVELS;
638
1371
  exports.MAIN_MODES = MAIN_MODES;
639
1372
  exports.PHONE_MODES = PHONE_MODES;
640
1373
  exports.POPULAR_BANDS = POPULAR_BANDS;
@@ -647,7 +1380,12 @@ exports.adifModeAndSubmodeForMode = adifModeAndSubmodeForMode;
647
1380
  exports.bandForExactFrequencyInMHz = bandForExactFrequencyInMHz;
648
1381
  exports.bandForFrequency = bandForFrequency;
649
1382
  exports.frequencyForBand = frequencyForBand;
1383
+ exports.isOutsideLicensePrivileges = isOutsideLicensePrivileges;
1384
+ exports.licenseJurisdictionForEntity = licenseJurisdictionForEntity;
1385
+ exports.licenseLevelForCallsign = licenseLevelForCallsign;
1386
+ exports.licenseLevelKey = licenseLevelKey;
650
1387
  exports.modeForFrequency = modeForFrequency;
1388
+ exports.resolveLicenseLevel = resolveLicenseLevel;
651
1389
  exports.superModeForMode = superModeForMode;
652
1390
  //# sourceMappingURL=index.cjs.map
653
1391
  //# sourceMappingURL=index.cjs.map