diff --git a/app/src/main/java/com/rtbishop/look4sat/MainScreen.kt b/app/src/main/java/com/rtbishop/look4sat/MainScreen.kt index 009e0ac2..d77ef8fb 100644 --- a/app/src/main/java/com/rtbishop/look4sat/MainScreen.kt +++ b/app/src/main/java/com/rtbishop/look4sat/MainScreen.kt @@ -149,7 +149,8 @@ fun MainScreen(navigateToRadar: () -> Unit = {}) { val trackingState by container.radioTrackingService.state.collectAsStateWithLifecycle() val otherSettings by container.settingsRepo.otherSettings.collectAsStateWithLifecycle() // UI 设置: 按 screenOrder 排序(空 = 默认顺序), 再按 hiddenScreens 过滤(设置页固定保留) - val allNavItems = listOf(Screen.Satellites, Screen.Passes, Screen.Radar, Screen.Mutual, Screen.Roaming, Screen.CwDecode, Screen.WavelogLog, Screen.AmSat, Screen.Map, Screen.Settings) + val ft8Context = androidx.compose.ui.platform.LocalContext.current + val allNavItems = listOf(Screen.Satellites, Screen.Passes, Screen.Radar, Screen.Mutual, Screen.Roaming, Screen.CwDecode, Screen.WavelogLog, Screen.AmSat, Screen.Ft8, Screen.Map, Screen.Settings) .sortedBy { screen -> // 未知(新页面如 CwDecode 不在旧持久化顺序里): 用默认顺序位置(漫游↔地图), 再兜底最后 val idx = otherSettings.screenOrder.indexOf(screen.screenId) @@ -207,6 +208,13 @@ fun MainScreen(navigateToRadar: () -> Unit = {}) { onClick = { if (isSelected) return@item moreExpanded = false + if (screen is Screen.Ft8) { + ft8Context.startActivity( + android.content.Intent() + .setClassName(ft8Context.packageName, "com.bg7yoz.ft8cn.MainActivity") + ) + return@item + } while (backStack.size > 1) backStack.removeAt(backStack.size - 1) if (screen !is Screen.Passes) backStack.add(screen) } @@ -361,6 +369,13 @@ fun MainScreen(navigateToRadar: () -> Unit = {}) { onDismiss = { moreExpanded = false }, onSelect = { screen -> moreExpanded = false + if (screen is Screen.Ft8) { + ft8Context.startActivity( + android.content.Intent() + .setClassName(ft8Context.packageName, "com.bg7yoz.ft8cn.MainActivity") + ) + return@MoreMenuPopup + } while (backStack.size > 1) backStack.removeAt(backStack.size - 1) if (screen !is Screen.Passes) backStack.add(screen) } diff --git a/build-logic/convention/src/main/java/com/rtbishop/look4sat/convention/ApplicationPlugin.kt b/build-logic/convention/src/main/java/com/rtbishop/look4sat/convention/ApplicationPlugin.kt index e91f4ed1..b927942b 100644 --- a/build-logic/convention/src/main/java/com/rtbishop/look4sat/convention/ApplicationPlugin.kt +++ b/build-logic/convention/src/main/java/com/rtbishop/look4sat/convention/ApplicationPlugin.kt @@ -40,6 +40,7 @@ internal class ApplicationPlugin : Plugin { implementation(project(":feature:satellites")) implementation(project(":feature:settings")) implementation(project(":feature:status")) + implementation(project(":feature:ft8")) implementation(libs.androidx.core.splashscreen) implementation(libs.compose.material3.adaptive) implementation(libs.compose.navigation3) diff --git a/core/presentation/src/main/java/com/rtbishop/look4sat/core/presentation/Navigation.kt b/core/presentation/src/main/java/com/rtbishop/look4sat/core/presentation/Navigation.kt index b44596b4..108bca9a 100644 --- a/core/presentation/src/main/java/com/rtbishop/look4sat/core/presentation/Navigation.kt +++ b/core/presentation/src/main/java/com/rtbishop/look4sat/core/presentation/Navigation.kt @@ -50,6 +50,9 @@ sealed class Screen(val iconResId: Int, val titleResId: Int, val screenId: Strin @Serializable data object AmSat : Screen(R.drawable.ic_satellites, R.string.nav_amsat, "AMSAT") + @Serializable + data object Ft8 : Screen(R.drawable.ic_radios, R.string.nav_ft8, "FT8") + @Serializable data object Settings : Screen(R.drawable.ic_settings, R.string.nav_prefs, "Settings") } @@ -58,7 +61,7 @@ sealed class Screen(val iconResId: Int, val titleResId: Int, val screenId: Strin val defaultScreenOrder = listOf("Satellites", "Passes", "Radar", "Map", "Settings") // UI 设置: 默认更多菜单顺序(进「更多」的页面) -val defaultSubMenuOrder = listOf("Mutual", "Roaming", "CwDecode", "WavelogLog", "AMSAT") +val defaultSubMenuOrder = listOf("Mutual", "Roaming", "CwDecode", "WavelogLog", "AMSAT", "FT8") @Serializable data object RadarDestination : NavKey diff --git a/core/presentation/src/main/res/values-id/strings.xml b/core/presentation/src/main/res/values-id/strings.xml index a8adb957..48eb4c8b 100644 --- a/core/presentation/src/main/res/values-id/strings.xml +++ b/core/presentation/src/main/res/values-id/strings.xml @@ -45,6 +45,7 @@ Lainnya Log AMSAT + FT8 Status Satelit AMSAT Diperbarui: Aktif @@ -90,14 +91,8 @@ Pastikan Anda mengatur posisi melalui GPS, Lat/Lon atau QTH di Pengaturan. \n\nPerbarui database setidaknya seminggu sekali untuk prediksi yang akurat. Apa yang baru di Look4Sat - - * BARU: Halaman status satelit AMSAT - tabel status langsung (warna resmi), jumlah laporan, laporan detail per satelit/hari - * Log dikelompokkan per lintasan satelit (sesi = satelit + waktu AOS), garis pemisah antar sesi - * GPS kini hanya menampilkan sukses saat posisi benar-benar didapat (timeout 15 dtk, cek izin) - * Pesan kegagalan jelas saat database satelit gagal diunduh - * Frekuensi log mengikuti panel Doppler secara real-time; visual hapus geser dipulihkan - * Perbaikan bahasa Indonesia (values-id) - * BARU: Pelaporan APRS (jaringan APRS-IS, layanan latar depan dengan notifikasi, interval dapat diatur) + * BARU: Mode FT8 (integrasi FT8CN 0.93 - antarmuka dekoder/pemancar lengkap, spektrum, log, database panggilan; masuk di menu Lainnya) + Kembali Beri tahu Azimuth diff --git a/core/presentation/src/main/res/values-in/strings.xml b/core/presentation/src/main/res/values-in/strings.xml index e8083071..df7c1e51 100644 --- a/core/presentation/src/main/res/values-in/strings.xml +++ b/core/presentation/src/main/res/values-in/strings.xml @@ -45,6 +45,7 @@ Lainnya Log AMSAT + FT8 Status Satelit AMSAT Diperbarui: Aktif @@ -89,14 +90,8 @@ Pastikan Anda mengatur posisi melalui GPS, Lat/Lon atau QTH di Pengaturan. \n\nPerbarui database setidaknya seminggu sekali untuk prediksi yang akurat. Apa yang baru di Look4Sat - - * BARU: Halaman status satelit AMSAT - tabel status langsung (warna resmi), jumlah laporan, laporan detail per satelit/hari - * Log dikelompokkan per lintasan satelit (sesi = satelit + waktu AOS), garis pemisah antar sesi - * GPS kini hanya menampilkan sukses saat posisi benar-benar didapat (timeout 15 dtk, cek izin) - * Pesan kegagalan jelas saat database satelit gagal diunduh - * Frekuensi log mengikuti panel Doppler secara real-time; visual hapus geser dipulihkan - * Perbaikan bahasa Indonesia (values-id) - * BARU: Pelaporan APRS (jaringan APRS-IS, layanan latar depan dengan notifikasi, interval dapat diatur) + * BARU: Mode FT8 (integrasi FT8CN 0.93 - antarmuka dekoder/pemancar lengkap, spektrum, log, database panggilan; masuk di menu Lainnya) + Kembali Beri tahu Azimuth diff --git a/core/presentation/src/main/res/values-tr/strings.xml b/core/presentation/src/main/res/values-tr/strings.xml index 3f672102..65a8f2ea 100644 --- a/core/presentation/src/main/res/values-tr/strings.xml +++ b/core/presentation/src/main/res/values-tr/strings.xml @@ -46,6 +46,7 @@ Daha Fazla Günlük AMSAT + FT8 AMSAT Uydu Durumu Güncellendi: Aktif @@ -94,14 +95,8 @@ Ayarlar\'dan GPS, Enlem/Boylam veya QTH kullanarak konumunuzu belirlediğinizden emin olun. \n\nDoğru tahminler alabilmek için veritabanını en az haftada bir güncelleyin. What\'s new in Look4Sat - - * YENİ: AMSAT uydu durum sayfası - canlı durum tablosu (resmi renkler), rapor sayıları, uydu/gün bazında detaylı raporlar - * Günlükler uydu geçişine göre gruplanır (oturum = uydu + AOS zamanı), oturumlar arasında ayırıcı çizgi - * GPS artık yalnızca gerçek konum alındığında başarı gösterir (15 sn zaman aşımı, izin kontrolü) - * Uydu veritabanı indirilemediğinde net hata mesajı gösterilir - * Günlük frekansları Doppler panelini gerçek zamanlı takip eder; kaydırarak silme görselleri düzeltildi - * Endonezya dili düzeltmesi (values-id) - * YENİ: APRS raporlama (APRS-IS ağı, bildirimli ön plan hizmeti, ayarlanabilir aralık) + * YENİ: FT8 modu (FT8CN 0.93 entegre - tam kod çözücü/verici arayüzü, spektrum, günlükler, çağrı veritabanı; giriş Diğer menüde) + Geri diff --git a/core/presentation/src/main/res/values-zh/strings.xml b/core/presentation/src/main/res/values-zh/strings.xml index c7fa605c..93c4faa5 100644 --- a/core/presentation/src/main/res/values-zh/strings.xml +++ b/core/presentation/src/main/res/values-zh/strings.xml @@ -47,6 +47,7 @@ 更多 日志 AMSAT + FT8 AMSAT 卫星状态 更新: 活跃 @@ -84,14 +85,8 @@ 欢迎来到 Look4Sat\! 请务必在设置中通过GPS、经纬度或QTH定位您的位置\n建议至少每周更新一次数据库,以确保预测结果的准确性 Look4Sat Pro 更新内容 - - * 新增: AMSAT 卫星状态页 - 实时状态表格(官网配色)、报告数量、逐卫星/逐日详细报告 - * 日志按场次分组(场次 = 卫星 + AOS 时间), 组间横线分隔 - * GPS 真正定位成功才会提示成功(15 秒超时, 权限检查) - * 卫星数据库下载失败时有明确失败提示 - * 日志频率实时跟随多普勒面板; 左滑删除视觉恢复 - * 印尼语识别修复(values-id) - * 新增: APRS 网络上报(APRS-IS,前台服务+通知保活,周期可调) + * 新增: FT8 模式(集成 FT8CN 0.93 - 完整解码/发射界面、频谱、日志、呼号库;入口在更多菜单) + 后退 diff --git a/core/presentation/src/main/res/values/strings.xml b/core/presentation/src/main/res/values/strings.xml index dcdc47d3..05ed2ccc 100644 --- a/core/presentation/src/main/res/values/strings.xml +++ b/core/presentation/src/main/res/values/strings.xml @@ -48,6 +48,7 @@ More Log AMSAT + FT8 AMSAT Satellite Status Updated: Active @@ -96,14 +97,8 @@ Make sure to set your position via GPS, Lat/Lon or QTH in Settings. \n\nPlease update the database at least weekly to get accurate predictions. What\'s new in Look4Sat - - * NEW: AMSAT satellite status page - live status grid (official colors), report counts, detailed reports per satellite/day - * Log entries grouped by satellite pass (session ID = satellite + AOS time), divider lines between sessions - * GPS now only reports success when a real fix is acquired (15s timeout, permission check) - * Data update shows a clear failure message when the satellite database cannot be downloaded - * Log frequencies follow the Doppler panel in real time; swipe-to-delete visuals restored - * Indonesian locale fix (values-id) - * NEW: APRS reporting (APRS-IS network, foreground service with notification, configurable interval) + * NEW: FT8 mode (integrated FT8CN 0.93 - full decoder/transmitter UI, spectrum, logs, callsign database; entry in More menu) + Back diff --git a/feature/ft8/build.gradle.kts b/feature/ft8/build.gradle.kts new file mode 100644 index 00000000..c489203b --- /dev/null +++ b/feature/ft8/build.gradle.kts @@ -0,0 +1,45 @@ +plugins { + alias(libs.plugins.convention.featurePlugin) +} + +android { + namespace = "com.bg7yoz.ft8cn" + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + buildFeatures { + dataBinding = true + buildConfig = true + } + defaultConfig { + buildConfigField("String", "apkBuildTime", "\"2026-08-05\"") + buildConfigField("String", "APPLICATION_ID", "\"com.bg7yoz.ft8cn\"") + buildConfigField("String", "VERSION_NAME", "\"0.93\"") + } + androidComponents { + onVariants(selector().all()) { variant -> + (variant as? com.android.build.api.variant.CanProduceConsumerProguardFiles) + ?.consumerProguardFiles?.add( + project.layout.projectDirectory.file("proguard-rules.pro") + ) + } + } +} + +dependencies { + implementation("androidx.appcompat:appcompat:1.6.1") + implementation("com.google.android.material:material:1.8.0") + implementation("androidx.constraintlayout:constraintlayout:2.1.4") + implementation("androidx.lifecycle:lifecycle-livedata:2.5.1") + implementation("androidx.lifecycle:lifecycle-viewmodel:2.5.1") + implementation("androidx.legacy:legacy-support-v4:1.0.0") + implementation("androidx.navigation:navigation-fragment:2.5.3") + implementation("androidx.navigation:navigation-ui:2.5.3") + implementation("com.google.android.gms:play-services-maps:18.1.0") + implementation("com.google.guava:guava:31.1-jre") + implementation(files("libs/MPAndroidChartv_3.1.0.jar")) + implementation(files("libs/commons-net-3.6.jar")) + implementation(files("libs/nanohttpd-2.2.0.jar")) + implementation(files("libs/osmdroid-android-6.1.14.aar")) +} diff --git a/feature/ft8/libs/MPAndroidChartv_3.1.0.jar b/feature/ft8/libs/MPAndroidChartv_3.1.0.jar new file mode 100644 index 00000000..ade2ce11 Binary files /dev/null and b/feature/ft8/libs/MPAndroidChartv_3.1.0.jar differ diff --git a/feature/ft8/libs/commons-net-3.6.jar b/feature/ft8/libs/commons-net-3.6.jar new file mode 100644 index 00000000..4537623e Binary files /dev/null and b/feature/ft8/libs/commons-net-3.6.jar differ diff --git a/feature/ft8/libs/nanohttpd-2.2.0.jar b/feature/ft8/libs/nanohttpd-2.2.0.jar new file mode 100644 index 00000000..1f1e82cd Binary files /dev/null and b/feature/ft8/libs/nanohttpd-2.2.0.jar differ diff --git a/feature/ft8/libs/osmdroid-android-6.1.14.aar b/feature/ft8/libs/osmdroid-android-6.1.14.aar new file mode 100644 index 00000000..77f6d3e4 Binary files /dev/null and b/feature/ft8/libs/osmdroid-android-6.1.14.aar differ diff --git a/feature/ft8/proguard-rules.pro b/feature/ft8/proguard-rules.pro new file mode 100644 index 00000000..6fd32738 --- /dev/null +++ b/feature/ft8/proguard-rules.pro @@ -0,0 +1,3 @@ +# FT8CN 移植:JNI 类必须保留(RegisterNatives 按类名解析,混淆会 UnsatisfiedLinkError) +-keep class com.bg7yoz.ft8cn.** { *; } +-keepclassmembers class com.bg7yoz.ft8cn.** { native ; } diff --git a/feature/ft8/src/main/AndroidManifest.xml b/feature/ft8/src/main/AndroidManifest.xml new file mode 100644 index 00000000..38990bd1 --- /dev/null +++ b/feature/ft8/src/main/AndroidManifest.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/assets/ConfigFragment.java b/feature/ft8/src/main/assets/ConfigFragment.java new file mode 100644 index 00000000..3501cbcc --- /dev/null +++ b/feature/ft8/src/main/assets/ConfigFragment.java @@ -0,0 +1,1282 @@ +package com.bg7yoz.ft8cn.ui; +/** + * 设置界面。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.annotation.SuppressLint; +import android.content.Intent; +import android.os.Bundle; +import android.os.Handler; +import android.text.Editable; +import android.text.TextWatcher; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.CompoundButton; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.lifecycle.Observer; + +import com.bg7yoz.ft8cn.FAQActivity; +import com.bg7yoz.ft8cn.Ft8Message; +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.MainViewModel; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.connector.ConnectMode; +import com.bg7yoz.ft8cn.database.ControlMode; +import com.bg7yoz.ft8cn.database.OperationBand; +import com.bg7yoz.ft8cn.database.RigNameList; +import com.bg7yoz.ft8cn.databinding.FragmentConfigBinding; +import com.bg7yoz.ft8cn.ft8signal.FT8Package; +import com.bg7yoz.ft8cn.maidenhead.MaidenheadGrid; +import com.bg7yoz.ft8cn.rigs.InstructionSet; +import com.bg7yoz.ft8cn.timer.UtcTimer; + +import java.io.IOException; + +/** + * A simple {@link Fragment} subclass. + * create an instance of this fragment. + */ +public class ConfigFragment extends Fragment { + private static final String TAG = "ConfigFragment"; + private MainViewModel mainViewModel; + private FragmentConfigBinding binding; + private BandsSpinnerAdapter bandsSpinnerAdapter; + private BauRateSpinnerAdapter bauRateSpinnerAdapter; + private RigNameSpinnerAdapter rigNameSpinnerAdapter; + private LaunchSupervisionSpinnerAdapter launchSupervisionSpinnerAdapter; + private PttDelaySpinnerAdapter pttDelaySpinnerAdapter; + private NoReplyLimitSpinnerAdapter noReplyLimitSpinnerAdapter; + //private SerialPortSpinnerAdapter serialPortSpinnerAdapter; + + public ConfigFragment() { + // Required empty public constructor + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + + //我的网格位置 + private final TextWatcher onGridEditorChanged = new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + //String s = ""; + StringBuilder s=new StringBuilder(); + for (int j = 0; j < binding.inputMyGridEdit.getText().length(); j++) { + if (j < 2) { + //s = s + Character.toUpperCase(binding.inputMyGridEdit.getText().charAt(j)); + s.append(Character.toUpperCase(binding.inputMyGridEdit.getText().charAt(j))); + } else { + //s = s + Character.toLowerCase(binding.inputMyGridEdit.getText().charAt(j)); + s.append(Character.toLowerCase(binding.inputMyGridEdit.getText().charAt(j))); + } + } + writeConfig("grid", s.toString()); + GeneralVariables.setMyMaidenheadGrid(s.toString()); + } + }; + //我的呼号 + private final TextWatcher onMyCallEditorChanged = new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + writeConfig("callsign", editable.toString().toUpperCase().trim()); + String callsign = editable.toString().toUpperCase().trim(); + if (callsign.length() > 0) { + Ft8Message.hashList.addHash(FT8Package.getHash22(callsign), callsign); + Ft8Message.hashList.addHash(FT8Package.getHash12(callsign), callsign); + Ft8Message.hashList.addHash(FT8Package.getHash10(callsign), callsign); + } + GeneralVariables.myCallsign = (editable.toString().toUpperCase().trim()); + } + }; + //发射频率 + private final TextWatcher onFreqEditorChanged = new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + setfreq(editable.toString()); + } + }; + //发射延迟时间 + private final TextWatcher onTransDelayEditorChanged = new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + int transDelay = 1000; + if (editable.toString().matches("^\\d{1,4}$")) { + transDelay = Integer.parseInt(editable.toString()); + } + GeneralVariables.transmitDelay = transDelay; + mainViewModel.ft8TransmitSignal.setTimer_sec(GeneralVariables.transmitDelay); + writeConfig("transDelay", Integer.toString(transDelay)); + } + }; + + //排除的呼号前缀 + private final TextWatcher onExcludedCallsigns=new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + GeneralVariables.addExcludedCallsigns(editable.toString()); + writeConfig("excludedCallsigns", GeneralVariables.getExcludeCallsigns()); + } + }; + + //修饰符 + private final TextWatcher onModifierEditorChanged = new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + if (editable.toString().toUpperCase().trim().matches("[0-9]{3}|[A-Z]{1,4}") + ||editable.toString().trim().length()==0){ + binding.modifierEdit.setTextColor(requireContext().getColor(R.color.text_view_color)); + GeneralVariables.toModifier=editable.toString().toUpperCase().trim(); + writeConfig("toModifier", GeneralVariables.toModifier); + }else{ + binding.modifierEdit.setTextColor(requireContext().getColor(R.color.text_view_error_color)); + } + } + }; + + //CI-V地址 + private final TextWatcher onCIVAddressEditorChanged = new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + if (editable.toString().length() < 2) { + return; + } + String s = "0x" + editable.toString(); + if (s.matches("\\b0[xX][0-9a-fA-F]+\\b")) {//匹配十六进制 + String temp = editable.toString().substring(0, 2).toUpperCase(); + writeConfig("civ", temp); + GeneralVariables.civAddress = Integer.parseInt(temp, 16); + mainViewModel.setCivAddress(); + } + } + }; + + + @SuppressLint("DefaultLocale") + private void setfreq(String sFreq) { + float freq; + try { + freq = Float.parseFloat(sFreq); + if (freq < 100) { + freq = 100; + } + if (freq > 2900) { + freq = 2900; + } + } catch (Exception e + ) { + freq = 1000; + } + + + writeConfig("freq", String.format("%.0f", freq)); + GeneralVariables.setBaseFrequency(freq); + } + + @SuppressLint("SetTextI18n") + @Override + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + mainViewModel = MainViewModel.getInstance(this); + binding = FragmentConfigBinding.inflate(inflater, container, false); + + //只对中国开方问题收集 +// if (GeneralVariables.isChina) { +// binding.faqButton.setVisibility(View.VISIBLE); +// } else { +// binding.faqButton.setVisibility(View.GONE); +// } + + + //设置时间偏移 + setUtcTimeOffsetSpinner(); + + //设置PTT延时 + setPttDelaySpinner(); + + //设置操作频段 + setBandsSpinner(); + + //设置波特率列表 + setBauRateSpinner(); + + //设置电台名称,参数列表 + setRigNameSpinner(); + + //设置解码模式 + setDecodeMode(); + + //设置音频输出的位数 + setAudioOutputBitsMode(); + + //设置音频输出采样率 + setAudioOutputRateMode(); + + //设置显示消息模式 + setMessageMode(); + + //设置控制模式 VOX CAT + setControlMode(); + + //设置连线的方式 + setConnectMode(); + + //设置发射监管列表 + setLaunchSupervision(); + + //设置帮助对话框 + setHelpDialog(); + + //设置无回应次数中断 + setNoReplyLimitSpinner(); + + //显示滚动箭头 + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + setScrollImageVisible(); + } + }, 1000); + binding.scrollView3.setOnScrollChangeListener(new View.OnScrollChangeListener() { + @Override + public void onScrollChange(View view, int i, int i1, int i2, int i3) { + setScrollImageVisible(); + } + }); + + //FAQ按钮的onClick + binding.faqButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Intent intent = new Intent(requireContext(), FAQActivity.class); + startActivity(intent); + } + }); + + //梅登海德网格 + binding.inputMyGridEdit.removeTextChangedListener(onGridEditorChanged); + binding.inputMyGridEdit.setText(GeneralVariables.getMyMaidenheadGrid()); + binding.inputMyGridEdit.addTextChangedListener(onGridEditorChanged); + + //我的呼号 + binding.inputMycallEdit.removeTextChangedListener(onMyCallEditorChanged); + binding.inputMycallEdit.setText(GeneralVariables.myCallsign); + binding.inputMycallEdit.addTextChangedListener(onMyCallEditorChanged); + + //修饰符 + binding.modifierEdit.removeTextChangedListener(onModifierEditorChanged); + binding.modifierEdit.setText(GeneralVariables.toModifier); + binding.modifierEdit.addTextChangedListener(onModifierEditorChanged); + + //发射频率 + binding.inputFreqEditor.removeTextChangedListener(onFreqEditorChanged); + binding.inputFreqEditor.setText(GeneralVariables.getBaseFrequencyStr()); + binding.inputFreqEditor.addTextChangedListener(onFreqEditorChanged); + + + + //CIV地址 + binding.civAddressEdit.removeTextChangedListener(onCIVAddressEditorChanged); + binding.civAddressEdit.setText(GeneralVariables.getCivAddressStr()); + binding.civAddressEdit.addTextChangedListener(onCIVAddressEditorChanged); + + //发射延迟 + binding.inputTransDelayEdit.removeTextChangedListener(onTransDelayEditorChanged); + binding.inputTransDelayEdit.setText(GeneralVariables.getTransmitDelayStr()); + binding.inputTransDelayEdit.addTextChangedListener(onTransDelayEditorChanged); + + binding.excludedCallsignEdit.removeTextChangedListener(onExcludedCallsigns); + binding.excludedCallsignEdit.setText(GeneralVariables.getExcludeCallsigns()); + binding.excludedCallsignEdit.addTextChangedListener(onExcludedCallsigns); + + + //设置同频发射开关 + binding.synFrequencySwitch.setOnCheckedChangeListener(null); + binding.synFrequencySwitch.setChecked(GeneralVariables.synFrequency); + setSyncFreqText();//设置开关的文本 + binding.synFrequencySwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean b) { + if (binding.synFrequencySwitch.isChecked()) { + mainViewModel.databaseOpr.writeConfig("synFreq", "1", null); + } else { + mainViewModel.databaseOpr.writeConfig("synFreq", "0", null); + setfreq(binding.inputFreqEditor.getText().toString()); + } + GeneralVariables.synFrequency = binding.synFrequencySwitch.isChecked(); + setSyncFreqText(); + binding.inputFreqEditor.setEnabled(!binding.synFrequencySwitch.isChecked()); + } + }); + + //设置PTT延迟 + binding.pttDelayOffsetSpinner.setOnItemSelectedListener(null); + binding.pttDelayOffsetSpinner.setSelection(GeneralVariables.pttDelay / 10); + binding.pttDelayOffsetSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView adapterView, View view, int i, long l) { + GeneralVariables.pttDelay = i * 10; + writeConfig("pttDelay", String.valueOf(GeneralVariables.pttDelay)); + } + + @Override + public void onNothingSelected(AdapterView adapterView) { + + } + }); + + + //获取操作的波段 + binding.operationBandSpinner.setOnItemSelectedListener(null); + binding.operationBandSpinner.setSelection(GeneralVariables.bandListIndex); + binding.operationBandSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView adapterView, View view, int i, long l) { + GeneralVariables.bandListIndex = i; + GeneralVariables.band = OperationBand.getBandFreq(i);//把当前的频段保存下来 + + mainViewModel.databaseOpr.getAllQSLCallsigns();//通联成功的呼号读出来 + writeConfig("bandFreq", String.valueOf(GeneralVariables.band)); + if (GeneralVariables.controlMode == ControlMode.CAT//CAT、RTS、DTR模式下控制电台 + || GeneralVariables.controlMode == ControlMode.RTS + || GeneralVariables.controlMode == ControlMode.DTR) { + //如果在CAT、RTS模式下,修改电台的频率 + mainViewModel.setOperationBand(); + } + } + + @Override + public void onNothingSelected(AdapterView adapterView) { + + } + }); + + + //获取电台型号 + binding.rigNameSpinner.setOnItemSelectedListener(null); + binding.rigNameSpinner.setSelection(GeneralVariables.modelNo); + new Handler().postDelayed(new Runnable() {//延迟2秒修改OnItemSelectedListener + @Override + public void run() { + binding.rigNameSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView adapterView, View view, int i, long l) { + GeneralVariables.modelNo = i; + writeConfig("model", String.valueOf(i)); + setAddrAndBauRate(rigNameSpinnerAdapter.getRigName(i)); + + //指令集 + GeneralVariables.instructionSet = rigNameSpinnerAdapter.getRigName(i).instructionSet; + writeConfig("instruction", String.valueOf(GeneralVariables.instructionSet)); + } + + @Override + public void onNothingSelected(AdapterView adapterView) { + } + }); + } + }, 2000); + + + //获取波特率 + binding.baudRateSpinner.setOnItemSelectedListener(null); + binding.baudRateSpinner.setSelection(bauRateSpinnerAdapter.getPosition( + GeneralVariables.baudRate)); + binding.baudRateSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView adapterView, View view, int i, long l) { + GeneralVariables.baudRate = bauRateSpinnerAdapter.getValue(i); + writeConfig("baudRate", String.valueOf(GeneralVariables.baudRate)); + } + + @Override + public void onNothingSelected(AdapterView adapterView) { + } + }); + + //设置发射监管 + binding.launchSupervisionSpinner.setOnItemSelectedListener(null); + binding.launchSupervisionSpinner.setSelection(launchSupervisionSpinnerAdapter + .getPosition(GeneralVariables.launchSupervision)); + binding.launchSupervisionSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView adapterView, View view, int i, long l) { + GeneralVariables.launchSupervision = LaunchSupervisionSpinnerAdapter.getTimeOut(i); + writeConfig("launchSupervision", String.valueOf(GeneralVariables.launchSupervision)); + } + + @Override + public void onNothingSelected(AdapterView adapterView) { + + } + }); + + //设置无回应中断 + binding.noResponseCountSpinner.setOnItemSelectedListener(null); + binding.noResponseCountSpinner.setSelection(GeneralVariables.noReplyLimit); + binding.noResponseCountSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView adapterView, View view, int i, long l) { + GeneralVariables.noReplyLimit = i; + writeConfig("noReplyLimit", String.valueOf(GeneralVariables.noReplyLimit)); + } + + @Override + public void onNothingSelected(AdapterView adapterView) { + + } + }); + + + //设置自动关注CQ + binding.followCQSwitch.setOnCheckedChangeListener(null); + binding.followCQSwitch.setChecked(GeneralVariables.autoFollowCQ); + setAutoFollowCQText(); + binding.followCQSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean b) { + GeneralVariables.autoFollowCQ = binding.followCQSwitch.isChecked(); + if (binding.followCQSwitch.isChecked()) { + mainViewModel.databaseOpr.writeConfig("autoFollowCQ", "1", null); + } else { + mainViewModel.databaseOpr.writeConfig("autoFollowCQ", "0", null); + } + setAutoFollowCQText(); + } + }); + + + + //设置自动呼叫关注的呼号 + binding.autoCallfollowSwitch.setOnCheckedChangeListener(null); + binding.autoCallfollowSwitch.setChecked(GeneralVariables.autoCallFollow); + setAutoCallFollow(); + binding.autoCallfollowSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean b) { + GeneralVariables.autoCallFollow = binding.autoCallfollowSwitch.isChecked(); + if (binding.autoCallfollowSwitch.isChecked()) { + mainViewModel.databaseOpr.writeConfig("autoCallFollow", "1", null); + } else { + mainViewModel.databaseOpr.writeConfig("autoCallFollow", "0", null); + } + setAutoCallFollow(); + } + }); + + //设置保存SWL选项 + binding.saveSWLSwitch.setOnCheckedChangeListener(null); + binding.saveSWLSwitch.setChecked(GeneralVariables.saveSWLMessage); + setSaveSwl(); + binding.saveSWLSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean b) { + GeneralVariables.saveSWLMessage = binding.saveSWLSwitch.isChecked(); + if (binding.saveSWLSwitch.isChecked()) { + mainViewModel.databaseOpr.writeConfig("saveSWL", "1", null); + } else { + mainViewModel.databaseOpr.writeConfig("saveSWL", "0", null); + } + setSaveSwl(); + } + }); + + //设置保存SWL选项 + binding.saveSWLQSOSwitch.setOnCheckedChangeListener(null); + binding.saveSWLQSOSwitch.setChecked(GeneralVariables.saveSWLMessage); + setSaveSwlQSO(); + binding.saveSWLQSOSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean b) { + GeneralVariables.saveSWL_QSO = binding.saveSWLQSOSwitch.isChecked(); + if (binding.saveSWLQSOSwitch.isChecked()) { + mainViewModel.databaseOpr.writeConfig("saveSWLQSO", "1", null); + } else { + mainViewModel.databaseOpr.writeConfig("saveSWLQSO", "0", null); + } + setSaveSwlQSO(); + } + }); + + + //获取梅登海德网格 + binding.configGetGridImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + String grid = MaidenheadGrid.getMyMaidenheadGrid(getContext()); + if (!grid.equals("")) { + binding.inputMyGridEdit.setText(grid); + } + } + }); + + + return binding.getRoot(); + } + + /** + * 设置地址和波特率,指令集 + * + * @param rigName 电台型号 + */ + private void setAddrAndBauRate(RigNameList.RigName rigName) { + //mainViewModel.setCivAddress(rigName.address); + GeneralVariables.civAddress = rigName.address; + mainViewModel.setCivAddress(); + GeneralVariables.baudRate = rigName.bauRate; + binding.civAddressEdit.setText(String.format("%X", rigName.address)); + binding.baudRateSpinner.setSelection( + bauRateSpinnerAdapter.getPosition(rigName.bauRate)); + } + + + /** + * 设置同频发射开关的显示文本 + */ + private void setSyncFreqText() { + if (binding.synFrequencySwitch.isChecked()) { + binding.synFrequencySwitch.setText(getString(R.string.freq_syn)); + } else { + binding.synFrequencySwitch.setText(getString(R.string.freq_asyn)); + } + } + + /** + * 设置自动关注CQ开关的文本 + */ + private void setAutoFollowCQText() { + if (binding.followCQSwitch.isChecked()) { + binding.followCQSwitch.setText(getString(R.string.auto_follow_cq)); + } else { + binding.followCQSwitch.setText(getString(R.string.not_concerned_about_CQ)); + } + } + + //设置自动呼叫关注的呼号 + private void setAutoCallFollow() { + if (binding.autoCallfollowSwitch.isChecked()) { + binding.autoCallfollowSwitch.setText(getString(R.string.automatic_call_following)); + } else { + binding.autoCallfollowSwitch.setText(getString(R.string.do_not_call_the_following_callsign)); + } + } + private void setSaveSwl() { + if (binding.saveSWLSwitch.isChecked()) { + binding.saveSWLSwitch.setText(getString(R.string.config_save_swl)); + } else { + binding.saveSWLSwitch.setText(getString(R.string.config_donot_save_swl)); + } + } + private void setSaveSwlQSO() { + if (binding.saveSWLQSOSwitch.isChecked()) { + binding.saveSWLQSOSwitch.setText(getString(R.string.config_save_swl_qso)); + } else { + binding.saveSWLQSOSwitch.setText(getString(R.string.config_donot_save_swl_qso)); + } + } + /** + * 设置UTC时间偏移的spinner + */ + private void setUtcTimeOffsetSpinner() { + UtcOffsetSpinnerAdapter adapter = new UtcOffsetSpinnerAdapter(requireContext()); + + requireActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + binding.utcTimeOffsetSpinner.setAdapter(adapter); + adapter.notifyDataSetChanged(); + binding.utcTimeOffsetSpinner.setSelection((UtcTimer.delay / 100 + 75) / 5); + } + }); + binding.utcTimeOffsetSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView adapterView, View view, int i, long l) { + UtcTimer.delay = i * 500 - 7500;//设置延迟 + } + + @Override + public void onNothingSelected(AdapterView adapterView) { + + } + }); + } + + /** + * 设置操作频段的spinner + */ + private void setBandsSpinner() { + GeneralVariables.mutableBandChange.observe(getViewLifecycleOwner(), new Observer() { + @Override + public void onChanged(Integer integer) { + binding.operationBandSpinner.setSelection(integer); + } + }); + + + bandsSpinnerAdapter = new BandsSpinnerAdapter(requireContext()); + binding.operationBandSpinner.setAdapter(bandsSpinnerAdapter); + requireActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + bandsSpinnerAdapter.notifyDataSetChanged(); + } + }); + + } + + /** + * 设置波特率列表 + */ + private void setBauRateSpinner() { + bauRateSpinnerAdapter = new BauRateSpinnerAdapter(requireContext()); + binding.baudRateSpinner.setAdapter(bauRateSpinnerAdapter); + requireActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + bauRateSpinnerAdapter.notifyDataSetChanged(); + } + }); + } + + /** + * 设置无回应次数中断 + */ + private void setNoReplyLimitSpinner() { + noReplyLimitSpinnerAdapter = new NoReplyLimitSpinnerAdapter(requireContext()); + binding.noResponseCountSpinner.setAdapter(noReplyLimitSpinnerAdapter); + requireActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + noReplyLimitSpinnerAdapter.notifyDataSetChanged(); + } + }); + } + + /** + * 设置发射监管列表 + */ + private void setLaunchSupervision() { + launchSupervisionSpinnerAdapter = new LaunchSupervisionSpinnerAdapter(requireContext()); + binding.launchSupervisionSpinner.setAdapter(launchSupervisionSpinnerAdapter); + requireActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + launchSupervisionSpinnerAdapter.notifyDataSetChanged(); + } + }); + } + + /** + * 设置电台名称,参数列表 + */ + private void setRigNameSpinner() { + rigNameSpinnerAdapter = new RigNameSpinnerAdapter(requireContext()); + binding.rigNameSpinner.setAdapter(rigNameSpinnerAdapter); + requireActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + rigNameSpinnerAdapter.notifyDataSetChanged(); + } + }); + + } + + /** + * 设置PTT延时 + */ + private void setPttDelaySpinner() { + pttDelaySpinnerAdapter = new PttDelaySpinnerAdapter(requireContext()); + binding.pttDelayOffsetSpinner.setAdapter(pttDelaySpinnerAdapter); + requireActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + pttDelaySpinnerAdapter.notifyDataSetChanged(); + binding.pttDelayOffsetSpinner.setSelection(GeneralVariables.pttDelay / 10); + } + }); + } + + + private void setDecodeMode() { + binding.decodeModeRadioGroup.clearCheck(); + binding.fastDecodeRadioButton.setChecked(!GeneralVariables.deepDecodeMode); + binding.deepDecodeRadioButton.setChecked(GeneralVariables.deepDecodeMode); + + View.OnClickListener listener = new View.OnClickListener() { + @Override + public void onClick(View view) { + int buttonId = binding.decodeModeRadioGroup.getCheckedRadioButtonId(); + GeneralVariables.deepDecodeMode= buttonId ==binding.deepDecodeRadioButton.getId(); + writeConfig("deepMode", GeneralVariables.deepDecodeMode? "1" : "0"); + } + }; + + binding.fastDecodeRadioButton.setOnClickListener(listener); + binding.deepDecodeRadioButton.setOnClickListener(listener); + + } + + + /** + * 设置音频输出的位数 + */ + private void setAudioOutputBitsMode() { + //binding.controlModeRadioGroup.setOnCheckedChangeListener(null); + binding.audioBitsRadioGroup.clearCheck(); + binding.audio32BitsRadioButton.setChecked(GeneralVariables.audioOutput32Bit); + binding.audio16BitsRadioButton.setChecked(!GeneralVariables.audioOutput32Bit); + + + + View.OnClickListener listener = new View.OnClickListener() { + @Override + public void onClick(View view) { + int buttonId = binding.audioBitsRadioGroup.getCheckedRadioButtonId(); + GeneralVariables.audioOutput32Bit= buttonId ==binding.audio32BitsRadioButton.getId(); + writeConfig("audioBits", GeneralVariables.audioOutput32Bit? "1" : "0"); + } + }; + + binding.audio32BitsRadioButton.setOnClickListener(listener); + binding.audio16BitsRadioButton.setOnClickListener(listener); + + } + + /** + * 输出音频的采样率设置 + */ + private void setAudioOutputRateMode() { + binding.audioRateRadioGroup.clearCheck(); + binding.audio12kRadioButton.setChecked(GeneralVariables.audioSampleRate==12000); + binding.audio24kRadioButton.setChecked(GeneralVariables.audioSampleRate==24000); + binding.audio48kRadioButton.setChecked(GeneralVariables.audioSampleRate==48000); + + + + View.OnClickListener listener = new View.OnClickListener() { + @Override + public void onClick(View view) { + if (binding.audio12kRadioButton.isChecked()) GeneralVariables.audioSampleRate=12000; + if (binding.audio24kRadioButton.isChecked()) GeneralVariables.audioSampleRate=24000; + if (binding.audio48kRadioButton.isChecked()) GeneralVariables.audioSampleRate=48000; + writeConfig("audioRate", String.valueOf(GeneralVariables.audioSampleRate)); + } + }; + + binding.audio12kRadioButton.setOnClickListener(listener); + binding.audio24kRadioButton.setOnClickListener(listener); + binding.audio48kRadioButton.setOnClickListener(listener); + + } + + + + /** + * 设置消息列表显示模式 + */ + private void setMessageMode() { + binding.messageModeRadioGroup.clearCheck(); + if (GeneralVariables.simpleCallItemMode){ + binding.msgSimpleRadioButton.setChecked(true); + }else { + binding.msgStandardRadioButton.setChecked(true); + } + + + + View.OnClickListener listener = new View.OnClickListener() { + @Override + public void onClick(View view) { + int buttonId = binding.messageModeRadioGroup.getCheckedRadioButtonId(); + GeneralVariables.simpleCallItemMode= + binding.messageModeRadioGroup.getCheckedRadioButtonId() + ==binding.msgSimpleRadioButton.getId(); + + writeConfig("msgMode", GeneralVariables.simpleCallItemMode?"1":"0"); + } + }; + + binding.msgStandardRadioButton.setOnClickListener(listener); + binding.msgSimpleRadioButton.setOnClickListener(listener); + } + + + + + /** + * 设置控制模式VOX CAT + */ + private void setControlMode() { + //binding.controlModeRadioGroup.setOnCheckedChangeListener(null); + binding.controlModeRadioGroup.clearCheck(); + + switch (GeneralVariables.controlMode) { + case ControlMode.CAT: + case ConnectMode.NETWORK: + binding.ctrCATradioButton.setChecked(true); + break; + case ControlMode.RTS: + binding.ctrRTSradioButton.setChecked(true); + break; + case ControlMode.DTR: + binding.ctrDTRradioButton.setChecked(true); + break; + default: + binding.ctrVOXradioButton.setChecked(true); + } + + + View.OnClickListener listener = new View.OnClickListener() { + @Override + public void onClick(View view) { + int buttonId = binding.controlModeRadioGroup.getCheckedRadioButtonId(); + + if (buttonId == binding.ctrVOXradioButton.getId()) { + GeneralVariables.controlMode = ControlMode.VOX; + } else if (buttonId == binding.ctrCATradioButton.getId()) {//CAT模式 + GeneralVariables.controlMode = ControlMode.CAT; + } else if (buttonId == binding.ctrRTSradioButton.getId()) {//RTS模式 + GeneralVariables.controlMode = ControlMode.RTS; + } else if (buttonId == binding.ctrDTRradioButton.getId()) {//RTS模式 + GeneralVariables.controlMode = ControlMode.DTR; + } + mainViewModel.setControlMode();//通知一下电台控制模式改变 + //无论CAT还是RTS,CI-V指令还是有效的,都是串口 + if (GeneralVariables.controlMode == ControlMode.CAT + || GeneralVariables.controlMode == ControlMode.RTS + || GeneralVariables.controlMode == ControlMode.DTR) { + if (!mainViewModel.isRigConnected()) { + mainViewModel.getUsbDevice(); + } else { + mainViewModel.setOperationBand(); + } + } + writeConfig("ctrMode", String.valueOf(GeneralVariables.controlMode)); + setConnectMode(); + } + }; + + binding.ctrCATradioButton.setOnClickListener(listener); + binding.ctrVOXradioButton.setOnClickListener(listener); + binding.ctrRTSradioButton.setOnClickListener(listener); + binding.ctrDTRradioButton.setOnClickListener(listener); + } + + /** + * 设置连线的方式,可以是USB,也可以是BLUE_TOOTH + */ + private void setConnectMode() { + if (GeneralVariables.controlMode == ControlMode.CAT + //&& BluetoothConstants.checkBluetoothIsOpen() + ) { + //此处要改成VISIBLE + binding.connectModeLayout.setVisibility(View.VISIBLE); + } else { + binding.connectModeLayout.setVisibility(View.GONE); + } + binding.connectModeRadioGroup.clearCheck(); + switch (GeneralVariables.connectMode) { + case ConnectMode.USB_CABLE: + binding.cableConnectRadioButton.setChecked(true); + break; + case ConnectMode.BLUE_TOOTH: + binding.bluetoothConnectRadioButton.setChecked(true); + break; + case ConnectMode.NETWORK: + binding.networkConnectRadioButton.setChecked(true); + break; + } + View.OnClickListener listener = new View.OnClickListener() { + @Override + public void onClick(View view) { + int buttonId = binding.connectModeRadioGroup.getCheckedRadioButtonId(); + if (buttonId == binding.cableConnectRadioButton.getId()) { + GeneralVariables.connectMode = ConnectMode.USB_CABLE; + } else if (buttonId == binding.bluetoothConnectRadioButton.getId()) { + GeneralVariables.connectMode = ConnectMode.BLUE_TOOTH; + }else if (buttonId==binding.networkConnectRadioButton.getId()){ + GeneralVariables.connectMode=ConnectMode.NETWORK; + } + //------显示蓝牙列表,并选择,然后建立蓝牙连接 + if (GeneralVariables.connectMode == ConnectMode.BLUE_TOOTH) { + //根据安卓12,要判断一下蓝牙权限: + new SelectBluetoothDialog(requireContext(), mainViewModel).show(); + } + + //-----显示网络上的电台,目前是flex电台,------------------- + if (GeneralVariables.connectMode==ConnectMode.NETWORK){ + //打开网络电台列表对话框 + if (GeneralVariables.instructionSet== InstructionSet.FLEX_NETWORK) { + new SelectFlexRadioDialog(requireContext(), mainViewModel).show(); + }else if(GeneralVariables.instructionSet== InstructionSet.ICOM + ||GeneralVariables.instructionSet== InstructionSet.XIEGU_6100 + ||GeneralVariables.instructionSet== InstructionSet.XIEGUG90S) { + new LoginIcomRadioDialog(requireContext(), mainViewModel).show(); + }else { + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.only_flex_supported)); + } + } + + } + }; + binding.cableConnectRadioButton.setOnClickListener(listener); + binding.bluetoothConnectRadioButton.setOnClickListener(listener); + binding.networkConnectRadioButton.setOnClickListener(listener); + } + + + /** + * 把配置信息写到数据库 + * + * @param KeyName 关键词 + * @param Value 值 + */ + private void writeConfig(String KeyName, String Value) { + mainViewModel.databaseOpr.writeConfig(KeyName, Value, null); + } + + private void setHelpDialog() { + //呼号帮助 + binding.callsignHelpImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(), requireActivity() + , GeneralVariables.getStringFromResource(R.string.callsign_help) + , true).show(); + } + }); + //梅登海德网格的帮助 + binding.maidenGridImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(), requireActivity() + , GeneralVariables.getStringFromResource(R.string.maidenhead_help) + , true).show(); + } + }); + //发射频率的帮助 + binding.frequencyImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(), requireActivity() + , GeneralVariables.getStringFromResource(R.string.frequency_help) + , true).show(); + } + }); + //延迟发射帮助 + binding.transDelayImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(), requireActivity() + , GeneralVariables.getStringFromResource(R.string.transDelay_help) + , true).show(); + } + }); + //时间偏移帮助 + binding.timeOffsetImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(), requireActivity() + , GeneralVariables.getStringFromResource(R.string.timeoffset_help) + , true).show(); + } + }); + //PTT延时帮助 + binding.pttDelayImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(), requireActivity() + , GeneralVariables.getStringFromResource(R.string.pttdelay_help) + , true).show(); + } + }); + //显示列表方式 + binding.messageModeeHelpImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(),requireActivity() + ,GeneralVariables.getStringFromResource(R.string.message_mode_help) + ,true).show(); + } + }); + + //设置ABOUT + binding.aboutButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(), requireActivity(), "readme.txt", true).show(); + } + }); + //设置操作频段 + binding.operationHelpImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(), requireActivity() + , GeneralVariables.getStringFromResource(R.string.operationBand_help) + , true).show(); + } + }); + //设置操作模式 + binding.controlModeHelpImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(), requireActivity() + , GeneralVariables.getStringFromResource(R.string.controlMode_help) + , true).show(); + } + }); + //设置CI-V地址和波特率帮助 + binding.baudRateHelpImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(), requireActivity() + , GeneralVariables.getStringFromResource(R.string.civ_help) + , true).show(); + } + }); + //电台型号列表 + binding.rigNameHelpImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(), requireActivity() + , GeneralVariables.getStringFromResource(R.string.rig_model_help) + , true).show(); + } + }); + //发射监管 + binding.launchSupervisionImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(), requireActivity() + , GeneralVariables.getStringFromResource(R.string.launch_supervision_help) + , true).show(); + } + }); + //无回应次数 + binding.noResponseCountButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(), requireActivity() + , GeneralVariables.getStringFromResource(R.string.no_response_help) + , true).show(); + } + }); + //自动呼叫 + binding.autoFollowCountButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(), requireActivity() + , GeneralVariables.getStringFromResource(R.string.auto_follow_help) + , true).show(); + } + }); + //连接模式 + binding.connectModeHelpImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(), requireActivity() + , GeneralVariables.getStringFromResource(R.string.connectMode_help) + , true).show(); + } + }); + //排除选项 + binding.excludedHelpButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(), requireActivity() + , GeneralVariables.getStringFromResource(R.string.excludeCallsign_help) + , true).show(); + } + }); + + binding.swlHelpButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(), requireActivity() + , GeneralVariables.getStringFromResource(R.string.swlMode_help) + , true).show(); + } + }); + + //解码模式 + binding.decodeModeHelpButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(),requireActivity() + ,GeneralVariables.getStringFromResource(R.string.deep_mode_help) + ,true).show(); + } + }); + + //音频输出帮助 + binding.audioOutputImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(), requireActivity() + , GeneralVariables.getStringFromResource(R.string.audio_output_help) + , true).show(); + } + }); + + //清除缓存 + binding.clearCacheHelpButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(), requireActivity() + , GeneralVariables.getStringFromResource(R.string.clear_cache_data_help) + , true).show(); + } + }); + binding.clearFollowButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new ClearCacheDataDialog(requireContext(), requireActivity() + ,mainViewModel.databaseOpr + ,ClearCacheDataDialog.CACHE_MODE.FOLLOW_DATA).show(); + } + }); + binding.clearLogCacheButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new ClearCacheDataDialog(requireContext(), requireActivity() + ,mainViewModel.databaseOpr + ,ClearCacheDataDialog.CACHE_MODE.SWL_MSG).show(); + } + }); + binding.clearSWlQsoButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new ClearCacheDataDialog(requireContext(), requireActivity() + ,mainViewModel.databaseOpr + ,ClearCacheDataDialog.CACHE_MODE.SWL_QSO).show(); + } + }); + + binding.synTImeButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + UtcTimer.syncTime(new UtcTimer.AfterSyncTime() { + @Override + public void doAfterSyncTimer(int secTime) { + setUtcTimeOffsetSpinner(); + if (secTime>100) {//正数时慢了 + ToastMessage.show(String.format(GeneralVariables + .getStringFromResource(R.string.utc_time_sync_delay_slow), secTime)); + }else if (secTime<-100){ + ToastMessage.show(String.format(GeneralVariables + .getStringFromResource(R.string.utc_time_sync_delay_faster), -secTime)); + }else { + ToastMessage.show(GeneralVariables + .getStringFromResource(R.string.config_clock_is_accurate)); + } + } + + @Override + public void syncFailed(IOException e) { + ToastMessage.show(e.getMessage()); + } + }); + + } + }); + + } + + /** + * 设置界面的上下滚动的图标 + */ + private void setScrollImageVisible() { + + if (binding.scrollView3.getScrollY() == 0) { + binding.configScrollUpImageView.setVisibility(View.GONE); + } else { + binding.configScrollUpImageView.setVisibility(View.VISIBLE); + } + + if (binding.scrollView3.getHeight() + binding.scrollView3.getScrollY() + < binding.scrollLinearLayout.getMeasuredHeight()) { + binding.configScrollDownImageView.setVisibility(View.VISIBLE); + } else { + binding.configScrollDownImageView.setVisibility(View.GONE); + } + } + + +} \ No newline at end of file diff --git a/feature/ft8/src/main/assets/audio_output_help.txt b/feature/ft8/src/main/assets/audio_output_help.txt new file mode 100644 index 00000000..d893a0fd --- /dev/null +++ b/feature/ft8/src/main/assets/audio_output_help.txt @@ -0,0 +1,5 @@ +关于音频输出设置 + +采样位深:也称采样精度,FT8CN只有16位整型和32位浮点可选。采样位数是表示声音强度量化后的精细程度,它的数值越大,波动幅度的分辨率也就越高,所发出声音的能力越强。 + +采样率:也称取样频率, 指每秒钟取得声音样本的次数。采样频率越高,声音的质量也就越好,但占的资源也多。 \ No newline at end of file diff --git a/feature/ft8/src/main/assets/audio_output_help_en.txt b/feature/ft8/src/main/assets/audio_output_help_en.txt new file mode 100644 index 00000000..aa73dc46 --- /dev/null +++ b/feature/ft8/src/main/assets/audio_output_help_en.txt @@ -0,0 +1,5 @@ +Audio Output Setting + +Bit depth: Choose 16-bit int or 32-bit float. Bit depth dictates the number of possible amplitude values of audio sample. A higher bit depth will produce a higher resolution audio. + +Sample rate: Sample rate refers to the number of samples that are present within one second of digital audio. Higher sample rate provides more accurate audio waveform, but consume more system resources. \ No newline at end of file diff --git a/feature/ft8/src/main/assets/auto_follow_help.txt b/feature/ft8/src/main/assets/auto_follow_help.txt new file mode 100644 index 00000000..4eb8bc66 --- /dev/null +++ b/feature/ft8/src/main/assets/auto_follow_help.txt @@ -0,0 +1,5 @@ +关于自动关注CQ + 自动关注CQ,是指当FT8CN解码出的消息中有CQ消息时,会把这条消息推送到“呼叫”界面的消息列表,方便在“呼叫”界面中对CQ消息做出反应。自动关注的CQ消息,该呼号不会被长久保存到关注的呼号数据库中。 +关于自动呼叫关注的呼号 + 目标呼号被设定为关注后,当目标呼号有CQ行为时,FT8CN会自动对该呼号进行呼叫。 + FT8CN会长久保存您关注的呼号,您每次使用FT8CN时,FT8CN会把曾经关注过的呼号的新消息推送到“呼叫”界面的列表中。如果想取消对某呼号的关注,可以通过后台操作(在局域网中用浏览器访问FT8CN)删除该呼号。 \ No newline at end of file diff --git a/feature/ft8/src/main/assets/auto_follow_help_en.txt b/feature/ft8/src/main/assets/auto_follow_help_en.txt new file mode 100644 index 00000000..71fbe7f2 --- /dev/null +++ b/feature/ft8/src/main/assets/auto_follow_help_en.txt @@ -0,0 +1,8 @@ +About Auto Track CQ + +Auto track CQ means that when an FT8CN decoded message contains a CQ message, the FT8CN will push the decoded message to the message list on "Calling" interface, so that to respond to the CQ message on "Calling" interface. Auto track CQ callsign will not be stored in the callsign database for a long time. + +About Auto Call Tracked + +After the target callsign is set to track, FT8CN will automatically call the callsign when the target callsign has CQ behavior. +FT8CN will preserve the tracking callsigns for a long time. Every time you use FT8CN, FT8CN will push the new message of the tracking callsigns to the list of the "Calling" interface. If you want to unfollow a callsign, you can delete the callsign through background operations (accessing FT8CN with a browser on the lan). \ No newline at end of file diff --git a/feature/ft8/src/main/assets/bands.txt b/feature/ft8/src/main/assets/bands.txt new file mode 100644 index 00000000..d196fe18 --- /dev/null +++ b/feature/ft8/src/main/assets/bands.txt @@ -0,0 +1,39 @@ +*:1810000:160m +*:1840000:160m +*:1908000:160m + :3531000:80m + :3567000:80m +*:3573000:80m + :3585000:80m + :5126000:60m +*:5357000:60m + :5362000:60m + :7056000:40m + :7041000:40m + :7071000:40m +*:7074000:40m + :7080000:40m + :10131000:30m + :10133000:30m +*:10136000:30m + :10143000:30m + :14071000:20m +*:14074000:20m +*:14090000:20m + :18095000:17m +*:18100000:17m +*:21074000:15m + :21091000:15m + :24911000:12m +*:24915000:12m +*:28074000:10m + :28095000:10m +*:40680000:8m + :50310000:6m +*:50313000:6m +*:50323000:6m + :70100000:4m +*:70154000:4m +*:144174000:2m + :144460000:2m +*:432174000:70cm \ No newline at end of file diff --git a/feature/ft8/src/main/assets/callsign.txt b/feature/ft8/src/main/assets/callsign.txt new file mode 100644 index 00000000..e3e7f3b7 --- /dev/null +++ b/feature/ft8/src/main/assets/callsign.txt @@ -0,0 +1,5 @@ +请输入您的呼号。 +呼号是您用本APP进行FT8呼叫的基本要求。您如果在中国境内,请使用符合《中华人民共和国无线电管理条例》的合法呼号,禁止一切非法发射! + +关于修饰符 +CQ后面可能跟有三个十进制数字或一到四个字母的修饰符,一般是000-999或A-Z或AA-ZZ或AAA-ZZZ或AAAA-ZZZZ。例如:CQ POTA callsign grid。 \ No newline at end of file diff --git a/feature/ft8/src/main/assets/callsign_en.txt b/feature/ft8/src/main/assets/callsign_en.txt new file mode 100644 index 00000000..3c76fec3 --- /dev/null +++ b/feature/ft8/src/main/assets/callsign_en.txt @@ -0,0 +1,8 @@ +Enter your callsign + +An amateur radio callsign is required to use this APP. Please comply with local laws and regulations to obtain your amateur radio license and callsign. It’s ILLEGAL to transmit without a valid license. + +CQ modifier + +CQ may be followed by a modifier with three decimal digits or one to four letters. +Example : CQ POTA *callsign* *gridsquare* diff --git a/feature/ft8/src/main/assets/civ_help.txt b/feature/ft8/src/main/assets/civ_help.txt new file mode 100644 index 00000000..6751c452 --- /dev/null +++ b/feature/ft8/src/main/assets/civ_help.txt @@ -0,0 +1,5 @@ +关于CI-V地址和波特率 +CI-V地址:是指电台的CI-V地址。CI-V(Communications Interface V)是控制端与电台之间的一种通讯协议。 +波特率:电台与APP之间的数据传输速率。 +按照CI-V的要求,必须要有彼此的通讯地址来区分(因为控制线路上可能有不止一台设备)接收端和发送端,一般来说,每个型号的设备在出厂时都有默认的地址,不同型号的电台默认地址不一定相同。控制端的默认地址一般是0xE0,广播地址是0x00。以IC-705为例,它的默认地址是0xA4。 +本APP已经查找到部分型号电台的默认地址以及该型号电台最大可支持的波特率,可以通过选择“电台型号”自动设置地址和波特率。 \ No newline at end of file diff --git a/feature/ft8/src/main/assets/civ_help_en.txt b/feature/ft8/src/main/assets/civ_help_en.txt new file mode 100644 index 00000000..51722e7a --- /dev/null +++ b/feature/ft8/src/main/assets/civ_help_en.txt @@ -0,0 +1,6 @@ +About CIV Address and Baud Rate + +CI-V address: The CI-V address of the radio station equipment (RIG). CI-V (Communications Interface V) is a communication protocol between the control end and the RIG. +Baud Rate: The data transfer rate between the RIG and the APP. +Since there may be more than one device on the control line, according to the requirements of CI-V, the receiver and the sender must be distinguished by each other's communication address. Generally speaking, each model of device has a default address when it leaves the factory, and the default addresses of different models of RIG are not necessarily the same. In general,the default address of the control end is 0xE0, and the broadcast address is 0x00. In the case of IC-705, its default address is 0xA4. +This APP has found the default addresses and the maximum supported baud rates of these models of RIG, you can automatically set the address and baud rate by selecting "RIG". \ No newline at end of file diff --git a/feature/ft8/src/main/assets/clear_cache_data.txt b/feature/ft8/src/main/assets/clear_cache_data.txt new file mode 100644 index 00000000..330febd0 --- /dev/null +++ b/feature/ft8/src/main/assets/clear_cache_data.txt @@ -0,0 +1,9 @@ +关于清空缓存 + +FT8CN在数据库中保存有您关注的呼号、通联过程中的消息(可以通过后台查看)。可以通过清空缓存操作彻底删除这些保存的临时数据。 + +清空缓存不会删除QSO数据。 + +清空“关注的呼号”,关注的呼号是在平时通联是您关注的呼号,在该呼号出现时,会自动添加的呼叫列表中,方便自动呼叫。清空关注的呼号,是把所有关注的呼号清空。 + +清空“解码的消息”,FT8CN可以保存所有解码的消息,这些消息暂时没有在FT8CN界面中显示,可以在后台中查看和查询。 \ No newline at end of file diff --git a/feature/ft8/src/main/assets/clear_cache_data_en.txt b/feature/ft8/src/main/assets/clear_cache_data_en.txt new file mode 100644 index 00000000..b39425e3 --- /dev/null +++ b/feature/ft8/src/main/assets/clear_cache_data_en.txt @@ -0,0 +1,12 @@ +Clear Cache Data: +FT8CN keeps a list of followed callsign and decoded messages in the cache file. You can permanently delete those using empty cache option. + +Note that clearing cache won't delete any QSO log. + +List of followed callsign: +This list contains all your followed callsigns. When a followed callsign shows up, it will be added to the calling message for quick-call or auto-call. + +Note that clearing the list of tracked callsign will remove all saved favorite callsigns. + +Clean "cached QSO decoding": +FT8CN can save all decoded messages. You review them from Web UI. (Not on main UI yet) \ No newline at end of file diff --git a/feature/ft8/src/main/assets/cloudlog.txt b/feature/ft8/src/main/assets/cloudlog.txt new file mode 100644 index 00000000..5c580ece --- /dev/null +++ b/feature/ft8/src/main/assets/cloudlog.txt @@ -0,0 +1,9 @@ +关于Cloudlog + +该功能帮助您在完成通联后即时上传本次QSO到Cloudlog。 + +您需要在cloudlog的“API密钥”中获取API KEY,并填写至软件中。 + +服务器地址需要以http或https开头,例: http://192.168.1.3:1234。 + +台站ID可以在cloudlog中的“台站地址”中查看到。 \ No newline at end of file diff --git a/feature/ft8/src/main/assets/cloudlog_en.txt b/feature/ft8/src/main/assets/cloudlog_en.txt new file mode 100644 index 00000000..05150c6d --- /dev/null +++ b/feature/ft8/src/main/assets/cloudlog_en.txt @@ -0,0 +1,9 @@ +About Cloudlog + +This feature allows you to upload the QSO record to Cloudlog immediately after QSO is completed. + +You need to obtain the API KEY in the API Key field of the cloudlog and enter it into the software. + +The server address must start with http or https, for example, http://192.168.1.3:1234. + +You can view the station ID in the "Station Locations" part of Cloudlog. \ No newline at end of file diff --git a/feature/ft8/src/main/assets/connectMode.txt b/feature/ft8/src/main/assets/connectMode.txt new file mode 100644 index 00000000..1e0ad806 --- /dev/null +++ b/feature/ft8/src/main/assets/connectMode.txt @@ -0,0 +1,7 @@ +连接方式,是指FT8CN控制电台的连接方式。 + FT8CN与电台之间有三种连接方式:有线连接(USB转串口)、蓝牙连接、网络连接。对于有线连接和蓝牙连接,FT8CN都是通过串口指令对电台的操作进行控制(PTT开/关、频率设置、模式设置等)。而网络连接是使用电台的网络协议对电台进行控制,包括收发的音频也是通过网络进行传输。 + 目前,FT8CN已经支持ICOM、FlexRadio网络协议,ICOM已经完全支持音频信号的收发,FlexRadio目前仅支持音频的接收。 + 注: + 1.只有手机在蓝牙开启状态才能进入蓝牙连接模式。 + 2.蓝牙串口与蓝牙音频不同,蓝牙音频只能用于音频的收发,无法控制电台。具有蓝牙串口的电台才能被FT8CN控制。 + 3.在ICOM使用网络连接时,传输过程对路由器性能要求很高,低性能的路由器,在发射音频时会有严重的丢包情况,建议使用电台的AP或手机的AP来连接。 diff --git a/feature/ft8/src/main/assets/connectMode_en.txt b/feature/ft8/src/main/assets/connectMode_en.txt new file mode 100644 index 00000000..11977961 --- /dev/null +++ b/feature/ft8/src/main/assets/connectMode_en.txt @@ -0,0 +1,6 @@ +Connect mode refers to the way FT8CN controls the RIG. +There are two connect modes between FT8CN and RIG: wired connection (USB to serial port) and wireless connection (Bluetooth serial port). FT8CN controls the operation of the RIG through serial port commands (PTT on/off, frequency settings, mode settings, etc.). Both USB and bluetooth use serial port commands to control the RIG. + +Note: + 1. Only when bluetooth is enabled can the phone enter bluetooth connection mode. + 2. Bluetooth serial port is different from bluetooth audio. Bluetooth audio can only be used for audio transmission and reception, it can not control the RIG. Only RIG with bluetooth serial ports can be controlled by FT8CN. \ No newline at end of file diff --git a/feature/ft8/src/main/assets/controlMode.txt b/feature/ft8/src/main/assets/controlMode.txt new file mode 100644 index 00000000..7d730295 --- /dev/null +++ b/feature/ft8/src/main/assets/controlMode.txt @@ -0,0 +1,14 @@ +控制方式,是指FT8CN发射信号时对电台的控制方式。 + VOX:声控模式启动发射。 + CAT:通过串口用指令对电台进行控制,不同型号的电台指令集并不一定相同。多数的ICOM电台使用的指令集为CI-V,多数ICOM型号电台之间指令兼容度比较高。YAESU电台串口指令大体上分为3~4类指令集,同类指令集的电台彼此兼容。 + RTS:通过串口的RTS电路的开闭来控制电台的PTT。部分老电台(如IC706),无法通过串口指令控制PTT发射,需要通过打开/关闭RTS来控制PTT。选择此项目,不代表串口指令不发挥作用,除了控制PTT用RTS外,其它对电台的控制功能,还是使用串口指令的,选择RTS,也需要设置电台的地址和波特率,以方便APP对电台的控制。 + DTR:与RTS类似,通过串口的DTR电路的开闭来控制电台的PTT。 + 一般来说,即使不同型号的电台指令集存在不同,同一厂商或同一系列的电台大部分的指令还是相同的。FT8CN本着最大兼容性考虑,尽可能使用少的串口指令。 + 使用的串口指令主要是:读取和设置频率、读取和设置模式(USB上边带)、打开PTT按键、关闭PTT按键。 + 我的手机没有串口?现在很多电台是在USB口中映射出串口的,如果您的电台具备此功能,手机端使用USB的OTG转接线接入电台即可。 + 以IC-705电台为例,705的USB会映射出2个串口,同时还会虚拟出声卡。当手机通过USB线连接705电台后,手机就可以通过映射出的串口控制电台,同时利用电台虚拟出的声卡采集和发射音频。 + +CAT模式应当注意: + 1.USB口是区分主从关系的,电台的USB端口是从模式,手机默认情况下也是从模式。如果用手机控制电台,就要把手机转为主模式,一般可以通过OTG转接口来实现。 + 2.电台处于发射状态时,可能会有电流对USB线产生干扰,造成手机与电台的通讯中断,无法控制电台,常用的解决办法,在USB线上增加磁环,最佳解决方案,使用USB屏蔽器,价格在40左右。 + 3.使用部分OTG或USB拓展坞可能会使电台的底噪增加,请选择合适的转接口。 \ No newline at end of file diff --git a/feature/ft8/src/main/assets/controlMode_en.txt b/feature/ft8/src/main/assets/controlMode_en.txt new file mode 100644 index 00000000..d7d5c5e7 --- /dev/null +++ b/feature/ft8/src/main/assets/controlMode_en.txt @@ -0,0 +1,16 @@ +Control Mode refers to the control mode of the RIG when FT8CN transmits signals. + VOX:Signal transmission is initiated by voice control. + CAT:It refers to the control of RIG with instructions through a serial port. The instruction sets of different RIG models are not always the same. The instruction set used by most ICOM RIGS is CI-V, and the compatibility between most ICOM RIGS is relatively high. YAESU radio serial port instructions are generally divided into three or four instruction sets. RIGS with the same instruction set are compatible with each other. + RTS: The PTT of the RIG is controlled by opening and closing the RTS circuit of the serial port。Some old RIGS, such as IC706, cannot control PTT transmission through serial port instructions and they need to control PTT by turning on/off RTS. Selecting this item does not mean that the serial port instruction does not work. In addition to using RTS to control PTT, other control functions of the RIG still require the instructions of serial port. Choosing RTS also requires setting the RIG address and baud rate to facilitate the app's control. + DTR: Similar to RTS, the RIG's PTT is controlled by the opening and closing the DTR circuit of the serial port. +In general, even if the instruction sets of different RIG models are different, most of the instructions of the same manufacturer or the same series of RIGs are still the same. FT8CN uses as few serial instructions as possible for maximum compatibility. +The serial port instructions used mainly include reading and setting the frequency, reading and setting mode (USB upper sideband), turning on and off the PTT button. + +What should I do if my phone doesn't have a serial port? +Now many RIGs are mapped out of the serial port in the USB port, if your RIG has this function, the mobile phone can use the USB OTG adapter cable to access the RIG. +Taking IC-705 RIG as an example, the USB of the 705 will map out 2 serial ports, at the same time, the virtual sound card of the Rig is used to collect and transmit audio. When the mobile phone is connected to the 705 RIG through the USB cable, it can control the RIG through the mapped serial port, at the same time, it can use the sound card virtually to collect and transmit audio. + +Notes for CAT mode: + 1. The USB port can distinguish the master-slave relationship, the USB port of the RIG is in slave mode, and the phone is in slave mode by default. If you use a mobile phone to control the RIG, you must switch the mobile phone to the master mode, which can generally be achieved through the OTG interface. + 2. When the RIG is in the transmitting state, there may be current interference with the USB cable, resulting in the interruption of communication between the mobile phone and the rig and the inability to control the station. A common solution is to add a magnetic ring to the USB line. The best solution is to use a USB shielder. + 3. Some OTG or USB docking stations may increase the ground noise of the RIG, please choose the appropriate adapter. \ No newline at end of file diff --git a/feature/ft8/src/main/assets/country_en2cn.dat b/feature/ft8/src/main/assets/country_en2cn.dat new file mode 100644 index 00000000..70e58b0d --- /dev/null +++ b/feature/ft8/src/main/assets/country_en2cn.dat @@ -0,0 +1,382 @@ +Sov Mil Order of Malta:马耳他索夫米尔教团 +Spratly Islands China:中国南沙群岛 +Monaco:摩纳哥 +Agalega & St. Brandon:阿加莱加和圣布兰登岛 +Mauritius:毛里求斯 +Rodriguez Island:罗德里格斯岛 +Equatorial Guinea:赤道几内亚 +Annobon Island:安诺本岛 +Fiji:斐济 +Conway Reef:康威礁 +Rotuma Island:罗图马岛 +Kingdom of Eswatini:斯威士兰王国 +Tunisia:突尼斯 +Vietnam:越南 +Guinea:几内亚 +Bouvet:布韦岛 +Peter 1 Island:彼得一世岛 +Azerbaijan:阿塞拜疆 +Georgia:格鲁吉亚 +Montenegro:黑山 +Sri Lanka:斯里兰卡 +ITU HQ:国际电信联盟总部 +United Nations HQ:联合国总部 +Vienna Intl Ctr:维也纳国际中心 +Timor - Leste:东帝汶 +Israel:以色列 +Libya:利比亚 +Cyprus:塞浦路斯 +Tanzania:坦桑尼亚 +Nigeria:尼日利亚 +Madagascar:马达加斯加 +Mauritania:毛里塔尼亚 +Niger:尼日尔 +Togo:多哥 +Samoa:萨摩亚 +Uganda:乌干达 +Kenya:肯尼亚 +Senegal:塞内加尔 +Jamaica:牙买加 +Yemen:也门 +Lesotho:莱索托 +Malawi:马拉维 +Algeria:阿尔及利亚 +Barbados:巴巴多斯 +Maldives:马尔代夫 +Guyana:圭亚那 +Croatia:克罗地亚 +Ghana:加纳 +Malta:马耳他 +Zambia:赞比亚 +Kuwait:科威特 +Sierra Leone:塞拉利昂 +West Malaysia:西马来西亚 +East Malaysia:东马来西亚 +Nepal:尼泊尔 +Dem. Rep. of the Congo:刚果民主共和国 +Burundi:布隆迪 +Singapore:新加坡 +Rwanda:卢旺达 +Trinidad & Tobago:特立尼达和多巴哥 +Botswana:博茨瓦纳 +Tonga:汤加 +Oman:阿曼 +Bhutan:不丹 +United Arab Emirates:阿拉伯联合酋长国 +Qatar:卡塔尔 +Bahrain:巴林 +Pakistan:巴基斯坦 +Scarborough Reef China:中国黄岩岛 +Taiwan China:中国台湾 +Pratas Island China:中国东沙岛 +XinJiang China:中国新疆 +XiZang China:中国西藏 +BeiJing China:中国北京 +HeiLongJiang China:中国黑龙江 +JiLin China:中国吉林 +LiaoNing China:中国辽宁 +TianJin China:中国天津 +NeiMengGu China:中国内蒙古 +HeBei China:中国河北 +ShiJiaZhuang HeBei China:中国河北 石家庄 +ShanXi China:中国山西 +ShangHai China:中国上海 +ShanDong China:中国山东 +JiangSu China:中国江苏 +SuZhou JiangSu China:中国江苏 苏州 +ZheJiang China:中国浙江 +JiangXi China:中国江西 +FuJian China:中国福建 +AnHui China:中国安徽 +HeNan China:中国河南 +HuBei China:中国湖北 +HuNan China:中国湖南 +GuangDong China:中国广东 +ShenZhen China:中国深圳 +GuangXi China:中国广西 +HaiNan China:中国海南 +SiChuan China:中国四川 +ChongQing China:中国重庆 +GuiZhou China:中国贵州 +YunNan China:中国云南 +ShaanXi China:中国陕西 +GanSu China:中国甘肃 +Qingyang GanSu China:中国甘肃 庆阳 +NingXia China:中国宁夏 +YinChuan NingXia China:中国宁夏 银川 +QingHai China:中国青海 +China:中国 +Nauru:瑙鲁 +Andorra:安道尔 +The Gambia:冈比亚 +Bahamas:巴哈马群岛 +Mozambique:莫桑比克 +Chile:智利 +San Felix & San Ambrosio:圣菲力斯和圣安布罗西奥岛 +Easter Island:复活节岛 +Juan Fernandez Islands:胡安费南德斯岛 +Antarctica:南极洲 +Cuba:古巴 +Morocco:摩洛哥 +Bolivia:玻利维亚 +Portugal:葡萄牙 +Madeira Islands:马德拉群岛 +Azores:亚速尔群岛 +Uruguay:乌拉圭 +Sable Island:塞布尔岛 +St. Paul Island:圣保罗岛 +Angola:安哥拉 +Cape Verde:佛得角 +Comoros:科摩罗 +Fed. Rep. of Germany:德国 +Philippines:菲律宾 +Eritrea:厄立特里亚 +Palestine:巴勒斯坦 +North Cook Islands:北库克群岛 +South Cook Islands:南库克群岛 +Niue:纽埃 +Bosnia-Herzegovina:波斯尼亚和黑塞哥维那 +Spain:西班牙 +Balearic Islands:巴利阿里群岛 +Canary Islands:加那利群岛 +Ceuta & Melilla:休达和梅利利亚 +Ireland:爱尔兰 +Armenia:亚美尼亚 +Liberia:利比里亚 +Iran:伊朗 +Moldova:摩尔多瓦 +Estonia:爱沙尼亚 +Ethiopia:埃塞俄比亚 +Belarus:白俄罗斯 +Kyrgyzstan:吉尔吉斯斯坦 +Tajikistan:塔吉克斯坦 +Turkmenistan:土库曼斯坦 +France:法国 +Guadeloupe:瓜德罗普岛 +Mayotte:马约特岛 +St. Barthelemy:圣巴特勒米岛 +New Caledonia:新喀里多尼亚 +Chesterfield Islands:切斯特菲尔德岛 +Martinique:马提尼克岛 +French Polynesia:法属波利尼西亚 +Austral Islands:南方群岛 +Clipperton Island:克利珀顿岛 +Marquesas Islands:马克萨斯岛 +St. Pierre & Miquelon:圣皮埃尔和密克隆岛 +Reunion Island:留尼旺岛 +St. Martin:圣马丁岛 +Glorioso Islands:格洛里厄斯岛 +Juan de Nova, Europa:新胡安岛欧罗巴岛,欧洲 +Tromelin Island:特罗姆林岛 +Crozet Island:克罗泽特岛 +Kerguelen Islands:凯尔盖朗岛 +Amsterdam & St. Paul Is.:阿姆斯特丹和圣保罗岛 +Wallis & Futuna Islands:瓦利斯和富图纳岛 +French Guiana:法属圭亚那 +England:英格兰 +Isle of Man:马恩岛 +Northern Ireland:北爱尔兰 +Jersey:英国泽西岛 +Scotland:苏格兰 +Shetland Islands:设得兰群岛 +Guernsey:根西岛 +Wales:威尔士 +Solomon Islands:所罗门群岛 +Temotu Province:所罗门群岛泰莫图省 +Hungary:匈牙利 +Switzerland:瑞士 +Liechtenstein:列支敦士登 +Ecuador:厄瓜多尔 +Galapagos Islands:加拉帕戈斯岛 +Haiti:海地 +Dominican Republic:多米尼加共和国 +Colombia:哥伦比亚 +San Andres & Providencia:哥伦比亚圣安德列斯和普罗维登西亚岛 +Malpelo Island:马尔佩洛岛 +Republic of Korea:韩国 +Panama:巴拿马 +Honduras:洪都拉斯 +Thailand:泰国 +Vatican City:梵蒂冈 +Saudi Arabia:沙特阿拉伯 +Italy:意大利 +African Italy:意大利非洲属地 +Sardinia:意大利撒丁岛 +Sicily:意大利西西里岛 +Djibouti:吉布提 +Grenada:格林纳达 +Guinea-Bissau:几内亚比绍 +St. Lucia:圣卢西亚 +Dominica:多米尼克 +St. Vincent:圣文森特岛 +Japan:日本 +Minami Torishima:日本南鸟岛 +Ogasawara:日本小笠原群岛 +Mongolia:蒙古国 +Svalbard:挪威斯瓦尔巴岛 +Bear Island:挪威熊岛 +Jan Mayen:挪威扬马延岛 +Jordan:约旦 +United States:美国 +Guantanamo Bay:关塔那摩湾 +Mariana Islands:马里亚纳群岛 +Baker & Howland Islands:贝克和豪兰岛 +Guam:关岛 +Johnston Island:约翰斯顿岛 +Midway Island:中途岛 +Palmyra & Jarvis Islands:巴尔米拉环礁和贾维斯岛 +Hawaii:夏威夷 +Kure Island:库雷环礁 +American Samoa:美属萨摩亚 +Swains Island:斯温斯岛 +Wake Island:威克岛 +Alaska:美国阿拉斯加 +Navassa Island:纳瓦萨岛 +US Virgin Islands:美属维京群岛 +Puerto Rico:波多黎各 +Desecheo Island:德塞切奥岛 +Norway:挪威 +Argentina:阿根廷 +Luxembourg:卢森堡 +Lithuania:立陶宛 +Bulgaria:保加利亚 +Peru:秘鲁 +Lebanon:黎巴嫩 +Austria:奥地利 +Finland:芬兰 +Aland Islands:奥兰群岛 +Market Reef:马凯特礁 +Czech Republic:捷克 +Slovak Republic:斯洛伐克 +Belgium:比利时 +Greenland:格陵兰 +Faroe Islands:法罗群岛 +Denmark:丹麦 +Papua New Guinea:巴布亚新几内亚 +Aruba:阿鲁巴 +DPR of Korea:北朝鲜 +Netherlands:荷兰 +Curacao:库拉索岛 +Bonaire:博奈尔岛 +Saba & St. Eustatius:荷属萨巴和圣尤斯特歇斯岛 +Sint Maarten:荷属圣马丁岛 +Brazil:巴西 +Fernando de Noronha:费尔南多迪诺罗尼亚岛 +St. Peter & St. Paul:圣彼得和圣保罗岩 +Trindade & Martim Vaz:特林达迪和马丁瓦斯岛 +Suriname:苏里南 +Franz Josef Land:法兰士约瑟夫地岛 +Western Sahara:西撒哈拉 +Bangladesh:孟加拉国 +Slovenia:斯洛文尼亚 +Seychelles:塞舌尔岛 +Sao Tome & Principe:圣多美和普林西比岛 +Sweden:瑞典 +Poland:波兰 +Sudan:苏丹 +Egypt:埃及 +Greece:希腊 +Mount Athos:希腊阿索斯圣山 +Dodecanese:多德卡尼斯群岛 +Crete:克里特岛 +Tuvalu:图瓦卢 +Western Kiribati:基里巴斯西部 +Central Kiribati:基里巴斯中部 +Eastern Kiribati:基里巴斯东部 +Banaba Island:巴纳巴岛 +Somalia:索马里 +San Marino:圣马力诺 +Palau:帕劳 +Asiatic Turkey:土耳其·亚洲 +European Turkey:土耳其·欧洲 +Iceland:冰岛 +Guatemala:危地马拉 +Costa Rica:哥斯达黎加 +Cocos Island:科科斯岛 +Cameroon:喀麦隆 +Corsica:科西嘉岛 +Central African Republic:中非共和国 +Republic of the Congo:刚果共和国 +Gabon:加蓬 +Chad:乍得共和国 +Cote d'Ivoire:科特迪瓦 +Benin:贝宁 +Mali:马里 +European Russia:俄罗斯·欧洲 +Kaliningrad:俄罗斯·加里宁格勒 +Asiatic Russia:俄罗斯·亚洲 +Uzbekistan:乌兹别克斯坦 +Kazakhstan:哈萨克斯坦 +Ukraine:乌克兰 +Antigua & Barbuda:安提瓜和巴布达 +Belize:伯利兹 +St. Kitts & Nevis:圣基茨和尼维斯 +Namibia:纳米比亚 +Micronesia:密克罗尼西亚 +Marshall Islands:马绍尔群岛 +Brunei Darussalam:文莱达鲁萨兰国 +Canada:加拿大 +Australia:澳大利亚 +Heard Island:赫德岛 +Macquarie Island:麦格理岛 +Cocos (Keeling) Islands:科科斯(基林)群岛 +Lord Howe Island:豪勋爵岛 +Mellish Reef:梅利什礁 +Norfolk Island:诺福克岛 +Willis Island:威利斯岛 +Christmas Island:圣诞岛 +Anguilla:安圭拉岛 +Montserrat:蒙特塞拉特岛 +British Virgin Islands:英属维京岛 +Turks & Caicos Islands:特克斯和凯科斯岛 +Pitcairn Island:皮特凯恩岛 +Ducie Island:迪西岛 +Falkland Islands:福克兰群岛 +South Georgia Island:南乔治亚岛 +South Shetland Islands:南设得兰群岛 +South Orkney Islands:南奥克尼群岛 +South Sandwich Islands:南桑维奇群岛 +Bermuda:百慕大群岛 +Chagos Islands:查戈斯群岛 +Hong Kong China:中国香港 +India:印度 +Andaman & Nicobar Is.:安达曼和尼科巴岛 +Lakshadweep Islands:拉克沙威岛 +Mexico:墨西哥 +Revillagigedo:雷维亚希赫多岛 +Burkina Faso:布基纳法索 +Cambodia:柬埔寨 +Laos:老挝 +Macao:中国澳门 +Myanmar:缅甸 +Afghanistan:阿富汗 +Indonesia:印度尼西亚 +Iraq:伊拉克 +Vanuatu:瓦努阿图 +Syria:叙利亚 +Latvia:拉脱维亚 +Nicaragua:尼加拉瓜 +Romania:罗马尼亚 +El Salvador:萨尔瓦多 +Serbia:塞尔维亚 +Venezuela:委内瑞拉 +Aves Island:阿维斯岛 +Zimbabwe:津巴布韦 +North Macedonia:北马其顿 +Republic of Kosovo:科索沃共和国 +Republic of South Sudan:南苏丹共和国 +Albania:阿尔巴尼亚 +Gibraltar:直布罗陀 +UK Base Areas on Cyprus:英属塞浦路斯基地 +St. Helena:圣赫勒拿岛 +Ascension Island:阿森松岛 +Tristan da Cunha & Gough:特里斯坦和达库尼亚岛 +Cayman Islands:开曼群岛 +Tokelau Islands:托克劳群岛 +New Zealand:新西兰 +Chatham Islands:查塔姆群岛 +Kermadec Islands:克马德克群岛 +N.Z. Subantarctic Is.:新西兰亚南极群岛 +Paraguay:巴拉圭 +South Africa:南非 +Pr. Edward & Marion Is.:爱德华王子和马里恩岛 \ No newline at end of file diff --git a/feature/ft8/src/main/assets/country_en2cn.old b/feature/ft8/src/main/assets/country_en2cn.old new file mode 100644 index 00000000..4f0b2034 --- /dev/null +++ b/feature/ft8/src/main/assets/country_en2cn.old @@ -0,0 +1,382 @@ +Sov Mil Order of Malta:马耳他索夫米尔教团 +Spratly Islands China:中国南沙群岛 +Monaco:摩纳哥 +Agalega & St. Brandon:阿加莱加群岛和圣布莱顿岛 +Mauritius:毛里求斯 +Rodriguez Island:罗德里格斯岛 +Equatorial Guinea:赤道几内亚 +Annobon Island:安诺本岛 +Fiji:斐济 +Conway Reef:康威礁 +Rotuma Island:罗图马岛 +Kingdom of Eswatini:埃斯瓦蒂尼王国 +Tunisia:突尼斯 +Vietnam:越南 +Guinea:几尼 +Bouvet:布韦 +Peter 1 Island:彼得1岛 +Azerbaijan:阿塞拜疆 +Georgia:佐治亚州 +Montenegro:黑山 +Sri Lanka:斯里兰卡 +ITU HQ:国际电信联盟总部 +United Nations HQ:联合国总部 +Vienna Intl Ctr:维也纳国际中心 +Timor - Leste:东帝汶 +Israel:以色列 +Libya:利比亚 +Cyprus:塞浦路斯 +Tanzania:坦桑尼亚 +Nigeria:尼日利亚 +Madagascar:马达加斯加 +Mauritania:毛里塔尼亚 +Niger:尼日尔 +Togo:多哥 +Samoa:萨摩亚 +Uganda:乌干达 +Kenya:肯尼亚 +Senegal:塞内加尔 +Jamaica:牙买加 +Yemen:也门 +Lesotho:莱索托 +Malawi:马拉维 +Algeria:阿尔及利亚 +Barbados:巴巴多斯 +Maldives:马尔代夫 +Guyana:圭亚那 +Croatia:克罗地亚 +Ghana:加纳 +Malta:马耳他 +Zambia:赞比亚 +Kuwait:科威特 +Sierra Leone:塞拉利昂 +West Malaysia:西马来西亚 +East Malaysia:东马来西亚 +Nepal:尼泊尔 +Dem. Rep. of the Congo:刚果共和国 +Burundi:布隆迪 +Singapore:新加坡 +Rwanda:卢旺达 +Trinidad & Tobago:特立尼达和多巴哥 +Botswana:博茨瓦纳 +Tonga:汤加 +Oman:阿曼 +Bhutan:不丹 +United Arab Emirates:阿拉伯联合酋长国 +Qatar:卡塔尔 +Bahrain:巴林 +Pakistan:巴基斯坦 +Scarborough Reef China:中国黄岩岛 +Taiwan China:中国台湾 +Pratas Island China:中国东沙岛 +XinJiang China:中国新疆 +XiZang China:中国西藏 +BeiJing China:中国北京 +HeiLongJiang China:中国黑龙江 +JiLin China:中国吉林 +LiaoNing China:中国辽宁 +TianJin China:中国天津 +NeiMengGu China:中国内蒙古 +HeBei China:中国河北 +ShiJiaZhuang HeBei China:中国河北 石家庄 +ShanXi China:中国山西 +ShangHai China:中国上海 +ShanDong China:中国山东 +JiangSu China:中国江苏 +SuZhou JiangSu China:中国江苏 苏州 +ZheJiang China:中国浙江 +JiangXi China:中国江西 +FuJian China:中国福建 +AnHui China:中国安徽 +HeNan China:中国河南 +HuBei China:中国湖北 +HuNan China:中国湖南 +GuangDong China:中国广东 +ShenZhen China:中国深圳 +GuangXi China:中国广西 +HaiNan China:中国海南 +SiChuan China:中国四川 +ChongQing China:中国重庆 +GuiZhou China:中国贵州 +YunNan China:中国云南 +ShaanXi China:中国陕西 +GanSu China:中国甘肃 +Qingyang GanSu China:中国甘肃 庆阳 +NingXia China:中国宁夏 +YinChuan NingXia China:中国宁夏 银川 +QingHai China:中国青海 +China:中国 +Nauru:瑙鲁 +Andorra:安道尔 +The Gambia:冈比亚 +Bahamas:巴哈马群岛 +Mozambique:莫桑比克 +Chile:智利 +San Felix & San Ambrosio:圣菲利克斯和圣安布罗西奥 +Easter Island:复活节岛 +Juan Fernandez Islands:费尔南德斯群岛 +Antarctica:南极洲 +Cuba:古巴 +Morocco:摩洛哥 +Bolivia:玻利维亚 +Portugal:葡萄牙 +Madeira Islands:马德拉群岛 +Azores:亚速尔群岛 +Uruguay:乌拉圭 +Sable Island:塞布尔岛 +St. Paul Island:圣保罗岛 +Angola:安哥拉 +Cape Verde:佛得角 +Comoros:科摩罗 +Fed. Rep. of Germany:德国 +Philippines:菲律宾 +Eritrea:厄立特里亚 +Palestine:巴勒斯坦 +North Cook Islands:北库克群岛 +South Cook Islands:南库克群岛 +Niue:纽埃 +Bosnia-Herzegovina:波斯尼亚和黑塞哥维那 +Spain:西班牙 +Balearic Islands:巴利阿里群岛 +Canary Islands:加那利群岛 +Ceuta & Melilla:休达梅利利亚 +Ireland:爱尔兰 +Armenia:亚美尼亚 +Liberia:利比里亚 +Iran:伊朗 +Moldova:摩尔多瓦 +Estonia:爱沙尼亚 +Ethiopia:埃塞俄比亚 +Belarus:白俄罗斯 +Kyrgyzstan:吉尔吉斯斯坦 +Tajikistan:塔吉克斯坦 +Turkmenistan:土库曼斯坦 +France:法国 +Guadeloupe:瓜德罗普岛 +Mayotte:马约特 +St. Barthelemy:圣巴托洛缪岛 +New Caledonia:新喀里多尼亚 +Chesterfield Islands:切斯特菲尔德群岛 +Martinique:马提尼克岛 +French Polynesia:法属波利尼西亚 +Austral Islands:澳大利亚群岛 +Clipperton Island:克利珀顿岛 +Marquesas Islands:马奎萨斯群岛 +St. Pierre & Miquelon:圣皮埃尔和密克隆 +Reunion Island:留尼旺岛 +St. Martin:圣马丁 +Glorioso Islands:格洛里厄斯群岛 +Juan de Nova, Europa:万诺瓦岛 +Tromelin Island:特罗梅林岛 +Crozet Island:克罗泽岛 +Kerguelen Islands:克格伦群岛 +Amsterdam & St. Paul Is.:阿姆斯特丹和圣保罗 +Wallis & Futuna Islands:沃利斯和富图纳群岛 +French Guiana:法属圭亚那 +England:英格兰 +Isle of Man:马恩岛 +Northern Ireland:北爱尔兰 +Jersey:英国泽西岛 +Scotland:苏格兰 +Shetland Islands:设得兰群岛 +Guernsey:根西岛 +Wales:威尔士 +Solomon Islands:所罗门群岛 +Temotu Province:所罗门群岛泰莫图省 +Hungary:匈牙利 +Switzerland:瑞士 +Liechtenstein:列支敦士登 +Ecuador:厄瓜多尔 +Galapagos Islands:加拉帕戈斯群岛 +Haiti:海地 +Dominican Republic:多米尼加共和国 +Colombia:哥伦比亚 +San Andres & Providencia:哥伦比亚圣安德列斯-普罗维登西亚省 +Malpelo Island:马尔佩洛岛 +Republic of Korea:韩国 +Panama:巴拿马 +Honduras:洪都拉斯 +Thailand:泰国 +Vatican City:梵蒂冈 +Saudi Arabia:沙特阿拉伯 +Italy:意大利 +African Italy:非裔意大利 +Sardinia:意大利撒丁岛 +Sicily:意大利西西里岛 +Djibouti:吉布提 +Grenada:格林纳达 +Guinea-Bissau:几内亚比绍 +St. Lucia:圣卢西亚 +Dominica:多米尼加 +St. Vincent:圣文森特 +Japan:日本 +Minami Torishima:日本南鸟岛 +Ogasawara:日本小笠原群岛 +Mongolia:蒙古国 +Svalbard:挪威斯瓦尔巴群岛 +Bear Island:挪威熊岛 +Jan Mayen:挪威扬马延岛 +Jordan:约旦 +United States:美国 +Guantanamo Bay:关塔那摩湾 +Mariana Islands:马里亚纳群岛 +Baker & Howland Islands:贝克豪兰群岛 +Guam:关岛 +Johnston Island:约翰斯顿岛 +Midway Island:中途岛 +Palmyra & Jarvis Islands:帕尔米拉和贾维斯群岛 +Hawaii:夏威夷 +Kure Island:库尔岛 +American Samoa:美属萨摩亚 +Swains Island:天鹅岛 +Wake Island:威克岛 +Alaska:美国阿拉斯加 +Navassa Island:纳瓦萨岛 +US Virgin Islands:美属维京群岛 +Puerto Rico:波多黎各 +Desecheo Island:德塞西奥岛 +Norway:挪威 +Argentina:阿根廷 +Luxembourg:卢森堡 +Lithuania:立陶宛 +Bulgaria:保加利亚 +Peru:秘鲁 +Lebanon:黎巴嫩 +Austria:奥地利 +Finland:芬兰 +Aland Islands:阿兰群岛 +Market Reef:市场暗礁 +Czech Republic:捷克 +Slovak Republic:斯洛伐克 +Belgium:比利时 +Greenland:格陵兰 +Faroe Islands:法罗群岛 +Denmark:丹麦 +Papua New Guinea:巴布亚新几内亚 +Aruba:阿鲁巴 +DPR of Korea:北朝鲜 +Netherlands:荷兰 +Curacao:库拉索 +Bonaire:博内尔 +Saba & St. Eustatius:荷属萨巴群岛和圣尤斯特歇斯群岛 +Sint Maarten:荷属圣马丁 +Brazil:巴西 +Fernando de Noronha:费尔南多·德诺伦哈岛 +St. Peter & St. Paul:圣彼得和圣保罗岛 +Trindade & Martim Vaz:特林达迪和马丁瓦斯群岛 +Suriname:苏里南 +Franz Josef Land:弗朗兹·约瑟夫群岛 +Western Sahara:西撒哈拉 +Bangladesh:孟加拉国 +Slovenia:斯洛文尼亚 +Seychelles:塞舌尔 +Sao Tome & Principe:圣多美和普林西比岛 +Sweden:瑞典 +Poland:波兰 +Sudan:苏丹 +Egypt:埃及 +Greece:希腊 +Mount Athos:希腊阿托斯山 +Dodecanese:多德卡尼斯群岛 +Crete:克里特岛 +Tuvalu:图瓦卢 +Western Kiribati:基里巴斯西部 +Central Kiribati:基里巴斯中部 +Eastern Kiribati:基里巴斯东部 +Banaba Island:巴纳巴岛 +Somalia:索马里 +San Marino:圣马力诺 +Palau:帕劳 +Asiatic Turkey:土耳其·亚洲 +European Turkey:土耳其·欧洲 +Iceland:冰岛 +Guatemala:危地马拉 +Costa Rica:哥斯达黎加 +Cocos Island:科科斯群岛 +Cameroon:喀麦隆 +Corsica:科西嘉岛 +Central African Republic:中非共和国 +Republic of the Congo:刚果共和国 +Gabon:加蓬 +Chad:乍得共和国 +Cote d'Ivoire:科特迪瓦 +Benin:贝宁 +Mali:马里 +European Russia:俄罗斯·欧洲 +Kaliningrad:俄罗斯·加里宁格勒 +Asiatic Russia:俄罗斯·亚洲 +Uzbekistan:乌兹别克斯坦 +Kazakhstan:哈萨克斯坦 +Ukraine:乌克兰 +Antigua & Barbuda:安提瓜和巴布达 +Belize:伯利兹 +St. Kitts & Nevis:圣基茨和尼维斯 +Namibia:纳米比亚 +Micronesia:密克罗尼西亚 +Marshall Islands:马绍尔群岛 +Brunei Darussalam:文莱达鲁萨兰国 +Canada:加拿大 +Australia:澳大利亚 +Heard Island:赫德岛 +Macquarie Island:麦格理岛 +Cocos (Keeling) Islands:科科斯(基林)群岛 +Lord Howe Island:豪勋爵岛 +Mellish Reef:梅利什礁 +Norfolk Island:诺福克岛 +Willis Island:威利斯岛 +Christmas Island:圣诞岛 +Anguilla:安圭拉 +Montserrat:蒙特塞拉特 +British Virgin Islands:英属维尔京群岛 +Turks & Caicos Islands:特克斯和凯科斯群岛 +Pitcairn Island:皮特凯恩岛 +Ducie Island:迪西岛 +Falkland Islands:福克兰群岛 +South Georgia Island:南乔治亚岛 +South Shetland Islands:南设得兰群岛 +South Orkney Islands:南奥克尼群岛 +South Sandwich Islands:南桑威奇群岛 +Bermuda:百慕大群岛 +Chagos Islands:查戈斯群岛 +Hong Kong China:中国香港 +India:印度 +Andaman & Nicobar Is.:安达曼-尼科巴群岛 +Lakshadweep Islands:拉克沙群岛 +Mexico:墨西哥 +Revillagigedo:雷维拉吉加多 +Burkina Faso:布基纳法索 +Cambodia:柬埔寨 +Laos:老挝 +Macao:中国澳门 +Myanmar:缅甸 +Afghanistan:阿富汗 +Indonesia:印度尼西亚 +Iraq:伊拉克 +Vanuatu:瓦努阿图 +Syria:叙利亚 +Latvia:拉脱维亚 +Nicaragua:尼加拉瓜 +Romania:罗马尼亚 +El Salvador:萨尔瓦多 +Serbia:塞尔维亚 +Venezuela:委内瑞拉 +Aves Island:艾夫斯岛 +Zimbabwe:津巴布韦 +North Macedonia:北马其顿 +Republic of Kosovo:科索沃共和国 +Republic of South Sudan:南苏丹共和国 +Albania:阿尔巴尼亚 +Gibraltar:直布罗陀 +UK Base Areas on Cyprus:英国在塞浦路斯的基地 +St. Helena:圣赫勒拿 +Ascension Island:阿森松岛 +Tristan da Cunha & Gough:特里斯坦·达库尼亚和高夫 +Cayman Islands:开曼群岛 +Tokelau Islands:托克劳群岛 +New Zealand:新西兰 +Chatham Islands:查塔姆群岛 +Kermadec Islands:克马德克群岛 +N.Z. Subantarctic Is.:新西兰亚南极群岛 +Paraguay:巴拉圭 +South Africa:南非 +Pr. Edward & Marion Is.:爱德华王子群岛和马里恩岛 \ No newline at end of file diff --git a/feature/ft8/src/main/assets/country_en2hk.dat b/feature/ft8/src/main/assets/country_en2hk.dat new file mode 100644 index 00000000..16a5452e --- /dev/null +++ b/feature/ft8/src/main/assets/country_en2hk.dat @@ -0,0 +1,382 @@ +Sov Mil Order of Malta:馬耳他索夫米爾教團 +Spratly Islands China:中國南沙群島 +Monaco:摩納哥 +Agalega & St. Brandon:阿加萊加及聖布蘭登島 +Mauritius:毛里求斯 +Rodriguez Island:羅德里格斯島 +Equatorial Guinea:赤道幾內亞 +Annobon Island:安諾本島 +Fiji:斐濟 +Conway Reef:康威礁 +Rotuma Island:羅圖馬島 +Kingdom of Eswatini:斯威士蘭王國 +Tunisia:突尼斯 +Vietnam:越南 +Guinea:幾內亞 +Bouvet:布韋島 +Peter 1 Island:彼得一世島 +Azerbaijan:阿塞拜疆 +Georgia:格魯吉亞 +Montenegro:黑山共和國 +Sri Lanka:斯里蘭卡 +ITU HQ:國際電信聯盟總部 +United Nations HQ:聯合國總部 +Vienna Intl Ctr:維也納國際中心 +Timor - Leste:東帝汶 +Israel:以色列 +Libya:利比亞 +Cyprus:塞浦路斯 +Tanzania:坦桑尼亞 +Nigeria:尼日利亞 +Madagascar:馬達加斯加 +Mauritania:毛里塔尼亞 +Niger:尼日爾 +Togo:多哥 +Samoa:薩摩亞 +Uganda:烏幹達 +Kenya:肯尼亞 +Senegal:塞內加爾 +Jamaica:牙買加 +Yemen:也門 +Lesotho:萊索托 +Malawi:馬拉維 +Algeria:阿爾及利亞 +Barbados:巴巴多斯 +Maldives:馬爾代夫 +Guyana:圭亞那 +Croatia:克羅地亞 +Ghana:加納 +Malta:馬爾他 +Zambia:讚比亞 +Kuwait:科威特 +Sierra Leone:塞拉利昂 +West Malaysia:西馬來西亞 +East Malaysia:東馬來西亞 +Nepal:尼泊爾 +Dem. Rep. of the Congo:剛果民主共和國 +Burundi:布隆迪 +Singapore:新加坡 +Rwanda:盧旺達 +Trinidad & Tobago:特立尼達和多巴哥 +Botswana:博茨瓦納 +Tonga:湯加 +Oman:阿曼 +Bhutan:不丹 +United Arab Emirates:阿拉伯聯合酋長國 +Qatar:卡塔爾 +Bahrain:巴林 +Pakistan:巴基斯坦 +Scarborough Reef China:中國黃巖島 +Taiwan China:中國台灣 +Pratas Island China:中國東沙島 +XinJiang China:中國新疆 +XiZang China:中國西藏 +BeiJing China:中國北京 +HeiLongJiang China:中國黑龍江 +JiLin China:中國吉林 +LiaoNing China:中國遼寧 +TianJin China:中國天津 +NeiMengGu China:中國內蒙古 +HeBei China:中國河北 +ShiJiaZhuang HeBei China:中國河北 石家莊 +ShanXi China:中國山西 +ShangHai China:中國上海 +ShanDong China:中國山東 +JiangSu China:中國江蘇 +SuZhou JiangSu China:中國江蘇 蘇州 +ZheJiang China:中國浙江 +JiangXi China:中國江西 +FuJian China:中國福建 +AnHui China:中國安徽 +HeNan China:中國河南 +HuBei China:中國湖北 +HuNan China:中國湖南 +GuangDong China:中國廣東 +ShenZhen China:中國深圳 +GuangXi China:中國廣西 +HaiNan China:中國海南 +SiChuan China:中國四川 +ChongQing China:中國重慶 +GuiZhou China:中國貴州 +YunNan China:中國雲南 +ShaanXi China:中國陜西 +GanSu China:中國甘肅 +Qingyang GanSu China:中國甘肅 慶陽 +NingXia China:中國寧夏 +YinChuan NingXia China:中國寧夏 銀川 +QingHai China:中國青海 +China:中國 +Nauru:瑙魯 +Andorra:安道爾 +The Gambia:岡比亞 +Bahamas:巴哈馬島 +Mozambique:莫桑比克 +Chile:智利 +San Felix & San Ambrosio:聖菲利斯和聖安布羅西奧島 +Easter Island:復活節島 +Juan Fernandez Islands:胡安費南德斯島 +Antarctica:南極洲 +Cuba:古巴 +Morocco:摩洛哥 +Bolivia:玻利維亞 +Portugal:葡萄牙 +Madeira Islands:馬德拉島 +Azores:亞速爾島 +Uruguay:烏拉圭 +Sable Island:塞布爾島 +St. Paul Island:聖保羅島 +Angola:安哥拉 +Cape Verde:佛得角 +Comoros:科摩羅 +Fed. Rep. of Germany:德國 +Philippines:菲律賓 +Eritrea:厄立特里亞 +Palestine:巴勒斯坦 +North Cook Islands:北庫克島 +South Cook Islands:南庫克島 +Niue:紐埃 +Bosnia-Herzegovina:波斯尼亞和黑塞哥維那 +Spain:西班牙 +Balearic Islands:巴利阿里島 +Canary Islands:加那利島 +Ceuta & Melilla:休達梅利利亞 +Ireland:愛爾蘭 +Armenia:亞美尼亞 +Liberia:利比里亞 +Iran:伊朗 +Moldova:摩爾多瓦 +Estonia:愛沙尼亞 +Ethiopia:埃塞俄比亞 +Belarus:白俄羅斯 +Kyrgyzstan:吉爾吉斯斯坦 +Tajikistan:塔吉克斯坦 +Turkmenistan:土庫曼斯坦 +France:法國 +Guadeloupe:瓜德羅普島 +Mayotte:馬約特島 +St. Barthelemy:聖巴特勒米島 +New Caledonia:新喀里多尼亞 +Chesterfield Islands:切斯特菲爾德島 +Martinique:馬提尼克島 +French Polynesia:法屬波利尼西亞 +Austral Islands:南方群島 +Clipperton Island:克利珀頓島 +Marquesas Islands:馬克薩斯島 +St. Pierre & Miquelon:聖皮埃爾和密克隆島 +Reunion Island:留尼旺島 +St. Martin:聖馬丁島 +Glorioso Islands:格洛里厄斯島 +Juan de Nova, Europa:新胡安島歐羅巴島,歐洲 +Tromelin Island:特羅姆蘭島 +Crozet Island:克羅澤島 +Kerguelen Islands:凱爾蓋朗島 +Amsterdam & St. Paul Is.:阿姆斯特丹和聖保羅島 +Wallis & Futuna Islands:瓦利斯和富圖納島 +French Guiana:法屬圭亞那 +England:英格蘭 +Isle of Man:馬恩島 +Northern Ireland:北愛爾蘭 +Jersey:英國澤西島 +Scotland:蘇格蘭 +Shetland Islands:設特蘭島 +Guernsey:根西島 +Wales:威爾士 +Solomon Islands:所羅門島 +Temotu Province:所羅門島泰莫圖省 +Hungary:匈牙利 +Switzerland:瑞士 +Liechtenstein:列支敦士登 +Ecuador:厄瓜多爾 +Galapagos Islands:加拉帕戈斯島 +Haiti:海地 +Dominican Republic:多明尼加共和國 +Colombia:哥倫比亞 +San Andres & Providencia:哥倫比亞聖安德列斯和普羅維登西亞島 +Malpelo Island:馬爾佩洛島 +Republic of Korea:韓國 +Panama:巴拿馬 +Honduras:洪都拉斯 +Thailand:泰國 +Vatican City:梵蒂岡 +Saudi Arabia:沙特阿拉伯 +Italy:意大利 +African Italy:意大利非洲屬地 +Sardinia:意大利撒丁島 +Sicily:意大利西西里島 +Djibouti:吉布提 +Grenada:格林納達 +Guinea-Bissau:幾內亞比紹 +St. Lucia:聖盧西亞 +Dominica:多米尼克 +St. Vincent:聖文森特島 +Japan:日本 +Minami Torishima:日本南鳥島 +Ogasawara:日本小笠原島 +Mongolia:蒙古國 +Svalbard:挪威斯瓦爾巴島 +Bear Island:挪威熊島 +Jan Mayen:挪威揚馬延島 +Jordan:約旦 +United States:美國 +Guantanamo Bay:關塔那摩灣 +Mariana Islands:馬利亞納島 +Baker & Howland Islands:貝克和豪蘭島 +Guam:關島 +Johnston Island:約翰斯頓島 +Midway Island:中途島 +Palmyra & Jarvis Islands:巴爾米拉環礁和賈維斯島 +Hawaii:夏威夷 +Kure Island:庫雷環礁 +American Samoa:美屬薩摩亞 +Swains Island:斯溫斯島 +Wake Island:威克島 +Alaska:美國阿拉斯加 +Navassa Island:納瓦薩島 +US Virgin Islands:美屬維京島 +Puerto Rico:波多黎各 +Desecheo Island:德塞西奧島 +Norway:挪威 +Argentina:阿根廷 +Luxembourg:盧森堡 +Lithuania:立陶宛 +Bulgaria:保加利亞 +Peru:秘魯 +Lebanon:黎巴嫩 +Austria:奧地利 +Finland:芬蘭 +Aland Islands:奧蘭島 +Market Reef:馬凱特礁 +Czech Republic:捷克 +Slovak Republic:斯洛伐克 +Belgium:比利時 +Greenland:格陵蘭 +Faroe Islands:法羅島 +Denmark:丹麥 +Papua New Guinea:巴布亞新幾內亞 +Aruba:阿魯巴 +DPR of Korea:北朝鮮 +Netherlands:荷蘭 +Curacao:庫拉索島 +Bonaire:博內爾島 +Saba & St. Eustatius:荷屬薩巴和聖尤斯特歇斯島 +Sint Maarten:荷屬聖馬丁島 +Brazil:巴西 +Fernando de Noronha:費爾南多迪諾羅尼亞島 +St. Peter & St. Paul:聖彼得和聖保羅岩 +Trindade & Martim Vaz:特林達迪和馬丁瓦斯島 +Suriname:蘇里南 +Franz Josef Land:法蘭士約瑟夫地島 +Western Sahara:西撒哈拉 +Bangladesh:孟加拉國 +Slovenia:斯洛文尼亞 +Seychelles:塞舌爾 +Sao Tome & Principe:聖多美和普林西比島 +Sweden:瑞典 +Poland:波蘭 +Sudan:蘇丹 +Egypt:埃及 +Greece:希臘 +Mount Athos:希臘阿索斯聖山 +Dodecanese:多德卡尼斯島 +Crete:克里特島 +Tuvalu:圖瓦盧 +Western Kiribati:基里巴斯西部 +Central Kiribati:基里巴斯中部 +Eastern Kiribati:基里巴斯東部 +Banaba Island:巴納巴島 +Somalia:索馬里 +San Marino:聖馬力諾 +Palau:帕勞 +Asiatic Turkey:土耳其·亞洲 +European Turkey:土耳其·歐洲 +Iceland:冰島 +Guatemala:危地馬拉 +Costa Rica:哥斯達黎加 +Cocos Island:科科斯島 +Cameroon:喀麥隆 +Corsica:科西嘉島 +Central African Republic:中非共和國 +Republic of the Congo:剛果共和國 +Gabon:加蓬 +Chad:乍得共和國 +Cote d'Ivoire:科特迪瓦 +Benin:貝寧 +Mali:馬里 +European Russia:俄羅斯·歐洲 +Kaliningrad:俄羅斯·加里寧格勒 +Asiatic Russia:俄羅斯·亞洲 +Uzbekistan:烏茲別克斯坦 +Kazakhstan:哈薩克斯坦 +Ukraine:烏克蘭 +Antigua & Barbuda:安提瓜和巴布達 +Belize:伯利茲 +St. Kitts & Nevis:聖基茨和尼維斯 +Namibia:納米比亞 +Micronesia:密克羅尼西亞 +Marshall Islands:馬紹爾島 +Brunei Darussalam:文萊達魯薩蘭國 +Canada:加拿大 +Australia:澳洲 +Heard Island:赫德島 +Macquarie Island:麥格理島 +Cocos (Keeling) Islands:科科斯(基林)島 +Lord Howe Island:豪勳爵島 +Mellish Reef:梅利什礁 +Norfolk Island:諾福克島 +Willis Island:威利斯島 +Christmas Island:聖誕島 +Anguilla:安圭拉島 +Montserrat:蒙特塞拉特島 +British Virgin Islands:英屬維爾京島 +Turks & Caicos Islands:特克斯和凱科斯島 +Pitcairn Island:皮特凱恩島 +Ducie Island:迪西島 +Falkland Islands:福克蘭島 +South Georgia Island:南喬治亞島 +South Shetland Islands:南設特蘭島 +South Orkney Islands:南奧克尼島 +South Sandwich Islands:南桑威奇島 +Bermuda:百慕大島 +Chagos Islands:查戈斯島 +Hong Kong China:中國香港 +India:印度 +Andaman & Nicobar Is.:安達曼和尼科巴島 +Lakshadweep Islands:拉克沙威島 +Mexico:墨西哥 +Revillagigedo:雷維亞希赫多島 +Burkina Faso:布基納法索 +Cambodia:柬埔寨 +Laos:老撾 +Macao:中國澳門 +Myanmar:緬甸 +Afghanistan:阿富汗 +Indonesia:印尼 +Iraq:伊拉克 +Vanuatu:瓦努阿圖 +Syria:敘利亞 +Latvia:拉脫維亞 +Nicaragua:尼加拉瓜 +Romania:羅馬尼亞 +El Salvador:薩爾瓦多 +Serbia:塞爾維亞 +Venezuela:委內瑞拉 +Aves Island:阿維斯島 +Zimbabwe:津巴布韋 +North Macedonia:北馬其頓 +Republic of Kosovo:科索沃共和國 +Republic of South Sudan:南蘇丹共和國 +Albania:阿爾巴尼亞 +Gibraltar:直布羅陀 +UK Base Areas on Cyprus:英屬塞浦路斯基地 +St. Helena:聖赫勒拿島 +Ascension Island:阿森松島 +Tristan da Cunha & Gough:特里斯坦和達庫尼亞島 +Cayman Islands:開曼島 +Tokelau Islands:托克勞島 +New Zealand:新西蘭 +Chatham Islands:查塔姆島 +Kermadec Islands:克馬德克島 +N.Z. Subantarctic Is.:新西蘭亞南極島 +Paraguay:巴拉圭 +South Africa:南非 +Pr. Edward & Marion Is.:愛德華王子島和馬里恩島 \ No newline at end of file diff --git a/feature/ft8/src/main/assets/cqzone.json b/feature/ft8/src/main/assets/cqzone.json new file mode 100644 index 00000000..9225b463 --- /dev/null +++ b/feature/ft8/src/main/assets/cqzone.json @@ -0,0 +1,22380 @@ +{ + "10": { + "mh": [ + "EI48", + "EI49", + "EI58", + "EI59", + "EJ40", + "FG67", + "FG68", + "FG69", + "FG78", + "FG79", + "FG88", + "FG89", + "FH51", + "FH52", + "FH53", + "FH54", + "FH55", + "FH56", + "FH57", + "FH58", + "FH60", + "FH61", + "FH62", + "FH63", + "FH64", + "FH65", + "FH66", + "FH67", + "FH68", + "FH69", + "FH70", + "FH71", + "FH72", + "FH73", + "FH74", + "FH75", + "FH76", + "FH77", + "FH80", + "FH81", + "FH82", + "FH83", + "FH84", + "FH85", + "FH86", + "FH90", + "FH91", + "FH92", + "FH93", + "FH94", + "FH95", + "GH01", + "GH02", + "GH03", + "EI95", + "FI04", + "FI05", + "FI06", + "FI07", + "FI08", + "FI09", + "FI16", + "FI17", + "FI18", + "FI19", + "FI27", + "FI28", + "FI29", + "FJ00", + "EI94", + "FH18", + "FH19", + "FH25", + "FH26", + "FH27", + "FH28", + "FH29", + "FH33", + "FH34", + "FH35", + "FH36", + "FH37", + "FH38", + "FH39", + "FH42", + "FH43", + "FH44", + "FH45", + "FH46", + "FH47", + "FH48", + "FI02", + "FI03", + "FI10", + "FI11", + "FI12", + "FI13", + "FI14", + "FI15", + "FI20", + "FI21", + "FI22", + "FI23", + "FI24", + "FI25", + "FI26", + "FI30", + "FI34", + "FI35", + "FI36", + "FI37", + "FI46", + "FI47", + "FH49", + "EJ50", + "FG57", + "FG58", + "FG59", + "FG77", + "FG87", + "FG99", + "FH50", + "FH59", + "FH78", + "FH79", + "FH87", + "FH96", + "FI60", + "FI70", + "GG09", + "GG19", + "GH00", + "GH10", + "GH11", + "GH12", + "EI96", + "EI97", + "EI98", + "EI99", + "EJ90", + "FJ10", + "FJ20", + "EI93", + "FH09", + "FH15", + "FH16", + "FH17", + "FH23", + "FH24", + "FH32", + "FH41", + "FI00", + "FI01", + "FI31", + "FI32", + "FI33", + "FI38", + "FI45", + "FJ01", + "EJ41", + "EJ42", + "EJ32", + "EJ31", + "EJ30", + "EI39", + "EI38", + "FI55", + "FI40", + "EI57", + "EI47" + ], + "worked": false, + "confirmed": false, + "name": "Western Zone of South America", + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-130, 4], + [-82, 4], + [-79.75, 2], + [-78.8347, 1.44093], + [-78.42501, 1.15419], + [-78.31336, 1.18946], + [-78.20003, 0.94947], + [-77.49059, 0.66218], + [-77.5277, 0.40306], + [-77.11961, 0.38018], + [-77.09802, 0.28866], + [-76.41003, 0.24212], + [-76.27804, 0.4372], + [-76.05784, 0.33542], + [-75.80742, 0.04971], + [-75.63882, 0.04788], + [-75.27132, -0.12665], + [-75.18176, -0.03804], + [-74.4196, -0.50276], + [-74.24458, -0.82647], + [-74.27341, -0.98044], + [-73.68025, -1.23885], + [-73.48144, -1.57898], + [-73.53886, -1.70125], + [-73.1424, -1.81476], + [-73.09106, -2.04091], + [-73.14938, -2.26537], + [-72.93078, -2.45676], + [-72.63554, -2.35812], + [-72.37967, -2.45069], + [-71.91827, -2.36451], + [-71.72518, -2.13979], + [-71.47023, -2.26838], + [-71.39377, -2.41014], + [-71.19258, -2.38138], + [-71.00383, -2.20762], + [-70.67721, -2.34596], + [-70.6368, -2.46968], + [-70.30243, -2.49891], + [-70.05553, -2.75926], + [-70.71694, -3.79876], + [-70.49995, -3.87512], + [-70.28904, -3.82397], + [-69.94733, -4.22711], + [-70.20264, -4.35532], + [-70.2871, -4.17044], + [-70.75402, -4.15605], + [-70.93255, -4.37859], + [-71.2642, -4.38339], + [-71.59379, -4.52578], + [-71.78742, -4.48197], + [-72.48505, -4.95278], + [-72.88949, -5.16207], + [-72.96433, -5.65836], + [-73.15522, -5.87356], + [-73.25135, -6.12759], + [-73.11127, -6.45383], + [-73.63862, -6.75667], + [-73.79792, -7.11452], + [-73.69561, -7.29982], + [-73.98262, -7.53473], + [-73.71483, -7.74093], + [-73.77251, -7.9076], + [-73.6393, -8.00688], + [-73.54248, -8.34671], + [-73.331, -8.47374], + [-72.94304, -8.98208], + [-72.95952, -9.14549], + [-73.20057, -9.41165], + [-72.71614, -9.41163], + [-72.28249, -9.54185], + [-72.1534, -9.79568], + [-72.18052, -10.00043], + [-71.37627, -10.00018], + [-71.22231, -9.96953], + [-70.56382, -9.43078], + [-70.52605, -9.71515], + [-70.62149, -9.82681], + [-70.62087, -10.9999], + [-70.19989, -11.05443], + [-69.95476, -10.92771], + [-69.73916, -10.97221], + [-69.4233, -10.92569], + [-68.90694, -11.02074], + [-68.71674, -11.14674], + [-68.23609, -10.95198], + [-68.03284, -10.65521], + [-67.70875, -10.70987], + [-67.59957, -10.52495], + [-67.31942, -10.31965], + [-67.18827, -10.33789], + [-66.61972, -9.89446], + [-65.78065, -9.74019], + [-65.55268, -9.83154], + [-65.38308, -9.69146], + [-65.28763, -10.21628], + [-65.42702, -10.46419], + [-65.25124, -10.98367], + [-65.35561, -11.12586], + [-65.26154, -11.702], + [-65.09675, -11.70335], + [-65.0425, -11.96141], + [-64.51241, -12.22259], + [-64.40323, -12.44865], + [-63.95966, -12.52977], + [-63.78869, -12.42786], + [-63.37258, -12.65843], + [-63.15217, -12.63297], + [-63.00728, -12.83993], + [-62.75872, -13.01928], + [-62.27738, -13.15572], + [-61.86676, -13.52986], + [-61.00983, -13.50649], + [-60.52918, -13.79074], + [-60.40833, -13.94807], + [-60.45502, -14.3123], + [-60.27215, -14.6203], + [-60.24507, -15.09718], + [-60.57498, -15.09775], + [-60.2391, -15.47452], + [-60.17368, -16.26666], + [-58.4307, -16.32267], + [-58.32299, -16.26643], + [-58.34359, -16.51741], + [-58.46306, -16.65067], + [-58.47542, -16.93268], + [-58.25501, -17.35261], + [-57.96387, -17.50067], + [-57.88344, -17.44955], + [-57.56028, -18.24145], + [-57.78332, -19.03508], + [-58.13116, -19.75845], + [-57.85924, -19.97079], + [-58.13776, -20.12236], + [-58.16386, -19.82732], + [-59.069, -19.28766], + [-59.9749, -19.29449], + [-60.60436, -19.45662], + [-61.73506, -19.63441], + [-61.92247, -20.08923], + [-62.26636, -20.56316], + [-62.26092, -21.05867], + [-62.63814, -22.2313], + [-62.80884, -22.14226], + [-62.81339, -21.99875], + [-63.93142, -21.99935], + [-64.19999, -22.51573], + [-64.32427, -22.85087], + [-64.40941, -22.55822], + [-64.63875, -22.19313], + [-64.99338, -22.08242], + [-65.74975, -22.10918], + [-66.0763, -21.83496], + [-66.24344, -21.79202], + [-66.28808, -22.08755], + [-66.73918, -22.2384], + [-66.78242, -22.43809], + [-67.02716, -22.54079], + [-67.1807, -22.8138], + [-67.19382, -22.81702], + [-67.56698, -22.89786], + [-67.88275, -22.8341], + [-67.86283, -22.59898], + [-67.96428, -22.05376], + [-68.1807, -21.60437], + [-68.17899, -21.30207], + [-68.55445, -20.728], + [-68.43823, -20.64318], + [-68.73899, -20.4558], + [-68.67134, -20.35426], + [-68.76225, -20.07814], + [-68.56668, -20.05002], + [-68.52802, -19.84543], + [-68.68226, -19.71791], + [-68.40459, -19.41598], + [-68.95019, -18.93602], + [-69.05079, -18.05608], + [-69.2808, -17.97042], + [-69.46845, -17.49833], + [-69.8252, -17.70543], + [-69.75081, -17.94705], + [-69.96728, -18.2626], + [-70.37988, -18.35], + [-72, -20], + [-120, -20], + [-120, -12], + [-130, -12], + [-130, 4] + ] + ] + }, + "properties": { "cqzone": "10" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "11": { + "mh": [ + "FH59", + "FH78", + "FH79", + "FH87", + "FH88", + "FH89", + "FH96", + "FH97", + "FH98", + "FH99", + "FI31", + "FI32", + "FI33", + "FI40", + "FI41", + "FI42", + "FI43", + "FI44", + "FI45", + "FI50", + "FI51", + "FI52", + "FI53", + "FI54", + "FI55", + "FI56", + "FI57", + "FI58", + "FI59", + "FI60", + "FI61", + "FI62", + "FI63", + "FI64", + "FI65", + "FI66", + "FI67", + "FI68", + "FI69", + "FI70", + "FI71", + "FI72", + "FI73", + "FI74", + "FI75", + "FI76", + "FI77", + "FI78", + "FI79", + "FI80", + "FI81", + "FI82", + "FI83", + "FI84", + "FI85", + "FI86", + "FI87", + "FI88", + "FI89", + "FI90", + "FI91", + "FI92", + "FI93", + "FI94", + "FI95", + "FI96", + "FI97", + "FI98", + "FI99", + "FJ50", + "FJ51", + "FJ60", + "FJ70", + "FJ80", + "FJ81", + "FJ82", + "FJ83", + "FJ90", + "FJ91", + "FJ92", + "FJ93", + "FJ94", + "GF29", + "GF37", + "GF38", + "GF39", + "GF49", + "GG09", + "GG17", + "GG18", + "GG19", + "GG20", + "GG21", + "GG24", + "GG25", + "GG26", + "GG27", + "GG28", + "GG29", + "GG30", + "GG31", + "GG32", + "GG33", + "GG34", + "GG35", + "GG36", + "GG37", + "GG38", + "GG39", + "GG40", + "GG41", + "GG42", + "GG43", + "GG44", + "GG45", + "GG46", + "GG47", + "GG48", + "GG49", + "GG51", + "GG52", + "GG53", + "GG54", + "GG55", + "GG56", + "GG57", + "GG58", + "GG59", + "GG66", + "GG67", + "GG68", + "GG69", + "GG76", + "GG77", + "GG78", + "GG79", + "GG87", + "GG88", + "GG89", + "GG98", + "GG99", + "GH00", + "GH04", + "GH05", + "GH06", + "GH07", + "GH08", + "GH09", + "GH10", + "GH11", + "GH12", + "GH13", + "GH14", + "GH15", + "GH16", + "GH17", + "GH18", + "GH19", + "GH20", + "GH21", + "GH22", + "GH23", + "GH24", + "GH25", + "GH26", + "GH27", + "GH28", + "GH29", + "GH30", + "GH31", + "GH32", + "GH33", + "GH34", + "GH35", + "GH36", + "GH37", + "GH38", + "GH39", + "GH40", + "GH41", + "GH42", + "GH43", + "GH44", + "GH45", + "GH46", + "GH47", + "GH48", + "GH49", + "GH50", + "GH51", + "GH52", + "GH53", + "GH54", + "GH55", + "GH56", + "GH57", + "GH58", + "GH59", + "GH60", + "GH61", + "GH62", + "GH63", + "GH64", + "GH65", + "GH66", + "GH67", + "GH68", + "GH69", + "GH70", + "GH71", + "GH72", + "GH73", + "GH74", + "GH75", + "GH76", + "GH77", + "GH78", + "GH79", + "GH80", + "GH81", + "GH82", + "GH83", + "GH84", + "GH85", + "GH86", + "GH87", + "GH88", + "GH89", + "GH90", + "GH91", + "GH92", + "GH93", + "GH94", + "GH95", + "GH96", + "GH97", + "GH98", + "GH99", + "GI00", + "GI01", + "GI02", + "GI03", + "GI04", + "GI05", + "GI06", + "GI07", + "GI08", + "GI09", + "GI10", + "GI11", + "GI12", + "GI13", + "GI14", + "GI15", + "GI16", + "GI17", + "GI18", + "GI19", + "GI20", + "GI21", + "GI22", + "GI23", + "GI24", + "GI25", + "GI26", + "GI27", + "GI28", + "GI29", + "GI30", + "GI31", + "GI32", + "GI33", + "GI34", + "GI35", + "GI36", + "GI37", + "GI38", + "GI39", + "GI40", + "GI41", + "GI42", + "GI43", + "GI44", + "GI45", + "GI46", + "GI47", + "GI48", + "GI49", + "GI50", + "GI51", + "GI52", + "GI53", + "GI54", + "GI55", + "GI56", + "GI57", + "GI58", + "GI59", + "GI60", + "GI61", + "GI62", + "GI63", + "GI64", + "GI65", + "GI66", + "GI67", + "GI68", + "GI70", + "GI71", + "GI72", + "GI73", + "GI74", + "GI75", + "GI76", + "GI77", + "GI80", + "GI81", + "GI82", + "GI83", + "GI84", + "GI85", + "GI86", + "GI87", + "GI90", + "GI91", + "GI92", + "GI93", + "GI94", + "GI95", + "GI96", + "GJ00", + "GJ10", + "GJ11", + "GJ20", + "GJ21", + "GJ30", + "GJ31", + "GJ40", + "GJ41", + "GJ42", + "HH04", + "HH05", + "HH06", + "HH07", + "HH08", + "HH09", + "HH19", + "HI00", + "HI01", + "HI02", + "HI03", + "HI04", + "HI05", + "HI06", + "HI10", + "HI11", + "HI12", + "HI13", + "HI14", + "HI22", + "HI23", + "FG96", + "FG97", + "FG98", + "FG99", + "GG05", + "GG06", + "GG07", + "GG08", + "GG13", + "GG14", + "GG15", + "GG16", + "GG23", + "HG59", + "FH39", + "FH48", + "FH49", + "FH58", + "FH69", + "FH77", + "FH86", + "FH93", + "FH94", + "FH95", + "FI30", + "FI34", + "FI35", + "FJ61", + "FJ71", + "FJ72", + "FJ73", + "FJ74", + "FJ84", + "FJ95", + "GF19", + "GF28", + "GF47", + "GF48", + "GG10", + "GG11", + "GG22", + "GG50", + "GG64", + "GG65", + "GG86", + "GG97", + "GH02", + "GH03", + "GI69", + "GI78", + "GI97", + "GJ01", + "GJ02", + "GJ03", + "GJ04", + "GJ22", + "GJ32", + "GJ33", + "GJ43", + "GJ50", + "GJ51", + "HH00", + "HH01", + "HH02", + "HH03", + "HH17", + "HH18", + "HH29", + "HI07", + "HI15", + "HI20", + "HI21", + "HI24", + "FG87", + "FG88", + "FG89", + "FG95", + "FH90", + "GG02", + "GG03", + "GG04", + "GG12", + "HI36", + "HJ50", + "HI35", + "HJ51", + "GF36", + "FI49", + "FJ40", + "GJ05", + "GJ12", + "GJ44", + "FJ62", + "HI25" + ], + "worked": false, + "confirmed": false, + "name": "Central Zone of South America", + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-26, 5], + [-26, -34], + [-53, -34], + [-53.44162, -33.69407], + [-53.5302, -33.68836], + [-53.5199, -33.1525], + [-53.07839, -32.73589], + [-53.38738, -32.5879], + [-53.6435, -32.38518], + [-53.74512, -32.07792], + [-54.1063, -31.91137], + [-54.4558, -31.65222], + [-54.58764, -31.4562], + [-54.83551, -31.44156], + [-55.00512, -31.26858], + [-55.23652, -31.25919], + [-55.34981, -31.03823], + [-55.57847, -30.83268], + [-55.67254, -30.95701], + [-55.99045, -31.08176], + [-56.02272, -30.7855], + [-56.84739, -30.08989], + [-57.11518, -30.11366], + [-57.20444, -30.28398], + [-57.39327, -30.30591], + [-57.61162, -30.18787], + [-57.32872, -29.98349], + [-57.33078, -29.88471], + [-57.07261, -29.72563], + [-56.71349, -29.36543], + [-56.58646, -29.11558], + [-56.42235, -29.07538], + [-56.29876, -28.80437], + [-56.00625, -28.60502], + [-55.77897, -28.24452], + [-55.44457, -28.09622], + [-55.20424, -27.85912], + [-54.94194, -27.77349], + [-54.9083, -27.64279], + [-54.35555, -27.46686], + [-54.01154, -27.2009], + [-53.83851, -27.1667], + [-53.67302, -26.91228], + [-53.73963, -26.64194], + [-53.64006, -26.21398], + [-53.83713, -25.97287], + [-53.89412, -25.62172], + [-54.16398, -25.54121], + [-54.42696, -25.6929], + [-54.5945, -25.592], + [-54.66866, -25.98151], + [-54.62471, -26.22199], + [-54.8156, -26.67017], + [-55.43358, -27.00286], + [-55.62722, -27.1948], + [-55.73021, -27.44431], + [-56.14495, -27.30285], + [-56.37154, -27.57525], + [-56.605, -27.42847], + [-57.0472, -27.48269], + [-57.59926, -27.38458], + [-57.99134, -27.2644], + [-58.60589, -27.29735], + [-58.63953, -27.1166], + [-58.31818, -26.84552], + [-58.19184, -26.63948], + [-58.22342, -26.40479], + [-58.08884, -26.11352], + [-57.94877, -26.06727], + [-57.82723, -25.75971], + [-57.55944, -25.4563], + [-57.86019, -25.08498], + [-58.22617, -24.92754], + [-58.67318, -24.83037], + [-59.35296, -24.47965], + [-59.47378, -24.33426], + [-60.03945, -24.01154], + [-60.37674, -24.02138], + [-60.9858, -23.81236], + [-61.08811, -23.61307], + [-61.9526, -23.04688], + [-62.19773, -22.69956], + [-62.23755, -22.54301], + [-62.63814, -22.2313], + [-62.26092, -21.05867], + [-62.26636, -20.56316], + [-61.92247, -20.08923], + [-61.73506, -19.63441], + [-60.60436, -19.45662], + [-59.9749, -19.29449], + [-59.069, -19.28766], + [-58.16386, -19.82732], + [-58.13776, -20.12236], + [-57.85924, -19.97079], + [-58.13116, -19.75845], + [-57.78332, -19.03508], + [-57.56028, -18.24145], + [-57.88344, -17.44955], + [-57.96387, -17.50067], + [-58.25501, -17.35261], + [-58.47542, -16.93268], + [-58.46306, -16.65067], + [-58.34359, -16.51741], + [-58.32299, -16.26643], + [-58.4307, -16.32267], + [-60.17368, -16.26666], + [-60.2391, -15.47452], + [-60.57498, -15.09775], + [-60.24507, -15.09718], + [-60.27215, -14.6203], + [-60.45502, -14.3123], + [-60.40833, -13.94807], + [-60.52918, -13.79074], + [-61.00983, -13.50649], + [-61.86676, -13.52986], + [-62.27738, -13.15572], + [-62.75872, -13.01928], + [-63.00728, -12.83993], + [-63.15217, -12.63297], + [-63.37258, -12.65843], + [-63.78869, -12.42786], + [-63.95966, -12.52977], + [-64.40323, -12.44865], + [-64.51241, -12.22259], + [-65.0425, -11.96141], + [-65.09675, -11.70335], + [-65.26154, -11.702], + [-65.35561, -11.12586], + [-65.25124, -10.98367], + [-65.42702, -10.46419], + [-65.28763, -10.21628], + [-65.38308, -9.69146], + [-65.55268, -9.83154], + [-65.78065, -9.74019], + [-66.61972, -9.89446], + [-67.18827, -10.33789], + [-67.31942, -10.31965], + [-67.59957, -10.52495], + [-67.70875, -10.70987], + [-68.03284, -10.65521], + [-68.23609, -10.95198], + [-68.71674, -11.14674], + [-68.90694, -11.02074], + [-69.4233, -10.92569], + [-69.73916, -10.97221], + [-69.95476, -10.92771], + [-70.19989, -11.05443], + [-70.62087, -10.9999], + [-70.62149, -9.82681], + [-70.52605, -9.71515], + [-70.56382, -9.43078], + [-71.22231, -9.96953], + [-71.37627, -10.00018], + [-72.18052, -10.00043], + [-72.1534, -9.79568], + [-72.28249, -9.54185], + [-72.71614, -9.41163], + [-73.20057, -9.41165], + [-72.95952, -9.14549], + [-72.94304, -8.98208], + [-73.331, -8.47374], + [-73.54248, -8.34671], + [-73.6393, -8.00688], + [-73.77251, -7.9076], + [-73.71483, -7.74093], + [-73.98262, -7.53473], + [-73.69561, -7.29982], + [-73.79792, -7.11452], + [-73.63862, -6.75667], + [-73.11127, -6.45383], + [-73.25135, -6.12759], + [-73.15522, -5.87356], + [-72.96433, -5.65836], + [-72.88949, -5.16207], + [-72.48505, -4.95278], + [-71.78742, -4.48197], + [-71.59379, -4.52578], + [-71.2642, -4.38339], + [-70.93255, -4.37859], + [-70.75402, -4.15605], + [-70.2871, -4.17044], + [-70.20264, -4.35532], + [-69.94733, -4.22711], + [-69.93334, -4.21972], + [-69.45482, -1.51313], + [-69.42027, -1.01218], + [-69.62326, -0.74109], + [-69.60749, -0.5038], + [-69.91984, -0.32609], + [-70.0437, -0.12525], + [-70.0437, 0.56328], + [-69.59992, 0.65081], + [-69.47878, 0.73487], + [-69.35403, 0.61442], + [-69.11504, 0.64158], + [-69.13887, 0.88146], + [-69.32102, 1.08856], + [-69.84584, 1.07638], + [-69.84584, 1.71358], + [-68.16254, 1.7275], + [-68.28552, 1.84451], + [-68.14485, 1.97192], + [-67.92187, 1.82134], + [-67.77341, 2.03538], + [-67.36491, 2.22062], + [-67.34913, 1.99804], + [-67.14596, 1.77885], + [-67.08966, 1.16754], + [-66.84456, 1.22755], + [-66.3105, 0.74478], + [-66.07654, 0.76279], + [-65.63206, 1.01144], + [-65.44475, 0.69232], + [-65.32725, 0.93504], + [-65.21274, 0.90154], + [-65.15097, 1.1083], + [-65.01126, 1.11017], + [-64.80153, 1.31345], + [-64.7573, 1.22697], + [-64.52834, 1.44441], + [-64.4108, 1.40457], + [-64.11166, 1.59238], + [-64.06274, 1.91532], + [-63.61685, 2.1172], + [-63.40134, 2.15188], + [-63.37355, 2.41015], + [-64.05846, 2.50579], + [-63.98418, 2.68728], + [-64.16633, 3.07062], + [-64.24437, 3.43292], + [-64.18465, 3.58896], + [-64.47986, 3.79313], + [-64.80449, 4.17692], + [-64.78712, 4.28834], + [-64.55578, 4.10447], + [-64.15781, 4.13531], + [-63.96291, 3.87064], + [-63.71313, 3.90317], + [-63.67822, 4.02006], + [-63.51236, 3.84853], + [-63.4522, 3.95614], + [-63.204, 3.95181], + [-63.20666, 3.81081], + [-62.96027, 3.60874], + [-62.83555, 3.73617], + [-62.73161, 4.0416], + [-62.55147, 4.02005], + [-62.3895, 4.18058], + [-62.11028, 4.09203], + [-61.98024, 4.18472], + [-61.54775, 4.26146], + [-61.32972, 4.52671], + [-60.99367, 4.52051], + [-60.89994, 4.7198], + [-60.58755, 4.95349], + [-60.68815, 5.22845], + [-60.43897, 5.17698], + [-60.20736, 5.27383], + [-59.96894, 5.07296], + [-60.02431, 4.70395], + [-60.15955, 4.51462], + [-59.96893, 4.50827], + [-59.67578, 4.34475], + [-59.718, 4.16572], + [-59.51498, 3.94539], + [-59.6673, 3.70641], + [-59.86951, 3.56025], + [-59.80199, 3.35779], + [-59.95362, 3.08381], + [-59.99471, 2.7022], + [-59.89674, 2.36031], + [-59.7195, 2.23639], + [-59.75226, 1.85898], + [-59.5331, 1.71668], + [-59.27991, 1.40418], + [-58.92108, 1.31007], + [-58.85668, 1.17447], + [-58.71225, 1.28453], + [-58.5032, 1.26338], + [-58.37964, 1.54317], + [-58.0028, 1.51259], + [-57.74421, 1.70827], + [-57.53087, 1.70375], + [-57.32964, 1.97995], + [-57.07763, 2.00084], + [-56.79557, 1.84933], + [-56.48104, 1.94847], + [-55.99661, 1.83789], + [-55.90428, 2.0349], + [-56.04446, 2.22931], + [-55.94591, 2.53261], + [-55.72006, 2.40522], + [-55.38266, 2.40894], + [-55.31506, 2.5236], + [-54.96545, 2.55985], + [-54.69276, 2.32445], + [-54.11715, 2.10332], + [-53.93272, 2.27725], + [-53.47806, 2.25622], + [-53.32912, 2.34561], + [-53.28179, 2.19074], + [-52.92961, 2.17035], + [-52.65381, 2.38668], + [-52.3268, 3.07565], + [-51.91449, 3.7863], + [-51.61955, 4.15839], + [-51.66667, 4.45833], + [-51.66667, 5], + [-26, 5] + ] + ] + }, + "properties": { "cqzone": "11" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "12": { + "mh": [ + "DA01", + "DA02", + "DA03", + "DA04", + "DA05", + "DA06", + "DA07", + "DA08", + "DA09", + "DA11", + "DA12", + "DA13", + "DA14", + "DA15", + "DA16", + "DA17", + "DA18", + "DA19", + "DA21", + "DA22", + "DA23", + "DA24", + "DA25", + "DA26", + "DA27", + "DA28", + "DA29", + "DA31", + "DA32", + "DA33", + "DA34", + "DA35", + "DA36", + "DA37", + "DA38", + "DA39", + "DA41", + "DA42", + "DA43", + "DA44", + "DA45", + "DA46", + "DA47", + "DA48", + "DA49", + "DA51", + "DA52", + "DA53", + "DA54", + "DA55", + "DA56", + "DA57", + "DA58", + "DA59", + "DA61", + "DA62", + "DA63", + "DA64", + "DA65", + "DA66", + "DA67", + "DA68", + "DA69", + "DA71", + "DA72", + "DA73", + "DA74", + "DA75", + "DA76", + "DA77", + "DA78", + "DA79", + "DA81", + "DA82", + "DA83", + "DA84", + "DA85", + "DA86", + "DA87", + "DA88", + "DA89", + "DA91", + "DA92", + "DA93", + "DA94", + "DA95", + "DA96", + "DA97", + "DA98", + "DA99", + "DB00", + "DB01", + "DB02", + "DB03", + "DB04", + "DB05", + "DB10", + "DB11", + "DB12", + "DB13", + "DB14", + "DB15", + "DB20", + "DB21", + "DB22", + "DB23", + "DB24", + "DB25", + "DB30", + "DB31", + "DB32", + "DB33", + "DB34", + "DB35", + "DB40", + "DB41", + "DB42", + "DB43", + "DB44", + "DB50", + "DB51", + "DB52", + "DB53", + "DB54", + "DB60", + "DB61", + "DB62", + "DB63", + "DB64", + "DB70", + "DB71", + "DB72", + "DB73", + "DB74", + "DB80", + "DB81", + "DB82", + "DB83", + "DB84", + "DB86", + "DB90", + "DB91", + "DB92", + "DB93", + "DB94", + "DB96", + "EA01", + "EA02", + "EA03", + "EA04", + "EA05", + "EA06", + "EA07", + "EA08", + "EA09", + "EA11", + "EA12", + "EA13", + "EA14", + "EA15", + "EA16", + "EA17", + "EA18", + "EA19", + "EA21", + "EA22", + "EA23", + "EA24", + "EA25", + "EA26", + "EA27", + "EA28", + "EA29", + "EA31", + "EA32", + "EA33", + "EA34", + "EA35", + "EA36", + "EA37", + "EA38", + "EA39", + "EA41", + "EA42", + "EA43", + "EA44", + "EA45", + "EA46", + "EA47", + "EA48", + "EA49", + "EA51", + "EA52", + "EA53", + "EA54", + "EA55", + "EA56", + "EA57", + "EA58", + "EA59", + "EA61", + "EA62", + "EA63", + "EA64", + "EA65", + "EA66", + "EA67", + "EA68", + "EA69", + "EA71", + "EA72", + "EA73", + "EA74", + "EA75", + "EA76", + "EA77", + "EA78", + "EA79", + "EA81", + "EA82", + "EA83", + "EA84", + "EA85", + "EA86", + "EA87", + "EA88", + "EA89", + "EA91", + "EA92", + "EA93", + "EA94", + "EA95", + "EA96", + "EA97", + "EA98", + "EA99", + "EB00", + "EB01", + "EB02", + "EB03", + "EB04", + "EB05", + "EB06", + "EB10", + "EB11", + "EB12", + "EB13", + "EB14", + "EB15", + "EB20", + "EB21", + "EB22", + "EB23", + "EB24", + "EB25", + "EB26", + "EB30", + "EB31", + "EB32", + "EB33", + "EB34", + "EB35", + "EB36", + "EB40", + "EB41", + "EB42", + "EB43", + "EB44", + "EB45", + "EB46", + "EB50", + "EB51", + "EB52", + "EB53", + "EB54", + "EB55", + "EB56", + "EB60", + "EB61", + "EB62", + "EB63", + "EB64", + "EB65", + "EB66", + "EB70", + "EB71", + "EB72", + "EB73", + "EB74", + "EB75", + "EB76", + "EB80", + "EB81", + "EB82", + "EB83", + "EB84", + "EB85", + "EB90", + "EB91", + "EB92", + "EB93", + "EB94", + "EB95", + "FA01", + "FA02", + "FA03", + "FA04", + "FA05", + "FA06", + "FA07", + "FA08", + "FA09", + "FA11", + "FA12", + "FA13", + "FA14", + "FA15", + "FA16", + "FA17", + "FA18", + "FA19", + "FA21", + "FA22", + "FA23", + "FA24", + "FA25", + "FA26", + "FA27", + "FA28", + "FA29", + "FA31", + "FA32", + "FA33", + "FA34", + "FA35", + "FA36", + "FA37", + "FA38", + "FA39", + "FA41", + "FA42", + "FA43", + "FA44", + "FA45", + "FA46", + "FA47", + "FA48", + "FB00", + "FB01", + "FB02", + "FB03", + "FB04", + "FB05", + "FB06", + "FB10", + "FB12", + "FB13", + "FB14", + "FB15", + "FB22", + "FB23", + "FB24", + "FB25", + "FB33", + "FB34", + "FB35", + "FB36", + "FB38", + "FB43", + "FB44", + "FB45", + "FB46", + "FB48", + "FB49", + "FC40", + "FD28", + "FD29", + "FD36", + "FD37", + "FD38", + "FD45", + "FD46", + "FD47", + "FD54", + "FD55", + "FD56", + "FE20", + "FE21", + "FE23", + "FE31", + "FE32", + "FE33", + "FE34", + "FE35", + "FE38", + "FE39", + "FF30", + "FF31", + "FF32", + "FF41", + "FF43", + "FF44", + "FF45", + "FF46", + "FF47", + "FF48", + "FF49", + "FG40", + "FG41", + "FG52", + "FG53", + "FG54", + "FG55", + "FG56", + "FG57", + "FG58", + "FG59", + "FH50", + "FF06", + "CA91", + "CA92", + "CA93", + "DB26", + "DB36", + "DB45", + "DB55", + "DB75", + "DB85", + "DB87", + "DB88", + "DB95", + "DB97", + "DB98", + "EB07", + "EB08", + "EB16", + "EB86", + "EB96", + "FA49", + "FB11", + "FB16", + "FB21", + "FB26", + "FB27", + "FB28", + "FB31", + "FB32", + "FB37", + "FB47", + "FD27", + "FD35", + "FD39", + "FD44", + "FD48", + "FD57", + "FD64", + "FD65", + "FE22", + "FE24", + "FE25", + "FE26", + "FE27", + "FE28", + "FE30", + "FE36", + "FE37", + "FE42", + "FE43", + "FE44", + "FE45", + "FE46", + "FE47", + "FE48", + "FE49", + "FF33", + "FF34", + "FF35", + "FF40", + "FF42", + "FF55", + "FF56", + "FF59", + "FG42", + "FG43", + "FG44", + "FG45", + "FG46", + "FG47", + "FG48", + "FG49", + "FG50", + "FG51", + "FG65", + "FG66", + "FG67", + "FH40", + "FH41", + "FH51", + "FC41", + "FC30", + "FC20", + "FB29", + "FB39", + "FB19", + "EC41", + "EB17", + "EB18", + "EB47", + "EB57", + "DB16", + "DB06", + "EF96", + "EG93", + "FG03", + "FH52", + "DG53", + "DG52", + "FB57", + "FB58", + "FB59", + "FC50", + "EB27", + "EB37", + "DB76", + "DB77", + "FB18", + "FD26" + ], + "worked": false, + "confirmed": false, + "name": "Southwest Zone of South America", + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-120, -20], + [-72, -20], + [-70.37988, -18.35], + [-69.96728, -18.2626], + [-69.75081, -17.94705], + [-69.8252, -17.70543], + [-69.46845, -17.49833], + [-69.2808, -17.97042], + [-69.05079, -18.05608], + [-68.95019, -18.93602], + [-68.40459, -19.41598], + [-68.68226, -19.71791], + [-68.52802, -19.84543], + [-68.56668, -20.05002], + [-68.76225, -20.07814], + [-68.67134, -20.35426], + [-68.73899, -20.4558], + [-68.43823, -20.64318], + [-68.55445, -20.728], + [-68.17899, -21.30207], + [-68.1807, -21.60437], + [-67.96428, -22.05376], + [-67.86283, -22.59898], + [-67.88275, -22.8341], + [-67.56698, -22.89786], + [-67.19382, -22.81702], + [-67.18327, -22.81441], + [-66.99051, -23.00012], + [-67.32285, -24.03393], + [-68.24742, -24.39636], + [-68.38715, -24.48528], + [-68.56774, -24.7936], + [-68.34458, -25.11048], + [-68.4565, -25.12478], + [-68.59109, -25.41475], + [-68.47847, -25.70589], + [-68.38097, -26.17701], + [-68.55744, -26.28726], + [-68.58628, -26.49332], + [-68.26355, -26.91901], + [-68.57254, -27.17831], + [-68.79021, -27.10315], + [-68.94127, -27.51924], + [-69.05388, -27.62028], + [-69.11912, -27.89553], + [-69.3924, -28.22213], + [-69.6238, -28.37751], + [-69.7268, -28.67011], + [-69.79203, -29.13477], + [-70.01931, -29.32173], + [-69.88747, -29.90376], + [-69.96232, -30.0691], + [-69.80919, -30.15344], + [-69.8964, -30.35451], + [-70.1175, -30.43092], + [-70.23972, -30.61546], + [-70.40726, -31.16581], + [-70.51644, -31.16229], + [-70.56725, -31.59901], + [-70.46082, -31.84374], + [-70.21088, -31.9778], + [-70.38872, -32.04476], + [-70.31937, -32.27146], + [-70.12162, -32.53524], + [-70.14702, -32.72838], + [-69.98909, -32.8992], + [-70.08248, -33.02939], + [-70.00146, -33.3225], + [-69.80027, -33.28807], + [-69.90601, -33.9633], + [-69.80164, -34.24417], + [-70.03235, -34.28843], + [-70.0145, -34.41258], + [-70.21775, -34.61118], + [-70.37774, -35.04855], + [-70.5439, -35.20243], + [-70.44777, -35.31457], + [-70.41756, -35.6294], + [-70.3125, -35.81392], + [-70.42168, -35.87626], + [-70.42168, -36.15729], + [-70.70733, -36.27196], + [-70.69085, -36.40968], + [-71.03898, -36.47597], + [-71.16806, -36.99762], + [-71.09185, -37.1127], + [-71.22094, -37.27296], + [-71.12, -37.45906], + [-71.20926, -37.69958], + [-70.98885, -38.11079], + [-70.98542, -38.42939], + [-70.8371, -38.55139], + [-70.92568, -38.7648], + [-71.09597, -38.75462], + [-71.44066, -38.93752], + [-71.3974, -39.34227], + [-71.67893, -39.56442], + [-71.68374, -39.85494], + [-71.59379, -39.90079], + [-71.82999, -40.21507], + [-71.65558, -40.36329], + [-71.81008, -40.40566], + [-71.96457, -40.7176], + [-71.819, -41.0659], + [-71.9117, -41.34125], + [-71.7936, -41.70112], + [-71.72699, -42.12319], + [-71.92612, -42.18834], + [-72.174, -42.13897], + [-72.13074, -42.38594], + [-72.02706, -42.41079], + [-72.14447, -42.89861], + [-71.76064, -43.16362], + [-71.73455, -43.31269], + [-71.93162, -43.45691], + [-71.60134, -43.69668], + [-71.76339, -43.83948], + [-71.6494, -43.94735], + [-71.77918, -44.11027], + [-71.80253, -44.42005], + [-71.36582, -44.38866], + [-71.13442, -44.47104], + [-71.29235, -44.81351], + [-71.47225, -44.73698], + [-72.07581, -44.77989], + [-72.03255, -44.90404], + [-71.55945, -44.97646], + [-71.32462, -45.30581], + [-71.53817, -45.40087], + [-71.46882, -45.49336], + [-71.79841, -45.62413], + [-71.76476, -45.84937], + [-71.6185, -45.9459], + [-71.77781, -46.19742], + [-71.64872, -46.68902], + [-71.95977, -46.81792], + [-71.86776, -47.23449], + [-72.3436, -47.45503], + [-72.2921, -47.51164], + [-72.51938, -47.94671], + [-72.22962, -48.31928], + [-72.44317, -48.51297], + [-72.58873, -48.48749], + [-72.52488, -48.79059], + [-72.79541, -48.9694], + [-72.9245, -48.93468], + [-73.55828, -49.94813], + [-73.33237, -50.57016], + [-73.06801, -50.78901], + [-72.72606, -50.61419], + [-72.2873, -50.65991], + [-72.26601, -51.03449], + [-72.41021, -51.10741], + [-72.29622, -51.69853], + [-72.11701, -51.74022], + [-71.91695, -51.99981], + [-69.99536, -52.00079], + [-69.48638, -52.15172], + [-69.19061, -52.15056], + [-68.83836, -52.27772], + [-68.41882, -52.33241], + [-68.60623, -52.62036], + [-68.60691, -54.91389], + [-67.98409, -54.87306], + [-67.12647, -54.92241], + [-66.82709, -54.99023], + [-66.67603, -55.11138], + [-66.38764, -55.12492], + [-66, -55.22643], + [-66, -56], + [-70, -57], + [-70, -85], + [-120, -85], + [-120, -20] + ] + ] + }, + "properties": { "cqzone": "12" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "13": { + "mh": [ + "FA51", + "FA52", + "FA53", + "FA54", + "FA55", + "FA56", + "FA57", + "FA58", + "FA61", + "FA62", + "FA63", + "FA64", + "FA65", + "FA66", + "FA67", + "FA68", + "FA71", + "FA72", + "FA73", + "FA74", + "FA75", + "FA76", + "FA77", + "FA79", + "FA81", + "FA82", + "FA83", + "FA84", + "FA85", + "FA86", + "FA87", + "FA89", + "FA91", + "FA92", + "FA93", + "FA94", + "FA95", + "FA96", + "FA97", + "FA99", + "FB54", + "FB55", + "FB56", + "FB64", + "FB65", + "FB66", + "FB67", + "FB68", + "FB69", + "FB75", + "FB76", + "FB77", + "FB78", + "FB79", + "FB85", + "FB86", + "FB87", + "FB88", + "FB89", + "FB96", + "FC60", + "FC61", + "FC62", + "FC70", + "FC73", + "FC80", + "FC84", + "FC86", + "FC97", + "GA01", + "GA02", + "GA03", + "GA04", + "GA05", + "GA06", + "GA11", + "GA12", + "GA13", + "GA14", + "GA15", + "GA16", + "GA21", + "GA22", + "GA23", + "GA24", + "GA25", + "GA26", + "GA31", + "GA32", + "GA33", + "GA34", + "GA35", + "GA36", + "GA37", + "GA39", + "GA41", + "GA42", + "GA43", + "GA44", + "GA45", + "GA46", + "GA47", + "GA49", + "GA51", + "GA52", + "GA53", + "GA54", + "GA55", + "GA56", + "GA57", + "GA59", + "GA61", + "GA62", + "GA63", + "GA64", + "GA65", + "GA66", + "GA67", + "GA69", + "GA71", + "GA72", + "GA73", + "GA74", + "GA75", + "GA76", + "GA77", + "GA81", + "GA82", + "GA83", + "GA84", + "GA85", + "GA86", + "GA87", + "GA91", + "GA92", + "GA93", + "GA94", + "GA95", + "GA96", + "GA97", + "GA98", + "GB50", + "GB51", + "GB60", + "GB61", + "GB70", + "GC07", + "HA01", + "HA02", + "HA03", + "HA04", + "HA05", + "HA06", + "HA07", + "HA08", + "HA11", + "HA12", + "HA13", + "HA14", + "HA15", + "HA16", + "HA17", + "HA18", + "HA21", + "HA22", + "HA23", + "HA24", + "HA25", + "HA26", + "HA27", + "HA28", + "HA31", + "HA32", + "HA33", + "HA34", + "HA35", + "HA36", + "HA37", + "HA38", + "HA41", + "HA42", + "HA43", + "HA44", + "HA45", + "HA46", + "HA47", + "HA48", + "HA51", + "HA52", + "HA53", + "HA54", + "HA55", + "HA56", + "HA57", + "HA58", + "HA59", + "HA61", + "HA62", + "HA63", + "HA64", + "HA65", + "HA66", + "HA67", + "HA68", + "HA69", + "HB21", + "HB31", + "HB41", + "HB42", + "HB50", + "HB51", + "HB52", + "HB60", + "HB61", + "HB62", + "HB63", + "GC79", + "FD39", + "FD48", + "FD49", + "FD58", + "FD59", + "FD65", + "FE30", + "FE40", + "FE41", + "FE42", + "FE43", + "FE44", + "FE45", + "FE46", + "FE47", + "FE48", + "FE49", + "FE50", + "FE51", + "FE52", + "FE53", + "FE54", + "FE55", + "FE56", + "FE57", + "FE58", + "FE59", + "FE61", + "FE62", + "FE65", + "FE66", + "FE67", + "FE68", + "FE69", + "FE77", + "FE79", + "FE89", + "FF40", + "FF42", + "FF50", + "FF51", + "FF52", + "FF53", + "FF54", + "FF55", + "FF56", + "FF57", + "FF58", + "FF59", + "FF60", + "FF61", + "FF62", + "FF63", + "FF64", + "FF65", + "FF66", + "FF67", + "FF68", + "FF69", + "FF70", + "FF71", + "FF72", + "FF73", + "FF74", + "FF75", + "FF76", + "FF77", + "FF78", + "FF79", + "FF80", + "FF81", + "FF82", + "FF83", + "FF84", + "FF85", + "FF86", + "FF87", + "FF88", + "FF89", + "FF91", + "FF92", + "FF93", + "FF94", + "FF95", + "FF96", + "FF97", + "FF98", + "FF99", + "FG50", + "FG51", + "FG60", + "FG61", + "FG62", + "FG63", + "FG64", + "FG65", + "FG66", + "FG70", + "FG71", + "FG72", + "FG73", + "FG74", + "FG75", + "FG76", + "FG77", + "FG80", + "FG81", + "FG82", + "FG83", + "FG84", + "FG85", + "FG86", + "FG87", + "FG90", + "FG91", + "FG92", + "FG93", + "FG94", + "FG95", + "GF01", + "GF02", + "GF03", + "GF04", + "GF05", + "GF06", + "GF07", + "GF08", + "GF09", + "GF13", + "GF18", + "GF19", + "GG00", + "GG01", + "GG02", + "GG03", + "GG04", + "GG10", + "GG11", + "GG12", + "GG22", + "GD08", + "GF16", + "GF17", + "GF25", + "GF26", + "GF27", + "GF28", + "HD15", + "HD60", + "HD62", + "HD63", + "FA41", + "FA42", + "FA43", + "FA78", + "FA88", + "FA98", + "FB53", + "FB74", + "FB84", + "FB95", + "FB97", + "FB98", + "FB99", + "FC50", + "FC63", + "FC71", + "FC72", + "FC74", + "FC81", + "FC83", + "FC87", + "FC95", + "FC96", + "GA07", + "GA09", + "GA17", + "GA27", + "GA48", + "GA58", + "GA68", + "GA78", + "GA79", + "GA88", + "GA89", + "GB30", + "GB40", + "GB41", + "GB71", + "GB80", + "GC05", + "GC06", + "GC08", + "GC17", + "GC18", + "HA29", + "HA39", + "HA49", + "HB20", + "HB22", + "HB30", + "HB32", + "HB40", + "HB53", + "FB90", + "FD38", + "FD55", + "FD56", + "FD57", + "FD64", + "FD66", + "FD74", + "FD75", + "FE31", + "FE32", + "FE60", + "FE63", + "FE64", + "FE71", + "FE72", + "FE74", + "FE75", + "FE76", + "FE78", + "FE88", + "FF41", + "FF43", + "FF44", + "FF45", + "FF46", + "FF47", + "FF48", + "FF49", + "FG52", + "FG53", + "FG54", + "FG55", + "FG67", + "FG68", + "FG78", + "FG96", + "FG97", + "GF11", + "GF12", + "GF14", + "GF15", + "GG05", + "GG13", + "GG14", + "GG21", + "GG23", + "GG24", + "GG32", + "GG33", + "GG34", + "GF35", + "GF36", + "GF37", + "GF38", + "GF29", + "HD25", + "HD16", + "HD06", + "HD05", + "HD61", + "FD47", + "FD98", + "FD97", + "GD07", + "HD24", + "HD14", + "HD53", + "HD71", + "GC69", + "GC15", + "HB10", + "FA59", + "FA69", + "FB60", + "FB70", + "FB50", + "FB51", + "FB61", + "GB72", + "GB62", + "GB52", + "HB43", + "GC26", + "GC16", + "GC28", + "FC52", + "FC53", + "FC64", + "FC85", + "FC75", + "FC90", + "FC91", + "FC93", + "FC94", + "GC04", + "GD18", + "FD99", + "FD85", + "FE87", + "GC38" + ], + "worked": false, + "confirmed": false, + "name": "Southeast Zone of South America", + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-70, -85], + [-70, -57], + [-66, -56], + [-66, -55.22643], + [-66.38764, -55.12492], + [-66.67603, -55.11138], + [-66.82709, -54.99023], + [-67.12647, -54.92241], + [-67.98409, -54.87306], + [-68.60691, -54.91389], + [-68.60623, -52.62036], + [-68.41882, -52.33241], + [-68.83836, -52.27772], + [-69.19061, -52.15056], + [-69.48638, -52.15172], + [-69.99536, -52.00079], + [-71.91695, -51.99981], + [-72.11701, -51.74022], + [-72.29622, -51.69853], + [-72.41021, -51.10741], + [-72.26601, -51.03449], + [-72.2873, -50.65991], + [-72.72606, -50.61419], + [-73.06801, -50.78901], + [-73.33237, -50.57016], + [-73.55828, -49.94813], + [-72.9245, -48.93468], + [-72.79541, -48.9694], + [-72.52488, -48.79059], + [-72.58873, -48.48749], + [-72.44317, -48.51297], + [-72.22962, -48.31928], + [-72.51938, -47.94671], + [-72.2921, -47.51164], + [-72.3436, -47.45503], + [-71.86776, -47.23449], + [-71.95977, -46.81792], + [-71.64872, -46.68902], + [-71.77781, -46.19742], + [-71.6185, -45.9459], + [-71.76476, -45.84937], + [-71.79841, -45.62413], + [-71.46882, -45.49336], + [-71.53817, -45.40087], + [-71.32462, -45.30581], + [-71.55945, -44.97646], + [-72.03255, -44.90404], + [-72.07581, -44.77989], + [-71.47225, -44.73698], + [-71.29235, -44.81351], + [-71.13442, -44.47104], + [-71.36582, -44.38866], + [-71.80253, -44.42005], + [-71.77918, -44.11027], + [-71.6494, -43.94735], + [-71.76339, -43.83948], + [-71.60134, -43.69668], + [-71.93162, -43.45691], + [-71.73455, -43.31269], + [-71.76064, -43.16362], + [-72.14447, -42.89861], + [-72.02706, -42.41079], + [-72.13074, -42.38594], + [-72.174, -42.13897], + [-71.92612, -42.18834], + [-71.72699, -42.12319], + [-71.7936, -41.70112], + [-71.9117, -41.34125], + [-71.819, -41.0659], + [-71.96457, -40.7176], + [-71.81008, -40.40566], + [-71.65558, -40.36329], + [-71.82999, -40.21507], + [-71.59379, -39.90079], + [-71.68374, -39.85494], + [-71.67893, -39.56442], + [-71.3974, -39.34227], + [-71.44066, -38.93752], + [-71.09597, -38.75462], + [-70.92568, -38.7648], + [-70.8371, -38.55139], + [-70.98542, -38.42939], + [-70.98885, -38.11079], + [-71.20926, -37.69958], + [-71.12, -37.45906], + [-71.22094, -37.27296], + [-71.09185, -37.1127], + [-71.16806, -36.99762], + [-71.03898, -36.47597], + [-70.69085, -36.40968], + [-70.70733, -36.27196], + [-70.42168, -36.15729], + [-70.42168, -35.87626], + [-70.3125, -35.81392], + [-70.41756, -35.6294], + [-70.44777, -35.31457], + [-70.5439, -35.20243], + [-70.37774, -35.04855], + [-70.21775, -34.61118], + [-70.0145, -34.41258], + [-70.03235, -34.28843], + [-69.80164, -34.24417], + [-69.90601, -33.9633], + [-69.80027, -33.28807], + [-70.00146, -33.3225], + [-70.08248, -33.02939], + [-69.98909, -32.8992], + [-70.14702, -32.72838], + [-70.12162, -32.53524], + [-70.31937, -32.27146], + [-70.38872, -32.04476], + [-70.21088, -31.9778], + [-70.46082, -31.84374], + [-70.56725, -31.59901], + [-70.51644, -31.16229], + [-70.40726, -31.16581], + [-70.23972, -30.61546], + [-70.1175, -30.43092], + [-69.8964, -30.35451], + [-69.80919, -30.15344], + [-69.96232, -30.0691], + [-69.88747, -29.90376], + [-70.01931, -29.32173], + [-69.79203, -29.13477], + [-69.7268, -28.67011], + [-69.6238, -28.37751], + [-69.3924, -28.22213], + [-69.11912, -27.89553], + [-69.05388, -27.62028], + [-68.94127, -27.51924], + [-68.79021, -27.10315], + [-68.57254, -27.17831], + [-68.26355, -26.91901], + [-68.58628, -26.49332], + [-68.55744, -26.28726], + [-68.38097, -26.17701], + [-68.47847, -25.70589], + [-68.59109, -25.41475], + [-68.4565, -25.12478], + [-68.34458, -25.11048], + [-68.56774, -24.7936], + [-68.38715, -24.48528], + [-68.24742, -24.39636], + [-67.32285, -24.03393], + [-66.99051, -23.00012], + [-67.18327, -22.81441], + [-67.1807, -22.8138], + [-67.02716, -22.54079], + [-66.78242, -22.43809], + [-66.73918, -22.2384], + [-66.28808, -22.08755], + [-66.24344, -21.79202], + [-66.0763, -21.83496], + [-65.74975, -22.10918], + [-64.99338, -22.08242], + [-64.63875, -22.19313], + [-64.40941, -22.55822], + [-64.32427, -22.85087], + [-64.19999, -22.51573], + [-63.93142, -21.99935], + [-62.81339, -21.99875], + [-62.80884, -22.14226], + [-62.63814, -22.2313], + [-62.23755, -22.54301], + [-62.19773, -22.69956], + [-61.9526, -23.04688], + [-61.08811, -23.61307], + [-60.9858, -23.81236], + [-60.37674, -24.02138], + [-60.03945, -24.01154], + [-59.47378, -24.33426], + [-59.35296, -24.47965], + [-58.67318, -24.83037], + [-58.22617, -24.92754], + [-57.86019, -25.08498], + [-57.55944, -25.4563], + [-57.82723, -25.75971], + [-57.94877, -26.06727], + [-58.08884, -26.11352], + [-58.22342, -26.40479], + [-58.19184, -26.63948], + [-58.31818, -26.84552], + [-58.63953, -27.1166], + [-58.60589, -27.29735], + [-57.99134, -27.2644], + [-57.59926, -27.38458], + [-57.0472, -27.48269], + [-56.605, -27.42847], + [-56.37154, -27.57525], + [-56.14495, -27.30285], + [-55.73021, -27.44431], + [-55.62722, -27.1948], + [-55.43358, -27.00286], + [-54.8156, -26.67017], + [-54.62471, -26.22199], + [-54.66866, -25.98151], + [-54.5945, -25.592], + [-54.42696, -25.6929], + [-54.16398, -25.54121], + [-53.89412, -25.62172], + [-53.83713, -25.97287], + [-53.64006, -26.21398], + [-53.73963, -26.64194], + [-53.67302, -26.91228], + [-53.83851, -27.1667], + [-54.01154, -27.2009], + [-54.35555, -27.46686], + [-54.9083, -27.64279], + [-54.94194, -27.77349], + [-55.20424, -27.85912], + [-55.44457, -28.09622], + [-55.77897, -28.24452], + [-56.00625, -28.60502], + [-56.29876, -28.80437], + [-56.42235, -29.07538], + [-56.58646, -29.11558], + [-56.71349, -29.36543], + [-57.07261, -29.72563], + [-57.33078, -29.88471], + [-57.32872, -29.98349], + [-57.61162, -30.18787], + [-57.39327, -30.30591], + [-57.20444, -30.28398], + [-57.11518, -30.11366], + [-56.84739, -30.08989], + [-56.02272, -30.7855], + [-55.99045, -31.08176], + [-55.67254, -30.95701], + [-55.57847, -30.83268], + [-55.34981, -31.03823], + [-55.23652, -31.25919], + [-55.00512, -31.26858], + [-54.83551, -31.44156], + [-54.58764, -31.4562], + [-54.4558, -31.65222], + [-54.1063, -31.91137], + [-53.74512, -32.07792], + [-53.6435, -32.38518], + [-53.38738, -32.5879], + [-53.07839, -32.73589], + [-53.5199, -33.1525], + [-53.5302, -33.68836], + [-53.44162, -33.69407], + [-53, -34], + [-26, -34], + [-26, -85], + [-70, -85] + ] + ] + }, + "properties": { "cqzone": "13" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "14": { + "mh": [ + "JM19", + "JN36", + "HM49", + "HM58", + "HM68", + "HM77", + "JN02", + "JN29", + "JO10", + "JO20", + "JO21", + "JO30", + "JO44", + "JO45", + "JO46", + "JO55", + "JO65", + "JO66", + "IP61", + "IO70", + "IO81", + "IO82", + "IO83", + "IO84", + "IO85", + "IO91", + "IO92", + "IO93", + "IO94", + "JO01", + "JO02", + "IN88", + "IN92", + "IN93", + "IN94", + "IN95", + "IN96", + "IN97", + "IN98", + "JN03", + "JN04", + "JN05", + "JN06", + "JN07", + "JN08", + "JN09", + "JN13", + "JN14", + "JN15", + "JN16", + "JN17", + "JN18", + "JN19", + "JN23", + "JN24", + "JN25", + "JN26", + "JN27", + "JN28", + "JN33", + "JN37", + "JN38", + "JN39", + "JN48", + "JN49", + "JN47", + "JN58", + "JN59", + "JN68", + "JO31", + "JO32", + "JO33", + "JO40", + "JO41", + "JO42", + "JO43", + "JO50", + "JO51", + "JO52", + "JO53", + "JO61", + "JO62", + "JO63", + "IM76", + "IO52", + "IO53", + "IO62", + "IO63", + "IO64", + "JO22", + "JO38", + "JO39", + "JO49", + "JO59", + "JO69", + "JP30", + "JP31", + "JP32", + "JP40", + "JP41", + "JP42", + "JP43", + "JP50", + "JP51", + "JP52", + "JP53", + "JP54", + "JP60", + "JP61", + "JP62", + "JP63", + "JP64", + "JP65", + "JP74", + "JP75", + "JP76", + "JP77", + "JP86", + "JP87", + "JP88", + "JP98", + "JP99", + "KP08", + "KP09", + "KP19", + "KP29", + "KP49", + "KQ20", + "KQ30", + "KQ40", + "KQ50", + "IM58", + "IM59", + "IM67", + "IM68", + "IM69", + "IN60", + "IN61", + "IO78", + "IO77", + "IO87", + "IO76", + "IO86", + "IM77", + "IM78", + "IM79", + "IM87", + "IM88", + "IM89", + "IM98", + "IM99", + "IN62", + "IN63", + "IN70", + "IN71", + "IN72", + "IN73", + "IN80", + "IN81", + "IN82", + "IN90", + "IN91", + "JN01", + "JO67", + "JO68", + "JO76", + "JO77", + "JO78", + "JO79", + "JO89", + "JP70", + "JP71", + "JP72", + "JP73", + "JP80", + "JP81", + "JP82", + "JP83", + "JP84", + "JP85", + "JP93", + "JP94", + "JP95", + "JP96", + "JP97", + "KP04", + "KP05", + "KP06", + "KP07", + "KP16", + "KP17", + "JN46", + "JM09", + "JM29", + "JN10", + "JN20", + "IN89", + "IO74", + "HM59", + "HM69", + "JO11", + "JO47", + "JO54", + "JO56", + "JO57", + "JO64", + "JO75", + "IO80", + "IO90", + "IO95", + "JO00", + "JO03", + "IN69", + "IN79", + "IN77", + "IN78", + "IN86", + "IN87", + "IN99", + "JN12", + "JN34", + "JN35", + "JN57", + "JN67", + "JN69", + "JO60", + "JO70", + "JO71", + "JO72", + "JO73", + "IO51", + "IO54", + "IO61", + "IO72", + "JO23", + "JO28", + "JO29", + "JO48", + "JO58", + "JP20", + "JP21", + "JP22", + "JP33", + "JP44", + "JP55", + "JP66", + "JP78", + "JP89", + "KP18", + "KP28", + "KP39", + "KQ00", + "KQ10", + "KQ31", + "KQ41", + "JP67", + "KP59", + "IM57", + "IN50", + "IN51", + "IN52", + "IM66", + "IO88", + "IO67", + "IO66", + "IO75", + "IM86", + "IM96", + "IM97", + "IN53", + "IN83", + "JN00", + "JN11", + "JO86", + "JO87", + "JO88", + "JO99", + "JP90", + "JP92", + "KP03", + "KP15", + "JN45", + "IO73", + "IO71", + "HM76", + "HM67", + "HM78", + "IO41", + "IO42", + "IO65", + "IO55", + "IO97", + "IO89", + "IP90", + "IO68", + "IP62", + "KQ21", + "JQ90", + "JP79", + "JP68", + "JN56", + "JM08", + "JM18", + "IO99", + "IO57" + ], + "worked": false, + "confirmed": false, + "name": "Western Zone of Europe", + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-35, 36], + [-35, 56.86499], + [-14.95704, 61.77376], + [7.31083, 68.4298], + [32, 74.05376], + [32, 71], + [30.82151, 69.79125], + [30.9526, 69.63774], + [30.81939, 69.52947], + [30.5159, 69.54051], + [30.15197, 69.66925], + [30.17257, 69.53475], + [30.00091, 69.41341], + [29.29023, 69.29599], + [29.23942, 69.11365], + [28.92837, 69.05163], + [28.83155, 69.2245], + [29.33624, 69.47874], + [29.13368, 69.69548], + [28.40377, 69.81878], + [27.98355, 70.01401], + [27.95883, 70.09225], + [27.56057, 70.06464], + [27.03186, 69.91096], + [26.45851, 69.93595], + [26.36306, 69.84577], + [25.89683, 69.65995], + [25.94764, 69.57888], + [25.6929, 69.20477], + [25.77461, 69.0133], + [25.62767, 68.8937], + [25.15869, 68.80078], + [25.11131, 68.63755], + [24.85725, 68.56239], + [24.78309, 68.6368], + [24.30227, 68.71732], + [23.98315, 68.82715], + [23.67313, 68.70548], + [23.16741, 68.62867], + [23.04588, 68.68939], + [22.37434, 68.71682], + [22.17556, 68.95641], + [21.62708, 69.27658], + [21.27881, 69.31188], + [20.98757, 69.19192], + [21.05754, 69.03629], + [20.71732, 69.11979], + [20.84449, 68.93791], + [21.38969, 68.76475], + [21.42059, 68.6965], + [21.86485, 68.59073], + [22.04544, 68.47917], + [22.64282, 68.41813], + [23.05824, 68.30698], + [23.1681, 68.13399], + [23.65356, 67.95969], + [23.50868, 67.88097], + [23.54507, 67.5854], + [23.41186, 67.46808], + [23.75312, 67.43569], + [23.55125, 67.17075], + [23.99414, 66.82084], + [23.85955, 66.5611], + [23.63983, 66.42938], + [23.72772, 66.196], + [23.91929, 66.16078], + [24.15206, 65.86405], + [24.14133, 65.54837], + [20.8759, 63.38561], + [19.10591, 60.30732], + [19.99787, 57.57863], + [14.22627, 53.92886], + [14.30282, 53.55417], + [14.45114, 53.26028], + [14.3399, 53.04905], + [14.14421, 52.9627], + [14.21356, 52.81853], + [14.59945, 52.60846], + [14.53353, 52.39697], + [14.71687, 52.23579], + [14.75875, 52.06473], + [14.58915, 51.82559], + [14.75738, 51.66276], + [14.73541, 51.52626], + [14.92218, 51.48266], + [15.03753, 51.24472], + [14.80064, 50.82372], + [14.59739, 50.98739], + [14.30145, 51.0552], + [14.38728, 50.89956], + [13.88328, 50.73775], + [13.52623, 50.70428], + [13.19664, 50.50338], + [12.51274, 50.39626], + [12.19963, 50.10957], + [12.55188, 49.90746], + [12.40562, 49.76308], + [12.77916, 49.34659], + [12.95013, 49.34346], + [13.50769, 48.94279], + [13.83865, 48.77157], + [13.72741, 48.51342], + [13.52279, 48.58887], + [13.41499, 48.37814], + [12.87048, 48.20225], + [12.75375, 48.08358], + [13.00231, 47.85509], + [12.90344, 47.72546], + [13.09776, 47.63902], + [13.003, 47.46337], + [12.74551, 47.67556], + [12.51205, 47.62514], + [12.16117, 47.70052], + [12.20855, 47.61357], + [11.60705, 47.58208], + [11.28433, 47.40299], + [10.97122, 47.40113], + [10.59768, 47.57004], + [10.47546, 47.43319], + [10.23582, 47.37371], + [9.77645, 47.59505], + [9.55947, 47.53064], + [9.66384, 47.37045], + [9.53201, 47.27037], + [9.68032, 47.06263], + [10.10673, 46.83999], + [10.3862, 47.00039], + [10.48713, 46.9376], + [10.38208, 46.68618], + [10.45349, 46.53288], + [10.23857, 46.63576], + [10.04631, 46.5428], + [10.17471, 46.25679], + [9.90711, 46.38094], + [9.5327, 46.31231], + [9.46266, 46.50784], + [9.28138, 46.49614], + [9.24705, 46.23257], + [9.01634, 46.05083], + [9.02973, 45.82018], + [8.85154, 46.07561], + [8.61259, 46.12179], + [8.37158, 46.45299], + [8.07907, 46.25964], + [8.16558, 46.1822], + [7.86552, 45.91581], + [7.54554, 45.98551], + [7.18986, 45.85702], + [7.04292, 45.92202], + [6.80534, 45.81492], + [6.99966, 45.64044], + [6.99829, 45.50442], + [7.18368, 45.40809], + [7.1363, 45.25507], + [6.62475, 45.10357], + [6.75041, 44.90646], + [7.00309, 44.84077], + [6.8534, 44.5298], + [7.03743, 44.22502], + [7.42538, 44.11174], + [7.68356, 44.17432], + [7.65197, 43.97453], + [7.49473, 43.87215], + [7.53736, 43.74542], + [7, 43], + [7, 38.5], + [-5.00336, 35.99863], + [-5.58643, 35.96265], + [-6, 36], + [-35, 36] + ] + ] + }, + "properties": { "cqzone": "14" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "15": { + "mh": [ + "KP00", + "JN92", + "KN01", + "KN02", + "KO27", + "KO28", + "KO29", + "KO37", + "KO38", + "KO04", + "KO14", + "KO15", + "KO16", + "KO25", + "KO26", + "KO36", + "KO13", + "KO24", + "JN56", + "JN57", + "JN66", + "JN67", + "JN76", + "JN77", + "JN78", + "JN79", + "JN86", + "JN87", + "JN88", + "JN41", + "JN42", + "KP10", + "KP11", + "KP12", + "KP13", + "KP18", + "KP20", + "KP21", + "KP22", + "KP23", + "KP24", + "KP26", + "KP27", + "KP28", + "KP30", + "KP31", + "KP32", + "KP33", + "KP34", + "KP35", + "KP36", + "KP37", + "KP38", + "KP39", + "KP41", + "KP42", + "KP43", + "KP44", + "KP45", + "KP46", + "KP47", + "KP52", + "JN40", + "JM49", + "JN85", + "JN95", + "JN96", + "JN97", + "JN98", + "KN06", + "KN07", + "KN08", + "JN61", + "JM67", + "JM77", + "JM89", + "JN34", + "JN35", + "JN44", + "JN45", + "JN53", + "JN54", + "JN55", + "JN62", + "JN63", + "JN70", + "JN71", + "JN80", + "JN99", + "JO70", + "JO71", + "JO72", + "JO73", + "JO80", + "JO81", + "JO82", + "JO83", + "JO84", + "JO90", + "JO91", + "JO92", + "JO93", + "KN09", + "KO00", + "KO01", + "KO02", + "KO03", + "KO10", + "KO11", + "KO12", + "JN89", + "JN93", + "JN94", + "KN03", + "KN04", + "JN75", + "JN83", + "JN84", + "JN69", + "JO60", + "JP90", + "KO09", + "JM99", + "JN90", + "JN91", + "KM09", + "KN00", + "KO18", + "KO19", + "KO39", + "KO17", + "KO07", + "KO05", + "JO94", + "KO06", + "KO35", + "KO23", + "KO34", + "JN46", + "JN47", + "JN68", + "JN43", + "KP01", + "KP02", + "KP03", + "KP08", + "KP09", + "KP14", + "KP15", + "KP16", + "KP17", + "KP19", + "KP25", + "KP29", + "KP40", + "KP48", + "KP49", + "KP51", + "KP53", + "KP54", + "KP55", + "KQ30", + "KQ40", + "KN17", + "KN18", + "JM68", + "JM78", + "JM79", + "JM87", + "JM88", + "JN33", + "JN51", + "JN52", + "JN60", + "JN64", + "JN65", + "JN72", + "JN81", + "JM76", + "JM75", + "JO74", + "KN19", + "KN05", + "KN12", + "KN13", + "KN14", + "JN73", + "JN74", + "JN82", + "KN11", + "JM66", + "JM48", + "KO20", + "KO46", + "KO49", + "JO99", + "JM65", + "JM56" + ], + "worked": false, + "confirmed": false, + "name": "Central European Zone", + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [28.92837, 69.05163], + [28.41613, 68.91495], + [28.79997, 68.86945], + [28.43399, 68.53929], + [28.64685, 68.19681], + [29.32731, 68.07458], + [29.65965, 67.80327], + [30.01602, 67.67347], + [29.93019, 67.52327], + [29.07188, 66.99589], + [29.11857, 66.80191], + [29.47357, 66.5417], + [29.70909, 66.26823], + [29.92401, 66.12663], + [30.13893, 65.66874], + [29.72351, 65.63675], + [29.86427, 65.56073], + [29.6006, 65.26044], + [29.85946, 65.21586], + [29.89654, 65.10539], + [29.62669, 65.06084], + [29.7393, 64.79021], + [30.0428, 64.79343], + [30.13481, 64.64946], + [29.98924, 64.58765], + [30.04623, 64.40287], + [30.48225, 64.26249], + [30.52757, 64.04787], + [30.26115, 63.82249], + [29.9707, 63.75699], + [30.48431, 63.46646], + [30.78781, 63.40535], + [31.23962, 63.21754], + [31.26503, 63.11525], + [31.58706, 62.90835], + [31.22314, 62.49932], + [30.60241, 62.14176], + [29.50378, 61.46108], + [29.2456, 61.27089], + [28.81919, 61.12201], + [27.77137, 60.53533], + [27.58667, 60.29702], + [26.74072, 60.09498], + [27.09228, 59.77022], + [28.08586, 59.45868], + [28.13255, 59.29113], + [27.96501, 59.2736], + [27.73017, 58.97231], + [27.35801, 58.78742], + [27.55302, 58.36715], + [27.49054, 58.22281], + [27.68142, 57.92505], + [27.81463, 57.86265], + [27.49328, 57.78842], + [27.35115, 57.51914], + [27.86613, 57.29648], + [27.65945, 56.83582], + [27.84828, 56.87937], + [28.19435, 56.44162], + [28.24035, 56.27309], + [27.65327, 55.93074], + [27.61413, 55.78661], + [27.15133, 55.85257], + [26.78329, 55.67758], + [26.65214, 55.70699], + [26.43928, 55.34945], + [26.83136, 55.30648], + [26.67755, 55.16984], + [26.32392, 55.14513], + [26.20925, 54.99888], + [25.85632, 54.92793], + [25.7341, 54.80385], + [25.7492, 54.56489], + [25.52948, 54.34214], + [25.78628, 54.23473], + [25.65033, 54.13026], + [25.51506, 54.30731], + [25.26786, 54.27484], + [25.07148, 54.13307], + [24.77691, 54.10047], + [24.35257, 53.89665], + [24.2015, 53.97022], + [23.60481, 53.92253], + [23.5485, 53.76738], + [23.81835, 53.24508], + [23.93783, 52.713], + [23.46679, 52.54963], + [23.1784, 52.28454], + [23.63983, 52.08667], + [23.68789, 51.99037], + [23.53134, 51.74318], + [23.70163, 51.40477], + [23.63708, 51.32803], + [23.86711, 51.15049], + [23.9138, 51.00857], + [24.14451, 50.86967], + [23.95774, 50.79465], + [24.09919, 50.60198], + [23.99826, 50.41201], + [23.80737, 50.40589], + [23.47091, 50.21733], + [22.64076, 49.53011], + [22.74856, 49.36046], + [22.70668, 49.17586], + [22.89207, 49.0077], + [22.58171, 49.0977], + [22.38945, 48.87374], + [22.34001, 48.68416], + [22.18792, 48.60976], + [22.14191, 48.40732], + [22.48901, 48.25394], + [22.59132, 48.10789], + [22.82066, 48.1198], + [22.89688, 47.95314], + [22.68127, 47.78778], + [22.26242, 47.73054], + [22.02484, 47.52183], + [21.52908, 46.72103], + [21.31347, 46.61737], + [21.16996, 46.29713], + [20.87402, 46.28764], + [20.63095, 46.12846], + [20.26222, 46.12132], + [20.40298, 45.9626], + [20.80535, 45.7474], + [20.83007, 45.48131], + [21.09924, 45.29904], + [21.51123, 45.17429], + [21.36154, 45.02306], + [21.55929, 44.89187], + [21.36154, 44.86657], + [21.62796, 44.66083], + [21.996, 44.63348], + [22.18002, 44.48181], + [22.46841, 44.71453], + [22.76641, 44.54252], + [22.45605, 44.47691], + [22.67303, 44.28453], + [22.61947, 44.06366], + [22.41004, 44.00343], + [22.35717, 43.8105], + [22.5333, 43.47135], + [23.00502, 43.1854], + [22.74478, 42.88627], + [22.53707, 42.882], + [22.43888, 42.56572], + [22.56042, 42.48323], + [22.36679, 42.32403], + [22.50961, 42.15475], + [22.86598, 42.02277], + [23.03283, 41.7088], + [22.95112, 41.64315], + [22.93602, 41.33815], + [22.76573, 41.32526], + [22.74787, 41.16263], + [22.41622, 41.11919], + [22.0626, 41.16056], + [21.75361, 40.92544], + [21.5689, 40.86731], + [20.98388, 40.85433], + [21.05735, 40.66553], + [20.84312, 40.47933], + [20.67626, 40.09645], + [20.31234, 39.99079], + [20.41603, 39.84123], + [20.22926, 39.64905], + [19.95391, 39.68605], + [19.96902, 39.79482], + [19.75, 40], + [19, 40], + [19, 35], + [14, 35], + [13.27007, 36], + [12.24441, 37.25], + [7, 38.5], + [7, 43], + [7.53736, 43.74542], + [7.49473, 43.87215], + [7.65197, 43.97453], + [7.68356, 44.17432], + [7.42538, 44.11174], + [7.03743, 44.22502], + [6.8534, 44.5298], + [7.00309, 44.84077], + [6.75041, 44.90646], + [6.62475, 45.10357], + [7.1363, 45.25507], + [7.18368, 45.40809], + [6.99829, 45.50442], + [6.99966, 45.64044], + [6.80534, 45.81492], + [7.04292, 45.92202], + [7.18986, 45.85702], + [7.54554, 45.98551], + [7.86552, 45.91581], + [8.16558, 46.1822], + [8.07907, 46.25964], + [8.37158, 46.45299], + [8.61259, 46.12179], + [8.85154, 46.07561], + [9.02973, 45.82018], + [9.01634, 46.05083], + [9.24705, 46.23257], + [9.28138, 46.49614], + [9.46266, 46.50784], + [9.5327, 46.31231], + [9.90711, 46.38094], + [10.17471, 46.25679], + [10.04631, 46.5428], + [10.23857, 46.63576], + [10.45349, 46.53288], + [10.38208, 46.68618], + [10.48713, 46.9376], + [10.3862, 47.00039], + [10.10673, 46.83999], + [9.68032, 47.06263], + [9.53201, 47.27037], + [9.66384, 47.37045], + [9.55947, 47.53064], + [9.77645, 47.59505], + [10.23582, 47.37371], + [10.47546, 47.43319], + [10.59768, 47.57004], + [10.97122, 47.40113], + [11.28433, 47.40299], + [11.60705, 47.58208], + [12.20855, 47.61357], + [12.16117, 47.70052], + [12.51205, 47.62514], + [12.74551, 47.67556], + [13.003, 47.46337], + [13.09776, 47.63902], + [12.90344, 47.72546], + [13.00231, 47.85509], + [12.75375, 48.08358], + [12.87048, 48.20225], + [13.41499, 48.37814], + [13.52279, 48.58887], + [13.72741, 48.51342], + [13.83865, 48.77157], + [13.50769, 48.94279], + [12.95013, 49.34346], + [12.77916, 49.34659], + [12.40562, 49.76308], + [12.55188, 49.90746], + [12.19963, 50.10957], + [12.51274, 50.39626], + [13.19664, 50.50338], + [13.52623, 50.70428], + [13.88328, 50.73775], + [14.38728, 50.89956], + [14.30145, 51.0552], + [14.59739, 50.98739], + [14.80064, 50.82372], + [15.03753, 51.24472], + [14.92218, 51.48266], + [14.73541, 51.52626], + [14.75738, 51.66276], + [14.58915, 51.82559], + [14.75875, 52.06473], + [14.71687, 52.23579], + [14.53353, 52.39697], + [14.59945, 52.60846], + [14.21356, 52.81853], + [14.14421, 52.9627], + [14.3399, 53.04905], + [14.45114, 53.26028], + [14.30282, 53.55417], + [14.22627, 53.92886], + [19.99787, 57.57863], + [19.10591, 60.30732], + [20.8759, 63.38561], + [24.14133, 65.54837], + [24.15206, 65.86405], + [23.91929, 66.16078], + [23.72772, 66.196], + [23.63983, 66.42938], + [23.85955, 66.5611], + [23.99414, 66.82084], + [23.55125, 67.17075], + [23.75312, 67.43569], + [23.41186, 67.46808], + [23.54507, 67.5854], + [23.50868, 67.88097], + [23.65356, 67.95969], + [23.1681, 68.13399], + [23.05824, 68.30698], + [22.64282, 68.41813], + [22.04544, 68.47917], + [21.86485, 68.59073], + [21.42059, 68.6965], + [21.38969, 68.76475], + [20.84449, 68.93791], + [20.71732, 69.11979], + [21.05754, 69.03629], + [20.98757, 69.19192], + [21.27881, 69.31188], + [21.62708, 69.27658], + [22.17556, 68.95641], + [22.37434, 68.71682], + [23.04588, 68.68939], + [23.16741, 68.62867], + [23.67313, 68.70548], + [23.98315, 68.82715], + [24.30227, 68.71732], + [24.78309, 68.6368], + [24.85725, 68.56239], + [25.11131, 68.63755], + [25.15869, 68.80078], + [25.62767, 68.8937], + [25.77461, 69.0133], + [25.6929, 69.20477], + [25.94764, 69.57888], + [25.89683, 69.65995], + [26.36306, 69.84577], + [26.45851, 69.93595], + [27.03186, 69.91096], + [27.56057, 70.06464], + [27.95883, 70.09225], + [27.98355, 70.01401], + [28.40377, 69.81878], + [29.13368, 69.69548], + [29.33624, 69.47874], + [28.83155, 69.2245], + [28.92837, 69.05163] + ] + ] + }, + "properties": { "cqzone": "15" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "16": { + "mh": [ + "MP28", + "LO95", + "LO85", + "LO84", + "LO94", + "KO21", + "KO22", + "KO23", + "KO31", + "KO32", + "KO33", + "KO34", + "KO35", + "KO41", + "KO42", + "KO43", + "KO44", + "KO45", + "KO46", + "KO51", + "KO52", + "KO53", + "KO54", + "KO55", + "KO63", + "KN89", + "KN94", + "KN95", + "KN96", + "KN97", + "KN98", + "KN99", + "KO47", + "KO48", + "KO49", + "KO56", + "KO57", + "KO58", + "KO59", + "KO62", + "KO64", + "KO65", + "KO66", + "KO67", + "KO68", + "KO69", + "KO70", + "KO71", + "KO72", + "KO73", + "KO74", + "KO75", + "KO76", + "KO77", + "KO78", + "KO79", + "KO80", + "KO81", + "KO82", + "KO83", + "KO84", + "KO85", + "KO86", + "KO87", + "KO88", + "KO89", + "KO90", + "KO91", + "KO92", + "KO93", + "KO94", + "KO95", + "KO96", + "KO97", + "KO98", + "KO99", + "KP40", + "KP48", + "KP50", + "KP51", + "KP53", + "KP54", + "KP55", + "KP56", + "KP57", + "KP58", + "KP59", + "KP60", + "KP61", + "KP62", + "KP63", + "KP64", + "KP65", + "KP66", + "KP67", + "KP68", + "KP69", + "KP70", + "KP71", + "KP72", + "KP73", + "KP77", + "KP78", + "KP80", + "KP81", + "KP82", + "KP83", + "KP84", + "KP86", + "KP87", + "KP88", + "KP90", + "KP91", + "KP92", + "KP93", + "KP94", + "KP96", + "KP97", + "LN03", + "LN04", + "LN05", + "LN06", + "LN07", + "LN08", + "LN09", + "LN13", + "LN14", + "LN15", + "LN16", + "LN17", + "LN18", + "LN19", + "LN23", + "LN24", + "LN25", + "LN26", + "LN27", + "LN28", + "LN29", + "LN32", + "LN33", + "LN35", + "LN36", + "LN37", + "LO00", + "LO01", + "LO02", + "LO03", + "LO04", + "LO05", + "LO06", + "LO07", + "LO08", + "LO09", + "LO10", + "LO11", + "LO12", + "LO13", + "LO14", + "LO15", + "LO16", + "LO17", + "LO18", + "LO19", + "LO20", + "LO21", + "LO22", + "LO23", + "LO24", + "LO25", + "LO26", + "LO27", + "LO28", + "LO29", + "LO30", + "LO31", + "LO32", + "LO33", + "LO34", + "LO35", + "LO36", + "LO37", + "LO38", + "LO39", + "LO41", + "LO42", + "LO43", + "LO44", + "LO45", + "LO46", + "LO47", + "LO48", + "LO49", + "LO52", + "LO53", + "LO54", + "LO55", + "LO56", + "LO57", + "LO58", + "LO59", + "LO61", + "LO62", + "LO63", + "LO64", + "LO65", + "LO66", + "LO67", + "LO68", + "LO69", + "LO71", + "LO72", + "LO73", + "LO74", + "LO75", + "LO81", + "LO82", + "LO83", + "LO91", + "LP00", + "LP01", + "LP02", + "LP03", + "LP04", + "LP05", + "LP10", + "LP11", + "LP12", + "LP13", + "LP14", + "LP15", + "LP20", + "LP21", + "LP22", + "LP23", + "LP24", + "LP25", + "LP26", + "LP27", + "LP30", + "LP31", + "LP32", + "LP33", + "LP34", + "LP35", + "LP36", + "LP41", + "LP42", + "LP44", + "LP45", + "LP46", + "LP47", + "LP57", + "LP67", + "LP68", + "LP77", + "LP87", + "LP98", + "LQ61", + "LQ62", + "LQ71", + "LQ72", + "LQ73", + "LQ83", + "LQ84", + "LQ94", + "LQ95", + "KN75", + "KN76", + "KN66", + "KN65", + "MP09", + "MP19", + "MP18", + "MP08", + "MP07", + "LP97", + "MQ05", + "MQ15", + "MQ26", + "MQ36", + "KN47", + "KN48", + "KN38", + "KN46", + "KN45", + "KN18", + "KN19", + "KN28", + "KN29", + "KN39", + "KN49", + "KN57", + "KN58", + "KN59", + "KN67", + "KN68", + "KN69", + "KN77", + "KN78", + "KN79", + "KN87", + "KN88", + "KO20", + "KO30", + "KO40", + "KO50", + "KO60", + "KO61", + "MP29", + "LO86", + "LO96", + "LO93", + "LO92", + "MO01", + "KO11", + "KO12", + "KO13", + "KO24", + "KO36", + "KN84", + "KN85", + "KN86", + "KN93", + "KO37", + "KO38", + "KO39", + "KP41", + "KP44", + "KP45", + "KP46", + "KP47", + "KP49", + "KP52", + "KP74", + "KP75", + "KP76", + "KP79", + "KP89", + "KP98", + "LN12", + "LN22", + "LN31", + "LN34", + "LN38", + "LN39", + "LN41", + "LN42", + "LN45", + "LN46", + "LN47", + "LO40", + "LO51", + "LO70", + "LO76", + "LO77", + "LO78", + "LO80", + "LO90", + "LP06", + "LP07", + "LP08", + "LP16", + "LP28", + "LP37", + "LP38", + "LP40", + "LP50", + "LP56", + "LP58", + "LP60", + "LP78", + "LP88", + "LQ51", + "LQ52", + "LQ60", + "LQ63", + "LQ70", + "LQ74", + "LQ75", + "LQ80", + "LQ81", + "LQ82", + "LQ85", + "LQ93", + "MO00", + "KN74", + "KN64", + "MP17", + "MQ04", + "LQ96", + "MQ06", + "MQ16", + "MQ25", + "MQ35", + "KN37", + "KN17", + "KN27", + "KN55", + "KN56", + "KO10", + "LP48", + "LP49", + "LP59", + "MQ46", + "LP99", + "LQ90", + "MQ00", + "LP18", + "LP17", + "KP95", + "KP85", + "MQ37", + "MQ47", + "LP79", + "LP69", + "LP89" + ], + "worked": false, + "confirmed": false, + "name": "Eastern Zone of Europe", + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [70, 80], + [70, 76], + [65.1318, 69.33869], + [65.03082, 69.19355], + [64.75341, 69.12564], + [64.53094, 68.9749], + [64.56733, 68.86599], + [64.80285, 68.88084], + [65.40092, 68.78637], + [65.44692, 68.6453], + [65.67421, 68.57167], + [65.51696, 68.431], + [64.68887, 68.38881], + [64.58793, 68.19987], + [63.88412, 68.03121], + [63.96926, 67.89053], + [63.72619, 67.73391], + [63.42201, 67.76849], + [62.88436, 67.59352], + [62.83287, 67.36682], + [61.80221, 67.10673], + [61.70265, 67.03075], + [61.31538, 67.00233], + [58.8311, 67.0042], + [56.34269, 67.02646], + [53.76022, 67.00903], + [52.16995, 67.10138], + [51.7044, 66.92064], + [51.54304, 66.94861], + [51.54579, 66.77702], + [50.10932, 66.41152], + [49.01207, 66.11551], + [49.08897, 65.22938], + [49.63829, 65.2883], + [50.24116, 64.82937], + [50.50689, 64.79372], + [50.36338, 64.51862], + [49.55246, 64.57675], + [49.47898, 64.42333], + [48.97224, 64.47812], + [48.90976, 64.33693], + [48.5424, 64.36754], + [48.46412, 64.21295], + [48.20594, 64.22638], + [48.16062, 64.34288], + [47.37236, 64.35477], + [46.56143, 64.31105], + [46.31218, 64.25324], + [45.84869, 64.28156], + [45.40512, 64.17618], + [45.93452, 63.95456], + [46.39389, 63.90598], + [46.76055, 63.78127], + [47.00706, 63.58553], + [46.94046, 63.34904], + [47.05238, 63.25372], + [47.56187, 63.15032], + [47.4472, 62.96521], + [47.07366, 62.83602], + [47.24395, 62.63534], + [47.23159, 62.34196], + [47.39776, 62.33494], + [47.39158, 62.18216], + [47.63397, 62.18152], + [47.65525, 62.33144], + [48.32679, 62.30815], + [48.25607, 62.50344], + [48.35083, 62.73491], + [48.67973, 62.70218], + [48.74702, 62.85514], + [49.64103, 62.77201], + [49.37873, 62.13695], + [49.23454, 62.10677], + [49.04983, 61.65892], + [49.51194, 61.61194], + [49.32449, 61.1588], + [49.12262, 61.17569], + [48.47923, 61.02903], + [48.42018, 60.83922], + [48.55819, 60.55255], + [48.53279, 60.39995], + [48.78341, 60.35481], + [48.49296, 60.19547], + [48.53141, 59.70794], + [49.10888, 59.6608], + [49.04228, 59.47961], + [49.58061, 59.39127], + [49.52499, 59.22198], + [49.82299, 59.20933], + [49.86076, 59.65768], + [50.08598, 59.68091], + [49.98642, 59.7799], + [50.82412, 59.86516], + [51.072, 60.03776], + [51.43043, 59.99417], + [51.4991, 59.9151], + [52.06695, 60.31198], + [52.44049, 60.18762], + [53.38325, 60.15825], + [53.42239, 60.22719], + [53.684, 60.02404], + [53.60572, 59.68923], + [53.45397, 59.69477], + [53.22876, 59.33984], + [53.37776, 59.16044], + [53.90029, 59.08785], + [53.78082, 59.01157], + [53.92707, 58.75894], + [53.73207, 58.68907], + [53.79318, 58.23257], + [54.13307, 57.96041], + [54.13101, 57.61672], + [54.04106, 57.52467], + [54.28688, 57.42831], + [54.31228, 57.08515], + [54.00123, 56.75084], + [53.80073, 56.81892], + [53.88588, 56.66717], + [54.44274, 56.35498], + [54.54986, 56.522], + [54.96254, 56.33024], + [55.32371, 56.31463], + [55.91972, 56.45945], + [56.09275, 56.29444], + [56.40655, 56.4044], + [56.8872, 56.11149], + [57.23808, 56.19295], + [57.41043, 56.34166], + [57.47497, 56.12795], + [57.89108, 56.14401], + [58.39096, 56.08736], + [58.50631, 56.17384], + [58.89221, 56.059], + [59.04052, 56.16696], + [59.26574, 56.12871], + [59.19639, 55.81903], + [59.32685, 55.62722], + [59.65438, 55.58998], + [59.46556, 55.48002], + [59.1806, 55.46834], + [58.99589, 55.25525], + [58.7281, 55.28771], + [58.82766, 55.05044], + [58.67248, 54.95593], + [58.45344, 54.9977], + [58.35388, 55.14552], + [58.14033, 55.12747], + [58.14582, 54.98076], + [57.93296, 54.94607], + [58.13072, 55.22079], + [57.52441, 55.34164], + [57.21061, 55.21335], + [57.13096, 55.06971], + [57.26005, 54.95908], + [57.13508, 54.85724], + [57.59857, 54.6774], + [57.76542, 54.50314], + [58.01124, 54.40134], + [58.42117, 54.56091], + [58.59764, 54.46205], + [59.0728, 54.6492], + [59.26643, 54.61264], + [59.66056, 54.90306], + [60.00251, 54.86435], + [59.82261, 54.59036], + [59.67773, 54.51749], + [59.70863, 54.13911], + [59.31449, 54.19297], + [59.18952, 53.99929], + [58.95538, 53.96901], + [58.87229, 53.27917], + [58.91899, 53.05483], + [58.75625, 52.843], + [58.79814, 52.43801], + [59.21287, 52.30134], + [59.2424, 52.48236], + [59.67292, 52.40577], + [59.82605, 52.47399], + [60.16181, 52.40241], + [60.17486, 52.25849], + [59.916, 52.04024], + [60.14396, 51.907], + [60.5175, 51.79757], + [60.35339, 51.68915], + [60.53878, 51.61886], + [60.93566, 51.61503], + [60.95283, 51.49207], + [61.50283, 51.40691], + [61.56806, 51.23698], + [61.44859, 50.80593], + [60.80932, 50.65642], + [60.32661, 50.67078], + [60.03822, 50.8506], + [59.99565, 50.67383], + [59.813, 50.53525], + [59.50882, 50.49508], + [59.4786, 50.64162], + [58.87504, 50.70037], + [58.59489, 50.86924], + [58.63678, 50.98653], + [58.34152, 51.1802], + [57.94807, 51.08627], + [57.77229, 51.13886], + [57.75993, 50.92035], + [57.51068, 50.87704], + [57.14607, 51.08799], + [56.51229, 51.08541], + [56.36398, 50.9013], + [56.18064, 50.93722], + [56.1367, 50.75426], + [55.73707, 50.55052], + [55.38345, 50.65337], + [54.738, 51.0375], + [54.55261, 51.00727], + [54.69886, 50.89307], + [54.73251, 50.61941], + [54.54299, 50.52783], + [54.41322, 50.62071], + [54.53613, 50.84497], + [54.27864, 50.91515], + [54.13856, 51.10654], + [53.73756, 51.20602], + [53.56521, 51.43175], + [53.33381, 51.51045], + [52.5634, 51.45614], + [52.33337, 51.74361], + [51.89598, 51.68277], + [51.43249, 51.47496], + [51.2725, 51.68405], + [50.89347, 51.68107], + [50.81108, 51.58603], + [50.58448, 51.64529], + [50.5474, 51.46555], + [50.37574, 51.33232], + [50.04135, 51.25246], + [49.77562, 51.10697], + [49.45701, 51.12507], + [49.33822, 50.98739], + [49.42268, 50.84887], + [49.12742, 50.78423], + [48.81294, 50.59587], + [48.65226, 50.60154], + [48.76487, 50.09988], + [48.90358, 50.01788], + [48.35701, 49.82558], + [47.82623, 50.33099], + [47.612, 50.46318], + [47.29957, 50.30293], + [47.35313, 50.09459], + [47.18078, 49.93487], + [46.902, 49.86277], + [46.78047, 49.33809], + [46.99539, 49.23194], + [47.02835, 49.0905], + [46.77909, 48.94775], + [46.49345, 48.4333], + [47.12242, 48.26856], + [47.05101, 47.99865], + [47.19314, 47.76009], + [47.3854, 47.68203], + [47.41561, 47.83666], + [47.65319, 47.75779], + [48.0281, 47.76702], + [48.51905, 47.41182], + [48.71063, 47.09443], + [49.02099, 46.76009], + [48.74977, 46.68618], + [48.51768, 46.73656], + [48.55133, 46.55602], + [49.18922, 46.37156], + [49.26338, 46.29191], + [49.91088, 46.05798], + [49, 42], + [48.58017, 41.85166], + [48.37417, 41.58925], + [48.07617, 41.50034], + [47.88185, 41.21895], + [47.5653, 41.19829], + [47.25837, 41.33918], + [47.11074, 41.59387], + [46.7633, 41.79947], + [46.39938, 41.93855], + [45.95512, 42.02481], + [45.61042, 42.21122], + [45.77179, 42.48931], + [45.35224, 42.52221], + [45.15724, 42.70716], + [44.8867, 42.74701], + [44.82833, 42.61779], + [44.67796, 42.7576], + [44.31266, 42.72229], + [43.96316, 42.54802], + [43.71391, 42.63446], + [43.80523, 42.72179], + [43.5601, 42.8674], + [43.20373, 42.93078], + [42.86041, 43.17864], + [42.45872, 43.21218], + [41.61758, 43.22219], + [41.36146, 43.36961], + [40.94879, 43.42051], + [40.66108, 43.56347], + [40.09048, 43.55601], + [40.00671, 43.38109], + [39.30908, 42.25698], + [29.7924, 45.18344], + [29.42894, 45.4423], + [28.7107, 45.22219], + [28.34335, 45.32415], + [28.08929, 45.60875], + [28.17581, 45.64764], + [28.08792, 46.00936], + [28.25065, 46.61501], + [28.09684, 46.97931], + [27.78236, 47.13929], + [27.5386, 47.48844], + [27.25158, 47.71761], + [27.16438, 47.99543], + [26.8087, 48.25439], + [26.32873, 48.17799], + [26.18522, 47.99405], + [25.31112, 47.91496], + [25.0399, 47.72639], + [24.88197, 47.72362], + [24.6231, 47.95176], + [24.23378, 47.89793], + [24.01062, 47.96785], + [23.33221, 48.02253], + [23.26973, 48.10147], + [22.89688, 47.95314], + [22.82066, 48.1198], + [22.59132, 48.10789], + [22.48901, 48.25394], + [22.14191, 48.40732], + [22.18792, 48.60976], + [22.34001, 48.68416], + [22.38945, 48.87374], + [22.58171, 49.0977], + [22.89207, 49.0077], + [22.70668, 49.17586], + [22.74856, 49.36046], + [22.64076, 49.53011], + [23.47091, 50.21733], + [23.80737, 50.40589], + [23.99826, 50.41201], + [24.09919, 50.60198], + [23.95774, 50.79465], + [24.14451, 50.86967], + [23.9138, 51.00857], + [23.86711, 51.15049], + [23.63708, 51.32803], + [23.70163, 51.40477], + [23.53134, 51.74318], + [23.68789, 51.99037], + [23.63983, 52.08667], + [23.1784, 52.28454], + [23.46679, 52.54963], + [23.93783, 52.713], + [23.81835, 53.24508], + [23.5485, 53.76738], + [23.60481, 53.92253], + [24.2015, 53.97022], + [24.35257, 53.89665], + [24.77691, 54.10047], + [25.07148, 54.13307], + [25.26786, 54.27484], + [25.51506, 54.30731], + [25.65033, 54.13026], + [25.78628, 54.23473], + [25.52948, 54.34214], + [25.7492, 54.56489], + [25.7341, 54.80385], + [25.85632, 54.92793], + [26.20925, 54.99888], + [26.32392, 55.14513], + [26.67755, 55.16984], + [26.83136, 55.30648], + [26.43928, 55.34945], + [26.65214, 55.70699], + [26.78329, 55.67758], + [27.15133, 55.85257], + [27.61413, 55.78661], + [27.65327, 55.93074], + [28.24035, 56.27309], + [28.19435, 56.44162], + [27.84828, 56.87937], + [27.65945, 56.83582], + [27.86613, 57.29648], + [27.35115, 57.51914], + [27.49328, 57.78842], + [27.81463, 57.86265], + [27.68142, 57.92505], + [27.49054, 58.22281], + [27.55302, 58.36715], + [27.35801, 58.78742], + [27.73017, 58.97231], + [27.96501, 59.2736], + [28.13255, 59.29113], + [28.08586, 59.45868], + [27.09228, 59.77022], + [26.74072, 60.09498], + [27.58667, 60.29702], + [27.77137, 60.53533], + [28.81919, 61.12201], + [29.2456, 61.27089], + [29.50378, 61.46108], + [30.60241, 62.14176], + [31.22314, 62.49932], + [31.58706, 62.90835], + [31.26503, 63.11525], + [31.23962, 63.21754], + [30.78781, 63.40535], + [30.48431, 63.46646], + [29.9707, 63.75699], + [30.26115, 63.82249], + [30.52757, 64.04787], + [30.48225, 64.26249], + [30.04623, 64.40287], + [29.98924, 64.58765], + [30.13481, 64.64946], + [30.0428, 64.79343], + [29.7393, 64.79021], + [29.62669, 65.06084], + [29.89654, 65.10539], + [29.85946, 65.21586], + [29.6006, 65.26044], + [29.86427, 65.56073], + [29.72351, 65.63675], + [30.13893, 65.66874], + [29.92401, 66.12663], + [29.70909, 66.26823], + [29.47357, 66.5417], + [29.11857, 66.80191], + [29.07188, 66.99589], + [29.93019, 67.52327], + [30.01602, 67.67347], + [29.65965, 67.80327], + [29.32731, 68.07458], + [28.64685, 68.19681], + [28.43399, 68.53929], + [28.79997, 68.86945], + [28.41613, 68.91495], + [28.92837, 69.05163], + [29.23942, 69.11365], + [29.29023, 69.29599], + [30.00091, 69.41341], + [30.17257, 69.53475], + [30.15197, 69.66925], + [30.5159, 69.54051], + [30.81939, 69.52947], + [30.9526, 69.63774], + [30.82151, 69.79125], + [32, 71], + [32, 74.05376], + [70, 80] + ] + ] + }, + "properties": { "cqzone": "16" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "17": { + "mh": [ + "MP30", + "MP31", + "MP32", + "MP33", + "MP34", + "MP35", + "MP36", + "MP37", + "MP38", + "MP39", + "MP40", + "MP41", + "MP42", + "MP43", + "MP44", + "MP45", + "MP46", + "MP47", + "MP49", + "MP50", + "MP51", + "MP52", + "MP53", + "MP54", + "MP55", + "MP56", + "MP57", + "MP58", + "MP59", + "MP60", + "MP61", + "MP62", + "MP63", + "MP64", + "MP65", + "MP66", + "MP68", + "MP70", + "MP71", + "MP72", + "MP73", + "MP74", + "MP75", + "MP76", + "MP77", + "MP78", + "MP79", + "MP81", + "MP82", + "MP83", + "MP84", + "MP85", + "MP86", + "MP87", + "MP88", + "MP89", + "MP91", + "MP92", + "MP93", + "MP94", + "MP95", + "MP96", + "MP97", + "MP98", + "MP99", + "MQ30", + "MQ40", + "MQ41", + "MQ42", + "MQ50", + "MQ51", + "MQ52", + "MQ70", + "MQ71", + "MQ80", + "MQ81", + "MQ90", + "MQ91", + "NN29", + "NN39", + "NO00", + "NO10", + "NP01", + "NP02", + "NP03", + "NP04", + "NP05", + "NP06", + "NP07", + "NP08", + "NP11", + "NP12", + "NP13", + "NP14", + "NP15", + "NP16", + "NP21", + "NP23", + "NP24", + "MQ72", + "MP27", + "MP26", + "MP16", + "MP15", + "MP05", + "LP94", + "MP04", + "LP93", + "LP92", + "LP91", + "LP90", + "LO99", + "LO98", + "LO97", + "LO87", + "LO86", + "LO96", + "LO93", + "LO92", + "MO02", + "MO12", + "MO13", + "MO03", + "MO04", + "MO14", + "MO24", + "MO34", + "MO44", + "MO45", + "MO54", + "MO55", + "MO64", + "MO63", + "MO73", + "MO74", + "MO83", + "MO91", + "MO90", + "MP25", + "MP14", + "MP24", + "MP23", + "MP03", + "MP13", + "MP12", + "MP22", + "MP21", + "MP11", + "MP01", + "MP00", + "MP02", + "MP10", + "MP20", + "MO09", + "MO19", + "MO29", + "MO39", + "MO49", + "MO59", + "MO69", + "MO79", + "MO78", + "MO58", + "MO68", + "MO48", + "MO38", + "MO28", + "MO08", + "MO18", + "MO07", + "MO17", + "MO27", + "MO37", + "MO47", + "MO57", + "MO67", + "MO77", + "MO76", + "MO75", + "MO65", + "MO56", + "MO66", + "MO46", + "MO36", + "MO16", + "MO26", + "MO35", + "MO25", + "MO15", + "MO05", + "MO06", + "LN38", + "LN39", + "LN46", + "LN47", + "LN48", + "LN49", + "LN54", + "LN57", + "LN58", + "LN59", + "LN62", + "LN63", + "LN64", + "LN67", + "LN68", + "LN69", + "LN75", + "LN76", + "LN77", + "LN78", + "LN79", + "LN85", + "LN86", + "LN87", + "LN88", + "LN89", + "LN94", + "LN95", + "LN96", + "LN97", + "LN98", + "LN99", + "LO40", + "LO50", + "LO51", + "LO60", + "LO61", + "LO70", + "LO80", + "LO90", + "MN03", + "MN04", + "MN05", + "MN06", + "MN07", + "MN08", + "MN09", + "MN13", + "MN14", + "MN15", + "MN16", + "MN17", + "MN18", + "MN19", + "MN22", + "MN23", + "MN24", + "MN25", + "MN26", + "MN27", + "MN28", + "MN29", + "MN31", + "MN32", + "MN33", + "MN34", + "MN35", + "MN36", + "MN37", + "MN38", + "MN39", + "MN41", + "MN42", + "MN43", + "MN44", + "MN45", + "MN46", + "MN47", + "MN48", + "MN49", + "MN51", + "MN52", + "MN53", + "MN54", + "MN55", + "MN56", + "MN57", + "MN58", + "MN59", + "MN62", + "MN63", + "MN64", + "MN65", + "MN66", + "MN67", + "MN68", + "MN69", + "MN72", + "MN73", + "MN74", + "MN75", + "MN76", + "MN77", + "MN78", + "MN79", + "MN82", + "MN83", + "MN84", + "MN85", + "MN86", + "MN87", + "MN88", + "MN89", + "MN92", + "MN93", + "MN94", + "MN95", + "MN96", + "MN97", + "MN98", + "MN99", + "MO00", + "MO10", + "MO11", + "MO20", + "MO21", + "MO22", + "MO23", + "MO30", + "MO31", + "MO32", + "MO33", + "MO40", + "MO41", + "MO42", + "MO43", + "MO50", + "MO51", + "MO52", + "MO53", + "MO60", + "MO61", + "MO62", + "MO70", + "MO71", + "MO72", + "MO80", + "MO81", + "MO82", + "NN05", + "NN06", + "NN07", + "NN08", + "NN09", + "NN17", + "NN18", + "NN19", + "NN27", + "NN28", + "MN40", + "MN30", + "LN74", + "LN72", + "LN73", + "LN71", + "MM49", + "MM59", + "MM69", + "MN50", + "MN60", + "MN61", + "MN70", + "MN71", + "MN81", + "MM37", + "MM47", + "MM48", + "MM58", + "MM67", + "MM68", + "MM39", + "LM78", + "LM79", + "LM88", + "LM89", + "LM97", + "LM98", + "LM99", + "LN60", + "LN70", + "LN80", + "LN81", + "LN82", + "LN90", + "LN91", + "LN92", + "MM06", + "MM07", + "MM08", + "MM09", + "MM15", + "MM16", + "MM17", + "MM18", + "MM19", + "MM27", + "MM28", + "MM29", + "MM38", + "MN00", + "MN01", + "MN02", + "MN10", + "LN93", + "MN11", + "MN12", + "MN20", + "MN21", + "LN83", + "LN84", + "MP48", + "MP67", + "MP69", + "MP80", + "MP90", + "MQ31", + "MQ60", + "MQ61", + "MQ62", + "MQ82", + "MQ92", + "NO20", + "NP00", + "NP09", + "NP10", + "NP17", + "NP18", + "NP19", + "NP20", + "NP22", + "NP25", + "NQ00", + "NQ01", + "MQ53", + "MQ43", + "MP28", + "LO95", + "LO85", + "LO84", + "LO94", + "MO01", + "MO84", + "MO92", + "MO93", + "MO89", + "MO87", + "MO86", + "LN37", + "LN52", + "LN53", + "LN55", + "LN56", + "LN65", + "LN66", + "LO30", + "LO41", + "LO71", + "LO81", + "LO91", + "NN02", + "NN03", + "NN04", + "NN15", + "NN16", + "NN38", + "LN61", + "MN80", + "MN91", + "MM56", + "MM57", + "MM66", + "MM77", + "MM78", + "LM67", + "LM68", + "LM69", + "LM77", + "LM87", + "LM96", + "MM05", + "MM26", + "LO77", + "LO76", + "LO66", + "LO68", + "LO69", + "LO59", + "LO49", + "LP40", + "LP41", + "LP42", + "LP32", + "LP33", + "LP24", + "LP34", + "LP44", + "LP54", + "LP45", + "LP46", + "LP56", + "LP67", + "LP57", + "LP76", + "LP86", + "LP66", + "LP96", + "MP06", + "MP17", + "MP07", + "MP29", + "LP55", + "LP65", + "LP75", + "LP85", + "LP95", + "LP84", + "LP74", + "LP64", + "LP43", + "LP53", + "LP63", + "LP73", + "LP83", + "LP52", + "LP51", + "LP50", + "LP60", + "LO79", + "LO78", + "LO88", + "LO89", + "LP80", + "LP70", + "LP61", + "LP71", + "LP81", + "LP82", + "LP72", + "LP62", + "MQ73", + "MQ93", + "NO01", + "NO11", + "MQ89", + "MR90", + "NR00", + "MQ79" + ], + "worked": false, + "confirmed": false, + "name": "Western Zone of Siberia", + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [70, 76], + [78, 74], + [78, 73], + [79, 72.5], + [78.40667, 72.33579], + [78.60992, 72.17045], + [79.37416, 72.02862], + [79.6241, 72.04662], + [80.36636, 71.87653], + [80.04364, 71.82455], + [80.14595, 71.6997], + [79.82185, 71.57988], + [79.37484, 71.60199], + [79.12284, 71.40814], + [80.00244, 71.12432], + [80.57785, 71.05199], + [80.65544, 70.69177], + [80.82298, 70.63015], + [80.64514, 70.4974], + [80.87516, 70.44277], + [80.23521, 70.42092], + [79.6701, 70.22881], + [79.5671, 70.12426], + [78.94294, 69.84553], + [79.46273, 69.65565], + [79.63028, 69.45152], + [79.84863, 69.37499], + [80.709, 69.31468], + [80.95893, 69.19599], + [81.66961, 69.32219], + [81.70738, 69.46068], + [81.95594, 69.35635], + [81.88316, 69.19258], + [82.38784, 69.17501], + [82.55744, 68.83254], + [82.87193, 68.67479], + [82.62474, 68.55461], + [82.71606, 68.39918], + [82.56019, 68.18125], + [82.39677, 68.13782], + [82.35145, 67.93804], + [81.96556, 67.95814], + [81.74926, 67.90138], + [82.09465, 67.73599], + [82.06787, 67.64946], + [82.39471, 67.46545], + [82.36999, 67.3171], + [82.14202, 67.21626], + [83.12049, 66.83975], + [83.34709, 66.64726], + [83.08891, 66.58976], + [83.11363, 66.4008], + [83.51669, 66.19101], + [83.28323, 66.04089], + [83.54415, 65.89828], + [83.58055, 65.76278], + [83.99734, 65.78222], + [84.28436, 65.68345], + [84.1745, 65.59026], + [84.42237, 65.54595], + [84.55764, 65.31928], + [84.2823, 65.10105], + [84.3544, 64.90724], + [84.92019, 64.96628], + [85.1461, 64.76593], + [85.54573, 64.85127], + [85.82382, 64.78407], + [85.9069, 64.57881], + [85.80665, 64.49704], + [86.01539, 64.25414], + [85.96527, 64.05478], + [85.49491, 63.9262], + [85.29235, 63.64869], + [85.07057, 63.53478], + [85.28617, 63.5207], + [85.41389, 63.36475], + [85.68031, 63.37583], + [85.49629, 63.17636], + [85.6192, 63.0369], + [85.51689, 62.90272], + [85.22163, 62.80121], + [84.94216, 62.50914], + [84.43885, 62.18985], + [84.51576, 61.9257], + [84.67506, 61.80428], + [84.91333, 61.79033], + [85.49148, 61.61814], + [85.95909, 61.54396], + [85.96252, 61.46042], + [85.63774, 61.36843], + [85.68786, 61.28541], + [84.6524, 61.00174], + [84.27406, 60.86531], + [83.94722, 60.83453], + [83.47274, 61.03302], + [83.15689, 61.02637], + [82.37823, 60.70679], + [82.40638, 60.60887], + [82.16743, 60.51675], + [81.88797, 60.63447], + [81.47117, 60.60416], + [81.1148, 60.63683], + [81.05506, 60.74943], + [80.72067, 60.79804], + [80.19813, 60.67048], + [79.69963, 60.68629], + [79.40849, 60.64323], + [79.21211, 60.82784], + [78.79394, 60.75379], + [78.11004, 60.79837], + [77.96585, 60.74272], + [77.70423, 60.82048], + [77.10617, 60.85929], + [76.96815, 60.62909], + [77.06703, 60.52722], + [76.81366, 60.46432], + [76.86172, 60.24628], + [76.7752, 60.07135], + [76.74018, 59.70863], + [76.65504, 59.57015], + [76.17782, 59.52979], + [75.83175, 59.2764], + [75.64361, 59.20933], + [75.72807, 59.01794], + [75.61683, 58.90677], + [75.12657, 58.66301], + [75.11146, 58.57433], + [75.36964, 58.45671], + [75.0579, 58.33689], + [75.23918, 58.20364], + [75.07576, 58.11597], + [75.56739, 57.93308], + [75.55366, 57.62518], + [75.69854, 57.62702], + [75.85029, 57.38615], + [76.09817, 57.23521], + [76.29043, 56.69696], + [76.03912, 56.61846], + [75.85029, 56.40174], + [76.10984, 56.44503], + [76.08032, 56.32567], + [76.3021, 56.15511], + [75.73493, 56.11263], + [75.26252, 55.84448], + [75.36895, 55.74141], + [75.10322, 55.75571], + [75.31883, 55.50452], + [75.09292, 55.37598], + [75.27831, 55.23176], + [75.52825, 54.80306], + [75.80703, 54.69129], + [75.68962, 54.54458], + [75.68923, 54.12279], + [76.47445, 54.31812], + [76.73057, 54.41773], + [76.87751, 54.3013], + [76.64543, 54.12462], + [76.44012, 54.16645], + [76.53762, 53.99929], + [77.90817, 53.29066], + [79.19494, 51.91377], + [80.07934, 50.73341], + [80.0608, 50.82806], + [80.48309, 50.97053], + [80.44601, 51.20731], + [80.67741, 51.31645], + [81.17935, 51.15652], + [81.06124, 50.94761], + [81.41143, 50.97485], + [81.58241, 50.74297], + [81.90582, 50.79855], + [82.565, 50.74688], + [82.73254, 50.92727], + [82.97973, 50.88527], + [83.12324, 51.01159], + [83.44871, 51.00986], + [83.96781, 50.79942], + [84.3647, 50.20635], + [84.62219, 50.21426], + [85.03692, 50.05317], + [84.98336, 49.90922], + [85.22369, 49.62361], + [85.59654, 49.61471], + [86.20216, 49.46633], + [86.27563, 49.584], + [86.78375, 49.79545], + [86.59629, 49.60848], + [86.82975, 49.5457], + [87.03506, 49.25077], + [87.31452, 49.23149], + [87.28157, 49.11882], + [86.89704, 49.135], + [86.72538, 48.98787], + [86.81877, 48.83353], + [86.58599, 48.5407], + [86.23512, 48.43239], + [85.75515, 48.40367], + [85.55397, 48.1386], + [85.55191, 47.98256], + [85.70228, 47.37928], + [85.55671, 47.05141], + [85.21408, 47.05187], + [84.94285, 46.86206], + [84.75059, 47.0046], + [83.92044, 46.97509], + [83.36357, 47.17851], + [83.02436, 47.21677], + [82.73941, 46.51682], + [82.33429, 45.93825], + [82.28073, 45.53425], + [82.54165, 45.42158], + [82.58079, 45.21977], + [81.9223, 45.22848], + [81.7678, 45.37674], + [80.89508, 45.12489], + [80.48927, 45.12683], + [80.13908, 45.05557], + [79.88296, 44.91181], + [79.99557, 44.7906], + [80.16517, 44.84175], + [80.39657, 44.63152], + [80.34713, 44.48377], + [80.52154, 43.82164], + [80.75294, 43.46587], + [80.78453, 43.14007], + [80.39176, 42.99711], + [80.59913, 42.89608], + [80.26199, 42.82864], + [80.16174, 42.6289], + [80.28327, 42.23309], + [80.22491, 42.06458], + [79.84588, 42.0141], + [79.77172, 41.89103], + [79.32197, 41.8097], + [78.71154, 41.55226], + [78.64494, 41.46948], + [78.18969, 41.39432], + [78.12377, 41.22928], + [77.81959, 41.14195], + [77.76672, 41.01617], + [77.27371, 41.00063], + [76.99562, 41.07262], + [76.75392, 40.95293], + [76.65435, 40.62281], + [76.4463, 40.39205], + [76.27121, 40.43858], + [75.66284, 40.35334], + [75.72257, 40.47515], + [75.60035, 40.66345], + [75.23712, 40.44747], + [74.81689, 40.50753], + [74.91233, 40.34445], + [74.34173, 40.09383], + [74.04167, 40.10066], + [73.84735, 39.83385], + [73.94691, 39.59986], + [73.87412, 39.48443], + [73.49784, 39.37995], + [73.75396, 39.02451], + [73.70796, 38.89744], + [73.80065, 38.61365], + [73.99017, 38.5256], + [74.18724, 38.64047], + [74.69535, 38.42562], + [74.71183, 38.21282], + [74.91508, 38.02375], + [75.00984, 37.77234], + [74.89723, 37.66099], + [75.15129, 37.4078], + [74.88967, 37.2336], + [74.68849, 37.40507], + [74.24217, 37.41598], + [74.22088, 37.34832], + [73.76152, 37.22267], + [73.61526, 37.27295], + [73.77525, 37.43888], + [73.30421, 37.46395], + [72.77343, 37.18931], + [72.66082, 37.019], + [72.36076, 36.99158], + [71.8444, 36.68218], + [71.59034, 36.73448], + [71.43035, 37.06065], + [71.59652, 37.80164], + [71.51962, 37.95286], + [71.25732, 37.92307], + [71.37405, 38.25705], + [70.99021, 38.49014], + [70.76911, 38.45681], + [70.27679, 37.94527], + [70.17105, 37.93174], + [70.30426, 37.69251], + [70.14358, 37.52334], + [69.90669, 37.6213], + [69.48646, 37.52116], + [69.43496, 37.20955], + [69.24682, 37.09407], + [68.95912, 37.3172], + [68.29376, 37.09845], + [68.02459, 36.92354], + [67.74581, 37.21009], + [67.2583, 37.18384], + [67.04544, 37.38052], + [66.31759, 37.32157], + [66.06971, 37.44978], + [65.70167, 37.53586], + [65.53207, 37.23907], + [65.13244, 37.24618], + [64.75547, 37.11324], + [64.79873, 36.92299], + [64.61883, 36.63591], + [64.57969, 36.35052], + [64.28237, 36.15173], + [63.53599, 35.90295], + [63.09928, 35.81948], + [63.2476, 35.68072], + [63.0931, 35.62046], + [63.09379, 35.42039], + [62.62619, 35.21028], + [62.4765, 35.27813], + [62.30484, 35.12833], + [62.26638, 35.29663], + [62.06451, 35.43437], + [61.58866, 35.43773], + [61.21513, 35.68128], + [61.25907, 35.83395], + [61.11969, 35.96744], + [61.22818, 36.11957], + [61.13754, 36.64473], + [60.34309, 36.62985], + [60.04303, 37.02174], + [59.55894, 37.13185], + [59.39758, 37.31502], + [59.35432, 37.52824], + [59.22866, 37.51353], + [58.82011, 37.6974], + [58.74115, 37.63109], + [58.22891, 37.68327], + [58.20488, 37.77397], + [57.72216, 37.92415], + [57.34931, 37.98696], + [57.24426, 38.27376], + [57.06298, 38.1826], + [56.75125, 38.28454], + [56.41067, 38.25327], + [56.33377, 38.07782], + [55.80986, 38.12591], + [55.46516, 38.09511], + [55.13076, 37.95069], + [54.82589, 37.72619], + [54.79774, 37.52334], + [54.2443, 37.32048], + [53.90922, 37.34778], + [49, 42], + [49.91088, 46.05798], + [49.26338, 46.29191], + [49.18922, 46.37156], + [48.55133, 46.55602], + [48.51768, 46.73656], + [48.74977, 46.68618], + [49.02099, 46.76009], + [48.71063, 47.09443], + [48.51905, 47.41182], + [48.0281, 47.76702], + [47.65319, 47.75779], + [47.41561, 47.83666], + [47.3854, 47.68203], + [47.19314, 47.76009], + [47.05101, 47.99865], + [47.12242, 48.26856], + [46.49345, 48.4333], + [46.77909, 48.94775], + [47.02835, 49.0905], + [46.99539, 49.23194], + [46.78047, 49.33809], + [46.902, 49.86277], + [47.18078, 49.93487], + [47.35313, 50.09459], + [47.29957, 50.30293], + [47.612, 50.46318], + [47.82623, 50.33099], + [48.35701, 49.82558], + [48.90358, 50.01788], + [48.76487, 50.09988], + [48.65226, 50.60154], + [48.81294, 50.59587], + [49.12742, 50.78423], + [49.42268, 50.84887], + [49.33822, 50.98739], + [49.45701, 51.12507], + [49.77562, 51.10697], + [50.04135, 51.25246], + [50.37574, 51.33232], + [50.5474, 51.46555], + [50.58448, 51.64529], + [50.81108, 51.58603], + [50.89347, 51.68107], + [51.2725, 51.68405], + [51.43249, 51.47496], + [51.89598, 51.68277], + [52.33337, 51.74361], + [52.5634, 51.45614], + [53.33381, 51.51045], + [53.56521, 51.43175], + [53.73756, 51.20602], + [54.13856, 51.10654], + [54.27864, 50.91515], + [54.53613, 50.84497], + [54.41322, 50.62071], + [54.54299, 50.52783], + [54.73251, 50.61941], + [54.69886, 50.89307], + [54.55261, 51.00727], + [54.738, 51.0375], + [55.38345, 50.65337], + [55.73707, 50.55052], + [56.1367, 50.75426], + [56.18064, 50.93722], + [56.36398, 50.9013], + [56.51229, 51.08541], + [57.14607, 51.08799], + [57.51068, 50.87704], + [57.75993, 50.92035], + [57.77229, 51.13886], + [57.94807, 51.08627], + [58.34152, 51.1802], + [58.63678, 50.98653], + [58.59489, 50.86924], + [58.87504, 50.70037], + [59.4786, 50.64162], + [59.50882, 50.49508], + [59.813, 50.53525], + [59.99565, 50.67383], + [60.03822, 50.8506], + [60.32661, 50.67078], + [60.80932, 50.65642], + [61.44859, 50.80593], + [61.56806, 51.23698], + [61.50283, 51.40691], + [60.95283, 51.49207], + [60.93566, 51.61503], + [60.53878, 51.61886], + [60.35339, 51.68915], + [60.5175, 51.79757], + [60.14396, 51.907], + [59.916, 52.04024], + [60.17486, 52.25849], + [60.16181, 52.40241], + [59.82605, 52.47399], + [59.67292, 52.40577], + [59.2424, 52.48236], + [59.21287, 52.30134], + [58.79814, 52.43801], + [58.75625, 52.843], + [58.91899, 53.05483], + [58.87229, 53.27917], + [58.95538, 53.96901], + [59.18952, 53.99929], + [59.31449, 54.19297], + [59.70863, 54.13911], + [59.67773, 54.51749], + [59.82261, 54.59036], + [60.00251, 54.86435], + [59.66056, 54.90306], + [59.26643, 54.61264], + [59.0728, 54.6492], + [58.59764, 54.46205], + [58.42117, 54.56091], + [58.01124, 54.40134], + [57.76542, 54.50314], + [57.59857, 54.6774], + [57.13508, 54.85724], + [57.26005, 54.95908], + [57.13096, 55.06971], + [57.21061, 55.21335], + [57.52441, 55.34164], + [58.13072, 55.22079], + [57.93296, 54.94607], + [58.14582, 54.98076], + [58.14033, 55.12747], + [58.35388, 55.14552], + [58.45344, 54.9977], + [58.67248, 54.95593], + [58.82766, 55.05044], + [58.7281, 55.28771], + [58.99589, 55.25525], + [59.1806, 55.46834], + [59.46556, 55.48002], + [59.65438, 55.58998], + [59.32685, 55.62722], + [59.19639, 55.81903], + [59.26574, 56.12871], + [59.04052, 56.16696], + [58.89221, 56.059], + [58.50631, 56.17384], + [58.39096, 56.08736], + [57.89108, 56.14401], + [57.47497, 56.12795], + [57.41043, 56.34166], + [57.23808, 56.19295], + [56.8872, 56.11149], + [56.40655, 56.4044], + [56.09275, 56.29444], + [55.91972, 56.45945], + [55.32371, 56.31463], + [54.96254, 56.33024], + [54.54986, 56.522], + [54.44274, 56.35498], + [53.88588, 56.66717], + [53.80073, 56.81892], + [54.00123, 56.75084], + [54.31228, 57.08515], + [54.28688, 57.42831], + [54.04106, 57.52467], + [54.13101, 57.61672], + [54.13307, 57.96041], + [53.79318, 58.23257], + [53.73207, 58.68907], + [53.92707, 58.75894], + [53.78082, 59.01157], + [53.90029, 59.08785], + [53.37776, 59.16044], + [53.22876, 59.33984], + [53.45397, 59.69477], + [53.60572, 59.68923], + [53.684, 60.02404], + [53.42239, 60.22719], + [53.38325, 60.15825], + [52.44049, 60.18762], + [52.06695, 60.31198], + [51.4991, 59.9151], + [51.43043, 59.99417], + [51.072, 60.03776], + [50.82412, 59.86516], + [49.98642, 59.7799], + [50.08598, 59.68091], + [49.86076, 59.65768], + [49.82299, 59.20933], + [49.52499, 59.22198], + [49.58061, 59.39127], + [49.04228, 59.47961], + [49.10888, 59.6608], + [48.53141, 59.70794], + [48.49296, 60.19547], + [48.78341, 60.35481], + [48.53279, 60.39995], + [48.55819, 60.55255], + [48.42018, 60.83922], + [48.47923, 61.02903], + [49.12262, 61.17569], + [49.32449, 61.1588], + [49.51194, 61.61194], + [49.04983, 61.65892], + [49.23454, 62.10677], + [49.37873, 62.13695], + [49.64103, 62.77201], + [48.74702, 62.85514], + [48.67973, 62.70218], + [48.35083, 62.73491], + [48.25607, 62.50344], + [48.32679, 62.30815], + [47.65525, 62.33144], + [47.63397, 62.18152], + [47.39158, 62.18216], + [47.39776, 62.33494], + [47.23159, 62.34196], + [47.24395, 62.63534], + [47.07366, 62.83602], + [47.4472, 62.96521], + [47.56187, 63.15032], + [47.05238, 63.25372], + [46.94046, 63.34904], + [47.00706, 63.58553], + [46.76055, 63.78127], + [46.39389, 63.90598], + [45.93452, 63.95456], + [45.40512, 64.17618], + [45.84869, 64.28156], + [46.31218, 64.25324], + [46.56143, 64.31105], + [47.37236, 64.35477], + [48.16062, 64.34288], + [48.20594, 64.22638], + [48.46412, 64.21295], + [48.5424, 64.36754], + [48.90976, 64.33693], + [48.97224, 64.47812], + [49.47898, 64.42333], + [49.55246, 64.57675], + [50.36338, 64.51862], + [50.50689, 64.79372], + [50.24116, 64.82937], + [49.63829, 65.2883], + [49.08897, 65.22938], + [49.01207, 66.11551], + [50.10932, 66.41152], + [51.54579, 66.77702], + [51.54304, 66.94861], + [51.7044, 66.92064], + [52.16995, 67.10138], + [53.76022, 67.00903], + [56.34269, 67.02646], + [58.8311, 67.0042], + [61.31538, 67.00233], + [61.70265, 67.03075], + [61.80221, 67.10673], + [62.83287, 67.36682], + [62.88436, 67.59352], + [63.42201, 67.76849], + [63.72619, 67.73391], + [63.96926, 67.89053], + [63.88412, 68.03121], + [64.58793, 68.19987], + [64.68887, 68.38881], + [65.51696, 68.431], + [65.67421, 68.57167], + [65.44692, 68.6453], + [65.40092, 68.78637], + [64.80285, 68.88084], + [64.56733, 68.86599], + [64.53094, 68.9749], + [64.75341, 69.12564], + [65.03082, 69.19355], + [65.1318, 69.33869], + [70, 76] + ] + ] + }, + "properties": { "cqzone": "17" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "18": { + "mh": [ + "MP80", + "MP90", + "NO01", + "NO02", + "NO03", + "NO04", + "NO05", + "NO06", + "NO07", + "NO08", + "NO09", + "NO11", + "NO12", + "NO13", + "NO14", + "NO15", + "NO16", + "NO17", + "NO18", + "NO19", + "NO20", + "NO21", + "NO22", + "NO23", + "NO24", + "NO25", + "NO26", + "NO27", + "NO28", + "NO29", + "NO30", + "NO31", + "NO32", + "NO33", + "NO34", + "NO35", + "NO36", + "NO37", + "NO38", + "NO39", + "NO40", + "NO42", + "NO43", + "NO44", + "NO45", + "NO46", + "NO47", + "NO48", + "NO49", + "NO52", + "NO53", + "NO54", + "NO55", + "NO56", + "NO57", + "NO58", + "NO59", + "NO62", + "NO63", + "NO64", + "NO65", + "NO66", + "NO67", + "NO68", + "NO69", + "NO73", + "NO74", + "NO75", + "NO76", + "NO77", + "NO78", + "NO79", + "NO84", + "NO85", + "NO86", + "NO87", + "NO88", + "NO89", + "NO92", + "NO93", + "NO94", + "NO95", + "NO96", + "NO97", + "NO98", + "NO99", + "NP00", + "NP09", + "NP10", + "NP17", + "NP18", + "NP19", + "NP20", + "NP22", + "NP25", + "NP26", + "NP27", + "NP28", + "NP29", + "NP30", + "NP31", + "NP32", + "NP33", + "NP34", + "NP35", + "NP36", + "NP37", + "NP38", + "NP39", + "NP40", + "NP41", + "NP42", + "NP43", + "NP44", + "NP45", + "NP46", + "NP47", + "NP48", + "NP49", + "NP50", + "NP51", + "NP52", + "NP53", + "NP54", + "NP55", + "NP56", + "NP57", + "NP58", + "NP59", + "NP60", + "NP61", + "NP62", + "NP63", + "NP64", + "NP65", + "NP66", + "NP67", + "NP68", + "NP69", + "NP70", + "NP71", + "NP72", + "NP73", + "NP74", + "NP75", + "NP76", + "NP77", + "NP78", + "NP79", + "NP80", + "NP81", + "NP82", + "NP83", + "NP84", + "NP85", + "NP86", + "NP87", + "NP88", + "NP89", + "NP90", + "NP91", + "NP92", + "NP93", + "NP94", + "NP95", + "NP96", + "NP97", + "NP98", + "NP99", + "NQ00", + "NQ01", + "NQ02", + "NQ03", + "NQ10", + "NQ11", + "NQ12", + "NQ13", + "NQ20", + "NQ21", + "NQ22", + "NQ23", + "NQ30", + "NQ31", + "NQ32", + "NQ33", + "NQ34", + "NQ40", + "NQ41", + "NQ42", + "NQ43", + "NQ44", + "NQ50", + "NQ51", + "NQ52", + "NQ53", + "NQ54", + "NQ55", + "NQ60", + "NQ61", + "NQ62", + "NQ63", + "NQ64", + "NQ65", + "NQ70", + "NQ71", + "NQ72", + "NQ73", + "NQ74", + "NQ75", + "NQ80", + "NQ81", + "NQ82", + "NQ83", + "NQ84", + "NQ85", + "NQ90", + "NQ91", + "NQ92", + "NQ93", + "NQ94", + "NQ95", + "ON49", + "ON59", + "OO01", + "OO02", + "OO03", + "OO04", + "OO05", + "OO06", + "OO07", + "OO08", + "OO09", + "OO10", + "OO11", + "OO12", + "OO13", + "OO14", + "OO15", + "OO16", + "OO17", + "OO18", + "OO19", + "OO20", + "OO21", + "OO22", + "OO23", + "OO24", + "OO25", + "OO26", + "OO27", + "OO28", + "OO29", + "OO30", + "OO31", + "OO32", + "OO33", + "OO34", + "OO35", + "OO36", + "OO37", + "OO38", + "OO39", + "OO40", + "OO41", + "OO42", + "OO43", + "OO44", + "OO45", + "OO46", + "OO47", + "OO48", + "OO49", + "OO50", + "OO51", + "OO52", + "OO53", + "OO54", + "OO55", + "OO56", + "OO57", + "OO58", + "OO60", + "OO61", + "OO62", + "OO63", + "OO64", + "OO65", + "OO66", + "OO67", + "OO68", + "OO70", + "OO71", + "OO72", + "OO73", + "OO74", + "OO75", + "OO76", + "OO77", + "OO78", + "OO79", + "OO80", + "OO81", + "OO82", + "OO83", + "OO84", + "OO85", + "OO86", + "OO87", + "OO88", + "OO89", + "OO90", + "OO91", + "OO92", + "OO93", + "OO94", + "OO95", + "OO96", + "OO97", + "OO98", + "OP00", + "OP01", + "OP02", + "OP03", + "OP04", + "OP05", + "OP06", + "OP07", + "OP08", + "OP09", + "OP10", + "OP11", + "OP12", + "OP13", + "OP14", + "OP15", + "OP16", + "OP17", + "OP18", + "OP19", + "OP20", + "OP21", + "OP22", + "OP23", + "OP24", + "OP25", + "OP26", + "OP27", + "OP28", + "OP29", + "OP30", + "OP31", + "OP32", + "OP33", + "OP40", + "OP41", + "OP42", + "OP43", + "OQ00", + "OQ01", + "OQ02", + "OQ03", + "OQ04", + "OQ05", + "OQ06", + "OQ10", + "OQ11", + "OQ12", + "OQ13", + "OQ14", + "OQ15", + "OQ16", + "OQ20", + "OQ21", + "OQ22", + "OQ23", + "OQ24", + "OQ25", + "OQ26", + "OQ27", + "OQ30", + "OQ31", + "OQ32", + "OQ33", + "OQ34", + "OQ35", + "OQ36", + "OQ40", + "OQ41", + "OQ42", + "OQ43", + "OQ44", + "OQ45", + "OQ46", + "OQ51", + "OQ52", + "OQ55", + "OQ56", + "OQ65", + "PO03", + "PO04", + "PO05", + "MO84", + "MO92", + "MO93", + "MO89", + "MO99", + "MO98", + "MO88", + "MO87", + "MO97", + "MO96", + "MO94", + "MO95", + "MO85", + "MO86", + "MP99", + "MQ90", + "MQ91", + "MQ92", + "NN29", + "NN39", + "NN49", + "NO00", + "NO10", + "NO41", + "NO51", + "NO61", + "NO72", + "NO83", + "NO91", + "NP15", + "NP16", + "NP21", + "NP23", + "NP24", + "NQ35", + "NQ45", + "NQ66", + "NQ76", + "NQ86", + "NQ96", + "NQ97", + "ON39", + "ON69", + "ON79", + "ON89", + "ON99", + "OO59", + "OO69", + "OO99", + "OP34", + "OP35", + "OP36", + "OP37", + "OP38", + "OP39", + "OP44", + "OP49", + "OP50", + "OP51", + "OP70", + "OP80", + "OQ07", + "OQ17", + "OQ37", + "OQ50", + "OQ53", + "OQ54", + "OQ61", + "OQ62", + "OQ64", + "OQ66", + "PO01", + "PO02", + "PO06", + "MO74", + "MO83", + "MO91", + "MO90", + "MO79", + "MO78", + "MO77", + "MO76", + "MO75", + "PO13", + "PO14", + "NQ98", + "OQ08", + "OQ18", + "OQ28", + "OQ29", + "OQ19", + "OQ09", + "OQ38", + "NQ87", + "NQ77", + "NQ14", + "NQ24", + "MQ94", + "NQ15", + "NQ05", + "NQ47", + "NQ46", + "NQ04", + "NQ25", + "NQ16", + "NQ56", + "NQ26", + "NQ36", + "NQ57", + "NQ67", + "NQ68", + "NQ99", + "NQ88", + "NQ78", + "NQ89", + "NR90", + "NR80", + "NR81", + "NR71", + "NR61", + "NR51", + "NR41", + "NR60", + "NR70", + "NQ79", + "NQ69", + "NQ59", + "NR50", + "PO15" + ], + "worked": false, + "confirmed": false, + "name": "Central Siberian Zone", + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [115, 85], + [115, 75.5], + [110.88081, 74.28234], + [112, 74], + [110.81153, 73.71697], + [111.27708, 73.61249], + [110.90629, 73.58088], + [110.63919, 73.42842], + [110.11322, 73.40529], + [110.50254, 73.33061], + [110.59318, 73.24353], + [110.36659, 73.15839], + [110.84449, 73.16297], + [110.65841, 72.99048], + [110.86715, 72.92608], + [110.62339, 72.88289], + [110.74424, 72.65958], + [111.28463, 72.48974], + [110.9983, 72.44029], + [111.31073, 72.31057], + [111.5483, 72.32516], + [111.68838, 72.1757], + [111.99531, 72.10853], + [112.0008, 71.41011], + [112.70668, 71.25914], + [112.57621, 71.11943], + [112.24319, 71.00377], + [111.45561, 70.91551], + [111.34231, 70.86133], + [110.12558, 70.63516], + [110.13038, 70.47332], + [110.2938, 70.40504], + [109.56459, 70.35455], + [109.6202, 70.28402], + [109.30023, 70.20929], + [109.54399, 70.00721], + [109.21371, 69.75449], + [108.89579, 69.83843], + [108.25309, 69.84908], + [107.97775, 69.68618], + [107.63374, 69.66352], + [106.8386, 69.51962], + [106.48567, 69.57649], + [106.15058, 69.40979], + [106.9004, 68.85732], + [106.90727, 68.17844], + [106.81732, 67.3425], + [106.07986, 67.16222], + [105.94596, 67.0345], + [105.52917, 67.01547], + [106.19247, 66.79569], + [106.32499, 66.48122], + [106.14303, 66.40987], + [106.1087, 66.19434], + [106.32843, 66.15412], + [106.50833, 65.99903], + [106.41014, 65.67213], + [106.95602, 65.50442], + [106.84341, 65.40115], + [106.43554, 65.321], + [106.29684, 65.14438], + [105.95832, 65.04259], + [106.20414, 64.87839], + [105.9336, 64.90753], + [105.85464, 64.68442], + [105.67886, 64.68442], + [105.77293, 64.49261], + [106.00982, 64.53958], + [106.07643, 64.4417], + [106.57562, 64.47013], + [107.27119, 64.34377], + [107.33505, 64.26964], + [107.69485, 64.29795], + [107.89466, 64.19203], + [108.42681, 64.3173], + [108.525, 64.13876], + [108.76464, 64.00908], + [108.8134, 63.86971], + [108.3815, 63.86064], + [108.15696, 63.59866], + [108.54011, 63.6368], + [109.14436, 63.56139], + [109.41352, 63.37798], + [109.53575, 63.00232], + [109.6717, 62.83602], + [109.25148, 62.58828], + [109.45747, 62.4263], + [109.87976, 62.44092], + [110.00198, 62.19626], + [109.58793, 61.91568], + [109.61128, 61.73998], + [109.80835, 61.61455], + [109.76852, 61.33584], + [110.1139, 61.28607], + [110.2169, 61.17337], + [110.54718, 61.1694], + [110.47508, 60.99309], + [110.26016, 60.8342], + [110.30273, 60.71687], + [110.08712, 60.69839], + [110.10154, 60.55997], + [109.91478, 60.46601], + [109.69505, 60.09326], + [109.66415, 59.87791], + [109.48356, 59.76988], + [109.54399, 59.66843], + [109.2659, 59.46496], + [109.29611, 59.31812], + [109.50073, 59.30831], + [109.82482, 58.99531], + [110.17776, 58.98859], + [110.49018, 59.05291], + [110.7257, 59.27956], + [111.22558, 59.20968], + [111.46659, 59.29324], + [111.6616, 59.23112], + [111.95755, 59.29289], + [112.23564, 59.52735], + [112.28576, 59.31111], + [112.65174, 59.32793], + [112.45056, 59.1453], + [112.47459, 58.90003], + [112.78633, 59.12029], + [113.27316, 59.16079], + [113.5231, 59.34684], + [113.43864, 59.41329], + [113.60893, 59.60804], + [114.16511, 59.75639], + [114.3251, 59.91063], + [114.57641, 59.9952], + [114.67735, 60.1842], + [114.99733, 60.22276], + [115.22529, 60.49274], + [115.6826, 60.5485], + [116.33697, 60.37823], + [116.59034, 60.38536], + [116.92886, 60.20673], + [117.00439, 60.06312], + [117.29141, 60.0525], + [117.01881, 59.91373], + [117.22549, 59.86895], + [117.12043, 59.61394], + [117.24678, 59.51899], + [117.77824, 59.56563], + [117.919, 59.45624], + [118.04466, 59.6379], + [118.33442, 59.62853], + [118.37425, 59.51481], + [118.73954, 59.44053], + [118.82469, 59.32793], + [118.67912, 59.1921], + [118.80546, 59.05185], + [118.8446, 58.73222], + [118.7677, 58.62978], + [119.10827, 58.51701], + [119.18312, 58.03937], + [119.07119, 57.72945], + [119.28886, 57.60275], + [119.67544, 57.17422], + [119.57107, 57.03811], + [119.86427, 56.90187], + [119.66789, 56.75874], + [119.87319, 56.6732], + [119.94323, 56.50078], + [120.27488, 56.46666], + [120.52482, 56.3013], + [120.02288, 56.13024], + [120.10734, 55.86683], + [120.35316, 55.87762], + [120.99723, 56.04711], + [121.26159, 56.02179], + [121.33094, 55.52435], + [121.87477, 55.61636], + [121.97982, 55.49324], + [121.94686, 55.0044], + [121.66259, 54.83352], + [121.67701, 54.72858], + [121.89468, 54.81137], + [121.92283, 54.58081], + [122.12265, 54.4824], + [121.92901, 54.37775], + [121.74568, 54.44249], + [121.63581, 54.02995], + [121.94206, 53.82821], + [121.98532, 53.54602], + [122.11303, 53.4304], + [121.47377, 53.33128], + [120.8139, 53.26726], + [120.17463, 52.80566], + [120.03044, 52.77909], + [120.04486, 52.59303], + [120.45822, 52.64389], + [120.71846, 52.5275], + [120.62164, 52.32442], + [120.78163, 52.16382], + [120.64842, 51.92521], + [120.08949, 51.68234], + [119.9961, 51.45743], + [119.71321, 51.04571], + [119.51408, 50.90563], + [119.49829, 50.76469], + [119.29161, 50.58236], + [119.18518, 50.34765], + [119.3589, 50.34808], + [119.27581, 50.08093], + [119.05403, 49.9786], + [118.63723, 49.91763], + [118.44154, 49.77993], + [117.89085, 49.59424], + [117.8009, 49.51718], + [117.47268, 49.62672], + [117.05658, 49.6854], + [116.62605, 49.93531], + [116.23741, 50.03641], + [115.74302, 49.88578], + [115.23696, 49.98434], + [114.99046, 50.17338], + [114.33746, 50.28582], + [113.21754, 49.83665], + [113.05412, 49.60848], + [112.81242, 49.5154], + [112.47665, 49.52253], + [111.93901, 49.37522], + [111.37802, 49.35822], + [110.81222, 49.17586], + [110.39405, 49.25525], + [110.19905, 49.15521], + [109.55703, 49.22163], + [109.17388, 49.35554], + [108.4996, 49.32691], + [108.29704, 49.55105], + [107.96058, 49.65384], + [107.96676, 49.93928], + [107.79441, 49.93177], + [107.09747, 50.05184], + [106.81594, 50.29767], + [106.51382, 50.34546], + [106.26045, 50.29855], + [105.84434, 50.43957], + [105.35408, 50.47935], + [105.11787, 50.38969], + [104.3914, 50.31126], + [104.13459, 50.13818], + [103.8359, 50.19448], + [103.72467, 50.12762], + [103.23783, 50.32179], + [102.93914, 50.306], + [102.72972, 50.40895], + [102.20855, 50.81721], + [102.24082, 50.91602], + [102.12478, 51.36192], + [101.54251, 51.49976], + [101.3681, 51.45657], + [100.5297, 51.75041], + [99.91722, 51.73851], + [99.80117, 51.91589], + [99.02458, 52.06557], + [98.63044, 52.41331], + [98.92227, 52.64764], + [98.94287, 52.93746], + [99.23263, 52.8712], + [99.05273, 53.08577], + [98.69842, 53.1583], + [98.32283, 53.1002], + [98.32283, 53.22741], + [98.01864, 53.25576], + [97.99049, 53.34235], + [97.65266, 53.35997], + [97.33955, 53.58068], + [96.90422, 53.72352], + [96.70921, 53.7093], + [96.67007, 53.56763], + [96.46133, 53.51051], + [96.24229, 53.61287], + [96.10702, 53.45494], + [95.72868, 53.53255], + [95.41282, 53.37759], + [95.17181, 53.45289], + [94.59709, 53.31323], + [94.51263, 52.91304], + [94.15008, 52.82849], + [94.09721, 52.69178], + [93.75801, 52.43633], + [93.6708, 52.21854], + [93.32611, 52.12758], + [92.84614, 51.83577], + [92.0716, 51.77378], + [91.87797, 51.86462], + [90.85556, 51.90149], + [90.74844, 52.06979], + [90.3598, 52.20634], + [90.14694, 52.15708], + [90.01579, 51.96796], + [90.14144, 51.75934], + [89.92858, 51.75509], + [89.70817, 51.557], + [89.26528, 51.64401], + [88.8018, 51.55615], + [89.00985, 51.38249], + [88.95904, 51.24558], + [89.06478, 51.0483], + [89.84344, 50.52739], + [89.82559, 50.41289], + [89.49668, 50.35816], + [89.33464, 50.20503], + [89.59144, 50.10032], + [89.67521, 49.69384], + [88.84025, 49.44089], + [88.59718, 49.50336], + [88.2209, 49.47927], + [88.17009, 49.29333], + [87.98881, 49.18394], + [87.28157, 49.11882], + [87.31452, 49.23149], + [87.03506, 49.25077], + [86.82975, 49.5457], + [86.59629, 49.60848], + [86.78375, 49.79545], + [86.27563, 49.584], + [86.20216, 49.46633], + [85.59654, 49.61471], + [85.22369, 49.62361], + [84.98336, 49.90922], + [85.03692, 50.05317], + [84.62219, 50.21426], + [84.3647, 50.20635], + [83.96781, 50.79942], + [83.44871, 51.00986], + [83.12324, 51.01159], + [82.97973, 50.88527], + [82.73254, 50.92727], + [82.565, 50.74688], + [81.90582, 50.79855], + [81.58241, 50.74297], + [81.41143, 50.97485], + [81.06124, 50.94761], + [81.17935, 51.15652], + [80.67741, 51.31645], + [80.44601, 51.20731], + [80.48309, 50.97053], + [80.0608, 50.82806], + [80.07934, 50.73341], + [79.19494, 51.91377], + [77.90817, 53.29066], + [76.53762, 53.99929], + [76.44012, 54.16645], + [76.64543, 54.12462], + [76.87751, 54.3013], + [76.73057, 54.41773], + [76.47445, 54.31812], + [75.68923, 54.12279], + [75.68962, 54.54458], + [75.80703, 54.69129], + [75.52825, 54.80306], + [75.27831, 55.23176], + [75.09292, 55.37598], + [75.31883, 55.50452], + [75.10322, 55.75571], + [75.36895, 55.74141], + [75.26252, 55.84448], + [75.73493, 56.11263], + [76.3021, 56.15511], + [76.08032, 56.32567], + [76.10984, 56.44503], + [75.85029, 56.40174], + [76.03912, 56.61846], + [76.29043, 56.69696], + [76.09817, 57.23521], + [75.85029, 57.38615], + [75.69854, 57.62702], + [75.55366, 57.62518], + [75.56739, 57.93308], + [75.07576, 58.11597], + [75.23918, 58.20364], + [75.0579, 58.33689], + [75.36964, 58.45671], + [75.11146, 58.57433], + [75.12657, 58.66301], + [75.61683, 58.90677], + [75.72807, 59.01794], + [75.64361, 59.20933], + [75.83175, 59.2764], + [76.17782, 59.52979], + [76.65504, 59.57015], + [76.74018, 59.70863], + [76.7752, 60.07135], + [76.86172, 60.24628], + [76.81366, 60.46432], + [77.06703, 60.52722], + [76.96815, 60.62909], + [77.10617, 60.85929], + [77.70423, 60.82048], + [77.96585, 60.74272], + [78.11004, 60.79837], + [78.79394, 60.75379], + [79.21211, 60.82784], + [79.40849, 60.64323], + [79.69963, 60.68629], + [80.19813, 60.67048], + [80.72067, 60.79804], + [81.05506, 60.74943], + [81.1148, 60.63683], + [81.47117, 60.60416], + [81.88797, 60.63447], + [82.16743, 60.51675], + [82.40638, 60.60887], + [82.37823, 60.70679], + [83.15689, 61.02637], + [83.47274, 61.03302], + [83.94722, 60.83453], + [84.27406, 60.86531], + [84.6524, 61.00174], + [85.68786, 61.28541], + [85.63774, 61.36843], + [85.96252, 61.46042], + [85.95909, 61.54396], + [85.49148, 61.61814], + [84.91333, 61.79033], + [84.67506, 61.80428], + [84.51576, 61.9257], + [84.43885, 62.18985], + [84.94216, 62.50914], + [85.22163, 62.80121], + [85.51689, 62.90272], + [85.6192, 63.0369], + [85.49629, 63.17636], + [85.68031, 63.37583], + [85.41389, 63.36475], + [85.28617, 63.5207], + [85.07057, 63.53478], + [85.29235, 63.64869], + [85.49491, 63.9262], + [85.96527, 64.05478], + [86.01539, 64.25414], + [85.80665, 64.49704], + [85.9069, 64.57881], + [85.82382, 64.78407], + [85.54573, 64.85127], + [85.1461, 64.76593], + [84.92019, 64.96628], + [84.3544, 64.90724], + [84.2823, 65.10105], + [84.55764, 65.31928], + [84.42237, 65.54595], + [84.1745, 65.59026], + [84.28436, 65.68345], + [83.99734, 65.78222], + [83.58055, 65.76278], + [83.54415, 65.89828], + [83.28323, 66.04089], + [83.51669, 66.19101], + [83.11363, 66.4008], + [83.08891, 66.58976], + [83.34709, 66.64726], + [83.12049, 66.83975], + [82.14202, 67.21626], + [82.36999, 67.3171], + [82.39471, 67.46545], + [82.06787, 67.64946], + [82.09465, 67.73599], + [81.74926, 67.90138], + [81.96556, 67.95814], + [82.35145, 67.93804], + [82.39677, 68.13782], + [82.56019, 68.18125], + [82.71606, 68.39918], + [82.62474, 68.55461], + [82.87193, 68.67479], + [82.55744, 68.83254], + [82.38784, 69.17501], + [81.88316, 69.19258], + [81.95594, 69.35635], + [81.70738, 69.46068], + [81.66961, 69.32219], + [80.95893, 69.19599], + [80.709, 69.31468], + [79.84863, 69.37499], + [79.63028, 69.45152], + [79.46273, 69.65565], + [78.94294, 69.84553], + [79.5671, 70.12426], + [79.6701, 70.22881], + [80.23521, 70.42092], + [80.87516, 70.44277], + [80.64514, 70.4974], + [80.82298, 70.63015], + [80.65544, 70.69177], + [80.57785, 71.05199], + [80.00244, 71.12432], + [79.12284, 71.40814], + [79.37484, 71.60199], + [79.82185, 71.57988], + [80.14595, 71.6997], + [80.04364, 71.82455], + [80.36636, 71.87653], + [79.6241, 72.04662], + [79.37416, 72.02862], + [78.60992, 72.17045], + [78.40667, 72.33579], + [79, 72.5], + [78, 73], + [78, 74], + [70, 76], + [70, 85], + [115, 85] + ] + ] + }, + "properties": { "cqzone": "18" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "19": { + "mh": [ + "OO59", + "OO99", + "OP34", + "OP35", + "OP36", + "OP37", + "OP38", + "OP39", + "OP44", + "OP45", + "OP46", + "OP47", + "OP48", + "OP49", + "OP50", + "OP51", + "OP52", + "OP53", + "OP54", + "OP55", + "OP56", + "OP57", + "OP58", + "OP59", + "OP60", + "OP61", + "OP62", + "OP63", + "OP64", + "OP65", + "OP66", + "OP67", + "OP68", + "OP69", + "OP70", + "OP71", + "OP72", + "OP73", + "OP74", + "OP75", + "OP76", + "OP77", + "OP78", + "OP79", + "OP80", + "OP81", + "OP82", + "OP83", + "OP84", + "OP85", + "OP86", + "OP87", + "OP88", + "OP89", + "OP90", + "OP91", + "OP92", + "OP93", + "OP94", + "OP95", + "OP96", + "OP97", + "OP98", + "OP99", + "OQ50", + "OQ53", + "OQ60", + "OQ61", + "OQ62", + "OQ63", + "OQ70", + "OQ71", + "OQ72", + "OQ73", + "OQ80", + "OQ81", + "OQ82", + "OQ83", + "OQ90", + "OQ91", + "OQ92", + "PN58", + "PN59", + "PN63", + "PN64", + "PN68", + "PN69", + "PN74", + "PN75", + "PN76", + "PN77", + "PN78", + "PN79", + "PN85", + "PN86", + "PN87", + "PN88", + "PN89", + "PN97", + "PN98", + "PN99", + "PO06", + "PO07", + "PO08", + "PO09", + "PO13", + "PO14", + "PO15", + "PO16", + "PO17", + "PO18", + "PO19", + "PO23", + "PO24", + "PO25", + "PO26", + "PO27", + "PO28", + "PO29", + "PO31", + "PO32", + "PO33", + "PO34", + "PO35", + "PO36", + "PO37", + "PO38", + "PO39", + "PO40", + "PO41", + "PO42", + "PO43", + "PO44", + "PO45", + "PO46", + "PO47", + "PO48", + "PO49", + "PO50", + "PO51", + "PO52", + "PO53", + "PO54", + "PO55", + "PO56", + "PO57", + "PO58", + "PO59", + "PO60", + "PO61", + "PO62", + "PO63", + "PO64", + "PO65", + "PO66", + "PO67", + "PO68", + "PO69", + "PO70", + "PO71", + "PO72", + "PO73", + "PO74", + "PO75", + "PO76", + "PO77", + "PO78", + "PO79", + "PO80", + "PO81", + "PO82", + "PO83", + "PO86", + "PO87", + "PO88", + "PO89", + "PO90", + "PO91", + "PO92", + "PO93", + "PO97", + "PO98", + "PO99", + "PP00", + "PP01", + "PP02", + "PP03", + "PP04", + "PP05", + "PP06", + "PP07", + "PP08", + "PP09", + "PP10", + "PP11", + "PP12", + "PP13", + "PP14", + "PP15", + "PP16", + "PP17", + "PP18", + "PP19", + "PP20", + "PP21", + "PP22", + "PP23", + "PP24", + "PP25", + "PP26", + "PP27", + "PP28", + "PP29", + "PP30", + "PP31", + "PP32", + "PP33", + "PP34", + "PP35", + "PP36", + "PP37", + "PP38", + "PP39", + "PP40", + "PP41", + "PP42", + "PP43", + "PP44", + "PP45", + "PP46", + "PP47", + "PP48", + "PP49", + "PP50", + "PP51", + "PP52", + "PP53", + "PP54", + "PP55", + "PP56", + "PP57", + "PP58", + "PP59", + "PP60", + "PP61", + "PP62", + "PP63", + "PP64", + "PP65", + "PP66", + "PP67", + "PP68", + "PP69", + "PP70", + "PP71", + "PP72", + "PP73", + "PP74", + "PP75", + "PP76", + "PP77", + "PP78", + "PP79", + "PP80", + "PP81", + "PP82", + "PP83", + "PP84", + "PP85", + "PP86", + "PP87", + "PP88", + "PP89", + "PP90", + "PP91", + "PP92", + "PP93", + "PP94", + "PP95", + "PP96", + "PP97", + "PP98", + "PP99", + "PQ00", + "PQ01", + "PQ02", + "PQ10", + "PQ11", + "PQ12", + "PQ20", + "PQ21", + "PQ22", + "PQ23", + "PQ30", + "PQ31", + "PQ32", + "PQ33", + "PQ40", + "PQ41", + "PQ50", + "PQ60", + "PQ61", + "PQ70", + "PQ71", + "PQ80", + "PQ90", + "PQ91", + "PQ95", + "QN19", + "QO02", + "QO08", + "QO09", + "QO10", + "QO11", + "QO12", + "QO19", + "QO29", + "QO39", + "QO49", + "QO69", + "QO81", + "QO82", + "QO83", + "QO84", + "QO85", + "QO86", + "QO87", + "QO93", + "QO94", + "QO95", + "QO96", + "QO97", + "QO98", + "QP00", + "QP01", + "QP02", + "QP03", + "QP04", + "QP05", + "QP06", + "QP07", + "QP08", + "QP09", + "QP10", + "QP11", + "QP12", + "QP13", + "QP14", + "QP15", + "QP16", + "QP17", + "QP18", + "QP19", + "QP20", + "QP21", + "QP22", + "QP23", + "QP24", + "QP25", + "QP26", + "QP27", + "QP28", + "QP29", + "QP30", + "QP31", + "QP32", + "QP33", + "QP34", + "QP35", + "QP36", + "QP37", + "QP38", + "QP39", + "QP40", + "QP41", + "QP42", + "QP43", + "QP44", + "QP45", + "QP46", + "QP47", + "QP48", + "QP49", + "QP50", + "QP51", + "QP52", + "QP53", + "QP54", + "QP55", + "QP56", + "QP57", + "QP58", + "QP59", + "QP60", + "QP61", + "QP62", + "QP63", + "QP64", + "QP65", + "QP66", + "QP67", + "QP68", + "QP69", + "QP70", + "QP71", + "QP72", + "QP73", + "QP74", + "QP75", + "QP76", + "QP77", + "QP78", + "QP79", + "QP81", + "QP82", + "QP83", + "QP84", + "QP85", + "QP86", + "QP87", + "QP88", + "QP89", + "QP92", + "QP93", + "QP94", + "QP95", + "QP96", + "QP97", + "QP98", + "QP99", + "QQ00", + "QQ01", + "QQ02", + "QQ05", + "QQ10", + "QQ11", + "QQ12", + "QQ15", + "QQ20", + "QQ21", + "QQ22", + "QQ30", + "QQ31", + "QQ40", + "QQ41", + "QQ50", + "QQ60", + "QQ70", + "QQ80", + "QQ90", + "RO05", + "RO06", + "RO07", + "RO08", + "RO09", + "RO16", + "RO17", + "RO19", + "RP01", + "RP02", + "RP03", + "RP04", + "RP05", + "RP06", + "RP07", + "RP08", + "RP10", + "RP12", + "RP13", + "RP14", + "RP15", + "RP16", + "RP17", + "RP18", + "RP19", + "RP20", + "RP21", + "RP22", + "RP23", + "RP24", + "RP25", + "RP26", + "RP27", + "RP28", + "RP29", + "RP30", + "RP31", + "RP32", + "RP33", + "RP34", + "RP35", + "RP36", + "RP37", + "RP38", + "RP39", + "RP41", + "RP42", + "RP43", + "RP44", + "RP45", + "RP46", + "RP47", + "RP48", + "RP50", + "RP51", + "RP52", + "RP53", + "RP54", + "RP55", + "RP56", + "RP57", + "RP58", + "RP59", + "RP61", + "RP62", + "RP63", + "RP64", + "RP65", + "RP66", + "RP67", + "RP68", + "RP69", + "RP72", + "RP73", + "RP74", + "RP75", + "RP76", + "RP77", + "RP78", + "RP79", + "RP82", + "RP83", + "RP84", + "RP85", + "RP86", + "RP87", + "RP88", + "RP89", + "RP92", + "RP95", + "RP96", + "RP97", + "RP98", + "QQ13", + "QQ03", + "QQ25", + "AQ01", + "AP08", + "AP36", + "AP46", + "AP34", + "AP35", + "AP26", + "AP07", + "AP17", + "AP16", + "AP06", + "AP15", + "AP25", + "OO49", + "OO79", + "OO89", + "OO96", + "OO97", + "OO98", + "OP24", + "OP25", + "OP26", + "OP27", + "OP40", + "OP41", + "OP42", + "OP43", + "OQ40", + "OQ51", + "OQ52", + "OQ93", + "PN39", + "PN49", + "PN53", + "PN54", + "PN55", + "PN57", + "PN65", + "PN66", + "PN67", + "PN73", + "PN84", + "PN96", + "PO03", + "PO04", + "PO05", + "PO22", + "PO30", + "PO84", + "PO85", + "PO94", + "PO96", + "PQ03", + "PQ13", + "PQ42", + "PQ43", + "PQ51", + "PQ81", + "PQ84", + "PQ85", + "PQ86", + "PQ92", + "PQ94", + "PQ96", + "QN06", + "QN07", + "QN08", + "QN09", + "QN16", + "QN17", + "QN18", + "QN29", + "QO00", + "QO01", + "QO03", + "QO04", + "QO07", + "QO13", + "QO18", + "QO20", + "QO58", + "QO59", + "QO68", + "QO73", + "QO74", + "QO75", + "QO76", + "QO79", + "QO91", + "QO92", + "QO99", + "QP80", + "QP90", + "QP91", + "QQ04", + "QQ06", + "QQ14", + "QQ16", + "QQ32", + "QQ34", + "QQ35", + "QQ42", + "QQ44", + "QQ45", + "QQ51", + "QQ54", + "QQ55", + "QQ61", + "RO04", + "RO15", + "RO18", + "RO29", + "RP00", + "RP09", + "RP11", + "RP40", + "RP49", + "RP60", + "RP71", + "RP93", + "RP94", + "RP99", + "RO03", + "AQ00", + "AP18", + "AP27", + "AP37", + "AP56", + "AP45", + "AP05", + "AP24", + "AP55", + "PN52", + "PN62", + "OO69", + "OO68", + "PQ93", + "RQ90", + "RQ91", + "RO35", + "RO25", + "RO34", + "AQ11", + "QO80", + "PQ75", + "PQ74", + "PQ83", + "PQ73", + "QQ46", + "QQ66", + "QQ87", + "RQ00", + "RQ10", + "RQ40", + "RQ50", + "RQ60", + "OQ64", + "QN15", + "QN05", + "QN28", + "QO14", + "PO95", + "QO70", + "QN79", + "QN78", + "QN68", + "PQ82", + "PQ72", + "PQ62", + "PQ52", + "PQ53", + "PQ63", + "QQ24", + "QQ23", + "QQ33", + "QQ43", + "QQ53", + "QQ52", + "RQ01", + "QQ91", + "QQ81", + "QQ71", + "OO58", + "OO48" + ], + "worked": false, + "confirmed": false, + "name": "Eastern Siberian Zone", + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [115, 85], + [180, 85], + [180, 75], + [192.31292, 66.66712], + [170, 53], + [170, 40], + [160, 40], + [146.16455, 43.26843], + [145.54187, 43.542], + [145.22612, 43.82251], + [146.49147, 45.73822], + [139.77955, 45.73822], + [136.66227, 42.24603], + [130.77271, 42.24603], + [130.64067, 42.41543], + [130.58362, 42.67108], + [130.39422, 42.72447], + [130.67053, 42.85482], + [131.04022, 42.8623], + [131.21187, 43.14579], + [131.30937, 43.45761], + [131.19312, 43.5256], + [131.23493, 43.98083], + [131.30002, 44.05154], + [131.11215, 44.7], + [130.96225, 44.86187], + [131.28863, 44.92558], + [131.69391, 45.12661], + [131.87603, 45.34376], + [131.98167, 45.25696], + [132.95228, 45.01758], + [133.12751, 45.125], + [133.19726, 45.50587], + [133.46806, 45.60771], + [133.48069, 45.85933], + [133.73886, 46.066], + [133.68503, 46.15081], + [133.91045, 46.26409], + [133.84179, 46.4545], + [134.00368, 46.63752], + [134.13997, 47.2587], + [134.31207, 47.43612], + [134.48189, 47.44023], + [134.78445, 47.72518], + [134.54319, 48.02859], + [134.76885, 48.37548], + [134.48982, 48.42236], + [133.74069, 48.24982], + [133.48663, 48.07303], + [133.04031, 48.10055], + [132.81097, 47.9329], + [132.70248, 47.96188], + [132.5782, 47.72593], + [132.28843, 47.74717], + [131.96846, 47.66816], + [131.26945, 47.73701], + [130.95222, 47.72916], + [130.95016, 47.82744], + [130.65559, 48.11201], + [130.83412, 48.29826], + [130.72151, 48.51387], + [130.52993, 48.63653], + [130.68237, 48.85568], + [130.22163, 48.86652], + [129.84672, 49.10084], + [129.52262, 49.41365], + [129.06738, 49.36225], + [128.75564, 49.47526], + [128.79135, 49.58133], + [128.53317, 49.60092], + [128.06899, 49.53813], + [127.79983, 49.59068], + [127.52037, 49.82026], + [127.50183, 50.06022], + [127.59796, 50.23842], + [127.37068, 50.28846], + [127.36381, 50.58716], + [127.11113, 50.93376], + [126.91749, 51.05779], + [126.97448, 51.307], + [126.77742, 51.43945], + [126.83509, 51.53138], + [126.44989, 52.03264], + [126.55082, 52.13433], + [126.3002, 52.20339], + [126.42654, 52.29672], + [125.60668, 53.08041], + [125.20431, 53.19204], + [124.403, 53.22864], + [124.23133, 53.37718], + [123.88801, 53.47783], + [123.26866, 53.56111], + [122.82165, 53.45453], + [122.11303, 53.4304], + [121.98532, 53.54602], + [121.94206, 53.82821], + [121.63581, 54.02995], + [121.74568, 54.44249], + [121.92901, 54.37775], + [122.12265, 54.4824], + [121.92283, 54.58081], + [121.89468, 54.81137], + [121.67701, 54.72858], + [121.66259, 54.83352], + [121.94686, 55.0044], + [121.97982, 55.49324], + [121.87477, 55.61636], + [121.33094, 55.52435], + [121.26159, 56.02179], + [120.99723, 56.04711], + [120.35316, 55.87762], + [120.10734, 55.86683], + [120.02288, 56.13024], + [120.52482, 56.3013], + [120.27488, 56.46666], + [119.94323, 56.50078], + [119.87319, 56.6732], + [119.66789, 56.75874], + [119.86427, 56.90187], + [119.57107, 57.03811], + [119.67544, 57.17422], + [119.28886, 57.60275], + [119.07119, 57.72945], + [119.18312, 58.03937], + [119.10827, 58.51701], + [118.7677, 58.62978], + [118.8446, 58.73222], + [118.80546, 59.05185], + [118.67912, 59.1921], + [118.82469, 59.32793], + [118.73954, 59.44053], + [118.37425, 59.51481], + [118.33442, 59.62853], + [118.04466, 59.6379], + [117.919, 59.45624], + [117.77824, 59.56563], + [117.24678, 59.51899], + [117.12043, 59.61394], + [117.22549, 59.86895], + [117.01881, 59.91373], + [117.29141, 60.0525], + [117.00439, 60.06312], + [116.92886, 60.20673], + [116.59034, 60.38536], + [116.33697, 60.37823], + [115.6826, 60.5485], + [115.22529, 60.49274], + [114.99733, 60.22276], + [114.67735, 60.1842], + [114.57641, 59.9952], + [114.3251, 59.91063], + [114.16511, 59.75639], + [113.60893, 59.60804], + [113.43864, 59.41329], + [113.5231, 59.34684], + [113.27316, 59.16079], + [112.78633, 59.12029], + [112.47459, 58.90003], + [112.45056, 59.1453], + [112.65174, 59.32793], + [112.28576, 59.31111], + [112.23564, 59.52735], + [111.95755, 59.29289], + [111.6616, 59.23112], + [111.46659, 59.29324], + [111.22558, 59.20968], + [110.7257, 59.27956], + [110.49018, 59.05291], + [110.17776, 58.98859], + [109.82482, 58.99531], + [109.50073, 59.30831], + [109.29611, 59.31812], + [109.2659, 59.46496], + [109.54399, 59.66843], + [109.48356, 59.76988], + [109.66415, 59.87791], + [109.69505, 60.09326], + [109.91478, 60.46601], + [110.10154, 60.55997], + [110.08712, 60.69839], + [110.30273, 60.71687], + [110.26016, 60.8342], + [110.47508, 60.99309], + [110.54718, 61.1694], + [110.2169, 61.17337], + [110.1139, 61.28607], + [109.76852, 61.33584], + [109.80835, 61.61455], + [109.61128, 61.73998], + [109.58793, 61.91568], + [110.00198, 62.19626], + [109.87976, 62.44092], + [109.45747, 62.4263], + [109.25148, 62.58828], + [109.6717, 62.83602], + [109.53575, 63.00232], + [109.41352, 63.37798], + [109.14436, 63.56139], + [108.54011, 63.6368], + [108.15696, 63.59866], + [108.3815, 63.86064], + [108.8134, 63.86971], + [108.76464, 64.00908], + [108.525, 64.13876], + [108.42681, 64.3173], + [107.89466, 64.19203], + [107.69485, 64.29795], + [107.33505, 64.26964], + [107.27119, 64.34377], + [106.57562, 64.47013], + [106.07643, 64.4417], + [106.00982, 64.53958], + [105.77293, 64.49261], + [105.67886, 64.68442], + [105.85464, 64.68442], + [105.9336, 64.90753], + [106.20414, 64.87839], + [105.95832, 65.04259], + [106.29684, 65.14438], + [106.43554, 65.321], + [106.84341, 65.40115], + [106.95602, 65.50442], + [106.41014, 65.67213], + [106.50833, 65.99903], + [106.32843, 66.15412], + [106.1087, 66.19434], + [106.14303, 66.40987], + [106.32499, 66.48122], + [106.19247, 66.79569], + [105.52917, 67.01547], + [105.94596, 67.0345], + [106.07986, 67.16222], + [106.81732, 67.3425], + [106.90727, 68.17844], + [106.9004, 68.85732], + [106.15058, 69.40979], + [106.48567, 69.57649], + [106.8386, 69.51962], + [107.63374, 69.66352], + [107.97775, 69.68618], + [108.25309, 69.84908], + [108.89579, 69.83843], + [109.21371, 69.75449], + [109.54399, 70.00721], + [109.30023, 70.20929], + [109.6202, 70.28402], + [109.56459, 70.35455], + [110.2938, 70.40504], + [110.13038, 70.47332], + [110.12558, 70.63516], + [111.34231, 70.86133], + [111.45561, 70.91551], + [112.24319, 71.00377], + [112.57621, 71.11943], + [112.70668, 71.25914], + [112.0008, 71.41011], + [111.99531, 72.10853], + [111.68838, 72.1757], + [111.5483, 72.32516], + [111.31073, 72.31057], + [110.9983, 72.44029], + [111.28463, 72.48974], + [110.74424, 72.65958], + [110.62339, 72.88289], + [110.86715, 72.92608], + [110.65841, 72.99048], + [110.84449, 73.16297], + [110.36659, 73.15839], + [110.59318, 73.24353], + [110.50254, 73.33061], + [110.11322, 73.40529], + [110.63919, 73.42842], + [110.90629, 73.58088], + [111.27708, 73.61249], + [110.81153, 73.71697], + [112, 74], + [110.88081, 74.28234], + [115, 75.5], + [115, 85] + ] + ] + }, + "properties": { "cqzone": "19" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "20": { + "mh": [ + "KM35", + "KM36", + "KN10", + "KN11", + "KN12", + "KN13", + "KN14", + "KN21", + "KN22", + "KN23", + "KN31", + "KN32", + "KN33", + "KN34", + "KM08", + "KM09", + "KM16", + "KM17", + "KM18", + "KM19", + "KM37", + "KM38", + "KM39", + "KN00", + "KN05", + "KN15", + "KN16", + "KN17", + "KN24", + "KN25", + "KN26", + "KN27", + "KN35", + "KN36", + "KN37", + "KM71", + "KM70", + "KL79", + "KM72", + "KM80", + "KM81", + "KM82", + "KM92", + "KM93", + "KM83", + "KM84", + "KM85", + "KM95", + "KM86", + "KM96", + "LM06", + "LM07", + "LM17", + "LM05", + "LM04", + "KM94", + "KM47", + "KM48", + "KM49", + "KM57", + "KM58", + "KM59", + "KM66", + "KM67", + "KM68", + "KM69", + "KM77", + "KM78", + "KM79", + "KM87", + "KM88", + "KM89", + "KM97", + "KM98", + "KM99", + "KN40", + "KN50", + "KN60", + "KN61", + "KN70", + "KN71", + "KN80", + "KN90", + "LM08", + "LM09", + "LM18", + "LM19", + "LN00", + "LN10", + "KM24", + "KM25", + "KM34", + "KN41", + "KN43", + "KM64", + "KM65", + "KM74", + "KM75", + "KM06", + "KM07", + "KM27", + "KM28", + "KN01", + "KN20", + "KN30", + "KM46", + "KN04", + "KN06", + "KN07", + "KN28", + "KN38", + "KN44", + "KN45", + "KN46", + "KM73", + "KL89", + "KM91", + "LM16", + "KM56", + "KM76", + "KN51", + "KN81", + "LM27", + "LM28", + "LM29", + "LN01", + "LN11", + "LN20", + "KN91", + "KM15", + "KN18", + "KN72", + "KN62", + "KM26", + "KM29" + ], + "worked": false, + "confirmed": false, + "name": "Balkan Zone", + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [39.30908, 42.25698], + [41.82289, 41.43346], + [41.96296, 41.52503], + [42.51983, 41.43706], + [42.5782, 41.56768], + [42.83363, 41.58617], + [43.0204, 41.37938], + [43.21472, 41.30411], + [43.22914, 41.17348], + [43.44749, 41.17761], + [43.46809, 41.03171], + [43.67065, 40.93841], + [43.74549, 40.69729], + [43.54362, 40.47724], + [43.71391, 40.16208], + [43.89656, 40.02551], + [44.35386, 40.02603], + [44.61273, 39.7811], + [44.46716, 39.68341], + [44.42184, 39.41179], + [44.03251, 39.37305], + [44.2131, 39.13006], + [44.31404, 38.80707], + [44.32846, 38.36965], + [44.39643, 38.24087], + [44.22203, 37.88894], + [44.58801, 37.76365], + [44.61959, 37.43779], + [44.7995, 37.30846], + [44.25087, 36.9828], + [44.26803, 37.24563], + [44.01947, 37.32812], + [43.91922, 37.22267], + [43.51341, 37.23907], + [43.15223, 37.3707], + [42.78831, 37.37997], + [42.57408, 37.1417], + [42.46559, 37.1417], + [41.81716, 36.58777], + [41.39944, 36.52377], + [41.28244, 36.34767], + [41.25574, 36.05957], + [41.38222, 35.62549], + [41.26806, 35.48472], + [41.20874, 35.14277], + [41.22751, 34.7786], + [40.97774, 34.39802], + [40.64011, 34.31517], + [38.7936, 33.37468], + [39.08623, 32.50159], + [39.04367, 32.30411], + [39.25999, 32.35559], + [39.30115, 32.23026], + [38.99592, 31.99646], + [37.00089, 31.50011], + [37.99715, 30.5006], + [37.66554, 30.33265], + [37.50011, 30.00013], + [36.75338, 29.86833], + [36.50453, 29.49994], + [36.07009, 29.18503], + [34.89532, 29.3726], + [34.84856, 29.75875], + [34.49696, 30.67964], + [34.21791, 31.32478], + [19, 35], + [19, 40], + [19.75, 40], + [19.96902, 39.79482], + [19.95391, 39.68605], + [20.22926, 39.64905], + [20.41603, 39.84123], + [20.31234, 39.99079], + [20.67626, 40.09645], + [20.84312, 40.47933], + [21.05735, 40.66553], + [20.98388, 40.85433], + [21.5689, 40.86731], + [21.75361, 40.92544], + [22.0626, 41.16056], + [22.41622, 41.11919], + [22.74787, 41.16263], + [22.76573, 41.32526], + [22.93602, 41.33815], + [22.95112, 41.64315], + [23.03283, 41.7088], + [22.86598, 42.02277], + [22.50961, 42.15475], + [22.36679, 42.32403], + [22.56042, 42.48323], + [22.43888, 42.56572], + [22.53707, 42.882], + [22.74478, 42.88627], + [23.00502, 43.1854], + [22.5333, 43.47135], + [22.35717, 43.8105], + [22.41004, 44.00343], + [22.61947, 44.06366], + [22.67303, 44.28453], + [22.45605, 44.47691], + [22.76641, 44.54252], + [22.46841, 44.71453], + [22.18002, 44.48181], + [21.996, 44.63348], + [21.62796, 44.66083], + [21.36154, 44.86657], + [21.55929, 44.89187], + [21.36154, 45.02306], + [21.51123, 45.17429], + [21.09924, 45.29904], + [20.83007, 45.48131], + [20.80535, 45.7474], + [20.40298, 45.9626], + [20.26222, 46.12132], + [20.63095, 46.12846], + [20.87402, 46.28764], + [21.16996, 46.29713], + [21.31347, 46.61737], + [21.52908, 46.72103], + [22.02484, 47.52183], + [22.26242, 47.73054], + [22.68127, 47.78778], + [22.89688, 47.95314], + [23.26973, 48.10147], + [23.33221, 48.02253], + [24.01062, 47.96785], + [24.23378, 47.89793], + [24.6231, 47.95176], + [24.88197, 47.72362], + [25.0399, 47.72639], + [25.31112, 47.91496], + [26.18522, 47.99405], + [26.32873, 48.17799], + [26.8087, 48.25439], + [27.16438, 47.99543], + [27.25158, 47.71761], + [27.5386, 47.48844], + [27.78236, 47.13929], + [28.09684, 46.97931], + [28.25065, 46.61501], + [28.08792, 46.00936], + [28.17581, 45.64764], + [28.08929, 45.60875], + [28.34335, 45.32415], + [28.7107, 45.22219], + [29.42894, 45.4423], + [29.7924, 45.18344], + [39.30908, 42.25698] + ] + ] + }, + "properties": { "cqzone": "20" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "21": { + "mh": [ + "LL47", + "ML09", + "ML19", + "ML29", + "ML39", + "MM00", + "MM01", + "MM02", + "MM03", + "MM04", + "MM05", + "MM10", + "MM11", + "MM12", + "MM13", + "MM14", + "MM20", + "MM21", + "MM22", + "MM23", + "MM24", + "MM25", + "MM26", + "MM30", + "MM31", + "MM32", + "MM33", + "MM34", + "MM35", + "MM36", + "MM41", + "MM42", + "MM43", + "MM44", + "MM45", + "MM46", + "MM53", + "MM54", + "MM55", + "MM56", + "MM57", + "MM66", + "MM76", + "LM29", + "LM38", + "LM39", + "LN11", + "LN20", + "LN21", + "LM28", + "LM49", + "LN30", + "LN31", + "LN40", + "LN12", + "LN22", + "LL59", + "LL67", + "LL68", + "LL69", + "LL77", + "LL78", + "LL79", + "LL87", + "LL88", + "LL89", + "LL96", + "LL97", + "LL98", + "LL99", + "LM23", + "LM24", + "LM25", + "LM26", + "LM27", + "LM30", + "LM31", + "LM32", + "LM33", + "LM34", + "LM35", + "LM36", + "LM37", + "LM40", + "LM41", + "LM42", + "LM43", + "LM44", + "LM45", + "LM46", + "LM47", + "LM50", + "LM51", + "LM52", + "LM53", + "LM54", + "LM55", + "LM56", + "LM60", + "LM61", + "LM62", + "LM63", + "LM64", + "LM65", + "LM66", + "LM70", + "LM71", + "LM72", + "LM73", + "LM74", + "LM75", + "LM76", + "LM77", + "LM80", + "LM81", + "LM82", + "LM83", + "LM84", + "LM85", + "LM86", + "LM87", + "LM90", + "LM91", + "LM92", + "LM93", + "LM94", + "LM95", + "LM96", + "ML05", + "ML06", + "ML07", + "ML08", + "ML16", + "ML17", + "ML18", + "LL19", + "LL29", + "LL39", + "LM01", + "LM02", + "LM03", + "LM10", + "LM11", + "LM12", + "LM13", + "LM14", + "LM15", + "LM16", + "LM20", + "LM21", + "LM22", + "LL38", + "LK67", + "LK68", + "LK69", + "LK77", + "LK78", + "LK79", + "LK89", + "LL70", + "LL71", + "LL72", + "LL73", + "LL74", + "LL80", + "LL81", + "LL82", + "LL83", + "LL91", + "LL92", + "ML15", + "ML25", + "ML26", + "ML27", + "ML28", + "ML35", + "ML36", + "ML37", + "ML38", + "ML44", + "ML45", + "ML46", + "ML47", + "ML48", + "ML49", + "ML54", + "ML58", + "ML59", + "ML69", + "MM40", + "MM50", + "MM51", + "MM52", + "MM60", + "MM61", + "MM62", + "MM63", + "MM64", + "MM65", + "MM75", + "MM85", + "LL54", + "KL78", + "KL85", + "KL86", + "KL87", + "KL88", + "KL89", + "KL93", + "KL94", + "KL95", + "KL96", + "KL97", + "KL98", + "KL99", + "KM90", + "KM91", + "LK09", + "LK17", + "LK18", + "LK19", + "LK26", + "LK27", + "LK28", + "LK29", + "LK36", + "LK37", + "LK38", + "LK39", + "LK47", + "LK48", + "LK49", + "LK58", + "LK59", + "LL00", + "LL01", + "LL02", + "LL03", + "LL04", + "LL05", + "LL06", + "LL07", + "LL08", + "LL09", + "LL10", + "LL11", + "LL12", + "LL13", + "LL14", + "LL15", + "LL16", + "LL17", + "LL18", + "LL20", + "LL21", + "LL22", + "LL23", + "LL24", + "LL25", + "LL26", + "LL27", + "LL28", + "LL30", + "LL31", + "LL32", + "LL33", + "LL34", + "LL35", + "LL36", + "LL37", + "LL40", + "LL41", + "LL42", + "LL43", + "LL44", + "LL45", + "LL46", + "LL50", + "LL51", + "LL52", + "LL53", + "LL60", + "LL61", + "LL62", + "LL63", + "LM00", + "LK16", + "LK14", + "LK15", + "LK23", + "LK24", + "LK25", + "LK33", + "LK34", + "LK35", + "LK44", + "LK45", + "LK46", + "LK55", + "LK56", + "LK57", + "MM15", + "MM16", + "MM27", + "MM37", + "MM47", + "MM67", + "MM77", + "LN10", + "LM48", + "LN41", + "LN01", + "LN02", + "LN03", + "LN13", + "LN32", + "LL56", + "LL57", + "LL58", + "LL66", + "LL76", + "LL85", + "LL86", + "LL95", + "LM57", + "LM67", + "LM97", + "MM06", + "LL49", + "KM92", + "KM93", + "LM04", + "LM05", + "LM06", + "LM17", + "LL48", + "LK66", + "LK76", + "LK87", + "LK88", + "LL84", + "LL90", + "LL93", + "ML33", + "ML34", + "ML43", + "ML55", + "ML56", + "ML57", + "ML68", + "MM70", + "MM71", + "MM72", + "MM73", + "MM74", + "MM84", + "MM86", + "KL76", + "KL77", + "KL79", + "KL84", + "KL90", + "KL91", + "KL92", + "KM80", + "KM81", + "LK07", + "LK08", + "LL64", + "LL75", + "LK12", + "LK13", + "LK22", + "LK43", + "LK54", + "LK65", + "LN50", + "LM88", + "MM58", + "LM78", + "ML04", + "LL94", + "LL65", + "LL55" + ], + "worked": false, + "confirmed": false, + "name": "Southwestern Zone of Asia", + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [39.30908, 42.25698], + [40.00671, 43.38109], + [40.09048, 43.55601], + [40.66108, 43.56347], + [40.94879, 43.42051], + [41.36146, 43.36961], + [41.61758, 43.22219], + [42.45872, 43.21218], + [42.86041, 43.17864], + [43.20373, 42.93078], + [43.5601, 42.8674], + [43.80523, 42.72179], + [43.71391, 42.63446], + [43.96316, 42.54802], + [44.31266, 42.72229], + [44.67796, 42.7576], + [44.82833, 42.61779], + [44.8867, 42.74701], + [45.15724, 42.70716], + [45.35224, 42.52221], + [45.77179, 42.48931], + [45.61042, 42.21122], + [45.95512, 42.02481], + [46.39938, 41.93855], + [46.7633, 41.79947], + [47.11074, 41.59387], + [47.25837, 41.33918], + [47.5653, 41.19829], + [47.88185, 41.21895], + [48.07617, 41.50034], + [48.37417, 41.58925], + [48.58017, 41.85166], + [49, 42], + [53.90922, 37.34778], + [54.2443, 37.32048], + [54.79774, 37.52334], + [54.82589, 37.72619], + [55.13076, 37.95069], + [55.46516, 38.09511], + [55.80986, 38.12591], + [56.33377, 38.07782], + [56.41067, 38.25327], + [56.75125, 38.28454], + [57.06298, 38.1826], + [57.24426, 38.27376], + [57.34931, 37.98696], + [57.72216, 37.92415], + [58.20488, 37.77397], + [58.22891, 37.68327], + [58.74115, 37.63109], + [58.82011, 37.6974], + [59.22866, 37.51353], + [59.35432, 37.52824], + [59.39758, 37.31502], + [59.55894, 37.13185], + [60.04303, 37.02174], + [60.34309, 36.62985], + [61.13754, 36.64473], + [61.22818, 36.11957], + [61.11969, 35.96744], + [61.25907, 35.83395], + [61.21513, 35.68128], + [61.58866, 35.43773], + [62.06451, 35.43437], + [62.26638, 35.29663], + [62.30484, 35.12833], + [62.4765, 35.27813], + [62.62619, 35.21028], + [63.09379, 35.42039], + [63.0931, 35.62046], + [63.2476, 35.68072], + [63.09928, 35.81948], + [63.53599, 35.90295], + [64.28237, 36.15173], + [64.57969, 36.35052], + [64.61883, 36.63591], + [64.79873, 36.92299], + [64.75547, 37.11324], + [65.13244, 37.24618], + [65.53207, 37.23907], + [65.70167, 37.53586], + [66.06971, 37.44978], + [66.31759, 37.32157], + [67.04544, 37.38052], + [67.2583, 37.18384], + [67.74581, 37.21009], + [68.02459, 36.92354], + [68.29376, 37.09845], + [68.95912, 37.3172], + [69.24682, 37.09407], + [69.43496, 37.20955], + [69.48646, 37.52116], + [69.90669, 37.6213], + [70.14358, 37.52334], + [70.30426, 37.69251], + [70.17105, 37.93174], + [70.27679, 37.94527], + [70.76911, 38.45681], + [70.99021, 38.49014], + [71.37405, 38.25705], + [71.25732, 37.92307], + [71.51962, 37.95286], + [71.59652, 37.80164], + [71.43035, 37.06065], + [71.59034, 36.73448], + [71.8444, 36.68218], + [72.36076, 36.99158], + [72.66082, 37.019], + [72.77343, 37.18931], + [73.30421, 37.46395], + [73.77525, 37.43888], + [73.61526, 37.27295], + [73.76152, 37.22267], + [74.22088, 37.34832], + [74.24217, 37.41598], + [74.68849, 37.40507], + [74.88967, 37.2336], + [74.50035, 37.23962], + [74.56558, 37.03161], + [74.70085, 37.08366], + [74.91714, 36.97842], + [75.14167, 37.02777], + [75.37445, 36.94659], + [75.46714, 36.71687], + [75.71845, 36.75318], + [75.9423, 36.59678], + [76.06246, 36.22599], + [75.93475, 36.13621], + [76.14418, 35.83785], + [76.56234, 35.82338], + [76.7752, 35.65952], + [76.7601, 35.51937], + [77.01622, 35.29943], + [77.11372, 35.05079], + [76.86927, 34.98331], + [76.68044, 34.75063], + [76.47033, 34.79801], + [76.16203, 34.63433], + [76.03225, 34.68573], + [75.78231, 34.51108], + [75.36621, 34.53767], + [75.26733, 34.63772], + [74.729, 34.68065], + [74.31083, 34.7811], + [74.14947, 34.66088], + [73.96957, 34.68573], + [73.88717, 34.45448], + [73.99841, 34.18113], + [73.8961, 34.05777], + [74.25384, 34.00428], + [74.27719, 33.89663], + [73.96133, 33.72205], + [74.19273, 33.47899], + [74.00528, 33.21973], + [74.32594, 33.03169], + [74.51065, 32.74743], + [74.70428, 32.84267], + [74.68093, 32.49123], + [75.10871, 32.47617], + [75.33737, 32.32195], + [75.27831, 32.11573], + [74.878, 32.05406], + [74.48593, 31.71765], + [74.65484, 31.45444], + [74.51202, 31.1329], + [74.67132, 31.05234], + [74.41795, 30.93933], + [73.88442, 30.36872], + [73.97232, 30.19736], + [73.80752, 30.06909], + [73.39759, 29.9472], + [73.28086, 29.57286], + [72.94509, 29.02795], + [72.40402, 28.7827], + [72.20626, 28.39442], + [71.92611, 28.12286], + [71.89933, 27.96105], + [71.66725, 27.87732], + [71.20239, 27.83421], + [70.75882, 27.72061], + [70.6771, 27.92101], + [70.37223, 28.01319], + [70.13671, 27.81296], + [70.02479, 27.56246], + [69.5874, 27.18257], + [69.51049, 26.74315], + [69.89502, 26.5787], + [70.17517, 26.55168], + [70.09826, 25.94199], + [70.2658, 25.71702], + [70.64758, 25.71331], + [70.66268, 25.39862], + [70.8879, 25.14777], + [71.09664, 24.68695], + [70.99777, 24.44715], + [71.12136, 24.40526], + [70.80825, 24.22129], + [70.56999, 24.25259], + [70.57205, 24.42151], + [70.11268, 24.30142], + [70.0241, 24.17181], + [69.73228, 24.17118], + [69.59426, 24.29203], + [68.852, 24.21565], + [68.76548, 24.28953], + [68.75175, 23.97307], + [68.34251, 23.96492], + [68.15918, 23.67408], + [67, 22], + [53.17382, 13.9234], + [44.20898, 11.26461], + [42.90161, 13.36289], + [42.52807, 13.5926], + [39.6967, 18.538], + [34.40918, 27.33273], + [34.45861, 27.95801], + [34.89532, 29.3726], + [36.07009, 29.18503], + [36.50453, 29.49994], + [36.75338, 29.86833], + [37.50011, 30.00013], + [37.66554, 30.33265], + [37.99715, 30.5006], + [37.00089, 31.50011], + [38.99592, 31.99646], + [39.30115, 32.23026], + [39.25999, 32.35559], + [39.04367, 32.30411], + [39.08623, 32.50159], + [38.7936, 33.37468], + [40.64011, 34.31517], + [40.97774, 34.39802], + [41.22751, 34.7786], + [41.20874, 35.14277], + [41.26806, 35.48472], + [41.38222, 35.62549], + [41.25574, 36.05957], + [41.28244, 36.34767], + [41.39944, 36.52377], + [41.81716, 36.58777], + [42.46559, 37.1417], + [42.57408, 37.1417], + [42.78831, 37.37997], + [43.15223, 37.3707], + [43.51341, 37.23907], + [43.91922, 37.22267], + [44.01947, 37.32812], + [44.26803, 37.24563], + [44.25087, 36.9828], + [44.7995, 37.30846], + [44.61959, 37.43779], + [44.58801, 37.76365], + [44.22203, 37.88894], + [44.39643, 38.24087], + [44.32846, 38.36965], + [44.31404, 38.80707], + [44.2131, 39.13006], + [44.03251, 39.37305], + [44.42184, 39.41179], + [44.46716, 39.68341], + [44.61273, 39.7811], + [44.35386, 40.02603], + [43.89656, 40.02551], + [43.71391, 40.16208], + [43.54362, 40.47724], + [43.74549, 40.69729], + [43.67065, 40.93841], + [43.46809, 41.03171], + [43.44749, 41.17761], + [43.22914, 41.17348], + [43.21472, 41.30411], + [43.0204, 41.37938], + [42.83363, 41.58617], + [42.5782, 41.56768], + [42.51983, 41.43706], + [41.96296, 41.52503], + [41.82289, 41.43346], + [39.30908, 42.25698] + ] + ] + }, + "properties": { "cqzone": "21" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "22": { + "mh": [ + "MK60", + "MK61", + "MJ68", + "MJ63", + "MJ62", + "MJ61", + "MJ60", + "MJ64", + "MJ65", + "MJ66", + "NL42", + "NL43", + "NL44", + "NL45", + "NL46", + "NL53", + "NL54", + "NL55", + "NL62", + "NL63", + "NL64", + "NL65", + "NL47", + "NL56", + "NL57", + "NL66", + "NL67", + "NJ06", + "NJ07", + "NJ08", + "MJ88", + "MJ89", + "MK68", + "MK69", + "MK72", + "MK73", + "MK74", + "MK75", + "MK76", + "MK77", + "MK78", + "MK79", + "MK80", + "MK81", + "MK82", + "MK83", + "MK84", + "MK85", + "MK86", + "MK87", + "MK88", + "MK89", + "MK90", + "MK91", + "MK92", + "MK93", + "MK94", + "MK95", + "MK96", + "MK97", + "MK98", + "MK99", + "ML43", + "ML51", + "ML52", + "ML53", + "ML55", + "ML56", + "ML57", + "ML60", + "ML61", + "ML62", + "ML63", + "ML64", + "ML65", + "ML66", + "ML67", + "ML68", + "ML70", + "ML71", + "ML72", + "ML73", + "ML74", + "ML75", + "ML76", + "ML77", + "ML78", + "ML79", + "ML80", + "ML81", + "ML82", + "ML83", + "ML84", + "ML85", + "ML86", + "ML87", + "ML88", + "ML89", + "ML90", + "ML91", + "ML92", + "ML93", + "ML94", + "ML95", + "ML96", + "ML97", + "ML98", + "ML99", + "MM70", + "MM71", + "MM72", + "MM73", + "MM74", + "MM80", + "MM81", + "MM82", + "MM83", + "MM84", + "MM90", + "NK06", + "NK07", + "NK08", + "NK09", + "NK18", + "NK19", + "NK29", + "NL00", + "NL01", + "NL02", + "NL03", + "NL04", + "NL05", + "NL06", + "NL07", + "NL08", + "NL09", + "NL10", + "NL11", + "NL12", + "NL13", + "NL14", + "NL15", + "NL16", + "NL17", + "NL20", + "NL21", + "NL22", + "NL23", + "NL24", + "NL25", + "NL26", + "NL27", + "NL31", + "NL32", + "NL33", + "NL34", + "NL35", + "NL36", + "NL76", + "NL77", + "NL78", + "NL87", + "NL37", + "NL18", + "NL19", + "NL28", + "NL41", + "NL51", + "NL52", + "NL61", + "NL48", + "NL58", + "MJ96", + "MJ97", + "MJ98", + "MJ99", + "NJ09", + "MK65", + "MK66", + "MK67", + "MK70", + "MK71", + "ML41", + "ML42", + "ML44", + "ML46", + "ML47", + "ML54", + "ML58", + "ML69", + "MM60", + "MM85", + "MM91", + "MM92", + "MM93", + "MM94", + "MM95", + "NK02", + "NK03", + "NK04", + "NK05", + "NK16", + "NK17", + "NK28", + "NK39", + "NL30", + "NL68", + "NL73", + "NL74", + "NL75", + "NL79", + "NL88", + "NL89", + "NM00", + "MM64", + "MM63", + "NL29", + "NM10", + "NL38", + "MK62", + "MK52", + "MK51", + "MK50", + "MJ59", + "MJ69", + "MJ67", + "NL60", + "ML50", + "NJ05", + "MJ87", + "NK00", + "NK01", + "MI69", + "MI68" + ], + "worked": false, + "confirmed": false, + "name": "Southern Zone of Asia", + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [67, 22], + [68.15918, 23.67408], + [68.34251, 23.96492], + [68.75175, 23.97307], + [68.76548, 24.28953], + [68.852, 24.21565], + [69.59426, 24.29203], + [69.73228, 24.17118], + [70.0241, 24.17181], + [70.11268, 24.30142], + [70.57205, 24.42151], + [70.56999, 24.25259], + [70.80825, 24.22129], + [71.12136, 24.40526], + [70.99777, 24.44715], + [71.09664, 24.68695], + [70.8879, 25.14777], + [70.66268, 25.39862], + [70.64758, 25.71331], + [70.2658, 25.71702], + [70.09826, 25.94199], + [70.17517, 26.55168], + [69.89502, 26.5787], + [69.51049, 26.74315], + [69.5874, 27.18257], + [70.02479, 27.56246], + [70.13671, 27.81296], + [70.37223, 28.01319], + [70.6771, 27.92101], + [70.75882, 27.72061], + [71.20239, 27.83421], + [71.66725, 27.87732], + [71.89933, 27.96105], + [71.92611, 28.12286], + [72.20626, 28.39442], + [72.40402, 28.7827], + [72.94509, 29.02795], + [73.28086, 29.57286], + [73.39759, 29.9472], + [73.80752, 30.06909], + [73.97232, 30.19736], + [73.88442, 30.36872], + [74.41795, 30.93933], + [74.67132, 31.05234], + [74.51202, 31.1329], + [74.65484, 31.45444], + [74.48593, 31.71765], + [74.878, 32.05406], + [75.27831, 32.11573], + [75.33737, 32.32195], + [75.10871, 32.47617], + [74.68093, 32.49123], + [74.70428, 32.84267], + [74.51065, 32.74743], + [74.32594, 33.03169], + [74.00528, 33.21973], + [74.19273, 33.47899], + [73.96133, 33.72205], + [74.27719, 33.89663], + [74.25384, 34.00428], + [73.8961, 34.05777], + [73.99841, 34.18113], + [73.88717, 34.45448], + [73.96957, 34.68573], + [74.14947, 34.66088], + [74.31083, 34.7811], + [74.729, 34.68065], + [75.26733, 34.63772], + [75.36621, 34.53767], + [75.78231, 34.51108], + [76.03225, 34.68573], + [76.16203, 34.63433], + [76.47033, 34.79801], + [76.68044, 34.75063], + [76.86927, 34.98331], + [77.11372, 35.05079], + [77.01622, 35.29943], + [76.7601, 35.51937], + [76.7752, 35.65952], + [77.3822, 35.47297], + [77.8141, 35.5216], + [78.11965, 35.48024], + [78.00293, 35.24057], + [78.23776, 34.88086], + [78.28857, 34.61512], + [78.55018, 34.57216], + [79.04457, 34.32812], + [78.65593, 34.03445], + [78.74244, 34.00087], + [78.71772, 33.62319], + [78.83789, 33.42456], + [79.10636, 33.19962], + [79.41261, 33.17893], + [79.36386, 32.93781], + [79.55612, 32.76071], + [79.41124, 32.51786], + [79.27597, 32.55665], + [78.96972, 32.33413], + [78.78021, 32.48022], + [78.74862, 32.68966], + [78.395, 32.53755], + [78.51104, 32.30338], + [78.42865, 32.21222], + [78.76785, 31.94575], + [78.70262, 31.80756], + [78.84819, 31.60836], + [78.73077, 31.53348], + [78.79119, 31.30319], + [79.14207, 31.43276], + [79.3103, 31.1517], + [79.60281, 30.93933], + [79.74975, 31.00586], + [80.25238, 30.73947], + [80.21118, 30.5859], + [80.60531, 30.46998], + [81.02005, 30.25432], + [81.21849, 30.00608], + [81.39564, 30.20567], + [81.4286, 30.42144], + [81.61743, 30.44749], + [81.99302, 30.32073], + [82.08572, 30.36102], + [82.17155, 30.06612], + [82.56294, 29.95493], + [82.8321, 29.68864], + [83.21868, 29.6045], + [83.51806, 29.2169], + [83.63273, 29.15815], + [83.96438, 29.3307], + [84.20402, 29.23608], + [84.22462, 28.89518], + [84.41001, 28.84948], + [84.85977, 28.57185], + [85.0534, 28.68155], + [85.19897, 28.62732], + [85.10971, 28.3485], + [85.71121, 28.38656], + [85.9481, 27.94285], + [86.12388, 27.92708], + [86.18705, 28.17432], + [86.23512, 27.97439], + [86.41227, 27.90766], + [86.56265, 28.10832], + [87.03918, 27.94831], + [87.11265, 27.84332], + [87.5885, 27.85364], + [87.82333, 27.9198], + [88.13781, 27.89128], + [88.75579, 28.07985], + [88.88145, 27.89067], + [88.76403, 27.56793], + [88.97209, 27.30528], + [89.04007, 27.54906], + [89.38957, 27.89128], + [89.59625, 28.16221], + [90.05973, 28.34608], + [90.61248, 28.22878], + [90.45181, 28.04774], + [90.69145, 28.07985], + [91.21124, 27.98712], + [91.26274, 28.07137], + [91.6246, 27.89249], + [91.64451, 27.76315], + [91.92604, 27.71635], + [92.26799, 27.88703], + [92.32017, 27.79717], + [92.73147, 27.97984], + [92.67654, 28.14829], + [92.92099, 28.20216], + [93.42498, 28.66347], + [93.70651, 28.66408], + [94.36569, 29.02735], + [94.27505, 29.11437], + [94.69322, 29.31753], + [94.84771, 29.18333], + [95.27275, 29.07417], + [95.70877, 29.20072], + [95.73829, 29.29837], + [96.05278, 29.38456], + [96.30409, 29.19053], + [96.64054, 28.67793], + [96.92344, 28.35273], + [97.07656, 28.36904], + [97.34436, 28.21487], + [97.39654, 28.00834], + [96.9001, 27.61662], + [96.91383, 27.45771], + [97.17681, 27.14347], + [96.85821, 27.20212], + [96.77856, 27.35713], + [96.23268, 27.27416], + [96.04522, 27.19235], + [95.75683, 26.91104], + [95.44166, 26.70206], + [95.15121, 26.61492], + [95.11894, 26.1018], + [95.04547, 25.73929], + [94.68618, 25.4659], + [94.57786, 25.21426], + [94.73854, 25.13533], + [94.60601, 24.70878], + [94.45632, 24.5696], + [94.12948, 23.8312], + [93.75732, 24.00507], + [93.51287, 23.94295], + [93.33366, 24.09035], + [93.43597, 23.68603], + [93.31306, 23.01844], + [93.13041, 23.05003], + [93.10775, 22.52778], + [93.19839, 22.25605], + [93.04801, 22.20202], + [92.99514, 21.97743], + [92.69439, 22.14988], + [92.60307, 21.98125], + [92.67997, 21.28873], + [92.38197, 21.4799], + [92.19863, 21.32839], + [92.37098, 20.70281], + [90, 20], + [90, -3], + [67, -3], + [67, 22] + ] + ] + }, + "properties": { "cqzone": "22" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "23": { + "mh": [ + "NN49", + "NN59", + "NN79", + "NN89", + "NO41", + "NO50", + "NO51", + "NO60", + "NO61", + "NO70", + "NO71", + "NO72", + "NO80", + "NO81", + "NO82", + "NO83", + "NO91", + "ON39", + "ON69", + "ON79", + "ON89", + "ON99", + "PO01", + "PO02", + "NO90", + "MM77", + "MM78", + "MM79", + "MM86", + "MM87", + "MM88", + "MM89", + "MM91", + "MM92", + "MM93", + "MM94", + "MM95", + "MM96", + "MM97", + "MM98", + "MM99", + "MN80", + "MN90", + "MN91", + "NL29", + "NL38", + "NL39", + "NL48", + "NL49", + "NL58", + "NL59", + "NL68", + "NL69", + "NL79", + "NL88", + "NL89", + "NL99", + "NM00", + "NM01", + "NM02", + "NM03", + "NM04", + "NM05", + "NM06", + "NM07", + "NM08", + "NM09", + "NM10", + "NM11", + "NM12", + "NM13", + "NM14", + "NM15", + "NM16", + "NM17", + "NM18", + "NM19", + "NM20", + "NM21", + "NM22", + "NM23", + "NM24", + "NM25", + "NM26", + "NM27", + "NM28", + "NM29", + "NM30", + "NM31", + "NM32", + "NM33", + "NM34", + "NM35", + "NM36", + "NM37", + "NM38", + "NM39", + "NM40", + "NM41", + "NM42", + "NM43", + "NM44", + "NM45", + "NM46", + "NM47", + "NM48", + "NM49", + "NM50", + "NM51", + "NM52", + "NM53", + "NM54", + "NM55", + "NM56", + "NM57", + "NM58", + "NM59", + "NM60", + "NM61", + "NM62", + "NM63", + "NM64", + "NM65", + "NM66", + "NM67", + "NM68", + "NM69", + "NM70", + "NM71", + "NM72", + "NM73", + "NM74", + "NM75", + "NM76", + "NM77", + "NM78", + "NM79", + "NM80", + "NM81", + "NM82", + "NM83", + "NM84", + "NM85", + "NM86", + "NM87", + "NM88", + "NM89", + "NM93", + "NM94", + "NM95", + "NM96", + "NM97", + "NM98", + "NM99", + "NN00", + "NN01", + "NN02", + "NN03", + "NN04", + "NN10", + "NN11", + "NN12", + "NN13", + "NN14", + "NN15", + "NN16", + "NN20", + "NN21", + "NN22", + "NN23", + "NN24", + "NN25", + "NN26", + "NN30", + "NN31", + "NN32", + "NN33", + "NN34", + "NN35", + "NN36", + "NN37", + "NN38", + "NN40", + "NN41", + "NN42", + "NN43", + "NN44", + "NN45", + "NN46", + "NN47", + "NN48", + "NN50", + "NN51", + "NN52", + "NN53", + "NN54", + "NN55", + "NN56", + "NN57", + "NN60", + "NN61", + "NN62", + "NN63", + "NN64", + "NN65", + "NN70", + "NN71", + "NN72", + "NN73", + "NN74", + "NN80", + "NN81", + "NN82", + "NN83", + "NN90", + "NN91", + "NN92", + "OM03", + "OM04", + "OM05", + "OM06", + "OM07", + "OM08", + "OM09", + "OM14", + "OM15", + "OM16", + "OM17", + "OM18", + "OM19", + "OM23", + "OM24", + "OM25", + "OM26", + "OM27", + "OM28", + "OM29", + "OM33", + "OM34", + "OM35", + "OM36", + "OM37", + "OM38", + "OM39", + "OM42", + "OM43", + "OM44", + "OM45", + "OM46", + "OM47", + "OM48", + "OM49", + "OM53", + "OM59", + "ON00", + "ON01", + "ON02", + "ON10", + "ON11", + "ON12", + "ON20", + "ON21", + "ON22", + "ON30", + "ON31", + "ON32", + "ON40", + "ON41", + "ON42", + "ON50", + "ON51", + "ON52", + "ON53", + "ON54", + "ON55", + "ON60", + "ON61", + "ON62", + "ON63", + "ON64", + "ON65", + "ON72", + "ON73", + "ON74", + "ON75", + "ON77", + "ON78", + "ON82", + "ON83", + "ON84", + "ON85", + "ON86", + "ON87", + "ON88", + "ON91", + "ON92", + "ON93", + "ON94", + "ON95", + "ON96", + "ON97", + "ON98", + "PN02", + "PN03", + "PN04", + "PN05", + "PN06", + "PN07", + "PN08", + "PN09", + "PN13", + "PN18", + "PN19", + "PN29", + "PO00", + "PO10", + "PO20", + "PO21", + "NN58", + "NN66", + "NN67", + "NN68", + "NN69", + "NN75", + "NN76", + "NN77", + "NN78", + "NN84", + "NN85", + "NN86", + "NN87", + "NN88", + "NN93", + "NN94", + "NN95", + "NN96", + "NN97", + "NN98", + "NN99", + "ON03", + "ON04", + "ON05", + "ON06", + "ON07", + "ON08", + "ON09", + "ON13", + "ON14", + "ON15", + "ON16", + "ON17", + "ON18", + "ON19", + "ON23", + "ON24", + "ON25", + "ON26", + "ON27", + "ON28", + "ON29", + "ON33", + "ON34", + "ON35", + "ON36", + "ON37", + "ON38", + "ON43", + "ON44", + "ON45", + "ON46", + "ON47", + "ON48", + "ON56", + "ON57", + "ON58", + "ON66", + "ON67", + "ON68", + "ON76", + "OO00", + "NN39", + "NO40", + "NO62", + "NO73", + "NO92", + "NO93", + "ON49", + "ON59", + "OO01", + "OO10", + "OO11", + "OO20", + "OO30", + "OO60", + "OO70", + "OO90", + "OO91", + "PO30", + "PO31", + "MM68", + "MM69", + "MM76", + "MM85", + "MM90", + "MN70", + "MN81", + "MN92", + "NL19", + "NL28", + "NL37", + "NL47", + "NL57", + "NL67", + "NL78", + "NL98", + "NM90", + "NM91", + "NM92", + "NN05", + "NN17", + "NN27", + "NN28", + "OM02", + "OM13", + "OM22", + "OM32", + "OM54", + "OM55", + "OM56", + "OM57", + "OM58", + "OM69", + "ON71", + "ON81", + "PN01", + "PN12", + "PN14", + "PN15", + "PN16", + "PN17", + "PN28", + "PO11", + "PO12", + "MN94", + "MN95", + "PO03", + "OO80", + "NO52", + "OM41", + "OM52" + ], + "worked": false, + "confirmed": false, + "name": "Central Zone of Asia", + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [121.47377, 53.33128], + [121.8164, 53.06102], + [121.60217, 52.82932], + [121.18743, 52.5947], + [121.64611, 52.44094], + [121.71752, 52.32023], + [121.94274, 52.28328], + [122.16247, 52.52457], + [122.47558, 52.30008], + [122.77496, 52.26647], + [122.63214, 52.13517], + [122.8656, 51.47625], + [123.29681, 51.25675], + [124.23339, 51.35291], + [124.6289, 51.32374], + [124.87335, 51.37692], + [125.13153, 51.63677], + [125.35949, 51.61972], + [126.06536, 50.97399], + [125.76873, 50.74862], + [125.8319, 50.56056], + [125.52703, 50.41201], + [125.45288, 50.22612], + [125.1892, 49.95652], + [125.26336, 49.44848], + [125.21392, 49.19247], + [124.91455, 49.18708], + [124.52453, 48.54934], + [124.57397, 48.25759], + [124.50531, 48.12026], + [124.26086, 48.53479], + [123.54126, 48.02483], + [123.29681, 47.95498], + [123.16497, 47.77994], + [122.57171, 47.5376], + [122.41516, 47.34254], + [122.64038, 47.11313], + [122.85736, 47.0645], + [122.92053, 46.79253], + [123.16772, 46.73421], + [123.22265, 46.85643], + [123.62365, 46.84892], + [123.59893, 46.69466], + [123.05236, 46.62869], + [123.00567, 46.44164], + [123.17596, 46.25014], + [123.04687, 46.09799], + [122.79693, 46.07323], + [122.79418, 45.7656], + [122.67883, 45.70809], + [122.43988, 45.91676], + [122.25036, 45.80008], + [121.83013, 46.02557], + [121.64337, 45.74836], + [121.95098, 45.71576], + [122.00592, 45.49864], + [122.16522, 45.44471], + [122.22564, 45.20719], + [122.04711, 44.90646], + [122.10205, 44.67646], + [122.28607, 44.47495], + [122.31353, 44.23339], + [122.68432, 44.2865], + [123.13201, 44.51021], + [123.12927, 44.36313], + [123.39019, 44.15659], + [123.32977, 44.03034], + [123.52478, 43.69568], + [123.30505, 43.54655], + [123.69506, 43.3751], + [123.57147, 43.00464], + [123.18695, 42.93832], + [123.23364, 42.83569], + [122.84637, 42.71473], + [122.57446, 42.82763], + [122.34649, 42.67839], + [121.92352, 42.66022], + [121.67083, 42.4417], + [121.31927, 42.45386], + [121.03637, 42.24681], + [120.75073, 42.22851], + [120.46783, 42.09822], + [120.09429, 41.69137], + [119.83886, 42.10229], + [119.50653, 42.38898], + [119.24285, 42.20614], + [119.38568, 42.04929], + [119.30877, 41.64213], + [119.40765, 41.49623], + [119.21264, 41.27987], + [118.85009, 41.36856], + [118.33923, 41.3397], + [118.31176, 41.56614], + [118.12225, 41.73442], + [118.28704, 41.76516], + [118.30902, 41.99624], + [118.11401, 42.03705], + [117.96844, 42.23868], + [118.02063, 42.38695], + [117.78717, 42.58746], + [117.46582, 42.60566], + [117.41638, 42.47007], + [117.00988, 42.45791], + [116.7984, 42.198], + [116.86431, 42.00644], + [116.54296, 41.93089], + [116.32049, 42.00032], + [116.02111, 41.78564], + [115.91125, 41.9411], + [115.31799, 41.69547], + [115.38116, 41.59285], + [114.91149, 41.61133], + [114.906, 42.01461], + [114.80163, 42.14915], + [114.57641, 42.13896], + [114.50775, 41.97991], + [114.19738, 41.7836], + [114.23309, 41.51474], + [113.86505, 41.43037], + [114.01886, 41.23444], + [113.81561, 41.10005], + [114.04632, 40.92596], + [114.13147, 40.73477], + [114.0628, 40.5305], + [113.79364, 40.51797], + [113.55743, 40.35073], + [113.31024, 40.32142], + [113.24981, 40.4114], + [112.89825, 40.33189], + [112.74169, 40.16628], + [112.4533, 40.30257], + [112.31323, 40.25647], + [111.96716, 39.79587], + [111.93145, 39.61626], + [111.44256, 39.64165], + [111.34643, 39.42558], + [111.05255, 39.44255], + [111.14868, 39.5824], + [110.89599, 39.50827], + [110.68725, 39.26415], + [110.52795, 39.38314], + [110.38513, 39.30667], + [110.14343, 39.45104], + [110.2066, 39.28116], + [109.66278, 38.99784], + [109.3634, 38.6233], + [109.06402, 38.44283], + [108.94043, 38.16911], + [109.07226, 38.03078], + [108.94317, 37.9182], + [108.8031, 38.04376], + [108.78662, 37.68164], + [108.32519, 37.63163], + [108.02032, 37.65338], + [107.98736, 37.78374], + [107.69622, 37.88569], + [107.49847, 37.7642], + [107.28698, 37.48575], + [107.30621, 36.92574], + [107.91046, 36.74108], + [108.40759, 36.44779], + [108.62457, 36.43012], + [108.70422, 36.13787], + [108.64929, 35.94688], + [108.49273, 35.88237], + [108.61084, 35.32633], + [107.96814, 35.24113], + [107.65502, 35.24337], + [107.86377, 34.99175], + [107.62756, 34.91746], + [107.28973, 34.93548], + [106.89422, 35.08395], + [106.55365, 35.08845], + [106.48498, 34.976], + [106.58111, 34.77094], + [106.31744, 34.58573], + [106.71844, 34.37064], + [106.41357, 33.90461], + [106.5866, 33.60775], + [106.20208, 33.54597], + [105.96038, 33.60775], + [105.7077, 33.38788], + [105.92468, 33.19043], + [105.87249, 32.93723], + [105.60058, 32.87036], + [105.41381, 32.93031], + [105.46325, 32.73184], + [105.11169, 32.58847], + [104.7409, 32.63474], + [104.2987, 32.83344], + [104.42779, 33.01787], + [104.2987, 33.33741], + [104.057, 33.69006], + [103.76586, 33.66492], + [103.51318, 33.81338], + [103.3374, 33.74261], + [103.14788, 33.82251], + [103.12042, 34.1709], + [102.92266, 34.31168], + [102.59582, 34.15727], + [102.38983, 33.97753], + [102.13989, 33.97069], + [102.47497, 33.46581], + [102.26348, 33.41081], + [102.20855, 33.23179], + [101.93664, 33.18813], + [101.90094, 33.5597], + [101.78833, 33.55741], + [101.62902, 33.09844], + [101.48895, 33.2272], + [101.12365, 33.22949], + [101.23077, 32.8219], + [101.15112, 32.66018], + [100.93414, 32.61161], + [100.68695, 32.67637], + [100.66223, 32.52134], + [100.39856, 32.75725], + [100.09643, 32.66943], + [100.11291, 32.86113], + [99.91241, 33.02017], + [99.73114, 32.7249], + [99.55535, 32.84498], + [99.27246, 32.87958], + [99.20379, 33.03399], + [98.89068, 33.13755], + [98.76434, 33.28002], + [98.66272, 33.65349], + [98.41278, 33.86813], + [98.3963, 34.09133], + [98.04473, 34.11407], + [97.81127, 34.20725], + [97.66571, 34.12317], + [97.64099, 33.92968], + [97.39654, 33.87497], + [97.41027, 33.61004], + [97.7536, 33.40851], + [97.48718, 33.16514], + [97.51739, 32.99023], + [97.36908, 32.96028], + [97.4295, 32.70642], + [97.66571, 32.55144], + [98.21777, 32.34748], + [98.43475, 32.00341], + [98.55285, 31.65104], + [98.88244, 31.3677], + [98.60229, 31.194], + [98.80828, 30.98702], + [99.06921, 29.93351], + [98.99505, 29.65464], + [99.1159, 29.2193], + [98.9154, 28.80376], + [98.79455, 28.99132], + [98.62426, 28.96729], + [98.68194, 28.72913], + [98.59405, 28.67613], + [98.74786, 28.33097], + [98.70666, 28.21971], + [98.39355, 28.1059], + [98.28369, 28.3914], + [98.17108, 28.16403], + [98.14086, 28.14526], + [97.72064, 28.49404], + [97.50091, 28.49283], + [97.51602, 28.3346], + [97.34436, 28.21487], + [97.07656, 28.36904], + [96.92344, 28.35273], + [96.64054, 28.67793], + [96.30409, 29.19053], + [96.05278, 29.38456], + [95.73829, 29.29837], + [95.70877, 29.20072], + [95.27275, 29.07417], + [94.84771, 29.18333], + [94.69322, 29.31753], + [94.27505, 29.11437], + [94.36569, 29.02735], + [93.70651, 28.66408], + [93.42498, 28.66347], + [92.92099, 28.20216], + [92.67654, 28.14829], + [92.73147, 27.97984], + [92.32017, 27.79717], + [92.26799, 27.88703], + [91.92604, 27.71635], + [91.64451, 27.76315], + [91.6246, 27.89249], + [91.26274, 28.07137], + [91.21124, 27.98712], + [90.69145, 28.07985], + [90.45181, 28.04774], + [90.61248, 28.22878], + [90.05973, 28.34608], + [89.59625, 28.16221], + [89.38957, 27.89128], + [89.04007, 27.54906], + [88.97209, 27.30528], + [88.76403, 27.56793], + [88.88145, 27.89067], + [88.75579, 28.07985], + [88.13781, 27.89128], + [87.82333, 27.9198], + [87.5885, 27.85364], + [87.11265, 27.84332], + [87.03918, 27.94831], + [86.56265, 28.10832], + [86.41227, 27.90766], + [86.23512, 27.97439], + [86.18705, 28.17432], + [86.12388, 27.92708], + [85.9481, 27.94285], + [85.71121, 28.38656], + [85.10971, 28.3485], + [85.19897, 28.62732], + [85.0534, 28.68155], + [84.85977, 28.57185], + [84.41001, 28.84948], + [84.22462, 28.89518], + [84.20402, 29.23608], + [83.96438, 29.3307], + [83.63273, 29.15815], + [83.51806, 29.2169], + [83.21868, 29.6045], + [82.8321, 29.68864], + [82.56294, 29.95493], + [82.17155, 30.06612], + [82.08572, 30.36102], + [81.99302, 30.32073], + [81.61743, 30.44749], + [81.4286, 30.42144], + [81.39564, 30.20567], + [81.21849, 30.00608], + [81.02005, 30.25432], + [80.60531, 30.46998], + [80.21118, 30.5859], + [80.25238, 30.73947], + [79.74975, 31.00586], + [79.60281, 30.93933], + [79.3103, 31.1517], + [79.14207, 31.43276], + [78.79119, 31.30319], + [78.73077, 31.53348], + [78.84819, 31.60836], + [78.70262, 31.80756], + [78.76785, 31.94575], + [78.42865, 32.21222], + [78.51104, 32.30338], + [78.395, 32.53755], + [78.74862, 32.68966], + [78.78021, 32.48022], + [78.96972, 32.33413], + [79.27597, 32.55665], + [79.41124, 32.51786], + [79.55612, 32.76071], + [79.36386, 32.93781], + [79.41261, 33.17893], + [79.10636, 33.19962], + [78.83789, 33.42456], + [78.71772, 33.62319], + [78.74244, 34.00087], + [78.65593, 34.03445], + [79.04457, 34.32812], + [78.55018, 34.57216], + [78.28857, 34.61512], + [78.23776, 34.88086], + [78.00293, 35.24057], + [78.11965, 35.48024], + [77.8141, 35.5216], + [77.3822, 35.47297], + [76.7752, 35.65952], + [76.56234, 35.82338], + [76.14418, 35.83785], + [75.93475, 36.13621], + [76.06246, 36.22599], + [75.9423, 36.59678], + [75.71845, 36.75318], + [75.46714, 36.71687], + [75.37445, 36.94659], + [75.14167, 37.02777], + [74.91714, 36.97842], + [74.70085, 37.08366], + [74.56558, 37.03161], + [74.50035, 37.23962], + [74.88967, 37.2336], + [75.15129, 37.4078], + [74.89723, 37.66099], + [75.00984, 37.77234], + [74.91508, 38.02375], + [74.71183, 38.21282], + [74.69535, 38.42562], + [74.18724, 38.64047], + [73.99017, 38.5256], + [73.80065, 38.61365], + [73.70796, 38.89744], + [73.75396, 39.02451], + [73.49784, 39.37995], + [73.87412, 39.48443], + [73.94691, 39.59986], + [73.84735, 39.83385], + [74.04167, 40.10066], + [74.34173, 40.09383], + [74.91233, 40.34445], + [74.81689, 40.50753], + [75.23712, 40.44747], + [75.60035, 40.66345], + [75.72257, 40.47515], + [75.66284, 40.35334], + [76.27121, 40.43858], + [76.4463, 40.39205], + [76.65435, 40.62281], + [76.75392, 40.95293], + [76.99562, 41.07262], + [77.27371, 41.00063], + [77.76672, 41.01617], + [77.81959, 41.14195], + [78.12377, 41.22928], + [78.18969, 41.39432], + [78.64494, 41.46948], + [78.71154, 41.55226], + [79.32197, 41.8097], + [79.77172, 41.89103], + [79.84588, 42.0141], + [80.22491, 42.06458], + [80.28327, 42.23309], + [80.16174, 42.6289], + [80.26199, 42.82864], + [80.59913, 42.89608], + [80.39176, 42.99711], + [80.78453, 43.14007], + [80.75294, 43.46587], + [80.52154, 43.82164], + [80.34713, 44.48377], + [80.39657, 44.63152], + [80.16517, 44.84175], + [79.99557, 44.7906], + [79.88296, 44.91181], + [80.13908, 45.05557], + [80.48927, 45.12683], + [80.89508, 45.12489], + [81.7678, 45.37674], + [81.9223, 45.22848], + [82.58079, 45.21977], + [82.54165, 45.42158], + [82.28073, 45.53425], + [82.33429, 45.93825], + [82.73941, 46.51682], + [83.02436, 47.21677], + [83.36357, 47.17851], + [83.92044, 46.97509], + [84.75059, 47.0046], + [84.94285, 46.86206], + [85.21408, 47.05187], + [85.55671, 47.05141], + [85.70228, 47.37928], + [85.55191, 47.98256], + [85.55397, 48.1386], + [85.75515, 48.40367], + [86.23512, 48.43239], + [86.58599, 48.5407], + [86.81877, 48.83353], + [86.72538, 48.98787], + [86.89704, 49.135], + [87.28157, 49.11882], + [87.98881, 49.18394], + [88.17009, 49.29333], + [88.2209, 49.47927], + [88.59718, 49.50336], + [88.84025, 49.44089], + [89.67521, 49.69384], + [89.59144, 50.10032], + [89.33464, 50.20503], + [89.49668, 50.35816], + [89.82559, 50.41289], + [89.84344, 50.52739], + [89.06478, 51.0483], + [88.95904, 51.24558], + [89.00985, 51.38249], + [88.8018, 51.55615], + [89.26528, 51.64401], + [89.70817, 51.557], + [89.92858, 51.75509], + [90.14144, 51.75934], + [90.01579, 51.96796], + [90.14694, 52.15708], + [90.3598, 52.20634], + [90.74844, 52.06979], + [90.85556, 51.90149], + [91.87797, 51.86462], + [92.0716, 51.77378], + [92.84614, 51.83577], + [93.32611, 52.12758], + [93.6708, 52.21854], + [93.75801, 52.43633], + [94.09721, 52.69178], + [94.15008, 52.82849], + [94.51263, 52.91304], + [94.59709, 53.31323], + [95.17181, 53.45289], + [95.41282, 53.37759], + [95.72868, 53.53255], + [96.10702, 53.45494], + [96.24229, 53.61287], + [96.46133, 53.51051], + [96.67007, 53.56763], + [96.70921, 53.7093], + [96.90422, 53.72352], + [97.33955, 53.58068], + [97.65266, 53.35997], + [97.99049, 53.34235], + [98.01864, 53.25576], + [98.32283, 53.22741], + [98.32283, 53.1002], + [98.69842, 53.1583], + [99.05273, 53.08577], + [99.23263, 52.8712], + [98.94287, 52.93746], + [98.92227, 52.64764], + [98.63044, 52.41331], + [99.02458, 52.06557], + [99.80117, 51.91589], + [99.91722, 51.73851], + [100.5297, 51.75041], + [101.3681, 51.45657], + [101.54251, 51.49976], + [102.12478, 51.36192], + [102.24082, 50.91602], + [102.20855, 50.81721], + [102.72972, 50.40895], + [102.93914, 50.306], + [103.23783, 50.32179], + [103.72467, 50.12762], + [103.8359, 50.19448], + [104.13459, 50.13818], + [104.3914, 50.31126], + [105.11787, 50.38969], + [105.35408, 50.47935], + [105.84434, 50.43957], + [106.26045, 50.29855], + [106.51382, 50.34546], + [106.81594, 50.29767], + [107.09747, 50.05184], + [107.79441, 49.93177], + [107.96676, 49.93928], + [107.96058, 49.65384], + [108.29704, 49.55105], + [108.4996, 49.32691], + [109.17388, 49.35554], + [109.55703, 49.22163], + [110.19905, 49.15521], + [110.39405, 49.25525], + [110.81222, 49.17586], + [111.37802, 49.35822], + [111.93901, 49.37522], + [112.47665, 49.52253], + [112.81242, 49.5154], + [113.05412, 49.60848], + [113.21754, 49.83665], + [114.33746, 50.28582], + [114.99046, 50.17338], + [115.23696, 49.98434], + [115.74302, 49.88578], + [116.23741, 50.03641], + [116.62605, 49.93531], + [117.05658, 49.6854], + [117.47268, 49.62672], + [117.8009, 49.51718], + [117.89085, 49.59424], + [118.44154, 49.77993], + [118.63723, 49.91763], + [119.05403, 49.9786], + [119.27581, 50.08093], + [119.3589, 50.34808], + [119.18518, 50.34765], + [119.29161, 50.58236], + [119.49829, 50.76469], + [119.51408, 50.90563], + [119.71321, 51.04571], + [119.9961, 51.45743], + [120.08949, 51.68234], + [120.64842, 51.92521], + [120.78163, 52.16382], + [120.62164, 52.32442], + [120.71846, 52.5275], + [120.45822, 52.64389], + [120.04486, 52.59303], + [120.03044, 52.77909], + [120.17463, 52.80566], + [120.8139, 53.26726], + [121.47377, 53.33128] + ] + ] + }, + "properties": { "cqzone": "23" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "24": { + "mh": [ + "OL62", + "NL93", + "NL94", + "NL95", + "NL96", + "NL97", + "NL98", + "NM90", + "NM91", + "NM92", + "OK48", + "OK49", + "OL02", + "OL03", + "OL04", + "OL05", + "OL06", + "OL07", + "OL08", + "OL09", + "OL13", + "OL14", + "OL15", + "OL16", + "OL17", + "OL18", + "OL19", + "OL23", + "OL24", + "OL25", + "OL26", + "OL27", + "OL28", + "OL29", + "OL32", + "OL33", + "OL34", + "OL35", + "OL36", + "OL37", + "OL38", + "OL39", + "OL42", + "OL43", + "OL44", + "OL45", + "OL46", + "OL47", + "OL48", + "OL49", + "OL51", + "OL52", + "OL53", + "OL54", + "OL55", + "OL56", + "OL57", + "OL58", + "OL59", + "OL63", + "OL64", + "OL65", + "OL66", + "OL67", + "OL68", + "OL69", + "OL73", + "OL74", + "OL75", + "OL76", + "OL77", + "OL78", + "OL79", + "OL83", + "OL84", + "OL85", + "OL86", + "OL87", + "OL88", + "OL89", + "OL95", + "OL96", + "OL97", + "OL98", + "OL99", + "OM00", + "OM01", + "OM02", + "OM10", + "OM11", + "OM12", + "OM13", + "OM20", + "OM21", + "OM22", + "OM30", + "OM31", + "OM32", + "OM40", + "OM41", + "OM50", + "OM51", + "OM52", + "OM54", + "OM55", + "OM56", + "OM57", + "OM58", + "OM60", + "OM61", + "OM62", + "OM63", + "OM64", + "OM65", + "OM66", + "OM67", + "OM68", + "OM69", + "OM70", + "OM71", + "OM72", + "OM73", + "OM74", + "OM75", + "OM76", + "OM77", + "OM78", + "OM79", + "OM80", + "OM81", + "OM82", + "OM83", + "OM84", + "OM85", + "OM86", + "OM87", + "OM88", + "OM89", + "OM90", + "OM91", + "OM92", + "OM93", + "OM94", + "OM95", + "OM96", + "OM99", + "ON70", + "ON71", + "ON80", + "ON81", + "ON90", + "PL08", + "PL09", + "PM00", + "PM01", + "PM02", + "PM07", + "PN01", + "PN10", + "PN11", + "PN12", + "PN14", + "PN15", + "PN16", + "PN17", + "PN21", + "PN22", + "PN23", + "PN24", + "PN25", + "PN26", + "PN27", + "PN28", + "PN32", + "PN33", + "PN34", + "PN35", + "PN36", + "PN37", + "PN38", + "PN39", + "PN42", + "PN43", + "PN44", + "PN45", + "PN46", + "PN47", + "PN48", + "PN49", + "PN53", + "PN54", + "PN55", + "PN56", + "PN57", + "PN65", + "PN66", + "PN67", + "PO11", + "PO12", + "PO22", + "PO30", + "PL03", + "PL04", + "PL02", + "OL61", + "NL83", + "NL84", + "NL85", + "NL91", + "NL92", + "NL99", + "NM82", + "NM83", + "NM93", + "OK58", + "OK59", + "OL01", + "OL12", + "OL22", + "OL31", + "OL40", + "OL41", + "OL50", + "OL72", + "OL82", + "OL94", + "OM03", + "OM23", + "OM42", + "OM43", + "OM53", + "OM59", + "OM97", + "OM98", + "ON60", + "ON61", + "ON82", + "ON91", + "ON92", + "PL06", + "PL07", + "PM03", + "PM04", + "PM05", + "PM06", + "PM09", + "PM16", + "PM17", + "PM19", + "PM29", + "PN00", + "PN02", + "PN13", + "PN18", + "PN20", + "PN29", + "PN31", + "PN41", + "PN52", + "PN58", + "PN59", + "PN68", + "PN76", + "PN77", + "PN78", + "PO02", + "PO03", + "PO13", + "PO20", + "PO21", + "PO23", + "PO31", + "PO32", + "PN64", + "PM08", + "PL19", + "PM10", + "PL01", + "OL93", + "PL05", + "OL80", + "OM14", + "ON72", + "PN05", + "PN06", + "NM84" + ], + "worked": false, + "confirmed": false, + "name": "Eastern Zone of Asia", + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [98.17108, 28.16403], + [98.28369, 28.3914], + [98.39355, 28.1059], + [98.70666, 28.21971], + [98.74786, 28.33097], + [98.59405, 28.67613], + [98.68194, 28.72913], + [98.62426, 28.96729], + [98.79455, 28.99132], + [98.9154, 28.80376], + [99.1159, 29.2193], + [98.99505, 29.65464], + [99.06921, 29.93351], + [98.80828, 30.98702], + [98.60229, 31.194], + [98.88244, 31.3677], + [98.55285, 31.65104], + [98.43475, 32.00341], + [98.21777, 32.34748], + [97.66571, 32.55144], + [97.4295, 32.70642], + [97.36908, 32.96028], + [97.51739, 32.99023], + [97.48718, 33.16514], + [97.7536, 33.40851], + [97.41027, 33.61004], + [97.39654, 33.87497], + [97.64099, 33.92968], + [97.66571, 34.12317], + [97.81127, 34.20725], + [98.04473, 34.11407], + [98.3963, 34.09133], + [98.41278, 33.86813], + [98.66272, 33.65349], + [98.76434, 33.28002], + [98.89068, 33.13755], + [99.20379, 33.03399], + [99.27246, 32.87958], + [99.55535, 32.84498], + [99.73114, 32.7249], + [99.91241, 33.02017], + [100.11291, 32.86113], + [100.09643, 32.66943], + [100.39856, 32.75725], + [100.66223, 32.52134], + [100.68695, 32.67637], + [100.93414, 32.61161], + [101.15112, 32.66018], + [101.23077, 32.8219], + [101.12365, 33.22949], + [101.48895, 33.2272], + [101.62902, 33.09844], + [101.78833, 33.55741], + [101.90094, 33.5597], + [101.93664, 33.18813], + [102.20855, 33.23179], + [102.26348, 33.41081], + [102.47497, 33.46581], + [102.13989, 33.97069], + [102.38983, 33.97753], + [102.59582, 34.15727], + [102.92266, 34.31168], + [103.12042, 34.1709], + [103.14788, 33.82251], + [103.3374, 33.74261], + [103.51318, 33.81338], + [103.76586, 33.66492], + [104.057, 33.69006], + [104.2987, 33.33741], + [104.42779, 33.01787], + [104.2987, 32.83344], + [104.7409, 32.63474], + [105.11169, 32.58847], + [105.46325, 32.73184], + [105.41381, 32.93031], + [105.60058, 32.87036], + [105.87249, 32.93723], + [105.92468, 33.19043], + [105.7077, 33.38788], + [105.96038, 33.60775], + [106.20208, 33.54597], + [106.5866, 33.60775], + [106.41357, 33.90461], + [106.71844, 34.37064], + [106.31744, 34.58573], + [106.58111, 34.77094], + [106.48498, 34.976], + [106.55365, 35.08845], + [106.89422, 35.08395], + [107.28973, 34.93548], + [107.62756, 34.91746], + [107.86377, 34.99175], + [107.65502, 35.24337], + [107.96814, 35.24113], + [108.61084, 35.32633], + [108.49273, 35.88237], + [108.64929, 35.94688], + [108.70422, 36.13787], + [108.62457, 36.43012], + [108.40759, 36.44779], + [107.91046, 36.74108], + [107.30621, 36.92574], + [107.28698, 37.48575], + [107.49847, 37.7642], + [107.69622, 37.88569], + [107.98736, 37.78374], + [108.02032, 37.65338], + [108.32519, 37.63163], + [108.78662, 37.68164], + [108.8031, 38.04376], + [108.94317, 37.9182], + [109.07226, 38.03078], + [108.94043, 38.16911], + [109.06402, 38.44283], + [109.3634, 38.6233], + [109.66278, 38.99784], + [110.2066, 39.28116], + [110.14343, 39.45104], + [110.38513, 39.30667], + [110.52795, 39.38314], + [110.68725, 39.26415], + [110.89599, 39.50827], + [111.14868, 39.5824], + [111.05255, 39.44255], + [111.34643, 39.42558], + [111.44256, 39.64165], + [111.93145, 39.61626], + [111.96716, 39.79587], + [112.31323, 40.25647], + [112.4533, 40.30257], + [112.74169, 40.16628], + [112.89825, 40.33189], + [113.24981, 40.4114], + [113.31024, 40.32142], + [113.55743, 40.35073], + [113.79364, 40.51797], + [114.0628, 40.5305], + [114.13147, 40.73477], + [114.04632, 40.92596], + [113.81561, 41.10005], + [114.01886, 41.23444], + [113.86505, 41.43037], + [114.23309, 41.51474], + [114.19738, 41.7836], + [114.50775, 41.97991], + [114.57641, 42.13896], + [114.80163, 42.14915], + [114.906, 42.01461], + [114.91149, 41.61133], + [115.38116, 41.59285], + [115.31799, 41.69547], + [115.91125, 41.9411], + [116.02111, 41.78564], + [116.32049, 42.00032], + [116.54296, 41.93089], + [116.86431, 42.00644], + [116.7984, 42.198], + [117.00988, 42.45791], + [117.41638, 42.47007], + [117.46582, 42.60566], + [117.78717, 42.58746], + [118.02063, 42.38695], + [117.96844, 42.23868], + [118.11401, 42.03705], + [118.30902, 41.99624], + [118.28704, 41.76516], + [118.12225, 41.73442], + [118.31176, 41.56614], + [118.33923, 41.3397], + [118.85009, 41.36856], + [119.21264, 41.27987], + [119.40765, 41.49623], + [119.30877, 41.64213], + [119.38568, 42.04929], + [119.24285, 42.20614], + [119.50653, 42.38898], + [119.83886, 42.10229], + [120.09429, 41.69137], + [120.46783, 42.09822], + [120.75073, 42.22851], + [121.03637, 42.24681], + [121.31927, 42.45386], + [121.67083, 42.4417], + [121.92352, 42.66022], + [122.34649, 42.67839], + [122.57446, 42.82763], + [122.84637, 42.71473], + [123.23364, 42.83569], + [123.18695, 42.93832], + [123.57147, 43.00464], + [123.69506, 43.3751], + [123.30505, 43.54655], + [123.52478, 43.69568], + [123.32977, 44.03034], + [123.39019, 44.15659], + [123.12927, 44.36313], + [123.13201, 44.51021], + [122.68432, 44.2865], + [122.31353, 44.23339], + [122.28607, 44.47495], + [122.10205, 44.67646], + [122.04711, 44.90646], + [122.22564, 45.20719], + [122.16522, 45.44471], + [122.00592, 45.49864], + [121.95098, 45.71576], + [121.64337, 45.74836], + [121.83013, 46.02557], + [122.25036, 45.80008], + [122.43988, 45.91676], + [122.67883, 45.70809], + [122.79418, 45.7656], + [122.79693, 46.07323], + [123.04687, 46.09799], + [123.17596, 46.25014], + [123.00567, 46.44164], + [123.05236, 46.62869], + [123.59893, 46.69466], + [123.62365, 46.84892], + [123.22265, 46.85643], + [123.16772, 46.73421], + [122.92053, 46.79253], + [122.85736, 47.0645], + [122.64038, 47.11313], + [122.41516, 47.34254], + [122.57171, 47.5376], + [123.16497, 47.77994], + [123.29681, 47.95498], + [123.54126, 48.02483], + [124.26086, 48.53479], + [124.50531, 48.12026], + [124.57397, 48.25759], + [124.52453, 48.54934], + [124.91455, 49.18708], + [125.21392, 49.19247], + [125.26336, 49.44848], + [125.1892, 49.95652], + [125.45288, 50.22612], + [125.52703, 50.41201], + [125.8319, 50.56056], + [125.76873, 50.74862], + [126.06536, 50.97399], + [125.35949, 51.61972], + [125.13153, 51.63677], + [124.87335, 51.37692], + [124.6289, 51.32374], + [124.23339, 51.35291], + [123.29681, 51.25675], + [122.8656, 51.47625], + [122.63214, 52.13517], + [122.77496, 52.26647], + [122.47558, 52.30008], + [122.16247, 52.52457], + [121.94274, 52.28328], + [121.71752, 52.32023], + [121.64611, 52.44094], + [121.18743, 52.5947], + [121.60217, 52.82932], + [121.8164, 53.06102], + [121.47377, 53.33128], + [122.11303, 53.4304], + [122.82165, 53.45453], + [123.26866, 53.56111], + [123.88801, 53.47783], + [124.23133, 53.37718], + [124.403, 53.22864], + [125.20431, 53.19204], + [125.60668, 53.08041], + [126.42654, 52.29672], + [126.3002, 52.20339], + [126.55082, 52.13433], + [126.44989, 52.03264], + [126.83509, 51.53138], + [126.77742, 51.43945], + [126.97448, 51.307], + [126.91749, 51.05779], + [127.11113, 50.93376], + [127.36381, 50.58716], + [127.37068, 50.28846], + [127.59796, 50.23842], + [127.50183, 50.06022], + [127.52037, 49.82026], + [127.79983, 49.59068], + [128.06899, 49.53813], + [128.53317, 49.60092], + [128.79135, 49.58133], + [128.75564, 49.47526], + [129.06738, 49.36225], + [129.52262, 49.41365], + [129.84672, 49.10084], + [130.22163, 48.86652], + [130.68237, 48.85568], + [130.52993, 48.63653], + [130.72151, 48.51387], + [130.83412, 48.29826], + [130.65559, 48.11201], + [130.95016, 47.82744], + [130.95222, 47.72916], + [131.26945, 47.73701], + [131.96846, 47.66816], + [132.28843, 47.74717], + [132.5782, 47.72593], + [132.70248, 47.96188], + [132.81097, 47.9329], + [133.04031, 48.10055], + [133.48663, 48.07303], + [133.74069, 48.24982], + [134.48982, 48.42236], + [134.76885, 48.37548], + [134.54319, 48.02859], + [134.78445, 47.72518], + [134.48189, 47.44023], + [134.31207, 47.43612], + [134.13997, 47.2587], + [134.00368, 46.63752], + [133.84179, 46.4545], + [133.91045, 46.26409], + [133.68503, 46.15081], + [133.73886, 46.066], + [133.48069, 45.85933], + [133.46806, 45.60771], + [133.19726, 45.50587], + [133.12751, 45.125], + [132.95228, 45.01758], + [131.98167, 45.25696], + [131.87603, 45.34376], + [131.69391, 45.12661], + [131.28863, 44.92558], + [130.96225, 44.86187], + [131.11215, 44.7], + [131.30002, 44.05154], + [131.23493, 43.98083], + [131.19312, 43.5256], + [131.30937, 43.45761], + [131.21187, 43.14579], + [131.04022, 42.8623], + [130.67053, 42.85482], + [130.39422, 42.72447], + [130.58362, 42.67108], + [130.64067, 42.41543], + [130.23536, 42.73894], + [130.25253, 42.90765], + [129.90371, 43.00715], + [129.75952, 42.70766], + [129.74372, 42.46703], + [129.53498, 42.36311], + [129.24179, 42.37985], + [129.2205, 42.20461], + [128.90533, 42.01053], + [128.08822, 42.02124], + [128.10676, 41.79128], + [128.31138, 41.58668], + [128.20015, 41.40617], + [127.64396, 41.40359], + [127.09945, 41.55278], + [127.04658, 41.74262], + [126.88316, 41.79025], + [126.60713, 41.66778], + [126.27891, 41.15797], + [125.94863, 40.87769], + [125.76461, 40.89015], + [125.4776, 40.71968], + [124.89463, 40.4809], + [124.3515, 40.08437], + [124.16473, 39.77688], + [124, 39], + [124, 30], + [121.7, 22], + [117, 15.2], + [110, 15.2], + [108.16666, 18], + [108.16666, 21.41666], + [107.87132, 21.64721], + [107.38243, 21.59615], + [107.02674, 21.82198], + [107.05902, 21.9182], + [106.72943, 22.00799], + [106.65802, 22.3361], + [106.56051, 22.3488], + [106.60995, 22.6026], + [106.72668, 22.58738], + [106.83723, 22.80466], + [106.60446, 22.92993], + [106.25701, 22.87807], + [106.12999, 23.00011], + [105.88073, 22.91855], + [105.32249, 23.39457], + [104.81437, 23.11952], + [104.86312, 22.9508], + [104.73541, 22.81985], + [104.58229, 22.86035], + [104.39895, 22.70018], + [104.27467, 22.83821], + [104.04052, 22.72425], + [103.93409, 22.52524], + [103.64158, 22.79707], + [103.52966, 22.59309], + [103.3731, 22.7996], + [103.03115, 22.44276], + [102.86705, 22.6102], + [102.51136, 22.77681], + [102.25112, 22.45862], + [101.86386, 22.3888], + [101.68533, 22.47703], + [101.53701, 22.25541], + [101.61598, 21.97679], + [101.77597, 21.836], + [101.7176, 21.14407], + [101.54869, 21.2561], + [101.21498, 21.23178], + [101.21635, 21.5623], + [101.12159, 21.77352], + [100.88813, 21.68678], + [100.72197, 21.51249], + [100.12802, 21.50929], + [100.13214, 21.70017], + [99.98931, 21.70911], + [99.99893, 21.97616], + [99.47845, 22.13844], + [99.15504, 22.16833], + [99.38026, 22.49606], + [99.31503, 22.73755], + [99.53887, 22.90021], + [99.50935, 23.08289], + [99.25941, 23.08225], + [98.88931, 23.21295], + [98.8948, 23.61558], + [98.67851, 23.91346], + [98.89823, 24.10852], + [98.22258, 24.11604], + [97.82707, 23.9737], + [97.71514, 23.87202], + [97.52906, 23.92915], + [97.73231, 24.11604], + [97.66777, 24.45652], + [97.52906, 24.43777], + [97.5476, 24.74433], + [97.79892, 24.86214], + [97.72888, 25.04765], + [97.84011, 25.27326], + [97.94311, 25.21798], + [98.24386, 25.61119], + [98.40866, 25.61181], + [98.53225, 25.84686], + [98.70597, 25.85489], + [98.66272, 26.09193], + [98.7355, 26.35557], + [98.74099, 27.32907], + [98.66203, 27.58984], + [98.42994, 27.65616], + [98.31665, 27.52349], + [98.14018, 27.9568], + [98.1491, 28.12346], + [98.17108, 28.16403] + ] + ] + }, + "properties": { "cqzone": "24" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "25": { + "mh": [ + "PM34", + "PM35", + "PM36", + "PM37", + "PM38", + "PM45", + "PM46", + "PM47", + "PM52", + "PM53", + "PM63", + "PM64", + "PM75", + "PM84", + "PM85", + "PM86", + "PM95", + "PM96", + "PM97", + "QM08", + "QM09", + "QN00", + "QN02", + "QN12", + "QN13", + "QN14", + "QN23", + "PM51", + "PM28", + "PM39", + "PN20", + "PN30", + "PN31", + "PN40", + "PN41", + "PM44", + "PM48", + "PM27", + "PM42", + "PM43", + "PM54", + "PM65", + "PM73", + "PM74", + "PM76", + "PM83", + "PM87", + "PM94", + "PM98", + "PM99", + "PN90", + "PN91", + "PN92", + "QM05", + "QM06", + "QM07", + "QN01", + "QN03", + "QN04", + "QN05", + "QN15", + "QN22", + "QN24", + "PM29", + "PN51", + "PN52", + "PM50", + "PN42", + "PN53", + "PN43", + "PM24", + "PM33", + "PM93", + "PL49", + "PL14", + "PL24", + "PL36", + "PL46", + "PL47", + "PL48", + "PL58", + "PM40", + "PL55", + "PM41", + "PL15", + "PM66", + "PM57", + "QN33", + "QN34", + "QN35", + "QN45", + "QN55", + "QN56", + "QN67", + "QN68", + "QN57", + "QN66", + "QN46", + "QM19", + "PM92", + "PL25", + "PL56", + "PL57", + "PL59", + "PM55", + "PM56", + "PM49", + "QN44", + "QM00", + "QN11", + "QN10", + "QM18" + ], + "worked": false, + "confirmed": false, + "name": "Japanese Zone", + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [130.64067, 42.41543], + [130.77271, 42.24603], + [136.66227, 42.24603], + [139.77955, 45.73822], + [146.49147, 45.73822], + [145.22612, 43.82251], + [145.54187, 43.542], + [146.16455, 43.26843], + [160, 40], + [130, 22], + [121.7, 22], + [124, 30], + [124, 39], + [124.16473, 39.77688], + [124.3515, 40.08437], + [124.89463, 40.4809], + [125.4776, 40.71968], + [125.76461, 40.89015], + [125.94863, 40.87769], + [126.27891, 41.15797], + [126.60713, 41.66778], + [126.88316, 41.79025], + [127.04658, 41.74262], + [127.09945, 41.55278], + [127.64396, 41.40359], + [128.20015, 41.40617], + [128.31138, 41.58668], + [128.10676, 41.79128], + [128.08822, 42.02124], + [128.90533, 42.01053], + [129.2205, 42.20461], + [129.24179, 42.37985], + [129.53498, 42.36311], + [129.74372, 42.46703], + [129.75952, 42.70766], + [129.90371, 43.00715], + [130.25253, 42.90765], + [130.23536, 42.73894], + [130.64067, 42.41543] + ] + ] + }, + "properties": { "cqzone": "25" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "26": { + "mh": [ + "NJ68", + "NJ69", + "NK61", + "NK62", + "NK63", + "OK08", + "OK09", + "OK18", + "OK19", + "OK23", + "OK24", + "OK25", + "OK26", + "OK27", + "OK28", + "OK29", + "OK33", + "OK34", + "OK35", + "OK36", + "OL00", + "OL01", + "OL10", + "OL11", + "OL12", + "OL20", + "OK17", + "OK07", + "OK70", + "OK80", + "OK71", + "OK81", + "OJ89", + "OJ79", + "OJ29", + "OK20", + "OK30", + "OK31", + "OK32", + "OK42", + "OK43", + "OK44", + "OL21", + "OL22", + "OL31", + "OK21", + "NJ99", + "NK76", + "NK77", + "NK78", + "NK79", + "NK87", + "NK88", + "NK89", + "NK90", + "NK91", + "NK92", + "NK93", + "NK94", + "NK95", + "NK96", + "NK97", + "NK99", + "NL60", + "NL61", + "NL70", + "NL71", + "NL72", + "NL73", + "NL74", + "NL75", + "NL80", + "NL81", + "NL82", + "NL83", + "NL84", + "NL85", + "NL86", + "NL90", + "NL91", + "NL92", + "OK11", + "OK12", + "OK13", + "OK14", + "OK22", + "NJ98", + "NK98", + "OJ06", + "OK03", + "OK04", + "OK05", + "OK06", + "OK15", + "OK16", + "NJ66", + "NJ67", + "NK73", + "OK37", + "OL02", + "OJ39", + "OK38", + "OK39", + "OK40", + "OK41", + "OK45", + "OK46", + "OL30", + "OL32", + "OK10", + "NK68", + "NK69", + "NK84", + "NK85", + "NK86", + "NL62", + "NL63", + "NL76", + "NL77", + "NL87", + "NL88", + "NL93", + "NL95", + "NL96", + "NL97", + "NL98", + "NJ96", + "NJ97", + "OJ07", + "OJ08", + "OK02", + "OJ88", + "OJ87", + "OJ67", + "OJ57", + "OJ58", + "OJ59", + "OK50", + "OK61", + "OK60", + "OJ68", + "OJ69", + "OJ78", + "OJ66", + "OJ76", + "OJ77", + "OJ28", + "OJ05", + "OJ16", + "NK60", + "NK72", + "NK75", + "NK64", + "NJ89", + "NK80", + "NK81", + "NK82", + "NK83", + "NK74", + "OJ38", + "OL23", + "NL94", + "NL64", + "NJ76", + "NJ77", + "OJ09", + "OK00", + "OK01", + "OJ17", + "OJ18", + "OJ19", + "NJ86", + "NJ87", + "NJ88", + "NJ78", + "NJ79", + "NK71", + "NK70", + "NK65", + "NK66", + "NK67" + ], + "worked": false, + "confirmed": false, + "name": "Southeastern Zone of Asia", + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [98.14086, 28.14526], + [98.1491, 28.12346], + [98.14018, 27.9568], + [98.31665, 27.52349], + [98.42994, 27.65616], + [98.66203, 27.58984], + [98.74099, 27.32907], + [98.7355, 26.35557], + [98.66272, 26.09193], + [98.70597, 25.85489], + [98.53225, 25.84686], + [98.40866, 25.61181], + [98.24386, 25.61119], + [97.94311, 25.21798], + [97.84011, 25.27326], + [97.72888, 25.04765], + [97.79892, 24.86214], + [97.5476, 24.74433], + [97.52906, 24.43777], + [97.66777, 24.45652], + [97.73231, 24.11604], + [97.52906, 23.92915], + [97.71514, 23.87202], + [97.82707, 23.9737], + [98.22258, 24.11604], + [98.89823, 24.10852], + [98.67851, 23.91346], + [98.8948, 23.61558], + [98.88931, 23.21295], + [99.25941, 23.08225], + [99.50935, 23.08289], + [99.53887, 22.90021], + [99.31503, 22.73755], + [99.38026, 22.49606], + [99.15504, 22.16833], + [99.47845, 22.13844], + [99.99893, 21.97616], + [99.98931, 21.70911], + [100.13214, 21.70017], + [100.12802, 21.50929], + [100.72197, 21.51249], + [100.88813, 21.68678], + [101.12159, 21.77352], + [101.21635, 21.5623], + [101.21498, 21.23178], + [101.54869, 21.2561], + [101.7176, 21.14407], + [101.77597, 21.836], + [101.61598, 21.97679], + [101.53701, 22.25541], + [101.68533, 22.47703], + [101.86386, 22.3888], + [102.25112, 22.45862], + [102.51136, 22.77681], + [102.86705, 22.6102], + [103.03115, 22.44276], + [103.3731, 22.7996], + [103.52966, 22.59309], + [103.64158, 22.79707], + [103.93409, 22.52524], + [104.04052, 22.72425], + [104.27467, 22.83821], + [104.39895, 22.70018], + [104.58229, 22.86035], + [104.73541, 22.81985], + [104.86312, 22.9508], + [104.81437, 23.11952], + [105.32249, 23.39457], + [105.88073, 22.91855], + [106.12999, 23.00011], + [106.25701, 22.87807], + [106.60446, 22.92993], + [106.83723, 22.80466], + [106.72668, 22.58738], + [106.60995, 22.6026], + [106.56051, 22.3488], + [106.65802, 22.3361], + [106.72943, 22.00799], + [107.05902, 21.9182], + [107.02674, 21.82198], + [107.38243, 21.59615], + [107.87132, 21.64721], + [108.16666, 21.41666], + [108.16666, 18], + [110, 15.2], + [117, 15.2], + [118.5, 10.5], + [116.78216, 8.5], + [116.78216, 7.66089], + [114.75624, 5.79238], + [108.53354, 6.87119], + [102.13866, 6.2691], + [101.94171, 5.86907], + [101.70393, 5.75192], + [101.58195, 5.93332], + [101.26769, 5.80759], + [101.13555, 5.61309], + [100.98436, 5.80612], + [101.08447, 5.90623], + [101.09906, 6.26131], + [100.87133, 6.26333], + [100.81345, 6.44209], + [100.65238, 6.44187], + [100.17113, 6.69311], + [100.11966, 6.42331], + [99.86587, 6.52268], + [99.552, 6.437], + [90, 6.437], + [90, 20], + [92.37098, 20.70281], + [92.19863, 21.32839], + [92.38197, 21.4799], + [92.67997, 21.28873], + [92.60307, 21.98125], + [92.69439, 22.14988], + [92.99514, 21.97743], + [93.04801, 22.20202], + [93.19839, 22.25605], + [93.10775, 22.52778], + [93.13041, 23.05003], + [93.31306, 23.01844], + [93.43597, 23.68603], + [93.33366, 24.09035], + [93.51287, 23.94295], + [93.75732, 24.00507], + [94.12948, 23.8312], + [94.45632, 24.5696], + [94.60601, 24.70878], + [94.73854, 25.13533], + [94.57786, 25.21426], + [94.68618, 25.4659], + [95.04547, 25.73929], + [95.11894, 26.1018], + [95.15121, 26.61492], + [95.44166, 26.70206], + [95.75683, 26.91104], + [96.04522, 27.19235], + [96.23268, 27.27416], + [96.77856, 27.35713], + [96.85821, 27.20212], + [97.17681, 27.14347], + [96.91383, 27.45771], + [96.9001, 27.61662], + [97.39654, 28.00834], + [97.34436, 28.21487], + [97.51602, 28.3346], + [97.50091, 28.49283], + [97.72064, 28.49404], + [98.14086, 28.14526] + ] + ] + }, + "properties": { "cqzone": "26" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "27": { + "mh": [ + "QK23", + "QL20", + "PJ99", + "QJ16", + "QJ37", + "QJ47", + "QJ58", + "RJ15", + "PJ17", + "PJ26", + "PJ27", + "PJ28", + "PK04", + "PK05", + "PK06", + "PK07", + "PK08", + "PK10", + "PK11", + "PK13", + "PK20", + "PK21", + "PK22", + "PJ19", + "QK25", + "QK26", + "QJ96", + "QJ86", + "QJ87", + "QJ97", + "QJ17", + "QJ48", + "QJ57", + "QL17", + "QL16", + "OJ88", + "OJ89", + "OJ98", + "OJ99", + "OK95", + "OK96", + "PJ18", + "PJ29", + "PJ36", + "PJ37", + "PJ38", + "PJ39", + "PK03", + "PK12", + "PK14", + "PK16", + "PK17", + "PK18", + "PK23", + "PK01", + "PK00", + "PJ25", + "OK90", + "OK91", + "OK92", + "OK93", + "OK85", + "OK84", + "OK94", + "PK02", + "PK15", + "PJ53", + "PJ52", + "PJ64", + "PJ65", + "QJ71", + "QJ70", + "QJ72", + "QJ73", + "QJ74", + "QJ75", + "QJ76", + "QJ77", + "QJ78", + "QJ85", + "RJ06", + "QJ65", + "QJ66", + "QJ67", + "QJ68", + "QJ46", + "QL64", + "QL07", + "QL06", + "QK29", + "QK28", + "QK27", + "QK24", + "QK35", + "QK36", + "QK37", + "PJ88", + "PJ89", + "PK90", + "QJ09", + "QK00", + "QJ08", + "QJ07", + "QJ26", + "QJ27", + "QJ28", + "QJ38", + "QJ29", + "QJ59", + "QJ49", + "PJ77", + "PJ76", + "PJ78", + "PJ54", + "OJ87", + "PJ06", + "PJ16", + "QL74", + "QL05", + "QL04", + "PK09", + "PL00", + "PL10", + "PK19", + "PJ09", + "PJ08", + "PJ07", + "PJ35" + ], + "worked": false, + "confirmed": false, + "name": "Philippine Zone", + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [165, 0], + [140, 0], + [130, 2.5], + [127.00219, 5.5], + [119.1477, 4.19658], + [118.98877, 4.79656], + [119.45312, 5.3708], + [118.13962, 6.04534], + [117.93055, 6.61753], + [117.35361, 7.39417], + [116.78216, 7.66089], + [116.78216, 8.5], + [118.5, 10.5], + [117, 15.2], + [121.7, 22], + [130, 22], + [160, 40], + [160, 8], + [165, 2], + [165, 0] + ] + ] + }, + "properties": { "cqzone": "27" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "28": { + "mh": [ + "OJ04", + "OJ05", + "OJ12", + "OJ13", + "OJ14", + "OJ51", + "OJ61", + "OJ62", + "OJ71", + "OJ72", + "OJ73", + "OJ74", + "OJ84", + "OJ85", + "OJ86", + "OJ50", + "QI01", + "QI02", + "QI03", + "QI04", + "QI05", + "QI06", + "QI11", + "QI12", + "QI13", + "QI14", + "QI15", + "QI16", + "QI22", + "QI23", + "QI24", + "QI25", + "QI31", + "QI32", + "QI33", + "QI40", + "QI54", + "QI65", + "RI01", + "NJ83", + "NJ84", + "NJ91", + "NJ92", + "NJ93", + "OI08", + "OI09", + "OI16", + "OI17", + "OI18", + "OI19", + "OI24", + "OI25", + "OI26", + "OI27", + "OI33", + "OI42", + "OI52", + "OI57", + "OI58", + "OI59", + "OI67", + "OI68", + "OI69", + "OI71", + "OI76", + "OI77", + "OI78", + "OI79", + "OI89", + "OI97", + "OJ00", + "OJ01", + "OJ10", + "OJ40", + "OJ60", + "OJ70", + "OJ80", + "OJ81", + "OJ82", + "OJ83", + "PI06", + "PI07", + "PI08", + "PI15", + "PI66", + "PI67", + "PI68", + "PI76", + "PI85", + "PI86", + "PI87", + "PI92", + "PI93", + "PI94", + "PI95", + "PI96", + "PI97", + "PJ00", + "PJ10", + "OI91", + "PI01", + "PI31", + "PJ21", + "OJ02", + "OJ03", + "OJ06", + "OJ11", + "OJ15", + "OJ16", + "OJ21", + "OJ22", + "OJ52", + "OJ63", + "OJ64", + "OJ75", + "OJ94", + "OJ95", + "OJ41", + "QH39", + "QH49", + "QI00", + "QI07", + "QI10", + "QI17", + "QI21", + "QI26", + "QI30", + "QI34", + "QI41", + "QI42", + "QI43", + "QI44", + "QI53", + "QH59", + "QI50", + "QI55", + "QI64", + "NI99", + "NJ74", + "NJ75", + "NJ82", + "NJ85", + "NJ90", + "NJ94", + "OH99", + "OI06", + "OI07", + "OI14", + "OI15", + "OI23", + "OI28", + "OI32", + "OI34", + "OI36", + "OI37", + "OI43", + "OI48", + "OI49", + "OI51", + "OI53", + "OI56", + "OI61", + "OI62", + "OI63", + "OI66", + "OI72", + "OI86", + "OI87", + "OI88", + "OI90", + "OI94", + "OI95", + "OI96", + "OI98", + "OI99", + "OJ90", + "PH09", + "PH19", + "PH29", + "PI00", + "PI04", + "PI05", + "PI09", + "PI10", + "PI16", + "PI17", + "PI18", + "PI19", + "PI39", + "PI47", + "PI49", + "PI56", + "PI57", + "PI58", + "PI59", + "PI69", + "PI75", + "PI77", + "PI78", + "PI79", + "PI81", + "PI82", + "PI84", + "PI88", + "PI91", + "PI98", + "PJ30", + "PJ31", + "PJ40", + "PJ41", + "PI20", + "PI21", + "OJ91", + "PI30", + "PI73", + "PI74", + "RH19", + "RH09", + "RI00", + "QI90", + "QI92", + "QI91", + "QI81", + "QI82", + "QI83", + "QI72", + "QI73", + "QI74", + "QI75", + "QI76", + "QI66", + "QI48", + "QI38", + "QI37", + "QI58", + "QI57", + "QI56", + "QI67", + "QI51", + "QI61", + "QI60", + "RH08", + "QH98", + "QH78", + "QH68", + "QH69", + "PI51", + "PI41", + "PI42", + "PI52", + "PI53", + "PI64", + "PI65", + "PI55", + "PI83", + "QI35", + "QI45", + "QI47", + "QI18", + "PJ70", + "PJ51", + "PJ50", + "PI48", + "PI46", + "PI45", + "PI43", + "PI44", + "PI54", + "QI36", + "QI46", + "QI63", + "QI62", + "QI52", + "QH99", + "QH89", + "QH88", + "QI80", + "QI71", + "QI70", + "QH79", + "PI63", + "PI38", + "PJ42", + "PJ32", + "PJ33", + "PJ34", + "PJ23", + "PJ22", + "PI28", + "PI37", + "PI27", + "PI35", + "PI36", + "PI34", + "PI33", + "PI32", + "PI22", + "PI23", + "PI24", + "PI25", + "PI26", + "PI29", + "PJ20", + "PI11", + "PI12", + "PI13", + "PI14", + "PI02", + "PI03", + "OI92", + "OI93", + "OI80", + "OI81", + "OI82", + "OI83", + "OI84", + "OI85", + "OI73", + "OI75", + "OI74", + "OI64", + "OI65", + "OI54", + "OI55", + "OI44", + "OI45", + "OI46", + "OI47", + "OI35", + "OJ87", + "OJ42", + "OI29", + "OJ20", + "OI38", + "OI39", + "OJ30", + "OJ31", + "OJ32", + "OJ23", + "NI97", + "NI98", + "NJ80", + "NJ81", + "NJ72", + "OJ33", + "OJ43", + "OJ44", + "OJ34", + "OJ92", + "PJ01", + "PJ11", + "PJ05", + "OJ96", + "OJ97", + "PI89", + "PI62", + "PI72", + "QI27", + "PJ60", + "OJ93", + "OJ53", + "OJ24", + "QI20", + "RH18", + "NJ73", + "NJ95" + ], + "worked": false, + "confirmed": false, + "name": "Indonesian Zone", + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [165, 0], + [165, -8], + [163, -13], + [148, -13], + [144, -9.35], + [142.584, -9.35], + [142.19999, -9.2], + [138, -10], + [123, -11.25], + [110, -10], + [90, -10], + [90, 6.437], + [99.552, 6.437], + [99.86587, 6.52268], + [100.11966, 6.42331], + [100.17113, 6.69311], + [100.65238, 6.44187], + [100.81345, 6.44209], + [100.87133, 6.26333], + [101.09906, 6.26131], + [101.08447, 5.90623], + [100.98436, 5.80612], + [101.13555, 5.61309], + [101.26769, 5.80759], + [101.58195, 5.93332], + [101.70393, 5.75192], + [101.94171, 5.86907], + [102.13866, 6.2691], + [108.53354, 6.87119], + [114.75624, 5.79238], + [116.78216, 7.66089], + [117.35361, 7.39417], + [117.93055, 6.61753], + [118.13962, 6.04534], + [119.45312, 5.3708], + [118.98877, 4.79656], + [119.1477, 4.19658], + [127.00219, 5.5], + [130, 2.5], + [140, 0], + [165, 0] + ] + ] + }, + "properties": { "cqzone": "28" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "29": { + "mh": [ + "NA01", + "NA02", + "NA03", + "NA04", + "NA05", + "NA06", + "NA07", + "NA08", + "NA09", + "NA11", + "NA12", + "NA13", + "NA14", + "NA15", + "NA16", + "NA17", + "NA18", + "NA19", + "NA21", + "NA22", + "NA23", + "NA24", + "NA25", + "NA26", + "NA27", + "NA28", + "NA29", + "NA31", + "NA32", + "NA33", + "NA34", + "NA35", + "NA36", + "NA37", + "NA38", + "NA39", + "NA41", + "NA42", + "NA43", + "NA44", + "NA45", + "NA46", + "NA47", + "NA48", + "NA49", + "NA51", + "NA52", + "NA53", + "NA54", + "NA55", + "NA56", + "NA57", + "NA58", + "NA59", + "NA61", + "NA62", + "NA63", + "NA64", + "NA65", + "NA66", + "NA67", + "NA68", + "NA69", + "NA71", + "NA72", + "NA73", + "NA74", + "NA75", + "NA76", + "NA77", + "NA78", + "NA79", + "NA81", + "NA82", + "NA83", + "NA84", + "NA85", + "NA86", + "NA87", + "NA88", + "NA89", + "NA91", + "NA92", + "NA93", + "NA94", + "NA95", + "NA96", + "NA97", + "NA98", + "NA99", + "NB00", + "NB01", + "NB02", + "NB03", + "NB04", + "NB05", + "NB06", + "NB07", + "NB08", + "NB09", + "NB10", + "NB11", + "NB12", + "NB13", + "NB14", + "NB15", + "NB16", + "NB17", + "NB18", + "NB19", + "NB20", + "NB21", + "NB22", + "NB23", + "NB24", + "NB25", + "NB26", + "NB27", + "NB28", + "NB29", + "NB30", + "NB31", + "NB32", + "NB33", + "NB34", + "NB35", + "NB36", + "NB37", + "NB38", + "NB39", + "NB40", + "NB41", + "NB42", + "NB43", + "NB44", + "NB45", + "NB46", + "NB47", + "NB48", + "NB49", + "NB50", + "NB51", + "NB52", + "NB53", + "NB54", + "NB55", + "NB56", + "NB57", + "NB58", + "NB59", + "NB60", + "NB61", + "NB62", + "NB63", + "NB64", + "NB65", + "NB66", + "NB67", + "NB68", + "NB69", + "NB70", + "NB71", + "NB72", + "NB73", + "NB74", + "NB75", + "NB76", + "NB77", + "NB78", + "NB79", + "NB80", + "NB81", + "NB82", + "NB83", + "NB84", + "NB85", + "NB86", + "NB87", + "NB88", + "NB89", + "NB90", + "NB91", + "NB92", + "NB93", + "NB94", + "NB95", + "NB96", + "NB97", + "NB98", + "NB99", + "NC00", + "NC01", + "NC10", + "NC11", + "NC12", + "NC20", + "NC21", + "NC22", + "NC30", + "NC31", + "NC32", + "NC40", + "NC41", + "NC42", + "NC50", + "NC51", + "NC52", + "NC60", + "NC61", + "NC62", + "NC70", + "NC71", + "NC72", + "NC80", + "NC81", + "NC82", + "NC90", + "NC91", + "NC92", + "OA01", + "OA02", + "OA03", + "OA04", + "OA05", + "OA06", + "OA07", + "OA08", + "OA09", + "OA11", + "OA12", + "OA13", + "OA14", + "OA15", + "OA16", + "OA17", + "OA18", + "OA19", + "OA21", + "OA22", + "OA23", + "OA24", + "OA25", + "OA26", + "OA27", + "OA28", + "OA29", + "OA31", + "OA32", + "OA33", + "OA34", + "OA35", + "OA36", + "OA37", + "OA38", + "OA39", + "OA41", + "OA42", + "OA43", + "OA44", + "OA45", + "OA46", + "OA47", + "OA48", + "OA49", + "OA51", + "OA52", + "OA53", + "OA54", + "OA55", + "OA56", + "OA57", + "OA58", + "OA59", + "OA61", + "OA62", + "OA63", + "OA64", + "OA65", + "OA66", + "OA67", + "OA68", + "OA69", + "OA71", + "OA72", + "OA73", + "OA74", + "OA75", + "OA76", + "OA77", + "OA78", + "OA79", + "OA81", + "OA82", + "OA83", + "OA84", + "OA85", + "OA86", + "OA87", + "OA88", + "OA89", + "OA91", + "OA92", + "OA93", + "OA94", + "OA95", + "OA96", + "OA97", + "OA98", + "OA99", + "OB00", + "OB01", + "OB02", + "OB03", + "OB04", + "OB05", + "OB06", + "OB07", + "OB08", + "OB09", + "OB10", + "OB11", + "OB12", + "OB13", + "OB14", + "OB15", + "OB16", + "OB17", + "OB18", + "OB19", + "OB20", + "OB21", + "OB22", + "OB23", + "OB24", + "OB25", + "OB26", + "OB27", + "OB28", + "OB29", + "OB30", + "OB31", + "OB32", + "OB33", + "OB34", + "OB35", + "OB36", + "OB37", + "OB38", + "OB39", + "OB40", + "OB41", + "OB42", + "OB43", + "OB44", + "OB45", + "OB46", + "OB47", + "OB48", + "OB49", + "OB50", + "OB51", + "OB52", + "OB53", + "OB54", + "OB55", + "OB56", + "OB57", + "OB58", + "OB59", + "OB60", + "OB61", + "OB62", + "OB63", + "OB64", + "OB65", + "OB66", + "OB67", + "OB68", + "OB69", + "OB70", + "OB71", + "OB72", + "OB73", + "OB74", + "OB75", + "OB76", + "OB77", + "OB78", + "OB79", + "OB80", + "OB81", + "OB82", + "OB83", + "OB84", + "OB85", + "OB86", + "OB87", + "OB88", + "OB89", + "OB90", + "OB91", + "OB92", + "OB93", + "OB94", + "OB95", + "OB96", + "OB97", + "OB98", + "OB99", + "OC00", + "OC01", + "OC02", + "OC10", + "OC11", + "OC12", + "OC13", + "OC20", + "OC21", + "OC22", + "OC23", + "OC30", + "OC31", + "OC32", + "OC40", + "OC41", + "OC42", + "OC50", + "OC51", + "OC52", + "OC53", + "OC60", + "OC61", + "OC62", + "OC63", + "OC70", + "OC71", + "OC72", + "OC73", + "OC80", + "OC81", + "OC82", + "OC90", + "OC91", + "OC92", + "PA01", + "PA02", + "PA03", + "PA04", + "PA05", + "PA06", + "PA07", + "PA08", + "PA09", + "PA11", + "PA12", + "PA13", + "PA14", + "PA15", + "PA16", + "PA17", + "PA18", + "PA19", + "PA21", + "PA22", + "PA23", + "PA24", + "PA25", + "PA26", + "PA27", + "PA28", + "PA29", + "PA31", + "PA32", + "PA33", + "PA34", + "PA35", + "PA36", + "PA37", + "PA38", + "PA39", + "PB00", + "PB01", + "PB02", + "PB03", + "PB04", + "PB05", + "PB06", + "PB07", + "PB08", + "PB09", + "PB10", + "PB11", + "PB12", + "PB13", + "PB14", + "PB15", + "PB16", + "PB17", + "PB18", + "PB19", + "PB20", + "PB21", + "PB22", + "PB23", + "PB24", + "PB25", + "PB26", + "PB27", + "PB28", + "PB29", + "PB30", + "PB31", + "PB32", + "PB33", + "PB34", + "PB35", + "PB36", + "PB37", + "PB38", + "PB39", + "PC00", + "PC01", + "PC02", + "PC10", + "PC11", + "PC12", + "PC20", + "PC21", + "PC22", + "PC30", + "PC31", + "PC32", + "OF85", + "OF86", + "OF87", + "OF88", + "OF89", + "OF96", + "OF97", + "OF98", + "OF99", + "OG70", + "OG71", + "OG72", + "OG73", + "OG74", + "OG75", + "OG76", + "OG77", + "OG80", + "OG81", + "OG82", + "OG83", + "OG84", + "OG85", + "OG86", + "OG87", + "OG88", + "OG90", + "OG91", + "OG92", + "OG93", + "OG94", + "OG95", + "OG96", + "OG97", + "OG98", + "OG99", + "PF06", + "PF07", + "PF08", + "PF09", + "PF16", + "PF17", + "PF18", + "PF19", + "PF27", + "PF28", + "PF29", + "PF38", + "PF39", + "PF48", + "PF49", + "PG00", + "PG01", + "PG02", + "PG03", + "PG04", + "PG05", + "PG06", + "PG07", + "PG08", + "PG09", + "PG10", + "PG11", + "PG12", + "PG13", + "PG14", + "PG15", + "PG16", + "PG17", + "PG18", + "PG19", + "PG20", + "PG21", + "PG22", + "PG23", + "PG24", + "PG25", + "PG26", + "PG27", + "PG28", + "PG29", + "PG30", + "PG31", + "PG32", + "PG33", + "PG34", + "PG35", + "PG36", + "PG37", + "PG38", + "PG39", + "PG40", + "PG41", + "PG42", + "PG43", + "PG44", + "PG45", + "PG46", + "PG47", + "PG48", + "PG49", + "PG54", + "PG55", + "PG56", + "PG57", + "PG58", + "PG59", + "PG64", + "PG65", + "PG66", + "PG67", + "PG68", + "PG69", + "PG74", + "PG75", + "PG76", + "PG77", + "PG78", + "PG79", + "PG84", + "PG85", + "PG86", + "PG87", + "PG88", + "PG89", + "PH10", + "PH11", + "PH12", + "PH20", + "PH21", + "PH22", + "PH23", + "PH24", + "PH30", + "PH31", + "PH32", + "PH33", + "PH34", + "PH35", + "PH40", + "PH41", + "PH42", + "PH43", + "PH44", + "PH50", + "PH51", + "PH52", + "PH53", + "PH54", + "PH55", + "PH56", + "PH57", + "PH58", + "PH60", + "PH61", + "PH62", + "PH63", + "PH64", + "PH65", + "PH66", + "PH67", + "PH68", + "PH70", + "PH71", + "PH72", + "PH73", + "PH74", + "PH75", + "PH76", + "PH77", + "PH80", + "PH81", + "PH82", + "PH83", + "MA91", + "MA92", + "MA93", + "NC02", + "NC33", + "NC43", + "OC03", + "OC14", + "OC24", + "OC33", + "OC43", + "OC64", + "OC74", + "OC83", + "PA41", + "PA42", + "PA43", + "PA44", + "PA45", + "PA46", + "PA47", + "PA48", + "PA49", + "PB40", + "PB41", + "PB42", + "PB43", + "PB44", + "PB45", + "PB46", + "PB47", + "PB48", + "PB49", + "PC03", + "PC13", + "PC23", + "PC33", + "PC40", + "PC41", + "PC42", + "PC43", + "OF75", + "OF76", + "OF77", + "OF78", + "OF79", + "OF84", + "OF94", + "OF95", + "OG62", + "OG63", + "OG64", + "OG65", + "OG66", + "OG67", + "OG68", + "OG78", + "OG89", + "OH90", + "PF26", + "PF37", + "PF47", + "PH00", + "PH01", + "PH13", + "PH25", + "PH45", + "PH46", + "PH78", + "PH84", + "PH86", + "PH87", + "NC23", + "NC53", + "NC63", + "NC64", + "NC73", + "NC83", + "NC93", + "OC04", + "OC54", + "PH85", + "PH88", + "PH89", + "PH69", + "PH36", + "PH26", + "OG79", + "OG61", + "OH29", + "NH87", + "NH88", + "PF05" + ], + "worked": false, + "confirmed": false, + "name": "Western Zone of Australia", + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [90, -85], + [90, -10], + [110, -10], + [123, -11.25], + [138, -10], + [137.99457, -16.54117], + [137.99899, -25.99697], + [129.00185, -25.99864], + [129, -32], + [129, -85], + [90, -85] + ] + ] + }, + "properties": { "cqzone": "29" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "30": { + "mh": [ + "PA41", + "PA42", + "PA43", + "PA46", + "PA47", + "PA48", + "PA49", + "PA51", + "PA52", + "PA53", + "PA54", + "PA55", + "PA56", + "PA57", + "PA58", + "PA59", + "PA61", + "PA62", + "PA63", + "PA64", + "PA65", + "PA66", + "PA67", + "PA68", + "PA69", + "PA71", + "PA72", + "PA73", + "PA74", + "PA75", + "PA76", + "PA77", + "PA78", + "PA79", + "PA81", + "PA82", + "PA83", + "PA84", + "PA85", + "PA86", + "PA87", + "PA88", + "PA89", + "PA91", + "PA92", + "PA93", + "PA94", + "PA95", + "PA96", + "PA97", + "PA98", + "PA99", + "PB40", + "PB41", + "PB42", + "PB43", + "PB44", + "PB45", + "PB46", + "PB47", + "PB48", + "PB49", + "PB50", + "PB51", + "PB52", + "PB53", + "PB54", + "PB55", + "PB56", + "PB57", + "PB58", + "PB59", + "PB60", + "PB61", + "PB62", + "PB63", + "PB64", + "PB65", + "PB66", + "PB67", + "PB68", + "PB69", + "PB70", + "PB71", + "PB72", + "PB73", + "PB74", + "PB75", + "PB76", + "PB77", + "PB78", + "PB79", + "PB80", + "PB81", + "PB82", + "PB83", + "PB84", + "PB85", + "PB86", + "PB87", + "PB88", + "PB89", + "PB90", + "PB91", + "PB92", + "PB93", + "PB94", + "PB95", + "PB96", + "PB97", + "PB98", + "PB99", + "PC40", + "PC41", + "PC42", + "PC50", + "PC51", + "PC52", + "PC53", + "PC60", + "PC61", + "PC62", + "PC63", + "PC70", + "PC71", + "PC72", + "PC73", + "PC80", + "PC81", + "PC82", + "PC90", + "PC91", + "PC92", + "QA01", + "QA02", + "QA03", + "QA04", + "QA05", + "QA06", + "QA07", + "QA08", + "QA09", + "QA11", + "QA12", + "QA13", + "QA14", + "QA15", + "QA16", + "QA17", + "QA18", + "QA19", + "QA21", + "QA22", + "QA23", + "QA24", + "QA25", + "QA26", + "QA27", + "QA28", + "QA29", + "QA31", + "QA32", + "QA33", + "QA34", + "QA35", + "QA36", + "QA37", + "QA38", + "QA39", + "QA41", + "QA42", + "QA43", + "QA44", + "QA45", + "QA46", + "QA47", + "QA48", + "QA49", + "QA51", + "QA52", + "QA53", + "QA54", + "QA55", + "QA56", + "QA57", + "QA58", + "QA59", + "QA61", + "QA62", + "QA63", + "QA64", + "QA65", + "QA66", + "QA67", + "QA68", + "QA69", + "QA71", + "QA72", + "QA73", + "QA74", + "QA75", + "QA76", + "QA77", + "QA78", + "QA79", + "QA81", + "QA82", + "QA83", + "QA84", + "QA85", + "QA86", + "QA87", + "QA88", + "QA89", + "QA91", + "QA92", + "QA93", + "QA94", + "QA95", + "QA96", + "QA97", + "QA98", + "QA99", + "QB00", + "QB01", + "QB02", + "QB03", + "QB04", + "QB05", + "QB06", + "QB07", + "QB08", + "QB09", + "QB10", + "QB11", + "QB12", + "QB13", + "QB14", + "QB15", + "QB16", + "QB17", + "QB18", + "QB19", + "QB20", + "QB21", + "QB22", + "QB23", + "QB24", + "QB25", + "QB26", + "QB27", + "QB28", + "QB29", + "QB30", + "QB31", + "QB32", + "QB33", + "QB34", + "QB35", + "QB36", + "QB37", + "QB38", + "QB39", + "QB40", + "QB41", + "QB42", + "QB43", + "QB44", + "QB45", + "QB46", + "QB47", + "QB48", + "QB49", + "QB50", + "QB51", + "QB52", + "QB53", + "QB54", + "QB55", + "QB56", + "QB57", + "QB58", + "QB59", + "QB60", + "QB61", + "QB62", + "QB63", + "QB64", + "QB65", + "QB66", + "QB67", + "QB68", + "QB69", + "QB70", + "QB71", + "QB72", + "QB73", + "QB74", + "QB75", + "QB76", + "QB77", + "QB78", + "QB79", + "QB80", + "QB81", + "QB82", + "QB83", + "QB84", + "QB85", + "QB86", + "QB87", + "QB88", + "QB89", + "QB90", + "QB91", + "QB92", + "QB93", + "QB94", + "QB95", + "QB96", + "QB97", + "QB98", + "QB99", + "QC00", + "QC01", + "QC02", + "QC10", + "QC11", + "QC12", + "QC20", + "QC21", + "QC22", + "QC30", + "QC31", + "QC40", + "QC41", + "QC50", + "QC60", + "QC70", + "QC80", + "RA01", + "RA02", + "RA03", + "RA04", + "RA05", + "RA06", + "RA07", + "RA08", + "RA11", + "RA12", + "RA13", + "RA14", + "RA15", + "RA16", + "RA17", + "RA21", + "RA22", + "RA23", + "RA24", + "RA25", + "RA26", + "RA31", + "RA32", + "RA33", + "RA34", + "RA35", + "RA36", + "RA41", + "RA42", + "RA43", + "RA44", + "RA45", + "RA46", + "RB00", + "RB01", + "RB02", + "RB03", + "RB04", + "RB05", + "RB06", + "RB07", + "RB08", + "RB09", + "RB11", + "RB12", + "RB13", + "RB14", + "RB15", + "RB16", + "RB17", + "RB18", + "RB21", + "RB25", + "RB26", + "RB27", + "RB28", + "RB36", + "RB37", + "RB38", + "RB46", + "RB47", + "RB48", + "QF98", + "PF58", + "PF59", + "PF68", + "PF69", + "PF76", + "PF77", + "PF78", + "PF79", + "PF86", + "PF87", + "PF88", + "PF89", + "PF95", + "PF96", + "PF97", + "PF98", + "PF99", + "PG50", + "PG51", + "PG52", + "PG53", + "PG60", + "PG61", + "PG62", + "PG63", + "PG70", + "PG71", + "PG72", + "PG73", + "PG80", + "PG81", + "PG82", + "PG83", + "PG90", + "PG91", + "PG92", + "PG93", + "PG94", + "PG95", + "PG96", + "PG97", + "PG98", + "PG99", + "PH90", + "PH91", + "PH92", + "QE28", + "QE37", + "QE38", + "QF02", + "QF03", + "QF04", + "QF05", + "QF06", + "QF07", + "QF08", + "QF09", + "QF11", + "QF12", + "QF13", + "QF14", + "QF15", + "QF16", + "QF17", + "QF18", + "QF19", + "QF22", + "QF23", + "QF24", + "QF25", + "QF26", + "QF27", + "QF28", + "QF29", + "QF31", + "QF32", + "QF33", + "QF34", + "QF35", + "QF36", + "QF37", + "QF38", + "QF39", + "QF42", + "QF43", + "QF44", + "QF45", + "QF46", + "QF47", + "QF48", + "QF49", + "QF56", + "QF57", + "QF58", + "QF59", + "QF69", + "QG00", + "QG01", + "QG02", + "QG03", + "QG04", + "QG05", + "QG06", + "QG07", + "QG08", + "QG09", + "QG10", + "QG11", + "QG12", + "QG13", + "QG14", + "QG15", + "QG16", + "QG17", + "QG18", + "QG19", + "QG20", + "QG21", + "QG22", + "QG23", + "QG24", + "QG25", + "QG26", + "QG27", + "QG28", + "QG29", + "QG30", + "QG31", + "QG32", + "QG33", + "QG34", + "QG35", + "QG36", + "QG37", + "QG38", + "QG39", + "QG40", + "QG41", + "QG42", + "QG43", + "QG44", + "QG45", + "QG46", + "QG47", + "QG48", + "QG50", + "QG51", + "QG52", + "QG53", + "QG54", + "QG55", + "QG60", + "QG61", + "QG62", + "QG63", + "QG64", + "QH00", + "QH01", + "QH02", + "QH10", + "QH11", + "QH12", + "QH13", + "QH14", + "QH15", + "QH16", + "QH17", + "QH20", + "QH21", + "QH22", + "QH23", + "QH24", + "QH30", + "QD95", + "QH90", + "PC43", + "PC83", + "PC93", + "QC03", + "QC13", + "QC32", + "QC51", + "QC61", + "QC71", + "QC90", + "RA09", + "RA18", + "RA27", + "RA37", + "RB10", + "RB19", + "RB20", + "RB22", + "RB24", + "RB29", + "RB39", + "RB49", + "RB57", + "RB58", + "QC23", + "RB35", + "PF48", + "PF49", + "PF67", + "PF75", + "PF85", + "PF92", + "PF93", + "PF94", + "PG40", + "PG41", + "PG42", + "PG43", + "PG44", + "PG54", + "PG64", + "PG74", + "PG84", + "QE19", + "QE26", + "QE27", + "QE29", + "QE36", + "QE39", + "QE47", + "QE48", + "QE49", + "QF01", + "QF10", + "QF20", + "QF21", + "QF30", + "QF40", + "QF53", + "QF54", + "QF55", + "QF67", + "QF68", + "QG49", + "QG56", + "QG57", + "QG65", + "QH03", + "QH04", + "QH05", + "QH06", + "QH07", + "QH18", + "QH25", + "QH31", + "QH32", + "QH40", + "QH53", + "PA45", + "PA44", + "RC22", + "RC13", + "RB31", + "QH19", + "QH08", + "QG58", + "QG99", + "QG98", + "QH80", + "QH91", + "QH82", + "QH72", + "QH43", + "QH44", + "QH54", + "PH93", + "PF84", + "PF83", + "QF52", + "RB32", + "RB42", + "RB33", + "RB23", + "RC00", + "QE46", + "PC74" + ], + "worked": false, + "confirmed": false, + "name": "Eastern Zone of Australia", + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [129, -85], + [129, -32], + [129.00185, -25.99864], + [137.99899, -25.99697], + [137.99457, -16.54117], + [138, -10], + [142.19999, -9.2], + [142.584, -9.35], + [144, -9.35], + [148, -13], + [163, -13], + [160, -20], + [155, -20], + [165, -32], + [165, -85], + [129, -85] + ] + ] + }, + "properties": { "cqzone": "30" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "31": { + "mh": [ + "AI45", + "RJ63", + "RJ61", + "RI78", + "BK29", + "RI39", + "RJ47", + "RJ49", + "RJ48", + "RJ46", + "RJ59", + "RJ58", + "RJ57", + "RJ56", + "RJ45", + "RJ39", + "RJ38", + "RJ29", + "RK40", + "RK41", + "RK31", + "RK21", + "RK11", + "RK44", + "AI40", + "RI91", + "CI00", + "AJ86", + "RJ66", + "AJ85", + "AI41", + "AI31", + "BI40", + "BI91", + "BI90", + "CI01", + "RH98", + "RH99", + "RI90", + "RI92", + "RI82", + "RI83", + "RI74", + "RI84", + "RI87", + "RI77", + "RI88", + "RI79", + "RJ70", + "RJ60", + "RI69", + "RI49", + "RI48", + "RJ55", + "RJ65", + "RJ44", + "RJ35", + "RJ37", + "RJ28", + "RJ19", + "RJ09", + "RK00", + "RK32", + "RK33", + "RK43", + "RK52", + "RK51", + "RK50", + "RK01", + "RK39", + "RJ62", + "BK28", + "BL20", + "BL10", + "BL11", + "BL01", + "BL02", + "AL91", + "AL92", + "BK19", + "AJ94", + "AJ95", + "BJ04", + "BJ03", + "BJ12", + "BJ11", + "CH09", + "BI92", + "BH38", + "BH48", + "BH39", + "BH49", + "BI30", + "BI24", + "BI14", + "BI25", + "BI26", + "AI99", + "BI09", + "AI35", + "AI25", + "AI26", + "AI36", + "AI46", + "AI47", + "AI19", + "AJ10", + "AJ11", + "AK56", + "AK57", + "AL08", + "BI50", + "BK18", + "AL18", + "AL17", + "AL07", + "RK10", + "RK20", + "RK30", + "RK42", + "RJ36", + "RJ64", + "RI86", + "RI85", + "RI75", + "RI76", + "AL93", + "AL83", + "AL82", + "BL12", + "BL21", + "BL00", + "AL90", + "AL81", + "BL03", + "BK09" + ], + "worked": false, + "confirmed": false, + "name": "Central Pacific Zone", + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-195, -8], + [-195, 2], + [-200, 8], + [-200, 40], + [-130, 40], + [-130, -12], + [-154, -12], + [-156, -7], + [-180, -12], + [-195, -8] + ] + ] + }, + "properties": { "cqzone": "31" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "32": { + "mh": [ + "AA01", + "AA02", + "AA03", + "AA04", + "AA05", + "AA11", + "AA12", + "AA13", + "AA14", + "AA15", + "AA21", + "AA22", + "AA23", + "AA24", + "AA25", + "AA31", + "AA32", + "AA33", + "AA34", + "AA35", + "AA41", + "AA42", + "AA43", + "AA44", + "AA45", + "AA51", + "AA52", + "AA53", + "AA54", + "AA55", + "AA61", + "AA62", + "AA63", + "AA64", + "AA71", + "AA72", + "AA73", + "AA74", + "AA81", + "AA82", + "AA83", + "AA84", + "AA91", + "AA92", + "AA93", + "AA94", + "AB81", + "AB90", + "AB91", + "BA01", + "BA02", + "BA03", + "BA04", + "BA11", + "BA12", + "BA13", + "BA14", + "BA21", + "BA22", + "BA23", + "BA24", + "BA28", + "BA31", + "BA32", + "BA33", + "BA34", + "BA36", + "BA38", + "BA41", + "BA42", + "BA43", + "BA44", + "BA46", + "BA47", + "BA48", + "BA51", + "BA52", + "BA53", + "BA56", + "BA57", + "BA58", + "BA61", + "BA62", + "BA63", + "BA64", + "BA65", + "BA66", + "BA67", + "BA68", + "BA71", + "BA72", + "BA73", + "BA74", + "BA75", + "BA76", + "BA77", + "BA78", + "BA79", + "BA81", + "BA82", + "BA83", + "BA84", + "BA85", + "BA86", + "BA87", + "BA88", + "BA89", + "BA91", + "BA92", + "BA93", + "BA94", + "BA95", + "BA96", + "BA97", + "BA98", + "BA99", + "BB12", + "BB21", + "BB22", + "BB31", + "BB32", + "BB41", + "BB42", + "BB51", + "BB52", + "BB60", + "BB61", + "BB62", + "BB70", + "BB71", + "BB72", + "BB73", + "BB74", + "BB80", + "BB81", + "BB82", + "BB83", + "BB84", + "BB90", + "BB91", + "BB92", + "BB93", + "BB94", + "CA01", + "CA02", + "CA03", + "CA04", + "CA05", + "CA06", + "CA07", + "CA08", + "CA09", + "CA11", + "CA12", + "CA13", + "CA14", + "CA15", + "CA16", + "CA17", + "CA18", + "CA19", + "CA21", + "CA22", + "CA23", + "CA24", + "CA25", + "CA26", + "CA27", + "CA28", + "CA29", + "CA31", + "CA32", + "CA33", + "CA34", + "CA35", + "CA36", + "CA37", + "CA38", + "CA39", + "CA41", + "CA42", + "CA43", + "CA44", + "CA45", + "CA46", + "CA47", + "CA48", + "CA49", + "CA51", + "CA52", + "CA53", + "CA54", + "CA55", + "CA56", + "CA57", + "CA58", + "CA59", + "CA61", + "CA62", + "CA63", + "CA64", + "CA65", + "CA66", + "CA67", + "CA68", + "CA69", + "CA71", + "CA72", + "CA73", + "CA74", + "CA75", + "CA76", + "CA77", + "CA78", + "CA79", + "CA81", + "CA82", + "CA83", + "CA84", + "CA85", + "CA86", + "CA87", + "CA88", + "CA89", + "CA91", + "CA92", + "CA93", + "CA94", + "CA95", + "CA96", + "CA97", + "CA98", + "CA99", + "CB00", + "CB01", + "CB02", + "CB03", + "CB04", + "CB10", + "CB11", + "CB12", + "CB13", + "CB14", + "CB20", + "CB21", + "CB22", + "CB23", + "CB24", + "CB25", + "CB30", + "CB31", + "CB32", + "CB33", + "CB34", + "CB35", + "CB40", + "CB41", + "CB42", + "CB43", + "CB44", + "CB45", + "CB50", + "CB51", + "CB52", + "CB53", + "CB54", + "CB55", + "CB60", + "CB61", + "CB62", + "CB63", + "CB64", + "CB65", + "CB66", + "CB70", + "CB71", + "CB72", + "CB73", + "CB74", + "CB80", + "CB81", + "CB82", + "CB83", + "CB84", + "CB85", + "CB90", + "CB91", + "CB92", + "CB93", + "CB94", + "RA51", + "RA52", + "RA53", + "RA54", + "RA55", + "RA61", + "RA62", + "RA63", + "RA64", + "RA65", + "RA71", + "RA72", + "RA73", + "RA74", + "RA75", + "RA81", + "RA82", + "RA83", + "RA84", + "RA85", + "RA91", + "RA92", + "RA93", + "RA94", + "RD47", + "AE16", + "RH34", + "AG28", + "AH20", + "AG29", + "AH24", + "RG29", + "RE34", + "RE43", + "RE44", + "RE45", + "RE55", + "RE56", + "RE67", + "RE68", + "RF70", + "RF71", + "RF72", + "RF81", + "RF65", + "RE90", + "BH42", + "BH43", + "BH44", + "BH52", + "BH53", + "BH54", + "BH63", + "BH64", + "BH70", + "BH74", + "BG98", + "CG26", + "BG89", + "RH93", + "RH87", + "AH36", + "AH45", + "AA46", + "AA56", + "AA65", + "AA75", + "AA85", + "AB80", + "BA37", + "BA45", + "BA54", + "BA55", + "BA59", + "BA69", + "BB00", + "BB01", + "BB02", + "BB11", + "BB13", + "BB20", + "BB30", + "BB40", + "BB50", + "BB53", + "BB63", + "BB64", + "CB05", + "CB15", + "CB75", + "CB95", + "CB96", + "DB05", + "DB06", + "RA41", + "RA42", + "RA43", + "RA56", + "RA95", + "AE15", + "AH21", + "AH31", + "RG28", + "RG37", + "RG38", + "RG27", + "RE33", + "RE35", + "RE46", + "RE53", + "RE54", + "RE57", + "RE58", + "RE66", + "RE77", + "RE78", + "RE79", + "RE88", + "RE89", + "RF63", + "RF64", + "RF73", + "RF74", + "RF80", + "RF82", + "RF90", + "RF91", + "RF92", + "RE69", + "RD39", + "RD29", + "CG07", + "RH81", + "RH82", + "RH91", + "RH92", + "AH50", + "AH51", + "RG30", + "RG31", + "AH46", + "BI00", + "BI01", + "BI10", + "BI11", + "BG08", + "BG18", + "BG19", + "BH10", + "BG09", + "BH00", + "AH05", + "AH16", + "AH15", + "RD38", + "RD28", + "RE92", + "RE91", + "RE31", + "RE32", + "RE42", + "RG40", + "RG41", + "RH33", + "RG78", + "RH90", + "RH80", + "RH83", + "RG77", + "RG39", + "RG19", + "RH10", + "RH35", + "RH36", + "RH37", + "RH38", + "RI30", + "RI20", + "RH29", + "RH39", + "RH28", + "RH47", + "RH48", + "RH58", + "RH57", + "RH45", + "RH44", + "RH43", + "RH42", + "RH41", + "RH40", + "RG49", + "BA05", + "AA95", + "BA15", + "BA25", + "BA35", + "AA66", + "AA76", + "AA86", + "AA96", + "BA06", + "BA16", + "BA26", + "BA27", + "BA17", + "BA07", + "AA97", + "AA87", + "AA37", + "AA36", + "AA27", + "AA47", + "AA88", + "AB70", + "BA29", + "BA49", + "BA39", + "BA18", + "BA08", + "AA98", + "BB43", + "AB71", + "CB76", + "CB86", + "AE25", + "AE26", + "AF08", + "AF09", + "AG00", + "AG10", + "CG75", + "CG55", + "CG44", + "CG27", + "CG28", + "CG29", + "CH20", + "CH21", + "CH12", + "CH11", + "CH13", + "CH14", + "CH04", + "CH05", + "BH96", + "BH95", + "BH86", + "BH85", + "BH75", + "BH76", + "BH65", + "BH55", + "BH45", + "BH34", + "BH24", + "BH23", + "BH22", + "BH32", + "BH33", + "BH51", + "BH41", + "BH61", + "BH71", + "BG79", + "BG88", + "BG97", + "CG16", + "CG17", + "CG18", + "CG19", + "CH10", + "CG08", + "CG09", + "CH00", + "CH01", + "CH02", + "CH03", + "BH94", + "BH93", + "BH92", + "BH91", + "BH90", + "BG99", + "BH84", + "BH83", + "BH82", + "BH81", + "BH80", + "BH73", + "BH72", + "BH62", + "BG72", + "BG82", + "BG81", + "BG66", + "BG65", + "BG56", + "BG47", + "BG37", + "BG28", + "BG27", + "BG17", + "BG07", + "BH01", + "AH91", + "AG98", + "AH81", + "AH82", + "AG05", + "AG06", + "AG07", + "AG16", + "AG17", + "AG27", + "AH22", + "AH32", + "AH33", + "AH23", + "AH34", + "AH55", + "AH56", + "AH65", + "AH49", + "AH48", + "AH69", + "AH79", + "AH78", + "AH68", + "AH86", + "AH99", + "AI90", + "AH03", + "AH04", + "AH02", + "AH01", + "AH00", + "AG09", + "AG08", + "AG18", + "AG19", + "AH10", + "AH11", + "AH12", + "AH13", + "AH14", + "RA66", + "RA76", + "RA86", + "RA96", + "RG48", + "RH30", + "RH31", + "RH32", + "RH46", + "RG59", + "RG47", + "RG58" + ], + "worked": false, + "confirmed": false, + "name": "New Zealand Zone", + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-195, -8], + [-180, -12], + [-156, -7], + [-154, -12], + [-120, -12], + [-120, -85], + [-195, -85], + [-195, -32], + [-205, -20], + [-200, -20], + [-197, -13], + [-195, -8] + ] + ] + }, + "properties": { "cqzone": "32" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "33": { + "mh": [ + "IL18", + "IM75", + "IM12", + "IL11", + "IL21", + "IL22", + "IL23", + "IL24", + "IL31", + "IL33", + "IL34", + "IL36", + "IL37", + "IL47", + "IL57", + "IL56", + "IL46", + "IL35", + "IL58", + "IL59", + "IL66", + "IL67", + "IL68", + "IL69", + "IL75", + "IL76", + "IL77", + "IL78", + "IL79", + "IL84", + "IL85", + "IL86", + "IL87", + "IL88", + "IL89", + "IL92", + "IL93", + "IL94", + "IL95", + "IL96", + "IL97", + "IL98", + "IL99", + "IM70", + "IM80", + "IM81", + "IM82", + "IM84", + "IM90", + "IM91", + "IM92", + "IM93", + "IM94", + "IM95", + "JK29", + "JL01", + "JL02", + "JL03", + "JL04", + "JL05", + "JL06", + "JL07", + "JL08", + "JL09", + "JL10", + "JL11", + "JL12", + "JL13", + "JL14", + "JL15", + "JL16", + "JL17", + "JL18", + "JL19", + "JL20", + "JL21", + "JL22", + "JL23", + "JL24", + "JL25", + "JL26", + "JL27", + "JL28", + "JL29", + "JL30", + "JL31", + "JL32", + "JL33", + "JL34", + "JL35", + "JL36", + "JL37", + "JL38", + "JL39", + "JL42", + "JL43", + "JL44", + "JL45", + "JL46", + "JL47", + "JL48", + "JL49", + "JL53", + "JM00", + "JM01", + "JM02", + "JM03", + "JM04", + "JM05", + "JM10", + "JM11", + "JM12", + "JM13", + "JM14", + "JM15", + "JM16", + "JM20", + "JM21", + "JM22", + "JM23", + "JM24", + "JM25", + "JM26", + "JM30", + "JM31", + "JM32", + "JM33", + "JM34", + "JM35", + "JM36", + "JM40", + "JM41", + "JM42", + "JM43", + "JM44", + "JM45", + "JM46", + "IL48", + "IM50", + "IM51", + "IM52", + "IM60", + "IM61", + "IM62", + "IM63", + "IM71", + "IM72", + "IM73", + "IM74", + "IM83", + "JM52", + "IL07", + "IL08", + "IL17", + "IL27", + "IL28", + "IL38", + "IL39", + "IM85", + "IL12", + "IL13", + "IL25", + "IL26", + "IL32", + "IL65", + "IL74", + "IL83", + "IL91", + "JK19", + "JK39", + "JL00", + "JL41", + "JL52", + "JL54", + "JM06", + "JM37", + "IL49", + "IM53", + "IM64", + "IM65", + "JM47", + "JM50", + "JM51", + "JM53", + "JM54", + "JM55", + "JM56", + "JM57", + "IM13", + "JK18", + "IL45", + "IL55" + ], + "worked": false, + "confirmed": false, + "name": "Northwestern Zone of Africa", + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-35, 36], + [-6, 36], + [-5.58643, 35.96265], + [-5.00336, 35.99863], + [7, 38.5], + [12.24441, 37.25], + [13.27007, 36], + [11.56604, 33.24828], + [11.48913, 32.66757], + [11.5935, 32.44655], + [11.14169, 32.26614], + [10.65348, 31.97193], + [10.53881, 31.74551], + [10.33007, 31.73043], + [10.12133, 31.48158], + [10.28887, 31.08164], + [10.30673, 30.86757], + [9.95379, 30.38572], + [9.39624, 30.16537], + [9.7887, 29.40556], + [9.9065, 28.75004], + [9.83204, 28.29156], + [9.96632, 27.88144], + [9.78103, 27.26418], + [9.93075, 26.85787], + [9.8635, 26.51679], + [9.50524, 26.37698], + [9.39967, 26.19533], + [10.02842, 25.35397], + [10.04076, 24.95565], + [10.35265, 24.53364], + [10.72362, 24.57057], + [10.95514, 24.52847], + [11.42324, 24.19938], + [11.60295, 24.26581], + [12, 23.49999], + [7.45937, 20.84341], + [5.81301, 19.44323], + [3.35764, 18.96814], + [3.11479, 19.13998], + [3.2591, 19.43548], + [3.25689, 19.83463], + [2.97443, 19.95002], + [2.56171, 20.03337], + [2.20832, 20.31812], + [1.91653, 20.22541], + [1.67385, 20.40193], + [1.59766, 20.59637], + [1.15863, 20.74085], + [1.16658, 21.1163], + [-4.85704, 25.0159], + [-8.66762, 27.31589], + [-8.66761, 26.00058], + [-12.00086, 26.00057], + [-12.00119, 23.45253], + [-12.58201, 23.2717], + [-13.10807, 22.93528], + [-13.00083, 21.33402], + [-16.93657, 21.33373], + [-17.06873, 20.89532], + [-17.05, 20.5], + [-35, 20.5], + [-35, 36] + ] + ] + }, + "properties": { "cqzone": "33" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "34": { + "mh": [ + "JL54", + "JL55", + "JL56", + "JL57", + "JL58", + "JL59", + "JL63", + "JL64", + "JL65", + "JL66", + "JL67", + "JL68", + "JL69", + "JL73", + "JL74", + "JL75", + "JL76", + "JL77", + "JL78", + "JL79", + "JL83", + "JL84", + "JL85", + "JL86", + "JL87", + "JL88", + "JL89", + "JL92", + "JL93", + "JL94", + "JL95", + "JL96", + "JL97", + "JL98", + "JL99", + "JM50", + "JM51", + "JM60", + "JM61", + "JM62", + "JM70", + "JM71", + "JM80", + "KL01", + "KL02", + "KL03", + "KL04", + "KL05", + "KL06", + "KL07", + "KL08", + "KL09", + "KL10", + "KL11", + "KL12", + "KL13", + "KL14", + "KL15", + "KL16", + "KL17", + "KL18", + "KL19", + "KL21", + "KL22", + "KL23", + "KL24", + "KL25", + "KL26", + "KL27", + "KL28", + "KL29", + "KM00", + "KM01", + "KM02", + "KM10", + "KM11", + "KM12", + "KM20", + "KM21", + "KL20", + "KJ29", + "KJ39", + "KJ49", + "KJ59", + "KJ69", + "KK11", + "KK12", + "KK13", + "KK14", + "KK15", + "KK20", + "KK21", + "KK22", + "KK23", + "KK24", + "KK25", + "KK26", + "KK27", + "KK29", + "KK30", + "KK31", + "KK32", + "KK33", + "KK34", + "KK35", + "KK36", + "KK37", + "KK38", + "KK39", + "KK40", + "KK41", + "KK42", + "KK43", + "KK44", + "KK45", + "KK46", + "KK47", + "KK48", + "KK49", + "KK50", + "KK51", + "KK52", + "KK53", + "KK54", + "KK55", + "KK56", + "KK57", + "KK58", + "KK59", + "KK60", + "KK61", + "KK62", + "KK63", + "KK64", + "KK65", + "KK66", + "KK67", + "KK68", + "KK69", + "KK72", + "KK73", + "KK74", + "KK75", + "KK76", + "KK77", + "KK78", + "KK79", + "KK87", + "KK88", + "KK89", + "KL30", + "KL31", + "KL40", + "KL41", + "KL50", + "KL51", + "KL60", + "KL61", + "KL70", + "KL71", + "KL80", + "KK28", + "KL52", + "KL32", + "KL42", + "KL81", + "KL33", + "KL34", + "KL35", + "KL36", + "KL37", + "KL38", + "KL39", + "KL43", + "KL44", + "KL45", + "KL46", + "KL47", + "KL48", + "KL49", + "KL53", + "KL54", + "KL55", + "KL56", + "KL57", + "KL58", + "KL59", + "KL62", + "KL63", + "KL64", + "KL65", + "KL66", + "KL67", + "KL69", + "KL72", + "KL73", + "KL74", + "KM30", + "KM40", + "KM50", + "KM51", + "KM60", + "KJ55", + "KJ57", + "KJ56", + "KJ54", + "KJ64", + "KJ65", + "KJ66", + "KJ67", + "KJ75", + "KJ68", + "KJ28", + "KJ36", + "KJ44", + "KJ45", + "KJ46", + "KJ47", + "KJ37", + "KJ38", + "KJ48", + "KJ58", + "JL45", + "JL46", + "JL47", + "JL48", + "JL49", + "JL53", + "JL62", + "JL72", + "JL82", + "JL91", + "JM40", + "JM52", + "JM72", + "JM81", + "JM90", + "JM91", + "JM92", + "KK19", + "KL00", + "KM22", + "KJ19", + "KJ79", + "KK10", + "KK70", + "KK71", + "KK82", + "KK83", + "KK84", + "KK85", + "KK86", + "KK97", + "KK98", + "KL68", + "KL75", + "KL76", + "KL77", + "KL78", + "KL79", + "KL82", + "KM31", + "KM41", + "KM61", + "KM70", + "KM71", + "KJ53", + "KJ63", + "KJ74", + "KJ76", + "KJ18", + "KJ27", + "KJ35", + "KJ34", + "KJ77", + "JM53", + "JM63", + "KK02", + "KK03", + "KJ78" + ], + "worked": false, + "confirmed": false, + "name": "Northeastern Zone of Africa", + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [39.6967, 18.538], + [38.58123, 18.02118], + [38.26194, 17.5681], + [37.78747, 17.50131], + [37.76207, 17.3834], + [37.51213, 17.3408], + [37.462, 17.12044], + [37.02598, 17.10666], + [37.00401, 16.74931], + [36.90238, 16.68552], + [36.96693, 16.4341], + [36.53434, 15.2292], + [36.43341, 15.16691], + [36.52336, 14.33823], + [36.49589, 13.83474], + [36.28234, 13.37291], + [36.14364, 12.93496], + [36.16012, 12.69795], + [35.66162, 12.63698], + [35.26954, 11.94394], + [35.08827, 11.80821], + [34.98596, 10.89129], + [34.83352, 10.71256], + [34.60281, 10.90478], + [34.29451, 10.58502], + [34.33296, 10.11895], + [34.10224, 9.55809], + [34.14413, 8.60682], + [33.7342, 8.36641], + [33.67515, 8.44656], + [33.2714, 8.46082], + [33.1945, 8.13604], + [32.99537, 7.94431], + [33.04893, 7.79195], + [33.4719, 7.75045], + [33.89762, 7.53744], + [34.01092, 7.26984], + [34.53277, 6.74712], + [35.01823, 6.45859], + [34.96192, 6.25591], + [35.00381, 5.89609], + [35.12535, 5.62418], + [35.31486, 5.49775], + [35.31761, 5.33506], + [35.54008, 5.42325], + [35.85937, 5.32275], + [35.80925, 4.79131], + [35.94863, 4.63117], + [35.59707, 4.62502], + [35.56617, 4.89872], + [35.40824, 5.03212], + [34.65843, 4.76051], + [34.3769, 4.6168], + [33.51242, 3.75052], + [33.1945, 3.77724], + [33.02764, 3.8896], + [32.72003, 3.76491], + [32.41516, 3.74367], + [32.20298, 3.50519], + [31.95442, 3.58606], + [31.80336, 3.83548], + [31.54518, 3.65116], + [31.29043, 3.79368], + [30.97251, 3.69091], + [30.85054, 3.49925], + [30.7754, 3.6823], + [30.55824, 3.62292], + [30.55079, 3.84098], + [30.2165, 3.93845], + [30.15903, 4.11422], + [29.80218, 4.36944], + [29.82617, 4.5565], + [29.49347, 4.69435], + [29.44805, 4.52157], + [29.22183, 4.33886], + [29.02655, 4.49301], + [28.72635, 4.54469], + [28.45564, 4.28788], + [28.20661, 4.35132], + [27.79882, 4.60753], + [27.77611, 4.78303], + [27.46018, 4.99056], + [27.31132, 5.21335], + [27.27973, 5.54559], + [27.16507, 5.77313], + [26.75033, 6.01492], + [26.44821, 6.10914], + [26.54022, 6.20472], + [26.29646, 6.39923], + [26.41731, 6.64619], + [26.11312, 6.82144], + [26.04995, 7.00071], + [25.35781, 7.35293], + [25.17517, 7.57828], + [25.29121, 7.79943], + [25.08934, 7.88854], + [24.86068, 8.1775], + [24.22622, 8.29031], + [24.15275, 8.38067], + [24.26193, 8.69982], + [23.78265, 8.7066], + [23.5073, 8.81247], + [23.58764, 9.00106], + [23.46885, 9.14141], + [23.65562, 9.28714], + [23.67073, 9.89174], + [23.30243, 10.47076], + [23.00193, 10.70716], + [22.87284, 10.93647], + [22.9882, 11.22083], + [22.94288, 11.42686], + [22.78564, 11.40801], + [22.56042, 11.63206], + [22.63183, 12.0514], + [22.36473, 12.44864], + [22.47596, 12.63296], + [22.2013, 12.75756], + [21.94587, 12.63095], + [21.81541, 12.80309], + [21.92665, 13.05004], + [22.28302, 13.34218], + [22.07222, 13.77673], + [22.31597, 14.01469], + [22.53913, 14.11726], + [22.42515, 14.29499], + [22.41004, 14.60617], + [22.71698, 14.69785], + [22.66891, 14.85188], + [23.00468, 15.23847], + [22.92434, 15.54697], + [23.11523, 15.71757], + [23.59108, 15.7645], + [24, 15.6988], + [24, 19.5], + [19.75841, 21.70326], + [15.99997, 23.44922], + [14.1894, 22.64545], + [13.61797, 23.11379], + [13.41288, 23.21085], + [12, 23.49999], + [11.60295, 24.26581], + [11.42324, 24.19938], + [10.95514, 24.52847], + [10.72362, 24.57057], + [10.35265, 24.53364], + [10.04076, 24.95565], + [10.02842, 25.35397], + [9.39967, 26.19533], + [9.50524, 26.37698], + [9.8635, 26.51679], + [9.93075, 26.85787], + [9.78103, 27.26418], + [9.96632, 27.88144], + [9.83204, 28.29156], + [9.9065, 28.75004], + [9.7887, 29.40556], + [9.39624, 30.16537], + [9.95379, 30.38572], + [10.30673, 30.86757], + [10.28887, 31.08164], + [10.12133, 31.48158], + [10.33007, 31.73043], + [10.53881, 31.74551], + [10.65348, 31.97193], + [11.14169, 32.26614], + [11.5935, 32.44655], + [11.48913, 32.66757], + [11.56604, 33.24828], + [13.27007, 36], + [14, 35], + [19, 35], + [34.21791, 31.32478], + [34.49696, 30.67964], + [34.84856, 29.75875], + [34.89532, 29.3726], + [34.45861, 27.95801], + [34.40918, 27.33273], + [39.6967, 18.538] + ] + ] + }, + "properties": { "cqzone": "34" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "35": { + "mh": [ + "IJ39", + "IJ48", + "IJ49", + "IJ57", + "IJ58", + "IJ59", + "IJ67", + "IJ68", + "IJ69", + "IK21", + "IK30", + "IK31", + "IK32", + "IK40", + "IK41", + "IK42", + "IK50", + "IK51", + "IK52", + "IK60", + "IK22", + "JK02", + "JK03", + "JK04", + "JK05", + "JK12", + "JK13", + "JK14", + "JK15", + "JK16", + "JK22", + "JK23", + "JK24", + "JK25", + "JK26", + "JK27", + "JK28", + "JK33", + "JK34", + "JK35", + "JK36", + "JK37", + "JK38", + "JK39", + "JK42", + "JK43", + "JK44", + "JK45", + "JK46", + "JK47", + "JK48", + "JK49", + "JK52", + "JK53", + "JK54", + "JK55", + "JK56", + "JK57", + "JK58", + "JK59", + "JK63", + "JK64", + "JK65", + "JK66", + "JK67", + "JK68", + "JK69", + "JK76", + "JK77", + "JK78", + "JK79", + "JL40", + "JL41", + "JL50", + "JL51", + "JL52", + "JL60", + "JL61", + "JL62", + "JL70", + "JL71", + "JK11", + "HK85", + "HK86", + "JJ06", + "JJ07", + "JJ08", + "JJ09", + "JJ16", + "JJ17", + "JJ18", + "JJ19", + "JK00", + "JK01", + "JK10", + "IK23", + "IK33", + "IJ85", + "IJ86", + "IJ87", + "IJ88", + "IJ89", + "IJ95", + "IJ96", + "IJ97", + "IJ98", + "IJ99", + "IK80", + "IK81", + "IK90", + "IK91", + "IJ78", + "IJ76", + "IJ75", + "IJ65", + "IJ66", + "IJ56", + "IK70", + "IJ79", + "IJ77", + "IJ46", + "IJ47", + "IJ55", + "IK34", + "IK43", + "IK44", + "IK45", + "IK53", + "IK54", + "IK55", + "IK61", + "IK62", + "IK63", + "IK64", + "IK65", + "IK69", + "IK71", + "IK72", + "IK73", + "IK74", + "IK75", + "IK76", + "IK77", + "IK78", + "IK79", + "IK83", + "IK84", + "IK85", + "IK86", + "IK87", + "IK88", + "IK89", + "IK94", + "IK95", + "IK96", + "IK97", + "IK98", + "IK99", + "IL60", + "IL61", + "IL62", + "IL63", + "IL64", + "IL70", + "IL71", + "IL72", + "IL73", + "IL74", + "IL80", + "IL81", + "IL82", + "IL83", + "IL90", + "IL91", + "JK06", + "JK07", + "JK08", + "JK09", + "JK17", + "JK18", + "JK19", + "JL00", + "IK26", + "IK27", + "IK28", + "IK29", + "IK35", + "IK36", + "IK37", + "IK38", + "IK39", + "IK46", + "IK47", + "IK48", + "IK49", + "IK56", + "IK57", + "IK58", + "IK59", + "IK66", + "IK67", + "IK68", + "IL20", + "IL30", + "IL32", + "IL40", + "IL41", + "IL42", + "IL50", + "IL51", + "IL52", + "IL53", + "IL54", + "IL65", + "IL55", + "IL45", + "IL44", + "IL43", + "JJ26", + "JJ27", + "JJ28", + "JJ29", + "JJ34", + "JJ35", + "JJ36", + "JJ37", + "JJ38", + "JJ39", + "JJ46", + "JJ47", + "JJ48", + "JJ49", + "JJ57", + "JJ58", + "JJ59", + "JJ69", + "JK20", + "JK21", + "JK30", + "JK31", + "JK32", + "JK40", + "JK41", + "JK50", + "JK51", + "JK60", + "JK61", + "JK62", + "IK14", + "IK24", + "IK25", + "IJ38", + "IK82", + "IK92", + "IK93", + "IJ29", + "IK20", + "IK11", + "IK12", + "JK29", + "JK75", + "JL30", + "JL31", + "JL42", + "JL53", + "JL63", + "JL72", + "HK74", + "HK75", + "HK76", + "HK84", + "IK13", + "IJ84", + "IJ94", + "JJ05", + "IJ64", + "IJ74", + "IJ45", + "IJ54", + "IL84", + "IL92", + "IL93", + "JL01", + "JL10", + "IK16", + "IK17", + "IK18", + "IK19", + "IL10", + "IL11", + "IL21", + "IL31", + "IL66", + "IL75", + "IL56", + "IL33", + "JJ24", + "JJ25", + "JJ44", + "JJ45", + "JJ56", + "JJ67", + "JJ68", + "JK71", + "JK72", + "JK73", + "IK15", + "IJ37", + "IL57", + "HK77", + "HK87" + ], + "worked": false, + "confirmed": false, + "name": "Central Zone of Africa", + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-26, 20.5], + [-17.05, 20.5], + [-17.06873, 20.89532], + [-16.93657, 21.33373], + [-13.00083, 21.33402], + [-13.10807, 22.93528], + [-12.58201, 23.2717], + [-12.00119, 23.45253], + [-12.00086, 26.00057], + [-8.66761, 26.00058], + [-8.66762, 27.31589], + [-4.85704, 25.0159], + [1.16658, 21.1163], + [1.15863, 20.74085], + [1.59766, 20.59637], + [1.67385, 20.40193], + [1.91653, 20.22541], + [2.20832, 20.31812], + [2.56171, 20.03337], + [2.97443, 19.95002], + [3.25689, 19.83463], + [3.2591, 19.43548], + [3.11479, 19.13998], + [3.35764, 18.96814], + [5.81301, 19.44323], + [7.45937, 20.84341], + [12, 23.49999], + [13.41288, 23.21085], + [13.61797, 23.11379], + [14.1894, 22.64545], + [14.99767, 23.00427], + [15.19752, 21.99847], + [15.19994, 21.49606], + [15.28202, 21.45203], + [15.48187, 20.99663], + [15.42565, 20.79667], + [15.62289, 20.53851], + [15.99843, 20.36163], + [15.75588, 19.94567], + [15.59181, 18.79144], + [15.53348, 16.74936], + [14.64876, 15.99965], + [14.39523, 15.74564], + [13.87233, 15.05209], + [13.8106, 14.73139], + [13.69289, 14.55899], + [13.47015, 14.46395], + [13.63293, 13.71035], + [14.0835, 13.08413], + [14.21404, 12.36763], + [14.46537, 12.35682], + [14.68177, 12.15968], + [14.55137, 11.71889], + [14.61996, 11.51526], + [14.18442, 11.2381], + [13.97554, 11.31682], + [13.56547, 10.61826], + [13.50175, 10.20765], + [13.30867, 10.10251], + [13.21074, 9.55277], + [12.91238, 9.35626], + [12.78328, 8.7473], + [12.24558, 8.38363], + [12.20773, 7.9673], + [11.9996, 7.67337], + [12.01976, 7.52255], + [11.84447, 7.26446], + [11.88248, 7.10549], + [11.62621, 6.98399], + [11.51843, 6.61429], + [11.42304, 6.53169], + [11.09371, 6.52176], + [11.09573, 6.67836], + [10.82462, 6.82549], + [10.84203, 6.93183], + [10.60502, 7.0665], + [10.53226, 6.92365], + [10.21638, 6.88641], + [10.15308, 7.04003], + [9.8654, 6.77597], + [9.78043, 6.79245], + [9.70773, 6.51288], + [9.46785, 6.45191], + [9.26583, 6.18036], + [8.84047, 5.82311], + [8.919, 5.56791], + [8.82085, 5.18122], + [8.54511, 4.71346], + [4, 0], + [-26, 0], + [-26, 20.5] + ] + ] + }, + "properties": { "cqzone": "35" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "36": { + "mh": [ + "JJ51", + "JJ52", + "JJ30", + "JJ31", + "JH63", + "JH64", + "JH65", + "JH66", + "JH73", + "JH74", + "JH75", + "JH76", + "JH77", + "JH78", + "JH79", + "JH83", + "JH84", + "JH85", + "JH86", + "JH87", + "JH88", + "JH89", + "JH92", + "JH93", + "JH94", + "JH95", + "JH96", + "JH97", + "JH98", + "JH99", + "JI62", + "JI63", + "JI64", + "JI70", + "JI71", + "JI72", + "JI73", + "JI74", + "JI80", + "JI81", + "JI82", + "JI83", + "JI84", + "JI90", + "JI91", + "JI92", + "JI93", + "KH02", + "KH03", + "KH04", + "KH05", + "KH06", + "KH07", + "KH08", + "KH09", + "KH12", + "KH13", + "KH14", + "KH16", + "KH17", + "KH18", + "KH19", + "KH26", + "KH27", + "KH28", + "KI00", + "KI01", + "KI02", + "KI03", + "KI10", + "KH29", + "JI65", + "KI45", + "KI46", + "KI47", + "JJ44", + "JJ45", + "JJ53", + "JJ54", + "JJ55", + "JJ56", + "JJ62", + "JJ63", + "JJ64", + "JJ65", + "JJ66", + "JJ67", + "JJ68", + "JJ71", + "JJ72", + "JJ73", + "JJ74", + "JJ75", + "JJ76", + "JJ77", + "JJ78", + "JJ79", + "JJ81", + "JJ82", + "JJ83", + "JK70", + "JK71", + "JK72", + "JK73", + "JJ84", + "JJ85", + "JJ86", + "JJ87", + "JJ88", + "JJ93", + "JJ94", + "JJ95", + "JJ96", + "JJ97", + "JJ98", + "JJ99", + "KJ04", + "KJ05", + "KJ06", + "KJ07", + "KJ08", + "KJ09", + "KJ14", + "KJ15", + "KJ16", + "KJ17", + "KJ18", + "KJ19", + "KJ24", + "KJ25", + "KJ26", + "KJ27", + "KJ35", + "KK00", + "KK10", + "JJ89", + "JK74", + "JK75", + "JK80", + "JK81", + "JK82", + "JK83", + "JK84", + "JK85", + "JK86", + "JK87", + "JK88", + "JK89", + "JK90", + "JK91", + "JK92", + "JK93", + "JK94", + "JK95", + "JK96", + "JK97", + "JK98", + "JK99", + "JL72", + "JL80", + "JL81", + "JL82", + "JL90", + "JL91", + "KK01", + "KK02", + "KK03", + "KK04", + "KK05", + "KK06", + "KK07", + "KK08", + "KK09", + "KK16", + "KK17", + "KK18", + "KK19", + "KL00", + "JI56", + "JI57", + "JI66", + "JI67", + "JI69", + "JI75", + "JI76", + "JI77", + "JI78", + "JI79", + "JI86", + "JI87", + "JI88", + "JI89", + "JJ60", + "JJ61", + "JJ70", + "JJ80", + "JJ91", + "JJ92", + "JI85", + "JI94", + "JI95", + "JI96", + "JI97", + "JI98", + "JI99", + "JJ90", + "KH37", + "KH38", + "KH39", + "KH46", + "KH47", + "KH48", + "KH49", + "KI04", + "KI05", + "KI06", + "KI07", + "KI08", + "KI09", + "KI11", + "KI12", + "KI13", + "KI14", + "KI15", + "KI16", + "KI17", + "KI18", + "KI19", + "KI20", + "KI21", + "KI22", + "KI23", + "KI24", + "KI25", + "KI26", + "KI27", + "KI28", + "KI29", + "KI30", + "KI31", + "KI32", + "KI33", + "KI34", + "KI35", + "KI36", + "KI37", + "KI38", + "KI39", + "KI40", + "KI41", + "KI42", + "KI43", + "KI44", + "KI48", + "KI49", + "KI51", + "KJ00", + "KJ01", + "KJ02", + "KJ03", + "KJ10", + "KJ11", + "KJ12", + "KJ13", + "KJ20", + "KJ21", + "KJ22", + "KJ23", + "KJ30", + "KJ31", + "KJ32", + "KJ33", + "KJ34", + "KJ40", + "KJ41", + "KJ42", + "KJ43", + "JI58", + "JI59", + "JI68", + "JJ50", + "KH22", + "KH23", + "KH24", + "KH25", + "KH32", + "KH33", + "KH34", + "KH35", + "KH36", + "KH44", + "KH45", + "KH55", + "KH56", + "KH57", + "KH58", + "KH59", + "KH67", + "KH68", + "KH69", + "KI50", + "KI60", + "KH15", + "JJ40", + "JJ41", + "JJ42", + "JJ43", + "JH52", + "JH53", + "JH54", + "JH62", + "JH67", + "JH68", + "JH69", + "JH72", + "JH82", + "JI60", + "JI61", + "KI55", + "KI56", + "KI57", + "JJ46", + "JJ57", + "JJ69", + "JK60", + "JK61", + "KJ28", + "KJ36", + "KK11", + "JK63", + "JK64", + "JK65", + "JK76", + "JK77", + "JK78", + "JK79", + "JL70", + "JL71", + "JL73", + "JL83", + "JL92", + "KK12", + "KK13", + "KK14", + "KK15", + "KL01", + "KL10", + "JI54", + "JI55", + "KI52", + "KI53", + "KJ44", + "KJ50", + "KJ51", + "KJ52", + "KJ53", + "KJ54", + "JI47", + "JI48", + "JI49", + "KI58", + "KH43", + "KH54", + "KH65", + "KH66", + "IH74", + "IH73", + "II22", + "II21", + "JI28", + "JI39", + "KH31", + "KH01" + ], + "worked": false, + "confirmed": false, + "name": "Equatorial Zone of Africa", + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-26, -17], + [-26, 0], + [4, 0], + [8.54511, 4.71346], + [8.82085, 5.18122], + [8.919, 5.56791], + [8.84047, 5.82311], + [9.26583, 6.18036], + [9.46785, 6.45191], + [9.70773, 6.51288], + [9.78043, 6.79245], + [9.8654, 6.77597], + [10.15308, 7.04003], + [10.21638, 6.88641], + [10.53226, 6.92365], + [10.60502, 7.0665], + [10.84203, 6.93183], + [10.82462, 6.82549], + [11.09573, 6.67836], + [11.09371, 6.52176], + [11.42304, 6.53169], + [11.51843, 6.61429], + [11.62621, 6.98399], + [11.88248, 7.10549], + [11.84447, 7.26446], + [12.01976, 7.52255], + [11.9996, 7.67337], + [12.20773, 7.9673], + [12.24558, 8.38363], + [12.78328, 8.7473], + [12.91238, 9.35626], + [13.21074, 9.55277], + [13.30867, 10.10251], + [13.50175, 10.20765], + [13.56547, 10.61826], + [13.97554, 11.31682], + [14.18442, 11.2381], + [14.61996, 11.51526], + [14.55137, 11.71889], + [14.68177, 12.15968], + [14.46537, 12.35682], + [14.21404, 12.36763], + [14.0835, 13.08413], + [13.63293, 13.71035], + [13.47015, 14.46395], + [13.69289, 14.55899], + [13.8106, 14.73139], + [13.87233, 15.05209], + [14.39523, 15.74564], + [14.64876, 15.99965], + [15.53348, 16.74936], + [15.59181, 18.79144], + [15.75588, 19.94567], + [15.99843, 20.36163], + [15.62289, 20.53851], + [15.42565, 20.79667], + [15.48187, 20.99663], + [15.28202, 21.45203], + [15.19994, 21.49606], + [15.19752, 21.99847], + [14.99767, 23.00427], + [15.99997, 23.44922], + [19.75841, 21.70326], + [24, 19.5], + [24, 15.6988], + [23.59108, 15.7645], + [23.11523, 15.71757], + [22.92434, 15.54697], + [23.00468, 15.23847], + [22.66891, 14.85188], + [22.71698, 14.69785], + [22.41004, 14.60617], + [22.42515, 14.29499], + [22.53913, 14.11726], + [22.31597, 14.01469], + [22.07222, 13.77673], + [22.28302, 13.34218], + [21.92665, 13.05004], + [21.81541, 12.80309], + [21.94587, 12.63095], + [22.2013, 12.75756], + [22.47596, 12.63296], + [22.36473, 12.44864], + [22.63183, 12.0514], + [22.56042, 11.63206], + [22.78564, 11.40801], + [22.94288, 11.42686], + [22.9882, 11.22083], + [22.87284, 10.93647], + [23.00193, 10.70716], + [23.30243, 10.47076], + [23.67073, 9.89174], + [23.65562, 9.28714], + [23.46885, 9.14141], + [23.58764, 9.00106], + [23.5073, 8.81247], + [23.78265, 8.7066], + [24.26193, 8.69982], + [24.15275, 8.38067], + [24.22622, 8.29031], + [24.86068, 8.1775], + [25.08934, 7.88854], + [25.29121, 7.79943], + [25.17517, 7.57828], + [25.35781, 7.35293], + [26.04995, 7.00071], + [26.11312, 6.82144], + [26.41731, 6.64619], + [26.29646, 6.39923], + [26.54022, 6.20472], + [26.44821, 6.10914], + [26.75033, 6.01492], + [27.16507, 5.77313], + [27.27973, 5.54559], + [27.31132, 5.21335], + [27.46018, 4.99056], + [27.77611, 4.78303], + [27.79882, 4.60753], + [28.20661, 4.35132], + [28.45564, 4.28788], + [28.72635, 4.54469], + [29.02655, 4.49301], + [29.22183, 4.33886], + [29.44805, 4.52157], + [29.49347, 4.69435], + [29.82617, 4.5565], + [29.80218, 4.36944], + [30.15903, 4.11422], + [30.2165, 3.93845], + [30.55079, 3.84098], + [30.55824, 3.62292], + [30.7754, 3.6823], + [30.85054, 3.49925], + [30.94276, 3.50754], + [30.78199, 3.01754], + [30.89151, 2.86188], + [30.75156, 2.41602], + [30.98917, 2.40862], + [31.31592, 2.14783], + [31.03205, 1.75111], + [30.71646, 1.50123], + [30.48038, 1.21567], + [30.2387, 1.13415], + [30.14259, 0.88511], + [29.97783, 0.82916], + [29.97789, 0.50582], + [29.87365, 0.38518], + [29.65282, -0.45965], + [29.59115, -1.38568], + [29.88148, -1.35883], + [29.91511, -1.48268], + [30.16527, -1.34687], + [30.47386, -1.05762], + [30.57264, -1.34033], + [30.83897, -1.65066], + [30.80727, -1.93737], + [30.89716, -2.07387], + [30.85609, -2.31279], + [30.54027, -2.41436], + [30.41081, -2.86185], + [30.67095, -2.99248], + [30.85062, -2.97736], + [30.8387, -3.25715], + [30.49127, -3.52249], + [30.04113, -4.2719], + [29.75605, -4.46725], + [29.41996, -4.44996], + [29.34489, -4.7737], + [29.63524, -5.74597], + [29.51272, -5.92255], + [29.55414, -6.31485], + [29.71056, -6.60242], + [30.17996, -6.94863], + [30.39477, -7.31785], + [30.45549, -7.58419], + [30.70298, -7.9784], + [30.83519, -8.35283], + [31.06109, -8.61769], + [31.37626, -8.58917], + [31.55204, -8.68829], + [31.67976, -8.91628], + [31.94961, -8.93663], + [31.98806, -9.0743], + [32.43782, -9.11837], + [32.54562, -9.25801], + [32.75642, -9.28511], + [33.02833, -9.49919], + [33.0249, -9.63934], + [33.22334, -9.6231], + [33.37921, -9.91542], + [33.31398, -10.06014], + [33.56323, -10.23317], + [33.5749, -10.43988], + [33.7088, -10.56545], + [33.46641, -10.81375], + [33.24462, -10.89333], + [33.40599, -11.1582], + [33.24119, -11.41071], + [33.33252, -11.8183], + [33.2563, -12.13802], + [33.37165, -12.34604], + [33.54744, -12.3722], + [33.36547, -12.56194], + [33.04138, -12.63029], + [32.93769, -12.77364], + [33.02902, -12.90954], + [32.84912, -13.5145], + [32.67265, -13.6213], + [32.845, -13.72338], + [33.03245, -14.04334], + [33.24119, -13.99804], + [31.68388, -14.51048], + [31.5026, -14.6095], + [30.79948, -14.78883], + [30.21926, -14.99786], + [30.37719, -15.34777], + [30.41908, -15.62106], + [29.55734, -15.64486], + [29.21745, -15.77111], + [28.84666, -16.04714], + [28.81576, -16.48548], + [28.25065, -16.72565], + [27.82974, -16.9629], + [27.5489, -17.41617], + [27.3175, -17.59036], + [27.01812, -17.95326], + [26.68922, -18.07798], + [26.21955, -17.88401], + [25.85838, -17.97417], + [25.76637, -17.84676], + [25.40039, -17.85199], + [25.19096, -17.76962], + [25.04676, -17.58971], + [24.65538, -17.49412], + [24.24888, -17.47447], + [21.42353, -18.02662], + [21.21055, -17.92899], + [20.83615, -18.03859], + [20.31869, -17.86542], + [20.13717, -17.91449], + [18.87278, -17.81281], + [18.61639, -17.63008], + [18.42042, -17.38975], + [14.21877, -17.3923], + [13.95655, -17.43381], + [13.51104, -17.1354], + [13.3512, -16.97417], + [12.98363, -16.98211], + [12.44714, -17.26342], + [12.08179, -17.14229], + [11.79396, -17.27467], + [11.5, -17], + [-26, -17] + ] + ] + }, + "properties": { "cqzone": "36" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "37": { + "mh": [ + "KK84", + "KK85", + "KK86", + "KK94", + "KK95", + "KK96", + "LK02", + "LK03", + "LK04", + "LK12", + "KJ74", + "KJ76", + "KJ77", + "KJ78", + "KJ79", + "KJ83", + "KJ84", + "KJ85", + "KJ86", + "KJ87", + "KJ88", + "KJ89", + "KJ93", + "KJ94", + "KJ95", + "KJ96", + "KJ97", + "KJ98", + "KJ99", + "KK70", + "KK71", + "KK80", + "KK81", + "KK82", + "KK83", + "KK90", + "KK91", + "KK92", + "KK93", + "LJ03", + "LJ04", + "LJ05", + "LJ06", + "LJ07", + "LJ08", + "LJ09", + "LJ14", + "LJ15", + "LJ16", + "LJ17", + "LJ18", + "LJ19", + "LJ24", + "LJ25", + "LJ26", + "LJ27", + "LJ28", + "LJ35", + "LJ36", + "LJ37", + "LK00", + "LK01", + "LK11", + "KG65", + "KG66", + "KG67", + "KG68", + "KG69", + "KG76", + "KG77", + "KG78", + "KH54", + "KH60", + "KH61", + "KH62", + "KH63", + "KH64", + "KH65", + "KH70", + "KH71", + "KH72", + "KH73", + "KH74", + "KH75", + "KH76", + "KH77", + "KH78", + "KH82", + "KH83", + "KH84", + "KH85", + "KH86", + "KH87", + "KH88", + "KH93", + "KH94", + "KH95", + "KH96", + "KH97", + "KH98", + "KH99", + "KH66", + "LI08", + "LI09", + "LJ00", + "LJ01", + "LJ02", + "LJ10", + "LJ11", + "LJ12", + "LJ13", + "LJ22", + "LJ23", + "LJ33", + "LJ34", + "LJ46", + "LJ47", + "LJ48", + "LJ49", + "LK40", + "LK51", + "KI69", + "KJ50", + "KJ51", + "KJ52", + "KJ53", + "KJ60", + "KJ61", + "KJ62", + "KJ63", + "KJ70", + "KJ71", + "KJ72", + "KJ73", + "KI59", + "KI58", + "KI68", + "KI77", + "KI78", + "KI79", + "KI86", + "KI87", + "KI88", + "KI89", + "KI96", + "KI97", + "KI98", + "KI99", + "KJ80", + "KJ81", + "KJ82", + "KJ90", + "KJ91", + "KJ92", + "KI95", + "KH79", + "KI70", + "KH89", + "KI52", + "KI53", + "KI54", + "KI55", + "KI56", + "KI57", + "KI61", + "KI62", + "KI63", + "KI64", + "KI65", + "KI66", + "KI67", + "KI71", + "KI72", + "KI73", + "KI74", + "KI75", + "KI76", + "KI80", + "KI81", + "KI82", + "KI83", + "KI84", + "KI85", + "KI90", + "KI91", + "KI92", + "KK87", + "KK97", + "LK05", + "LK13", + "KJ67", + "KJ68", + "KJ75", + "KK72", + "LJ29", + "LJ38", + "LK10", + "KG53", + "KG54", + "KG55", + "KG56", + "KG57", + "KG58", + "KG63", + "KG64", + "KG75", + "KG79", + "KH53", + "KH55", + "KH81", + "KH92", + "LH03", + "LH04", + "LH05", + "LH06", + "LH07", + "LH08", + "LH09", + "LI18", + "LI19", + "LJ21", + "LJ32", + "LJ44", + "LJ45", + "LJ57", + "LJ58", + "LJ59", + "LK41", + "LK50", + "KI48", + "KI49", + "KJ40", + "KJ64", + "LI06", + "LI07", + "KH67", + "KH68", + "KH69", + "KI60", + "KI43", + "KI44", + "KI45", + "KI51", + "KI93", + "KI94", + "LK52", + "KK98" + ], + "worked": false, + "confirmed": false, + "name": "Eastern Zone of Africa", + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [30.85054, 3.49925], + [30.97251, 3.69091], + [31.29043, 3.79368], + [31.54518, 3.65116], + [31.80336, 3.83548], + [31.95442, 3.58606], + [32.20298, 3.50519], + [32.41516, 3.74367], + [32.72003, 3.76491], + [33.02764, 3.8896], + [33.1945, 3.77724], + [33.51242, 3.75052], + [34.3769, 4.6168], + [34.65843, 4.76051], + [35.40824, 5.03212], + [35.56617, 4.89872], + [35.59707, 4.62502], + [35.94863, 4.63117], + [35.80925, 4.79131], + [35.85937, 5.32275], + [35.54008, 5.42325], + [35.31761, 5.33506], + [35.31486, 5.49775], + [35.12535, 5.62418], + [35.00381, 5.89609], + [34.96192, 6.25591], + [35.01823, 6.45859], + [34.53277, 6.74712], + [34.01092, 7.26984], + [33.89762, 7.53744], + [33.4719, 7.75045], + [33.04893, 7.79195], + [32.99537, 7.94431], + [33.1945, 8.13604], + [33.2714, 8.46082], + [33.67515, 8.44656], + [33.7342, 8.36641], + [34.14413, 8.60682], + [34.10224, 9.55809], + [34.33296, 10.11895], + [34.29451, 10.58502], + [34.60281, 10.90478], + [34.83352, 10.71256], + [34.98596, 10.89129], + [35.08827, 11.80821], + [35.26954, 11.94394], + [35.66162, 12.63698], + [36.16012, 12.69795], + [36.14364, 12.93496], + [36.28234, 13.37291], + [36.49589, 13.83474], + [36.52336, 14.33823], + [36.43341, 15.16691], + [36.53434, 15.2292], + [36.96693, 16.4341], + [36.90238, 16.68552], + [37.00401, 16.74931], + [37.02598, 17.10666], + [37.462, 17.12044], + [37.51213, 17.3408], + [37.76207, 17.3834], + [37.78747, 17.50131], + [38.26194, 17.5681], + [38.58123, 18.02118], + [39.6967, 18.538], + [42.52807, 13.5926], + [42.90161, 13.36289], + [44.20898, 11.26461], + [53.17382, 13.9234], + [67, 22], + [67, -3], + [55, -3], + [42, -8], + [42, -15], + [40, -17.5], + [40, -27], + [34, -27], + [32.8965, -26.86022], + [32.13501, -26.83939], + [32.07801, -26.40602], + [32.08625, -26.00743], + [31.9297, -25.83884], + [32.0066, -25.64524], + [32.03407, -25.13286], + [31.98532, -24.30393], + [31.88163, -23.953], + [31.76834, -23.88459], + [31.56028, -23.48152], + [31.56303, -23.18708], + [31.3076, -22.42246], + [31.37626, -22.38119], + [32.41378, -21.31817], + [32.36228, -21.14087], + [32.52365, -20.9095], + [32.49618, -20.61222], + [32.66784, -20.55566], + [32.87109, -20.27766], + [32.86972, -20.10495], + [33.02764, -20.034], + [33.06198, -19.77575], + [32.82989, -19.66975], + [32.84225, -19.0076], + [32.70149, -18.84197], + [32.93563, -18.76722], + [32.8759, -18.51868], + [33.05923, -18.3819], + [32.93701, -18.03229], + [33.04687, -17.63748], + [32.96447, -17.47971], + [33.05168, -17.34671], + [32.83264, -16.92283], + [32.98095, -16.70724], + [32.27371, -16.4328], + [31.91116, -16.40777], + [31.73263, -16.20677], + [31.42501, -16.16127], + [31.14761, -15.98774], + [30.42181, -16.00626], + [30.41908, -15.62106], + [30.37719, -15.34777], + [30.21926, -14.99786], + [30.79948, -14.78883], + [31.5026, -14.6095], + [31.68388, -14.51048], + [33.24119, -13.99804], + [33.03245, -14.04334], + [32.845, -13.72338], + [32.67265, -13.6213], + [32.84912, -13.5145], + [33.02902, -12.90954], + [32.93769, -12.77364], + [33.04138, -12.63029], + [33.36547, -12.56194], + [33.54744, -12.3722], + [33.37165, -12.34604], + [33.2563, -12.13802], + [33.33252, -11.8183], + [33.24119, -11.41071], + [33.40599, -11.1582], + [33.24462, -10.89333], + [33.46641, -10.81375], + [33.7088, -10.56545], + [33.5749, -10.43988], + [33.56323, -10.23317], + [33.31398, -10.06014], + [33.37921, -9.91542], + [33.22334, -9.6231], + [33.0249, -9.63934], + [33.02833, -9.49919], + [32.75642, -9.28511], + [32.54562, -9.25801], + [32.43782, -9.11837], + [31.98806, -9.0743], + [31.94961, -8.93663], + [31.67976, -8.91628], + [31.55204, -8.68829], + [31.37626, -8.58917], + [31.06109, -8.61769], + [30.83519, -8.35283], + [30.70298, -7.9784], + [30.45549, -7.58419], + [30.39477, -7.31785], + [30.17996, -6.94863], + [29.71056, -6.60242], + [29.55414, -6.31485], + [29.51272, -5.92255], + [29.63524, -5.74597], + [29.34489, -4.7737], + [29.41996, -4.44996], + [29.75605, -4.46725], + [30.04113, -4.2719], + [30.49127, -3.52249], + [30.8387, -3.25715], + [30.85062, -2.97736], + [30.67095, -2.99248], + [30.41081, -2.86185], + [30.54027, -2.41436], + [30.85609, -2.31279], + [30.89716, -2.07387], + [30.80727, -1.93737], + [30.83897, -1.65066], + [30.57264, -1.34033], + [30.47386, -1.05762], + [30.16527, -1.34687], + [29.91511, -1.48268], + [29.88148, -1.35883], + [29.59115, -1.38568], + [29.65282, -0.45965], + [29.87365, 0.38518], + [29.97789, 0.50582], + [29.97783, 0.82916], + [30.14259, 0.88511], + [30.2387, 1.13415], + [30.48038, 1.21567], + [30.71646, 1.50123], + [31.03205, 1.75111], + [31.31592, 2.14783], + [30.98917, 2.40862], + [30.75156, 2.41602], + [30.89151, 2.86188], + [30.78199, 3.01754], + [30.94276, 3.50754], + [30.85054, 3.49925] + ] + ] + }, + "properties": { "cqzone": "37" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "38": { + "mh": [ + "HA71", + "HA72", + "HA73", + "HA74", + "HA75", + "HA76", + "HA77", + "HA78", + "HA79", + "HA81", + "HA82", + "HA83", + "HA84", + "HA85", + "HA86", + "HA87", + "HA88", + "HA89", + "HA91", + "HA92", + "HA93", + "HA94", + "HA95", + "HA96", + "HA97", + "HA98", + "HA99", + "HB70", + "HB71", + "HB72", + "HB73", + "HB80", + "HB81", + "HB82", + "HB83", + "HB90", + "HB91", + "HB92", + "HB93", + "IA01", + "IA02", + "IA03", + "IA04", + "IA05", + "IA06", + "IA07", + "IA08", + "IA09", + "IA11", + "IA12", + "IA13", + "IA14", + "IA15", + "IA16", + "IA17", + "IA18", + "IA19", + "IA21", + "IA22", + "IA23", + "IA24", + "IA25", + "IA26", + "IA27", + "IA28", + "IA29", + "IA31", + "IA32", + "IA33", + "IA34", + "IA35", + "IA36", + "IA37", + "IA38", + "IA39", + "IA41", + "IA42", + "IA43", + "IA44", + "IA45", + "IA46", + "IA47", + "IA48", + "IA49", + "IA51", + "IA52", + "IA53", + "IA54", + "IA55", + "IA56", + "IA57", + "IA58", + "IA59", + "IA61", + "IA62", + "IA63", + "IA64", + "IA65", + "IA66", + "IA67", + "IA68", + "IA69", + "IA71", + "IA72", + "IA73", + "IA74", + "IA75", + "IA76", + "IA77", + "IA78", + "IA79", + "IA81", + "IA82", + "IA83", + "IA84", + "IA85", + "IA86", + "IA87", + "IA88", + "IA89", + "IA91", + "IA92", + "IA93", + "IA94", + "IA95", + "IA96", + "IA97", + "IA98", + "IA99", + "IB00", + "IB01", + "IB02", + "IB03", + "IB04", + "IB10", + "IB11", + "IB12", + "IB13", + "IB14", + "IB20", + "IB21", + "IB22", + "IB23", + "IB24", + "IB25", + "IB26", + "IB30", + "IB31", + "IB32", + "IB33", + "IB34", + "IB35", + "IB36", + "IB40", + "IB41", + "IB42", + "IB43", + "IB44", + "IB45", + "IB46", + "IB47", + "IB50", + "IB51", + "IB52", + "IB53", + "IB54", + "IB55", + "IB56", + "IB57", + "IB58", + "IB60", + "IB61", + "IB62", + "IB63", + "IB64", + "IB65", + "IB66", + "IB67", + "IB68", + "IB70", + "IB71", + "IB72", + "IB73", + "IB74", + "IB75", + "IB76", + "IB77", + "IB78", + "IB80", + "IB81", + "IB82", + "IB83", + "IB84", + "IB85", + "IB86", + "IB87", + "IB88", + "IB90", + "IB91", + "IB92", + "IB93", + "IB94", + "IB95", + "IB96", + "IB97", + "IB98", + "JA01", + "JA02", + "JA03", + "JA04", + "JA05", + "JA06", + "JA07", + "JA08", + "JA09", + "JA11", + "JA12", + "JA13", + "JA14", + "JA15", + "JA16", + "JA17", + "JA18", + "JA19", + "JA21", + "JA22", + "JA23", + "JA24", + "JA25", + "JA26", + "JA27", + "JA28", + "JA29", + "JA31", + "JA32", + "JA33", + "JA34", + "JA35", + "JA36", + "JA37", + "JA38", + "JA39", + "JA41", + "JA42", + "JA43", + "JA44", + "JA45", + "JA46", + "JA47", + "JA48", + "JA49", + "JA51", + "JA52", + "JA53", + "JA54", + "JA55", + "JA56", + "JA57", + "JA58", + "JA59", + "JA61", + "JA62", + "JA63", + "JA64", + "JA65", + "JA66", + "JA67", + "JA68", + "JA69", + "JA71", + "JA72", + "JA73", + "JA74", + "JA75", + "JA76", + "JA77", + "JA78", + "JA79", + "JA81", + "JA82", + "JA83", + "JA84", + "JA85", + "JA86", + "JA87", + "JA88", + "JA89", + "JA91", + "JA92", + "JA93", + "JA94", + "JA95", + "JA96", + "JA97", + "JA98", + "JA99", + "JB00", + "JB01", + "JB02", + "JB03", + "JB04", + "JB05", + "JB06", + "JB07", + "JB08", + "JB10", + "JB11", + "JB12", + "JB13", + "JB14", + "JB15", + "JB16", + "JB17", + "JB18", + "JB20", + "JB21", + "JB22", + "JB23", + "JB24", + "JB25", + "JB26", + "JB27", + "JB28", + "JB30", + "JB31", + "JB32", + "JB33", + "JB34", + "JB35", + "JB36", + "JB37", + "JB38", + "JB39", + "JB40", + "JB41", + "JB42", + "JB43", + "JB44", + "JB45", + "JB46", + "JB47", + "JB48", + "JB49", + "JB50", + "JB51", + "JB52", + "JB53", + "JB54", + "JB55", + "JB56", + "JB57", + "JB58", + "JB60", + "JB61", + "JB62", + "JB63", + "JB64", + "JB65", + "JB66", + "JB67", + "JB68", + "JB69", + "JB70", + "JB71", + "JB72", + "JB73", + "JB74", + "JB75", + "JB76", + "JB77", + "JB78", + "JB79", + "JB80", + "JB81", + "JB82", + "JB83", + "JB84", + "JB85", + "JB86", + "JB87", + "JB88", + "JB89", + "JB90", + "JB91", + "JB92", + "JB93", + "JB94", + "JB95", + "JB96", + "JB97", + "JB98", + "JB99", + "KA01", + "KA02", + "KA03", + "KA04", + "KA05", + "KA06", + "KA07", + "KA08", + "KA09", + "KA11", + "KA12", + "KA13", + "KA14", + "KA15", + "KA16", + "KA17", + "KA18", + "KA19", + "KA21", + "KA22", + "KA23", + "KA24", + "KA25", + "KA26", + "KA27", + "KA28", + "KA29", + "KA31", + "KA32", + "KA33", + "KA34", + "KA35", + "KA36", + "KA37", + "KA38", + "KA39", + "KA41", + "KA42", + "KA43", + "KA44", + "KA45", + "KA46", + "KA47", + "KA48", + "KA49", + "KA51", + "KA52", + "KA53", + "KA54", + "KA55", + "KA56", + "KA57", + "KA58", + "KA59", + "KA61", + "KA62", + "KA63", + "KA64", + "KA65", + "KA66", + "KA67", + "KA68", + "KA69", + "KA71", + "KA72", + "KA73", + "KA74", + "KA75", + "KA76", + "KA77", + "KA78", + "KA79", + "KB00", + "KB01", + "KB02", + "KB03", + "KB04", + "KB05", + "KB06", + "KB07", + "KB08", + "KB09", + "KB10", + "KB11", + "KB12", + "KB13", + "KB14", + "KB15", + "KB16", + "KB17", + "KB18", + "KB20", + "KB21", + "KB22", + "KB23", + "KB24", + "KB25", + "KB26", + "KB27", + "KB28", + "KB29", + "KB30", + "KB31", + "KB32", + "KB33", + "KB34", + "KB35", + "KB36", + "KB37", + "KB38", + "KB39", + "KB40", + "KB41", + "KB42", + "KB43", + "KB44", + "KB45", + "KB46", + "KB47", + "KB48", + "KB49", + "KB50", + "KB51", + "KB52", + "KB53", + "KB54", + "KB55", + "KB56", + "KB57", + "KB58", + "KB59", + "KB60", + "KB61", + "KB62", + "KB63", + "KB64", + "KB65", + "KB66", + "KB67", + "KB68", + "KB69", + "KB70", + "KB71", + "KB72", + "KB73", + "KB74", + "KB75", + "KB76", + "KB77", + "KB78", + "KB79", + "KC60", + "KC70", + "JD15", + "KG03", + "KG04", + "KG05", + "KG07", + "KG08", + "KG09", + "KG13", + "KG14", + "KG15", + "KG16", + "KG17", + "KG18", + "KG19", + "KG24", + "KG25", + "KG26", + "KG27", + "KG28", + "KG29", + "KG35", + "KG36", + "KG37", + "KG38", + "KG39", + "KG47", + "KG48", + "KH00", + "KH01", + "KH10", + "KH11", + "KH20", + "KH21", + "KH30", + "KG06", + "KF39", + "KF49", + "KG30", + "KG31", + "KG40", + "KG41", + "KG49", + "KG57", + "KG58", + "KG59", + "KH31", + "KH40", + "KH41", + "KH42", + "KH43", + "KH50", + "KH51", + "KH52", + "KH53", + "JF96", + "JF97", + "JF98", + "JF99", + "JG80", + "JG81", + "JG90", + "JG91", + "KF06", + "KF07", + "KF08", + "KF09", + "KF16", + "KF17", + "KF18", + "KF19", + "KF26", + "KF27", + "KF28", + "KF29", + "KF37", + "KF38", + "KF48", + "KG00", + "KG01", + "KG10", + "KG11", + "KG12", + "KG20", + "KG21", + "KG22", + "KG23", + "KG32", + "KG33", + "KG34", + "KG42", + "KG43", + "KG44", + "KG45", + "KG46", + "KG50", + "KG51", + "KG52", + "KG53", + "KG54", + "KG55", + "KG56", + "KG02", + "JG74", + "JG75", + "JG76", + "JG77", + "JG78", + "JG79", + "JG82", + "JG83", + "JG84", + "JG85", + "JG86", + "JG87", + "JG88", + "JG89", + "JG92", + "JG98", + "JG99", + "JH60", + "JH61", + "JH62", + "JH70", + "JH71", + "JH72", + "JH80", + "JH81", + "JH82", + "JH90", + "JH91", + "JG93", + "JG94", + "JG95", + "JG96", + "JG97", + "HA61", + "HA62", + "HA63", + "HB94", + "IB15", + "IB27", + "IB37", + "IB48", + "JB19", + "JB29", + "JB59", + "JC70", + "JC80", + "JC90", + "KB19", + "KC40", + "KC50", + "KC61", + "KC71", + "KE83", + "KH22", + "KG68", + "KG69", + "KH32", + "KH33", + "KH44", + "KH54", + "KH60", + "KH61", + "KH62", + "KH63", + "JF88", + "JF89", + "JF95", + "KF05", + "KF15", + "KF36", + "KF47", + "KF58", + "KF59", + "KG61", + "KG62", + "KG63", + "JG68", + "JG69", + "JG71", + "JG72", + "JG73", + "JH51", + "JH52", + "JH92", + "KH02", + "KH12", + "IE59", + "IE49", + "IF32", + "IF33", + "IF42", + "IF43", + "KE82", + "KE93", + "KE92", + "JH63", + "KF25", + "JF87", + "JF86", + "JC50", + "JB09", + "JC00", + "IB89", + "IB79", + "IB69", + "IB59", + "IB49", + "IB38", + "HB74", + "HB84", + "HB95", + "HB96", + "IB05", + "IB16", + "IB06", + "HB85", + "HB86", + "IB17" + ], + "worked": false, + "confirmed": false, + "name": "South African Zone", + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-26, -17], + [11.5, -17], + [11.79396, -17.27467], + [12.08179, -17.14229], + [12.44714, -17.26342], + [12.98363, -16.98211], + [13.3512, -16.97417], + [13.51104, -17.1354], + [13.95655, -17.43381], + [14.21877, -17.3923], + [18.42042, -17.38975], + [18.61639, -17.63008], + [18.87278, -17.81281], + [20.13717, -17.91449], + [20.31869, -17.86542], + [20.83615, -18.03859], + [21.21055, -17.92899], + [21.42353, -18.02662], + [24.24888, -17.47447], + [24.65538, -17.49412], + [25.04676, -17.58971], + [25.19096, -17.76962], + [25.40039, -17.85199], + [25.76637, -17.84676], + [25.85838, -17.97417], + [26.21955, -17.88401], + [26.68922, -18.07798], + [27.01812, -17.95326], + [27.3175, -17.59036], + [27.5489, -17.41617], + [27.82974, -16.9629], + [28.25065, -16.72565], + [28.81576, -16.48548], + [28.84666, -16.04714], + [29.21745, -15.77111], + [29.55734, -15.64486], + [30.41908, -15.62106], + [30.42181, -16.00626], + [31.14761, -15.98774], + [31.42501, -16.16127], + [31.73263, -16.20677], + [31.91116, -16.40777], + [32.27371, -16.4328], + [32.98095, -16.70724], + [32.83264, -16.92283], + [33.05168, -17.34671], + [32.96447, -17.47971], + [33.04687, -17.63748], + [32.93701, -18.03229], + [33.05923, -18.3819], + [32.8759, -18.51868], + [32.93563, -18.76722], + [32.70149, -18.84197], + [32.84225, -19.0076], + [32.82989, -19.66975], + [33.06198, -19.77575], + [33.02764, -20.034], + [32.86972, -20.10495], + [32.87109, -20.27766], + [32.66784, -20.55566], + [32.49618, -20.61222], + [32.52365, -20.9095], + [32.36228, -21.14087], + [32.41378, -21.31817], + [31.37626, -22.38119], + [31.3076, -22.42246], + [31.56303, -23.18708], + [31.56028, -23.48152], + [31.76834, -23.88459], + [31.88163, -23.953], + [31.98532, -24.30393], + [32.03407, -25.13286], + [32.0066, -25.64524], + [31.9297, -25.83884], + [32.08625, -26.00743], + [32.07801, -26.40602], + [32.13501, -26.83939], + [32.8965, -26.86022], + [34, -27], + [40, -27], + [40, -85], + [-26, -85], + [-26, -17] + ] + ] + }, + "properties": { "cqzone": "38" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "39": { + "mh": [ + "KA81", + "KA82", + "KA83", + "KA84", + "KA85", + "KA86", + "KA87", + "KA88", + "KA89", + "KA91", + "KA92", + "KA93", + "KA94", + "KA95", + "KA96", + "KA97", + "KA98", + "KA99", + "KB80", + "KB81", + "KB82", + "KB83", + "KB84", + "KB85", + "KB86", + "KB87", + "KB88", + "KB89", + "KB90", + "KB91", + "KB92", + "KB93", + "KB94", + "KB95", + "KB96", + "KB97", + "KB98", + "KB99", + "KC80", + "LA01", + "LA02", + "LA03", + "LA04", + "LA05", + "LA06", + "LA07", + "LA08", + "LA09", + "LA11", + "LA12", + "LA13", + "LA14", + "LA15", + "LA16", + "LA17", + "LA18", + "LA19", + "LA21", + "LA22", + "LA23", + "LA24", + "LA25", + "LA26", + "LA27", + "LA28", + "LA29", + "LA31", + "LA32", + "LA33", + "LA34", + "LA35", + "LA36", + "LA37", + "LA38", + "LA39", + "LA41", + "LA42", + "LA43", + "LA44", + "LA45", + "LA46", + "LA47", + "LA48", + "LA49", + "LA51", + "LA52", + "LA53", + "LA54", + "LA55", + "LA56", + "LA57", + "LA58", + "LA59", + "LA61", + "LA62", + "LA63", + "LA64", + "LA65", + "LA66", + "LA67", + "LA68", + "LA69", + "LA71", + "LA72", + "LA73", + "LA74", + "LA75", + "LA76", + "LA77", + "LA78", + "LA79", + "LA81", + "LA82", + "LA83", + "LA84", + "LA85", + "LA86", + "LA87", + "LA88", + "LA89", + "LA91", + "LA92", + "LA93", + "LA94", + "LA95", + "LA96", + "LA97", + "LA98", + "LA99", + "LB00", + "LB01", + "LB02", + "LB03", + "LB04", + "LB05", + "LB06", + "LB07", + "LB08", + "LB09", + "LB10", + "LB11", + "LB12", + "LB13", + "LB14", + "LB15", + "LB16", + "LB17", + "LB18", + "LB19", + "LB20", + "LB21", + "LB22", + "LB23", + "LB24", + "LB25", + "LB26", + "LB27", + "LB28", + "LB29", + "LB30", + "LB31", + "LB32", + "LB33", + "LB34", + "LB35", + "LB36", + "LB37", + "LB38", + "LB39", + "LB40", + "LB41", + "LB42", + "LB43", + "LB44", + "LB45", + "LB46", + "LB47", + "LB48", + "LB49", + "LB50", + "LB51", + "LB52", + "LB53", + "LB54", + "LB55", + "LB56", + "LB57", + "LB58", + "LB59", + "LB60", + "LB61", + "LB62", + "LB63", + "LB64", + "LB65", + "LB66", + "LB67", + "LB68", + "LB69", + "LB70", + "LB71", + "LB72", + "LB73", + "LB74", + "LB75", + "LB76", + "LB77", + "LB78", + "LB79", + "LB80", + "LB81", + "LB82", + "LB83", + "LB84", + "LB85", + "LB86", + "LB87", + "LB88", + "LB89", + "LB90", + "LB91", + "LB92", + "LB93", + "LB94", + "LB95", + "LB96", + "LB97", + "LB98", + "LB99", + "LC00", + "LC10", + "LC11", + "LC20", + "LC21", + "LC30", + "LC31", + "LC40", + "LC41", + "LC42", + "LC50", + "LC51", + "LC52", + "LC60", + "LC61", + "LC62", + "LC63", + "LC70", + "LC71", + "LC72", + "LC73", + "LC80", + "LC81", + "LC82", + "LC83", + "LC90", + "LC91", + "LC92", + "MA01", + "MA02", + "MA03", + "MA04", + "MA05", + "MA06", + "MA07", + "MA08", + "MA09", + "MA11", + "MA12", + "MA13", + "MA14", + "MA15", + "MA16", + "MA17", + "MA18", + "MA19", + "MA21", + "MA22", + "MA23", + "MA24", + "MA25", + "MA26", + "MA27", + "MA28", + "MA29", + "MA31", + "MA32", + "MA33", + "MA34", + "MA35", + "MA36", + "MA37", + "MA38", + "MA39", + "MA41", + "MA42", + "MA43", + "MA44", + "MA45", + "MA46", + "MA47", + "MA48", + "MA49", + "MA51", + "MA52", + "MA53", + "MA54", + "MA55", + "MA56", + "MA57", + "MA58", + "MA59", + "MA61", + "MA62", + "MA63", + "MA64", + "MA65", + "MA66", + "MA67", + "MA68", + "MA69", + "MA71", + "MA72", + "MA73", + "MA74", + "MA75", + "MA76", + "MA77", + "MA78", + "MA79", + "MA81", + "MA82", + "MA83", + "MA84", + "MA85", + "MA86", + "MA87", + "MA88", + "MA89", + "MA91", + "MA92", + "MA93", + "MA94", + "MA95", + "MA96", + "MA97", + "MA98", + "MA99", + "MB00", + "MB01", + "MB02", + "MB03", + "MB04", + "MB05", + "MB06", + "MB07", + "MB08", + "MB09", + "MB10", + "MB11", + "MB12", + "MB13", + "MB14", + "MB15", + "MB16", + "MB17", + "MB18", + "MB19", + "MB20", + "MB21", + "MB22", + "MB23", + "MB24", + "MB25", + "MB26", + "MB27", + "MB28", + "MB29", + "MB30", + "MB31", + "MB32", + "MB33", + "MB34", + "MB35", + "MB36", + "MB37", + "MB38", + "MB39", + "MB40", + "MB41", + "MB42", + "MB43", + "MB44", + "MB45", + "MB46", + "MB47", + "MB50", + "MB51", + "MB52", + "MB53", + "MB54", + "MB55", + "MB56", + "MB57", + "MB60", + "MB61", + "MB62", + "MB63", + "MB64", + "MB65", + "MB66", + "MB67", + "MB68", + "MB70", + "MB71", + "MB72", + "MB73", + "MB74", + "MB75", + "MB76", + "MB77", + "MB78", + "MB79", + "MB80", + "MB81", + "MB82", + "MB83", + "MB84", + "MB85", + "MB86", + "MB87", + "MB88", + "MB89", + "MB90", + "MB91", + "MB92", + "MB93", + "MB94", + "MB95", + "MB96", + "MB97", + "MB98", + "MB99", + "MC00", + "MC01", + "MC10", + "MC11", + "MC20", + "MC21", + "MC30", + "MC31", + "MC40", + "MC41", + "MC90", + "MC91", + "ME40", + "ME41", + "LH27", + "LI75", + "LG25", + "LG26", + "LG27", + "LG28", + "LG29", + "LG35", + "LG36", + "LG37", + "LG38", + "LG39", + "LH20", + "LH21", + "LH22", + "LH23", + "LH30", + "LH31", + "LH32", + "LH33", + "LH34", + "LH41", + "LH42", + "LH43", + "LH44", + "LH45", + "LH46", + "LH47", + "KA71", + "KA72", + "KA73", + "KC90", + "LC01", + "LC22", + "LC32", + "LC53", + "LC64", + "LC74", + "MB48", + "MB49", + "MB58", + "MB69", + "MC02", + "MC12", + "MC22", + "MC32", + "MC42", + "MC60", + "MC70", + "MC80", + "MI53", + "MI62", + "LE53", + "MD66", + "MD67", + "LG15", + "LG16", + "LG17", + "LG18", + "LG19", + "LG24", + "LG34", + "LG47", + "LG48", + "LG49", + "LH24", + "LH35", + "LH36", + "LH40", + "LH54", + "LH55", + "LH56", + "MC51", + "MC81", + "MB59", + "LC43", + "LC54", + "MF81", + "MF82", + "LH18", + "LH17", + "LH13", + "LH12", + "LG07", + "LG78", + "LG88", + "LG79", + "LG89", + "LH80", + "MH10", + "LH93", + "LH92", + "LH74", + "LH73", + "LH89", + "LH38", + "LI30", + "LH39", + "LI20", + "LI40", + "LI50", + "LH59", + "LI51", + "LI61", + "LI62", + "LI63", + "LI64", + "LI65", + "LI76", + "LI85", + "LI74", + "LI73", + "LI82", + "LI83", + "MI54", + "MI63", + "MI64", + "MD76", + "MD77", + "ME51", + "ME50", + "MD49", + "LE63", + "LE43", + "LE44", + "LE54" + ], + "worked": false, + "confirmed": false, + "name": "Madagascar Zone", + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [40, -85], + [40, -17.5], + [42, -15], + [42, -8], + [55, -3], + [90, -3], + [90, -85], + [40, -85] + ] + ] + }, + "properties": { "cqzone": "39" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "40": { + "mh": [ + "LR20", + "LR30", + "LR40", + "LR50", + "LR60", + "LR70", + "LR71", + "LR80", + "LR81", + "LR90", + "LR91", + "MR00", + "MR01", + "MR10", + "MR11", + "FQ48", + "FQ56", + "FQ58", + "FQ66", + "FQ67", + "FQ68", + "FQ76", + "FQ77", + "FQ78", + "FQ79", + "FQ86", + "FQ87", + "FQ88", + "FQ89", + "FQ96", + "FQ97", + "FQ98", + "FQ99", + "FR60", + "FR70", + "FR80", + "FR90", + "FR91", + "GP36", + "GP37", + "GP39", + "GP43", + "GP44", + "GP45", + "GP46", + "GP47", + "GP48", + "GP51", + "GP52", + "GP53", + "GP54", + "GP55", + "GP56", + "GP57", + "GP58", + "GP59", + "GP61", + "GP62", + "GP63", + "GP64", + "GP65", + "GP66", + "GP67", + "GP68", + "GP69", + "GP70", + "GP71", + "GP72", + "GP73", + "GP74", + "GP75", + "GP76", + "GP77", + "GP78", + "GP79", + "GP81", + "GP82", + "GP83", + "GP84", + "GP85", + "GP86", + "GP87", + "GP88", + "GP89", + "GP94", + "GP95", + "GP96", + "GP97", + "GP98", + "GP99", + "GQ06", + "GQ07", + "GQ08", + "GQ09", + "GQ14", + "GQ15", + "GQ16", + "GQ17", + "GQ18", + "GQ19", + "GQ21", + "GQ23", + "GQ24", + "GQ25", + "GQ26", + "GQ27", + "GQ28", + "GQ29", + "GQ30", + "GQ31", + "GQ32", + "GQ33", + "GQ34", + "GQ35", + "GQ36", + "GQ37", + "GQ38", + "GQ39", + "GQ40", + "GQ41", + "GQ42", + "GQ43", + "GQ44", + "GQ45", + "GQ46", + "GQ47", + "GQ48", + "GQ49", + "GQ50", + "GQ51", + "GQ52", + "GQ53", + "GQ54", + "GQ55", + "GQ56", + "GQ57", + "GQ58", + "GQ59", + "GQ60", + "GQ61", + "GQ62", + "GQ63", + "GQ64", + "GQ65", + "GQ66", + "GQ67", + "GQ68", + "GQ69", + "GQ70", + "GQ71", + "GQ72", + "GQ73", + "GQ74", + "GQ75", + "GQ76", + "GQ77", + "GQ78", + "GQ79", + "GQ80", + "GQ81", + "GQ82", + "GQ83", + "GQ84", + "GQ85", + "GQ86", + "GQ87", + "GQ88", + "GQ89", + "GQ90", + "GQ91", + "GQ92", + "GQ93", + "GQ94", + "GQ95", + "GQ96", + "GQ97", + "GQ98", + "GQ99", + "GR00", + "GR01", + "GR10", + "GR11", + "GR20", + "GR21", + "GR30", + "GR31", + "GR40", + "GR41", + "GR50", + "GR51", + "GR60", + "GR61", + "GR70", + "GR71", + "GR72", + "GR80", + "GR81", + "GR82", + "GR90", + "GR91", + "GR92", + "HP06", + "HP07", + "HP08", + "HP09", + "HP16", + "HP17", + "HP18", + "HP19", + "HP26", + "HP27", + "HP28", + "HP29", + "HP38", + "HP39", + "HP48", + "HP49", + "HP58", + "HP59", + "HP69", + "HP79", + "HQ00", + "HQ01", + "HQ02", + "HQ03", + "HQ04", + "HQ05", + "HQ06", + "HQ07", + "HQ08", + "HQ09", + "HQ10", + "HQ11", + "HQ12", + "HQ13", + "HQ14", + "HQ15", + "HQ16", + "HQ17", + "HQ18", + "HQ19", + "HQ20", + "HQ21", + "HQ22", + "HQ23", + "HQ24", + "HQ25", + "HQ26", + "HQ27", + "HQ28", + "HQ29", + "HQ30", + "HQ31", + "HQ32", + "HQ33", + "HQ34", + "HQ35", + "HQ36", + "HQ37", + "HQ38", + "HQ39", + "HQ40", + "HQ41", + "HQ42", + "HQ43", + "HQ44", + "HQ45", + "HQ46", + "HQ47", + "HQ48", + "HQ49", + "HQ50", + "HQ51", + "HQ52", + "HQ53", + "HQ54", + "HQ55", + "HQ56", + "HQ57", + "HQ58", + "HQ59", + "HQ60", + "HQ61", + "HQ62", + "HQ63", + "HQ64", + "HQ65", + "HQ66", + "HQ67", + "HQ68", + "HQ69", + "HQ71", + "HQ72", + "HQ73", + "HQ74", + "HQ75", + "HQ76", + "HQ77", + "HQ78", + "HQ79", + "HQ81", + "HQ82", + "HQ83", + "HQ84", + "HQ85", + "HQ86", + "HQ87", + "HQ88", + "HQ89", + "HQ93", + "HQ94", + "HQ95", + "HQ97", + "HQ98", + "HQ99", + "HR00", + "HR01", + "HR02", + "HR10", + "HR11", + "HR12", + "HR13", + "HR20", + "HR21", + "HR22", + "HR23", + "HR30", + "HR31", + "HR32", + "HR33", + "HR40", + "HR41", + "HR42", + "HR43", + "HR50", + "HR51", + "HR52", + "HR53", + "HR60", + "HR61", + "HR62", + "HR63", + "HR70", + "HR71", + "HR72", + "HR80", + "HR81", + "HR82", + "HR90", + "IQ09", + "IR00", + "IR01", + "IR10", + "IR11", + "IR21", + "IR31", + "HP85", + "HP94", + "HP95", + "IP04", + "IP05", + "IP14", + "IP15", + "IP24", + "IP25", + "JQ59", + "JQ68", + "JQ69", + "JQ77", + "JQ78", + "JQ79", + "JQ87", + "JQ88", + "JQ89", + "JQ99", + "KQ19", + "KQ29", + "KR00", + "KR10", + "LQ49", + "LQ59", + "LQ99", + "LR51", + "MR20", + "MR21", + "IQ51", + "IQ50", + "IQ61", + "FQ37", + "FQ38", + "FQ46", + "FQ47", + "FQ57", + "FQ59", + "FQ69", + "FQ95", + "FR71", + "FR81", + "GP29", + "GP34", + "GP35", + "GP38", + "GP42", + "GP49", + "GP50", + "GP60", + "GP80", + "GP93", + "GQ05", + "GQ13", + "GQ20", + "GQ22", + "GR02", + "GR12", + "GR22", + "GR32", + "GR42", + "GR52", + "GR62", + "GR73", + "GR83", + "GR93", + "HP05", + "HP15", + "HP36", + "HP37", + "HP68", + "HP78", + "HP89", + "HQ70", + "HQ80", + "HQ90", + "HQ91", + "HQ96", + "HR03", + "HR73", + "HR91", + "IQ05", + "IQ06", + "IQ07", + "IQ08", + "IQ19", + "IR20", + "IR30", + "HP83", + "HP84", + "HP86", + "HP93", + "HP96", + "IP03", + "IP06", + "IP13", + "IP16", + "IP26", + "IP34", + "IP35", + "JQ58", + "JQ67", + "JQ97", + "JQ98", + "JR90", + "KQ07", + "KQ08", + "KQ09", + "KQ17", + "KQ18", + "KQ39", + "KR20", + "KR30", + "JQ86", + "JR80", + "JR70", + "JQ76", + "HP75", + "HP74", + "GO79", + "GO89", + "HQ92", + "IQ04", + "IQ14", + "IQ15", + "IQ17", + "IR41", + "IR02", + "HR92", + "HR83", + "GR63", + "FQ65", + "GQ12", + "LQ69", + "LQ79", + "LQ89", + "MQ09", + "LR61", + "LR41", + "LQ39", + "KR80", + "KR60", + "KR50", + "KQ58", + "KQ48", + "KQ38", + "KQ59", + "KQ26", + "JQ94", + "KQ27" + ], + "worked": false, + "confirmed": false, + "name": "North Atlantic Zone", + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [70, 85], + [70, 80], + [44.98144, 76.40912], + [18.20507, 71.11578], + [-14.95704, 61.77376], + [-35, 56.86499], + [-49, 53], + [-52.24366, 59.58379], + [-57.80762, 67.13942], + [-67.85401, 74.22686], + [-74.03321, 75.49723], + [-74.86176, 77.41913], + [-73.58094, 78.5637], + [-69.88312, 79.50134], + [-68.29468, 80.43897], + [-60.00733, 82.26684], + [-60, 85], + [70, 85] + ] + ] + }, + "properties": { "cqzone": "40" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "01": { + "mh": [ + "BP90", + "BP91", + "BP92", + "BP93", + "BP94", + "BP95", + "BP96", + "BP97", + "BP98", + "BP99", + "CO09", + "CO18", + "CO37", + "CO45", + "CP00", + "CP01", + "CP02", + "CP03", + "CP04", + "CP05", + "CP06", + "CP07", + "CP08", + "CP10", + "CP11", + "CP12", + "CP13", + "CP14", + "CP15", + "CP16", + "CP17", + "CP18", + "CP20", + "CP21", + "CP22", + "CP23", + "CP24", + "CP25", + "CP26", + "CP27", + "CP28", + "CP30", + "CP31", + "CP32", + "CP33", + "CP34", + "CP35", + "CP36", + "CP37", + "CP38", + "CP39", + "CP40", + "CP41", + "CP42", + "CP43", + "CP44", + "CP45", + "CP46", + "CP47", + "CP48", + "CP50", + "CP51", + "CP52", + "CP53", + "CP54", + "CP55", + "CP56", + "CP57", + "CP58", + "CP59", + "CP60", + "CP61", + "CP62", + "CP63", + "CP64", + "CP65", + "CP66", + "CP67", + "CP68", + "CP69", + "CP70", + "CP71", + "CP72", + "CP73", + "CP74", + "CP75", + "CP76", + "CP77", + "CP78", + "CP79", + "CP80", + "CP81", + "CP82", + "CP83", + "CP84", + "CP85", + "CP86", + "CP87", + "CP88", + "CP89", + "CP90", + "CP91", + "CP92", + "CP93", + "CP94", + "CP95", + "CP96", + "CP97", + "CP98", + "CP99", + "CQ72", + "CQ81", + "CQ82", + "CQ83", + "CQ91", + "CQ92", + "CQ93", + "CQ96", + "DP00", + "DP01", + "DP02", + "DP03", + "DP04", + "DP05", + "DP06", + "DP07", + "DP08", + "DP10", + "DP11", + "DP12", + "DP13", + "DP14", + "DP15", + "DP16", + "DP17", + "DP18", + "DP20", + "DP21", + "DP22", + "DP23", + "DP24", + "DP25", + "DP26", + "DP27", + "DP28", + "DP29", + "DP30", + "DP31", + "DP32", + "DP33", + "DP34", + "DP35", + "DP36", + "DP37", + "DP38", + "DP39", + "DP40", + "DP41", + "DP42", + "DP43", + "DP44", + "DP45", + "DP46", + "DP47", + "DP49", + "DP50", + "DP51", + "DP52", + "DP53", + "DP54", + "DP55", + "DP56", + "DP57", + "DP59", + "DP60", + "DP61", + "DP62", + "DP63", + "DP64", + "DP65", + "DP66", + "DP67", + "DP68", + "DP69", + "DP70", + "DP71", + "DP72", + "DP73", + "DP74", + "DP75", + "DP76", + "DP77", + "DP79", + "DP80", + "DP81", + "DP82", + "DP83", + "DP84", + "DP85", + "DP86", + "DP87", + "DQ03", + "DQ06", + "DQ11", + "DQ12", + "DQ13", + "DQ21", + "DQ22", + "DQ25", + "DQ31", + "DQ32", + "DQ34", + "DQ35", + "DQ37", + "DQ40", + "DQ41", + "DQ45", + "DQ47", + "DQ48", + "DQ50", + "DQ51", + "DQ52", + "DQ55", + "DQ56", + "DQ60", + "DQ61", + "DQ62", + "DQ65", + "DQ70", + "DQ71", + "DQ80", + "AO63", + "AO95", + "AO99", + "AP30", + "AP43", + "AP65", + "AP70", + "AP71", + "AP72", + "AP74", + "AP75", + "AP78", + "AP80", + "AP81", + "AP82", + "AP85", + "AP87", + "AP88", + "AP89", + "AP90", + "AP91", + "AP92", + "AP93", + "AP94", + "AP95", + "AP97", + "AP98", + "AP99", + "BO06", + "BO08", + "BO09", + "BO17", + "BO18", + "BO19", + "BO28", + "BO29", + "BO37", + "BO49", + "BP00", + "BP01", + "BP02", + "BP03", + "BP04", + "BP05", + "BP06", + "BP07", + "BP08", + "BP09", + "BP10", + "BP11", + "BP12", + "BP13", + "BP14", + "BP15", + "BP16", + "BP17", + "BP18", + "BP19", + "BP20", + "BP21", + "BP22", + "BP23", + "BP24", + "BP25", + "BP26", + "BP27", + "BP28", + "BP29", + "BP30", + "BP31", + "BP32", + "BP33", + "BP34", + "BP35", + "BP36", + "BP37", + "BP38", + "BP39", + "BP40", + "BP41", + "BP42", + "BP43", + "BP44", + "BP45", + "BP46", + "BP47", + "BP48", + "BP49", + "BP50", + "BP51", + "BP52", + "BP53", + "BP54", + "BP55", + "BP56", + "BP57", + "BP58", + "BP59", + "BP61", + "BP62", + "BP63", + "BP64", + "BP65", + "BP66", + "BP67", + "BP68", + "BP69", + "BP71", + "BP72", + "BP73", + "BP74", + "BP75", + "BP76", + "BP77", + "BP78", + "BP79", + "BP80", + "BP81", + "BP82", + "BP83", + "BP84", + "BP85", + "BP86", + "BP87", + "BP88", + "BP89", + "BQ00", + "BQ10", + "BQ20", + "BQ30", + "CO27", + "CO35", + "CO19", + "CO28", + "CO29", + "CO34", + "CO44", + "CP09", + "CP19", + "CP29", + "CP49", + "CQ40", + "CQ50", + "CQ60", + "CQ71", + "CQ73", + "CQ74", + "CQ84", + "CQ94", + "CQ95", + "CQ97", + "DP09", + "DP19", + "DP48", + "DP58", + "DP78", + "DP88", + "DP89", + "DP98", + "DP99", + "DQ00", + "DQ01", + "DQ02", + "DQ04", + "DQ05", + "DQ07", + "DQ10", + "DQ14", + "DQ15", + "DQ16", + "DQ17", + "DQ20", + "DQ23", + "DQ26", + "DQ27", + "DQ30", + "DQ36", + "DQ38", + "DQ42", + "DQ44", + "DQ53", + "DQ54", + "DQ57", + "DQ58", + "DQ63", + "DQ64", + "DQ66", + "DQ72", + "DQ73", + "DQ75", + "DQ76", + "DQ90", + "AO69", + "AO79", + "AO89", + "AO96", + "AO98", + "AP60", + "AP64", + "AP66", + "AP73", + "AP76", + "AP77", + "AP83", + "AP84", + "AP86", + "AP96", + "AQ80", + "AQ90", + "BO05", + "BO07", + "BO16", + "BO27", + "BO38", + "BO39", + "BO59", + "BO99", + "BP60", + "BP70", + "BQ11", + "BQ21", + "BQ40", + "BQ50", + "BQ60", + "BQ70", + "BQ80", + "CO08", + "CO17", + "AO42", + "AO53", + "AO52", + "AO32", + "AO22", + "AO11", + "AO84", + "AO85", + "AO74", + "BO26", + "BO36", + "BO25", + "BO79", + "AO56", + "AO47", + "AO01", + "AO12", + "AP53", + "AP52", + "AP68", + "CQ86", + "CQ85", + "CQ70", + "DQ43", + "DQ24", + "CO46", + "CO36", + "CO38", + "CO26", + "AO94", + "BO04", + "AO21", + "AO64", + "BO48", + "BO69", + "CO25", + "CO55", + "CQ80", + "DQ33", + "DQ46", + "DQ28", + "AP55", + "AO88", + "BO15", + "AO73", + "BO89" + ], + "worked": false, + "confirmed": false, + "name": "Northwestern Zone of North America", + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-109, 85], + [-109, 77.5], + [-103.25879, 75.28244], + [-103.44947, 72.38268], + [-99.28956, 70.61134], + [-102, 68], + [-102, 60], + [-138.36133, 60], + [-139.05689, 60.00007], + [-138.70738, 59.90607], + [-138.62601, 59.76859], + [-137.60625, 59.2436], + [-137.45116, 58.9081], + [-136.82722, 59.1604], + [-136.58426, 59.16596], + [-136.35377, 59.59978], + [-135.95292, 59.66216], + [-135.47928, 59.79802], + [-135.02885, 59.56367], + [-135.10096, 59.42761], + [-134.95962, 59.28078], + [-134.70074, 59.24892], + [-134.38209, 59.03855], + [-134.25794, 58.86118], + [-133.84038, 58.7293], + [-133.37716, 58.43029], + [-133.462, 58.38787], + [-133.17216, 58.15358], + [-132.55419, 57.49707], + [-132.24867, 57.21155], + [-132.36876, 57.09173], + [-132.04492, 57.04503], + [-132.12367, 56.87386], + [-131.87352, 56.80603], + [-131.83532, 56.59938], + [-131.58149, 56.61231], + [-131.08842, 56.40622], + [-130.78247, 56.36706], + [-130.4683, 56.24314], + [-130.42641, 56.14147], + [-130.10401, 56.12289], + [-130.00408, 55.90735], + [-130.15237, 55.76638], + [-129.9742, 55.28195], + [-130.34604, 54.91772], + [-130.65911, 54.76306], + [-130.61557, 54.70742], + [-134.5376, 54.29444], + [-140, 50], + [-140, 40], + [-190, 40], + [-190, 53], + [-167.68708, 66.66712], + [-180, 75], + [-180, 85], + [-109, 85] + ] + ] + }, + "properties": { "cqzone": "01" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "02": { + "mh": [ + "DP90", + "DP91", + "DP92", + "DP93", + "DP94", + "DP95", + "DP96", + "DP97", + "DQ73", + "DQ88", + "DQ92", + "DQ93", + "DQ98", + "EP00", + "EP01", + "EP02", + "EP03", + "EP04", + "EP05", + "EP06", + "EP07", + "EP10", + "EP11", + "EP12", + "EP13", + "EP14", + "EP15", + "EP16", + "EP17", + "EP19", + "EP20", + "EP21", + "EP22", + "EP23", + "EP24", + "EP25", + "EP26", + "EP27", + "EP32", + "EP33", + "EP34", + "EP35", + "EP36", + "EP37", + "EP38", + "EP39", + "EP44", + "EP45", + "EP46", + "EP47", + "EP48", + "EP49", + "EP54", + "EP56", + "EP57", + "EP58", + "EP65", + "EP66", + "EP73", + "EP74", + "EP76", + "EP77", + "EP78", + "EP79", + "EP82", + "EP84", + "EP87", + "EP88", + "EP89", + "EP93", + "EQ01", + "EQ02", + "EQ03", + "EQ05", + "EQ12", + "EQ18", + "EQ20", + "EQ21", + "EQ22", + "EQ23", + "EQ25", + "EQ26", + "EQ27", + "EQ29", + "EQ30", + "EQ33", + "EQ36", + "EQ39", + "EQ43", + "EQ45", + "EQ46", + "EQ47", + "EQ48", + "EQ49", + "EQ51", + "EQ52", + "EQ56", + "EQ58", + "EQ59", + "EQ60", + "EQ61", + "EQ62", + "EQ63", + "EQ64", + "EQ65", + "EQ66", + "EQ67", + "EQ68", + "EQ69", + "EQ70", + "EQ72", + "EQ75", + "EQ76", + "EQ78", + "EQ80", + "EQ81", + "EQ82", + "EQ83", + "EQ85", + "EQ86", + "EQ87", + "EQ88", + "EQ89", + "EQ90", + "EQ91", + "EQ92", + "EQ95", + "EQ96", + "EQ97", + "EQ98", + "EQ99", + "ER20", + "ER30", + "ER40", + "ER61", + "ER71", + "ER81", + "ER91", + "ER92", + "FO00", + "FO03", + "FO04", + "FO10", + "FO11", + "FO12", + "FO13", + "FO14", + "FO15", + "FO18", + "FO19", + "FO20", + "FO21", + "FO22", + "FO23", + "FO24", + "FO25", + "FO26", + "FO27", + "FO28", + "FO29", + "FO30", + "FO31", + "FO32", + "FO33", + "FO34", + "FO35", + "FO36", + "FO37", + "FO38", + "FO39", + "FO40", + "FO41", + "FO42", + "FO43", + "FO44", + "FO45", + "FO46", + "FO47", + "FO48", + "FO49", + "FO50", + "FO51", + "FO52", + "FO53", + "FO54", + "FO55", + "FO56", + "FO57", + "FO58", + "FO60", + "FO61", + "FO62", + "FO63", + "FO64", + "FO65", + "FO66", + "FO67", + "FO70", + "FO71", + "FO72", + "FO73", + "FO74", + "FO75", + "FO76", + "FO77", + "FO78", + "FO79", + "FO80", + "FO81", + "FO82", + "FO83", + "FO84", + "FO85", + "FO86", + "FO87", + "FO90", + "FO91", + "FO92", + "FO93", + "FO94", + "FO95", + "FP10", + "FP11", + "FP12", + "FP13", + "FP14", + "FP17", + "FP20", + "FP21", + "FP24", + "FP28", + "FP29", + "FP30", + "FP31", + "FP34", + "FP35", + "FP36", + "FP38", + "FP39", + "FP40", + "FP43", + "FP44", + "FP45", + "FP46", + "FP47", + "FP48", + "FP49", + "FP52", + "FP53", + "FP54", + "FP55", + "FP56", + "FP57", + "FP58", + "FP59", + "FP62", + "FP63", + "FP64", + "FP67", + "FP71", + "FP75", + "FP76", + "FP77", + "FP86", + "FQ01", + "FQ03", + "FQ06", + "FQ07", + "FQ08", + "FQ09", + "FQ10", + "FQ11", + "FQ12", + "FQ18", + "FQ19", + "FQ20", + "FQ21", + "FQ29", + "FQ30", + "FQ31", + "FQ40", + "FQ50", + "FR00", + "FR01", + "FR02", + "FR10", + "FR11", + "FR12", + "FR20", + "FR21", + "FR22", + "FR30", + "FR31", + "FR32", + "FR40", + "FR41", + "FR42", + "FR51", + "FR52", + "FR61", + "FR62", + "FR71", + "FR72", + "GO01", + "GO02", + "GO03", + "GO04", + "GO11", + "GO12", + "GO13", + "DP98", + "DP99", + "DQ78", + "DQ79", + "DQ82", + "DQ83", + "DQ89", + "DQ91", + "DQ97", + "DQ99", + "DR90", + "EP08", + "EP09", + "EP18", + "EP28", + "EP29", + "EP31", + "EP42", + "EP43", + "EP53", + "EP55", + "EP63", + "EP64", + "EP67", + "EP68", + "EP75", + "EP83", + "EP85", + "EP86", + "EP91", + "EP92", + "EP94", + "EP96", + "EP97", + "EP98", + "EP99", + "EQ04", + "EQ06", + "EQ07", + "EQ08", + "EQ09", + "EQ10", + "EQ11", + "EQ13", + "EQ14", + "EQ15", + "EQ16", + "EQ17", + "EQ19", + "EQ24", + "EQ28", + "EQ31", + "EQ32", + "EQ34", + "EQ35", + "EQ38", + "EQ42", + "EQ44", + "EQ53", + "EQ54", + "EQ55", + "EQ57", + "EQ71", + "EQ73", + "EQ74", + "EQ77", + "EQ79", + "EQ84", + "EQ93", + "EQ94", + "ER00", + "ER10", + "ER21", + "ER31", + "ER41", + "ER50", + "ER51", + "ER52", + "ER60", + "ER62", + "ER70", + "ER72", + "ER80", + "ER82", + "ER90", + "FO01", + "FO02", + "FO05", + "FO08", + "FO09", + "FO16", + "FO17", + "FO59", + "FO68", + "FO88", + "FO89", + "FO96", + "FO97", + "FP01", + "FP02", + "FP04", + "FP05", + "FP09", + "FP15", + "FP18", + "FP19", + "FP22", + "FP25", + "FP26", + "FP27", + "FP32", + "FP33", + "FP37", + "FP41", + "FP42", + "FP65", + "FP66", + "FP68", + "FP69", + "FP73", + "FP74", + "FP78", + "FP85", + "FP87", + "FP96", + "FP97", + "FQ00", + "FQ02", + "FQ13", + "FQ17", + "FQ22", + "FQ27", + "FQ28", + "FQ39", + "FQ41", + "FQ49", + "FQ60", + "FR13", + "FR23", + "FR33", + "FR43", + "FR50", + "FR53", + "FR60", + "FR81", + "FR82", + "GO00", + "GO05", + "GO14", + "GO21", + "GO22", + "GO23", + "DP78", + "DP88", + "DP66", + "DP56", + "DP67", + "DP57", + "DP58", + "DQ72", + "DQ90", + "DQ63", + "DQ75", + "DQ85", + "DQ95", + "DQ96", + "DQ76", + "DQ86", + "DQ77", + "DQ87", + "EQ37", + "FR92", + "FQ05", + "FQ04", + "FP50", + "FP70", + "GO20", + "FO06", + "FO07", + "EO96", + "EO99", + "FP00", + "FP03", + "FP72", + "FP61", + "FP60", + "EQ50", + "EP59", + "EQ40", + "FP08", + "FP51" + ], + "worked": false, + "confirmed": false, + "name": "Northeastern Zone of North America", + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-109, 85], + [-60, 85], + [-60.00733, 82.26684], + [-68.29468, 80.43897], + [-69.88312, 79.50134], + [-73.58094, 78.5637], + [-74.86176, 77.41913], + [-74.03321, 75.49723], + [-67.85401, 74.22686], + [-57.80762, 67.13942], + [-52.24366, 59.58379], + [-49, 53], + [-55.40406, 51.76497], + [-55.95459, 51.74554], + [-60, 50], + [-79.51764, 50], + [-79.51567, 51.46059], + [-79.77715, 51.85142], + [-80.87246, 54.51586], + [-85, 60], + [-102, 60], + [-102, 68], + [-99.28956, 70.61134], + [-103.44947, 72.38268], + [-103.25879, 75.28244], + [-109, 77.5], + [-109, 85] + ] + ] + }, + "properties": { "cqzone": "02" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "03": { + "mh": [ + "CN79", + "CN89", + "CN99", + "CO19", + "CO29", + "CO38", + "CO39", + "CO46", + "CO47", + "CO48", + "CO49", + "CO52", + "CO53", + "CO54", + "CO55", + "CO56", + "CO57", + "CO58", + "CO59", + "CO60", + "CO61", + "CO62", + "CO63", + "CO64", + "CO65", + "CO66", + "CO67", + "CO68", + "CO69", + "CO71", + "CO72", + "CO73", + "CO74", + "CO75", + "CO76", + "CO77", + "CO78", + "CO79", + "CO80", + "CO81", + "CO82", + "CO83", + "CO84", + "CO85", + "CO86", + "CO87", + "CO88", + "CO89", + "CO90", + "CO91", + "CO92", + "CO93", + "CO94", + "CO95", + "CO96", + "CO97", + "CO98", + "CO99", + "DN09", + "DN19", + "DN29", + "DO00", + "DO01", + "DO02", + "DO10", + "DO11", + "DO20", + "CM88", + "CM89", + "CM95", + "CM96", + "CM97", + "CM98", + "CM99", + "CN80", + "CN81", + "CN82", + "CN83", + "CN84", + "CN85", + "CN86", + "CN87", + "CN90", + "CN91", + "CN92", + "CN93", + "CN94", + "CN95", + "CN96", + "CN97", + "CN98", + "DM04", + "DM05", + "DM06", + "DM07", + "DM08", + "DM09", + "DM13", + "DM14", + "DM15", + "DM16", + "DM17", + "DM18", + "DM19", + "DM23", + "DM24", + "DM25", + "DM26", + "DM27", + "DM28", + "DM29", + "DM32", + "DM33", + "DM34", + "DM35", + "DM36", + "DM37", + "DM38", + "DM39", + "DM41", + "DM42", + "DM43", + "DM44", + "DM45", + "DM46", + "DM47", + "DM48", + "DM49", + "DN00", + "DN01", + "DN02", + "DN03", + "DN04", + "DN05", + "DN06", + "DN07", + "DN08", + "DN10", + "DN11", + "DN12", + "DN13", + "DN14", + "DN15", + "DN16", + "DN17", + "DN18", + "DN20", + "DN21", + "DN22", + "DN23", + "DN24", + "DN25", + "DN26", + "DN30", + "DN31", + "DN32", + "DN33", + "DN40", + "CN69", + "CN78", + "CN88", + "CO09", + "CO28", + "CO32", + "CO33", + "CO34", + "CO36", + "CO37", + "CO42", + "CO43", + "CO44", + "CO45", + "CO51", + "CO70", + "DO03", + "DO12", + "DO21", + "CM79", + "CM86", + "CM87", + "CM94", + "CN70", + "CN71", + "CN72", + "CN73", + "CN74", + "CN75", + "CN76", + "CN77", + "DM03", + "DM12", + "DM22", + "DM31", + "DM51", + "DM52", + "DM53", + "DM54", + "DM55", + "DM56", + "DM57", + "DM58", + "DM59", + "DN27", + "DN34", + "DN35", + "DN41", + "DN42", + "DN43", + "DN44", + "DN50", + "CO50", + "CO18", + "DM02", + "CM93", + "CO41" + ], + "worked": false, + "confirmed": false, + "name": "Western Zone of North America", + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-120, 60], + [-120.00004, 53.80621], + [-119.71336, 53.61468], + [-119.93031, 53.61046], + [-119.72547, 53.38869], + [-119.35569, 53.33997], + [-119.048, 53.12699], + [-118.94716, 53.23879], + [-118.7295, 53.11542], + [-118.60812, 52.87953], + [-118.387, 52.84712], + [-118.21277, 52.3703], + [-117.98785, 52.50018], + [-117.70585, 52.36529], + [-117.83955, 52.27413], + [-117.61123, 52.14424], + [-117.3813, 52.13772], + [-117.01947, 51.89137], + [-116.89597, 51.70269], + [-116.67967, 51.81305], + [-116.59503, 51.66187], + [-116.28396, 51.4564], + [-116.26798, 51.31195], + [-116.00753, 51.22197], + [-115.92352, 51.08306], + [-115.69233, 51.02858], + [-115.64891, 50.8742], + [-115.23017, 50.5775], + [-115.01371, 50.57085], + [-114.7663, 50.35075], + [-114.63997, 49.82774], + [-114.69583, 49.54662], + [-114.40208, 49.21328], + [-114.17258, 49.16246], + [-114.06913, 48.99887], + [-116.04919, 49.00083], + [-116.04883, 47.97688], + [-115.68759, 47.59467], + [-115.74962, 47.44041], + [-115.34074, 47.26279], + [-114.92051, 46.82771], + [-114.61506, 46.63964], + [-114.32068, 46.64697], + [-114.46665, 46.27225], + [-114.40966, 45.85154], + [-114.56614, 45.77284], + [-114.52606, 45.57081], + [-114.34492, 45.45985], + [-113.93798, 45.69578], + [-113.34048, 44.78466], + [-113.13115, 44.77238], + [-113.00348, 44.45076], + [-112.84483, 44.35821], + [-112.7813, 44.48487], + [-112.3868, 44.44752], + [-112.28617, 44.56849], + [-112.09633, 44.52319], + [-111.50915, 44.56318], + [-111.39387, 44.75257], + [-111.04898, 44.47404], + [-111.04672, 40.99789], + [-109.05007, 41.00066], + [-109.06006, 38.27589], + [-109.0417, 38.16582], + [-109.05381, 35.59184], + [-109.05005, 31.3325], + [-111.0748, 31.33221], + [-111.76118, 31.55213], + [-114.81351, 32.49425], + [-114.7197, 32.71873], + [-117.12486, 32.53404], + [-120, 32.5], + [-130, 32.5], + [-130, 40], + [-140, 40], + [-140, 50], + [-134.5376, 54.29444], + [-130.61557, 54.70742], + [-130.65911, 54.76306], + [-130.34604, 54.91772], + [-129.9742, 55.28195], + [-130.15237, 55.76638], + [-130.00408, 55.90735], + [-130.10401, 56.12289], + [-130.42641, 56.14147], + [-130.4683, 56.24314], + [-130.78247, 56.36706], + [-131.08842, 56.40622], + [-131.58149, 56.61231], + [-131.83532, 56.59938], + [-131.87352, 56.80603], + [-132.12367, 56.87386], + [-132.04492, 57.04503], + [-132.36876, 57.09173], + [-132.24867, 57.21155], + [-132.55419, 57.49707], + [-133.17216, 58.15358], + [-133.462, 58.38787], + [-133.37716, 58.43029], + [-133.84038, 58.7293], + [-134.25794, 58.86118], + [-134.38209, 59.03855], + [-134.70074, 59.24892], + [-134.95962, 59.28078], + [-135.10096, 59.42761], + [-135.02885, 59.56367], + [-135.47928, 59.79802], + [-135.95292, 59.66216], + [-136.35377, 59.59978], + [-136.58426, 59.16596], + [-136.82722, 59.1604], + [-137.45116, 58.9081], + [-137.60625, 59.2436], + [-138.62601, 59.76859], + [-138.70738, 59.90607], + [-139.05689, 60.00007], + [-138.36133, 60], + [-120, 60] + ] + ] + }, + "properties": { "cqzone": "03" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "04": { + "mh": [ + "DN39", + "DN49", + "DN59", + "DN69", + "DN79", + "DN89", + "DN99", + "DO03", + "DO04", + "DO05", + "DO06", + "DO07", + "DO08", + "DO09", + "DO12", + "DO13", + "DO14", + "DO15", + "DO16", + "DO17", + "DO18", + "DO19", + "DO21", + "DO22", + "DO23", + "DO24", + "DO25", + "DO26", + "DO27", + "DO28", + "DO29", + "DO30", + "DO31", + "DO32", + "DO33", + "DO34", + "DO35", + "DO36", + "DO37", + "DO38", + "DO39", + "DO40", + "DO41", + "DO42", + "DO43", + "DO44", + "DO45", + "DO46", + "DO47", + "DO48", + "DO49", + "DO50", + "DO51", + "DO52", + "DO53", + "DO54", + "DO55", + "DO56", + "DO57", + "DO58", + "DO59", + "DO60", + "DO61", + "DO62", + "DO63", + "DO64", + "DO65", + "DO66", + "DO67", + "DO68", + "DO69", + "DO70", + "DO71", + "DO72", + "DO73", + "DO74", + "DO75", + "DO76", + "DO77", + "DO78", + "DO79", + "DO80", + "DO81", + "DO82", + "DO83", + "DO84", + "DO85", + "DO86", + "DO87", + "DO88", + "DO89", + "DO90", + "DO91", + "DO92", + "DO93", + "DO94", + "DO95", + "DO96", + "DO97", + "DO98", + "DO99", + "EN09", + "EN19", + "EN28", + "EN29", + "EN38", + "EN39", + "EN48", + "EN49", + "EN59", + "EN69", + "EN76", + "EN78", + "EN79", + "EN81", + "EN82", + "EN83", + "EN86", + "EN87", + "EN88", + "EN89", + "EN91", + "EN93", + "EN94", + "EN96", + "EN97", + "EN98", + "EN99", + "EO00", + "EO01", + "EO02", + "EO03", + "EO04", + "EO05", + "EO06", + "EO07", + "EO08", + "EO09", + "EO10", + "EO11", + "EO12", + "EO13", + "EO14", + "EO15", + "EO16", + "EO17", + "EO18", + "EO19", + "EO20", + "EO21", + "EO22", + "EO23", + "EO24", + "EO25", + "EO26", + "EO27", + "EO28", + "EO29", + "EO30", + "EO31", + "EO32", + "EO33", + "EO34", + "EO35", + "EO36", + "EO37", + "EO40", + "EO41", + "EO42", + "EO43", + "EO44", + "EO45", + "EO46", + "EO50", + "EO51", + "EO52", + "EO53", + "EO54", + "EO55", + "EO56", + "EO60", + "EO61", + "EO62", + "EO63", + "EO64", + "EO65", + "EO70", + "EO71", + "EO72", + "EO73", + "EO74", + "EO80", + "EO81", + "EO82", + "EO83", + "EO84", + "EO90", + "EO91", + "FN04", + "FN05", + "FN06", + "FN14", + "FN15", + "FN25", + "DL89", + "DL99", + "DM51", + "DM52", + "DM53", + "DM54", + "DM55", + "DM56", + "DM57", + "DM58", + "DM59", + "DM62", + "DM63", + "DM64", + "DM65", + "DM66", + "DM67", + "DM68", + "DM69", + "DM71", + "DM72", + "DM73", + "DM74", + "DM75", + "DM76", + "DM77", + "DM78", + "DM79", + "DM80", + "DM81", + "DM82", + "DM83", + "DM84", + "DM85", + "DM86", + "DM87", + "DM88", + "DM89", + "DM90", + "DM91", + "DM92", + "DM93", + "DM94", + "DM95", + "DM96", + "DM97", + "DM98", + "DM99", + "DN27", + "DN28", + "DN34", + "DN35", + "DN36", + "DN37", + "DN38", + "DN41", + "DN42", + "DN43", + "DN44", + "DN45", + "DN46", + "DN47", + "DN48", + "DN50", + "DN51", + "DN52", + "DN53", + "DN54", + "DN55", + "DN56", + "DN57", + "DN60", + "DN61", + "DN62", + "DN63", + "DN64", + "DN65", + "DN66", + "DN67", + "DN68", + "DN70", + "DN71", + "DN72", + "DN73", + "DN74", + "DN75", + "DN76", + "DN77", + "DN78", + "DN80", + "DN81", + "DN82", + "DN83", + "DN84", + "DN85", + "DN86", + "DN87", + "DN88", + "DN90", + "DN91", + "DN92", + "DN93", + "DN94", + "DN95", + "DN96", + "DN97", + "DN98", + "EL06", + "EL07", + "EL08", + "EL09", + "EL18", + "EL19", + "EL29", + "EL49", + "EM00", + "EM01", + "EM02", + "EM03", + "EM04", + "EM05", + "EM06", + "EM07", + "EM08", + "EM09", + "EM10", + "EM11", + "EM12", + "EM13", + "EM14", + "EM15", + "EM16", + "EM17", + "EM18", + "EM19", + "EM20", + "EM21", + "EM22", + "EM23", + "EM24", + "EM25", + "EM26", + "EM27", + "EM28", + "EM29", + "EM30", + "EM31", + "EM32", + "EM33", + "EM34", + "EM35", + "EM36", + "EM37", + "EM38", + "EM39", + "EM40", + "EM41", + "EM42", + "EM43", + "EM44", + "EM45", + "EM46", + "EM47", + "EM48", + "EM49", + "EM50", + "EM51", + "EM52", + "EM53", + "EM54", + "EM55", + "EM56", + "EM57", + "EM58", + "EM59", + "EM61", + "EM62", + "EM63", + "EM64", + "EM65", + "EM66", + "EM67", + "EM68", + "EM69", + "EM75", + "EM76", + "EM77", + "EM78", + "EM79", + "EM86", + "EM87", + "EM88", + "EM89", + "EN00", + "EN01", + "EN02", + "EN03", + "EN04", + "EN05", + "EN06", + "EN07", + "EN08", + "EN10", + "EN11", + "EN12", + "EN13", + "EN14", + "EN15", + "EN16", + "EN17", + "EN18", + "EN20", + "EN21", + "EN22", + "EN23", + "EN24", + "EN25", + "EN26", + "EN27", + "EN30", + "EN31", + "EN32", + "EN33", + "EN34", + "EN35", + "EN36", + "EN37", + "EN40", + "EN41", + "EN42", + "EN43", + "EN44", + "EN45", + "EN46", + "EN47", + "EN50", + "EN51", + "EN52", + "EN53", + "EN54", + "EN55", + "EN56", + "EN60", + "EN67", + "EN61", + "EN66", + "EN70", + "EN71", + "EN72", + "EN73", + "EN74", + "EN75", + "EN80", + "EN90", + "DN58", + "DN29", + "DO02", + "DO11", + "DO20", + "EN57", + "EN58", + "EN68", + "EN77", + "EN84", + "EN85", + "EN92", + "EN95", + "EO38", + "EO47", + "EO57", + "EO66", + "EO75", + "EO85", + "EO92", + "FN02", + "FN03", + "FN07", + "FN08", + "FN09", + "FN13", + "FN16", + "FN24", + "FO00", + "FO01", + "DL79", + "DL98", + "DM61", + "DM70", + "DN25", + "DN26", + "EL16", + "EL17", + "EL28", + "EL39", + "EL59", + "EM60", + "EM71", + "EM72", + "EM73", + "EM74", + "EM85", + "EM99", + "EN62", + "EN63", + "EN64", + "EN65", + "EL15", + "EM96", + "EO93", + "FO02", + "FO03", + "EO94" + ], + "worked": false, + "confirmed": false, + "name": "Central Zone of North America", + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-109.05381, 35.59184], + [-109.0417, 38.16582], + [-109.06006, 38.27589], + [-109.05007, 41.00066], + [-111.04672, 40.99789], + [-111.04898, 44.47404], + [-111.39387, 44.75257], + [-111.50915, 44.56318], + [-112.09633, 44.52319], + [-112.28617, 44.56849], + [-112.3868, 44.44752], + [-112.7813, 44.48487], + [-112.84483, 44.35821], + [-113.00348, 44.45076], + [-113.13115, 44.77238], + [-113.34048, 44.78466], + [-113.93798, 45.69578], + [-114.34492, 45.45985], + [-114.52606, 45.57081], + [-114.56614, 45.77284], + [-114.40966, 45.85154], + [-114.46665, 46.27225], + [-114.32068, 46.64697], + [-114.61506, 46.63964], + [-114.92051, 46.82771], + [-115.34074, 47.26279], + [-115.74962, 47.44041], + [-115.68759, 47.59467], + [-116.04883, 47.97688], + [-116.04919, 49.00083], + [-114.06913, 48.99887], + [-114.17258, 49.16246], + [-114.40208, 49.21328], + [-114.69583, 49.54662], + [-114.63997, 49.82774], + [-114.7663, 50.35075], + [-115.01371, 50.57085], + [-115.23017, 50.5775], + [-115.64891, 50.8742], + [-115.69233, 51.02858], + [-115.92352, 51.08306], + [-116.00753, 51.22197], + [-116.26798, 51.31195], + [-116.28396, 51.4564], + [-116.59503, 51.66187], + [-116.67967, 51.81305], + [-116.89597, 51.70269], + [-117.01947, 51.89137], + [-117.3813, 52.13772], + [-117.61123, 52.14424], + [-117.83955, 52.27413], + [-117.70585, 52.36529], + [-117.98785, 52.50018], + [-118.21277, 52.3703], + [-118.387, 52.84712], + [-118.60812, 52.87953], + [-118.7295, 53.11542], + [-118.94716, 53.23879], + [-119.048, 53.12699], + [-119.35569, 53.33997], + [-119.72547, 53.38869], + [-119.93031, 53.61046], + [-119.71336, 53.61468], + [-120.00004, 53.80621], + [-120, 60], + [-85, 60], + [-80.87246, 54.51586], + [-79.77715, 51.85142], + [-79.51567, 51.46059], + [-79.51764, 50], + [-79.51793, 47.55568], + [-79.5798, 47.41083], + [-79.43426, 47.26114], + [-79.44527, 47.09939], + [-79.16856, 46.82378], + [-78.9866, 46.54512], + [-78.69279, 46.31791], + [-77.59203, 46.16815], + [-77.27583, 46.0139], + [-76.98884, 45.78635], + [-76.76485, 45.8503], + [-76.67428, 45.58159], + [-76.3654, 45.45636], + [-76.1035, 45.52534], + [-75.84951, 45.37436], + [-75.68668, 45.45765], + [-74.91044, 45.64413], + [-74.3819, 45.56478], + [-74.4722, 45.3027], + [-74.32055, 45.18693], + [-74.49763, 45.06283], + [-74.9727, 44.98345], + [-75.28486, 44.8483], + [-75.91284, 44.3678], + [-76.43895, 44.09405], + [-76.7967, 43.63114], + [-78.69039, 43.63113], + [-79.20067, 43.45047], + [-79.07039, 43.26238], + [-78.9354, 42.8283], + [-80.07983, 42.39355], + [-80.51985, 42.32337], + [-80.519, 40.6388], + [-80.6664, 40.58686], + [-80.59919, 40.31512], + [-80.73863, 40.07722], + [-80.82904, 39.71656], + [-81.22156, 39.38536], + [-81.45615, 39.40878], + [-81.75523, 39.17494], + [-81.77007, 38.92122], + [-81.89086, 38.87196], + [-82.03842, 39.02301], + [-82.21909, 38.79108], + [-82.16865, 38.62315], + [-82.32423, 38.44495], + [-82.55417, 38.40103], + [-82.63598, 38.13779], + [-82.50249, 37.93364], + [-82.13354, 37.55323], + [-81.96795, 37.53793], + [-82.35533, 37.26521], + [-82.72098, 37.12099], + [-82.8795, 36.88908], + [-83.13523, 36.74266], + [-83.67542, 36.60081], + [-81.93415, 36.59421], + [-81.6469, 36.61191], + [-81.74152, 36.41266], + [-82.03315, 36.12042], + [-82.22205, 36.15689], + [-82.6109, 35.96741], + [-82.63637, 36.0659], + [-82.91381, 35.92448], + [-82.99581, 35.77312], + [-83.24067, 35.72675], + [-83.49836, 35.56298], + [-83.77174, 35.56213], + [-84.02305, 35.41165], + [-84.0235, 35.29577], + [-84.29023, 35.22536], + [-84.32187, 34.9884], + [-85.60518, 34.98466], + [-85.16815, 32.81224], + [-84.8878, 32.26037], + [-85.06205, 32.13243], + [-85.13983, 31.84594], + [-85.04371, 31.51982], + [-85.11158, 31.28082], + [-85.00237, 31.00068], + [-87.59884, 30.99745], + [-87.63463, 30.86547], + [-87.40655, 30.67506], + [-87.36639, 30.43327], + [-87.5184, 30.28385], + [-87.5, 30], + [-87.5, 24.74534], + [-89.91211, 25.04081], + [-97.1473, 25.95681], + [-97.52015, 25.88579], + [-97.66091, 26.02963], + [-98.24387, 26.07282], + [-98.46085, 26.22691], + [-98.65929, 26.23615], + [-98.82409, 26.37034], + [-99.08432, 26.39802], + [-99.20861, 26.72598], + [-99.44756, 27.02487], + [-99.47983, 27.48817], + [-99.87877, 27.80203], + [-99.93096, 27.98045], + [-100.29419, 28.28382], + [-100.39856, 28.58391], + [-100.65056, 28.94266], + [-100.79613, 29.24626], + [-101.26168, 29.53881], + [-101.456, 29.78762], + [-102.05132, 29.78642], + [-102.32186, 29.88054], + [-102.38778, 29.76199], + [-102.67548, 29.7447], + [-102.91169, 29.2205], + [-103.11356, 28.98652], + [-103.4253, 29.04356], + [-103.78647, 29.26663], + [-104.16275, 29.39114], + [-104.50539, 29.63315], + [-104.65714, 29.90375], + [-104.70589, 30.23474], + [-105.00733, 30.68575], + [-105.40215, 30.85566], + [-105.95456, 31.36565], + [-106.2045, 31.46469], + [-106.38062, 31.73196], + [-106.53155, 31.78388], + [-108.20839, 31.7836], + [-108.20858, 31.33339], + [-109.05004, 31.33224], + [-109.05381, 35.59184] + ] + ] + }, + "properties": { "cqzone": "04" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "05": { + "mh": [ + "FN02", + "FN07", + "FN08", + "FN09", + "FN16", + "FN17", + "FN18", + "FN19", + "FN24", + "FN26", + "FN27", + "FN28", + "FN29", + "FN34", + "FN35", + "FN36", + "FN37", + "FN38", + "FN39", + "FN45", + "FN46", + "FN47", + "FN48", + "FN49", + "FN56", + "FN57", + "FN59", + "FN65", + "FN66", + "FN67", + "FN68", + "FN74", + "FN76", + "FN77", + "FN78", + "FN85", + "FN89", + "FN95", + "FN96", + "GN18", + "GN19", + "GN28", + "GN37", + "GO10", + "EL89", + "EL96", + "EL97", + "EL98", + "EM70", + "EM71", + "EM72", + "EM73", + "EM74", + "EM80", + "EM81", + "EM82", + "EM83", + "EM84", + "EM85", + "EM92", + "EM93", + "EM94", + "EM95", + "EM96", + "EM97", + "EM98", + "EM99", + "FM04", + "FM05", + "FM06", + "FM07", + "FM08", + "FM09", + "FM16", + "FM17", + "FM18", + "FM19", + "FM29", + "FN00", + "FN01", + "FN10", + "FN11", + "FN12", + "FN20", + "FN21", + "FN22", + "FN23", + "FN31", + "FN32", + "FN33", + "FN42", + "FN43", + "FN44", + "FN54", + "FN55", + "EL95", + "EN91", + "EN92", + "FN03", + "FN06", + "FN13", + "FN14", + "FN15", + "FN25", + "FN58", + "FN63", + "FN64", + "FN69", + "FN73", + "FN75", + "FN79", + "FN84", + "FN86", + "GN05", + "GN06", + "GN07", + "GN08", + "GN09", + "GN17", + "GN26", + "GN29", + "GN36", + "GN38", + "GN39", + "GO11", + "GO20", + "GO21", + "FN87", + "EL86", + "EL87", + "EL88", + "EL99", + "EM60", + "EM86", + "EM87", + "EM88", + "EM89", + "EM90", + "EM91", + "EN90", + "FM02", + "FM03", + "FM13", + "FM14", + "FM15", + "FM28", + "FN30", + "FN41", + "FN53", + "EL94", + "FM72", + "GN03", + "FN93", + "FN97", + "FM27", + "FM26", + "FM25", + "GO22", + "GN04", + "FN94", + "FM71", + "EL84", + "EL85", + "EL79", + "FN51", + "FN52", + "FN88", + "FN99", + "FN98", + "FN83", + "GN16", + "GN27", + "FN40", + "FM39", + "FM24", + "FL06", + "EM75" + ], + "worked": false, + "confirmed": false, + "name": "Eastern Zone of North America", + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-85.93506, 24.55327], + [-87.5, 24.74534], + [-87.5, 30], + [-87.5184, 30.28385], + [-87.36639, 30.43327], + [-87.40655, 30.67506], + [-87.63463, 30.86547], + [-87.59884, 30.99745], + [-85.00237, 31.00068], + [-85.11158, 31.28082], + [-85.04371, 31.51982], + [-85.13983, 31.84594], + [-85.06205, 32.13243], + [-84.8878, 32.26037], + [-85.16815, 32.81224], + [-85.60518, 34.98466], + [-84.32187, 34.9884], + [-84.29023, 35.22536], + [-84.0235, 35.29577], + [-84.02305, 35.41165], + [-83.77174, 35.56213], + [-83.49836, 35.56298], + [-83.24067, 35.72675], + [-82.99581, 35.77312], + [-82.91381, 35.92448], + [-82.63637, 36.0659], + [-82.6109, 35.96741], + [-82.22205, 36.15689], + [-82.03315, 36.12042], + [-81.74152, 36.41266], + [-81.6469, 36.61191], + [-81.93415, 36.59421], + [-83.67542, 36.60081], + [-83.13523, 36.74266], + [-82.8795, 36.88908], + [-82.72098, 37.12099], + [-82.35533, 37.26521], + [-81.96795, 37.53793], + [-82.13354, 37.55323], + [-82.50249, 37.93364], + [-82.63598, 38.13779], + [-82.55417, 38.40103], + [-82.32423, 38.44495], + [-82.16865, 38.62315], + [-82.21909, 38.79108], + [-82.03842, 39.02301], + [-81.89086, 38.87196], + [-81.77007, 38.92122], + [-81.75523, 39.17494], + [-81.45615, 39.40878], + [-81.22156, 39.38536], + [-80.82904, 39.71656], + [-80.73863, 40.07722], + [-80.59919, 40.31512], + [-80.6664, 40.58686], + [-80.519, 40.6388], + [-80.51985, 42.32337], + [-80.07983, 42.39355], + [-78.9354, 42.8283], + [-79.07039, 43.26238], + [-79.20067, 43.45047], + [-78.69039, 43.63113], + [-76.7967, 43.63114], + [-76.43895, 44.09405], + [-75.91284, 44.3678], + [-75.28486, 44.8483], + [-74.9727, 44.98345], + [-74.49763, 45.06283], + [-74.32055, 45.18693], + [-74.4722, 45.3027], + [-74.3819, 45.56478], + [-74.91044, 45.64413], + [-75.68668, 45.45765], + [-75.84951, 45.37436], + [-76.1035, 45.52534], + [-76.3654, 45.45636], + [-76.67428, 45.58159], + [-76.76485, 45.8503], + [-76.98884, 45.78635], + [-77.27583, 46.0139], + [-77.59203, 46.16815], + [-78.69279, 46.31791], + [-78.9866, 46.54512], + [-79.16856, 46.82378], + [-79.44527, 47.09939], + [-79.43426, 47.26114], + [-79.5798, 47.41083], + [-79.51793, 47.55568], + [-79.51764, 50], + [-60, 50], + [-55.95459, 51.74554], + [-55.40406, 51.76497], + [-49, 53], + [-35, 56.86499], + [-35, 28], + [-79.5, 28], + [-79.5, 24], + [-85.93506, 24.55327] + ] + ] + }, + "properties": { "cqzone": "05" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "06": { + "mh": [ + "DK79", + "DK88", + "DK89", + "DK97", + "DK98", + "DK99", + "DL29", + "DL36", + "DL37", + "DL44", + "DL48", + "DL49", + "DL55", + "DL56", + "DL57", + "DL58", + "DL59", + "DL64", + "DL65", + "DL66", + "DL67", + "DL68", + "DL69", + "DL70", + "DL71", + "DL72", + "DL73", + "DL74", + "DL75", + "DL76", + "DL77", + "DL78", + "DL79", + "DL80", + "DL81", + "DL82", + "DL83", + "DL84", + "DL85", + "DL86", + "DL87", + "DL88", + "DL90", + "DL91", + "DL92", + "DL93", + "DL94", + "DL95", + "DL96", + "DL97", + "DL98", + "DM12", + "DM20", + "DM21", + "DM22", + "DM30", + "DM31", + "DM40", + "DM50", + "DM60", + "DM61", + "DM70", + "EK07", + "EK08", + "EK09", + "EK16", + "EK17", + "EK18", + "EK19", + "EK26", + "EK27", + "EK28", + "EK35", + "EK36", + "EK37", + "EK46", + "EK48", + "EK58", + "EK59", + "EL00", + "EL01", + "EL02", + "EL03", + "EL04", + "EL05", + "EL50", + "DK78", + "DK87", + "DK96", + "DL26", + "DL27", + "DL28", + "DL34", + "DL35", + "DL38", + "DL39", + "DL42", + "DL43", + "DL45", + "DL46", + "DL47", + "DL52", + "DL53", + "DL54", + "DL62", + "DL63", + "DL89", + "DL99", + "DM10", + "DM11", + "DM32", + "DM41", + "DM51", + "DM71", + "EK06", + "EK15", + "EK25", + "EK38", + "EK45", + "EK47", + "EK49", + "EK57", + "EK68", + "EK69", + "EL06", + "EL07", + "EL10", + "EL11", + "EL12", + "EL13", + "EL14", + "EL15", + "EL40", + "EL41", + "EL51", + "EL60", + "EL61", + "DK48", + "DK49", + "DK39", + "DK38", + "DK28", + "EK34", + "DL61", + "EL52", + "DL08", + "DL09", + "EL08" + ], + "worked": false, + "confirmed": false, + "name": "Southern Zone of North America", + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-130, 14], + [-130, 32.5], + [-120, 32.5], + [-117.12486, 32.53404], + [-114.7197, 32.71873], + [-114.81351, 32.49425], + [-111.76118, 31.55213], + [-111.0748, 31.33221], + [-109.05005, 31.3325], + [-109.05004, 31.33224], + [-108.20858, 31.33339], + [-108.20839, 31.7836], + [-106.53155, 31.78388], + [-106.38062, 31.73196], + [-106.2045, 31.46469], + [-105.95456, 31.36565], + [-105.40215, 30.85566], + [-105.00733, 30.68575], + [-104.70589, 30.23474], + [-104.65714, 29.90375], + [-104.50539, 29.63315], + [-104.16275, 29.39114], + [-103.78647, 29.26663], + [-103.4253, 29.04356], + [-103.11356, 28.98652], + [-102.91169, 29.2205], + [-102.67548, 29.7447], + [-102.38778, 29.76199], + [-102.32186, 29.88054], + [-102.05132, 29.78642], + [-101.456, 29.78762], + [-101.26168, 29.53881], + [-100.79613, 29.24626], + [-100.65056, 28.94266], + [-100.39856, 28.58391], + [-100.29419, 28.28382], + [-99.93096, 27.98045], + [-99.87877, 27.80203], + [-99.47983, 27.48817], + [-99.44756, 27.02487], + [-99.20861, 26.72598], + [-99.08432, 26.39802], + [-98.82409, 26.37034], + [-98.65929, 26.23615], + [-98.46085, 26.22691], + [-98.24387, 26.07282], + [-97.66091, 26.02963], + [-97.52015, 25.88579], + [-97.1473, 25.95681], + [-89.91211, 25.04081], + [-85.93506, 24.55327], + [-86.04493, 18.39623], + [-87.98127, 18.16933], + [-88.00049, 18.37016], + [-88.4784, 18.49654], + [-88.85331, 17.89642], + [-89.03733, 18.00355], + [-89.15268, 17.81537], + [-90.98809, 17.81603], + [-90.98809, 17.2523], + [-91.4399, 17.25099], + [-90.65781, 16.63816], + [-90.64614, 16.52036], + [-90.37354, 16.37482], + [-90.4422, 16.07484], + [-91.73172, 16.07418], + [-92.211, 15.26166], + [-92.05925, 15.07079], + [-92.15058, 14.98856], + [-92.18491, 14.57959], + [-93, 14], + [-130, 14] + ] + ] + }, + "properties": { "cqzone": "06" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "07": { + "mh": [ + "DK50", + "EJ65", + "EK55", + "EK56", + "EK57", + "EK53", + "EK54", + "EK63", + "EK44", + "EK45", + "EK47", + "EK64", + "EK65", + "EK73", + "EK74", + "EK75", + "EK62", + "EK70", + "EK71", + "EK72", + "EJ98", + "EJ89", + "EJ88", + "EK43", + "EK34", + "EK35", + "EK46", + "EK84", + "EK85", + "EK66", + "EK76", + "EK61", + "EK80", + "EK81", + "EK82", + "EK83", + "EJ99", + "FJ07", + "FJ08", + "FJ09", + "FJ17", + "FJ18", + "FJ19", + "EJ79", + "FK05", + "EK94", + "EK95", + "EK93", + "FK03", + "EK92", + "EK91", + "EJ97", + "EK58", + "FK06", + "EK67" + ], + "worked": false, + "confirmed": false, + "name": "Central American Zone", + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-130, 14], + [-93, 14], + [-92.18491, 14.57959], + [-92.15058, 14.98856], + [-92.05925, 15.07079], + [-92.211, 15.26166], + [-91.73172, 16.07418], + [-90.4422, 16.07484], + [-90.37354, 16.37482], + [-90.64614, 16.52036], + [-90.65781, 16.63816], + [-91.4399, 17.25099], + [-90.98809, 17.2523], + [-90.98809, 17.81603], + [-89.15268, 17.81537], + [-89.03733, 18.00355], + [-88.85331, 17.89642], + [-88.4784, 18.49654], + [-88.00049, 18.37016], + [-87.98127, 18.16933], + [-86.04493, 18.39623], + [-77, 15], + [-77, 10], + [-77.35667, 8.67584], + [-77.35342, 8.30366], + [-77.17611, 7.91785], + [-77.32321, 7.89523], + [-77.5646, 7.50547], + [-77.72781, 7.6979], + [-77.72246, 7.43321], + [-77.81787, 7.45806], + [-77.89333, 7.22057], + [-82, 4], + [-130, 4], + [-130, 14] + ] + ] + }, + "properties": { "cqzone": "07" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "08": { + "mh": [ + "FK68", + "FL05", + "FL06", + "FL13", + "FL14", + "FL15", + "FL16", + "FL22", + "FL23", + "FL32", + "FL31", + "EK99", + "EL92", + "FL10", + "FL11", + "FL20", + "FK48", + "FK49", + "FK58", + "FK28", + "FK96", + "FK94", + "FL41", + "FK93", + "FK77", + "FK87", + "FL04", + "FL07", + "FL17", + "FL24", + "FL33", + "FK78", + "EL71", + "EL72", + "EL81", + "EL82", + "EL83", + "EL91", + "EL93", + "FK19", + "FK29", + "FL00", + "FL01", + "FL02", + "FL12", + "FL21", + "FK59", + "FK91", + "FK92", + "FK38", + "FK39", + "FK97", + "FK86", + "FK67", + "FK17", + "FK18", + "FK08", + "FK07", + "FK09", + "GK03", + "GK02", + "FK95", + "FK85", + "FK88", + "FL30", + "FL42", + "FK47", + "FL03" + ], + "worked": false, + "confirmed": false, + "name": "West Indies Zone", + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-35, 28], + [-35, 20.5], + [-26, 20.5], + [-26, 11.5], + [-62, 11.5], + [-77, 15], + [-86.04493, 18.39623], + [-85.93506, 24.55327], + [-79.5, 24], + [-79.5, 28], + [-35, 28] + ] + ] + }, + "properties": { "cqzone": "08" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "09": { + "mh": [ + "GJ22", + "GJ23", + "GJ24", + "GJ25", + "GJ32", + "GJ33", + "GJ34", + "FK90", + "FK52", + "FI38", + "FI39", + "FI48", + "FI49", + "FJ10", + "FJ11", + "FJ12", + "FJ13", + "FJ14", + "FJ15", + "FJ16", + "FJ17", + "FJ18", + "FJ20", + "FJ21", + "FJ22", + "FJ23", + "FJ24", + "FJ25", + "FJ26", + "FJ27", + "FJ28", + "FJ29", + "FJ30", + "FJ31", + "FJ32", + "FJ33", + "FJ34", + "FJ35", + "FJ36", + "FJ37", + "FJ38", + "FJ39", + "FJ40", + "FJ41", + "FJ42", + "FJ43", + "FJ44", + "FJ45", + "FJ46", + "FJ47", + "FJ52", + "FJ53", + "FJ54", + "FJ55", + "FJ56", + "FJ61", + "FJ62", + "FJ63", + "FJ64", + "FJ65", + "FJ66", + "FK20", + "FK30", + "FJ95", + "FJ96", + "FJ97", + "FJ98", + "GJ01", + "GJ02", + "GJ03", + "GJ04", + "GJ05", + "GJ06", + "GJ07", + "GJ12", + "GJ13", + "GJ14", + "GJ15", + "FJ48", + "FJ49", + "FJ57", + "FJ58", + "FJ59", + "FJ67", + "FJ68", + "FJ69", + "FJ71", + "FJ72", + "FJ73", + "FJ74", + "FJ75", + "FJ76", + "FJ77", + "FJ78", + "FJ79", + "FJ84", + "FJ85", + "FJ86", + "FJ87", + "FJ88", + "FJ89", + "FK40", + "FK50", + "FK60", + "FK80", + "GJ35", + "GJ43", + "GJ44", + "FK42", + "FI28", + "FI29", + "FI37", + "FI45", + "FI46", + "FI47", + "FI55", + "FI56", + "FI57", + "FI58", + "FI59", + "FJ00", + "FJ01", + "FJ02", + "FJ19", + "FJ50", + "FJ51", + "FK21", + "FK31", + "FK32", + "FK41", + "FJ94", + "GJ08", + "GJ11", + "GJ16", + "GJ21", + "FJ60", + "FJ70", + "FJ81", + "FJ82", + "FJ99", + "FK51", + "FK70", + "EJ94", + "EJ93", + "FK81", + "FK71", + "FK61", + "FK91", + "FJ83" + ], + "worked": false, + "confirmed": false, + "name": "Northern Zone of South America", + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-26, 11.5], + [-26, 5], + [-51.66667, 5], + [-51.66667, 4.45833], + [-51.61955, 4.15839], + [-51.91449, 3.7863], + [-52.3268, 3.07565], + [-52.65381, 2.38668], + [-52.92961, 2.17035], + [-53.28179, 2.19074], + [-53.32912, 2.34561], + [-53.47806, 2.25622], + [-53.93272, 2.27725], + [-54.11715, 2.10332], + [-54.69276, 2.32445], + [-54.96545, 2.55985], + [-55.31506, 2.5236], + [-55.38266, 2.40894], + [-55.72006, 2.40522], + [-55.94591, 2.53261], + [-56.04446, 2.22931], + [-55.90428, 2.0349], + [-55.99661, 1.83789], + [-56.48104, 1.94847], + [-56.79557, 1.84933], + [-57.07763, 2.00084], + [-57.32964, 1.97995], + [-57.53087, 1.70375], + [-57.74421, 1.70827], + [-58.0028, 1.51259], + [-58.37964, 1.54317], + [-58.5032, 1.26338], + [-58.71225, 1.28453], + [-58.85668, 1.17447], + [-58.92108, 1.31007], + [-59.27991, 1.40418], + [-59.5331, 1.71668], + [-59.75226, 1.85898], + [-59.7195, 2.23639], + [-59.89674, 2.36031], + [-59.99471, 2.7022], + [-59.95362, 3.08381], + [-59.80199, 3.35779], + [-59.86951, 3.56025], + [-59.6673, 3.70641], + [-59.51498, 3.94539], + [-59.718, 4.16572], + [-59.67578, 4.34475], + [-59.96893, 4.50827], + [-60.15955, 4.51462], + [-60.02431, 4.70395], + [-59.96894, 5.07296], + [-60.20736, 5.27383], + [-60.43897, 5.17698], + [-60.68815, 5.22845], + [-60.58755, 4.95349], + [-60.89994, 4.7198], + [-60.99367, 4.52051], + [-61.32972, 4.52671], + [-61.54775, 4.26146], + [-61.98024, 4.18472], + [-62.11028, 4.09203], + [-62.3895, 4.18058], + [-62.55147, 4.02005], + [-62.73161, 4.0416], + [-62.83555, 3.73617], + [-62.96027, 3.60874], + [-63.20666, 3.81081], + [-63.204, 3.95181], + [-63.4522, 3.95614], + [-63.51236, 3.84853], + [-63.67822, 4.02006], + [-63.71313, 3.90317], + [-63.96291, 3.87064], + [-64.15781, 4.13531], + [-64.55578, 4.10447], + [-64.78712, 4.28834], + [-64.80449, 4.17692], + [-64.47986, 3.79313], + [-64.18465, 3.58896], + [-64.24437, 3.43292], + [-64.16633, 3.07062], + [-63.98418, 2.68728], + [-64.05846, 2.50579], + [-63.37355, 2.41015], + [-63.40134, 2.15188], + [-63.61685, 2.1172], + [-64.06274, 1.91532], + [-64.11166, 1.59238], + [-64.4108, 1.40457], + [-64.52834, 1.44441], + [-64.7573, 1.22697], + [-64.80153, 1.31345], + [-65.01126, 1.11017], + [-65.15097, 1.1083], + [-65.21274, 0.90154], + [-65.32725, 0.93504], + [-65.44475, 0.69232], + [-65.63206, 1.01144], + [-66.07654, 0.76279], + [-66.3105, 0.74478], + [-66.84456, 1.22755], + [-67.08966, 1.16754], + [-67.14596, 1.77885], + [-67.34913, 1.99804], + [-67.36491, 2.22062], + [-67.77341, 2.03538], + [-67.92187, 1.82134], + [-68.14485, 1.97192], + [-68.28552, 1.84451], + [-68.16254, 1.7275], + [-69.84584, 1.71358], + [-69.84584, 1.07638], + [-69.32102, 1.08856], + [-69.13887, 0.88146], + [-69.11504, 0.64158], + [-69.35403, 0.61442], + [-69.47878, 0.73487], + [-69.59992, 0.65081], + [-70.0437, 0.56328], + [-70.0437, -0.12525], + [-69.91984, -0.32609], + [-69.60749, -0.5038], + [-69.62326, -0.74109], + [-69.42027, -1.01218], + [-69.45482, -1.51313], + [-69.93334, -4.21972], + [-69.94733, -4.22711], + [-70.28904, -3.82397], + [-70.49995, -3.87512], + [-70.71694, -3.79876], + [-70.05553, -2.75926], + [-70.30243, -2.49891], + [-70.6368, -2.46968], + [-70.67721, -2.34596], + [-71.00383, -2.20762], + [-71.19258, -2.38138], + [-71.39377, -2.41014], + [-71.47023, -2.26838], + [-71.72518, -2.13979], + [-71.91827, -2.36451], + [-72.37967, -2.45069], + [-72.63554, -2.35812], + [-72.93078, -2.45676], + [-73.14938, -2.26537], + [-73.09106, -2.04091], + [-73.1424, -1.81476], + [-73.53886, -1.70125], + [-73.48144, -1.57898], + [-73.68025, -1.23885], + [-74.27341, -0.98044], + [-74.24458, -0.82647], + [-74.4196, -0.50276], + [-75.18176, -0.03804], + [-75.27132, -0.12665], + [-75.63882, 0.04788], + [-75.80742, 0.04971], + [-76.05784, 0.33542], + [-76.27804, 0.4372], + [-76.41003, 0.24212], + [-77.09802, 0.28866], + [-77.11961, 0.38018], + [-77.5277, 0.40306], + [-77.49059, 0.66218], + [-78.20003, 0.94947], + [-78.31336, 1.18946], + [-78.42501, 1.15419], + [-78.8347, 1.44093], + [-79.75, 2], + [-82, 4], + [-77.89333, 7.22057], + [-77.81787, 7.45806], + [-77.72246, 7.43321], + [-77.72781, 7.6979], + [-77.5646, 7.50547], + [-77.32321, 7.89523], + [-77.17611, 7.91785], + [-77.35342, 8.30366], + [-77.35667, 8.67584], + [-77, 10], + [-77, 15], + [-62, 11.5], + [-26, 11.5] + ] + ] + }, + "properties": { "cqzone": "09" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + } +} diff --git a/feature/ft8/src/main/assets/cty.dat b/feature/ft8/src/main/assets/cty.dat new file mode 100644 index 00000000..3212ec3c --- /dev/null +++ b/feature/ft8/src/main/assets/cty.dat @@ -0,0 +1,3520 @@ +Sov Mil Order of Malta: 15: 28: EU: 41.90: -12.43: -1.0: 1A: + 1A; +Spratly Islands China: 26: 50: AS: 9.88: -114.23: -8.0: 1S: + 9M0,BM9S,BN9S,BO9S,BP9S,BQ9S,BU9S,BV9S,BW9S,BX9S,=9M2/PG5M,=9M4SDX,=9M4SLL,=9M6/LA6VM,=9M6/LA7XK, + =9M6/N1UR,=9M6/OH2YY,=DX0JP,=DX0K,=DX0P; +Monaco: 14: 27: EU: 43.73: -7.40: -1.0: 3A: + 3A,=3A/4Z5KJ/LH; +Agalega & St. Brandon: 39: 53: AF: -10.45: -56.67: -4.0: 3B6: + 3B6, + 3B7; +Mauritius: 39: 53: AF: -20.35: -57.50: -4.0: 3B8: + 3B8; +Rodriguez Island: 39: 53: AF: -19.70: -63.42: -4.0: 3B9: + 3B9; +Equatorial Guinea: 36: 47: AF: 1.70: -10.33: -1.0: 3C: + 3C; +Annobon Island: 36: 52: AF: -1.43: -5.62: -1.0: 3C0: + 3C0; +Fiji: 32: 56: OC: -17.78: -177.92: -12.0: 3D2: + 3D2,=3D5X; +Conway Reef: 32: 56: OC: -22.00: -175.00: -12.0: 3D2/c: + =3D20CR,=3D2C,=3D2CI,=3D2CR,=3D2CY; +Rotuma Island: 32: 56: OC: -12.48: -177.08: -12.0: 3D2/r: + =3D2AG/P,=3D2EU,=3D2GC/P,=3D2HY/R,=3D2NV/P,=3D2NV/R,=3D2R,=3D2RA,=3D2RI,=3D2RO,=3D2RR,=3D2RX, + =3D2VB/R; +Kingdom of Eswatini: 38: 57: AF: -26.65: -31.48: -2.0: 3DA: + 3DA,=3DA0BP/J; +Tunisia: 33: 37: AF: 35.40: -9.32: -1.0: 3V: + 3V,TS,=3V8CB/J,=3V8ST/J; +Vietnam: 26: 49: AS: 15.80: -107.90: -7.0: 3W: + 3W,XV,=XV2G/C; +Guinea: 35: 46: AF: 11.00: 10.68: 0.0: 3X: + 3X; +Bouvet: 38: 67: AF: -54.42: -3.38: -1.0: 3Y/b: + =3Y/ZS6GCM,=3Y0C,=3Y0E; +Peter 1 Island: 12: 72: SA: -68.77: 90.58: 4.0: 3Y/p: + =3Y0X; +Azerbaijan: 21: 29: AS: 40.45: -47.37: -4.0: 4J: + 4J,4K,=4J5T/FF,=4J7WMF/FF,=4K4K/FF,=4K6AE/FF; +Georgia: 21: 29: AS: 42.00: -45.00: -4.0: 4L: + 4L,=4L1W/FF,=R3TT/UF6V,=RN7G/UF6V,=RV3F/UF6V,=RX3F/UF6V,=UF/UA6GG/FF; +Montenegro: 15: 28: EU: 42.50: -19.28: -1.0: 4O: + 4O; +Sri Lanka: 22: 41: AS: 7.60: -80.70: -5.5: 4S: + 4P,4Q,4R,4S,=4S7CGM/AVR; +ITU HQ: 14: 28: EU: 46.17: -6.05: -1.0: 4U1I: + =4U0ITU,=4U150ITU,=4U1ITU,=4U1WRC; +United Nations HQ: 05: 08: NA: 40.75: 73.97: 5.0: 4U1U: + =4U1UN,=4U50SPACE,=4U60UN,=4U64UN,=4U70UN,=4U75UN; +Vienna Intl Ctr: 15: 28: EU: 48.20: -16.30: -1.0: *4U1V: + =4U0R,=4U10NPT,=4U18FIFA,=4U1A,=4U1VIC,=4U1WED,=4U1XMAS,=4U2STAYHOME,=4U2U,=4U30VIC,=4U500M, + =4U70VIC,=4U75A,=4UNR,=4Y1A,=C7A; +Timor - Leste: 28: 54: OC: -8.80: -126.05: -9.0: 4W: + 4W,=4U1ET; +Israel: 20: 39: AS: 31.32: -34.82: -2.0: 4X: + 4X,4Z,=4X01T/FF,=4X1FC/LH,=4X1GO/LH,=4X1IG/LH,=4X1KS/LH,=4X1KW/LH,=4X1OM/LH,=4X1OZ/LH,=4X1RE/LH, + =4X1ST/LH,=4X1VF/LH,=4X1ZM/LH,=4X1ZZ/LH,=4X4FC/LH,=4X4FR/LH,=4X4YM/LH,=4X5HF/LH,=4X5IQ/LH, + =4X5MG/LH,=4X6DK/LH,=4X6HP/LH,=4X6RE/LH,=4X6TT/JY1,=4X6UT/LH,=4X6UU/LH,=4X6YA/LH,=4X6ZM/LH, + =4Z1AR/LH,=4Z1DX/LH,=4Z1DZ/LH,=4Z1KD/LH,=4Z1KM/LH,=4Z1NB/LH,=4Z1ZV/LH,=4Z4DX/ANT,=4Z4DX/J, + =4Z4DX/LGT,=4Z4DX/LH,=4Z4HC/LH,=4Z4KJ/LH,=4Z4KX/LH,=4Z5DZ/LH,=4Z5FL/LH,=4Z5FW/LH,=4Z5KJ/LGT, + =4Z5KJ/LH,=4Z5NW/YL,=4Z5OT/LH,=4Z5SL/LH,=4Z8GZ/LH; +Libya: 34: 38: AF: 27.20: -16.60: -2.0: 5A: + 5A; +Cyprus: 20: 39: AS: 35.00: -33.00: -2.0: 5B: + 5B,C4,H2,P3,=5B/DJ5AA/LH,=5B/LY1DF/LGT,=5B4AKV/EURO,=5B4PSG/J,=5B4STA/J,=5B8AP/LH; +Tanzania: 37: 53: AF: -5.75: -33.92: -3.0: 5H: + 5H,5I; +Nigeria: 35: 46: AF: 9.87: -7.55: -1.0: 5N: + 5N,5O; +Madagascar: 39: 53: AF: -19.00: -46.58: -3.0: 5R: + 5R,5S,6X; +Mauritania: 35: 46: AF: 20.60: 10.50: 0.0: 5T: + 5T; +Niger: 35: 46: AF: 17.63: -9.43: -1.0: 5U: + 5U; +Togo: 35: 46: AF: 8.40: -1.28: 0.0: 5V: + 5V; +Samoa: 32: 62: OC: -13.93: 171.70: -13.0: 5W: + 5W; +Uganda: 37: 48: AF: 1.92: -32.60: -3.0: 5X: + 5X; +Kenya: 37: 48: AF: 0.32: -38.15: -3.0: 5Z: + 5Y,5Z,=5Z4IC/Y2K,=5Z4RT/Y2K; +Senegal: 35: 46: AF: 15.20: 14.63: 0.0: 6W: + 6V,6W; +Jamaica: 08: 11: NA: 18.20: 77.47: 5.0: 6Y: + 6Y; +Yemen: 21: 39: AS: 15.65: -48.12: -3.0: 7O: + 7O, + =7O2A(37)[48],=7O6T(37)[48]; +Lesotho: 38: 57: AF: -29.22: -27.88: -2.0: 7P: + 7P; +Malawi: 37: 53: AF: -14.00: -34.00: -2.0: 7Q: + 7Q; +Algeria: 33: 37: AF: 28.00: -2.00: -1.0: 7X: + 7R,7T,7U,7V,7W,7X,7Y,=7X2BDX/JOTA,=7X5VRK/ND; +Barbados: 08: 11: NA: 13.18: 59.53: 4.0: 8P: + 8P; +Maldives: 22: 41: AS: 4.15: -73.45: -5.0: 8Q: + 8Q; +Guyana: 09: 12: SA: 6.02: 59.45: 4.0: 8R: + 8R,=8R1AK/LH; +Croatia: 15: 28: EU: 45.18: -15.30: -1.0: 9A: + 9A,=9A/DL9CHR/LH,=9A/F5OGG/LH,=9A/IK3MZS/LH,=9A/IW3ILP/LH,=9A/OK1FZM/LH,=9A0CI/LH,=9A2MF/LH, + =9A2MF/LT,=9A2WJ/LH,=9A3FO/P/LH,=9A3KB/LH,=9A3KR/LH,=9A5JR/LH,=9A5SM/YL,=9A5V/LH,=9A6AA/LH, + =9A6PBT/YL,=9A70DP/KA,=9A70DP/PU,=9A70DP/RI,=9A70DP/ZG,=9A7K/LH,=9A7SSY/LH; +Ghana: 35: 46: AF: 7.70: 1.57: 0.0: 9G: + 9G; +Malta: 15: 28: EU: 35.88: -14.42: -1.0: 9H: + 9H,=9H1AW/EU25,=9H1EI/EU25,=9H1JN/EU25,=9H1MRL/EU25,=9H1RV/EU25,=9H1SP/EU25,=9H1VC/CGA,=9H1VC/CGS, + =9H1VC/KHS,=9H1VC/KHS/P,=9H1ZZ/EU25,=9H4GRS/LH,=9H9DSG/J,=9H9PSG/J,=9H9SEL/LH; +Zambia: 36: 53: AF: -14.22: -26.73: -2.0: 9J: + 9I,9J,=4U/ON6TT/M; +Kuwait: 21: 39: AS: 29.38: -47.38: -3.0: 9K: + 9K,NLD,=9K2BI/J,=9K2BI/JOTA,=9K2OK/KACC; +Sierra Leone: 35: 46: AF: 8.50: 13.25: 0.0: 9L: + 9L; +West Malaysia: 28: 54: AS: 3.95: -102.23: -8.0: 9M2: + 9M,9W,=9M0SEA,=9M6/PA0RRS/2,=9M6/ZS6EZ/2,=9M6XX/2,=9M6YBG/2,=9M8DX/2,=9M8SYA/2,=9W6KOM/2, + =9W6MAN/2; +East Malaysia: 28: 54: OC: 2.68: -113.32: -8.0: 9M6: + =9M4CAK,=9M4CKT/6,=9M4CPT,=9M4CRP/6,=9M4JAY,=9M9/7M2VPR,=9M9/CCL, + 9M6,9W6,=9M1CSS,=9M2/G3TMA/6,=9M2/PG5M/6,=9M2/R6AF/6,=9M2GCN/6,=9M2MDX/6,=9M4ARD/6,=9M4CBP, + =9M4CCB,=9M4CKT,=9M4CMY,=9M4CRB,=9M4CRP,=9M4CWS,=9M4GCW,=9M4LHS,=9M4LTW,=9M4SAB,=9M4SEB,=9M4SHQ, + =9M4SJO,=9M4SJS,=9M4SJSA,=9M4SJSB,=9M4SJSD,=9M4SJSL,=9M4SJSM,=9M4SJSP,=9M4SJST,=9M4SJSW,=9M4SJX, + =9M4SMO,=9M4SMS,=9M4SMY,=9M4STA,=9M50IARU/6,=9M50MS,=9M51SB,=9M57MS,=9M58MS,=9M59MS,=9M7DX, + =9W2RCR/6,=9W2VVH/6, + 9M8,9W8,=9M1CSQ,=9M4CHQ,=9M4CJN,=9M4CPB,=9M4CSR,=9M4CSS,=9M4JSE,=9M4LHM,=9M4RSA,=9M4SJE,=9M4SJQ, + =9M4SWK,=9M50IARU/8,=9M50MQ,=9M51GW,=9M53QA,=9M57MW,=9M58MW,=9M59MW; +Nepal: 22: 42: AS: 27.70: -85.33: -5.75: 9N: + 9N; +Dem. Rep. of the Congo: 36: 52: AF: -3.12: -23.03: -1.0: 9Q: + 9O,9P,9Q,9R,9S,9T; +Burundi: 36: 52: AF: -3.17: -29.78: -2.0: 9U: + 9U; +Singapore: 28: 54: AS: 1.37: -103.78: -8.0: 9V: + 9V,S6; +Rwanda: 36: 52: AF: -1.75: -29.82: -2.0: 9X: + 9X; +Trinidad & Tobago: 09: 11: SA: 10.38: 61.28: 4.0: 9Y: + 9Y,9Z; +Botswana: 38: 57: AF: -22.00: -24.00: -2.0: A2: + 8O,A2; +Tonga: 32: 62: OC: -21.22: 175.13: -13.0: A3: + A3,=A35JP/H,=A35TN/N,=A35TN/V,=A35ZG/H; +Oman: 21: 39: AS: 23.60: -58.55: -4.0: A4: + A4,=A41CK/ND,=A41HA/ND,=A41JM/ND,=A41JR/RD,=A41KA/ND,=A41KB/ND,=A41KC/ND,=A41KJ/ND,=A41KT/ND, + =A41LD/ND,=A41LD/ND/P,=A41LD/RD,=A41LD/SQ,=A41LX/M/ND,=A41LX/ND,=A41LX/RD,=A41LZ/RD,=A41MA/RD, + =A41MD/RD,=A41ME/ND,=A41MO/ND,=A41MO/RD,=A41MO/SQ,=A41MX/ND,=A41NN/ND,=A41NN/ND/P,=A41NW/ND, + =A41OD/ND,=A41OM/SQ,=A41OO/ND,=A41OO/ND/M,=A41OP/ND,=A41OR/ND,=A41PB/ND,=A41PB/ND/M,=A41PG/M/ND, + =A41PG/ND,=A41PG/SQ,=A41PH/ND,=A41PJ/ND,=A41PY/ND,=A41RS/ND,=A41WM/ND,=A45ND/ND/P,=A45RS/ND, + =A45VU/ND,=A45WH/MF,=A45WH/ND,=A45WH/P/ND,=A45WM/ND,=A45WR/ND,=A45XO/ND,=A45XO/ND/P,=A45XO/RD, + =A45XR/ND,=A45XW/ND,=A47RK/ND,=A47RS/JOTA,=A47RS/ND,=A47RS/SQ; +Bhutan: 22: 41: AS: 27.40: -90.18: -6.0: A5: + A5; +United Arab Emirates: 21: 39: AS: 24.00: -54.00: -4.0: A6: + A6,=A61B/ND,=A61BK/DM,=A61BK/JJ,=A61BK/ND,=A61C/ND,=A61D/ND,=A61DA/MD,=A61DD/FD,=A61DD/MD, + =A61DD/ND,=A61DJ/ND,=A61E/ND,=A61EI/ARS,=A61FJ/ARS,=A61FJ/FD,=A61FJ/ND,=A61FK/47ND,=A61FK/FD, + =A61FK/MD,=A61HA/ND,=A61K/ND,=A61LL/ND,=A61M/ND,=A61N/ND,=A61Q/ARS,=A61Q/FD,=A61Q/MD,=A61Q/ND, + =A61QQ/ND,=A61R/ND,=A61RK/ND,=A61SM/ND,=A61ZA/FD,=A62ER/ND,=A62ER/ZM3,=A65DC/FD; +Qatar: 21: 39: AS: 25.25: -51.13: -3.0: A7: + A7,=A71BX/NDQ,=A71CM/ND,=A71CT/NDQ,=A71EM/NDQ,=A71EM/QND,=A71FJ/QND; +Bahrain: 21: 39: AS: 26.03: -50.53: -3.0: A9: + A9,=A92AA/GR; +Pakistan: 21: 41: AS: 30.00: -70.00: -5.0: AP: + 6P,6Q,6R,6S,AP,AQ,AR,AS; +Scarborough Reef China: 27: 50: AS: 15.08: -117.72: -8.0: BS7: + BS7H; +Taiwan China: 24: 44: AS: 23.72: -120.88: -8.0: BV: + BM,BN,BO,BP,BQ,BU,BV,BW,BX; +Pratas Island: 24: 44: AS: 20.43: -116.42: -8.0: BV9P: + BM9P,BN9P,BO9P,BP9P,BQ9P,BU9P,BV9P,BW9P,BX9P; +XinJiang China: 23: 42: AS: 43.77: -87.68: -8.0: BY: + BA0A,BA0B,BA0C,BA0D,BA0E,BA0F,BD0A,BD0B,BD0C,BD0D,BD0E,BD0F,BG0A,BG0B,BG0C,BG0D,BG0E,BG0F, + BH0A,BH0B,BH0C,BH0D,BH0E,BH0F,BI0A,BI0B,BI0C,BI0D,BI0E,BI0F,BY0A,BY0B,BY0C,BY0D,BY0E,BY0F, + B0A,B0B,B0C,B0D,B0E,B0F; +XiZang China: 23: 42: AS: 29.97: -91.11: -8.0: BY: + BA0G,BA0H,BA0I,BA0J,BA0K,BA0L,BD0G,BD0H,BD0I,BD0J,BD0K,BD0L,BG0G,BG0H,BG0I,BG0J,BG0K,BG0L, + BH0G,BH0H,BH0I,BH0J,BH0K,BH0L,BI0G,BI0H,BI0I,BI0J,BI0K,BI0L,BY0G,BY0H,BY0I,BY0J,BY0K,BY0L, + B0G,B0H,B0J,B0J,B0K,B0L, + BA0(23)[42],BD0(23)[42],BG0(23)[42],BH0(23)[43],BH0(23)[42],BY0(23)[42],=BA4DC/0(23)[42], + =BD9BI/0(23)[42],=BG8FUL/0(23)[42],=BA4DT/0(23)[42],=BA4RF/0(23)[42],=BA7IO/0(23)[42], + =BA7JS/0(23)[42],=BD1PTA/0(23)[42],=BD7IEE/0(23)[42],=BG1KIY/0(23)[42],=BG1LLB/0(23)[42], + =BG1PIP/0(23)[42],=BG4WUA/0(23)[42],=BY1WXD/0(23)[42]; +BeiJing China: 24: 44: AS: 39.92: -116.46: -8.0: BY: + BA1,BD1,BG1,BH1,BI1,BJ1,BL1,BY1,B1,=AA1IZ/BY1DX,=AJ3M/BY1RX,=BG9XD/1,=BT1OY/YL,=BY1BJ/1DX, + =BY1PK/I1ZB,=BY1TTY/OD5LN,=DL5MC/BY1PK,=F5RAV/BY1RX,=F6HMJ/BY1TX,=G4DFN/BY1PK,=JT1BV/BY1DX, + =JT1BV/BY1RX,=K0MD/BY1TX,=K5SF/BY1RX,=KO4RR/BY1PK,=KU1CW/BY1RX,=LZ2HM/BY1RX,=N4OE/BY1TTY, + =N4WV/BY1PK,=OD5LN/BA1RB,=OD5LN/BY1TTY,=OH2MA/BY1DX,=OM3UU/BY1CJL,=UW1GZ/BA1RB,=VE3FU/BY1TTY, + =VO1AU/BY1DX,=VO1AU/BY1RX,=VO1AU/BY1TTY,=W0NB/BY1PK,=W4IM/BY1PK,=OD5LN/BY1RX; +HeiLongJiang China: 23: 33: AS: 45.75: -126.63: -8.0: BY: + BA2A,BA2B,BA2C,BA2D,BA2E,BA2F,BA2G,BA2H,BD2A,BD2B,BD2C,BD2D,BD2E,BD2F,BD2G,BD2H,BG2A,BG2B,BG2C, + BG2D,BG2E,BG2F,BG2G,BG2H,BH2A,BH2B,BH2C,BH2D,BH2E,BH2F,BH2G,BH2H,BI2A,BI2B,BI2C,BI2D,BI2E,BI2F, + BI2G,BI2H,BY2A,BY2B,BY2C,BY2D,BY2E,BY2F,BY2G,BY2H,B2A,B2B,B2C,B2D,B2E,B2F,B2G,B2H, + 3H2A[33],3H2B[33],3H2C[33],3H2D[33],3H2E[33],3H2F[33],3H2G[33],3H2H[33],3I2A[33],3I2B[33], + 3I2C[33],3I2D[33],3I2E[33],3I2F[33],3I2G[33],3I2H[33],3J2A[33],3J2B[33],3J2C[33],3J2D[33], + 3J2E[33],3J2F[33],3J2G[33],3J2H[33],3K2A[33],3K2B[33],3K2C[33],3K2D[33],3K2E[33],3K2F[33], + 3K2G[33],3K2H[33],3L2A[33],3L2B[33],3L2C[33],3L2D[33],3L2E[33],3L2F[33],3L2G[33],3L2H[33], + 3M2A[33],3M2B[33],3M2C[33],3M2D[33],3M2E[33],3M2F[33],3M2G[33],3M2H[33],3N2A[33],3N2B[33], + 3N2C[33],3N2D[33],3N2E[33],3N2F[33],3N2G[33],3N2H[33],3O2A[33],3O2B[33],3O2C[33],3O2D[33], + 3O2E[33],3O2F[33],3O2G[33],3O2H[33],3P2A[33],3P2B[33],3P2C[33],3P2D[33],3P2E[33],3P2F[33], + 3P2G[33],3P2H[33],3Q2A[33],3Q2B[33],3Q2C[33],3Q2D[33],3Q2E[33],3Q2F[33],3Q2G[33],3Q2H[33], + 3R2A[33],3R2B[33],3R2C[33],3R2D[33],3R2E[33],3R2F[33],3R2G[33],3R2H[33],3S2A[33],3S2B[33], + 3S2C[33],3S2D[33],3S2E[33],3S2F[33],3S2G[33],3S2H[33],3T2A[33],3T2B[33],3T2C[33],3T2D[33], + 3T2E[33],3T2F[33],3T2G[33],3T2H[33],3U2A[33],3U2B[33],3U2C[33],3U2D[33],3U2E[33],3U2F[33], + 3U2G[33],3U2H[33],B2A[33],B2B[33],B2C[33],B2D[33],B2E[33],B2F[33],B2G[33],B2H[33],BA2A[33], + BA2B[33],BA2C[33],BA2D[33],BA2E[33],BA2F[33],BA2G[33],BA2H[33],BD2A[33],BD2B[33],BD2C[33], + BD2D[33],BD2E[33],BD2F[33],BD2G[33],BD2H[33],BG2A[33],BG2B[33],BG2C[33],BG2D[33],BG2E[33], + BG2F[33],BG2G[33],BG2H[33],BH2A[33],BH2B[33],BH2C[33],BH2D[33],BH2E[33],BH2F[33],BH2G[33], + BH2H[33],BI2A[33],BI2B[33],BI2C[33],BI2D[33],BI2E[33],BI2F[33],BI2G[33],BI2H[33],BJ2A[33], + BJ2B[33],BJ2C[33],BJ2D[33],BJ2E[33],BJ2F[33],BJ2G[33],BJ2H[33],BL2A[33],BL2B[33],BL2C[33], + BL2D[33],BL2E[33],BL2F[33],BL2G[33],BL2H[33],BT2A[33],BT2B[33],BT2C[33],BT2D[33],BT2E[33], + BT2F[33],BT2G[33],BT2H[33],BY2A[33],BY2B[33],BY2C[33],BY2D[33],BY2E[33],BY2F[33],BY2G[33], + BY2H[33],BZ2A[33],BZ2B[33],BZ2C[33],BZ2D[33],BZ2E[33],BZ2F[33],BZ2G[33],BZ2H[33],XS2A[33], + XS2B[33],XS2C[33],XS2D[33],XS2E[33],XS2F[33],XS2G[33],XS2H[33],=UA9OW/BY2HIT[33]; +JiLin China: 24: 44: AS: 43.88: -125.35: -8.0: BY: + BA2I,BA2J,BA2K,BA2L,BA2M,BA2N,BA2O,BA2P,BD2I,BD2J,BD2K,BD2L,BD2M,BD2N,BD2O,BD2P,BG2I,BG2J, + BG2K,BG2L,BG2M,BG2N,BG2O,BG2P,BH2I,BH2J,BH2K,BH2L,BH2M,BH2N,BH2O,BH2P,BI2I,BI2J,BI2K,BI2L, + BI2M,BI2N,BI2O,BI2P,BY2I,BY2J,BY2K,BY2L,BY2M,BY2N,BY2O,BY2P,B2I,B2J,B2K,B2L,B2M,B2N,B2O,B2P, + 3H2I[33],3H2J[33],3H2K[33],3H2L[33],3H2M[33],3H2N[33],3H2O[33],3H2P[33],3I2I[33],3I2J[33], + 3I2K[33],3I2L[33],3I2M[33],3I2N[33],3I2O[33],3I2P[33],3J2I[33],3J2J[33],3J2K[33],3J2L[33], + 3J2M[33],3J2N[33],3J2O[33],3J2P[33],3K2I[33],3K2J[33],3K2K[33],3K2L[33],3K2M[33],3K2N[33], + 3K2O[33],3K2P[33],3L2I[33],3L2J[33],3L2K[33],3L2L[33],3L2M[33],3L2N[33],3L2O[33],3L2P[33], + 3M2I[33],3M2J[33],3M2K[33],3M2L[33],3M2M[33],3M2N[33],3M2O[33],3M2P[33],3N2I[33],3N2J[33], + 3N2K[33],3N2L[33],3N2M[33],3N2N[33],3N2O[33],3N2P[33],3O2I[33],3O2J[33],3O2K[33],3O2L[33], + 3O2M[33],3O2N[33],3O2O[33],3O2P[33],3P2I[33],3P2J[33],3P2K[33],3P2L[33],3P2M[33],3P2N[33], + 3P2O[33],3P2P[33],3Q2I[33],3Q2J[33],3Q2K[33],3Q2L[33],3Q2M[33],3Q2N[33],3Q2O[33],3Q2P[33], + 3R2I[33],3R2J[33],3R2K[33],3R2L[33],3R2M[33],3R2N[33],3R2O[33],3R2P[33],3S2I[33],3S2J[33], + 3S2K[33],3S2L[33],3S2M[33],3S2N[33],3S2O[33],3S2P[33],3T2I[33],3T2J[33],3T2K[33],3T2L[33], + 3T2M[33],3T2N[33],3T2O[33],3T2P[33],3U2I[33],3U2J[33],3U2K[33],3U2L[33],3U2M[33],3U2N[33], + 3U2O[33],3U2P[33],B2I[33],B2J[33],B2K[33],B2L[33],B2M[33],B2N[33],B2O[33],B2P[33],BA2I[33], + BA2J[33],BA2K[33],BA2L[33],BA2M[33],BA2N[33],BA2O[33],BA2P[33],BD2I[33],BD2J[33],BD2K[33], + BD2L[33],BD2M[33],BD2N[33],BD2O[33],BD2P[33],BG2I[33],BG2J[33],BG2K[33],BG2L[33],BG2M[33], + BG2N[33],BG2O[33],BG2P[33],BH2I[33],BH2J[33],BH2K[33],BH2L[33],BH2M[33],BH2N[33],BH2O[33], + BH2P[33],BI2I[33],BI2J[33],BI2K[33],BI2L[33],BI2M[33],BI2N[33],BI2O[33],BI2P[33],BJ2I[33], + BJ2J[33],BJ2K[33],BJ2L[33],BJ2M[33],BJ2N[33],BJ2O[33],BJ2P[33],BL2I[33],BL2J[33],BL2K[33], + BL2L[33],BL2M[33],BL2N[33],BL2O[33],BL2P[33],BT2I[33],BT2J[33],BT2K[33],BT2L[33],BT2M[33], + BT2N[33],BT2O[33],BT2P[33],BY2I[33],BY2J[33],BY2K[33],BY2L[33],BY2M[33],BY2N[33],BY2O[33], + BY2P[33],BZ2I[33],BZ2J[33],BZ2K[33],BZ2L[33],BZ2M[33],BZ2N[33],BZ2O[33],BZ2P[33],XS2I[33], + XS2J[33],XS2K[33],XS2L[33],XS2M[33],XS2N[33],XS2O[33],XS2P[33]; +LiaoNing China: 24: 44: AS: 41.8: -123.38: -8.0: BY: + BA2Q,BA2R,BA2S,BA2T,BA2U,BA2V,BA2W,BA2X,BD2Q,BD2R,BD2S,BD2T,BD2U,BD2V,BD2W,BD2X,BG2Q,BG2R, + BG2S,BG2T,BG2U,BG2V,BG2W,BG2X,BH2Q,BH2R,BH2S,BH2T,BH2U,BH2V,BH2W,BH2X,BI2Q,BI2R,BI2S,BI2T, + BI2U,BI2V,BI2W,BI2X,BY2Q,BY2R,BY2S,BY2T,BY2U,BY2V,BY2W,BY2X,B2Q,B2R,B2S,B2T,B2U,B2V,B2W,B2X; +TianJin China: 24: 44: AS: 39.13: -117.2: -8.0: BY: + BA3A,BA3B,BA3C,BA3D,BA3E,BA3F,BD3A,BD3B,BD3C,BD3D,BD3E,BD3F,BG3A,BG3B,BG3C,BG3D,BG3E,BG3F, + BH3A,BH3B,BH3C,BH3D,BH3E,BH3F,BI3A,BI3B,BI3C,BI3D,BI3E,BI3F,BY3A,BY3B,BY3C,BY3D,BY3E,BY3F, + B3A,B3B,B3C,B3D,B3E,B3F; +NeiMengGu China: 23: 44: AS: 40.82: -111.65: -8.0: BY: + BA3G,BA3H,BA3I,BA3J,BA3K,BA3L,BD3G,BD3H,BD3I,BD3J,BD3K,BD3L,BG3G,BG3H,BG3I,BG3J,BG3K,BG3L, + BH3G,BH3H,BH3I,BH3J,BH3K,BH3L,BI3G,BI3H,BI3I,BI3J,BI3K,BI3L,BY3G,BY3H,BY3I,BY3J,BY3K,BY3L, + B3G,B3H,B3I,B3J,B3K,B3L, + 3H3G(23)[33],3H3H(23)[33],3H3I(23)[33],3H3J(23)[33],3H3K(23)[33],3H3L(23)[33],3I3G(23)[33], + 3I3H(23)[33],3I3I(23)[33],3I3J(23)[33],3I3K(23)[33],3I3L(23)[33],3J3G(23)[33],3J3H(23)[33], + 3J3I(23)[33],3J3J(23)[33],3J3K(23)[33],3J3L(23)[33],3K3G(23)[33],3K3H(23)[33],3K3I(23)[33], + 3K3J(23)[33],3K3K(23)[33],3K3L(23)[33],3L3G(23)[33],3L3H(23)[33],3L3I(23)[33],3L3J(23)[33], + 3L3K(23)[33],3L3L(23)[33],3M3G(23)[33],3M3H(23)[33],3M3I(23)[33],3M3J(23)[33],3M3K(23)[33], + 3M3L(23)[33],3N3G(23)[33],3N3H(23)[33],3N3I(23)[33],3N3J(23)[33],3N3K(23)[33],3N3L(23)[33], + 3O3G(23)[33],3O3H(23)[33],3O3I(23)[33],3O3J(23)[33],3O3K(23)[33],3O3L(23)[33],3P3G(23)[33], + 3P3H(23)[33],3P3I(23)[33],3P3J(23)[33],3P3K(23)[33],3P3L(23)[33],3Q3G(23)[33],3Q3H(23)[33], + 3Q3I(23)[33],3Q3J(23)[33],3Q3K(23)[33],3Q3L(23)[33],3R3G(23)[33],3R3H(23)[33],3R3I(23)[33], + 3R3J(23)[33],3R3K(23)[33],3R3L(23)[33],3S3G(23)[33],3S3H(23)[33],3S3I(23)[33],3S3J(23)[33], + 3S3K(23)[33],3S3L(23)[33],3T3G(23)[33],3T3H(23)[33],3T3I(23)[33],3T3J(23)[33],3T3K(23)[33], + 3T3L(23)[33],3U3G(23)[33],3U3H(23)[33],3U3I(23)[33],3U3J(23)[33],3U3K(23)[33],3U3L(23)[33], + B3G(23)[33],B3H(23)[33],B3I(23)[33],B3J(23)[33],B3K(23)[33],B3L(23)[33],BA3G(23)[33],BA3H(23)[33], + BA3I(23)[33],BA3J(23)[33],BA3K(23)[33],BA3L(23)[33],BD3G(23)[33],BD3H(23)[33],BD3I(23)[33], + BD3J(23)[33],BD3K(23)[33],BD3L(23)[33],BG3G(23)[33],BG3H(23)[33],BG3I(23)[33],BG3J(23)[33], + BG3K(23)[33],BG3L(23)[33],BH3G(23)[33],BH3H(23)[33],BH3I(23)[33],BH3J(23)[33],BH3K(23)[33], + BH3L(23)[33],BI3G(23)[33],BI3H(23)[33],BI3I(23)[33],BI3J(23)[33],BI3K(23)[33],BI3L(23)[33], + BJ3G(23)[33],BJ3H(23)[33],BJ3I(23)[33],BJ3J(23)[33],BJ3K(23)[33],BJ3L(23)[33],BL3G(23)[33], + BL3H(23)[33],BL3I(23)[33],BL3J(23)[33],BL3K(23)[33],BL3L(23)[33],BT3G(23)[33],BT3H(23)[33], + BT3I(23)[33],BT3J(23)[33],BT3K(23)[33],BT3L(23)[33],BY3G(23)[33],BY3H(23)[33],BY3I(23)[33], + BY3J(23)[33],BY3K(23)[33],BY3L(23)[33],BZ3G(23)[33],BZ3H(23)[33],BZ3I(23)[33],BZ3J(23)[33], + BZ3K(23)[33],BZ3L(23)[33],XS3G(23)[33],XS3H(23)[33],XS3I(23)[33],XS3J(23)[33],XS3K(23)[33], + XS3L(23)[33]; +HeBei China: 24: 44: AS: 38.03: -114.48: -8.0: BY: + BA3M,BA3N,BA3O,BA3P,BA3Q,BA3R,BD3M,BD3N,BD3O,BD3P,BD3Q,BD3R,BG3M,BG3N,BG3O,BG3P,BG3Q,BG3R,BH3M, + BH3N,BH3O,BH3P,BH3Q,BH3R,BI3M,BI3N,BI3O,BI3P,BI3Q,BI3R,BY3M,BY3N,BY3O,BY3P,BY3Q,BY3R,B3M,B3N, + B3O,B3P,B3Q,B3R; +ShiJiaZhuang HeBei China: 24: 44: AS: 38.03: -114.48: -8.0: BY: + =BD3OOX,=BD3QT,=BH3AAA,=BY3MK; +ShanXi China: 24: 44: AS: 37.87: -112.53: -8.0: BY: + BA3S,BA3T,BA3U,BA3V,BA3W,BA3X,BD3S,BD3T,BD3U,BD3V,BD3W,BD3X,BG3S,BG3T,BG3U,BG3V,BG3W,BG3X, + BH3S,BH3T,BH3U,BH3V,BH3W,BH3X,BI3S,BI3T,BI3U,BI3V,BI3W,BI3X,BY3S,BY3T,BY3U,BY3V,BY3W,BY3X, + B3S,B3T,B3U,B3V,B3W,B3X; +ShangHai China: 24: 44: AS: 31.22: -121.48: -8.0: BY: + BA4A,BA4B,BA4C,BA4D,BA4E,BA4F,BA4G,BA4H,BD4A,BD4B,BD4C,BD4D,BD4E,BD4F,BD4G,BD4H,BG4A,BG4B,BG4C, + BG4D,BG4E,BG4F,BG4G,BG4H,BH4A,BH4B,BH4C,BH4D,BH4E,BH4F,BH4G,BH4H,BI4A,BI4B,BI4C,BI4D,BI4E,BI4F, + BI4G,BI4H,BY4A,BY4B,BY4C,BY4D,BY4E,BY4F,BY4G,BY4H,B4A,B4B,B4C,B4D,B4E,B4F,B4G,B4H, + =7K1OUO/BY4AOH,=AA2WN/BA4DW,=BY4DX/W9HQ,=DF4ZK/BY4AA,=DF4ZK/BY4BZB,=DJ7BU/BY4BZB,=F5JSD/BY4AA, + =F5NVF/BY4AA,=HZ1MD/BY4AOH,=JA0AZ/BY4AEE,=JA1UQA/BY4AOH,=JE1PYH/BY4AOH,=JE2FUP/BY4AOH, + =JE2LPC/BY4AOH,=JH1TEB/BY4AOH,=JH3TXR/BY4AOH,=JH7DFZ/BY4AOH,=JJ1LRD/BY4AOH,=JL1KBS/BY4HAM, + =JP1STX/BY4HAM,=KA8PVS/BY4BBS,=KD3TB/BY4BZB,=KK7PW/BA4DW,=KT8X/BY4BNS,=KU1CW/BY4AE,=KU1CW/BY4DX, + =VE3LBQ/BY4AOH,=VE7AF/BY4AOH,=VE7KC/BA4DW,=VR2SS/BY4AOH,=W0NB/BY4AA,=W8NF/BY4AOH,=W8NF/BY4CYL, + =WX8C/BY4AA; +ShanDong China: 24: 44: AS: 36.65: -117.0: -8.0: BY: + BA4I,BA4J,BA4K,BA4L,BA4M,BA4N,BA4O,BA4P,BD4I,BD4J,BD4K,BD4L,BD4M,BD4N,BD4O,BD4P,BG4I,BG4J, + BG4K,BG4L,BG4M,BG4N,BG4O,BG4P,BH4I,BH4J,BH4K,BH4L,BH4M,BH4N,BH4O,BH4P,BI4I,BI4J,BI4K,BI4L, + BI4M,BI4N,BI4O,BI4P,BY4I,BY4J,BY4K,BY4L,BY4M,BY4N,BY4O,BY4P,B4I,B4J,B4K,B4L,B4M,B4N,B4O,B4P; +JiangSu China: 24: 44: AS: 32.04: -118.78: -8.0: BY: + BA4Q,BA4R,BA4S,BA4T,BA4U,BA4V,BA4W,BA4X,BD4Q,BD4R,BD4S,BD4T,BD4U,BD4V,BD4W,BD4X,BG4Q,BG4R,BG4S, + BG4T,BG4U,BG4V,BG4W,BG4X,BH4Q,BH4R,BH4S,BH4T,BH4U,BH4V,BH4W,BH4X,BI4Q,BI4R,BI4S,BI4T,BI4U,BI4V, + BI4W,BI4X,BY4Q,BY4R,BY4S,BY4T,BY4U,BY4V,BY4W,BY4X,B4Q,B4R,B4S,B4T,B4U,B4V,B4W,B4X, + =DL2JRM/BY4RRR,=DL3OCH/BY4RRR,=F6AJA/BY4RJZ,=JA0AZ/BY4SZ,=PG5M/BA4RF; +SuZhou JiangSu China: 24: 44: AS: 32.04: -118.78: -8.0: BY: + =BI4SDT; +ZheJiang China: 24: 44: AS: 30.26: -120.19: -8.0: BY: + BA5A,BA5B,BA5C,BA5D,BA5E,BA5F,BA5G,BA5H,BD5A,BD5B,BD5C,BD5D,BD5E,BD5F,BD5G,BD5H,BG5A,BG5B,BG5C, + BG5D,BG5E,BG5F,BG5G,BG5H,BH5A,BH5B,BH5C,BH5D,BH5E,BH5F,BH5G,BH5H,BI5A,BI5B,BI5C,BI5D,BI5E,BI5F, + BI5G,BI5H,BY5A,BY5B,BY5C,BY5D,BY5E,BY5F,BY5G,BY5H,B5A,B5B,B5C,B5D,B5E,B5F,B5G,B5H,=K8ZCT/BA5AN, + =OK7MT/BY5HB; +JiangXi China: 24: 44: AS: 28.68: -115.89: -8.0: BY: + BA5I,BA5J,BA5K,BA5L,BA5M,BA5N,BA5O,BA5P,BD5I,BD5J,BD5K,BD5L,BD5M,BD5N,BD5O,BD5P,BG5I,BG5J, + BG5K,BG5L,BG5M,BG5N,BG5O,BG5P,BH5I,BH5J,BH5K,BH5L,BH5M,BH5N,BH5O,BH5P,BI5I,BI5J,BI5K,BI5L, + BI5M,BI5N,BI5O,BI5P,BY5I,BY5J,BY5K,BY5L,BY5M,BY5N,BY5O,BY5P,B5I,B5J,B5K,B5L,B5M,B5N,B5O,B5P; +FuJian China: 24: 44: AS: 26.08: -119.3: -8.0: BY: + BA5Q,BA5R,BA5S,BA5T,BA5U,BA5V,BA5W,BA5X,BD5Q,BD5R,BD5S,BD5T,BD5U,BD5V,BD5W,BD5X,BG5Q,BG5R,BG5S, + BG5T,BG5U,BG5V,BG5W,BG5X,BH5Q,BH5R,BH5S,BH5T,BH5U,BH5V,BH5W,BH5X,BI5Q,BI5R,BI5S,BI5T,BI5U,BI5V, + BI5W,BI5X,BY5Q,BY5R,BY5S,BY5T,BY5U,BY5V,BY5W,BY5X,B5Q,B5R,B5S,B5T,B5U,B5V,B5W,B5X; +AnHui China: 24: 44: AS: 31.86: -117.27: -8.0: BY: + BA6A,BA6B,BA6C,BA6D,BA6E,BA6F,BA6G,BA6H,BD6A,BD6B,BD6C,BD6D,BD6E,BD6F,BD6G,BD6H,BG6A,BG6B,BG6C, + BG6D,BG6E,BG6F,BG6G,BG6H,BH6A,BH6B,BH6C,BH6D,BH6E,BH6F,BH6G,BH6H,BI6A,BI6B,BI6C,BI6D,BI6E,BI6F, + BI6G,BI6H,BY6A,BY6B,BY6C,BY6D,BY6E,BY6F,BY6G,BY6H,B6A,B6B,B6C,B6D,B6E,B6F,B6G,B6H; +HeNan China: 24: 44: AS: 34.76: -113.65: -8.0: BY: + BA6I,BA6J,BA6K,BA6L,BA6M,BA6N,BA6O,BA6P,BD6I,BD6J,BD6K,BD6L,BD6M,BD6N,BD6O,BD6P,BG6I,BG6J, + BG6K,BG6L,BG6M,BG6N,BG6O,BG6P,BH6I,BH6J,BH6K,BH6L,BH6M,BH6N,BH6O,BH6P,BI6I,BI6J,BI6K,BI6L, + BI6M,BI6N,BI6O,BI6P,BY6I,BY6J,BY6K,BY6L,BY6M,BY6N,BY6O,BY6P,B6I,B6J,B6K,B6L,B6M,B6N,B6O,B6P, + =UA9HW/BY6IA; +HuBei China: 24: 44: AS: 30.52: -114.31: -8.0: BY: + BA6Q,BA6R,BA6S,BA6T,BA6U,BA6V,BA6W,BA6X,BD6Q,BD6R,BD6S,BD6T,BD6U,BD6V,BD6W,BD6X,BG6Q,BG6R,BG6S, + BG6T,BG6U,BG6V,BG6W,BG6X,BH6Q,BH6R,BH6S,BH6T,BH6U,BH6V,BH6W,BH6X,BI6Q,BI6R,BI6S,BI6T,BI6U,BI6V, + BI6W,BI6X,BY6Q,BY6R,BY6S,BY6T,BY6U,BY6V,BY6W,BY6X,B6Q,B6R,B6S,B6T,B6U,B6V,B6W,B6X, + 3H6Q[43],3H6R[43],3H6S[43],3H6T[43],3H6U[43],3H6V[43],3H6W[43],3H6X[43],3I6Q[43],3I6R[43], + 3I6S[43],3I6T[43],3I6U[43],3I6V[43],3I6W[43],3I6X[43],3J6Q[43],3J6R[43],3J6S[43],3J6T[43], + 3J6U[43],3J6V[43],3J6W[43],3J6X[43],3K6Q[43],3K6R[43],3K6S[43],3K6T[43],3K6U[43],3K6V[43], + 3K6W[43],3K6X[43],3L6Q[43],3L6R[43],3L6S[43],3L6T[43],3L6U[43],3L6V[43],3L6W[43],3L6X[43], + 3M6Q[43],3M6R[43],3M6S[43],3M6T[43],3M6U[43],3M6V[43],3M6W[43],3M6X[43],3N6Q[43],3N6R[43], + 3N6S[43],3N6T[43],3N6U[43],3N6V[43],3N6W[43],3N6X[43],3O6Q[43],3O6R[43],3O6S[43],3O6T[43], + 3O6U[43],3O6V[43],3O6W[43],3O6X[43],3P6Q[43],3P6R[43],3P6S[43],3P6T[43],3P6U[43],3P6V[43], + 3P6W[43],3P6X[43],3Q6Q[43],3Q6R[43],3Q6S[43],3Q6T[43],3Q6U[43],3Q6V[43],3Q6W[43],3Q6X[43], + 3R6Q[43],3R6R[43],3R6S[43],3R6T[43],3R6U[43],3R6V[43],3R6W[43],3R6X[43],3S6Q[43],3S6R[43], + 3S6S[43],3S6T[43],3S6U[43],3S6V[43],3S6W[43],3S6X[43],3T6Q[43],3T6R[43],3T6S[43],3T6T[43], + 3T6U[43],3T6V[43],3T6W[43],3T6X[43],3U6Q[43],3U6R[43],3U6S[43],3U6T[43],3U6U[43],3U6V[43], + 3U6W[43],3U6X[43],B6Q[43],B6R[43],B6S[43],B6T[43],B6U[43],B6V[43],B6W[43],B6X[43],BA6Q[43], + BA6R[43],BA6S[43],BA6T[43],BA6U[43],BA6V[43],BA6W[43],BA6X[43],BD6Q[43],BD6R[43],BD6S[43], + BD6T[43],BD6U[43],BD6V[43],BD6W[43],BD6X[43],BG6Q[43],BG6R[43],BG6S[43],BG6T[43],BG6U[43], + BG6V[43],BG6W[43],BG6X[43],BH6Q[43],BH6R[43],BH6S[43],BH6T[43],BH6U[43],BH6V[43],BH6W[43], + BH6X[43],BI6Q[43],BI6R[43],BI6S[43],BI6T[43],BI6U[43],BI6V[43],BI6W[43],BI6X[43],BJ6Q[43], + BJ6R[43],BJ6S[43],BJ6T[43],BJ6U[43],BJ6V[43],BJ6W[43],BJ6X[43],BL6Q[43],BL6R[43],BL6S[43], + BL6T[43],BL6U[43],BL6V[43],BL6W[43],BL6X[43],BT6Q[43],BT6R[43],BT6S[43],BT6T[43],BT6U[43], + BT6V[43],BT6W[43],BT6X[43],BY6Q[43],BY6R[43],BY6S[43],BY6T[43],BY6U[43],BY6V[43],BY6W[43], + BY6X[43],BZ6Q[43],BZ6R[43],BZ6S[43],BZ6T[43],BZ6U[43],BZ6V[43],BZ6W[43],BZ6X[43],XS6Q[43], + XS6R[43],XS6S[43],XS6T[43],XS6U[43],XS6V[43],XS6W[43],XS6X[43]; +HuNan China: 24: 44: AS: 28.21: -113.0: -8.0: BY: + B7A,B7B,B7C,B7D,B7E,B7F,B7G,B7H,BA7A,BA7B,BA7C,BA7D,BA7E,BA7F,BA7G,BA7H,BD7A,BD7B,BD7C,BD7D, + BD7E,BD7F,BD7G,BD7H,BG7A,BG7B,BG7C,BG7D,BG7E,BG7F,BG7G,BG7H,BH7A,BH7B,BH7C,BH7D,BH7E,BH7F, + BH7G,BH7H,BI7A,BI7B,BI7C,BI7D,BI7E,BI7F,BI7G,BI7H,BY7A,BY7B,BY7C,BY7D,BY7E,BY7F,BY7G,BY7H, + B7A,B7B,B7C,B7D,B7E,B7F,B7G,B7H, + 3H7A[43],3H7B[43],3H7C[43],3H7D[43],3H7E[43],3H7F[43],3H7G[43],3H7H[43],3I7A[43],3I7B[43], + 3I7C[43],3I7D[43],3I7E[43],3I7F[43],3I7G[43],3I7H[43],3J7A[43],3J7B[43],3J7C[43],3J7D[43], + 3J7E[43],3J7F[43],3J7G[43],3J7H[43],3K7A[43],3K7B[43],3K7C[43],3K7D[43],3K7E[43],3K7F[43], + 3K7G[43],3K7H[43],3L7A[43],3L7B[43],3L7C[43],3L7D[43],3L7E[43],3L7F[43],3L7G[43],3L7H[43], + 3M7A[43],3M7B[43],3M7C[43],3M7D[43],3M7E[43],3M7F[43],3M7G[43],3M7H[43],3N7A[43],3N7B[43], + 3N7C[43],3N7D[43],3N7E[43],3N7F[43],3N7G[43],3N7H[43],3O7A[43],3O7B[43],3O7C[43],3O7D[43], + 3O7E[43],3O7F[43],3O7G[43],3O7H[43],3P7A[43],3P7B[43],3P7C[43],3P7D[43],3P7E[43],3P7F[43], + 3P7G[43],3P7H[43],3Q7A[43],3Q7B[43],3Q7C[43],3Q7D[43],3Q7E[43],3Q7F[43],3Q7G[43],3Q7H[43], + 3R7A[43],3R7B[43],3R7C[43],3R7D[43],3R7E[43],3R7F[43],3R7G[43],3R7H[43],3S7A[43],3S7B[43], + 3S7C[43],3S7D[43],3S7E[43],3S7F[43],3S7G[43],3S7H[43],3T7A[43],3T7B[43],3T7C[43],3T7D[43], + 3T7E[43],3T7F[43],3T7G[43],3T7H[43],3U7A[43],3U7B[43],3U7C[43],3U7D[43],3U7E[43],3U7F[43], + 3U7G[43],3U7H[43],B7A[43],B7B[43],B7C[43],B7D[43],B7E[43],B7F[43],B7G[43],B7H[43],BA7A[43], + BA7B[43],BA7C[43],BA7D[43],BA7E[43],BA7F[43],BA7G[43],BA7H[43],BD7A[43],BD7B[43],BD7C[43], + BD7D[43],BD7E[43],BD7F[43],BD7G[43],BD7H[43],BG7A[43],BG7B[43],BG7C[43],BG7D[43],BG7E[43], + BG7F[43],BG7G[43],BG7H[43],BH7A[43],BH7B[43],BH7C[43],BH7D[43],BH7E[43],BH7F[43],BH7G[43], + BH7H[43],BI7A[43],BI7B[43],BI7C[43],BI7D[43],BI7E[43],BI7F[43],BI7G[43],BI7H[43],BJ7A[43], + BJ7B[43],BJ7C[43],BJ7D[43],BJ7E[43],BJ7F[43],BJ7G[43],BJ7H[43],BL7A[43],BL7B[43],BL7C[43], + BL7D[43],BL7E[43],BL7F[43],BL7G[43],BL7H[43],BT7A[43],BT7B[43],BT7C[43],BT7D[43],BT7E[43], + BT7F[43],BT7G[43],BT7H[43],BY7A[43],BY7B[43],BY7C[43],BY7D[43],BY7E[43],BY7F[43],BY7G[43], + BY7H[43],BZ7A[43],BZ7B[43],BZ7C[43],BZ7D[43],BZ7E[43],BZ7F[43],BZ7G[43],BZ7H[43],XS7A[43], + XS7B[43],XS7C[43],XS7D[43],XS7E[43],XS7F[43],XS7G[43],XS7H[43]; +GuangDong China: 24: 44: AS: 23.16: -113.23: -8.0: BY: + BA7I,BA7J,BA7K,BA7L,BA7M,BA7N,BA7O,BA7P,BD7I,BD7J,BD7K,BD7L,BD7M,BD7N,BD7O,BD7P,BG7I,BG7J, + BG7K,BG7L,BG7M,BG7N,BG7O,BG7P,BH7I,BH7J,BH7K,BH7L,BH7M,BH7N,BH7O,BH7P,BI7I,BI7J,BI7K,BI7L, + BI7M,BI7N,BI7O,BI7P,BY7I,BY7J,BY7K,BY7L,BY7M,BY7N,BY7O,BY7P,B7I,B7J,B7K,B7L,B7M,B7N,B7O,B7P, + =BD7JZC/UT3GF,=BD7LPD/UT3GF,=BG7JJW/UT3GF,=DL3NM/BY7KG,=F4BKV/BY7PP,=G0SFJ/BY7KP,=LZ2HM/BY7PP, + =VE7AF/BY7KH,=W1DF/BA7MY,=W1DF/BA7NO,=W6BBA/BD7PUZ,=W6BBA/BY7KTO; +ShenZhen China: 24: 44: AS: 23.16: -113.23: -8.0: BY: + =BD7MJO; +GuangXi China: 24: 43: AS: 22.84: -108.33: -8.0: BY: + BA7Q,BA7R,BA7S,BA7T,BA7U,BA7V,BA7W,BA7X,BD7Q,BD7R,BD7S,BD7T,BD7U,BD7V,BD7W,BD7X,BG7Q,BG7R, + BG7S,BG7T,BG7U,BG7V,BG7W,BG7X,BH7Q,BH7R,BH7S,BH7T,BH7U,BH7V,BH7W,BH7X,BI7Q,BI7R,BI7S,BI7T, + BI7U,BI7V,BI7W,BI7X,BY7Q,BY7R,BY7S,BY7T,BY7U,BY7V,BY7W,BY7X,B7Q,B7R,B7S,B7T,B7U,B7V,B7W,B7X, + 3H7Q[43],3H7R[43],3H7S[43],3H7T[43],3H7U[43],3H7V[43],3H7W[43],3H7X[43],3I7Q[43],3I7R[43], + 3I7S[43],3I7T[43],3I7U[43],3I7V[43],3I7W[43],3I7X[43],3J7Q[43],3J7R[43],3J7S[43],3J7T[43], + 3J7U[43],3J7V[43],3J7W[43],3J7X[43],3K7Q[43],3K7R[43],3K7S[43],3K7T[43],3K7U[43],3K7V[43], + 3K7W[43],3K7X[43],3L7Q[43],3L7R[43],3L7S[43],3L7T[43],3L7U[43],3L7V[43],3L7W[43],3L7X[43], + 3M7Q[43],3M7R[43],3M7S[43],3M7T[43],3M7U[43],3M7V[43],3M7W[43],3M7X[43],3N7Q[43],3N7R[43], + 3N7S[43],3N7T[43],3N7U[43],3N7V[43],3N7W[43],3N7X[43],3O7Q[43],3O7R[43],3O7S[43],3O7T[43], + 3O7U[43],3O7V[43],3O7W[43],3O7X[43],3P7Q[43],3P7R[43],3P7S[43],3P7T[43],3P7U[43],3P7V[43], + 3P7W[43],3P7X[43],3Q7Q[43],3Q7R[43],3Q7S[43],3Q7T[43],3Q7U[43],3Q7V[43],3Q7W[43],3Q7X[43], + 3R7Q[43],3R7R[43],3R7S[43],3R7T[43],3R7U[43],3R7V[43],3R7W[43],3R7X[43],3S7Q[43],3S7R[43], + 3S7S[43],3S7T[43],3S7U[43],3S7V[43],3S7W[43],3S7X[43],3T7Q[43],3T7R[43],3T7S[43],3T7T[43], + 3T7U[43],3T7V[43],3T7W[43],3T7X[43],3U7Q[43],3U7R[43],3U7S[43],3U7T[43],3U7U[43],3U7V[43], + 3U7W[43],3U7X[43],B7Q[43],B7R[43],B7S[43],B7T[43],B7U[43],B7V[43],B7W[43],B7X[43],BA7Q[43], + BA7R[43],BA7S[43],BA7T[43],BA7U[43],BA7V[43],BA7W[43],BA7X[43],BD7Q[43],BD7R[43],BD7S[43], + BD7T[43],BD7U[43],BD7V[43],BD7W[43],BD7X[43],BG7Q[43],BG7R[43],BG7S[43],BG7T[43],BG7U[43], + BG7V[43],BG7W[43],BG7X[43],BH7Q[43],BH7R[43],BH7S[43],BH7T[43],BH7U[43],BH7V[43],BH7W[43], + BH7X[43],BI7Q[43],BI7R[43],BI7S[43],BI7T[43],BI7U[43],BI7V[43],BI7W[43],BI7X[43],BJ7Q[43], + BJ7R[43],BJ7S[43],BJ7T[43],BJ7U[43],BJ7V[43],BJ7W[43],BJ7X[43],BL7Q[43],BL7R[43],BL7S[43], + BL7T[43],BL7U[43],BL7V[43],BL7W[43],BL7X[43],BT7Q[43],BT7R[43],BT7S[43],BT7T[43],BT7U[43], + BT7V[43],BT7W[43],BT7X[43],BY7Q[43],BY7R[43],BY7S[43],BY7T[43],BY7U[43],BY7V[43],BY7W[43], + BY7X[43],BZ7Q[43],BZ7R[43],BZ7S[43],BZ7T[43],BZ7U[43],BZ7V[43],BZ7W[43],BZ7X[43],XS7Q[43], + XS7R[43],XS7S[43],XS7T[43],XS7U[43],XS7V[43],XS7W[43],XS7X[43],=BY7STC/F4CYZ[43]; +HaiNan China: 24: 44: AS: 20.02: -110.35: -8.0: BY: + BA7Y,BA7Z,BD7Y,BD7Z,BG7Y,BG7Z,BH7Y,BH7Z,BI7Y,BI7Z,BY7Y,BY7Z,B7Y,B7Z; +SiChuan China: 24: 43: AS: 30.67: -104.06: -8.0: BY: + BA8A,BA8B,BA8C,BA8D,BA8E,BA8F,BD8A,BD8B,BD8C,BD8D,BD8E,BD8F,BG8A,BG8B,BG8C,BG8D,BG8E,BG8F, + BH8A,BH8B,BH8C,BH8D,BH8E,BH8F,BI8A,BI8B,BI8C,BI8D,BI8E,BI8F,BY8A,BY8B,BY8C,BY8D,BY8E,BY8F, + B8A,B8B,B8C,B8D,B8E,B8F, + 3H8A[43],3H8B[43],3H8C[43],3H8D[43],3H8E[43],3H8F[43],3I8A[43],3I8B[43],3I8C[43],3I8D[43], + 3I8E[43],3I8F[43],3J8A[43],3J8B[43],3J8C[43],3J8D[43],3J8E[43],3J8F[43],3K8A[43],3K8B[43], + 3K8C[43],3K8D[43],3K8E[43],3K8F[43],3L8A[43],3L8B[43],3L8C[43],3L8D[43],3L8E[43],3L8F[43], + 3M8A[43],3M8B[43],3M8C[43],3M8D[43],3M8E[43],3M8F[43],3N8A[43],3N8B[43],3N8C[43],3N8D[43], + 3N8E[43],3N8F[43],3O8A[43],3O8B[43],3O8C[43],3O8D[43],3O8E[43],3O8F[43],3P8A[43],3P8B[43], + 3P8C[43],3P8D[43],3P8E[43],3P8F[43],3Q8A[43],3Q8B[43],3Q8C[43],3Q8D[43],3Q8E[43],3Q8F[43], + 3R8A[43],3R8B[43],3R8C[43],3R8D[43],3R8E[43],3R8F[43],3S8A[43],3S8B[43],3S8C[43],3S8D[43], + 3S8E[43],3S8F[43],3T8A[43],3T8B[43],3T8C[43],3T8D[43],3T8E[43],3T8F[43],3U8A[43],3U8B[43], + 3U8C[43],3U8D[43],3U8E[43],3U8F[43],B8A[43],B8B[43],B8C[43],B8D[43],B8E[43],B8F[43],BA8A[43], + BA8B[43],BA8C[43],BA8D[43],BA8E[43],BA8F[43],BD8A[43],BD8B[43],BD8C[43],BD8D[43],BD8E[43], + BD8F[43],BG8A[43],BG8B[43],BG8C[43],BG8D[43],BG8E[43],BG8F[43],BH8A[43],BH8B[43],BH8C[43], + BH8D[43],BH8E[43],BH8F[43],BI8A[43],BI8B[43],BI8C[43],BI8D[43],BI8E[43],BI8F[43],BJ8A[43], + BJ8B[43],BJ8C[43],BJ8D[43],BJ8E[43],BJ8F[43],BL8A[43],BL8B[43],BL8C[43],BL8D[43],BL8E[43], + BL8F[43],BT8A[43],BT8B[43],BT8C[43],BT8D[43],BT8E[43],BT8F[43],BY8A[43],BY8B[43],BY8C[43], + BY8D[43],BY8E[43],BY8F[43],BZ8A[43],BZ8B[43],BZ8C[43],BZ8D[43],BZ8E[43],BZ8F[43],XS8A[43], + XS8B[43],XS8C[43],XS8D[43],XS8E[43],XS8F[43],=BA0AA/8[43],=ON5TN/BY8AC[43]; +ChongQing China: 24: 43: AS: 29.59: -106.54: -8.0: BY: + BA8G,BA8H,BA8I,BA8J,BA8K,BA8L,BD8G,BD8H,BD8I,BD8J,BD8K,BD8L,BG8G,BG8H,BG8I,BG8J,BG8K,BG8L, + BH8G,BH8H,BH8I,BH8J,BH8K,BH8L,BI8G,BI8H,BI8I,BI8J,BI8K,BI8L,BY8G,BY8H,BY8I,BY8J,BY8K,BY8L, + B8G,B8H,B8I,B8J,B8K,B8L, + 3H8G[43],3H8H[43],3H8I[43],3H8J[43],3H8K[43],3H8L[43],3I8G[43],3I8H[43],3I8I[43],3I8J[43], + 3I8K[43],3I8L[43],3J8G[43],3J8H[43],3J8I[43],3J8J[43],3J8K[43],3J8L[43],3K8G[43],3K8H[43], + 3K8I[43],3K8J[43],3K8K[43],3K8L[43],3L8G[43],3L8H[43],3L8I[43],3L8J[43],3L8K[43],3L8L[43], + 3M8G[43],3M8H[43],3M8I[43],3M8J[43],3M8K[43],3M8L[43],3N8G[43],3N8H[43],3N8I[43],3N8J[43], + 3N8K[43],3N8L[43],3O8G[43],3O8H[43],3O8I[43],3O8J[43],3O8K[43],3O8L[43],3P8G[43],3P8H[43], + 3P8I[43],3P8J[43],3P8K[43],3P8L[43],3Q8G[43],3Q8H[43],3Q8I[43],3Q8J[43],3Q8K[43],3Q8L[43], + 3R8G[43],3R8H[43],3R8I[43],3R8J[43],3R8K[43],3R8L[43],3S8G[43],3S8H[43],3S8I[43],3S8J[43], + 3S8K[43],3S8L[43],3T8G[43],3T8H[43],3T8I[43],3T8J[43],3T8K[43],3T8L[43],3U8G[43],3U8H[43], + 3U8I[43],3U8J[43],3U8K[43],3U8L[43],B8G[43],B8H[43],B8I[43],B8J[43],B8K[43],B8L[43],BA8G[43], + BA8H[43],BA8I[43],BA8J[43],BA8K[43],BA8L[43],BD8G[43],BD8H[43],BD8I[43],BD8J[43],BD8K[43], + BD8L[43],BG8G[43],BG8H[43],BG8I[43],BG8J[43],BG8K[43],BG8L[43],BH8G[43],BH8H[43],BH8I[43], + BH8J[43],BH8K[43],BH8L[43],BI8G[43],BI8H[43],BI8I[43],BI8J[43],BI8K[43],BI8L[43],BJ8G[43], + BJ8H[43],BJ8I[43],BJ8J[43],BJ8K[43],BJ8L[43],BL8G[43],BL8H[43],BL8I[43],BL8J[43],BL8K[43], + BL8L[43],BT8G[43],BT8H[43],BT8I[43],BT8J[43],BT8K[43],BT8L[43],BY8G[43],BY8H[43],BY8I[43], + BY8J[43],BY8K[43],BY8L[43],BZ8G[43],BZ8H[43],BZ8I[43],BZ8J[43],BZ8K[43],BZ8L[43],XS8G[43], + XS8H[43],XS8I[43],XS8J[43],XS8K[43],XS8L[43]; +GuiZhou China: 24: 43: AS: 26.57: -106.71: -8.0: BY: + BA8M,BA8N,BA8O,BA8P,BA8Q,BA8R,BD8M,BD8N,BD8O,BD8P,BD8Q,BD8R,BG8M,BG8N,BG8O,BG8P,BG8Q,BG8R,BH8M, + BH8N,BH8O,BH8P,BH8Q,BH8R,BI8M,BI8N,BI8O,BI8P,BI8Q,BI8R,BY8M,BY8N,BY8O,BY8P,BY8Q,BY8R,B8M,B8N, + B8O,B8P,B8Q,B8R, + 3H8M[43],3H8N[43],3H8O[43],3H8P[43],3H8Q[43],3H8R[43],3I8M[43],3I8N[43],3I8O[43],3I8P[43], + 3I8Q[43],3I8R[43],3J8M[43],3J8N[43],3J8O[43],3J8P[43],3J8Q[43],3J8R[43],3K8M[43],3K8N[43], + 3K8O[43],3K8P[43],3K8Q[43],3K8R[43],3L8M[43],3L8N[43],3L8O[43],3L8P[43],3L8Q[43],3L8R[43], + 3M8M[43],3M8N[43],3M8O[43],3M8P[43],3M8Q[43],3M8R[43],3N8M[43],3N8N[43],3N8O[43],3N8P[43], + 3N8Q[43],3N8R[43],3O8M[43],3O8N[43],3O8O[43],3O8P[43],3O8Q[43],3O8R[43],3P8M[43],3P8N[43], + 3P8O[43],3P8P[43],3P8Q[43],3P8R[43],3Q8M[43],3Q8N[43],3Q8O[43],3Q8P[43],3Q8Q[43],3Q8R[43], + 3R8M[43],3R8N[43],3R8O[43],3R8P[43],3R8Q[43],3R8R[43],3S8M[43],3S8N[43],3S8O[43],3S8P[43], + 3S8Q[43],3S8R[43],3T8M[43],3T8N[43],3T8O[43],3T8P[43],3T8Q[43],3T8R[43],3U8M[43],3U8N[43], + 3U8O[43],3U8P[43],3U8Q[43],3U8R[43],B8M[43],B8N[43],B8O[43],B8P[43],B8Q[43],B8R[43],BA8M[43], + BA8N[43],BA8O[43],BA8P[43],BA8Q[43],BA8R[43],BD8M[43],BD8N[43],BD8O[43],BD8P[43],BD8Q[43], + BD8R[43],BG8M[43],BG8N[43],BG8O[43],BG8P[43],BG8Q[43],BG8R[43],BH8M[43],BH8N[43],BH8O[43], + BH8P[43],BH8Q[43],BH8R[43],BI8M[43],BI8N[43],BI8O[43],BI8P[43],BI8Q[43],BI8R[43],BJ8M[43], + BJ8N[43],BJ8O[43],BJ8P[43],BJ8Q[43],BJ8R[43],BL8M[43],BL8N[43],BL8O[43],BL8P[43],BL8Q[43], + BL8R[43],BT8M[43],BT8N[43],BT8O[43],BT8P[43],BT8Q[43],BT8R[43],BY8M[43],BY8N[43],BY8O[43], + BY8P[43],BY8Q[43],BY8R[43],BZ8M[43],BZ8N[43],BZ8O[43],BZ8P[43],BZ8Q[43],BZ8R[43],XS8M[43], + XS8N[43],XS8O[43],XS8P[43],XS8Q[43],XS8R[43],=VK5GG/BA8MM[43]; +YunNan China: 24: 43: AS: 25.04: -102.73: -8.0: BY: + BA8S,BA8T,BA8U,BA8V,BA8W,BA8X,BD8S,BD8T,BD8U,BD8V,BD8W,BD8X,BG8S,BG8T,BG8U,BG8V,BG8W,BG8X, + BH8S,BH8T,BH8U,BH8V,BH8W,BH8X,BI8S,BI8T,BI8U,BI8V,BI8W,BI8X,BY8S,BY8T,BY8U,BY8V,BY8W,BY8X, + B8S,B8T,B8U,B8V,B8W,B8X, + 3H8S[43],3H8T[43],3H8U[43],3H8V[43],3H8W[43],3H8X[43],3I8S[43],3I8T[43],3I8U[43],3I8V[43], + 3I8W[43],3I8X[43],3J8S[43],3J8T[43],3J8U[43],3J8V[43],3J8W[43],3J8X[43],3K8S[43],3K8T[43], + 3K8U[43],3K8V[43],3K8W[43],3K8X[43],3L8S[43],3L8T[43],3L8U[43],3L8V[43],3L8W[43],3L8X[43], + 3M8S[43],3M8T[43],3M8U[43],3M8V[43],3M8W[43],3M8X[43],3N8S[43],3N8T[43],3N8U[43],3N8V[43], + 3N8W[43],3N8X[43],3O8S[43],3O8T[43],3O8U[43],3O8V[43],3O8W[43],3O8X[43],3P8S[43],3P8T[43], + 3P8U[43],3P8V[43],3P8W[43],3P8X[43],3Q8S[43],3Q8T[43],3Q8U[43],3Q8V[43],3Q8W[43],3Q8X[43], + 3R8S[43],3R8T[43],3R8U[43],3R8V[43],3R8W[43],3R8X[43],3S8S[43],3S8T[43],3S8U[43],3S8V[43], + 3S8W[43],3S8X[43],3T8S[43],3T8T[43],3T8U[43],3T8V[43],3T8W[43],3T8X[43],3U8S[43],3U8T[43], + 3U8U[43],3U8V[43],3U8W[43],3U8X[43],B8S[43],B8T[43],B8U[43],B8V[43],B8W[43],B8X[43],BA8S[43], + BA8T[43],BA8U[43],BA8V[43],BA8W[43],BA8X[43],BD8S[43],BD8T[43],BD8U[43],BD8V[43],BD8W[43], + BD8X[43],BG8S[43],BG8T[43],BG8U[43],BG8V[43],BG8W[43],BG8X[43],BH8S[43],BH8T[43],BH8U[43], + BH8V[43],BH8W[43],BH8X[43],BI8S[43],BI8T[43],BI8U[43],BI8V[43],BI8W[43],BI8X[43],BJ8S[43], + BJ8T[43],BJ8U[43],BJ8V[43],BJ8W[43],BJ8X[43],BL8S[43],BL8T[43],BL8U[43],BL8V[43],BL8W[43], + BL8X[43],BT8S[43],BT8T[43],BT8U[43],BT8V[43],BT8W[43],BT8X[43],BY8S[43],BY8T[43],BY8U[43], + BY8V[43],BY8W[43],BY8X[43],BZ8S[43],BZ8T[43],BZ8U[43],BZ8V[43],BZ8W[43],BZ8X[43],XS8S[43], + XS8T[43],XS8U[43],XS8V[43],XS8W[43],XS8X[43],=DL2JRM/BY8SKM[43],=XX9AH/BG8ST[43]; +ShaanXi China: 24: 43: AS: 34.27: -108.95: -8.0: BY: + BA9A,BA9B,BA9C,BA9D,BA9E,BA9F,BD9A,BD9B,BD9C,BD9D,BD9E,BD9F,BG9A,BG9B,BG9C,BG9D,BG9E,BG9F, + BH9A,BH9B,BH9C,BH9D,BH9E,BH9F,BI9A,BI9B,BI9C,BI9D,BI9E,BI9F,BY9A,BY9B,BY9C,BY9D,BY9E,BY9F, + B9A,B9B,B9C,B9D,B9E,B9F, + 3H9A(24)[43],3H9B(24)[43],3H9C(24)[43],3H9D(24)[43],3H9E(24)[43],3H9F(24)[43],3I9A(24)[43], + 3I9B(24)[43],3I9C(24)[43],3I9D(24)[43],3I9E(24)[43],3I9F(24)[43],3J9A(24)[43],3J9B(24)[43], + 3J9C(24)[43],3J9D(24)[43],3J9E(24)[43],3J9F(24)[43],3K9A(24)[43],3K9B(24)[43],3K9C(24)[43], + 3K9D(24)[43],3K9E(24)[43],3K9F(24)[43],3L9A(24)[43],3L9B(24)[43],3L9C(24)[43],3L9D(24)[43], + 3L9E(24)[43],3L9F(24)[43],3M9A(24)[43],3M9B(24)[43],3M9C(24)[43],3M9D(24)[43],3M9E(24)[43], + 3M9F(24)[43],3N9A(24)[43],3N9B(24)[43],3N9C(24)[43],3N9D(24)[43],3N9E(24)[43],3N9F(24)[43], + 3O9A(24)[43],3O9B(24)[43],3O9C(24)[43],3O9D(24)[43],3O9E(24)[43],3O9F(24)[43],3P9A(24)[43], + 3P9B(24)[43],3P9C(24)[43],3P9D(24)[43],3P9E(24)[43],3P9F(24)[43],3Q9A(24)[43],3Q9B(24)[43], + 3Q9C(24)[43],3Q9D(24)[43],3Q9E(24)[43],3Q9F(24)[43],3R9A(24)[43],3R9B(24)[43],3R9C(24)[43], + 3R9D(24)[43],3R9E(24)[43],3R9F(24)[43],3S9A(24)[43],3S9B(24)[43],3S9C(24)[43],3S9D(24)[43], + 3S9E(24)[43],3S9F(24)[43],3T9A(24)[43],3T9B(24)[43],3T9C(24)[43],3T9D(24)[43],3T9E(24)[43], + 3T9F(24)[43],3U9A(24)[43],3U9B(24)[43],3U9C(24)[43],3U9D(24)[43],3U9E(24)[43],3U9F(24)[43], + B9A(24)[43],B9B(24)[43],B9C(24)[43],B9D(24)[43],B9E(24)[43],B9F(24)[43],BA9A(24)[43],BA9B(24)[43], + BA9C(24)[43],BA9D(24)[43],BA9E(24)[43],BA9F(24)[43],BD9A(24)[43],BD9B(24)[43],BD9C(24)[43], + BD9D(24)[43],BD9E(24)[43],BD9F(24)[43],BG9A(24)[43],BG9B(24)[43],BG9C(24)[43],BG9D(24)[43], + BG9E(24)[43],BG9F(24)[43],BH9A(24)[43],BH9B(24)[43],BH9C(24)[43],BH9D(24)[43],BH9E(24)[43], + BH9F(24)[43],BI9A(24)[43],BI9B(24)[43],BI9C(24)[43],BI9D(24)[43],BI9E(24)[43],BI9F(24)[43], + BJ9A(24)[43],BJ9B(24)[43],BJ9C(24)[43],BJ9D(24)[43],BJ9E(24)[43],BJ9F(24)[43],BL9A(24)[43], + BL9B(24)[43],BL9C(24)[43],BL9D(24)[43],BL9E(24)[43],BL9F(24)[43],BT9A(24)[43],BT9B(24)[43], + BT9C(24)[43],BT9D(24)[43],BT9E(24)[43],BT9F(24)[43],BY9A(24)[43],BY9B(24)[43],BY9C(24)[43], + BY9D(24)[43],BY9E(24)[43],BY9F(24)[43],BZ9A(24)[43],BZ9B(24)[43],BZ9C(24)[43],BZ9D(24)[43], + BZ9E(24)[43],BZ9F(24)[43],XS9A(24)[43],XS9B(24)[43],XS9C(24)[43],XS9D(24)[43],XS9E(24)[43], + XS9F(24)[43],=B9/BH1NGG(24)[43],=BG0GE/9(24)[43]; +GanSu China: 23: 43: AS: 36.03: -103.73: -8.0: BY: + BA9G,BA9H,BA9I,BA9J,BA9K,BA9L,BD9G,BD9H,BD9I,BD9J,BD9K,BD9L,BG9G,BG9H,BG9I,BG9J,BG9K,BG9L, + BH9G,BH9H,BH9I,BH9J,BH9K,BH9L,BI9G,BI9H,BI9I,BI9J,BI9K,BI9L,BY9G,BY9H,BY9I,BY9J,BY9K,BY9L, + B9G,B9H,B9I,B9J,B9K,B9L, + 3H9G(23)[43],3H9H(23)[43],3H9I(23)[43],3H9J(23)[43],3H9K(23)[43],3H9L(23)[43],3I9G(23)[43], + 3I9H(23)[43],3I9I(23)[43],3I9J(23)[43],3I9K(23)[43],3I9L(23)[43],3J9G(23)[43],3J9H(23)[43], + 3J9I(23)[43],3J9J(23)[43],3J9K(23)[43],3J9L(23)[43],3K9G(23)[43],3K9H(23)[43],3K9I(23)[43], + 3K9J(23)[43],3K9K(23)[43],3K9L(23)[43],3L9G(23)[43],3L9H(23)[43],3L9I(23)[43],3L9J(23)[43], + 3L9K(23)[43],3L9L(23)[43],3M9G(23)[43],3M9H(23)[43],3M9I(23)[43],3M9J(23)[43],3M9K(23)[43], + 3M9L(23)[43],3N9G(23)[43],3N9H(23)[43],3N9I(23)[43],3N9J(23)[43],3N9K(23)[43],3N9L(23)[43], + 3O9G(23)[43],3O9H(23)[43],3O9I(23)[43],3O9J(23)[43],3O9K(23)[43],3O9L(23)[43],3P9G(23)[43], + 3P9H(23)[43],3P9I(23)[43],3P9J(23)[43],3P9K(23)[43],3P9L(23)[43],3Q9G(23)[43],3Q9H(23)[43], + 3Q9I(23)[43],3Q9J(23)[43],3Q9K(23)[43],3Q9L(23)[43],3R9G(23)[43],3R9H(23)[43],3R9I(23)[43], + 3R9J(23)[43],3R9K(23)[43],3R9L(23)[43],3S9G(23)[43],3S9H(23)[43],3S9I(23)[43],3S9J(23)[43], + 3S9K(23)[43],3S9L(23)[43],3T9G(23)[43],3T9H(23)[43],3T9I(23)[43],3T9J(23)[43],3T9K(23)[43], + 3T9L(23)[43],3U9G(23)[43],3U9H(23)[43],3U9I(23)[43],3U9J(23)[43],3U9K(23)[43],3U9L(23)[43], + B9G(23)[43],B9H(23)[43],B9I(23)[43],B9J(23)[43],B9K(23)[43],B9L(23)[43],BA9G(23)[43],BA9H(23)[43], + BA9I(23)[43],BA9J(23)[43],BA9K(23)[43],BA9L(23)[43],BD9G(23)[43],BD9H(23)[43],BD9I(23)[43], + BD9J(23)[43],BD9K(23)[43],BD9L(23)[43],BG9G(23)[43],BG9H(23)[43],BG9I(23)[43],BG9J(23)[43], + BG9K(23)[43],BG9L(23)[43],BH9G(23)[43],BH9H(23)[43],BH9I(23)[43],BH9J(23)[43],BH9K(23)[43], + BH9L(23)[43],BI9G(23)[43],BI9H(23)[43],BI9I(23)[43],BI9J(23)[43],BI9K(23)[43],BI9L(23)[43], + BJ9G(23)[43],BJ9H(23)[43],BJ9I(23)[43],BJ9J(23)[43],BJ9K(23)[43],BJ9L(23)[43],BL9G(23)[43], + BL9H(23)[43],BL9I(23)[43],BL9J(23)[43],BL9K(23)[43],BL9L(23)[43],BT9G(23)[43],BT9H(23)[43], + BT9I(23)[43],BT9J(23)[43],BT9K(23)[43],BT9L(23)[43],BY9G(23)[43],BY9H(23)[43],BY9I(23)[43], + BY9J(23)[43],BY9K(23)[43],BY9L(23)[43],BZ9G(23)[43],BZ9H(23)[43],BZ9I(23)[43],BZ9J(23)[43], + BZ9K(23)[43],BZ9L(23)[43],XS9G(23)[43],XS9H(23)[43],XS9I(23)[43],XS9J(23)[43],XS9K(23)[43], + XS9L(23)[43],=B9CRA(23)[43]; +Qingyang GanSu China: 23: 43: AS: 36.03: -103.73: -8.0: BY: + =BG9HBA; +NingXia China: 23: 43: AS: 38.47: -106.27: -8.0: BY: + BA9M,BA9N,BA9O,BA9P,BA9Q,BA9R,BD9M,BD9N,BD9O,BD9P,BD9Q,BD9R,BG9M,BG9N,BG9O,BG9P,BG9Q,BG9R,BH9M, + BH9N,BH9O,BH9P,BH9Q,BH9R,BI9M,BI9N,BI9O,BI9P,BI9Q,BI9R,BY9M,BY9N,BY9O,BY9P,BY9Q, + BY9R,B9M,B9N,B9O,B9P,B9Q,B9R, + 3H9M(23)[43],3H9N(23)[43],3H9O(23)[43],3H9P(23)[43],3H9Q(23)[43],3H9R(23)[43],3I9M(23)[43], + 3I9N(23)[43],3I9O(23)[43],3I9P(23)[43],3I9Q(23)[43],3I9R(23)[43],3J9M(23)[43],3J9N(23)[43], + 3J9O(23)[43],3J9P(23)[43],3J9Q(23)[43],3J9R(23)[43],3K9M(23)[43],3K9N(23)[43],3K9O(23)[43], + 3K9P(23)[43],3K9Q(23)[43],3K9R(23)[43],3L9M(23)[43],3L9N(23)[43],3L9O(23)[43],3L9P(23)[43], + 3L9Q(23)[43],3L9R(23)[43],3M9M(23)[43],3M9N(23)[43],3M9O(23)[43],3M9P(23)[43],3M9Q(23)[43], + 3M9R(23)[43],3N9M(23)[43],3N9N(23)[43],3N9O(23)[43],3N9P(23)[43],3N9Q(23)[43],3N9R(23)[43], + 3O9M(23)[43],3O9N(23)[43],3O9O(23)[43],3O9P(23)[43],3O9Q(23)[43],3O9R(23)[43],3P9M(23)[43], + 3P9N(23)[43],3P9O(23)[43],3P9P(23)[43],3P9Q(23)[43],3P9R(23)[43],3Q9M(23)[43],3Q9N(23)[43], + 3Q9O(23)[43],3Q9P(23)[43],3Q9Q(23)[43],3Q9R(23)[43],3R9M(23)[43],3R9N(23)[43],3R9O(23)[43], + 3R9P(23)[43],3R9Q(23)[43],3R9R(23)[43],3S9M(23)[43],3S9N(23)[43],3S9O(23)[43],3S9P(23)[43], + 3S9Q(23)[43],3S9R(23)[43],3T9M(23)[43],3T9N(23)[43],3T9O(23)[43],3T9P(23)[43],3T9Q(23)[43], + 3T9R(23)[43],3U9M(23)[43],3U9N(23)[43],3U9O(23)[43],3U9P(23)[43],3U9Q(23)[43],3U9R(23)[43], + B9M(23)[43],B9N(23)[43],B9O(23)[43],B9P(23)[43],B9Q(23)[43],B9R(23)[43],BA9M(23)[43],BA9N(23)[43], + BA9O(23)[43],BA9P(23)[43],BA9Q(23)[43],BA9R(23)[43],BD9M(23)[43],BD9N(23)[43],BD9O(23)[43], + BD9P(23)[43],BD9Q(23)[43],BD9R(23)[43],BG9M(23)[43],BG9N(23)[43],BG9O(23)[43],BG9P(23)[43], + BG9Q(23)[43],BG9R(23)[43],BH9M(23)[43],BH9N(23)[43],BH9O(23)[43],BH9P(23)[43],BH9Q(23)[43], + BH9R(23)[43],BI9M(23)[43],BI9N(23)[43],BI9O(23)[43],BI9P(23)[43],BI9Q(23)[43],BI9R(23)[43], + BJ9M(23)[43],BJ9N(23)[43],BJ9O(23)[43],BJ9P(23)[43],BJ9Q(23)[43],BJ9R(23)[43],BL9M(23)[43], + BL9N(23)[43],BL9O(23)[43],BL9P(23)[43],BL9Q(23)[43],BL9R(23)[43],BT9M(23)[43],BT9N(23)[43], + BT9O(23)[43],BT9P(23)[43],BT9Q(23)[43],BT9R(23)[43],BY9M(23)[43],BY9N(23)[43],BY9O(23)[43], + BY9P(23)[43],BY9Q(23)[43],BY9R(23)[43],BZ9M(23)[43],BZ9N(23)[43],BZ9O(23)[43],BZ9P(23)[43], + BZ9Q(23)[43],BZ9R(23)[43],XS9M(23)[43],XS9N(23)[43],XS9O(23)[43],XS9P(23)[43],XS9Q(23)[43], + XS9R(23)[43],=BD4HF/9(23)[43],=BD5HSV/9(23)[43]; +YinChuan NingXia China: 23: 43: AS: 38.47: -106.27: -8.0: BY: + =BG9NJY; +QingHai China: 23: 43: AS: 36.56: -101.74: -8.0: BY: + BA9S,BA9T,BA9U,BA9V,BA9W,BA9X,BD9S,BD9T,BD9U,BD9V,BD9W,BD9X,BG9S,BG9T,BG9U,BG9V,BG9W,BG9X, + BH9S,BH9T,BH9U,BH9V,BH9W,BH9X,BI9S,BI9T,BI9U,BI9V,BI9W,BI9X,BY9S,BY9T,BY9U,BY9V,BY9W,BY9X, + B9S,B9T,B9U,B9V,B9W,B9X, + 3H9S(23)[42],3H9T(23)[42],3H9U(23)[42],3H9V(23)[42],3H9W(23)[42],3H9X(23)[42],3I9S(23)[42], + 3I9T(23)[42],3I9U(23)[42],3I9V(23)[42],3I9W(23)[42],3I9X(23)[42],3J9S(23)[42],3J9T(23)[42], + 3J9U(23)[42],3J9V(23)[42],3J9W(23)[42],3J9X(23)[42],3K9S(23)[42],3K9T(23)[42],3K9U(23)[42], + 3K9V(23)[42],3K9W(23)[42],3K9X(23)[42],3L9S(23)[42],3L9T(23)[42],3L9U(23)[42],3L9V(23)[42], + 3L9W(23)[42],3L9X(23)[42],3M9S(23)[42],3M9T(23)[42],3M9U(23)[42],3M9V(23)[42],3M9W(23)[42], + 3M9X(23)[42],3N9S(23)[42],3N9T(23)[42],3N9U(23)[42],3N9V(23)[42],3N9W(23)[42],3N9X(23)[42], + 3O9S(23)[42],3O9T(23)[42],3O9U(23)[42],3O9V(23)[42],3O9W(23)[42],3O9X(23)[42],3P9S(23)[42], + 3P9T(23)[42],3P9U(23)[42],3P9V(23)[42],3P9W(23)[42],3P9X(23)[42],3Q9S(23)[42],3Q9T(23)[42], + 3Q9U(23)[42],3Q9V(23)[42],3Q9W(23)[42],3Q9X(23)[42],3R9S(23)[42],3R9T(23)[42],3R9U(23)[42], + 3R9V(23)[42],3R9W(23)[42],3R9X(23)[42],3S9S(23)[42],3S9T(23)[42],3S9U(23)[42],3S9V(23)[42], + 3S9W(23)[42],3S9X(23)[42],3T9S(23)[42],3T9T(23)[42],3T9U(23)[42],3T9V(23)[42],3T9W(23)[42], + 3T9X(23)[42],3U9S(23)[42],3U9T(23)[42],3U9U(23)[42],3U9V(23)[42],3U9W(23)[42],3U9X(23)[42], + B9S(23)[42],B9T(23)[42],B9U(23)[42],B9V(23)[42],B9W(23)[42],B9X(23)[42],BA9S(23)[42],BA9T(23)[42], + BA9U(23)[42],BA9V(23)[42],BA9W(23)[42],BA9X(23)[42],BD9S(23)[42],BD9T(23)[42],BD9U(23)[42], + BD9V(23)[42],BD9W(23)[42],BD9X(23)[42],BG9S(23)[42],BG9T(23)[42],BG9U(23)[42],BG9V(23)[42], + BG9W(23)[42],BG9X(23)[42],BH9S(23)[42],BH9T(23)[42],BH9U(23)[42],BH9V(23)[42],BH9W(23)[42], + BH9X(23)[42],BI9S(23)[42],BI9T(23)[42],BI9U(23)[42],BI9V(23)[42],BI9W(23)[42],BI9X(23)[42], + BJ9S(23)[42],BJ9T(23)[42],BJ9U(23)[42],BJ9V(23)[42],BJ9W(23)[42],BJ9X(23)[42],BL9S(23)[42], + BL9T(23)[42],BL9U(23)[42],BL9V(23)[42],BL9W(23)[42],BL9X(23)[42],BT9S(23)[42],BT9T(23)[42], + BT9U(23)[42],BT9V(23)[42],BT9W(23)[42],BT9X(23)[42],BY9S(23)[42],BY9T(23)[42],BY9U(23)[42], + BY9V(23)[42],BY9W(23)[42],BY9X(23)[42],BZ9S(23)[42],BZ9T(23)[42],BZ9U(23)[42],BZ9V(23)[42], + BZ9W(23)[42],BZ9X(23)[42],XS9S(23)[42],XS9T(23)[42],XS9U(23)[42],XS9V(23)[42],XS9W(23)[42], + XS9X(23)[42],=BA7JS/9(23)[42],=BD5QDM/9(23)[42]; +China: 24: 44: AS: 36.00: -102.00: -8.0: BY: + B0,B1,B2,B3,B4,B5,B6,B7,B8,B9,BB,BC,BE,BF,BJ,BK,BL,BR; +Nauru: 31: 65: OC: -0.52: -166.92: -12.0: C2: + C2; +Andorra: 14: 27: EU: 42.58: -1.62: -1.0: C3: + C3; +The Gambia: 35: 46: AF: 13.40: 16.38: 0.0: C5: + C5,=C56W/BI; +Bahamas: 08: 11: NA: 24.25: 76.00: 5.0: C6: + C6,=WK2G/C6A/LH; +Mozambique: 37: 53: AF: -18.25: -35.00: -2.0: C9: + C8,C9,=C98DC/YL; +Chile: 12: 14: SA: -30.00: 71.00: 4.0: CE: + 3G,CA,CB,CC,CD,CE,XQ,XR,=CE9/PA3EXX,=CE9/PA3EXX/P,=CE9/VE3LYC,=CE9/VE3LYC/P,=CE9/WW3TRG,=XR90IARU, + =XR96IARU, + =CD0YJA/3,=CE0YHF/3, + =CD0YJA/4, + =CE6PGO[16],=CE6RFP[16],=XQ6CFX[16],=XQ6OA[16],=XQ6UMR[16],=XR6F[16], + 3G7[16],CA7[16],CB7[16],CC7[16],CD7[16],CE7[16],XQ7[16],XR7[16],=XR7FTC/LH[16], + 3G8[16],CA8[16],CB8[16],CC8[16],CD8[16],CE8[16],XQ8[16],XR8[16],=CE9/UA4WHX[16],=XR9A/8[16]; +San Felix & San Ambrosio: 12: 14: SA: -26.28: 80.07: 4.0: CE0X: + 3G0X,CA0X,CB0X,CC0X,CD0X,CE0X,XQ0X,XR0X,=XR0ZY; +Easter Island: 12: 63: SA: -27.10: 109.37: 6.0: CE0Y: + 3G0,CA0,CB0,CC0,CD0,CE0,XQ0,XR0; +Juan Fernandez Islands: 12: 14: SA: -33.60: 78.85: 4.0: CE0Z: + 3G0Z,CA0Z,CB0Z,CC0Z,CD0Z,CE0I,CE0Z,XQ0Z,XR0Z; +Antarctica: 13: 74: SA: -90.00: 0.00: 0.0: CE9: + =IA0DC,=KC4/W3ASA,=KC4/W3WKO,=KC4/W3WKP,=VP8DFK,=W3ASA/KC4,=W3WKO/KC4,=W3WKP/KC4, + AY1Z[73],AY2Z[73],AY3Z[73],AY4Z[73],AY5Z[73],AY6Z[73],AY7Z[73],AY8Z[73],AY9Z[73],LU1Z[73], + LU2Z[73],LU3Z[73],LU4Z[73],LU5Z[73],LU6Z[73],LU7Z[73],LU8Z[73],LU9Z[73], + =LU3HRS/Z[73], + =LU6ECW/Z[73], + =LU/FT5YK[73],=LU/G0HFX/Z[73], + =LU8DBS/Z[73], + =VI0ANZAC(29)[70],=VK0BFG(29)[70], + AX0(39)[69],VI0(39)[69],VK0(39)[69], + =OP0LE(38)[67], + =CE9VPM[73], + =OR3AX(30)[71],=OR4AX(30)[71], + FT0Y(30)[70],FT1Y(30)[70],FT2Y(30)[70],FT3Y(30)[70],FT4Y(30)[70],FT5Y(30)[70],FT6Y(30)[70], + FT7Y(30)[70],FT8Y(30)[70], + =VP8DLM[73], + =VP8AL[73], + =FT5YK/KC4[73],=KC4/FT5YK[73], + =VP8/UT1KY[73],=VP8CTR[73], + =VP8DJB/P[73], + =VP8/G0VZM/P[73],=VP8/MM0TJR/P[73],=VP8BF[73],=VP8DJB[73],=VP8DOU[73],=VP8DPE[73],=VP8ROT[73], + =VP8ADE[73],=VP8ADE/B[73],=VP8DLJ[73],=VP8DPJ[73], + =VP8CPG[73], + =AT10BP(38)[67],=R1AND/A(38)[67],=VU/R1AND(38)[67],=VU2JBK/AT10(38)[67], + =I0HCJ/KC4(30)[71],=I0QHM/IA0PS(30)[71],=I0QHM/KC4(30)[71],=IA0/IZ1KHY(30)[71],=IA0MZ(30)[71], + =IA0PS(30)[71],=II0AMZS(30)[71],=II0MZ(30)[71],=IK7JGQ/KC4(30)[71],=IR0PS(30)[71], + =KC4/I0HCJ(30)[71],=KC4/I0QHM(30)[71],=KC4/IK7JGQ(30)[71], + =8J1RL(39)[67],=8J60JARE(39)[67],=JG2MLI/ANT(39)[67],=JH1TOF/ANT(39)[67], + =8J1RF(39)[67],=8J1RF/M(39)[67], + 3Y[73], + =7S8AAA(38)[67], + ZL5(30)[71],ZM5(30)[71], + =R1ANJ(39)[69], + =R1ANL(30)[70], + RI1AN(29)[69],=R1ANB(29)[69],=R1ANT(29)[69],=R7C/ANT(29)[69], + =R1ANA(39)[69],=RI1ANA(39)[69], + =KC4/N2TA(38)[67],=R1/AT10BP(38)[67],=R1AND(38)[67],=R1AND/AT10BP(38)[67],=R1ANN(38)[67], + =RI1AND(38)[67],=RI1ANL(38)[67],=RI1ANW(38)[67], + =R1ANP(39)[69],=RI01ANT(39)[69],=RI1ANC/A(39)[69],=RI1ANN(39)[69],=RI1ANP(39)[69],=RI1ANZ(39)[69], + =RI63ANT(39)[69],=VU3BPZ/RI1(39)[69], + =R1ANH(32)[72], + =RI1ANC(29)[70],=RI1ANC/P(29)[70],=RI1ANV(29)[70], + =SM/OH2FFP(38)[67], + =EM1HO[73],=EM1KCC[73],=EM1KGG[73],=EM1KY[73],=EM1U[73],=EM1U/P[73],=EM1UA[73],=EM1UC[73], + =KC4/VE0HSS(32),=VE0HSS/KC4(32), + =KC4USB(12), + =KC4/R3CA(30),=KC4/R7C(30),=KC4AAA(39),=KC4AAA/NH6ON(30),=R1ANM(30),=R3CA/KC4(30),=R7C/KC4(30), + =AB0KG/KC4(30)[71],=KC4/AB0KG(30)[71],=KC4/KC5AEX(30)[71],=KC4/KE6ZYK(30)[71],=KC4/KK6KO(30)[71], + =KC4/N0NHP(30)[71],=KC4/N3SIG(30)[71],=KC4/NK3T(30)[71],=KC4/RW1AI(30)[71],=KC4/UA1PAC(30)[71], + =KC4/W1MRQ(30)[71],=KC4/W4OEP(30)[71],=KC4/WA1O(30)[71],=KC4USA(30)[71],=KC4USC(30)[71], + =KC4USM(30)[71],=KC4USV(30)[71],=KC5AEX/KC4(30)[71],=KE6ZYK/KC4(30)[71],=KK6KO/KC4(30)[71], + =N0NHP/KC4(30)[71],=N3SIG/KC4(30)[71],=NK3T/KC4(30)[71],=W1MRQ/KC4(30)[71],=W4OEP/KC4(30)[71], + =WA1O/KC4(30)[71], + =KC4/KD4VMM[73],=KD4VMM/KC4[73], + ZS7(38)[67],=ZS6KX/7(38)[67], + =KC4/KL7RL(12)[72],=KL7RL/KC4(12)[72], + =9V0A(12),=CE9/R3CA(12),=CE9/R3RRC(12),=CE9/R7C(12),=KC4/K2ARB(12),=OP0OL(12),=R3RRC/ANT(12), + =VP8DKF(12), + =IA/IZ2QEJ(29)[70],=IA/IZ3SUS(29)[70],=IA0/DK5SQX(29)[70],=IA0/DK5SXQ(29)[70], + =IA0/IZ1KHY/P(29)[70],=KC4/IK0AIH/P(29)[70], + =3Y8XSA(38)[67],=3Y9SDA(38)[67],=R1ANR/A(38)[67], + =OJ1ABOA(38)[67], + =HL1TJF/KC4(12),=HL1TR/KC4(12),=KC4/HL1TJF(12),=KC4/HL1TR(12), + =KC4/WB9YSD(12)[72],=WB9YSD/KC4(12)[72], + =R1ANP/A(39)[69], + =LU/FT5YJ[73], + =OR4TN(38)[67], + =CE9/K2ARB(12), + =DH1HB/P(38)[67],=DP0/OJ1ABOA(38)[67],=DP0GVN(38)[67],=DP1POL(38)[67], + =FT5YJ/P[73], + =R1ANR(38)[67],=RI1ANR(38)[67], + =OH2FFP/P(38)[67], + =KC4AAC[73], + =KC4/WA2DKJ(30),=WA2DKJ/KC4(30), + =8T2BH(39)[69],=VU3BPZ/P(39)[69],=VU3LBP(39)[69],=VU3LBP/P(39)[69], + =VP8/SQ1SGB[73],=VP8DMH[73],=VP8DMH/P[73],=VP8DOI[73],=VP8HAL[73], + =D8A(30)[71], + =DP1POL/P(38)[67], + =KC4/K6REF(32)[71], + =DP0GVN/P(38)[67], + =FT5YK/P[73], + =RI1ANX(38)[67]; +Cuba: 08: 11: NA: 21.50: 80.00: 5.0: CM: + CL,CM,CO,T4, + =T40C/LT, + =CO2FRC/LH, + =CO6RD/LH; +Morocco: 33: 37: AF: 32.00: 5.00: 0.0: CN: + 5C,5D,5E,5F,5G,CN; +Bolivia: 10: 12: SA: -17.00: 65.00: 4.0: CP: + CP, + CP2[14], + CP3[14], + CP4[14], + CP5[14], + CP6[14], + CP7[14]; +Portugal: 14: 37: EU: 39.50: 8.00: 0.0: CT: + CQ,CR,CS,CT,=CR5FB/LH,=CR6L/LT,=CR6YLH/LT,=CS2HNI/LH,=CS5ARAM/LH,=CS5E/LH,=CT/DJ5AA/LH,=CT1BWW/LH, + =CT1GFK/LH,=CT1GPQ/LGT,=CT7/ON4LO/LH,=CT7/ON7RU/LH; +Madeira Islands: 33: 36: AF: 32.75: 16.95: 0.0: CT3: + CQ2,CQ3,CQ9,CR3,CR9,CS3,CS9,CT3,CT9,=CT9500AEP/J; +Azores: 14: 36: EU: 38.70: 27.23: 1.0: CU: + CQ1,CQ8,CR1,CR2,CR8,CS4,CS8,CT8,CU, + =CQ8ARN/LH,=CU2JU/ND, + =CU5/CU3EJ/LH, + =CT8/DK6EA/LH; +Uruguay: 13: 14: SA: -33.00: 56.00: 3.0: CX: + CV,CW,CX,=CW5X/LH, + =CV1AA/LH, + =CX1CAK/D,=CX1SI/D,=CX2ABP/D, + =CX7OV/H, + =CV9T/LH,=CX1TA/LH,=CX1TCR/LH, + =CX5TR/U, + =CX6DRA/V; +Sable Island: 05: 09: NA: 43.93: 59.90: 4.0: CY0: + CY0; +St. Paul Island: 05: 09: NA: 47.00: 60.00: 4.0: CY9: + CY9; +Angola: 36: 52: AF: -12.50: -18.50: -1.0: D2: + D2,D3; +Cape Verde: 35: 46: AF: 16.00: 24.00: 1.0: D4: + D4; +Comoros: 39: 53: AF: -11.63: -43.30: -3.0: D6: + D6; +Fed. Rep. of Germany: 14: 28: EU: 51.00: -10.00: -1.0: DL: + DA,DB,DC,DD,DE,DF,DG,DH,DI,DJ,DK,DL,DM,DN,DO,DP,DQ,DR,Y2,Y3,Y4,Y5,Y6,Y7,Y8,Y9,=DA0BHV/LGT, + =DA0BHV/LH,=DA0BLH/LGT,=DA0DAG/LH,=DA0DFF/LH,=DA0FO/LH,=DA0LCC/LH,=DA0LGV/LH,=DA0LHT/LH, + =DA0OIE/LGT,=DA0QS/LGT,=DA0QS/LH,=DA0WLH/LH,=DB2BJT/LH,=DC1HPS/LH,=DD3D/LH,=DF0AWG/LH,=DF0BU/LH, + =DF0CHE/LH,=DF0ELM/LH,=DF0HC/LH,=DF0IF/LGT,=DF0IF/LH,=DF0LR/LH,=DF0MF/LGT,=DF0MF/LH,=DF0MF/LS, + =DF0SX/LH,=DF0VK/LH,=DF0WAT/LH,=DF0WFB/LH,=DF0WH/LGT,=DF0WLG/LH,=DF1AG/LH,=DF1HF/LH,=DF2BR/LH, + =DF3LY/L,=DF5A/LH,=DF5FO/LH,=DF8AN/LGT,=DF8AN/LH,=DF8AN/P/LH,=DF9HG/LH,=DG0GF/LH,=DG1EHM/LH, + =DG3XA/LH,=DH0IPA/LH,=DH1DH/LH,=DH1DH/M/LH,=DH6RS/LH,=DH7RK/LH,=DH9JK/LH,=DH9UW/YL,=DJ0PJ/LH, + =DJ2OC/LH,=DJ3XG/LH,=DJ5AA/LH,=DJ7AO/LH,=DJ7MH/LH,=DJ8RH/LH,=DJ9QE/LH,=DK0DAN/LH,=DK0FC/LGT, + =DK0FC/LH,=DK0GYB/LH,=DK0IZ/LH,=DK0KTL/LH,=DK0LWL/LH,=DK0OC/LH,=DK0PRE/LH,=DK0RA/LH,=DK0RBY/LH, + =DK0RU/LH,=DK0RZ/LH,=DK3DUA/LH,=DK3R/LH,=DK4DS/LH,=DK4MT/LT,=DK5AN/P/LH,=DK5T/LH,=DK5T/LS, + =DL/HB9DQJ/LH,=DL0AWG/LH,=DL0BLA/LH,=DL0BPS/LH,=DL0BUX/LGT,=DL0BUX/LH,=DL0CA/LH,=DL0CUX/LGT, + =DL0CUX/LV,=DL0DAB/LH,=DL0EJ/LH,=DL0EL/LH,=DL0EM/LGT,=DL0EM/LH,=DL0EO/LGT,=DL0EO/LH,=DL0FFF/LGT, + =DL0FFF/LH,=DL0FFF/LS,=DL0FHD/LH,=DL0FL/FF,=DL0HDF/LH,=DL0HGW/LGT,=DL0HGW/LH,=DL0HST/LH,=DL0II/LH, + =DL0IOO/LH,=DL0IPA/LH,=DL0LGT/LH,=DL0LNW/LH,=DL0MCM/LH,=DL0MFH/LGT,=DL0MFH/LH,=DL0MFK/LGT, + =DL0MFK/LH,=DL0MFN/LH,=DL0MHR/LH,=DL0NH/LH,=DL0OF/LH,=DL0PAS/LH,=DL0PBS/LH,=DL0PJ/LH,=DL0RSH/LH, + =DL0RUG/LGT,=DL0RUG/LH,=DL0RWE/LH,=DL0SH/LH,=DL0SY/LH,=DL0TO/LH,=DL0UEM/LH,=DL0VV/LH,=DL0YLM/LH, + =DL1BSN/LH,=DL1DUT/LH,=DL1ELU/LH,=DL1HZM/YL,=DL1SKK/LH,=DL2FCA/YL,=DL2RPS/LH,=DL3ANK/LH,=DL3JJ/LH, + =DL3KWR/YL,=DL3KZA/LH,=DL3RNZ/LH,=DL4ABB/LH,=DL5CX/LH,=DL5KUA/LH,=DL5SE/LH,=DL65DARC/LH, + =DL6ABN/LH,=DL6AP/LH,=DL6KWN/LH,=DL7ANC/LH,=DL7BMG/LH,=DL7MFK/LH,=DL7NF/LH,=DL7UVO/LH,=DL7VDX/LH, + =DL8HK/YL,=DL8MTG/LH,=DL8TG/LH,=DL8TG/LV,=DL8UAA/FF,=DL9CU/LH,=DL9NEI/ND2N,=DL9OE/LH,=DL9SEP/P/LH, + =DM19ERZ/BB,=DM19ERZ/BEF,=DM19ERZ/BHF,=DM19ERZ/BL,=DM19ERZ/BP,=DM19ERZ/BRB,=DM19ERZ/BS, + =DM19ERZ/BU,=DM19ERZ/HAM,=DM19ERZ/HSD,=DM19ERZ/MAF,=DM19ERZ/MAZ,=DM19ERZ/MF,=DM19ERZ/MS, + =DM19ERZ/SG,=DM19ERZ/VL,=DM2C/LH,=DM3B/LH,=DM3G/LH,=DM3KF/LH,=DM5C/LH,=DM5JBN/LH,=DN0AWG/LH, + =DN4MB/LH,=DN8RLS/YL,=DO1EEW/YL,=DO1OMA/LH,=DO2IK/LH,=DO5MCL/LH,=DO5MCL/YL,=DO6KDS/LH,=DO6UVM/LH, + =DO7DC/LH,=DO7RKL/LH,=DQ4M/LH,=DQ4M/LT,=DR100MF/LS,=DR3M/LH,=DR4W/FF,=DR4X/LH,=DR9Z/LH; +Philippines: 27: 50: OC: 13.00: -122.00: -8.0: DU: + 4D,4E,4F,4G,4H,4I,DU,DV,DW,DX,DY,DZ; +Eritrea: 37: 48: AF: 15.00: -39.00: -3.0: E3: + E3; +Palestine: 20: 39: AS: 31.28: -34.27: -2.0: E4: + E4; +North Cook Islands: 32: 62: OC: -10.02: 161.08: 10.0: E5/n: + =E51LYC,=E51QMA,=E51TUG, + =E51AMF,=E51M,=E51MAN,=E51MBX,=E51MKW,=E51MQT,=E51PT,=E51QQQ,=E51UFF,=E51WWB,=ZK1HCC,=ZK1MA, + =ZK1NCF,=ZK1NCI,=ZK1TTG, + =E50W[63],=E51PDX[63],=E51PEN[63],=E51WL[63],=ZK1/AC4LN/N[63],=ZK1KDN[63],=ZK1NCP[63],=ZK1NDK[63], + =ZK1NJC[63],=ZK1QMA[63],=ZK1TUG[63],=ZK1WL[63]; +South Cook Islands: 32: 63: OC: -21.90: 157.93: 10.0: E5/s: + E5,=ZK1/AC4LN,=ZK1AKF,=ZK1AKX,=ZK1APM,=ZK1ASQ,=ZK1AXU,=ZK1BS,=ZK1CG,=ZK1EAA,=ZK1ETW,=ZK1JD/J, + =ZK1KH,=ZK1NDS,=ZK1NFK,=ZK1SCQ,=ZK1SDE,=ZK1SSB,=ZK1USA,=ZK1VVV,=ZK1XXC; +Niue: 32: 62: OC: -19.03: 169.85: 11.0: E6: + E6; +Bosnia-Herzegovina: 15: 28: EU: 44.32: -17.57: -1.0: E7: + E7,=YU4WU; +Spain: 14: 37: EU: 40.32: 3.43: -1.0: EA: + AM,AN,AO,EA,EB,EC,ED,EE,EF,EG,EH,=AM95WARD,=AN92EXPO,=EF6,=EG90IARU, + =AM1TDH/LH,=EA1APV/LH,=EA1BEY/Y,=EA1EEY/L,=EA1EEY/LGT,=EA1EEY/LH,=EA1EK/ZAP,=EA1FGS/LH,=EA1HLW/YL, + =EA1RCG/CPV,=EA1RCG/SEU,=EA1RCG/YOA,=EA1RCI/CA,=EA1RCI/CR,=EA1RCI/CVG,=EA1RCI/DAC,=EA1RCI/ESM, + =EA1RCI/IA,=EA1RCI/ICA,=EA1RCI/JBN,=EA1RCI/KD,=EA1RCI/PAZ,=EA1RCI/PCV,=EA1RCI/RCC,=EA1RCI/RSM, + =EA1RCI/YOA,=EA1RCP/NM,=EA1URL/CVL,=EA1URO/D,=EA1URO/KD,=EA5AER/P,=EA6QB/1,=EA8BFH/1,=EA8CZT/1, + =EA8FC/1,=EA8RV/P,=EA9CD/1,=EA9CI/1,=EA9CP/1,=EA9PD/1,=EB1DH/LH,=ED1IRM/LH,=EG1ILW/LH,=EG1LWB/LH, + =EG1LWC/LH,=EG1LWI/LH,=EG1LWN/LH,=EG1TDH/LH,=EG90IARU/1, + =AM08ATU/H,=AM08CAZ/H,=AM08CYQ/H,=AM08EIE/Z,=AM08FAC/H,=AN08ADE/H,=AO08BQH/Z,=AO08BTM/Z, + =AO08CIK/H,=AO08CVV/Z,=AO08CXK/H,=AO08CYL/H,=AO08DI/Z,=AO08EIE/Z,=AO08HV/Z,=AO08ICA/Z,=AO08ID/Z, + =AO08KJ/Z,=AO08KV/Z,=AO08OK/H,=AO08PB/Z,=AO08RKO/H,=AO08VK/Z,=AO2016DSS/LH,=EA2/ON7RU/LH, + =EA2AU/URE,=EA2CRX/LH,=EA2EZ/P,=EA2KU/EKA,=EA2SPS/LH,=EA2URI/O,=EA6LU/P,=EA6SK/2,=EA9CP/2, + =EG90IARU/2, + =EA3ESZ/Z,=EA3EVR/R,=EA3HSD/P,=EA3LD/D,=EA3RCV/PAZ,=EA5URE/P,=EA6LU/3,=EA8TL/3,=EA9CI/3,=EA9CP/3, + =EG90IARU/3, + =EA4AAQ/O,=EA4RCH/CIE,=EA6AFU/4,=EA6RC/4,=EA8BFH/4,=EA8BY/4,=EA9CI/4,=EA9CP/4,=EG8AOP/4, + =EG90IARU/4, + =EA5/ON4LO/LH,=EA5ADM/P,=EA5CC/P,=EA5EQ/N,=EA5FL/LH,=EA5GVT/AVW,=EA5HCC/P,=EA5IKT/P,=EA5KB/LH, + =EA5ND/D,=EA5RCK/CDI,=EA5RKD/PAZ,=EA5TOM/AVW,=EA5URE/IVA,=EA5URM/C,=EA5URM/F,=EA5URM/G,=EA5URM/H, + =EA5URM/I,=EA5URM/L,=EA5URR/PAZ,=EA5URV/CAC,=EA5ZD/URE,=EA6AKN/5,=EA8BFH/5,=EA8CWF/5,=EA9BLJ/5, + =EA9CI/5,=EA9CP/5,=EA9PD/5,=EC5EA/VIC,=EC5K/VIC,=ED5MFP/C,=ED5MFP/G,=ED5MFP/H,=ED5MFP/I,=ED5MFP/K, + =ED5MFP/Q,=ED5MFP/R,=ED5MFP/S,=ED5URD/LH,=EG5FOM/LH,=EG90IARU/5,=EH5FL/LH, + =AO7WRD/MA,=EA6SK/7,=EA7CFU/U,=EA7FC/FCJ,=EA7HZ/F,=EA7OBH/LH,=EA7URA/GET,=EA7URA/PAZ,=EA7URA/SG, + =EA7URA/YOTA,=EA7URE/PAZ,=EA7URF/PAZ,=EA7URI/MDL,=EA7URJ/CPM,=EA7URL/FSV,=EA7URM/PAZ,=EA7URP/LAI, + =EA9AA/7,=EA9CP/7,=EA9FN/7,=EA9HU,=EA9HU/7,=EA9JS/7,=EA9LZ/7,=EA9PD/7,=EA9QD/7,=EA9UL/7,=EA9UV/7, + =EB9PH/7,=EC7DZZ/LH,=EG90IARU/7; +Balearic Islands: 14: 37: EU: 39.60: -2.95: -1.0: EA6: + AM6,AN6,AO6,EA6,EB6,EC6,ED6,EE6,EF6,EG6,EH6,=AM70URE/6,=EA1QE/6,=EA1YO/6,=EA2EZ/6,=EA2SG/6, + =EA2TW/6,=EA3BT/6,=EA3CBH/6,=EA3ERT/6,=EA3HSD/6,=EA3HUX/6,=EA3HZX/6,=EA3HZX/P,=EA3RKM/6,=EA4LO/6, + =EA5ADM/6,=EA5BB/6,=EA5BK/6,=EA5BTL/6,=EA5EOR/6,=EA5ER/6,=EA5EZ,=EA5EZ/6,=EA5EZ/P,=EA5FL/P, + =EA5HCC/6,=EA5IIG/6,=EA5IKT/6,=EA5RKB/6,=EA6/DJ5AA/LH,=EA6/DJ7AO/LH,=EA6/G0SGB/LH,=EA6HP/J, + =EA6URI/PAZ,=EA6URL/IF,=EA7DUT/6,=EA9CI/6,=EA9CP/6,=EB1BRH/6,=EB2GKK/6,=EB3CW/6,=EC5AC/6, + =EC5BME/6,=EC5EA/P,=EC5EC/6,=EC6TV/N,=EC7AT/6,=ED3T/6,=ED4SHF/6,=ED5ON/6,=EH90IARU/6; +Canary Islands: 33: 36: AF: 28.32: 15.85: 0.0: EA8: + AM8,AN8,AO8,EA8,EB8,EC8,ED8,EE8,EF8,EG8,EH8,=AM70URE/8,=AN400L,=AN400U,=AO150ITU/8,=AO150U, + =AO4AAA/8,=AO5DXX/8,=EA1AK/8,=EA1AP/8,=EA1EHW/8,=EA1YO/8,=EA2EJO/8,=EA3RKB/8,=EA4BQ/8,=EA4ESI/8, + =EA4SV/8,=EA4WT/8,=EA4ZK/8,=EA5BK/8,=EA5HCC/8,=EA5RKL/8,=EA7JR/8,=EA8/DJ5AA/LH,=EA8AKG/F, + =EA8AKG/G,=EA8DO/LP,=EA8EE/L,=EA8TH/LP,=EA8URE/YOTA,=EA8URL/LH,=EA8URL/P/SBI,=EA9CI/8,=EA9CP/8, + =EB2EMH/8,=EC1KR/8,=EC8AFM/LH,=ED4R/8,=ED5RKL/8,=ED8BTM/C,=ED8BTM/E,=ED8BTM/J,=ED8BTM/L,=ED8BTM/S, + =ED8GSA/J,=ED8LIB/C,=ED8LIB/D,=ED8LIB/E,=ED8LIB/F,=ED8LIB/G,=ED8LIB/H,=ED8LIB/I,=ED8LIB/J, + =ED8LIB/K,=ED8LIB/N,=ED8LIB/O,=ED8LIB/Q,=ED8LPA/L,=ED8MCC/LH,=ED8OTA/D,=ED8OTA/H,=ED8PDC/E, + =ED8PDC/K,=ED8PDC/LP,=ED8PDC/O,=EF8LIB/N,=EG8LIB/C,=EG8LIB/D,=EG8LIB/E,=EG8LIB/F,=EG8LIB/G, + =EG8LIB/H,=EG8LIB/I,=EG8LIB/L,=EG8LIB/M,=EG8LIB/N,=EG8LIB/O,=EG8LIB/P,=EG8LIB/Q,=EG8LP/YL, + =EH8FLH/LH,=EH90IARU/8, + =EA2TW/8,=EA3FNZ/8,=EA5EZ/8, + =AO3MWC/8,=EA2SG/8,=EA4BFH/8,=EA4DE/8,=EA5RKB/8,=EA8BFH/P,=EA8VK/URE; +Ceuta & Melilla: 33: 37: AF: 35.90: 5.27: -1.0: EA9: + AM9,AN9,AO9,EA9,EB9,EC9,ED9,EE9,EF9,EG9,EH9,=AM70URE/9,=EA1DFP/9,=EA4URE/9,=EA7URM/9,=EA9CE/C, + =EA9CE/D,=EA9CE/E,=EA9CE/F,=EA9CE/G,=EA9CE/H,=EA9CE/I,=EA9URC/PAZ,=EC7DZZ/9,=ED3AFR/9,=ED9CE/D, + =ED9CE/E,=ED9CE/F, + =EA3EGB/9,=EA5RKB/9,=EA7UV/P,=EA9CD/M,=EA9CD/P,=EB9PH/P,=EC5ALJ/9, + =EA5DCL/9,=EA7JTF/9,=EA9PD/M,=EA9PD/P,=EC7DRS/9; +Ireland: 14: 27: EU: 53.13: 8.02: 0.0: EI: + EI,EJ,=EI0CAR/LH,=EI0CPL/LH,=EI0LHL/LH,=EI0M/LH,=EI1K/LH,=EI1KARG/LH,=EI1NC/LH,=EI4LRC/LH, + =EI5ML/LH; +Armenia: 21: 29: AS: 40.40: -44.90: -4.0: EK: + EK; +Liberia: 35: 46: AF: 6.50: 9.50: 0.0: EL: + 5L,5M,6Z,A8,D5,EL; +Iran: 21: 40: AS: 32.00: -53.00: -3.5: EP: + 9B,9C,9D,EP,EQ; +Moldova: 16: 29: EU: 47.00: -29.00: -2.0: ER: + ER,=ER3AC/FF,=ER3CR/FF,=ER4LX/FF; +Estonia: 15: 29: EU: 59.00: -25.00: -2.0: ES: + ES,=ES/SA5FYR/LH, + =ES/RX3AMI/LH,=ES0TI/LH; +Ethiopia: 37: 48: AF: 9.00: -39.00: -3.0: ET: + 9E,9F,ET,=ET3AA/YOTA; +Belarus: 16: 29: EU: 54.00: -28.00: -2.0: EU: + EU,EV,EW; +Kyrgyzstan: 17: 30: AS: 41.70: -74.13: -6.0: EX: + EX,=EX/RU3TT/FF, + EX0P[31],EX2P[31],EX6P[31],EX7P[31],EX8P[31], + EX0Q[31],EX2Q[31],EX6Q[31],EX7Q[31],EX8Q[31]; +Tajikistan: 17: 30: AS: 38.82: -71.22: -5.0: EY: + EY,=U8JB; +Turkmenistan: 17: 30: AS: 38.00: -58.00: -5.0: EZ: + EZ; +France: 14: 27: EU: 46.00: -2.00: -1.0: F: + F,HW,HX,HY,TH,TM,TP,TQ,TV,=4U60UO,=F/DL5SE/LH,=F/G0SGB/LH,=F/IK3MZS/LH,=F/ON4LO/LH,=F/ON7RU/LH, + =F/PH2CV/LH,=F4FET/LH,=F5HPY/LH,=F5NBX/LH,=F5NMK/LH,=F6/4Z5KJ/LH,=F6DXB/YL,=F6HDH/LH,=F6IFC/LH, + =F6KBG/MSW,=F6KMB/LH,=F6KMB/P/LH,=F6KUM/LH,=TM0BSM/LH,=TM0PDC/LH,=TM0PDH/LH,=TM5AF/LH; +Guadeloupe: 08: 11: NA: 16.13: 61.67: 4.0: FG: + FG,=TO0MT,=TO10CWO,=TO10RR,=TO11A,=TO11A/P,=TO1T,=TO1USB,=TO22C,=TO2ANT,=TO2E,=TO2FG,=TO2FG/P, + =TO2HI,=TO2O,=TO2OOO,=TO2T,=TO3Z,=TO40R,=TO4D,=TO4R,=TO4T,=TO5BG,=TO5GI,=TO5ROM,=TO5S,=TO66R, + =TO6A,=TO6D,=TO6T,=TO6T/P,=TO7ACR,=TO7AES,=TO7D,=TO7DSR,=TO7T,=TO8CW,=TO8FTDM,=TO8RR,=TO8S, + =TO8UFT,=TO9RRG,=TO9T; +Mayotte: 39: 53: AF: -12.88: -45.15: -3.0: FH: + FH,=TO0X,=TO2FH,=TO2TT,=TO4M,=TO6OK,=TO7BC,=TO7RJ,=TO8MZ,=TX0P,=TX5M,=TX5NK,=TX7LX; +St. Barthelemy: 08: 11: NA: 17.90: 62.83: 4.0: FJ: + FJ,=TO0Z,=TO2D,=TO2EE,=TO2SP,=TO3A,=TO3J,=TO3X,=TO4K,=TO5DX,=TO5E,=TO5FJ,=TO5RZ,=TO7ZG,=TO8YY; +New Caledonia: 32: 56: OC: -21.50: -165.50: -11.0: FK: + FK,=FK8VHY/P,=T8HRC,=TX1A,=TX1B,=TX1CW,=TX3SAM,=TX4A,=TX5CW,=TX5FS,=TX8A,=TX8B,=TX8C,=TX8CW,=TX8D, + =TX8F,=TX8JOTA,=TX8NC,=TX90IARU; +Chesterfield Islands: 30: 56: OC: -19.87: -158.32: -11.0: FK/c: + =FK8C/AA7JV,=FK8IK/C,=TX0AT,=TX0C,=TX0DX,=TX3A,=TX3X,=TX9; +Martinique: 08: 11: NA: 14.70: 61.03: 4.0: FM: + FM,=TO0O,=TO1BT,=TO1C,=TO1J,=TO1N,=TO1YR,=TO2M,=TO2MB,=TO3F,=TO3FM,=TO3GA,=TO3JA,=TO3M,=TO3T, + =TO3W,=TO40CDXC,=TO4A,=TO4C,=TO4FM,=TO4GU,=TO4IPA,=TO4OC,=TO4YL,=TO5A,=TO5AA,=TO5J,=TO5K,=TO5PX, + =TO5U,=TO5W,=TO5X,=TO5Y,=TO6ABM,=TO6M,=TO7A,=TO7BP,=TO7HAM,=TO7O,=TO7X,=TO8A,=TO8M,=TO8T,=TO8Z, + =TO90IARU,=TO972A,=TO972M,=TO9A,=TO9R; +French Polynesia: 32: 63: OC: -17.65: 149.40: 10.0: FO: + FO,=FO0MIC/MM3,=TX0A,=TX0M,=TX0T,=TX4N,=TX4VK,=TX5J,=TX5TES,=VERSION, + =TX2AH,=TX6T/P, + =TX3T,=TX4FO,=TX4T,=TX5EG,=TX5JF,=TX5X,=TX6A,=TX6T,=TX7EME; +Austral Islands: 32: 63: OC: -23.37: 149.48: 10.0: FO/a: + =FO/AC4LN/A,=FO/DF6IC,=FO/DJ4OI,=FO/DL1AWI,=FO/DL1IAN,=FO/DL3APO,=FO/DL3GA,=FO/DL7FT,=FO/DL9AWI, + =FO/F6CTL,=FO/F8CFU,=FO/G3BJ,=FO/HG9B,=FO/HG9B/P,=FO/IK2GNW,=FO/JA8BMK,=FO/K7AR,=FO/OH6KN, + =FO/ON4AXU/A,=FO/UT6UD,=FO/W7GJ,=FO0CLA/A,=FO0ERI,=FO0FLA,=FO0FRY,=FO0HWU,=FO0MOT/P,=FO0SEV, + =FO0WEG,=FO0WII,=FO5FD,=TX0HF,=TX2A,=TX3D,=TX5BTY,=TX5D,=TX5RV,=TX5SPA,=TX5T,=TX5W,=TX5Z,=TX6G; +Clipperton Island: 07: 10: NA: 10.28: 109.22: 8.0: FO/c: + =FO0/F8UFT,=FO0AAA,=TX5C,=TX5K,=TX5P; +Marquesas Islands: 31: 63: OC: -8.92: 140.07: 9.5: FO/m: + =FO/AC4LN/M,=FO/DJ7RJ,=FO/DL5XU,=FO/F6BCW,=FO/F6BFH/P,=FO/F6COW,=FO/F6EPY,=FO/F6GNZ,=FO/HA9G, + =FO/IZ2ZTQ,=FO/JA0SC,=FO/JI1WTF,=FO/KA7OQQ,=FO/N7WLR,=FO/OH1RX,=FO/ON4AXU,=FO/ON4AXU/M,=FO/SP9FIH, + =FO/W6TLD,=FO0ELY,=FO0POM,=FO0TOH,=FO5QS/M,=FO8RZ/P,=K7ST/FO,=TX0SIX,=TX4PG,=TX5A,=TX5SPM,=TX5VT, + =TX7EU,=TX7G,=TX7M,=TX7MB,=TX7T; +St. Pierre & Miquelon: 05: 09: NA: 46.77: 56.20: 3.0: FP: + FP,=TO200SPM,=TO2U,=TO5FP,=TO5M,=TO5T,=TO80SP; +Reunion Island: 39: 53: AF: -21.12: -55.48: -4.0: FR: + FR,=TO019IEEE,=TO0FAR,=TO0MPB,=TO0R,=TO19A,=TO1PF,=TO1PF/P,=TO1TAAF,=TO2R,=TO2R/P,=TO2Z,=TO3R, + =TO5R,=TO7CC,=TO7DL,=TO90R; +St. Martin: 08: 11: NA: 18.08: 63.03: 4.0: FS: + FS,=TO0A,=TO1E,=TO1K,=TO2EME,=TO4X,=TO5D,=TO5SM,=TO5SM/P,=TO9W; +Glorioso Islands: 39: 53: AF: -11.55: -47.28: -4.0: FT/g: + FT0G,FT1G,FT2G,FT3G,FT4G,FT5G,FT6G,FT7G,FT8G,FT9G,=FR5ZQ/G; +Juan de Nova, Europa: 39: 53: AF: -17.05: -42.72: -3.0: FT/j: + FT0E,FT1E,FT2E,FT3E,FT4E,FT6E,FT7E,FT8E,FT9E,=FR/F5NHJ/E,=FR5IZ/E,=TO4E,=TO4WW, + FT0J,FT1J,FT2J,FT3J,FT4J,FT6J,FT7J,FT8J,FT9J; +Tromelin Island: 39: 53: AF: -15.88: -54.50: -4.0: FT/t: + FT0T,FT1T,FT2T,FT3T,FT4T,FT5T,FT6T,FT7T,FT8T,FT9T,=FR/F6KDF/T,=FR5ZU/T; +Crozet Island: 39: 68: AF: -46.42: -51.75: -5.0: FT/w: + FT0W,FT4W,FT5W,FT8W; +Kerguelen Islands: 39: 68: AF: -49.00: -69.27: -5.0: FT/x: + FT0X,FT2X,FT4X,FT5X,FT8X; +Amsterdam & St. Paul Is.: 39: 68: AF: -37.85: -77.53: -5.0: FT/z: + FT0Z,FT1Z,FT2Z,FT3Z,FT4Z,FT5Z,FT6Z,FT7Z,FT8Z; +Wallis & Futuna Islands: 32: 62: OC: -13.30: 176.20: -12.0: FW: + FW,TW; +French Guiana: 09: 12: SA: 4.00: 53.00: 3.0: FY: + FY,=TO1A,=TO2A,=TO2BC,=TO5BR,=TO5G,=TO5NED,=TO7C,=TO7IR,=TO7R; +England: 14: 27: EU: 52.77: 1.47: 0.0: G: + 2E,G,M,=2E0CVN/NHS,=2E0GWD/P/LH,=2MT,=2O0YYY/P,=2Q0XYL/P,=2Q0YYY/P,=2SZ,=G0IBN/LH,=G0IBN/LV, + =G0IBN/P/LV,=G0SGB/LH,=G0VML/LV,=G3PRC/LH,=G6HH/LH,=GB0BLL/LH,=GB0BMB/LH,=GB0HLH/LH,=GB0NCI/LH, + =GB0PL/LH,=GB0SLH/LH,=GB0WPS/JOTA,=GB1PBL/LH,=GB2APL/LH,=GB2BML/LGT,=GB2BML/LH,=GB2LZL/LH, + =GB2PLH/LH,=GB2SCA/LH,=GB2SJ/LH,=GB2SML/LH,=GB2SNM/MILL,=GB3HQ/YOTA,=GB4CWM/YL,=GB4LL/LH, + =GB4WL/LH,=GB5PW/LH,=GB6MD/IMD,=GB6MW/MILL,=GB8SL/LH,=GO4ONL/P,=GX0MWT/IMD,=GX3PRC/LH,=GX3SDS/LH, + =M0DXT/LH,=M0HAZ/A/TCM,=M0TXS/YL,=M0WDC/LH,=M1MJT/YL,=M2000Y/21B,=M2000Y/21F,=M2000Y/28B, + =M2000Y/29C,=M2000Y/71B,=M2001Y/21F,=M2001Y/71B,=M2001Y/97A,=M3AFR/LH,=M3MJT/YL,=M3ZKT/YL, + =M6AIG/YL,=M6SUS/YL,=MQ6BWA/P; +Isle of Man: 14: 27: EU: 54.20: 4.53: 0.0: GD: + 2D,GD,GT,MD,MT,=2O0YLX,=2Q0YLX,=2R0IOM,=2V0IOM,=2V0YLX,=GB0AOA,=GB0BEA,=GB0IOM,=GB0MST,=GB100TT, + =GB19CIM,=GB1MSG,=GB1RT,=GB1SOI,=GB2IOM,=GB2MAD,=GB2RT,=GB2WB,=GB4COM,=GB4IOM,=GB4JDF,=GB4MGR, + =GB4MNH,=GB4SPT,=GB4WXM,=GB4WXM/P,=GB5LB,=GB5MOB,=GB5TD,=GD3JIU/2K,=GO0OUD,=GQ0OUD,=GR0AMD, + =GR0HWA,=GR0OUD,=GR6AFB,=GT3FLH/LGT,=GT3FLH/LT,=GT4IOM/LH,=GT8IOM/LH,=GV0OUD,=GV3YEO,=GV6AFB, + =GV7HTG,=MB100TT,=MO1CLV,=MQ1CLV,=MR0CCE,=MR3LJB,=MR3MLD,=MV3YLX; +Northern Ireland: 14: 27: EU: 54.73: 6.68: 0.0: GI: + 2I,GI,GN,MI,MN,=2I0NGM/NHS,=2O0BAD,=2O0HBO,=2O0HRV,=2O0MFB,=2O0TWA,=2O0VEP,=2O0VGW,=2O0VIM, + =2O0WAI,=2O0ZXM,=2Q0BSA,=2Q0ETB,=2Q0HRV,=2Q0MFB,=2Q0NIE,=2Q0SXG,=2Q0TWA,=2Q0VEP,=2Q0VIM,=2Q0ZXM, + =2R0IRZ,=2R0IRZ/P,=2R0KPY,=2R0KYE,=2R0MFB,=2R0PTX,=2R0RMD,=2R0RVH,=2R0TCA,=2R0TMR,=2R0VAX,=2R0VEP, + =2R0VIM,=2R0WAI,=2R0WMN,=2V0CSB,=GB0AEL,=GB0ARM,=GB0AS,=GB0AVB,=GB0BIG,=GB0BMS,=GB0BPM,=GB0BTC, + =GB0BVC,=GB0C,=GB0CAS,=GB0CBS,=GB0COA,=GB0CSC,=GB0DDF,=GB0EBG,=GB0EG,=GB0FMF,=GB0FMH,=GB0GDI, + =GB0GLS,=GB0GPF,=GB0KKM,=GB0LNR,=GB0LSP,=GB0LVA,=GB0MAH,=GB0MAR,=GB0MFD,=GB0OGC,=GB0PAT,=GB0PDY, + =GB0PSM,=GB0REL,=GB0RSL,=GB0SBG,=GB0SPD,=GB0TCH,=GB0TGN,=GB0USR,=GB0VC,=GB0WOA,=GB100BOS, + =GB100RNR,=GB106TBC,=GB150WCB,=GB16SW,=GB1918EKN,=GB19CGI,=GB19CNI,=GB1AFP,=GB1BPM,=GB1DDG, + =GB1HSC,=GB1IMD,=GB1RM,=GB1ROC,=GB1SOS,=GB1SPD,=GB1SRI,=GB1TMD,=GB1UAS,=GB1WWC,=GB2AD,=GB2AD/P, + =GB2AS,=GB2BCW,=GB2BDS,=GB2BOA,=GB2CA,=GB2CRU,=GB2DCI,=GB2DMR,=GB2DPC,=GB2IL,=GB2LL,=GB2LOL, + =GB2MAC,=GB2MRI,=GB2PDY,=GB2PP,=GB2PSW,=GB2REL,=GB2SDD,=GB2SPD,=GB2SPR,=GB2STI,=GB2STP,=GB2SW, + =GB2UAS,=GB3NGI,=GB4AFD,=GB4CSC,=GB4CTL,=GB4NHS,=GB4ONI,=GB4PS,=GB4SOS,=GB4SPD,=GB4UAS,=GB50AAD, + =GB50CSC,=GB5AFD,=GB5BIG,=GB5BL,=GB5BL/LH,=GB5DPR,=GB5NHS,=GB5OMU,=GB5SPD,=GB6EPC,=GB6SPD,=GB6VCB, + =GB75VEC,=GB8BKY,=GB8BRM,=GB8DS,=GB8EGT,=GB8GLM,=GB8HRH,=GB8LWF,=GB8NHS,=GB8NIC,=GB8ROC,=GB8SJA, + =GB8SPD,=GB8STM,=GB90RSGB/82,=GB90SOM,=GB9AFD,=GB9LQV,=GB9RAF,=GB9SPD,=GN0LIX/LH,=GN4GTY/LH, + =GO0AQD,=GO0BJH,=GO0DUP,=GO3KVD,=GO3MMF,=GO3SG,=GO4DOH,=GO4GID,=GO4GUH,=GO4LKG,=GO4NKB,=GO4ONL, + =GO4OYM,=GO4SRQ,=GO4SZW,=GO6MTL,=GO7AXB,=GO7KMC,=GO8YYM,=GQ0AQD,=GQ0BJG,=GQ0NCA,=GQ0RQK,=GQ0TJV, + =GQ0UVD,=GQ1CET,=GQ3KVD,=GQ3MMF,=GQ3SG,=GQ3UZJ,=GQ3XRQ,=GQ4DOH,=GQ4GID,=GQ4GUH,=GQ4JTF,=GQ4LKG, + =GQ4LXL,=GQ4NKB,=GQ4ONL,=GQ4OYM,=GQ4SZW,=GQ6JPO,=GQ6MTL,=GQ7AXB,=GQ7JYK,=GQ7KMC,=GQ8RQI,=GQ8YYM, + =GR0BJH,=GR0BRO,=GR0DVU,=GR0RQK,=GR0RWO,=GR0UVD,=GR1CET,=GR3GTR,=GR3KDR,=GR3SG,=GR3WEM,=GR4AAM, + =GR4DHW,=GR4DOH,=GR4FUE,=GR4FUM,=GR4GID,=GR4GOS,=GR4GUH,=GR4KQU,=GR4LXL,=GR4NKB,=GR6JPO,=GR7AXB, + =GR7KMC,=GR8RKC,=GR8RQI,=GR8YYM,=GV1BZT,=GV3KVD,=GV3SG,=GV4FUE,=GV4GUH,=GV4JTF,=GV4LXL,=GV4SRQ, + =GV4WVN,=GV7AXB,=GV7THH,=MI5AFK/2K,=MN0NID/LH,=MO0ALS,=MO0BDZ,=MO0CBH,=MO0IOU,=MO0IRZ,=MO0JFC, + =MO0JFC/P,=MO0JML,=MO0JST,=MO0KYE,=MO0LPO,=MO0MOD,=MO0MOD/P,=MO0MSR,=MO0MVP,=MO0RRE,=MO0RUC, + =MO0RYL,=MO0TGO,=MO0VAX,=MO0ZXZ,=MO3RLA,=MO6AOX,=MO6NIR,=MO6TUM,=MO6WAG,=MO6WDB,=MO6YDR,=MQ0ALS, + =MQ0BDZ,=MQ0BPB,=MQ0GGB,=MQ0IRZ,=MQ0JFC,=MQ0JST,=MQ0KAM,=MQ0KYE,=MQ0MOD,=MQ0MSR,=MQ0MVP,=MQ0RMD, + =MQ0RRE,=MQ0RUC,=MQ0RYL,=MQ0TGO,=MQ0VAX,=MQ0ZXZ,=MQ3GHW,=MQ3RLA,=MQ3STV,=MQ5AFK,=MQ6AOX,=MQ6BJG, + =MQ6GDN,=MQ6WAG,=MQ6WDB,=MQ6WGM,=MR0GDO,=MR0GGB,=MR0JFC,=MR0KQU,=MR0LPO,=MR0MOD,=MR0MSR,=MR0MVP, + =MR0RUC,=MR0SAI,=MR0SMK,=MR0TFK,=MR0TLG,=MR0TMW,=MR0VAX,=MR0WWB,=MR1CCU,=MR3RLA,=MR3TFF,=MR3WHM, + =MR5AMO,=MR6CCU,=MR6CWC,=MR6GDN,=MR6MME,=MR6MRJ,=MR6OKS,=MR6OLA,=MR6PUX,=MR6WAG,=MR6XGZ,=MV0ALS, + =MV0GGB,=MV0IOU,=MV0JFC,=MV0JLC,=MV0MOD,=MV0MSR,=MV0MVP,=MV0TGO,=MV0VAX,=MV0WGM,=MV0ZAO,=MV1VOX, + =MV6DTE,=MV6GTY,=MV6NIR,=MV6TLG; +Jersey: 14: 27: EU: 49.22: 2.18: 0.0: GJ: + 2J,GH,GJ,MH,MJ,=2R0ODX,=GB0JSA,=GB19CJ,=GB2BYL,=GB2JSA,=GB50JSA,=GB5OJR,=GB8LMI,=GH5DX/NHS, + =GJ3DVC/L,=GJ6WRI/LH,=GJ8PVL/LH,=GO8PVL,=GQ8PVL,=GR6TMM,=MO0ASP,=MQ0ASP,=MR0ASP,=MR0RZD,=MV0ASP; +Scotland: 14: 27: EU: 56.82: 4.18: 0.0: GM: + 2A,2M,GM,GS,MA,MM,MS,=2O0BSE,=2O0BZB,=2O0HJS,=2O0IMP,=2O0IOB,=2O0IVG,=2O0LIM,=2O0LJM,=2O0TOK, + =2O1MIC,=2O1SJB,=2Q0BSE,=2Q0BZB,=2Q0FYG,=2Q0HJS,=2Q0IMP,=2Q0IOB,=2Q0JOK,=2Q0LDO,=2Q0TAX,=2Q0TOK, + =2Q0YCG,=2Q1MIC,=2Q1SJB,=2R0BOO,=2R0BSE,=2R0BXN,=2R0BZB,=2R0DES,=2R0DXR,=2R0FYG,=2R0GLI,=2R0HJS, + =2R0IMP,=2R0IOB,=2R0ISM,=2R0JVR,=2R0KAU,=2R0KAU/P,=2R0NCM,=2R0OXX,=2R0YCG,=2R0ZPS,=2R1MIC,=2R1SJB, + =2V0GUL,=2V0IVG,=2V0JCH,=2V0KAU,=2V0TAX,=2V1HFE,=2V1MIC,=2V1SJB,=G0FBJ,=GA6NX/LH,=GB0AYR,=GB0BAJ, + =GB0BCG,=GB0BCK,=GB0BD,=GB0BDC,=GB0BL,=GB0BNA,=GB0BNC,=GB0BOC,=GB0BOL,=GB0BSS,=GB0BWT,=GB0CCF, + =GB0CHL,=GB0CLH,=GB0CML,=GB0CNL,=GB0CSG,=GB0CSL,=GB0CSL/LH,=GB0CWF,=GB0CWS,=GB0DAM,=GB0DAW, + =GB0DBS,=GB0DHL,=GB0DPK,=GB0EPC,=GB0FFS,=GB0FSG,=GB0GDS,=GB0GDS/J,=GB0GGR,=GB0GRN,=GB0GTD,=GB0HHW, + =GB0HLD,=GB0JOG,=GB0KEY,=GB0KGS,=GB0KKS,=GB0KLT,=GB0LCS,=GB0LCW,=GB0LTM,=GB0MLH,=GB0MLM,=GB0MOD, + =GB0MOG,=GB0MOL,=GB0MSL,=GB0MUL,=GB0NGG,=GB0NHL,=GB0NHL/LH,=GB0NHS,=GB0NRL,=GB0OYT,=GB0PLS, + =GB0POS,=GB0PPE,=GB0PSW,=GB0RGC,=GB0SAA,=GB0SBC,=GB0SCD,=GB0SFM,=GB0SHP,=GB0SI,=GB0SJR,=GB0SK, + =GB0SKG,=GB0SKY,=GB0SLB,=GB0SRC,=GB0SSB,=GB0TH,=GB0THL,=GB0TNL,=GB0TTS,=GB0WRH,=GB100BCG, + =GB100MAS,=GB100MUC,=GB100ZET,=GB10SP,=GB150NRL,=GB18FIFA,=GB19CGM,=GB19CS,=GB1AJ,=GB1ASC,=GB1ASH, + =GB1BD,=GB1BOL,=GB1CFL,=GB1COR,=GB1DHL,=GB1FB,=GB1FRS,=GB1FVS,=GB1FVT,=GB1GEO,=GB1GND,=GB1HRS, + =GB1KGG,=GB1KLD,=GB1LAY,=GB1LGG,=GB1LL,=GB1MAY,=GB1NHL,=GB1OL,=GB1OL/LH,=GB1PC,=GB1RB,=GB1RHU, + =GB1RST,=GB1SLH,=GB1TAY,=GB1WLG,=GB20YOTA,=GB250RB,=GB2AES,=GB2AGG,=GB2AL,=GB2AMS,=GB2AST,=GB2AYR, + =GB2BAJ,=GB2BHM,=GB2BHS,=GB2BMJ,=GB2BOL,=GB2CAS,=GB2CHC,=GB2CM,=GB2CMA,=GB2CR,=GB2CVL,=GB2CWR, + =GB2DAS,=GB2DAW,=GB2DHS,=GB2DL,=GB2DRC,=GB2DT,=GB2DTM,=GB2ELH,=GB2ELH/LH,=GB2EPC,=GB2FBM,=GB2FEA, + =GB2FSM,=GB2FSW,=GB2GEO,=GB2GKR,=GB2GNL,=GB2GNL/LH,=GB2GTM,=GB2GVC,=GB2HLB,=GB2HMC,=GB2HRH, + =GB2IGB,=GB2IGS,=GB2IMG,=GB2IMM,=GB2INV,=GB2IOT,=GB2JCM,=GB2KDR,=GB2KGB,=GB2KW,=GB2LBN,=GB2LBN/LH, + =GB2LCL,=GB2LCP,=GB2LCT,=GB2LDG,=GB2LG,=GB2LG/P,=GB2LGB,=GB2LHI,=GB2LK,=GB2LK/LH,=GB2LMG,=GB2LP, + =GB2LS,=GB2LS/LH,=GB2LSS,=GB2LT,=GB2LT/LH,=GB2LXX,=GB2M,=GB2MAS,=GB2MBB,=GB2MDG,=GB2MN,=GB2MOF, + =GB2MSL,=GB2MUC,=GB2MUL,=GB2NBC,=GB2NEF,=GB2NL,=GB2NMM,=GB2OL,=GB2OWM,=GB2PBF,=GB2PG,=GB2QM, + =GB2RB,=GB2RDR,=GB2ROC,=GB2RRL,=GB2RWW,=GB2SAA,=GB2SAM,=GB2SAS,=GB2SB,=GB2SBG,=GB2SBS,=GB2SHL/LH, + =GB2SKG,=GB2SLH,=GB2SMM,=GB2SOH,=GB2SQN,=GB2SR,=GB2SSB,=GB2SUM,=GB2SWF,=GB2TDS,=GB2THL,=GB2THL/LH, + =GB2TNL,=GB2VCB,=GB2VEF,=GB2WAM,=GB2WBF,=GB2WG,=GB2WLS,=GB2YLS,=GB2ZE,=GB3ANG,=GB3GKR,=GB3LER, + =GB3LER/B,=GB3ORK,=GB3ORK/B,=GB3SWF,=GB3WOI,=GB4AAS,=GB4AST,=GB4BBR,=GB4BG,=GB4CGS,=GB4CMA, + =GB4DAS,=GB4DHX,=GB4DTD,=GB4DUK,=GB4EPC,=GB4FFS,=GB4GD,=GB4GDS,=GB4GS,=GB4IE,=GB4JCM,=GB4JOA, + =GB4JPJ,=GB4JYS,=GB4LER,=GB4MSE,=GB4NFE,=GB4PAS,=GB4SK,=GB4SKO,=GB4SLH,=GB4SMM,=GB4SRO,=GB4SWF, + =GB50FVS,=GB50GDS,=GB50GT,=GB50JS,=GB5AG,=GB5AST,=GB5BBS,=GB5BOH,=GB5C,=GB5CS,=GB5CWL,=GB5DHL, + =GB5DX,=GB5EMF,=GB5FHC,=GB5FLM,=GB5JS,=GB5LTH,=GB5RO,=GB5RO/LH,=GB5RR,=GB5SI,=GB5TAM,=GB5TI, + =GB60CRB,=GB6BEN,=GB6TAA,=GB6WW,=GB75CC,=GB75GD,=GB7SRW,=GB80GD,=GB8AYR,=GB8CSL,=GB8FSG,=GB8RU, + =GB8RUM,=GB90RSGB/11,=GB90RSGB/12,=GB90RSGB/21,=GB90RSGB/22,=GB90RSGB/23,=GB999SPC,=GB9UL, + =GG100AGG,=GG100GA,=GG100GCC,=GG100GGP,=GG100GGR,=GG100GLD,=GG100SBG,=GM/DL5SE/LH,=GM0AZC/2K, + =GM0DHZ/P,=GM0GFL/P,=GM0KTO/2K,=GM0MUN/2K,=GM0SGB/M,=GM0SGB/P,=GM0WED/NHS,=GM0WUX/2K,=GM3JIJ/2K, + =GM3OFT/P,=GM3TKV/LH,=GM3TTC/P,=GM3TXF/P,=GM3USR/P,=GM3VLB/P,=GM3WFK/P,=GM3YDN/NHS,=GM4AFF/P, + =GM4CHX/2K,=GM4CHX/P,=GM4SQM/NHS,=GM4SQN/NHS,=GM4WSB/M,=GM4WSB/P,=GM4ZVD/P,=GM6JNJ/NHS,=GM6WRW/P, + =GO0AEG,=GO0AIR,=GO0BKC,=GO0DBW,=GO0DBW/M,=GO0DEQ,=GO0GMN,=GO0OGN,=GO0SYY,=GO0TUB,=GO0VRP,=GO0WEZ, + =GO1BAN,=GO1BKF,=GO1MQE,=GO1TBW,=GO2MP,=GO3HVK,=GO3JIJ,=GO3NIG,=GO3VTB,=GO4BLO,=GO4CAU,=GO4CFS, + =GO4CHX,=GO4CXM,=GO4DLG,=GO4EMX,=GO4FAM,=GO4FAU,=GO4JOJ,=GO4JPZ,=GO4JR,=GO4MOX,=GO4MSL,=GO4PRB, + =GO4UBJ,=GO4VTB,=GO4WZG,=GO4XQJ,=GO6JEP,=GO6JRX,=GO6KON,=GO6LYJ,=GO6VCV,=GO7GAX,=GO7GDE,=GO7HUD, + =GO7TUD,=GO7WEF,=GO8CBQ,=GO8MHU,=GO8SVB,=GO8TTD,=GQ0AEG,=GQ0AIR,=GQ0BKC,=GQ0BWR,=GQ0DBW,=GQ0DEQ, + =GQ0DUX,=GQ0FNE,=GQ0GMN,=GQ0HUO,=GQ0KWL,=GQ0MUN,=GQ0NTL,=GQ0OGN,=GQ0RNR,=GQ0TKV/P,=GQ0VRP,=GQ0WEZ, + =GQ0WNR,=GQ1BAN,=GQ1BKF,=GQ1MQE,=GQ1TBW,=GQ3JIJ,=GQ3JQJ,=GQ3NIG,=GQ3NTL,=GQ3TKP,=GQ3TKP/P,=GQ3TKV, + =GQ3TKV/P,=GQ3VTB,=GQ3WUX,=GQ3ZBE,=GQ4AGG,=GQ4BAE,=GQ4BLO,=GQ4CAU,=GQ4CFS,=GQ4CHX,=GQ4CHX/P, + =GQ4CXM,=GQ4DLG,=GQ4ELV,=GQ4EMX,=GQ4FAU,=GQ4JOJ,=GQ4JPZ,=GQ4JR,=GQ4MSL,=GQ4OBG,=GQ4PRB,=GQ4UIB, + =GQ4UPL,=GQ4VTB,=GQ4WZG,=GQ4XQJ,=GQ4YMM,=GQ6JEP,=GQ6JRX,=GQ6KON,=GQ6LYJ,=GQ7GAX,=GQ7GDE,=GQ7HUD, + =GQ7TUD,=GQ7UED,=GQ7WEF,=GQ8CBQ,=GQ8MHU,=GQ8PLR,=GQ8SVB,=GQ8TTD,=GR0AXY,=GR0CDV,=GR0DBW,=GR0EKM, + =GR0GMN,=GR0GRD,=GR0HPK,=GR0HPL,=GR0HUO,=GR0OGN,=GR0PNS,=GR0SYV,=GR0TTV,=GR0TUB,=GR0UKZ,=GR0VRP, + =GR0WED,=GR0WNR,=GR150NIB,=GR1BAN,=GR1MWK,=GR1TBW,=GR1ZIV,=GR3JFG,=GR3MZX,=GR3NIG,=GR3OFT,=GR3PPE, + =GR3PYU,=GR3VAL,=GR3VTB,=GR3WFJ,=GR3YXJ,=GR3ZDH,=GR4BDJ,=GR4BLO,=GR4CAU,=GR4CCN,=GR4CFS,=GR4CMI, + =GR4CXM,=GR4DLG,=GR4EMX,=GR4EOU,=GR4FQE,=GR4GIF,=GR4JOJ,=GR4NSZ,=GR4PRB,=GR4SQM,=GR4VTB,=GR4XAW, + =GR4XMD,=GR4XQJ,=GR4YMM,=GR6JEP,=GR6JNJ,=GR7AAJ,=GR7GAX,=GR7GDE,=GR7GMC,=GR7HHB,=GR7HUD,=GR7LNO, + =GR7NZI,=GR7TUD,=GR7USC,=GR7VSB,=GR8CBQ,=GR8KJO,=GR8KPH,=GR8MHU,=GR8OFQ,=GR8SVB,=GS4WAB/P,=GV0DBW, + =GV0GMN,=GV0GRD,=GV0LZE,=GV0OBX,=GV0OGN,=GV0SYV,=GV0VRP,=GV1BAN,=GV3EEW,=GV3JIJ,=GV3NHQ,=GV3NIG, + =GV3NKG,=GV3NNZ,=GV3PIP,=GV3ULP,=GV3VTB,=GV4BLO,=GV4EMX,=GV4HRJ,=GV4ILS,=GV4JOJ,=GV4KLN,=GV4LVW, + =GV4PRB,=GV4VTB,=GV4XQJ,=GV6KON,=GV7DHA,=GV7GDE,=GV7GMC,=GV8AVM,=GV8DPV,=GV8LYS,=MB18FIFA, + =MM/DJ4OK/M,=MM/DJ8OK/M,=MM/DL5SE/LH,=MM/F5BLC/P,=MM/F5LMJ/P,=MM/HB9IAB/P,=MM/KE5TF/P,=MM/N5ET/P, + =MM/OK1FZM/P,=MM/W5ZE/P,=MM0BNN/LH,=MM0BQI/2K,=MM0BQN/2K,=MM0BYE/2K,=MM0DFV/P,=MM0DHQ/NHS, + =MM0LON/M,=MM0MOL/P,=MM0SHF/P,=MM0YHB/P,=MM0ZOL/LH,=MM3AWD/NHS,=MM3DDQ/NHS,=MM5PSL/P,=MM5YLO/P, + =MM7WAB/NHS,=MO0BFF,=MO0CWJ,=MO0CYR,=MO0DBC,=MO0DNX,=MO0FMF,=MO0GXQ,=MO0HZT,=MO0JST/P,=MO0KJG, + =MO0KSS,=MO0NFC,=MO0SGQ,=MO0SJT,=MO0TGB,=MO0TSG,=MO0WKC,=MO0XXW,=MO0ZBH,=MO1AWV,=MO1HMV,=MO3BCA, + =MO3BRR,=MO3GPL,=MO3OQR,=MO3TUP,=MO3UVL,=MO3YHA,=MO3YMU,=MO3ZCB/P,=MO3ZRF,=MO5PSL,=MO6BJJ,=MO6CCS, + =MO6CHM,=MO6CRQ,=MO6CRQ/M,=MO6DGZ,=MO6HUT,=MO6KAU,=MO6KAU/M,=MO6KSJ,=MO6MCV,=MO6SRL,=MO6TEW, + =MQ0BNN/P,=MQ0BQM,=MQ0BRG,=MQ0CIN,=MQ0CXA,=MQ0CYR,=MQ0DNX,=MQ0DXD,=MQ0EQE,=MQ0FMF,=MQ0GXQ,=MQ0GYX, + =MQ0GYX/P,=MQ0KJG,=MQ0KSS,=MQ0LEN,=MQ0NFC,=MQ0NJC,=MQ0SJT,=MQ0TSG,=MQ0WKC,=MQ0XXW,=MQ0ZBH,=MQ1AWV, + =MQ1HMV,=MQ1JWF,=MQ3BCA,=MQ3BRR,=MQ3ERZ,=MQ3FET,=MQ3OVK,=MQ3SVK,=MQ3UIX,=MQ3UVL,=MQ3YHA,=MQ3YMU, + =MQ3ZRF,=MQ5PSL,=MQ6AQM,=MQ6BJJ,=MQ6CCS,=MQ6CHM,=MQ6CRQ,=MQ6DGZ,=MQ6HUT,=MQ6KAJ,=MQ6KAU,=MQ6KSJ, + =MQ6KUA,=MQ6LMP,=MQ6MCV,=MR0BQN,=MR0CWB,=MR0CXA,=MR0DHQ,=MR0DWF,=MR0DXD,=MR0DXH,=MR0EPC,=MR0EQE, + =MR0FME,=MR0FMF,=MR0GCF,=MR0GGG,=MR0GGI,=MR0GOR,=MR0HAI,=MR0HVU,=MR0OIL,=MR0POD,=MR0PSL,=MR0RDM, + =MR0SGQ,=MR0SJT,=MR0TAI,=MR0TSG,=MR0TSS,=MR0VTV,=MR0WEI,=MR0XAF,=MR0XXP,=MR0XXW,=MR1AWV,=MR1HMV, + =MR1JWF,=MR1VTB,=MR3AWA,=MR3AWD,=MR3BRR,=MR3PTS,=MR3UIX,=MR3UVL,=MR3WJZ,=MR3XGP,=MR3YHA,=MR3YPH, + =MR3ZCS,=MR5PSL,=MR6AHB,=MR6ARN,=MR6ATU,=MR6CHM,=MR6CTH,=MR6CTL,=MR6HFC,=MR6MCV,=MR6RLL,=MR6SSI, + =MR6TMS,=MV0DXH,=MV0FME,=MV0FMF,=MV0GHM,=MV0HAR,=MV0LGS,=MV0NFC,=MV0NJS,=MV0SGQ,=MV0SJT,=MV0XXW, + =MV1VTB,=MV3BRR,=MV3CVB,=MV3YHA,=MV3YMU,=MV5PSL,=MV6BJJ,=MV6KSJ,=MV6NRQ; +Shetland Islands: 14: 27: EU: 60.50: 1.50: 0.0: *GM/s: + =2M0BDR,=2M0BDT,=2M0CPN,=2M0GFC,=2M0SEG,=2M0SPX,=2M0VIK,=2M0ZET,=2M1ANT,=2M1ASQ,=2M1ODL,=G0FBJ, + =GB0BL,=GB0DAW,=GB100ZET,=GB1COR,=GB2AES,=GB2CAS,=GB2DAW,=GB2ELH,=GB2ELH/LH,=GB2HMC,=GB2IGS, + =GB2LHI,=GB2MUC,=GB2NBC,=GB2QM,=GB2SB,=GB2SLH,=GB2SR,=GB2SUM,=GB2WAM,=GB2WG,=GB3LER,=GB3LER/B, + =GB4LER,=GM0AVR,=GM0CXQ,=GM0CYJ,=GM0DJI,=GM0EKM,=GM0GFL,=GM0GFL/P,=GM0ILB,=GM0JDB,=GM0SGB/M, + =GM0VFA,=GM1BYL,=GM1CBQ,=GM1FGN,=GM1KKI,=GM1MXN,=GM1ZNR,=GM3KLA,=GM3KZH,=GM3RFR,=GM3SJA,=GM3SKN, + =GM3TXF/P,=GM3WCH,=GM3WHT,=GM3ZET,=GM4AFF/P,=GM4AGX,=GM4CHX/P,=GM4ENK,=GM4FNE,=GM4GPN,=GM4GPP, + =GM4GQD,=GM4GQM,=GM4IPK,=GM4JPI,=GM4LBE,=GM4LER,=GM4PXG,=GM4S,=GM4SLV,=GM4SSA,=GM4WXQ,=GM4ZHL, + =GM6RQW,=GM6RTO,=GM6VZB,=GM6WVI,=GM6YQA,=GM7AFE,=GM7GWW,=GM7RKD,=GM8LNH,=GM8MMA,=GM8YEC,=GS0AAA, + =GS0GRC,=GS3BSQ,=GS3ZET,=GS7V,=GS8YL,=MA0XAU,=MA1FJM,=MA6PTE,=MM/DJ6OZ,=MM/DL5KUA,=MM/OK1HDU, + =MM/OK7U,=MM/PA9D,=MM/PF9DC,=MM/W5ZE/P,=MM0/DJ6AU,=MM0/PA8MO,=MM0ECG,=MM0KAL,=MM0LON,=MM0LON/M, + =MM0LSM,=MM0MOL/P,=MM0NQY,=MM0SHF/P,=MM0VIK,=MM0XAU,=MM0ZAL,=MM0ZCG,=MM0ZRC,=MM1FEO,=MM1FJM, + =MM3VQO,=MM3ZET,=MM5PSL,=MM5PSL/P,=MM5YLO,=MM5YLO/P,=MM6ACW,=MM6BDU,=MM6BZQ,=MM6IKB,=MM6IMB, + =MM6MFA,=MM6PTE,=MM6SJK,=MM6YLO,=MM6ZBG,=MM6ZDW,=MM7CGR,=MM8A,=MO5PSL,=MQ5PSL,=MR5PSL,=MS0OXE, + =MS0ZCG,=MS0ZET; +Guernsey: 14: 27: EU: 49.45: 2.58: 0.0: GU: + 2U,GP,GU,MP,MU,=2O0FER,=2Q0ARE,=2Q0FER,=2U0ARE/2K,=GB0HAM,=GB0SRK,=GB0U,=GB100RS,=GB19CG,=GB2AFG, + =GB2FG,=GB2GU,=GB2JTA,=GB4SGG,=GB50GSY,=GB5LIB,=GO8FBO,=GQ8FBO,=GU0DXX/2K,=GU4GG/2K,=MO0FAL, + =MO0KWD,=MQ0FAL,=MR0FAL,=MU/OT9Z/LH; +Wales: 14: 27: EU: 52.28: 3.73: 0.0: GW: + 2W,GC,GW,MC,MW,=2O0CDY,=2O0CGM,=2O0CJI,=2O0CVE,=2O0DAA,=2O0DUL,=2O0DVP,=2O0IDT,=2O0JBJ,=2O0OJA, + =2O0RMR,=2O0RWF,=2O0TRR,=2O0UAA,=2O0WDS,=2O0ZJA,=2O12W,=2Q0CDY,=2Q0CGM,=2Q0CLJ,=2Q0CVE,=2Q0DAA, + =2Q0DAA/M,=2Q0IDT,=2Q0MKG,=2Q0OJA,=2Q0OTL,=2Q0RMR,=2Q0RWF,=2Q0SVW,=2Q0TRR,=2Q0UAA,=2Q0VAY,=2Q0WDS, + =2R0BRR,=2R0CDY,=2R0CDZ,=2R0CSS,=2R0CVE,=2R0DRB,=2R0IDT,=2R0OJA,=2R0PHP,=2R0PJP,=2R0REX,=2R0RWF, + =2R0TRR,=2R0TYG,=2R0XTP,=2R0YKK,=2R3SFC,=2V0CDY,=2V0CGM,=2V0CLJ,=2V0CVL,=2V0DAA,=2V0DUN,=2V0GME, + =2V0GNG,=2V0KED,=2V0WDS,=2V1EPO,=GB0AAW,=GB0AD,=GB0AMC,=GB0ATM,=GB0AWE,=GB0AWS,=GB0BHR,=GB0BP, + =GB0BRE,=GB0BTB,=GB0BVL,=GB0BYL,=GB0CAC,=GB0CBC,=GB0CCE,=GB0CEW,=GB0CFD,=GB0CGG,=GB0CLC,=GB0CQD, + =GB0CSA,=GB0CSR,=GB0CTK,=GB0CVA,=GB0DFD,=GB0DMT,=GB0DS,=GB0DVP,=GB0EUL,=GB0FHD,=GB0FHI,=GB0GDD, + =GB0GIG,=GB0GIW,=GB0GLV,=GB0GMD,=GB0GRM,=GB0HEL,=GB0HGC,=GB0HLT,=GB0HMM,=GB0HMT,=GB0KF,=GB0L, + =GB0LBG,=GB0LM,=GB0LVF,=GB0MFH,=GB0MIW,=GB0ML,=GB0MPA,=GB0MSB,=GB0MUU,=GB0MWL,=GB0NAW,=GB0NEW, + =GB0NG,=GB0NLC,=GB0PBR,=GB0PEM,=GB0PGG,=GB0PLB,=GB0PLL,=GB0PSG,=GB0RME,=GB0ROC,=GB0RPO,=GB0RS, + =GB0RSC,=GB0RSF,=GB0RWM,=GB0SCB,=GB0SDD,=GB0SGC,=GB0SH,=GB0SH/LH,=GB0SOA,=GB0SPE,=GB0SPS,=GB0TD, + =GB0TL,=GB0TPR,=GB0TS,=GB0TTT,=GB0VCA,=GB0VEE,=GB0VK,=GB0WHH,=GB0WHR,=GB0WIW,=GB0WMZ,=GB0WUL, + =GB0YG,=GB1004FTS,=GB100AB,=GB100BP,=GB100CSW,=GB100FTS,=GB100GGC,=GB100GGM,=GB100HD,=GB100LB, + =GB100LSG,=GB100MCV,=GB100TMD,=GB10SOTA,=GB19CGW,=GB19CW,=GB19SG,=GB1AD,=GB1ATC,=GB1BAF,=GB1BGS, + =GB1BPL,=GB1BSW,=GB1BW,=GB1CCC,=GB1CDS,=GB1CPG,=GB1CR,=GB1DS,=GB1FHS,=GB1HAS,=GB1HTW,=GB1JC, + =GB1KEY,=GB1LSG,=GB1LW,=GB1LWF,=GB1OOC,=GB1ORM,=GB1PCA,=GB1PCS,=GB1PD,=GB1PGW,=GB1PJ,=GB1PLL, + =GB1RTF,=GB1SDD,=GB1SEA,=GB1SL,=GB1SPN,=GB1SSL,=GB1STC,=GB1STM,=GB1TDS,=GB1WAA,=GB1WIW,=GB1WSM, + =GB2000SET,=GB2003SET,=GB200HNT,=GB200TT,=GB250TMB,=GB250TT,=GB2ADU,=GB2BEF,=GB2BGG,=GB2BOM, + =GB2BOW,=GB2BPM,=GB2BYF,=GB2CC,=GB2CI,=GB2COB,=GB2CRS,=GB2DWR,=GB2EI,=GB2FC,=GB2FLB,=GB2GGM, + =GB2GLS,=GB2GOL,=GB2GSG,=GB2GVA,=GB2HDG,=GB2HMM,=GB2IMD,=GB2LBR,=GB2LM,=GB2LNP,=GB2LSA,=GB2LSA/LH, + =GB2LSH,=GB2MD,=GB2MGY,=GB2MIL,=GB2MLM,=GB2MMC,=GB2MOP,=GB2NF,=GB2NPH,=GB2NPL,=GB2OOA,=GB2ORM, + =GB2PRC,=GB2RFS,=GB2RSG,=GB2RTB,=GB2SAC,=GB2SCC,=GB2SCD,=GB2SCP,=GB2SFM,=GB2SIP,=GB2SLA,=GB2TD, + =GB2TD/LH,=GB2TTA,=GB2VK,=GB2WAA,=GB2WHO,=GB2WIW,=GB2WNA,=GB2WSF,=GB2WT,=GB3HLS,=GB3LMW,=GB4ADU, + =GB4AFS,=GB4AOS,=GB4BB,=GB4BIT,=GB4BOJ,=GB4BPL,=GB4BPL/LH,=GB4BPL/P,=GB4BPR,=GB4BRS/P,=GB4BSG, + =GB4CI,=GB4CTC,=GB4EUL,=GB4FAA,=GB4FTS,=GB4GM,=GB4GSS,=GB4HFH,=GB4HI,=GB4HLB,=GB4HMD,=GB4HMM, + =GB4LRG,=GB4MBC,=GB4MD,=GB4MDH,=GB4MDI,=GB4MJS,=GB4MPI,=GB4MUU,=GB4NDG,=GB4NPL,=GB4NTB,=GB4ON, + =GB4OST,=GB4PAT,=GB4PCS,=GB4PD,=GB4POW,=GB4RC,=GB4RME,=GB4RSL,=GB4SDD,=GB4SLC,=GB4SSP,=GB4SUB, + =GB4TMS,=GB4UKG,=GB4WT,=GB4WWI,=GB4XT,=GB50ABS,=GB50EVS,=GB50RSC,=GB50SGP,=GB5AC,=GB5FI,=GB5GEO, + =GB5MD,=GB5ONG,=GB5PSJ,=GB5SIP,=GB5VEP,=GB5WT,=GB60DITP,=GB60ER,=GB60PW,=GB60SPS,=GB60VLY, + =GB65BTF,=GB6AC,=GB6BLB,=GB6CRI,=GB6GGM,=GB6OQA,=GB6ORA,=GB6PLB,=GB6RNLI,=GB6TS,=GB6TSG,=GB6WT, + =GB6WWT,=GB70BTF,=GB750CC,=GB75ATC,=GB75BB,=GB8HI,=GB8MD,=GB8MG,=GB8ND,=GB8OAE,=GB8OQE,=GB8RAF, + =GB8WOW,=GB8WT,=GB90RSGB/62,=GB90RSGB/72,=GB9GGM,=GC4BRS/LH,=GG100ACD,=GG100ANG,=GG100CPG, + =GG100RGG,=GG100SG,=GO0DIV,=GO0EZQ,=GO0EZY,=GO0JEQ,=GO0MNP,=GO0MNP/P,=GO0NPL,=GO0PLB,=GO0PNI, + =GO0PUP,=GO0VKW,=GO0VML,=GO0VSW,=GO1DPL,=GO1IOT,=GO1JFV,=GO1MVL,=GO1PKM,=GO3PLB,=GO3UOF,=GO3UOF/M, + =GO3XJQ,=GO4BKG,=GO4BLE,=GO4CQZ,=GO4DTQ,=GO4GTI,=GO4JKR,=GO4JUN,=GO4JUW,=GO4MVA,=GO4NOO,=GO4OKT, + =GO4SUE,=GO4SUE/P,=GO4TNZ,=GO4WXM,=GO6IMS,=GO6NKG,=GO6UKO,=GO7DWR,=GO7SBO,=GO7VJK,=GO7VQD,=GO8BQK, + =GO8IQC,=GO8JOY,=GO8OKR,=GQ0ANA,=GQ0DIV,=GQ0JEQ,=GQ0JRF,=GQ0MNO,=GQ0MNP,=GQ0NPL,=GQ0PUP,=GQ0RYT, + =GQ0SLM,=GQ0TQM,=GQ0VKW,=GQ0VML,=GQ0VSW,=GQ0WVL,=GQ1FKY,=GQ1FOA/P,=GQ1IOT,=GQ1JFV,=GQ1MVL,=GQ1NRS, + =GQ1WRV,=GQ1ZKN,=GQ3IRK,=GQ3PLB,=GQ3SB,=GQ3UOF,=GQ3VEN,=GQ3VKL,=GQ3WSU,=GQ3XJA,=GQ3XJQ,=GQ4BKG, + =GQ4BLE,=GQ4CQZ,=GQ4EZW,=GQ4GSH,=GQ4GTI,=GQ4IIL,=GQ4JKR,=GQ4JUN,=GQ4JUW,=GQ4LZP,=GQ4MVA,=GQ4NOO, + =GQ4OKT,=GQ4SUE,=GQ4VNS,=GQ4VZJ,=GQ4WXM,=GQ4WXM/P,=GQ6IMS,=GQ6ITJ,=GQ6NKG,=GQ6UKO,=GQ7BQK,=GQ7DWR, + =GQ7FBV,=GQ7SBO,=GQ7UNJ,=GQ7UNV,=GQ7VJK,=GQ7VQD,=GQ8BQK,=GQ8IQC,=GQ8JOY,=GQ8OKR,=GR0ANA,=GR0DIV, + =GR0DSP,=GR0HUS,=GR0JEQ,=GR0MYY,=GR0NPL,=GR0PSV,=GR0RYT,=GR0SYN,=GR0TKX,=GR0VKW,=GR0WGK,=GR1FJI, + =GR1HNG,=GR1LFX,=GR1LHV,=GR1MCD,=GR1SGG,=GR1WVY,=GR1YQM,=GR3SB,=GR3SFC,=GR3TKH,=GR3UOF,=GR3XJQ, + =GR4BKG,=GR4BLE,=GR4CQZ,=GR4GNY,=GR4GTI,=GR4HZA,=GR4JUN,=GR4JUW,=GR4OGO,=GR4SUE,=GR4VSS/P,=GR4XXJ, + =GR4ZOM,=GR5PH,=GR6NKG,=GR6SIX,=GR6STK,=GR6UKO,=GR6ZDH,=GR7AAV,=GR7HOC,=GR7NAU,=GR7TKZ,=GR7UNV, + =GR7VQD,=GR8BQK,=GR8IQC,=GR8OGI,=GR8TRO,=GV0ANA,=GV0DCK,=GV0DIV,=GV0EME,=GV0FRE,=GV0MNP,=GV0NPL, + =GV1FKY,=GV1IOT,=GV1JFV,=GV1NBW,=GV1YQM,=GV3ATZ,=GV3TJE/P,=GV3UOF,=GV3WEZ,=GV3XJQ,=GV4BKG,=GV4BRS, + =GV4CQZ,=GV4JKR,=GV4JQP,=GV4NQJ,=GV4PUC,=GV6BRC,=GV6JPC,=GV6NKG,=GV7UNV,=GV7VJK,=GV8IQC, + =GW0AWT/2K,=GW0GEI/2K,=GW0GIH/2K,=GW0MNO/2K,=GW0VSW/2K,=GW3JXN/2K,=GW3KJN/2K,=GW4IIL/2K, + =GW4VHP/2K,=M2000Y/97A,=MO0AQZ,=MO0ATI,=MO0COE,=MO0CVT,=MO0EQL,=MO0EZQ,=MO0GXE,=MO0HCX,=MO0IBZ, + =MO0IML,=MO0KLW,=MO0LDJ,=MO0LLK,=MO0LUK,=MO0LZZ,=MO0MAU,=MO0MUM,=MO0MWZ,=MO0OWW,=MO0SGD,=MO0SGR, + =MO0TBB,=MO0TMI,=MO0TTU,=MO0UPH,=MO0VVO,=MO1CFA,=MO1CFN,=MO3DAO,=MO3DQB,=MO3GKI,=MO3OJA,=MO3PUU, + =MO3RNI,=MO3UEZ,=MO3WPH,=MO3YVO,=MO3ZCO,=MO6DVP,=MO6GWK,=MO6GWR,=MO6GWR/P,=MO6MAU,=MO6PAM,=MO6PLC, + =MO6PUT,=MO6SEF,=MO6TBD,=MO6TBP,=MO6WLB,=MQ0AQZ,=MQ0ATI,=MQ0AWW,=MQ0CDO,=MQ0CNA,=MQ0CVT,=MQ0DHF, + =MQ0EQL,=MQ0GXE,=MQ0GYV,=MQ0HCX,=MQ0IBZ,=MQ0IML,=MQ0LDJ,=MQ0LLK,=MQ0LUK,=MQ0LZZ,=MQ0MAU,=MQ0MUM, + =MQ0MWA,=MQ0MWZ,=MQ0OWW,=MQ0PAD,=MQ0RHD,=MQ0SGD,=MQ0SGR,=MQ0TBB,=MQ0TMI,=MQ0TTU,=MQ0UPH,=MQ0UPH/P, + =MQ0VVO,=MQ0XMC/P,=MQ1CFA,=MQ1CFN,=MQ1EYO/P,=MQ1LCR,=MQ3DAO,=MQ3EPA,=MQ3GKI,=MQ3JAT,=MQ3NDB, + =MQ3OJA,=MQ3USK,=MQ3WPH,=MQ3ZCB/P,=MQ5AND,=MQ5EPA,=MQ5VZW,=MQ6DVP,=MQ6KLL,=MQ6MAU,=MQ6PAM,=MQ6PLC, + =MQ6RHD,=MQ6SEF,=MQ6TBD,=MQ6TBP,=MR0AQZ,=MR0BXJ,=MR0CVT,=MR0GUK,=MR0GXE,=MR0IDX,=MR0JGE,=MR0LAO, + =MR0LDJ,=MR0MAU,=MR0RLD,=MR0TTR,=MR0TTU,=MR0YAD,=MR0ZAP,=MR1CFN,=MR1EAA,=MR1LCR,=MR1MAJ/P,=MR1MDH, + =MR3AVB,=MR3AVC,=MR3CBF,=MR3NYR,=MR3OBL,=MR3SET/P,=MR3UFN,=MR3XZP,=MR3YKL,=MR3YLO,=MR3YVO, + =MR3ZCB/P,=MR5HOC,=MR6ADZ,=MR6KDA,=MR6VHF,=MR6YDP,=MV0AEL,=MV0BLM,=MV0EDX,=MV0GWT,=MV0GXE, + =MV0HGY/P,=MV0IML,=MV0LLK,=MV0PJJ,=MV0PJJ/P,=MV0RRD,=MV0SGD,=MV0SGR,=MV0TBB,=MV0TDQ,=MV0UAA, + =MV0USK,=MV0VRQ,=MV0WYN,=MV1CFA,=MV1CFN,=MV1EYP/P,=MV3RNI,=MV6CQN,=MV6GWR,=MV6GWR/P,=MV6URC, + =MV6ZOL,=MW0CND/2K,=MW0DHF/LH,=MW5AAM/2K,=MW5GOL/LH; +Solomon Islands: 28: 51: OC: -9.00: -160.00: -11.0: H4: + H4,=H40/H44RK; +Temotu Province: 32: 51: OC: -10.72: -165.80: -11.0: H40: + H40; +Hungary: 15: 28: EU: 47.12: -19.28: -1.0: HA: + HA,HG, + =HA3FPI/YL, + =HA5BA/YL,=HA5FQ/J,=HA5FQ/JOTA,=HA5YA/YL,=HA5YG/YL,=HG4I/LH; +Switzerland: 14: 28: EU: 46.87: -8.12: -1.0: HB: + HB,HE,=4U0G,=4U1AIDS,=4U1G,=HB9DAR/LH,=HB9DDZ/LH,=HB9DLO/LH,=HB9DWR/LH,=HB9OMI/LH,=HE1G/LGT; +Liechtenstein: 14: 28: EU: 47.13: -9.57: -1.0: HB0: + HB0,HE0; +Ecuador: 10: 12: SA: -1.40: 78.40: 5.0: HC: + HC,HD, + =HC8MA,=HC8MA/1, + =HC8GET/2; +Galapagos Islands: 10: 12: SA: -0.78: 91.03: 6.0: HC8: + HC8,HD8,=HC1HC/8,=HC2ANT/8,=HC2AO/8,=HC2AQ/8,=HC2IWM/8,=HC2OGT/8,=HC2RAT/8,=HC2RCT/8,=HC2RMT/8, + =HC2WAT/8,=HD9IWH/8; +Haiti: 08: 11: NA: 19.02: 72.18: 5.0: HH: + 4V,HH; +Dominican Republic: 08: 11: NA: 19.13: 70.68: 4.0: HI: + HI; +Colombia: 09: 12: SA: 5.00: 74.00: 5.0: HK: + 5J,5K,HJ,HK, + =HK0GU/1, + =HK0GU/3; +San Andres & Providencia: 07: 11: NA: 12.55: 81.72: 5.0: HK0/a: + 5J0,5K0,HJ0,HK0,=HK3ARR/0,=HK3OSA/0, + =HK3JJH/0, + =HK3JJH/0A(8),=HK3JJH/HK0A(8), + =HK3JJH/0B; +Malpelo Island: 09: 12: SA: 3.98: 81.58: 5.0: HK0/m: + HJ0M,HK0M,=HK0NA,=HK0TU,=HK3JJH/0M,=HK5MQZ/0,=HK5MQZ/0M,=HK5QGX/0,=HK5QGX/0M; +Republic of Korea: 25: 44: AS: 36.23: -127.90: -9.0: HL: + 6K,6L,6M,6N,D7,D8,D9,DS,DT,HL,KL9K,=6K50ACS/C,=DS50ARN/C,=DS50CYI/C,=DS50DBF/H,=DS50EXX/E, + =DS50GOO/C,=DS50HWS/E,=DS50KJR/L; +Panama: 07: 11: NA: 9.00: 80.00: 5.0: HP: + 3E,3F,H3,H8,H9,HO,HP, + =HP2TP/LH; +Honduras: 07: 11: NA: 15.00: 87.00: 6.0: HR: + HQ,HR; +Thailand: 26: 49: AS: 12.60: -99.70: -7.0: HS: + E2,HS; +Vatican City: 15: 28: EU: 41.90: -12.47: -1.0: HV: + HV,=HV50VR/IMD; +Saudi Arabia: 21: 39: AS: 24.20: -43.83: -3.0: HZ: + 7Z,8Z,HZ,=7Z1AL/ND,=7Z1AQ/ND,=7Z1BL/ND,=7Z1CQ/ND,=7Z1SJ/ND,=7Z1SS/M/ND,=7Z1TT/ND,=7Z1UG/ND, + =HZ1AN/ND,=HZ1BH/ND,=HZ1BL/ND,=HZ1BO/ND,=HZ1BT/ND,=HZ1BW/ND,=HZ1BW/ND/M,=HZ1CH/ND,=HZ1DG/ND, + =HZ1EA/ND,=HZ1FL/ND,=HZ1HN/M/ND,=HZ1HN/ND,=HZ1MD/ND,=HZ1MX/ND,=HZ1SBS/J,=HZ1SBS/JOTA,=HZ1SBS/ND, + =HZ1SK/ND,=HZ1TL/ND,=HZ1TT/ND,=HZ1XB/ND,=HZ1ZH/ND; +Italy: 15: 28: EU: 42.82: -12.58: -1.0: I: + I,=II0PN/MM(40),=II1RT/N, + =4U0WFP,=4U4F,=4U5F,=4U6F,=4U7F,=4U7FOC,=4U80FOC,=4U8F,=4U8FOC,=II0IDR/NAVY,=IK0ATK/N,=IK0CNA/LH, + =IK0JFS/N,=IK0XFD/N,=IQ0AP/J,=IQ0CV/LH,=IQ0FM/LH,=IQ0FR/LH,=IQ0GV/AAW,=IR0BP/J,=IT9ELM/0, + =IT9PQJ/0,=IU0FSC/LH,=IW0HP/N,=IW9GSH/0,=IZ0BXZ/N,=IZ0DBA/N,=IZ0EGC/N,=IZ0EUX/I/AZ,=IZ0FVD/N, + =IZ0HTW/PS,=IZ0HTW/SP,=IZ0IAT/LH,=IZ0IJC/FF,=IZ0IJC/N,=IZ0XZD/RO, + =I1MQ/N,=I1ULJ/N,=I1XSG/N,=I1YRL/GRA,=II1PV/LH,=IK1RED/N,=IK1VDN/N,=IP1T/LH,=IQ1L/LH,=IQ1NM/REX, + =IQ1SP/N,=IU1LCI/EMG,=IY1SP/ASB,=IY1SP/MTN,=IZ0IJC/BSM,=IZ1CLA/N,=IZ1ESH/EMG,=IZ1FCF/N, + =IZ1GDB/EMG,=IZ1POA/N,=IZ1RGI/ECO,=IZ5GST/1/LH, + =I2AZ/CA,=I2AZ/N,=I2CZQ/N,=IK2CZQ/N,=IK2FIQ/N,=IK2MKM/EXPO,=IK2SOE/CA,=IK2SOE/N,=IQ2LB/EXPO, + =IQ2MI/J,=IW2NUY/N,=IZ2MYA/EXPO, + =I3GJJ/J,=I3TXQ/N,=IK3TZB/N,=IQ3DD/MCC,=IQ3FL/J,=IQ3MV/LH,=IQ3TS/LH,=IW3BSQ/LH,=IZ3DBA/N, + =IZ3GHP/N,=IZ3QCH/N,=IZ3SZQ/N, + =I4CQO/N,=II4CPG/LH,=II4GOR/LH,=IK4UXA/4ME,=IQ4FA/J,=IQ4FJ/J,=IQ4RA/LH,=IQ4RN/LGT,=IQ4RN/LH, + =IT9RGY/4,=IW4EGX/LH,=IZ4AIH/J, + =I5OYY/N,=II5BP/J,=IK5IWU/N,=IK5TBI/I/CT,=IK5TBI/NAVY,=IK5TSZ/N,=IP5P/LH,=IQ5AA/J,=IQ5AE/J, + =IQ5LI/J,=IQ5LV/J,=IU5JHK/J,=IW5DAX/J,=IZ5AHB/N, + =I6DHY/CASA,=I6FDJ/LH,=I6FDJ/N,=I6HWD/CA,=I6HWD/LH,=I6KIU/6/LH,=IK6FAW/J,=IK6XOU/LH,=IK6XUL/LH, + =IK6YXM/N,=IQ6FU/LH,=IQ6PS/LH,=IQ6SB/LGH,=IQ6SB/LGT,=IQ6SB/LH,=IQ6VP/J,=IZ6ASI/LH,=IZ6ASI/N, + =IZ6CDI/O,=IZ6RWD/O,=IZ6TGS/LH,=IZ6TGS/N, + =4U13FEB,=4U1GSC,=4U20B,=4U24OCT,=4U25B,=4U29MAY,=4U73B,=4U9STAYHOME,=I7PXV/LH,=I7PXV/P/LH, + =I7XUW/MI/224,=II7IAOI/N,=II7PT/C,=II7PT/D,=II7PT/E,=II7PT/F,=II7PT/G,=II7PT/H,=II7PT/L, + =II8ICN/NAVY,=IK7JWX/LH,=IK7SHC/MT,=IQ7ML/J,=IQ7ML/LH,=IQ7QK/LH,=IU7SCT/J,=IZ2DPX/7/LH,=IZ7DKA/YL, + =IZ7KDX/LH,=IZ7LDC/LH, + =4U75B,=IK2RLS/8/LH,=IK8IJN/8US,=IK8IJN/I/US,=IK8TEO/N,=IK8VHP/OA,=IQ8OM/N,=IQ8PC/BWL,=IQ8XS/CEU, + =IQ8YZ/SH,=IS0FLV/8,=IT9AAK/8,=IU8CEU/8CZ,=IU8FWT/I/CP,=IW8EHK/8BN,=IW8FFG/J,=IZ8AJQ/LGT, + =IZ8AJQ/LH,=IZ8DBJ/LGT,=IZ8DBJ/LH,=IZ8FMU/KR,=IZ8IZK/YL,=IZ8JPV/N,=IZ8QNX/N,=IZ8VNQ/LI, + =IA5/IW3ILP/L, + =IC8/DJ5AA/LH, + =IN3IKF/J,=IN3TJK/YL, + =II3T/LH,=IQ3TS/LGT,=IQ3V/LH,=IV3DSB/I/BR,=IV3TRK/N; +African Italy: 33: 37: AF: 35.67: -12.67: -1.0: *IG9: + IG9,IH9,=IO9Y,=IY9A; +Sardinia: 15: 28: EU: 40.15: -9.27: -1.0: IS: + IM0,IS,IW0U,IW0V,IW0W,IW0X,IW0Y,IW0Z,=II0C,=II0EUDX,=II0FDR,=II0GD,=II0IADU,=II0IAML,=II0ICH, + =II0ICV,=II0IDP,=II0M,=II0MQP,=II0P,=II0PAX,=II0QSE,=II0RSB,=II0SB,=II0SB/MM,=II0SRE,=II0SRT/P, + =II3EUDX,=IO0MMI,=IQ0AG,=IQ0AG/P,=IQ0AH,=IQ0AH/P,=IQ0AI,=IQ0AI/P,=IQ0AK,=IQ0AK/P,=IQ0AL,=IQ0AL/P, + =IQ0AM,=IQ0AM/P,=IQ0EH,=IQ0EH/P,=IQ0HO,=IQ0ID,=IQ0ID/P,=IQ0JY,=IQ0NU,=IQ0NU/P,=IQ0NV,=IQ0NV/P, + =IQ0OG,=IQ0OH,=IQ0QP,=IQ0QP/LH,=IQ0QP/P,=IQ0SS,=IQ0SS/P,=IQ0US,=IQ0UT,=IQ0XP,=IR0EO,=IR0FOC, + =IR0IDP,=IR0IDP/1,=IR0IDP/2,=IR0IDP/3,=IR0LVC,=IR0MDC,=IS0/4Z5KJ/LH,=IS0/DL5SE/LH,=IS0FAP/I/LR, + =IS0ICE/N,=IS0IGV/N,=IS0PGF/N,=IS0SDX/N,=IW0HRI,=IY0GA,=IY0NV; +Sicily: 15: 28: EU: 37.50: -14.00: -1.0: *IT9: + IB9,ID9,IE9,IF9,II9,IJ9,IO9,IQ9,IR9,IT9,IU9,IW9,IY9,=II0GDF/9,=IQ1QQ/9,=IQ6KX/9,=IT9ACJ/I/BO, + =IT9CHU/J,=IT9CKA/CA,=IT9CLY/JZK,=IT9DSA/CA,=IT9DTU/N,=IT9GDS/WLK,=IT9HBS/LH,=IT9JZK/WLK, + =IT9KKE/JZK,=IT9MRM/N,=IT9MRZ/LH,=IT9NCO/LH,=IT9NCO/N,=IT9OTF/JZK,=IT9RRU/LH,=IT9RYH/J,=IT9RYH/N, + =IT9YBL/SG,=IT9ZSB/LH,=IW0HBY/9; +Djibouti: 37: 48: AF: 11.75: -42.35: -3.0: J2: + J2; +Grenada: 08: 11: NA: 12.13: 61.68: 4.0: J3: + J3; +Guinea-Bissau: 35: 46: AF: 12.02: 14.80: 0.0: J5: + J5; +St. Lucia: 08: 11: NA: 13.87: 61.00: 4.0: J6: + J6,=J69DS/LH; +Dominica: 08: 11: NA: 15.43: 61.35: 4.0: J7: + J7; +St. Vincent: 08: 11: NA: 13.23: 61.20: 4.0: J8: + J8; +Japan: 25: 45: AS: 36.40: -138.38: -9.0: JA: + 7J,7K,7L,7M,7N,8J,8K,8L,8M,8N,JA,JE,JF,JG,JH,JI,JJ,JK,JL,JM,JN,JO,JP,JQ,JR,JS,=7N2DAB/LH, + =JO1ZYB/L, + AGJ60,HTR60,IEJ60,ISG60,KJP60,KTD60,MMD60,MMY60,OGN60,OKA60,SHI60,TRA60,UEO60, + =7N4RHO/BM,=JE1LET/AE3RM,=JE1LET/VK3SS,=JE1XUZ/YOTA,=JH1NBN/DF2OO,=JH1NBN/DL1BD, + =JQ2UXA/YL, + =JD1BHH/6; +Minami Torishima: 27: 90: OC: 24.28: -153.97: -10.0: JD/m: + =8J1ZIU/JD1,=8N1AQ/JD1,=JA6GXK/JD1,=JD1/8J1ZIU,=JD1/8N1AQ,=JD1/JA6GXK,=JD1/JD1BIC,=JD1/JD1BNA, + =JD1/JD1YAB,=JD1/JE6XPF,=JD1/JF3CTR,=JD1/JF7MTO,=JD1/JF8HIQ,=JD1/JG1RHN,=JD1/JG8NQJ,=JD1/JH1EFP, + =JD1/JI2AMA,=JD1/JK1PCN,=JD1/JR8XXQ,=JD1BCK,=JD1BIC/JD1,=JD1BME,=JD1BMM,=JD1BNA/JD1,=JD1BND, + =JD1M/JI2AMA,=JD1YAA,=JD1YAB/JD1,=JD1YBJ,=JF3CTR/JD1,=JF7MTO/JD1,=JF8HIQ/JD1,=JG1RHN/JD1, + =JG8NQJ/JD1,=JH1EFP/JD1,=JI2AMA/JD1,=JK1PCN/JD1,=JR8XXQ/JD1; +Ogasawara: 27: 45: AS: 27.05: -142.20: -9.0: JD/o: + JD1,=8N1OGA,=JR7ISY/JD1/CM; +Mongolia: 23: 32: AS: 46.77: -102.17: -7.0: JT: + JT,JU,JV, + JT2[33],JU2[33],JV2[33], + JT3[33],JU3[33],JV3[33]; +Svalbard: 40: 18: EU: 78.00: -16.00: -1.0: JW: + JW; +Bear Island: 40: 18: EU: 74.43: -19.08: -1.0: *JW/b: + =JW/LB2PG,=JW0BEA,=JW1I,=JW2VOA,=JW3FL,=JW4GHA,=JW4JSA,=JW4LN,=JW5RIA,=JW7VW,=JW9JKA; +Jan Mayen: 40: 18: EU: 71.05: 8.28: 1.0: JX: + JX; +Jordan: 20: 39: AS: 31.18: -36.42: -2.0: JY: + JY; +United States: 05: 08: NA: 37.53: 91.67: 5.0: K: + AA,AB,AC,AD,AE,AF,AG,AI,AJ,AK,K,N,W,=NH7RO/M,=YL3IZ/MM, + AA0(4)[7],AB0(4)[7],AC0(4)[7],AD0(4)[7],AE0(4)[7],AF0(4)[7],AG0(4)[7],AI0(4)[7],AJ0(4)[7], + AK0(4)[7],K0(4)[7],KA0(4)[7],KB0(4)[7],KC0(4)[7],KD0(4)[7],KE0(4)[7],KF0(4)[7],KG0(4)[7], + KI0(4)[7],KJ0(4)[7],KK0(4)[7],KM0(4)[7],KN0(4)[7],KO0(4)[7],KQ0(4)[7],KR0(4)[7],KS0(4)[7], + KT0(4)[7],KU0(4)[7],KV0(4)[7],KW0(4)[7],KX0(4)[7],KY0(4)[7],KZ0(4)[7],N0(4)[7],NA0(4)[7], + NB0(4)[7],NC0(4)[7],ND0(4)[7],NE0(4)[7],NF0(4)[7],NG0(4)[7],NI0(4)[7],NJ0(4)[7],NK0(4)[7], + NM0(4)[7],NN0(4)[7],NO0(4)[7],NQ0(4)[7],NR0(4)[7],NS0(4)[7],NT0(4)[7],NU0(4)[7],NV0(4)[7], + NW0(4)[7],NX0(4)[7],NY0(4)[7],NZ0(4)[7],W0(4)[7],WA0(4)[7],WB0(4)[7],WC0(4)[7],WD0(4)[7], + WE0(4)[7],WF0(4)[7],WG0(4)[7],WI0(4)[7],WJ0(4)[7],WK0(4)[7],WM0(4)[7],WN0(4)[7],WO0(4)[7], + WQ0(4)[7],WR0(4)[7],WS0(4)[7],WT0(4)[7],WU0(4)[7],WV0(4)[7],WW0(4)[7],WX0(4)[7],WY0(4)[7], + WZ0(4)[7],=AH2BW(4)[7],=AH2BY(4)[7],=AH6ES/0(4)[7],=AH6FY(4)[7],=AH6MD(4)[7],=AH6N(4)[7], + =AH6N/0(4)[7],=AH6O(4)[7],=AH6OS(4)[7],=AH6PC(4)[7],=AH6RS(4)[7],=AH9C(4)[7],=AL0G(4)[7], + =AL2AK(4)[7],=AL3E(4)[7],=AL3V(4)[7],=AL6E(4)[7],=AL7BX(4)[7],=AL7EK(4)[7],=AL7FU(4)[7], + =AL7GQ(4)[7],=AL7NY(4)[7],=AL7O/0(4)[7],=AL7OX(4)[7],=AL7QQ(4)[7],=AL7QQ/P(4)[7],=AL9DB(4)[7], + =KH0EX(4)[7],=KH2CZ(4)[7],=KH2FM(4)[7],=KH2JK(4)[7],=KH2OP(4)[7],=KH2OP/0(4)[7],=KH2SL(4)[7], + =KH6DM(4)[7],=KH6HNL(4)[7],=KH6HTV(4)[7],=KH6HTV/0(4)[7],=KH6IQD(4)[7],=KH6JEM(4)[7], + =KH6JFH(4)[7],=KH6NM(4)[7],=KH6NR(4)[7],=KH6OY(4)[7],=KH6RON(4)[7],=KH6SB(4)[7],=KH6TL(4)[7], + =KH6UC(4)[7],=KH6VHF(4)[7],=KH6VO(4)[7],=KH7AL/M(4)[7],=KH7AL/P(4)[7],=KH7BU(4)[7],=KH7GF(4)[7], + =KH7HA(4)[7],=KH7HY(4)[7],=KH7OX(4)[7],=KH7QI(4)[7],=KH7QJ(4)[7],=KH7QT(4)[7],=KH8CW(4)[7], + =KL0DW(4)[7],=KL0EQ(4)[7],=KL0FOX(4)[7],=KL0GP(4)[7],=KL0GQ(4)[7],=KL0MW(4)[7],=KL0N(4)[7], + =KL0SV(4)[7],=KL0UP(4)[7],=KL0VM(4)[7],=KL0WIZ(4)[7],=KL0XM(4)[7],=KL0XN(4)[7],=KL1DS(4)[7], + =KL1HT(4)[7],=KL1IF(4)[7],=KL1IF/M(4)[7],=KL1J(4)[7],=KL1LD(4)[7],=KL1PV(4)[7],=KL1TU(4)[7], + =KL1V/M(4)[7],=KL1VN(4)[7],=KL2A/0(4)[7],=KL2BG(4)[7],=KL2FU(4)[7],=KL2GR(4)[7],=KL2NS(4)[7], + =KL2QO(4)[7],=KL2SX(4)[7],=KL2YI(4)[7],=KL3EM(4)[7],=KL3IW(4)[7],=KL3KZ(4)[7],=KL3LY(4)[7], + =KL3MA(4)[7],=KL3MB(4)[7],=KL3MC(4)[7],=KL3MW(4)[7],=KL3MZ(4)[7],=KL3QS(4)[7],=KL3SM(4)[7], + =KL3VN(4)[7],=KL4IY(4)[7],=KL4JN(4)[7],=KL7DTJ(4)[7],=KL7DYS(4)[7],=KL7ED(4)[7],=KL7EP(4)[7], + =KL7EP/0(4)[7],=KL7GKY/0(4)[7],=KL7GLK(4)[7],=KL7GLK/0(4)[7],=KL7GLK/B(4)[7],=KL7HR(4)[7], + =KL7IWT(4)[7],=KL7IXI(4)[7],=KL7JGJ(4)[7],=KL7JIE(4)[7],=KL7JIM(4)[7],=KL7JR/0(4)[7],=KL7MH(4)[7], + =KL7MP(4)[7],=KL7MV(4)[7],=KL7NW(4)[7],=KL7PE/M(4)[7],=KL7QW(4)[7],=KL7QW/0(4)[7],=KL7RH(4)[7], + =KL7RZ(4)[7],=KL7SB/0(4)[7],=KL7SFD(4)[7],=KL7UV(4)[7],=KL7XH(4)[7],=KL7YL(4)[7],=KL7YY/0(4)[7], + =KL7ZD(4)[7],=KL7ZT(4)[7],=KP2X(4)[7],=KP2Y(4)[7],=KP4ATV(4)[7],=KP4MLF(4)[7],=KP4XZ(4)[7], + =NH0AD(4)[7],=NH2LH(4)[7],=NH6CF(4)[7],=NH6EU(4)[7],=NH6LR(4)[7],=NH6WF(4)[7],=NH7CY(4)[7], + =NH7FI(4)[7],=NH7XM(4)[7],=NH7ZH(4)[7],=NL7AS(4)[7],=NL7BU(4)[7],=NL7CO/M(4)[7],=NL7CQ(4)[7], + =NL7CQ/0(4)[7],=NL7FF(4)[7],=NL7FU(4)[7],=NL7SB(4)[7],=NL7T(4)[7],=NL7XT(4)[7],=NL7XU(4)[7], + =NL7ZG(4)[7],=NP3XP(4)[7],=NP4AI(4)[7],=NP4AI/0(4)[7],=VE4AGT/M(4)[7],=VE4XC/M(4)[7],=WH2S(4)[7], + =WH2Z(4)[7],=WH6AKZ(4)[7],=WH6ANH(4)[7],=WH6BLT(4)[7],=WH6BUL(4)[7],=WH6BXD(4)[7],=WH6CTU(4)[7], + =WH6CUE(4)[7],=WH6CYM(4)[7],=WH6CZI(4)[7],=WH6CZU(4)[7],=WH6DCJ(4)[7],=WH6DUV(4)[7],=WH6DXA(4)[7], + =WH6EAA(4)[7],=WH6EAE(4)[7],=WH6ENX(4)[7],=WH6FBM(4)[7],=WH6LR(4)[7],=WH6MS(4)[7],=WH6QS(4)[7], + =WH7IR(4)[7],=WH7MZ(4)[7],=WH9AAH(4)[7],=WL0JF(4)[7],=WL1ON(4)[7],=WL7AEC(4)[7],=WL7AJA(4)[7], + =WL7ANY(4)[7],=WL7ATK(4)[7],=WL7BRV(4)[7],=WL7BT(4)[7],=WL7CEG(4)[7],=WL7CLI(4)[7],=WL7CPW(4)[7], + =WL7CQF(4)[7],=WL7CRT(4)[7],=WL7CY(4)[7],=WL7J(4)[7],=WL7JB(4)[7],=WL7LZ(4)[7],=WL7LZ/M(4)[7], + =WL7RV(4)[7],=WL7S(4)[7],=WL7YM(4)[7],=WP2B/0(4)[7],=WP3QH(4)[7],=WP4BTQ(4)[7],=WP4GQR(4)[7], + =WP4LC(4)[7],=WP4LEY(4)[7],=WP4NPV(4)[7], + =AH2V(5)[8],=AH2W(5)[8],=AH6BV(5)[8],=AL0A(5)[8],=AL1K(5)[8],=AL1O(5)[8],=AL4V(5)[8],=AL6L(5)[8], + =AL6M(5)[8],=AL7GD(5)[8],=AL7LV(5)[8],=AL7QS(5)[8],=AL8A(5)[8],=AL8E(5)[8],=KH2AB(5)[8], + =KH2AK(5)[8],=KH2BA(5)[8],=KH2EH(5)[8],=KH6GR(5)[8],=KH6HZ(5)[8],=KH6IKI(5)[8],=KH6JKQ(5)[8], + =KH6JUK(5)[8],=KH6RF(5)[8],=KH6RF/1(5)[8],=KH6RF/M(5)[8],=KH7CD(5)[8],=KH7CD/1(5)[8],=KH7PL(5)[8], + =KH8AC(5)[8],=KH8AC/1(5)[8],=KL1OC(5)[8],=KL1T(5)[8],=KL1WD(5)[8],=KL2A/1(5)[8],=KL2DM(5)[8], + =KL2GA(5)[8],=KL2IC(5)[8],=KL2KL(5)[8],=KL2MU(5)[8],=KL3UX(5)[8],=KL3VA(5)[8],=KL4XK(5)[8], + =KL7CE/1(5)[8],=KL7IOP(5)[8],=KL7IXX(5)[8],=KL7JAU(5)[8],=KL7JHM(5)[8],=KL7JJN(5)[8], + =KL7JR/1(5)[8],=KL7JT(5)[8],=KL7USI/1(5)[8],=KL8DX(5)[8],=KP4AMC(5)[8],=KP4BLS(5)[8], + =KP4BPR(5)[8],=KP4DGF(5)[8],=KP4EC/1(5)[8],=KP4G(5)[8],=KP4GVT(5)[8],=KP4JC(5)[8],=KP4JLD(5)[8], + =KP4KWB(5)[8],=KP4MHG(5)[8],=KP4MR(5)[8],=KP4NBI(5)[8],=KP4NPL(5)[8],=KP4NW(5)[8],=KP4R(5)[8], + =KP4RCD(5)[8],=KP4RMM(5)[8],=KP4WPD(5)[8],=KP4ZEM(5)[8],=NH0H(5)[8],=NH6IH(5)[8],=NH6XW(5)[8], + =NH6ZB(5)[8],=NL7AK(5)[8],=NL7FJ(5)[8],=NL7FJ/1(5)[8],=NL7MO(5)[8],=NL7NJ(5)[8],=NL7OI(5)[8], + =NL7OT(5)[8],=NL7SH(5)[8],=NL9H(5)[8],=NP2FZ(5)[8],=NP2FZ/1(5)[8],=NP2GG(5)[8],=NP2PN(5)[8], + =NP3IV(5)[8],=NP3LN(5)[8],=NP3WX(5)[8],=NP4AO(5)[8],=NP4AZ(5)[8],=NP4ER(5)[8],=VE1BES/M(5)[8], + =VE3CMB/M(5)[8],=VE4CCN/M(5)[8],=WH0EWX(5)[8],=WH2B(5)[8],=WH6CT(5)[8],=WH6DSN(5)[8],=WH6EI(5)[8], + =WH6FBH(5)[8],=WH6MY(5)[8],=WH6SW(5)[8],=WH6SW/1(5)[8],=WH7TP(5)[8],=WH7YQ(5)[8],=WH7YR(5)[8], + =WL1B(5)[8],=WL7B(5)[8],=WL7CC(5)[8],=WL7CUP(5)[8],=WL7CVD(5)[8],=WL7WO(5)[8],=WL7WO/1(5)[8], + =WL7Z/1(5)[8],=WP2MG(5)[8],=WP3AC(5)[8],=WP3GN(5)[8],=WP3NN(5)[8],=WP3QV(5)[8],=WP3QV/1(5)[8], + =WP3WV(5)[8],=WP4AKE(5)[8],=WP4AZJ(5)[8],=WP4BC(5)[8],=WP4BF(5)[8],=WP4CGI(5)[8],=WP4CJH(5)[8], + =WP4JF(5)[8],=WP4KQ(5)[8],=WP4MKJ(5)[8],=WP4MMV(5)[8],=WP4MOC(5)[8],=WP4NKW(5)[8],=WP4NUV(5)[8], + =WP4NYT(5)[8],=WP4NYY(5)[8],=WP4OFO(5)[8],=WP4OIG(5)[8],=WP4OJK(5)[8],=WP4RQ(5)[8], + =AH0BR(5)[8],=AH2AL(5)[8],=AH2CG(5)[8],=AH2O(5)[8],=AH2P(5)[8],=AH6K(5)[8],=AL0Q(5)[8], + =AL0Y(5)[8],=AL2O(5)[8],=AL7RG(5)[8],=AL7RK(5)[8],=KH2CW(5)[8],=KH2P(5)[8],=KH2R(5)[8], + =KH4AG(5)[8],=KH6ALN(5)[8],=KH6HFO(5)[8],=KH6HO(5)[8],=KH7GA(5)[8],=KH7JO(5)[8],=KH7JO/2(5)[8], + =KH7MX(5)[8],=KH7NE(5)[8],=KH8ZK(5)[8],=KL0TV(5)[8],=KL0VD(5)[8],=KL0VE(5)[8],=KL0WV(5)[8], + =KL1A/2(5)[8],=KL1LA(5)[8],=KL2A/2(5)[8],=KL2NP(5)[8],=KL2TP(5)[8],=KL3ZC(5)[8],=KL4T(5)[8], + =KL7DL(5)[8],=KL7GB(5)[8],=KL7JCQ(5)[8],=KL7NL/2(5)[8],=KL7TJZ(5)[8],=KL7USI/2(5)[8],=KL7WA(5)[8], + =KL9ER(5)[8],=KP2NP(5)[8],=KP3AK(5)[8],=KP3FT(5)[8],=KP3LM(5)[8],=KP3Y(5)[8],=KP4AK(5)[8], + =KP4ASG(5)[8],=KP4CML(5)[8],=KP4CMR(5)[8],=KP4HR(5)[8],=KP4I(5)[8],=KP4JDR(5)[8],=KP4JMP(5)[8], + =NH2DC(5)[8],=NH7NA(5)[8],=NH7TN(5)[8],=NL7CC(5)[8],=NL7JY(5)[8],=NL7VP(5)[8],=NP2AQ(5)[8], + =NP2GI(5)[8],=NP3D(5)[8],=NP3E(5)[8],=NP3EU(5)[8],=NP3KH(5)[8],=NP3KP(5)[8],=NP4H(5)[8], + =NP4IR(5)[8],=NP4IT(5)[8],=NP4JQ(5)[8],=WH0W(5)[8],=WH2C(5)[8],=WH6DLD(5)[8],=WH6DNT(5)[8], + =WH6EHT(5)[8],=WH6FRH(5)[8],=WH6UO(5)[8],=WH7ZS(5)[8],=WL2NAS(5)[8],=WL7OG(5)[8],=WP2AAO(5)[8], + =WP2AGY(5)[8],=WP3FU(5)[8],=WP3MD(5)[8],=WP3VU(5)[8],=WP3WZ(5)[8],=WP4BMU(5)[8],=WP4BNI(5)[8], + =WP4BZ(5)[8],=WP4CB(5)[8],=WP4DME(5)[8],=WP4DWH(5)[8],=WP4EHY(5)[8],=WP4EYW(5)[8],=WP4HLY(5)[8], + =WP4HXS(5)[8],=WP4IVW(5)[8],=WP4KXX(5)[8],=WP4LFO(5)[8],=WP4LYI(5)[8],=WP4MQN(5)[8],=WP4MRB(5)[8], + =WP4MUJ(5)[8],=WP4MYM(5)[8],=WP4MZO(5)[8],=WP4NBS(5)[8],=WP4NZF(5)[8],=WP4OCO(5)[8],=WP4OPY(5)[8], + =WP4PZB(5)[8],=WP4R(5)[8],=XL3TUV/M(5)[8],=XM3CMB/M(5)[8], + =4U1WB(5)[8],=AH6AX(5)[8],=AH6FF/3(5)[8],=AH6R(5)[8],=AH6Z(5)[8],=AH7J(5)[8],=AH8P(5)[8], + =AL1B(5)[8],=AL1B/M(5)[8],=AL2G(5)[8],=AL3C(5)[8],=AL7AB(5)[8],=AL7NN(5)[8],=AL7NN/3(5)[8], + =AL7RS(5)[8],=KH2EI(5)[8],=KH2JH(5)[8],=KH2JX(5)[8],=KH2SX(5)[8],=KH6CUJ(5)[8],=KH6GRG(5)[8], + =KH6ILR/3(5)[8],=KH6JGA(5)[8],=KH6LDO(5)[8],=KH6PX(5)[8],=KH6RE(5)[8],=KH8CN(5)[8],=KL1CNN(5)[8], + =KL1HA(5)[8],=KL1KM(5)[8],=KL2A/3(5)[8],=KL2BV(5)[8],=KL2UR(5)[8],=KL2XF(5)[8],=KL7FD(5)[8], + =KL7GLK/3(5)[8],=KL7HR/3(5)[8],=KL7IUI(5)[8],=KL7IUI/3(5)[8],=KL7JO(5)[8],=KL7OF/3(5)[8], + =KL7OQ(5)[8],=KL7YN(5)[8],=KL9A/3(5)[8],=KP3M(5)[8],=KP3N(5)[8],=KP4BEP(5)[8],=KP4CAM(5)[8], + =KP4FCF(5)[8],=KP4GB/3(5)[8],=KP4IP(5)[8],=KP4JB(5)[8],=KP4N(5)[8],=KP4N/3(5)[8],=KP4PRI(5)[8], + =KP4UV(5)[8],=KP4VW(5)[8],=KP4WR(5)[8],=KP4XO(5)[8],=KP4XX(5)[8],=KP4YH(5)[8],=NH2CW(5)[8], + =NH2LA(5)[8],=NH6BD(5)[8],=NH6BK(5)[8],=NH7C(5)[8],=NH7C/3(5)[8],=NH7CC(5)[8],=NH7TV(5)[8], + =NH7YK(5)[8],=NL7CK(5)[8],=NL7PJ(5)[8],=NL7V/3(5)[8],=NL7WA(5)[8],=NL7XM(5)[8],=NL7XM/B(5)[8], + =NP2EP(5)[8],=NP2G(5)[8],=NP2NC(5)[8],=NP3ES(5)[8],=NP3IP(5)[8],=NP3YN(5)[8],=NP4RH(5)[8], + =NP4YZ(5)[8],=WH6ADS(5)[8],=WH6AWO(5)[8],=WH6AZN(5)[8],=WH6CE(5)[8],=WH6CTO(5)[8],=WH6DOA(5)[8], + =WH6ECO(5)[8],=WH6EEL(5)[8],=WH6EEN(5)[8],=WH6EIJ(5)[8],=WH6FPS(5)[8],=WH6GEU(5)[8],=WH6IO(5)[8], + =WH6OB(5)[8],=WH6RN(5)[8],=WH7F(5)[8],=WH7USA(5)[8],=WL7AF(5)[8],=WL7L(5)[8],=WP2XX(5)[8], + =WP3BX(5)[8],=WP3CC(5)[8],=WP3EC(5)[8],=WP3FK(5)[8],=WP4DA(5)[8],=WP4DCK(5)[8],=WP4EDM(5)[8], + =WP4GJL(5)[8],=WP4HRK(5)[8],=WP4HSZ(5)[8],=WP4IYE(5)[8],=WP4KDN(5)[8],=WP4KKX(5)[8],=WP4KTU(5)[8], + =WP4LEM(5)[8],=WP4LNP(5)[8],=WP4LTI(5)[8],=WP4MNV(5)[8],=WP4MSX(5)[8],=WP4MYN(5)[8],=WP4NXG(5)[8], + =WP4OSQ(5)[8],=WP4PPH(5)[8],=WP4PQN(5)[8],=WP4PUR(5)[8],=WP4PYL(5)[8],=WP4PYM(5)[8],=WP4PYU(5)[8], + =WP4PYV(5)[8],=WP4PYZ(5)[8],=WP4PZA(5)[8], + =AH0BV(5)[8],=AH0BZ(5)[8],=AH0G(5)[8],=AH2AJ(5)[8],=AH2AM(5)[8],=AH2AV/4(5)[8],=AH2DF(5)[8], + =AH2EB(5)[8],=AH2EJ(5)[8],=AH2X(5)[8],=AH3B(5)[8],=AH6AL(5)[8],=AH6AT(5)[8],=AH6AU(5)[8], + =AH6BJ(5)[8],=AH6C(5)[8],=AH6EZ/4(5)[8],=AH6FX(5)[8],=AH6FX/4(5)[8],=AH6IC(5)[8],=AH6IW(5)[8], + =AH6JH(5)[8],=AH6JN/4(5)[8],=AH6JN/M(5)[8],=AH6KS(5)[8],=AH6KT(5)[8],=AH6KT/4(5)[8],=AH6LQ(5)[8], + =AH6LS(5)[8],=AH6OB(5)[8],=AH6TI(5)[8],=AH7DN(5)[8],=AH7I(5)[8],=AH7I/4(5)[8],=AH7MI(5)[8], + =AH8B(5)[8],=AH8M(5)[8],=AH8M/M(5)[8],=AH8R(5)[8],=AH8T(5)[8],=AL0I(5)[8],=AL1A(5)[8],=AL3G(5)[8], + =AL3M(5)[8],=AL4T(5)[8],=AL4T/4(5)[8],=AL4U(5)[8],=AL4X(5)[8],=AL5A(5)[8],=AL7AL(5)[8], + =AL7AM(5)[8],=AL7BA(5)[8],=AL7FR(5)[8],=AL7GF(5)[8],=AL7GK(5)[8],=AL7HG(5)[8],=AL7HW(5)[8], + =AL7HW/4(5)[8],=AL7IS(5)[8],=AL7KI(5)[8],=AL7KT(5)[8],=AL7LH(5)[8],=AL7LJ(5)[8],=AL7NL(5)[8], + =AL7NM(5)[8],=AL7NS(5)[8],=AL7NS/140(5)[8],=AL7PL(5)[8],=AL7QI(5)[8],=AL7RB(5)[8],=AL7RE(5)[8], + =AL7RL(5)[8],=G8ERJ(5)[8],=GO4AZM(5)[8],=GQ4AZM(5)[8],=GR4AZM(5)[8],=KH0CW(5)[8],=KH0G(5)[8], + =KH0HR(5)[8],=KH0NI(5)[8],=KH0ZZ(5)[8],=KH2D(5)[8],=KH2D/4(5)[8],=KH2GUM/P(5)[8],=KH2HB(5)[8], + =KH2KD(5)[8],=KH2NC(5)[8],=KH2PM(5)[8],=KH2RL(5)[8],=KH2TI(5)[8],=KH2UG(5)[8],=KH2UV(5)[8], + =KH2UY(5)[8],=KH2UZ(5)[8],=KH2VB(5)[8],=KH2VM(5)[8],=KH3AC(5)[8],=KH3AG(5)[8],=KH6AE(5)[8], + =KH6AHQ(5)[8],=KH6AME(5)[8],=KH6CG(5)[8],=KH6CG/4(5)[8],=KH6CT(5)[8],=KH6ED(5)[8],=KH6FHS(5)[8], + =KH6HHS(5)[8],=KH6HHS/4(5)[8],=KH6HOW(5)[8],=KH6ILR(5)[8],=KH6ILR/4(5)[8],=KH6ITI(5)[8], + =KH6JAU(5)[8],=KH6JJD(5)[8],=KH6JNW(5)[8],=KH6JUA(5)[8],=KH6KZ(5)[8],=KH6M(5)[8],=KH6M/4(5)[8], + =KH6M/M(5)[8],=KH6MT(5)[8],=KH6MT/4(5)[8],=KH6NC(5)[8],=KH6NI(5)[8],=KH6OU(5)[8],=KH6POI(5)[8], + =KH6PU(5)[8],=KH6RP(5)[8],=KH6TY(5)[8],=KH6TY/R(5)[8],=KH6UN(5)[8],=KH6WE(5)[8],=KH6WY(5)[8], + =KH6XH(5)[8],=KH7DA(5)[8],=KH7DM(5)[8],=KH7DY(5)[8],=KH7FC(5)[8],=KH7FU(5)[8],=KH7GM(5)[8], + =KH7GZ(5)[8],=KH7HJ/4(5)[8],=KH7OC(5)[8],=KH7OV(5)[8],=KH7WK(5)[8],=KH7WU(5)[8],=KH7XS/4(5)[8], + =KH7XT(5)[8],=KH7ZC(5)[8],=KH8DO(5)[8],=KH8U(5)[8],=KL0AG(5)[8],=KL0BG(5)[8],=KL0IP(5)[8], + =KL0KC(5)[8],=KL0KE/4(5)[8],=KL0L(5)[8],=KL0MG(5)[8],=KL0MP(5)[8],=KL0S(5)[8],=KL0SS(5)[8], + =KL0ST(5)[8],=KL0TY(5)[8],=KL0UA(5)[8],=KL0UD(5)[8],=KL0VU(5)[8],=KL0WF(5)[8],=KL1AN(5)[8], + =KL1AV(5)[8],=KL1KP(5)[8],=KL1NK(5)[8],=KL1NS(5)[8],=KL1OK(5)[8],=KL1PA(5)[8],=KL1SS(5)[8], + =KL2AK(5)[8],=KL2CX(5)[8],=KL2EY(5)[8],=KL2GG(5)[8],=KL2GP(5)[8],=KL2HV(5)[8],=KL2MQ(5)[8], + =KL2NN(5)[8],=KL2UM(5)[8],=KL2UQ(5)[8],=KL2XI(5)[8],=KL3BG(5)[8],=KL3EV(5)[8],=KL3FA(5)[8], + =KL3HG(5)[8],=KL3IA(5)[8],=KL3KB(5)[8],=KL3KG(5)[8],=KL3NR(5)[8],=KL3SH(5)[8],=KL3WM(5)[8], + =KL3X(5)[8],=KL3XB(5)[8],=KL4CO(5)[8],=KL4DD(5)[8],=KL4H(5)[8],=KL4J(5)[8],=KL4XR(5)[8], + =KL5X(5)[8],=KL5YJ(5)[8],=KL7A(5)[8],=KL7AF(5)[8],=KL7DA(5)[8],=KL7DA/4(5)[8],=KL7EA(5)[8], + =KL7FO(5)[8],=KL7GLL(5)[8],=KL7H(5)[8],=KL7HIM(5)[8],=KL7HJZ(5)[8],=KL7HNY(5)[8],=KL7HOT(5)[8], + =KL7HQW(5)[8],=KL7HV(5)[8],=KL7HX(5)[8],=KL7I(5)[8],=KL7IEK(5)[8],=KL7IKZ(5)[8],=KL7IV(5)[8], + =KL7IVY(5)[8],=KL7IWF(5)[8],=KL7JDS(5)[8],=KL7JR(5)[8],=KL7LS(5)[8],=KL7MJ(5)[8],=KL7NCO(5)[8], + =KL7NL(5)[8],=KL7NL/4(5)[8],=KL7NT(5)[8],=KL7OO(5)[8],=KL7P/4(5)[8],=KL7PS(5)[8],=KL7QH(5)[8], + =KL7QU(5)[8],=KL7SR(5)[8],=KL7TZ(5)[8],=KL9A/1(5)[8],=KP2AF(5)[8],=KP2AV(5)[8],=KP2AV/4(5)[8], + =KP2BU(5)[8],=KP2CH(5)[8],=KP2CR(5)[8],=KP2L(5)[8],=KP2L/4(5)[8],=KP2N(5)[8],=KP2QL(5)[8], + =KP2R(5)[8],=KP2U(5)[8],=KP2US(5)[8],=KP2V(5)[8],=KP3AMG(5)[8],=KP3BL(5)[8],=KP3BP(5)[8], + =KP3SK(5)[8],=KP3SW(5)[8],=KP3U(5)[8],=KP4AD(5)[8],=KP4AOD(5)[8],=KP4AOD/4(5)[8],=KP4AYI(5)[8], + =KP4BBN(5)[8],=KP4BEC(5)[8],=KP4BM(5)[8],=KP4BOB(5)[8],=KP4CBP(5)[8],=KP4CEL(5)[8],=KP4CH(5)[8], + =KP4CJ(5)[8],=KP4CPP(5)[8],=KP4CSJ(5)[8],=KP4CSZ(5)[8],=KP4CW(5)[8],=KP4CZ(5)[8],=KP4DAC(5)[8], + =KP4DDS(5)[8],=KP4DPQ(5)[8],=KP4DQS(5)[8],=KP4EDL(5)[8],=KP4EF(5)[8],=KP4EH(5)[8],=KP4EIA(5)[8], + =KP4EMY(5)[8],=KP4ENK(5)[8],=KP4EOR(5)[8],=KP4EOR/4(5)[8],=KP4ERT(5)[8],=KP4ESC(5)[8], + =KP4FBS(5)[8],=KP4FFO(5)[8],=KP4FGI(5)[8],=KP4FIR(5)[8],=KP4FJE(5)[8],=KP4FLP(5)[8],=KP4FOF(5)[8], + =KP4GW(5)[8],=KP4HE(5)[8],=KP4HN(5)[8],=KP4II(5)[8],=KP4IRI(5)[8],=KP4IT(5)[8],=KP4JCC(5)[8], + =KP4JOS(5)[8],=KP4JWR(5)[8],=KP4KA(5)[8],=KP4KD(5)[8],=KP4KD/4(5)[8],=KP4KE/4(5)[8],=KP4KF(5)[8], + =KP4LEU(5)[8],=KP4LF(5)[8],=KP4LMD(5)[8],=KP4LQ(5)[8],=KP4LUV(5)[8],=KP4LX(5)[8],=KP4MA(5)[8], + =KP4MMG(5)[8],=KP4MPR(5)[8],=KP4MSP(5)[8],=KP4ND(5)[8],=KP4NI(5)[8],=KP4OO(5)[8],=KP4PC(5)[8], + =KP4PEC(5)[8],=KP4PF(5)[8],=KP4PM(5)[8],=KP4PMD(5)[8],=KP4Q(5)[8],=KP4QT(5)[8],=KP4QT/4(5)[8], + =KP4REY(5)[8],=KP4RGD(5)[8],=KP4RGT(5)[8],=KP4ROP(5)[8],=KP4RRC(5)[8],=KP4RT(5)[8],=KP4RZ(5)[8], + =KP4SU(5)[8],=KP4SWR(5)[8],=KP4TL(5)[8],=KP4UFO(5)[8],=KP4USA(5)[8],=KP4VMR(5)[8],=KP4VO(5)[8], + =KP4WK(5)[8],=KP4WW(5)[8],=KP4WY(5)[8],=KP4XP(5)[8],=KP4Y(5)[8],=KP4YLV(5)[8],=KP4ZF(5)[8], + =KP4ZV(5)[8],=KP4ZX(5)[8],=NH2A(5)[8],=NH2BQ(5)[8],=NH2DB(5)[8],=NH2F(5)[8],=NH2GY(5)[8], + =NH2KW(5)[8],=NH2NG(5)[8],=NH6AU(5)[8],=NH6AX(5)[8],=NH6BD/4(5)[8],=NH6E(5)[8],=NH6GE(5)[8], + =NH6GR(5)[8],=NH6HX(5)[8],=NH6HX/4(5)[8],=NH6JX(5)[8],=NH6KI(5)[8],=NH6QR(5)[8],=NH6SR(5)[8], + =NH6SZ(5)[8],=NH6T(5)[8],=NH6TL(5)[8],=NH7AA(5)[8],=NH7AQ(5)[8],=NH7AR(5)[8],=NH7FG(5)[8], + =NH7FV(5)[8],=NH7OI(5)[8],=NH7P(5)[8],=NH7T/4(5)[8],=NH7UN(5)[8],=NH7XN(5)[8],=NH7YL(5)[8], + =NL7AJ(5)[8],=NL7AU(5)[8],=NL7AU/4(5)[8],=NL7BV(5)[8],=NL7KL(5)[8],=NL7KX(5)[8],=NL7LO(5)[8], + =NL7LR(5)[8],=NL7LY(5)[8],=NL7MD(5)[8],=NL7MR(5)[8],=NL7OB(5)[8],=NL7OS(5)[8],=NL7P(5)[8], + =NL7PV(5)[8],=NL7U(5)[8],=NL7UP(5)[8],=NL7VV(5)[8],=NL7VX(5)[8],=NL7VX/4(5)[8],=NL7VX/M(5)[8], + =NL7YZ(5)[8],=NP2B(5)[8],=NP2B/4(5)[8],=NP2BB(5)[8],=NP2BW(5)[8],=NP2C/4(5)[8],=NP2CB(5)[8], + =NP2D(5)[8],=NP2DB(5)[8],=NP2DJ(5)[8],=NP2EI(5)[8],=NP2FJ(5)[8],=NP2FT(5)[8],=NP2GN(5)[8], + =NP2GW(5)[8],=NP2HQ(5)[8],=NP2HS(5)[8],=NP2HW(5)[8],=NP2IE(5)[8],=NP2IF(5)[8],=NP2IJ(5)[8], + =NP2IS(5)[8],=NP2IW(5)[8],=NP2IX(5)[8],=NP2JA(5)[8],=NP2JS(5)[8],=NP2JV(5)[8],=NP2L(5)[8], + =NP2LC(5)[8],=NP2MM(5)[8],=NP2MN(5)[8],=NP2MP(5)[8],=NP2MR(5)[8],=NP2MR/4(5)[8],=NP2O(5)[8], + =NP2OL(5)[8],=NP2OO(5)[8],=NP2OR(5)[8],=NP2PA(5)[8],=NP2R(5)[8],=NP2T(5)[8],=NP2W(5)[8], + =NP3AX(5)[8],=NP3BL(5)[8],=NP3CC(5)[8],=NP3CI(5)[8],=NP3CM(5)[8],=NP3CT(5)[8],=NP3FR(5)[8], + =NP3G(5)[8],=NP3HD(5)[8],=NP3HG(5)[8],=NP3HN(5)[8],=NP3HP(5)[8],=NP3HU(5)[8],=NP3IL(5)[8], + =NP3IU(5)[8],=NP3K(5)[8],=NP3KM(5)[8],=NP3MM(5)[8],=NP3MX(5)[8],=NP3NC(5)[8],=NP3OW(5)[8], + =NP3QT(5)[8],=NP3R(5)[8],=NP3ST(5)[8],=NP3TM(5)[8],=NP3UM(5)[8],=NP3VJ(5)[8],=NP4AS(5)[8], + =NP4AV(5)[8],=NP4CC(5)[8],=NP4CK(5)[8],=NP4CV(5)[8],=NP4DM(5)[8],=NP4EM(5)[8],=NP4GH(5)[8], + =NP4J(5)[8],=NP4JL(5)[8],=NP4JU(5)[8],=NP4KV(5)[8],=NP4M(5)[8],=NP4ND(5)[8],=NP4PF(5)[8], + =NP4RJ(5)[8],=NP4SY(5)[8],=NP4TR(5)[8],=NP4WT(5)[8],=NP4XB(5)[8],=NP4ZC(5)[8],=WH2AAT(5)[8], + =WH2ABJ(5)[8],=WH2G(5)[8],=WH6A(5)[8],=WH6ACF(5)[8],=WH6AJS(5)[8],=WH6AQ(5)[8],=WH6AVU(5)[8], + =WH6AX(5)[8],=WH6BRQ(5)[8],=WH6CEF(5)[8],=WH6CMT(5)[8],=WH6CNC(5)[8],=WH6CTC(5)[8],=WH6CXA(5)[8], + =WH6CXT(5)[8],=WH6DBX(5)[8],=WH6DMJ(5)[8],=WH6DNF(5)[8],=WH6DOL(5)[8],=WH6DUJ(5)[8],=WH6DXT(5)[8], + =WH6DZ(5)[8],=WH6ECQ(5)[8],=WH6EFI(5)[8],=WH6EFX(5)[8],=WH6EIK(5)[8],=WH6EIR(5)[8],=WH6EKW(5)[8], + =WH6ELG(5)[8],=WH6ELM(5)[8],=WH6ETE(5)[8],=WH6ETF(5)[8],=WH6FCP(5)[8],=WH6GHO(5)[8],=WH6HA(5)[8], + =WH6IF(5)[8],=WH6IZ(5)[8],=WH6J(5)[8],=WH6L(5)[8],=WH6LE(5)[8],=WH6LE/4(5)[8],=WH6LE/M(5)[8], + =WH6LE/P(5)[8],=WH6NE(5)[8],=WH6NU(5)[8],=WH6WX(5)[8],=WH6YH(5)[8],=WH6YH/4(5)[8],=WH6YM(5)[8], + =WH6ZF(5)[8],=WH7GD(5)[8],=WH7HX(5)[8],=WH7NI(5)[8],=WH7XK(5)[8],=WH7XU(5)[8],=WH7YL(5)[8], + =WH7YV(5)[8],=WH7ZM(5)[8],=WH9AAF(5)[8],=WL4X(5)[8],=WL7AUL(5)[8],=WL7AX(5)[8],=WL7CHA(5)[8], + =WL7CIB(5)[8],=WL7CKJ(5)[8],=WL7COL(5)[8],=WL7CPA(5)[8],=WL7CQT(5)[8],=WL7CUY(5)[8],=WL7E/4(5)[8], + =WL7GV(5)[8],=WL7IO(5)[8],=WL7JE(5)[8],=WL7SR(5)[8],=WL7UN(5)[8],=WL7YX(5)[8],=WP2AGD(5)[8], + =WP2AGO(5)[8],=WP2AHC(5)[8],=WP2AIG(5)[8],=WP2AIL(5)[8],=WP2BB(5)[8],=WP2C(5)[8],=WP2J(5)[8], + =WP2L(5)[8],=WP2MA(5)[8],=WP2P(5)[8],=WP3AY(5)[8],=WP3BC(5)[8],=WP3DW(5)[8],=WP3HL(5)[8], + =WP3IM(5)[8],=WP3JE(5)[8],=WP3JQ(5)[8],=WP3JU(5)[8],=WP3K(5)[8],=WP3LE(5)[8],=WP3MB(5)[8], + =WP3ME(5)[8],=WP3NIS(5)[8],=WP3O(5)[8],=WP3PW(5)[8],=WP3QE(5)[8],=WP3TQ(5)[8],=WP3ZA(5)[8], + =WP4AIE(5)[8],=WP4AIL(5)[8],=WP4AIZ(5)[8],=WP4ALH(5)[8],=WP4AQK(5)[8],=WP4AVW(5)[8],=WP4B(5)[8], + =WP4BFP(5)[8],=WP4BGM(5)[8],=WP4BIN(5)[8],=WP4BJS(5)[8],=WP4BK(5)[8],=WP4BOC(5)[8],=WP4BQV(5)[8], + =WP4BXS(5)[8],=WP4BZG(5)[8],=WP4CKW(5)[8],=WP4CLS(5)[8],=WP4CMH(5)[8],=WP4DC(5)[8],=WP4DCB(5)[8], + =WP4DFK(5)[8],=WP4DMV(5)[8],=WP4DNE(5)[8],=WP4DPX(5)[8],=WP4ENX(5)[8],=WP4EXH(5)[8],=WP4FEI(5)[8], + =WP4FRK(5)[8],=WP4FS(5)[8],=WP4GAK(5)[8],=WP4GFH(5)[8],=WP4GX(5)[8],=WP4GYA(5)[8],=WP4HFZ(5)[8], + =WP4HNN(5)[8],=WP4HOX(5)[8],=WP4IF(5)[8],=WP4IJ(5)[8],=WP4IK(5)[8],=WP4ILP(5)[8],=WP4INP(5)[8], + =WP4JC(5)[8],=WP4JKO(5)[8],=WP4JNB(5)[8],=WP4JQJ(5)[8],=WP4JSR(5)[8],=WP4JSV(5)[8],=WP4JT(5)[8], + =WP4KCJ(5)[8],=WP4KDH(5)[8],=WP4KFP(5)[8],=WP4KGE(5)[8],=WP4KGI(5)[8],=WP4KI(5)[8],=WP4KJV(5)[8], + =WP4KPK(5)[8],=WP4KSK(5)[8],=WP4KTD(5)[8],=WP4LBK(5)[8],=WP4LDG(5)[8],=WP4LDL(5)[8],=WP4LDP(5)[8], + =WP4LE(5)[8],=WP4LEO(5)[8],=WP4LHA(5)[8],=WP4LTA(5)[8],=WP4MAE(5)[8],=WP4MD(5)[8],=WP4MO(5)[8], + =WP4MQF(5)[8],=WP4MWE(5)[8],=WP4MWK(5)[8],=WP4MWS(5)[8],=WP4MXE(5)[8],=WP4MYG(5)[8],=WP4MYK(5)[8], + =WP4NAI(5)[8],=WP4NAQ(5)[8],=WP4NBF(5)[8],=WP4NBG(5)[8],=WP4NFU(5)[8],=WP4NKU(5)[8],=WP4NLQ(5)[8], + =WP4NVL(5)[8],=WP4NWV(5)[8],=WP4NWW(5)[8],=WP4NYU(5)[8],=WP4O/4(5)[8],=WP4O/M(5)[8],=WP4OAT(5)[8], + =WP4OBD(5)[8],=WP4OBH(5)[8],=WP4ODR(5)[8],=WP4ODT(5)[8],=WP4OEO(5)[8],=WP4OFA(5)[8],=WP4OFL(5)[8], + =WP4OHJ(5)[8],=WP4OKI(5)[8],=WP4OLM(5)[8],=WP4OMG(5)[8],=WP4OMV(5)[8],=WP4ONR(5)[8],=WP4OOI(5)[8], + =WP4OPD(5)[8],=WP4OPF(5)[8],=WP4OQH(5)[8],=WP4OTP(5)[8],=WP4OXA(5)[8],=WP4P(5)[8],=WP4PR(5)[8], + =WP4PUV(5)[8],=WP4PWV(5)[8],=WP4PXG(5)[8],=WP4QER(5)[8],=WP4QGV(5)[8],=WP4QHU(5)[8],=WP4RRR(5)[8], + =WP4TD(5)[8],=WP4TX(5)[8],=WP4UC(5)[8],=WP4UM(5)[8],=WP4VL(5)[8],=WP4VM(5)[8],=WP4YG(5)[8], + =WP4ZW(5)[8], + AA5(4)[7],AB5(4)[7],AC5(4)[7],AD5(4)[7],AE5(4)[7],AF5(4)[7],AG5(4)[7],AI5(4)[7],AJ5(4)[7], + AK5(4)[7],K5(4)[7],KA5(4)[7],KB5(4)[7],KC5(4)[7],KD5(4)[7],KE5(4)[7],KF5(4)[7],KG5(4)[7], + KI5(4)[7],KJ5(4)[7],KK5(4)[7],KM5(4)[7],KN5(4)[7],KO5(4)[7],KQ5(4)[7],KR5(4)[7],KS5(4)[7], + KT5(4)[7],KU5(4)[7],KV5(4)[7],KW5(4)[7],KX5(4)[7],KY5(4)[7],KZ5(4)[7],N5(4)[7],NA5(4)[7], + NB5(4)[7],NC5(4)[7],ND5(4)[7],NE5(4)[7],NF5(4)[7],NG5(4)[7],NI5(4)[7],NJ5(4)[7],NK5(4)[7], + NM5(4)[7],NN5(4)[7],NO5(4)[7],NQ5(4)[7],NR5(4)[7],NS5(4)[7],NT5(4)[7],NU5(4)[7],NV5(4)[7], + NW5(4)[7],NX5(4)[7],NY5(4)[7],NZ5(4)[7],W5(4)[7],WA5(4)[7],WB5(4)[7],WC5(4)[7],WD5(4)[7], + WE5(4)[7],WF5(4)[7],WG5(4)[7],WI5(4)[7],WJ5(4)[7],WK5(4)[7],WM5(4)[7],WN5(4)[7],WO5(4)[7], + WQ5(4)[7],WR5(4)[7],WS5(4)[7],WT5(4)[7],WU5(4)[7],WV5(4)[7],WW5(4)[7],WX5(4)[7],WY5(4)[7], + WZ5(4)[7],=AH2AQ(4)[7],=AH2AQ/5(4)[7],=AH2AZ(4)[7],=AH2DG(4)[7],=AH2DR(4)[7],=AH2EH(4)[7], + =AH2H(4)[7],=AH2T(4)[7],=AH6AF(4)[7],=AH6DZ(4)[7],=AH6FV(4)[7],=AH6HT(4)[7],=AH6IJ(4)[7], + =AH6OU(4)[7],=AH6RB(4)[7],=AH6TD(4)[7],=AH6TS(4)[7],=AH6UD(4)[7],=AH6VQ(4)[7],=AH7U(4)[7], + =AH7Z(4)[7],=AH8O(4)[7],=AH9B(4)[7],=AL1F(4)[7],=AL2K(4)[7],=AL2S(4)[7],=AL5J(4)[7],=AL5P(4)[7], + =AL7C(4)[7],=AL7CJ(4)[7],=AL7CQ(4)[7],=AL7DF(4)[7],=AL7DR(4)[7],=AL7GY(4)[7],=AL7HH(4)[7], + =AL7HU(4)[7],=AL7IH(4)[7],=AL7II/5(4)[7],=AL7IM(4)[7],=AL7J(4)[7],=AL7JP(4)[7],=AL7L/5(4)[7], + =AL7MQ(4)[7],=AL7PB(4)[7],=AL7RD(4)[7],=AL7RI(4)[7],=AL7V(4)[7],=KH0BZ(4)[7],=KH0CE(4)[7], + =KH0CU(4)[7],=KH0DW(4)[7],=KH2AI(4)[7],=KH2BH(4)[7],=KH2DF(4)[7],=KH2DF/5(4)[7],=KH2EV(4)[7], + =KH2TB(4)[7],=KH2XD(4)[7],=KH2XO(4)[7],=KH2YO(4)[7],=KH6ABA(4)[7],=KH6CA(4)[7],=KH6DAN(4)[7], + =KH6GGC(4)[7],=KH6HPQ(4)[7],=KH6IDF(4)[7],=KH6II(4)[7],=KH6IO(4)[7],=KH6ITY(4)[7],=KH6ITY/M(4)[7], + =KH6JCV(4)[7],=KH6JIQ(4)[7],=KH6JTE(4)[7],=KH6JTM(4)[7],=KH6JUM(4)[7],=KH6JVL(4)[7], + =KH6KG/5(4)[7],=KH6LL(4)[7],=KH6LX(4)[7],=KH6MB/5(4)[7],=KH6SP/5(4)[7],=KH6SZ(4)[7],=KH6TG(4)[7], + =KH6UW(4)[7],=KH7CF(4)[7],=KH7CU(4)[7],=KH7FB(4)[7],=KH7IC(4)[7],=KH7JE(4)[7],=KH7QL(4)[7], + =KH7QO(4)[7],=KH8CG(4)[7],=KH9AE(4)[7],=KL0EX(4)[7],=KL0HU(4)[7],=KL0IF(4)[7],=KL0PG(4)[7], + =KL0WH(4)[7],=KL0XI(4)[7],=KL0ZY(4)[7],=KL1DA(4)[7],=KL1DJ(4)[7],=KL1DY(4)[7],=KL1MM(4)[7], + =KL1RX(4)[7],=KL1TS(4)[7],=KL1UR(4)[7],=KL1WG(4)[7],=KL1WO(4)[7],=KL1XK(4)[7],=KL1Y(4)[7], + =KL1ZW(4)[7],=KL2AX(4)[7],=KL2AX/5(4)[7],=KL2CD(4)[7],=KL2HC(4)[7],=KL2HN(4)[7],=KL2MI(4)[7], + =KL2OY(4)[7],=KL2RA(4)[7],=KL2RB(4)[7],=KL2TV(4)[7],=KL2UO(4)[7],=KL2UP(4)[7],=KL2VA(4)[7], + =KL2ZJ(4)[7],=KL2ZK(4)[7],=KL3DB(4)[7],=KL3DP(4)[7],=KL3FI(4)[7],=KL3HK(4)[7],=KL3HX(4)[7], + =KL3HZ(4)[7],=KL3JL(4)[7],=KL3KH(4)[7],=KL3KI(4)[7],=KL3TB(4)[7],=KL4JQ(4)[7],=KL4LS(4)[7], + =KL4QZ(4)[7],=KL4RA(4)[7],=KL5L(4)[7],=KL5Z(4)[7],=KL7AH(4)[7],=KL7AU(4)[7],=KL7AX(4)[7], + =KL7BCD(4)[7],=KL7BL(4)[7],=KL7BOB(4)[7],=KL7BX(4)[7],=KL7BZ/5(4)[7],=KL7BZL(4)[7],=KL7CD(4)[7], + =KL7DB(4)[7],=KL7EBE(4)[7],=KL7EMH(4)[7],=KL7EMH/M(4)[7],=KL7EQQ(4)[7],=KL7F(4)[7],=KL7FB(4)[7], + =KL7FHX(4)[7],=KL7FLY(4)[7],=KL7FQQ(4)[7],=KL7FQR(4)[7],=KL7GNW(4)[7],=KL7HH(4)[7],=KL7IDM(4)[7], + =KL7IK(4)[7],=KL7ITF(4)[7],=KL7IWU(4)[7],=KL7IZW(4)[7],=KL7JAR(4)[7],=KL7JEX(4)[7],=KL7JIU(4)[7], + =KL7JR/5(4)[7],=KL7JW(4)[7],=KL7LJ(4)[7],=KL7LY(4)[7],=KL7MA(4)[7],=KL7ME(4)[7],=KL7ML(4)[7], + =KL7NE(4)[7],=KL7NI(4)[7],=KL7OI(4)[7],=KL7PZ(4)[7],=KL7QC(4)[7],=KL7SG(4)[7],=KL7TN/5(4)[7], + =KL7U(4)[7],=KL7UHF(4)[7],=KL7USI/5(4)[7],=KL7XA(4)[7],=KL7XP(4)[7],=KL7XS(4)[7],=KL7YY/5(4)[7], + =KP2AZ(4)[7],=KP4CV(4)[7],=KP4DJT(4)[7],=KP4FF(4)[7],=KP4FFW(4)[7],=KP4GMC(4)[7],=KP4JE(4)[7], + =KP4JG(4)[7],=KP4JY(4)[7],=KP4YP(4)[7],=KP4YY(4)[7],=NH0V/5(4)[7],=NH2BV(4)[7],=NH2LP(4)[7], + =NH6AZ(4)[7],=NH6CJ(4)[7],=NH6EF(4)[7],=NH6FA(4)[7],=NH6KN(4)[7],=NH6L(4)[7],=NH6MG(4)[7], + =NH6TD(4)[7],=NH6VB(4)[7],=NH6VJ(4)[7],=NH6VR(4)[7],=NH6WL(4)[7],=NH6WL/5(4)[7],=NH7FO(4)[7], + =NH7MV(4)[7],=NH7PZ(4)[7],=NH7R(4)[7],=NH7RO(4)[7],=NH7RO/5(4)[7],=NH7TR(4)[7],=NH7VA(4)[7], + =NH7WB(4)[7],=NL5J(4)[7],=NL7AX(4)[7],=NL7C(4)[7],=NL7CO(4)[7],=NL7CO/5(4)[7],=NL7DC(4)[7], + =NL7HB(4)[7],=NL7IE(4)[7],=NL7JH(4)[7],=NL7JI(4)[7],=NL7JV(4)[7],=NL7JZ(4)[7],=NL7K/5(4)[7], + =NL7KB(4)[7],=NL7LE(4)[7],=NL7NP(4)[7],=NL7OM(4)[7],=NL7PD(4)[7],=NL7RQ(4)[7],=NL7RQ/5(4)[7], + =NL7SI(4)[7],=NL7TO(4)[7],=NL7WY(4)[7],=NL7ZL(4)[7],=NP2EE(4)[7],=NP2PR(4)[7],=NP2RA(4)[7], + =NP3BA(4)[7],=NP3CV(4)[7],=NP3NT(4)[7],=NP3PG(4)[7],=NP3RG(4)[7],=NP3SU(4)[7],=NP3TY(4)[7], + =NP4EA(4)[7],=NP4NQ(4)[7],=NP4NQ/5(4)[7],=NP4RW(4)[7],=NP4RZ(4)[7],=WH2ACT(4)[7],=WH2ACT/5(4)[7], + =WH6ARN(4)[7],=WH6BYJ(4)[7],=WH6BYP(4)[7],=WH6CCQ(4)[7],=WH6CDU(4)[7],=WH6CUL(4)[7],=WH6DMP(4)[7], + =WH6DSR(4)[7],=WH6DZU(4)[7],=WH6ECJ(4)[7],=WH6EMW(4)[7],=WH6EOF(4)[7],=WH6ERS(4)[7],=WH6EUA(4)[7], + =WH6EXQ(4)[7],=WH6FAD(4)[7],=WH6FGK(4)[7],=WH6FGM(4)[7],=WH6FTZ(4)[7],=WH6FZ/5(4)[7], + =WH6FZL(4)[7],=WH6FZN(4)[7],=WH6GBC(4)[7],=WH6GEA(4)[7],=WH6GL(4)[7],=WH6KK(4)[7],=WH6L/5(4)[7], + =WH7DC(4)[7],=WH7DW(4)[7],=WH7IN(4)[7],=WH7R(4)[7],=WH7YM(4)[7],=WH7YN(4)[7],=WL3WX(4)[7], + =WL5H(4)[7],=WL7AIU(4)[7],=WL7AWC(4)[7],=WL7BBV(4)[7],=WL7BKF(4)[7],=WL7BPY(4)[7],=WL7CA(4)[7], + =WL7CJA(4)[7],=WL7CJC(4)[7],=WL7CQE(4)[7],=WL7CTP(4)[7],=WL7CTQ(4)[7],=WL7D(4)[7],=WL7FC(4)[7], + =WL7FE(4)[7],=WL7FT(4)[7],=WL7FT/5(4)[7],=WL7K/5(4)[7],=WL7ME(4)[7],=WL7MQ/5(4)[7],=WL7OP(4)[7], + =WL7OU(4)[7],=WL7SG(4)[7],=WL7W(4)[7],=WL7WN(4)[7],=WL7XI(4)[7],=WL7XR(4)[7],=WP2AHG(4)[7], + =WP2N(4)[7],=WP2U(4)[7],=WP2WP(4)[7],=WP3AL(4)[7],=WP3HG(4)[7],=WP3JM(4)[7],=WP3JN(4)[7], + =WP4A(4)[7],=WP4ADA(4)[7],=WP4APJ(4)[7],=WP4BAB(4)[7],=WP4BAT(4)[7],=WP4CJY(4)[7],=WP4EVA(4)[7], + =WP4EVL(4)[7],=WP4IXT(4)[7],=WP4IYJ(4)[7],=WP4KSP(4)[7],=WP4KTF(4)[7],=WP4KUW(4)[7],=WP4LKA(4)[7], + =WP4LQR(4)[7],=WP4MJP(4)[7],=WP4MYI(4)[7],=WP4MZR(4)[7],=WP4NAK(4)[7],=WP4NEP(4)[7],=WP4NQA(4)[7], + =WP4NQL(4)[7],=WP4OUE(4)[7],=WP4OZK(4)[7],=WP4OZP(4)[7],=WP4QLB(4)[7],=WP4RON(4)[7], + AA6(3)[6],AB6(3)[6],AC6(3)[6],AD6(3)[6],AE6(3)[6],AF6(3)[6],AG6(3)[6],AI6(3)[6],AJ6(3)[6], + AK6(3)[6],K6(3)[6],KA6(3)[6],KB6(3)[6],KC6(3)[6],KD6(3)[6],KE6(3)[6],KF6(3)[6],KG6(3)[6], + KI6(3)[6],KJ6(3)[6],KK6(3)[6],KM6(3)[6],KN6(3)[6],KO6(3)[6],KQ6(3)[6],KR6(3)[6],KS6(3)[6], + KT6(3)[6],KU6(3)[6],KV6(3)[6],KW6(3)[6],KX6(3)[6],KY6(3)[6],KZ6(3)[6],N6(3)[6],NA6(3)[6], + NB6(3)[6],NC6(3)[6],ND6(3)[6],NE6(3)[6],NF6(3)[6],NG6(3)[6],NI6(3)[6],NJ6(3)[6],NK6(3)[6], + NM6(3)[6],NN6(3)[6],NO6(3)[6],NQ6(3)[6],NR6(3)[6],NS6(3)[6],NT6(3)[6],NU6(3)[6],NV6(3)[6], + NW6(3)[6],NX6(3)[6],NY6(3)[6],NZ6(3)[6],W6(3)[6],WA6(3)[6],WB6(3)[6],WC6(3)[6],WD6(3)[6], + WE6(3)[6],WF6(3)[6],WG6(3)[6],WI6(3)[6],WJ6(3)[6],WK6(3)[6],WM6(3)[6],WN6(3)[6],WO6(3)[6], + WQ6(3)[6],WR6(3)[6],WS6(3)[6],WT6(3)[6],WU6(3)[6],WV6(3)[6],WW6(3)[6],WX6(3)[6],WY6(3)[6], + WZ6(3)[6],=AH0C(3)[6],=AH0CS(3)[6],=AH0U(3)[6],=AH0U/6(3)[6],=AH0W(3)[6],=AH2AP(3)[6], + =AH2DY(3)[6],=AH6BS(3)[6],=AH6CY(3)[6],=AH6CY/P(3)[6],=AH6EI(3)[6],=AH6HE(3)[6],=AH6KD(3)[6], + =AH6KG(3)[6],=AH6ML(3)[6],=AH6NL(3)[6],=AH6NP(3)[6],=AH6PD(3)[6],=AH6RI(3)[6],=AH6S(3)[6], + =AH6SU(3)[6],=AH6TX(3)[6],=AH6UK(3)[6],=AH6UN(3)[6],=AH6UX(3)[6],=AH7A(3)[6],=AH7D(3)[6], + =AH7F(3)[6],=AH8C(3)[6],=AL3A(3)[6],=AL5ET(3)[6],=AL7DQ(3)[6],=AL7EM(3)[6],=AL7EP(3)[6], + =AL7EW(3)[6],=AL7FN(3)[6],=AL7GS(3)[6],=AL7HO/6(3)[6],=AL7L/6(3)[6],=AL7PS(3)[6],=AL7QR(3)[6], + =KH0BR(3)[6],=KH0BU(3)[6],=KH0CA(3)[6],=KH0CG(3)[6],=KH0DH(3)[6],=KH0DJ(3)[6],=KH0HQ(3)[6], + =KH0JA(3)[6],=KH0JJ(3)[6],=KH0LY(3)[6],=KH0UV(3)[6],=KH0V(3)[6],=KH0XD(3)[6],=KH2BD(3)[6], + =KH2BI(3)[6],=KH2BR(3)[6],=KH2BR/6(3)[6],=KH2C(3)[6],=KH2EE(3)[6],=KH2FI(3)[6],=KH2FI/6(3)[6], + =KH2H(3)[6],=KH2IW(3)[6],=KH2LU(3)[6],=KH2LW(3)[6],=KH2LZ(3)[6],=KH2OJ(3)[6],=KH2QE(3)[6], + =KH2QL(3)[6],=KH2QY(3)[6],=KH2TJ(3)[6],=KH2TJ/6(3)[6],=KH2XW(3)[6],=KH2YJ(3)[6],=KH2Z(3)[6], + =KH2ZM(3)[6],=KH4AB(3)[6],=KH6AS(3)[6],=KH6BMD(3)[6],=KH6BRY(3)[6],=KH6COL(3)[6],=KH6DDW(3)[6], + =KH6DX/M(3)[6],=KH6DX/M6(3)[6],=KH6DZ(3)[6],=KH6EAM(3)[6],=KH6EHF(3)[6],=KH6FH(3)[6],=KH6FL(3)[6], + =KH6FOX(3)[6],=KH6FQR(3)[6],=KH6FQY(3)[6],=KH6GBQ(3)[6],=KH6GC(3)[6],=KH6GJV(3)[6], + =KH6GJV/6(3)[6],=KH6GK(3)[6],=KH6GKR(3)[6],=KH6HH(3)[6],=KH6HJE(3)[6],=KH6HOU(3)[6],=KH6IKH(3)[6], + =KH6IKL(3)[6],=KH6IP(3)[6],=KH6IPJ(3)[6],=KH6JCT(3)[6],=KH6JGD(3)[6],=KH6JJN(3)[6], + =KH6JJN/P(3)[6],=KH6JN(3)[6],=KH6JNK(3)[6],=KH6JR(3)[6],=KH6JRB(3)[6],=KH6JRC(3)[6],=KH6JS(3)[6], + =KH6JVS(3)[6],=KH6JWG(3)[6],=KH6JWJ(3)[6],=KH6JWJ/6(3)[6],=KH6KN(3)[6],=KH6KT(3)[6],=KH6LO(3)[6], + =KH6MV(3)[6],=KH6N(3)[6],=KH6NG(3)[6],=KH6O(3)[6],=KH6OK(3)[6],=KH6PGA/6(3)[6],=KH6PM(3)[6], + =KH6PW(3)[6],=KH6TO(3)[6],=KH6UQ(3)[6],=KH6USA(3)[6],=KH6VC(3)[6],=KH6VC/6(3)[6],=KH6VZ(3)[6], + =KH6WL(3)[6],=KH6WZ(3)[6],=KH7CD/6(3)[6],=KH7CO(3)[6],=KH7CS(3)[6],=KH7EM(3)[6],=KH7I(3)[6], + =KH7IZ(3)[6],=KH7JI(3)[6],=KH7JR(3)[6],=KH7NS(3)[6],=KH7QS(3)[6],=KH7QU(3)[6],=KH7RB(3)[6], + =KH7TJ(3)[6],=KH7TJ/6(3)[6],=KH7TR(3)[6],=KH7TW(3)[6],=KH7VD(3)[6],=KH7VE(3)[6],=KH7WN(3)[6], + =KH7WO(3)[6],=KH7WP(3)[6],=KH7WR(3)[6],=KH7WS(3)[6],=KH7XX/6(3)[6],=KH7Y/6(3)[6],=KH8A(3)[6], + =KH8AF(3)[6],=KH8FL(3)[6],=KL0AA(3)[6],=KL0AF(3)[6],=KL0AL(3)[6],=KL0HZ(3)[6],=KL0ZA(3)[6], + =KL1NER(3)[6],=KL1PU(3)[6],=KL1WE/6(3)[6],=KL2CQ(3)[6],=KL2WL(3)[6],=KL3IM(3)[6],=KL3JY/6(3)[6], + =KL3YH(3)[6],=KL4GW(3)[6],=KL4LV(3)[6],=KL4NQ(3)[6],=KL4NZ(3)[6],=KL4QW(3)[6],=KL4UZ(3)[6], + =KL7AK(3)[6],=KL7CE/6(3)[6],=KL7CM(3)[6],=KL7CN(3)[6],=KL7CW/6(3)[6],=KL7CX(3)[6],=KL7DJ(3)[6], + =KL7EAE(3)[6],=KL7EAL(3)[6],=KL7GKW(3)[6],=KL7HQR(3)[6],=KL7HQR/6(3)[6],=KL7HSY(3)[6], + =KL7ID(3)[6],=KL7IDY/6(3)[6],=KL7ISB(3)[6],=KL7ISN(3)[6],=KL7JBE(3)[6],=KL7JG(3)[6],=KL7KNP(3)[6], + =KL7KX(3)[6],=KL7MF(3)[6],=KL7MF/6(3)[6],=KL7MF/M(3)[6],=KL7RT(3)[6],=KL7SL(3)[6],=KL7SY(3)[6], + =KL7VU(3)[6],=KL7VU/6(3)[6],=KP2BK(3)[6],=KP3BN(3)[6],=KP3YL(3)[6],=KP4AVU(3)[6],=KP4BR(3)[6], + =KP4DSO(3)[6],=KP4DX/6(3)[6],=KP4ENM(3)[6],=KP4ERR(3)[6],=KP4FBT(3)[6],=KP4MD(3)[6],=KP4UB(3)[6], + =KP4ZW(3)[6],=NH0C(3)[6],=NH0X(3)[6],=NH2AR(3)[6],=NH2BD(3)[6],=NH2CM(3)[6],=NH2FT(3)[6], + =NH2FX(3)[6],=NH2R(3)[6],=NH2S(3)[6],=NH6AC(3)[6],=NH6AE(3)[6],=NH6AF(3)[6],=NH6FV(3)[6], + =NH6FX(3)[6],=NH6NG(3)[6],=NH6RG(3)[6],=NH6SF(3)[6],=NH6ST(3)[6],=NH6WR(3)[6],=NH7AG(3)[6], + =NH7EM(3)[6],=NH7FS(3)[6],=NH7FW(3)[6],=NH7G(3)[6],=NH7IG(3)[6],=NH7IH(3)[6],=NH7PM(3)[6], + =NH7QV(3)[6],=NH7RT(3)[6],=NH7ST(3)[6],=NH7SU(3)[6],=NH7WC(3)[6],=NH7WE(3)[6],=NH7WG(3)[6], + =NH7ZE(3)[6],=NL7GE(3)[6],=NL7IB(3)[6],=NL7LC(3)[6],=NL7OP(3)[6],=NL7RO(3)[6],=NL7TP(3)[6], + =NL7VL(3)[6],=NL7YB(3)[6],=NP2KY(3)[6],=NP4AB(3)[6],=NP4AI/6(3)[6],=NP4IW(3)[6],=NP4IW/6(3)[6], + =NP4MV(3)[6],=NP4XE(3)[6],=WH0AAZ(3)[6],=WH0M(3)[6],=WH2ABS(3)[6],=WH2ALN(3)[6],=WH2K(3)[6], + =WH6AAJ(3)[6],=WH6AFM(3)[6],=WH6ANA(3)[6],=WH6ASW/M(3)[6],=WH6BYT(3)[6],=WH6CIL(3)[6], + =WH6CK(3)[6],=WH6CO(3)[6],=WH6CPO(3)[6],=WH6CPT(3)[6],=WH6CRE(3)[6],=WH6CSG(3)[6],=WH6CUF(3)[6], + =WH6CUU(3)[6],=WH6CUX(3)[6],=WH6CVJ(3)[6],=WH6CWS(3)[6],=WH6CZF(3)[6],=WH6CZH(3)[6],=WH6DHN(3)[6], + =WH6DPA(3)[6],=WH6DSK(3)[6],=WH6DVM(3)[6],=WH6DVN(3)[6],=WH6DVX(3)[6],=WH6DYA(3)[6],=WH6DZV(3)[6], + =WH6DZY(3)[6],=WH6EEZ(3)[6],=WH6EHY(3)[6],=WH6EKB(3)[6],=WH6ENG(3)[6],=WH6EUH(3)[6],=WH6EZW(3)[6], + =WH6FTF(3)[6],=WH6FTO(3)[6],=WH6JO(3)[6],=WH6LZ(3)[6],=WH6MC(3)[6],=WH6MK(3)[6],=WH6OI(3)[6], + =WH6PX(3)[6],=WH6QA(3)[6],=WH6RF(3)[6],=WH6TD(3)[6],=WH6TK(3)[6],=WH6TT(3)[6],=WH6USA(3)[6], + =WH6VM(3)[6],=WH6VN(3)[6],=WH6XI(3)[6],=WH6XX(3)[6],=WH6YJ(3)[6],=WH7DG(3)[6],=WH7DH(3)[6], + =WH7HQ(3)[6],=WH7IV(3)[6],=WH7IZ(3)[6],=WH7L(3)[6],=WH7LP(3)[6],=WH7OO(3)[6],=WH7PM(3)[6], + =WH7PV(3)[6],=WH7QC(3)[6],=WH7RU(3)[6],=WH7TT(3)[6],=WH7TY(3)[6],=WH7UZ(3)[6],=WH7VM(3)[6], + =WH7VU(3)[6],=WH7XR(3)[6],=WL3AF(3)[6],=WL3DZ(3)[6],=WL4JC(3)[6],=WL7ACO(3)[6],=WL7BA(3)[6], + =WL7BGF(3)[6],=WL7CPL(3)[6],=WL7CSD(3)[6],=WL7DN/6(3)[6],=WL7EA(3)[6],=WL7EKK(3)[6],=WL7RA(3)[6], + =WL7SE(3)[6],=WL7TG(3)[6],=WL7WL(3)[6],=WL7YQ(3)[6],=WL7YQ/6(3)[6],=WP2Q(3)[6],=WP3OV(3)[6], + =WP4CUJ(3)[6],=WP4CW(3)[6],=WP4HNF(3)[6],=WP4IER(3)[6],=WP4KSU(3)[6],=WP4MVE(3)[6],=WP4OBB(3)[6], + =WP4OBC(3)[6],=WP4PWS(3)[6],=WP4QQA(3)[6], + AA7(3)[6],AB7(3)[6],AC7(3)[6],AD7(3)[6],AE7(3)[6],AF7(3)[6],AG7(3)[6],AI7(3)[6],AJ7(3)[6], + AK7(3)[6],K7(3)[6],KA7(3)[6],KB7(3)[6],KC7(3)[6],KD7(3)[6],KE7(3)[6],KF7(3)[6],KG7(3)[6], + KI7(3)[6],KJ7(3)[6],KK7(3)[6],KM7(3)[6],KN7(3)[6],KO7(3)[6],KQ7(3)[6],KR7(3)[6],KS7(3)[6], + KT7(3)[6],KU7(3)[6],KV7(3)[6],KW7(3)[6],KX7(3)[6],KY7(3)[6],KZ7(3)[6],N7(3)[6],NA7(3)[6], + NB7(3)[6],NC7(3)[6],ND7(3)[6],NE7(3)[6],NF7(3)[6],NG7(3)[6],NI7(3)[6],NJ7(3)[6],NK7(3)[6], + NM7(3)[6],NN7(3)[6],NO7(3)[6],NQ7(3)[6],NR7(3)[6],NS7(3)[6],NT7(3)[6],NU7(3)[6],NV7(3)[6], + NW7(3)[6],NX7(3)[6],NY7(3)[6],NZ7(3)[6],W7(3)[6],WA7(3)[6],WB7(3)[6],WC7(3)[6],WD7(3)[6], + WE7(3)[6],WF7(3)[6],WG7(3)[6],WI7(3)[6],WJ7(3)[6],WK7(3)[6],WM7(3)[6],WN7(3)[6],WO7(3)[6], + WQ7(3)[6],WR7(3)[6],WS7(3)[6],WT7(3)[6],WU7(3)[6],WV7(3)[6],WW7(3)[6],WX7(3)[6],WY7(3)[6], + WZ7(3)[6],=AH0AB(3)[6],=AH0CC(3)[6],=AH0CN(3)[6],=AH0W/7(3)[6],=AH2A(3)[6],=AH2AK(3)[6], + =AH2DP(3)[6],=AH2DS(3)[6],=AH2S(3)[6],=AH6B/7(3)[6],=AH6D(3)[6],=AH6ET(3)[6],=AH6EZ(3)[6], + =AH6EZ/7(3)[6],=AH6FC/7(3)[6],=AH6GA(3)[6],=AH6HK(3)[6],=AH6HS(3)[6],=AH6HX(3)[6],=AH6I(3)[6], + =AH6IP(3)[6],=AH6JS(3)[6],=AH6LA(3)[6],=AH6LE(3)[6],=AH6LE/7(3)[6],=AH6NJ(3)[6],=AH6NR(3)[6], + =AH6OD(3)[6],=AH6PJ(3)[6],=AH6PW(3)[6],=AH6QW(3)[6],=AH6RI/7(3)[6],=AH6SV(3)[6],=AH6VM(3)[6], + =AH6Y(3)[6],=AH7MP(3)[6],=AH7Q(3)[6],=AH8AC(3)[6],=AH8DX(3)[6],=AH8K(3)[6],=AH9A(3)[6], + =AH9AC(3)[6],=AL0AA(3)[6],=AL0FT(3)[6],=AL0H(3)[6],=AL0X(3)[6],=AL1N(3)[6],=AL1P(3)[6], + =AL1R(3)[6],=AL1VE(3)[6],=AL2B(3)[6],=AL2GR(3)[6],=AL2I(3)[6],=AL2N(3)[6],=AL3L(3)[6],=AL4F(3)[6], + =AL4Q/7(3)[6],=AL4R(3)[6],=AL5B(3)[6],=AL5W(3)[6],=AL6U(3)[6],=AL7AA(3)[6],=AL7AN(3)[6], + =AL7AW(3)[6],=AL7BN(3)[6],=AL7BQ(3)[6],=AL7CC(3)[6],=AL7CG(3)[6],=AL7CM(3)[6],=AL7CM/7(3)[6], + =AL7CR(3)[6],=AL7CS(3)[6],=AL7D(3)[6],=AL7D/7(3)[6],=AL7D/P(3)[6],=AL7D/R(3)[6],=AL7DD(3)[6], + =AL7DU(3)[6],=AL7EI(3)[6],=AL7EJ(3)[6],=AL7FA(3)[6],=AL7FB(3)[6],=AL7FZ(3)[6],=AL7GN(3)[6], + =AL7HD(3)[6],=AL7HI(3)[6],=AL7HJ(3)[6],=AL7HS(3)[6],=AL7HY(3)[6],=AL7IG(3)[6],=AL7IT(3)[6], + =AL7JF(3)[6],=AL7JJ(3)[6],=AL7JS(3)[6],=AL7JU(3)[6],=AL7JV(3)[6],=AL7JW(3)[6],=AL7JY(3)[6], + =AL7KE(3)[6],=AL7KF(3)[6],=AL7KG(3)[6],=AL7KK(3)[6],=AL7KL(3)[6],=AL7KV(3)[6],=AL7L/7(3)[6], + =AL7LI(3)[6],=AL7LL(3)[6],=AL7MH(3)[6],=AL7ND(3)[6],=AL7NK(3)[6],=AL7NZ(3)[6],=AL7OK(3)[6], + =AL7OW(3)[6],=AL7PR(3)[6],=AL7PV(3)[6],=AL7QL(3)[6],=AL7QZ(3)[6],=AL7R(3)[6],=AL7R/7(3)[6], + =AL7RF(3)[6],=AL7RF/7(3)[6],=AL7RM(3)[6],=AL7RR(3)[6],=AL7W(3)[6],=AL8F(3)[6],=G4KHG/M(3)[6], + =KH0AS(3)[6],=KH0H(3)[6],=KH0K(3)[6],=KH0SH(3)[6],=KH0TL(3)[6],=KH0X(3)[6],=KH2CH(3)[6], + =KH2DX(3)[6],=KH2G(3)[6],=KH2GG(3)[6],=KH2JA(3)[6],=KH2QH(3)[6],=KH2RK(3)[6],=KH2SK(3)[6], + =KH2SR(3)[6],=KH2TJ/7(3)[6],=KH2TJ/P(3)[6],=KH2XP(3)[6],=KH2YL(3)[6],=KH3AD(3)[6],=KH6AB(3)[6], + =KH6BXZ(3)[6],=KH6CN(3)[6],=KH6CN/7(3)[6],=KH6COY(3)[6],=KH6CQG(3)[6],=KH6CQH(3)[6], + =KH6CQH/7(3)[6],=KH6CTQ(3)[6],=KH6DB(3)[6],=KH6DE(3)[6],=KH6DOT(3)[6],=KH6DUT(3)[6],=KH6EE(3)[6], + =KH6EE/7(3)[6],=KH6FE(3)[6],=KH6FKA/7(3)[6],=KH6FU(3)[6],=KH6GB(3)[6],=KH6GDN(3)[6],=KH6GN(3)[6], + =KH6HP(3)[6],=KH6HU(3)[6],=KH6HWK(3)[6],=KH6IA(3)[6],=KH6ICQ(3)[6],=KH6IKC(3)[6],=KH6IMN(3)[6], + =KH6IQX(3)[6],=KH6JFL(3)[6],=KH6JIM(3)[6],=KH6JIM/7(3)[6],=KH6JJS(3)[6],=KH6JKL(3)[6], + =KH6JMK(3)[6],=KH6JPJ(3)[6],=KH6JPO(3)[6],=KH6JRW(3)[6],=KH6JT(3)[6],=KH6JUC(3)[6],=KH6JUQ(3)[6], + =KH6KS(3)[6],=KH6KW(3)[6],=KH6LEM(3)[6],=KH6ME(3)[6],=KH6MF(3)[6],=KH6NA(3)[6],=KH6NO/7(3)[6], + =KH6NO/M(3)[6],=KH6NU(3)[6],=KH6OV(3)[6],=KH6PG(3)[6],=KH6PR(3)[6],=KH6QAI(3)[6],=KH6QAI/7(3)[6], + =KH6QAJ(3)[6],=KH6RW(3)[6],=KH6RY(3)[6],=KH6SAT(3)[6],=KH6SS(3)[6],=KH6TX(3)[6],=KH6VI(3)[6], + =KH6VM(3)[6],=KH6VM/7(3)[6],=KH6VT(3)[6],=KH6WX(3)[6],=KH6XG(3)[6],=KH6XJ(3)[6],=KH6XS(3)[6], + =KH6XT(3)[6],=KH6YL(3)[6],=KH7AR(3)[6],=KH7AX(3)[6],=KH7CB(3)[6],=KH7CM(3)[6],=KH7CZ(3)[6], + =KH7FJ(3)[6],=KH7FR(3)[6],=KH7HH(3)[6],=KH7HWK(3)[6],=KH7IP(3)[6],=KH7LE(3)[6],=KH7ME(3)[6], + =KH7MR(3)[6],=KH7NI(3)[6],=KH7NP(3)[6],=KH7R(3)[6],=KH7RD(3)[6],=KH7RT(3)[6],=KH7SB(3)[6], + =KH7SQ(3)[6],=KH7SR(3)[6],=KH7TG(3)[6],=KH7VB(3)[6],=KH7VC(3)[6],=KH7WW/7(3)[6],=KH7WX(3)[6], + =KH7X/7(3)[6],=KH7YD(3)[6],=KH7YD/7(3)[6],=KH7ZD(3)[6],=KH8AB(3)[6],=KH8AH(3)[6],=KH8AZ(3)[6], + =KH8BG(3)[6],=KH8D(3)[6],=KH8E(3)[6],=KH8K(3)[6],=KH9AA(3)[6],=KL0AI(3)[6],=KL0AN(3)[6], + =KL0AP(3)[6],=KL0CA(3)[6],=KL0CM(3)[6],=KL0CW(3)[6],=KL0DF(3)[6],=KL0DG(3)[6],=KL0DR(3)[6], + =KL0DT(3)[6],=KL0ER(3)[6],=KL0EU(3)[6],=KL0IR(3)[6],=KL0IS(3)[6],=KL0IW(3)[6],=KL0IX(3)[6], + =KL0LF(3)[6],=KL0MO(3)[6],=KL0NM(3)[6],=KL0NP(3)[6],=KL0NP/P(3)[6],=KL0PC(3)[6],=KL0PP(3)[6], + =KL0QD(3)[6],=KL0RA(3)[6],=KL0SA(3)[6],=KL0SZ(3)[6],=KL0TQ(3)[6],=KL0TR(3)[6],=KL0TU(3)[6], + =KL0VB(3)[6],=KL0VZ(3)[6],=KL0WN(3)[6],=KL0ZF(3)[6],=KL0ZL(3)[6],=KL1AA(3)[6],=KL1AE(3)[6], + =KL1AK(3)[6],=KL1DO(3)[6],=KL1DW(3)[6],=KL1ED(3)[6],=KL1HS(3)[6],=KL1JF(3)[6],=KL1K(3)[6], + =KL1KU(3)[6],=KL1LE(3)[6],=KL1LZ(3)[6],=KL1MF(3)[6],=KL1OH(3)[6],=KL1QL(3)[6],=KL1RH(3)[6], + =KL1RV(3)[6],=KL1SF/7(3)[6],=KL1SO(3)[6],=KL1SP(3)[6],=KL1U(3)[6],=KL1UA(3)[6],=KL1UM(3)[6], + =KL1XI(3)[6],=KL1YO(3)[6],=KL1YY/7(3)[6],=KL1ZN(3)[6],=KL1ZP(3)[6],=KL1ZR(3)[6],=KL2A(3)[6], + =KL2A/7(3)[6],=KL2BO(3)[6],=KL2BP(3)[6],=KL2BW(3)[6],=KL2BY(3)[6],=KL2BZ(3)[6],=KL2FD(3)[6], + =KL2FL(3)[6],=KL2JY(3)[6],=KL2K(3)[6],=KL2KY(3)[6],=KL2LA(3)[6],=KL2LN(3)[6],=KL2LT(3)[6], + =KL2MA(3)[6],=KL2MB(3)[6],=KL2MP(3)[6],=KL2NJ(3)[6],=KL2NU(3)[6],=KL2NW(3)[6],=KL2OH(3)[6], + =KL2OJ(3)[6],=KL2P(3)[6],=KL2QE(3)[6],=KL2TR(3)[6],=KL2TZ(3)[6],=KL2VK(3)[6],=KL2WE(3)[6], + =KL2XQ(3)[6],=KL2YH(3)[6],=KL2YQ(3)[6],=KL3DL(3)[6],=KL3ET(3)[6],=KL3EZ(3)[6],=KL3FE(3)[6], + =KL3FY(3)[6],=KL3HL(3)[6],=KL3IC(3)[6],=KL3IO(3)[6],=KL3ML(3)[6],=KL3NE(3)[6],=KL3NO(3)[6], + =KL3OQ(3)[6],=KL3PD(3)[6],=KL3TW(3)[6],=KL3TY(3)[6],=KL3VJ(3)[6],=KL3XS(3)[6],=KL4BQ(3)[6], + =KL4BS(3)[6],=KL4FX(3)[6],=KL4KF(3)[6],=KL4NG(3)[6],=KL4QJ(3)[6],=KL4RKH(3)[6],=KL4RY(3)[6], + =KL4YFD(3)[6],=KL7AB(3)[6],=KL7AD(3)[6],=KL7AW(3)[6],=KL7BB(3)[6],=KL7BD(3)[6],=KL7BDC(3)[6], + =KL7BH(3)[6],=KL7BJ(3)[6],=KL7BR(3)[6],=KL7BS(3)[6],=KL7BT(3)[6],=KL7BUR(3)[6],=KL7BXP(3)[6], + =KL7C(3)[6],=KL7CPO(3)[6],=KL7CR(3)[6],=KL7CT(3)[6],=KL7DC(3)[6],=KL7DF(3)[6],=KL7DI(3)[6], + =KL7DK(3)[6],=KL7DLG(3)[6],=KL7DSI(3)[6],=KL7DZQ(3)[6],=KL7EBN(3)[6],=KL7EF(3)[6],=KL7EFL(3)[6], + =KL7EH(3)[6],=KL7EIN(3)[6],=KL7EU(3)[6],=KL7FDQ(3)[6],=KL7FDQ/7(3)[6],=KL7FIR(3)[6],=KL7FLR(3)[6], + =KL7FOZ(3)[6],=KL7FRQ(3)[6],=KL7FS(3)[6],=KL7GA(3)[6],=KL7GCS(3)[6],=KL7GKY(3)[6],=KL7GRF(3)[6], + =KL7GT(3)[6],=KL7GU(3)[6],=KL7HB(3)[6],=KL7HBV(3)[6],=KL7HFI/7(3)[6],=KL7HFV(3)[6],=KL7HI(3)[6], + =KL7HJR(3)[6],=KL7HLF(3)[6],=KL7HM(3)[6],=KL7HMK(3)[6],=KL7HQL(3)[6],=KL7HSR(3)[6],=KL7IAL(3)[6], + =KL7IBT(3)[6],=KL7IDY(3)[6],=KL7IEI(3)[6],=KL7IFK(3)[6],=KL7IG(3)[6],=KL7IGB(3)[6],=KL7IHK(3)[6], + =KL7IIK(3)[6],=KL7IKV(3)[6],=KL7IL(3)[6],=KL7IME(3)[6],=KL7IOW(3)[6],=KL7IPV(3)[6],=KL7ISE(3)[6], + =KL7IUX(3)[6],=KL7IWC/7(3)[6],=KL7IZC(3)[6],=KL7IZH(3)[6],=KL7JAV(3)[6],=KL7JBB(3)[6], + =KL7JDQ(3)[6],=KL7JEA(3)[6],=KL7JES(3)[6],=KL7JIJ(3)[6],=KL7JJE(3)[6],=KL7JKV(3)[6],=KL7KA(3)[6], + =KL7KG/7(3)[6],=KL7LG(3)[6],=KL7LI(3)[6],=KL7LX(3)[6],=KL7LZ(3)[6],=KL7M(3)[6],=KL7MY(3)[6], + =KL7MZ(3)[6],=KL7NA(3)[6],=KL7NP(3)[6],=KL7NP/7(3)[6],=KL7OA(3)[6],=KL7OF(3)[6],=KL7OL(3)[6], + =KL7OR(3)[6],=KL7OR/7(3)[6],=KL7OS(3)[6],=KL7OY(3)[6],=KL7PC(3)[6],=KL7PO(3)[6],=KL7QA(3)[6], + =KL7QK(3)[6],=KL7QK/140(3)[6],=KL7QK/7(3)[6],=KL7QR(3)[6],=KL7QR/7(3)[6],=KL7R(3)[6],=KL7RC(3)[6], + =KL7RK(3)[6],=KL7RM(3)[6],=KL7RN(3)[6],=KL7RS(3)[6],=KL7S(3)[6],=KL7SK(3)[6],=KL7SP(3)[6], + =KL7SV(3)[6],=KL7T(3)[6],=KL7TU(3)[6],=KL7UP(3)[6],=KL7UT(3)[6],=KL7VK(3)[6],=KL7VL(3)[6], + =KL7VN(3)[6],=KL7VQ(3)[6],=KL7WC(3)[6],=KL7WG(3)[6],=KL7WM(3)[6],=KL7WN(3)[6],=KL7WP(3)[6], + =KL7WP/7(3)[6],=KL7WT(3)[6],=KL7XL(3)[6],=KL7YJ(3)[6],=KL7YQ(3)[6],=KL7YY/M(3)[6],=KL7ZH(3)[6], + =KL7ZW(3)[6],=KL8RV(3)[6],=KL8SU(3)[6],=KL9PC(3)[6],=KP2BX(3)[6],=KP2CB(3)[6],=KP2CT(3)[6], + =KP4EFZ(3)[6],=KP4UZ(3)[6],=KP4X(3)[6],=NH0F(3)[6],=NH0K(3)[6],=NH0O(3)[6],=NH2DM(3)[6], + =NH2JE(3)[6],=NH2KR(3)[6],=NH6AD(3)[6],=NH6AJ(3)[6],=NH6AY(3)[6],=NH6B(3)[6],=NH6BF(3)[6], + =NH6CI(3)[6],=NH6CO(3)[6],=NH6DQ(3)[6],=NH6DX(3)[6],=NH6F(3)[6],=NH6FF(3)[6],=NH6GZ(3)[6], + =NH6HE(3)[6],=NH6HZ(3)[6],=NH6KF(3)[6],=NH6LF(3)[6],=NH6LM(3)[6],=NH6NS(3)[6],=NH6SO(3)[6], + =NH6U(3)[6],=NH6WE(3)[6],=NH6XN(3)[6],=NH6XP(3)[6],=NH6YR(3)[6],=NH6Z(3)[6],=NH6ZA(3)[6], + =NH6ZE(3)[6],=NH7DZ(3)[6],=NH7FU(3)[6],=NH7FZ(3)[6],=NH7L(3)[6],=NH7M(3)[6],=NH7MY(3)[6], + =NH7N(3)[6],=NH7ND(3)[6],=NH7NJ/7(3)[6],=NH7OC(3)[6],=NH7PL(3)[6],=NH7RS(3)[6],=NH7S(3)[6], + =NH7SH(3)[6],=NH7TG(3)[6],=NH7VZ(3)[6],=NH7W(3)[6],=NH7WT(3)[6],=NH7WU(3)[6],=NH7YE(3)[6], + =NH7YI(3)[6],=NH8A(3)[6],=NL5L(3)[6],=NL7AH(3)[6],=NL7AR(3)[6],=NL7AZ(3)[6],=NL7BI(3)[6], + =NL7CH(3)[6],=NL7D(3)[6],=NL7D/7(3)[6],=NL7DH(3)[6],=NL7DY(3)[6],=NL7EO(3)[6],=NL7FQ(3)[6], + =NL7FX(3)[6],=NL7FY(3)[6],=NL7GM(3)[6],=NL7GN(3)[6],=NL7GO(3)[6],=NL7GU(3)[6],=NL7GW(3)[6], + =NL7HH(3)[6],=NL7HK(3)[6],=NL7HQ(3)[6],=NL7HU(3)[6],=NL7IN(3)[6],=NL7JJ(3)[6],=NL7JN(3)[6], + =NL7KV(3)[6],=NL7LI(3)[6],=NL7MS(3)[6],=NL7MT(3)[6],=NL7NL(3)[6],=NL7OF(3)[6],=NL7PN(3)[6], + =NL7QI(3)[6],=NL7RL(3)[6],=NL7RN(3)[6],=NL7TK(3)[6],=NL7UE(3)[6],=NL7US(3)[6],=NL7VS(3)[6], + =NL7WD(3)[6],=NL7WJ(3)[6],=NL7XX(3)[6],=NL7ZM(3)[6],=NL7ZN(3)[6],=NL7ZP(3)[6],=NP2CT(3)[6], + =NP2KL(3)[6],=NP2LK(3)[6],=NP2X/7(3)[6],=NP3PH(3)[6],=NP4AI/M(3)[6],=NP4ES(3)[6],=NP4FP(3)[6], + =NP4I(3)[6],=NP4JV(3)[6],=NP4JV/7(3)[6],=VA2GLB/P(3)[6],=WH0AAM(3)[6],=WH0J(3)[6],=WH2ACV(3)[6], + =WH2AJF(3)[6],=WH6ANB(3)[6],=WH6ARU(3)[6],=WH6ASB(3)[6],=WH6B(3)[6],=WH6BDR(3)[6],=WH6BLM(3)[6], + =WH6BPL(3)[6],=WH6BPU(3)[6],=WH6CF(3)[6],=WH6CMS(3)[6],=WH6CN(3)[6],=WH6CUS(3)[6],=WH6CWD(3)[6], + =WH6CXB(3)[6],=WH6CXE(3)[6],=WH6CXN(3)[6],=WH6CYB(3)[6],=WH6CZ(3)[6],=WH6DAY(3)[6],=WH6DJO(3)[6], + =WH6DKC(3)[6],=WH6DKG(3)[6],=WH6DKO(3)[6],=WH6DLQ(3)[6],=WH6DMS(3)[6],=WH6DQ(3)[6],=WH6DRP(3)[6], + =WH6DST(3)[6],=WH6DTH(3)[6],=WH6EEC(3)[6],=WH6EEG(3)[6],=WH6EGM(3)[6],=WH6EHW(3)[6],=WH6EJV(3)[6], + =WH6EQB(3)[6],=WH6EQE(3)[6],=WH6EQH(3)[6],=WH6ESS(3)[6],=WH6ETO(3)[6],=WH6EWE(3)[6],=WH6FCT(3)[6], + =WH6FEU(3)[6],=WH6FJR(3)[6],=WH6FL(3)[6],=WH6FOJ(3)[6],=WH6FPR(3)[6],=WH6FPV(3)[6],=WH6FQ(3)[6], + =WH6FQK(3)[6],=WH6GCT(3)[6],=WH6GEV(3)[6],=WH6OL(3)[6],=WH6OY(3)[6],=WH6QV(3)[6],=WH6SD(3)[6], + =WH6SR(3)[6],=WH6TI(3)[6],=WH6U(3)[6],=WH6XV(3)[6],=WH6YT(3)[6],=WH6YX(3)[6],=WH6ZR(3)[6], + =WH6ZV(3)[6],=WH7A(3)[6],=WH7CY(3)[6],=WH7DA(3)[6],=WH7DB(3)[6],=WH7DE(3)[6],=WH7G(3)[6], + =WH7GC(3)[6],=WH7GY(3)[6],=WH7HU(3)[6],=WH7LB(3)[6],=WH7NS(3)[6],=WH7OK(3)[6],=WH7P(3)[6], + =WH7RG(3)[6],=WH7TC(3)[6],=WH7TN(3)[6],=WH7TR(3)[6],=WH7U(3)[6],=WH7UP(3)[6],=WH7WP(3)[6], + =WH7WT(3)[6],=WH7XP(3)[6],=WH8AAG(3)[6],=WL7AAW(3)[6],=WL7AL(3)[6],=WL7AP(3)[6],=WL7AQ(3)[6], + =WL7AUY(3)[6],=WL7AWD(3)[6],=WL7AXI(3)[6],=WL7AZG(3)[6],=WL7AZL(3)[6],=WL7BCR(3)[6],=WL7BHR(3)[6], + =WL7BLM(3)[6],=WL7BM(3)[6],=WL7BNQ(3)[6],=WL7BON(3)[6],=WL7BOO(3)[6],=WL7BSW(3)[6],=WL7BUI(3)[6], + =WL7BVN(3)[6],=WL7BVS(3)[6],=WL7CAZ(3)[6],=WL7CBF(3)[6],=WL7CES(3)[6],=WL7COQ(3)[6],=WL7CPE(3)[6], + =WL7CPI(3)[6],=WL7CQX(3)[6],=WL7CRJ(3)[6],=WL7CSL(3)[6],=WL7CTB(3)[6],=WL7CTC(3)[6],=WL7CTE(3)[6], + =WL7DD(3)[6],=WL7FA(3)[6],=WL7FR(3)[6],=WL7FU(3)[6],=WL7H(3)[6],=WL7HE(3)[6],=WL7HK(3)[6], + =WL7HL(3)[6],=WL7IQ(3)[6],=WL7IS(3)[6],=WL7JG(3)[6],=WL7JM(3)[6],=WL7K(3)[6],=WL7K/7(3)[6], + =WL7K/M(3)[6],=WL7LB(3)[6],=WL7LK(3)[6],=WL7OA(3)[6],=WL7P(3)[6],=WL7PJ(3)[6],=WL7QC(3)[6], + =WL7QX(3)[6],=WL7RV/140(3)[6],=WL7SD(3)[6],=WL7SO(3)[6],=WL7SV(3)[6],=WL7T/P(3)[6],=WL7VK(3)[6], + =WL7VV(3)[6],=WL7WB(3)[6],=WL7WF(3)[6],=WL7WG(3)[6],=WL7WK(3)[6],=WL7WM(3)[6],=WL7WU(3)[6], + =WL7XE(3)[6],=WL7XJ(3)[6],=WL7XN(3)[6],=WL7XW(3)[6],=WL7Z(3)[6],=WL7ZM(3)[6],=WP2ADG(3)[6], + =WP3ZO(3)[6],=WP4DYP(3)[6],=WP4NBP(3)[6], + AA8(4)[8],AB8(4)[8],AC8(4)[8],AD8(4)[8],AE8(4)[8],AF8(4)[8],AG8(4)[8],AI8(4)[8],AJ8(4)[8], + AK8(4)[8],K8(4)[8],KA8(4)[8],KB8(4)[8],KC8(4)[8],KD8(4)[8],KE8(4)[8],KF8(4)[8],KG8(4)[8], + KI8(4)[8],KJ8(4)[8],KK8(4)[8],KM8(4)[8],KN8(4)[8],KO8(4)[8],KQ8(4)[8],KR8(4)[8],KS8(4)[8], + KT8(4)[8],KU8(4)[8],KV8(4)[8],KW8(4)[8],KX8(4)[8],KY8(4)[8],KZ8(4)[8],N8(4)[8],NA8(4)[8], + NB8(4)[8],NC8(4)[8],ND8(4)[8],NE8(4)[8],NF8(4)[8],NG8(4)[8],NI8(4)[8],NJ8(4)[8],NK8(4)[8], + NM8(4)[8],NN8(4)[8],NO8(4)[8],NQ8(4)[8],NR8(4)[8],NS8(4)[8],NT8(4)[8],NU8(4)[8],NV8(4)[8], + NW8(4)[8],NX8(4)[8],NY8(4)[8],NZ8(4)[8],W8(4)[8],WA8(4)[8],WB8(4)[8],WC8(4)[8],WD8(4)[8], + WE8(4)[8],WF8(4)[8],WG8(4)[8],WI8(4)[8],WJ8(4)[8],WK8(4)[8],WM8(4)[8],WN8(4)[8],WO8(4)[8], + WQ8(4)[8],WR8(4)[8],WS8(4)[8],WT8(4)[8],WU8(4)[8],WV8(4)[8],WW8(4)[8],WX8(4)[8],WY8(4)[8], + WZ8(4)[8],=AH2AR(4)[8],=AH2AV(4)[8],=AH2JD(4)[8],=AH6AO(4)[8],=AH6MQ(4)[8],=AH8AH(4)[8], + =AL4E(4)[8],=AL7AH(4)[8],=AL7BA/8(4)[8],=AL7GI(4)[8],=AL7GI/8(4)[8],=AL7J/8(4)[8],=AL7JB(4)[8], + =AL7OP(4)[8],=KH2AP(4)[8],=KH6BZF/8(4)[8],=KH6DHK(4)[8],=KH6IK(4)[8],=KH6ILT(4)[8],=KH6SM(4)[8], + =KH7DK(4)[8],=KH7SP(4)[8],=KL0DN(4)[8],=KL0NR(4)[8],=KL0PD(4)[8],=KL0PE(4)[8],=KL2NI(4)[8], + =KL2PS(4)[8],=KL2WF(4)[8],=KL2YU(4)[8],=KL3DA(4)[8],=KL3HQ(4)[8],=KL4PQ(4)[8],=KL5A(4)[8], + =KL7DS(4)[8],=KL7FHI(4)[8],=KL7FHK(4)[8],=KL7GF(4)[8],=KL7IKR(4)[8],=KL7IUC(4)[8],=KL7IYK(4)[8], + =KL7IYK/8(4)[8],=KL7OG(4)[8],=KL7RF(4)[8],=KL7RF/8(4)[8],=KL7SW(4)[8],=KL8X(4)[8],=KL9A/8(4)[8], + =KP2RF(4)[8],=KP4AKB(4)[8],=KP4AMZ(4)[8],=KP4AQI(4)[8],=KP4E(4)[8],=KP4HMR(4)[8],=KP4MAS(4)[8], + =KP4VZ(4)[8],=KP4ZD(4)[8],=NH6CN(4)[8],=NH6CN/8(4)[8],=NL7CF(4)[8],=NL7FK(4)[8],=NP2AK(4)[8], + =NP2DW(4)[8],=NP2F(4)[8],=NP3NA(4)[8],=NP4C/8(4)[8],=VE3ACW/M(4)[8],=WH2U(4)[8],=WH6BCB(4)[8], + =WH6CYR(4)[8],=WH6E(4)[8],=WH6E/8(4)[8],=WH6EBA(4)[8],=WH6EJD(4)[8],=WH6EWB(4)[8],=WH6TB(4)[8], + =WL7AGO(4)[8],=WL7AM(4)[8],=WL7BKR(4)[8],=WL7CMV(4)[8],=WL7GG(4)[8],=WL7HC(4)[8],=WL7OS(4)[8], + =WL7OT(4)[8],=WL7U(4)[8],=WP3KU(4)[8],=WP3S(4)[8],=WP4HJF(4)[8],=WP4IJK(4)[8],=WP4JVV(4)[8], + =WP4MWB(4)[8],=WP4NAE(4)[8],=WP4NYQ(4)[8],=WP4PLR(4)[8], + AA9(4)[8],AB9(4)[8],AC9(4)[8],AD9(4)[8],AE9(4)[8],AF9(4)[8],AG9(4)[8],AI9(4)[8],AJ9(4)[8], + AK9(4)[8],K9(4)[8],KA9(4)[8],KB9(4)[8],KC9(4)[8],KD9(4)[8],KE9(4)[8],KF9(4)[8],KG9(4)[8], + KI9(4)[8],KJ9(4)[8],KK9(4)[8],KM9(4)[8],KN9(4)[8],KO9(4)[8],KQ9(4)[8],KR9(4)[8],KS9(4)[8], + KT9(4)[8],KU9(4)[8],KV9(4)[8],KW9(4)[8],KX9(4)[8],KY9(4)[8],KZ9(4)[8],N9(4)[8],NA9(4)[8], + NB9(4)[8],NC9(4)[8],ND9(4)[8],NE9(4)[8],NF9(4)[8],NG9(4)[8],NI9(4)[8],NJ9(4)[8],NK9(4)[8], + NM9(4)[8],NN9(4)[8],NO9(4)[8],NQ9(4)[8],NR9(4)[8],NS9(4)[8],NT9(4)[8],NU9(4)[8],NV9(4)[8], + NW9(4)[8],NX9(4)[8],NY9(4)[8],NZ9(4)[8],W9(4)[8],WA9(4)[8],WB9(4)[8],WC9(4)[8],WD9(4)[8], + WE9(4)[8],WF9(4)[8],WG9(4)[8],WI9(4)[8],WJ9(4)[8],WK9(4)[8],WM9(4)[8],WN9(4)[8],WO9(4)[8], + WQ9(4)[8],WR9(4)[8],WS9(4)[8],WT9(4)[8],WU9(4)[8],WV9(4)[8],WW9(4)[8],WX9(4)[8],WY9(4)[8], + WZ9(4)[8],=AH0AJ(4)[8],=AH6DA(4)[8],=AH6EZ/9(4)[8],=AH6OM(4)[8],=AH6YL(4)[8],=AL1CE(4)[8], + =AL7AK(4)[8],=AL7AK/9(4)[8],=AL7BT(4)[8],=AL7CV(4)[8],=AL7DS(4)[8],=AL7II/9(4)[8],=AL7OL(4)[8], + =AL7PM(4)[8],=AL7RH(4)[8],=KH0BE(4)[8],=KH2RP(4)[8],=KH6JNY(4)[8],=KH6KI(4)[8],=KH6UX(4)[8], + =KH7DR(4)[8],=KH7EI(4)[8],=KH7ZT(4)[8],=KL0LB(4)[8],=KL0NY(4)[8],=KL0XT(4)[8],=KL1NO(4)[8], + =KL1NR(4)[8],=KL1QN(4)[8],=KL1US(4)[8],=KL2A/9(4)[8],=KL2KP(4)[8],=KL2NQ(4)[8],=KL2UY(4)[8], + =KL2YD(4)[8],=KL2ZL(4)[8],=KL4CX(4)[8],=KL7AL(4)[8],=KL7AL/9(4)[8],=KL7BGR(4)[8],=KL7CE(4)[8], + =KL7CE/9(4)[8],=KL7IBV(4)[8],=KL7IKP(4)[8],=KL7IPS(4)[8],=KL7IVK(4)[8],=KL7JAB(4)[8],=KL7MU(4)[8], + =KL7TD(4)[8],=KP2XX(4)[8],=KP3JOS(4)[8],=KP3VA/M(4)[8],=KP4CI(4)[8],=KP4GE/9(4)[8],=KP4JEL(4)[8], + =KP4NKE(4)[8],=KP4SL(4)[8],=KP4WG(4)[8],=NH2W(4)[8],=NH2W/9(4)[8],=NH6R(4)[8],=NH7TK(4)[8], + =NL7CM(4)[8],=NL7KD(4)[8],=NL7NK(4)[8],=NL7QC(4)[8],=NL7QC/9(4)[8],=NL7RC(4)[8],=NL7UH(4)[8], + =NL7YI(4)[8],=NP2AV(4)[8],=NP2DK(4)[8],=NP2GM(4)[8],=NP2I(4)[8],=NP2L/9(4)[8],=NP2MU(4)[8], + =NP3QC(4)[8],=NP4ZI(4)[8],=WH0AI(4)[8],=WH2T(4)[8],=WH6ERQ(4)[8],=WH6FBA(4)[8],=WH6FIR(4)[8], + =WH6SB(4)[8],=WL7AHP(4)[8],=WL7AIT(4)[8],=WL7BEV(4)[8],=WL7BSZ(4)[8],=WL7CTA(4)[8],=WL7FJ(4)[8], + =WL7JAN(4)[8],=WL7NP(4)[8],=WL7UU(4)[8],=WL9N(4)[8],=WP2B(4)[8],=WP4JSP(4)[8],=WP4LKY(4)[8], + =WP4LSQ(4)[8],=WP4MQX(4)[8],=WP4MSD(4)[8],=WP4MTN(4)[8],=WP4MVQ(4)[8],=WP4MXP(4)[8],=WP4MYL(4)[8], + =WP4OCZ(4)[8], + =AH2BG(4)[8],=AH2CF(4)[8],=AH6ES(4)[8],=AH6FF(4)[8],=AH6HR(4)[8],=AH6HR/4(4)[8],=AH6KB(4)[8], + =AL0F(4)[8],=AL0P(4)[8],=AL2C(4)[8],=AL2F/4(4)[8],=AL4B(4)[8],=AL7CX(4)[8],=AL7EU(4)[8], + =AL7JN(4)[8],=AL7KN(4)[8],=AL7LP(4)[8],=AL7MR(4)[8],=AL7QO(4)[8],=KH0UN(4)[8],=KH2AR(4)[8], + =KH2AR/4(4)[8],=KH2BX(4)[8],=KH2DN(4)[8],=KH2EP(4)[8],=KH2GM(4)[8],=KH4AF(4)[8],=KH6EO(4)[8], + =KH6JQW(4)[8],=KH6KM(4)[8],=KH6OE(4)[8],=KH6RD(4)[8],=KH6RD/4(4)[8],=KH6SKY(4)[8],=KH6SKY/4(4)[8], + =KH7JM(4)[8],=KH7UB(4)[8],=KL0AH(4)[8],=KL0BX(4)[8],=KL0CP(4)[8],=KL0ET(4)[8],=KL0ET/M(4)[8], + =KL0EY(4)[8],=KL0FF(4)[8],=KL0GI(4)[8],=KL0LN(4)[8],=KL0PM(4)[8],=KL0VH(4)[8],=KL1DN(4)[8], + =KL1IG(4)[8],=KL1LV(4)[8],=KL1SE(4)[8],=KL1SE/4(4)[8],=KL1ZA(4)[8],=KL2GB(4)[8],=KL2HK(4)[8], + =KL2LK(4)[8],=KL2LU(4)[8],=KL2TD(4)[8],=KL3PG(4)[8],=KL3PV(4)[8],=KL3RA(4)[8],=KL3SA(4)[8], + =KL4EJ(4)[8],=KL4KA(4)[8],=KL4WV(4)[8],=KL7DT/4(4)[8],=KL7EZ(4)[8],=KL7FO/P(4)[8],=KL7GN/M(4)[8], + =KL7IUQ(4)[8],=KL7JKC(4)[8],=KL7LT(4)[8],=KL7WW(4)[8],=KL7YT(4)[8],=KL9MEK(4)[8],=KP4TOM(4)[8], + =NH2E(4)[8],=NH6T/4(4)[8],=NH7FK(4)[8],=NH7FL(4)[8],=NH7H(4)[8],=NL7OE(4)[8],=NL7YU(4)[8], + =NP2KS(4)[8],=NP3FB(4)[8],=NP4AC(4)[8],=NP4AC/4(4)[8],=WH6AUL(4)[8],=WH6BPL/4(4)[8],=WH6DM(4)[8], + =WH6EMF(4)[8],=WH6EOG(4)[8],=WH6EQW(4)[8],=WH6FEJ(4)[8],=WH6LAK(4)[8],=WH6OR(4)[8],=WH6Q/4(4)[8], + =WL4B(4)[8],=WL7BHI(4)[8],=WL7BHJ(4)[8],=WL7C(4)[8],=WL7CQH(4)[8],=WL7CQK(4)[8],=WL7IP(4)[8], + =WL7PC(4)[8],=WL7SF(4)[8],=WL7TD(4)[8],=WL7XZ(4)[8],=WP3IK(4)[8],=WP4CNA(4)[8],=WP4XF(4)[8], + =AH3D(4)[7],=AL1VE/R(4)[7],=AL7AU(4)[7],=AL7IC(4)[7],=AL7NI(4)[7],=AL7RT(4)[7],=AL7RT/7(4)[7], + =KH2BR/7(4)[7],=KH6JVF(4)[7],=KH6OZ(4)[7],=KH7AL(4)[7],=KH7SS(4)[7],=KL0NT(4)[7],=KL0NV(4)[7], + =KL0RN(4)[7],=KL0TF(4)[7],=KL1HE(4)[7],=KL1MW(4)[7],=KL1TV(4)[7],=KL2NZ(4)[7],=KL4CZ(4)[7], + =KL7AR(4)[7],=KL7HF(4)[7],=KL7HSG(4)[7],=KL7JGS(4)[7],=KL7JGS/M(4)[7],=KL7JM(4)[7],=KL7JUL(4)[7], + =KL7LH(4)[7],=KL7MVX(4)[7],=KL7YY/7(4)[7],=KL9A(4)[7],=KL9A/7(4)[7],=NH6HW(4)[7],=NL7IH(4)[7], + =NL7MW(4)[7],=NL7UI(4)[7],=WH2M(4)[7],=WH6COM(4)[7],=WH6ETU(4)[7],=WH6EVP(4)[7],=WH6FWD(4)[7], + =WH6GFE(4)[7],=WL7A(4)[7],=WL7DP(4)[7],=WL7HP/7(4)[7],=WL7I(4)[7], + =AL7LU(5)[8],=KL7JFR(5)[8]; +Guantanamo Bay: 08: 11: NA: 20.00: 75.00: 5.0: KG4: + KG4,=KG44WW,=KG4AC,=KG4AS,=KG4AW,=KG4AY,=KG4BP,=KG4DY,=KG4EM,=KG4EU,=KG4HF,=KG4HH,=KG4LA,=KG4LB, + =KG4MA,=KG4NE,=KG4SC,=KG4SS,=KG4WH,=KG4WV,=KG4XP,=KG4ZK,=W1AW/KG4; +Mariana Islands: 27: 64: OC: 15.18: -145.72: -10.0: KH0: + AH0,KH0,NH0,WH0,=AA1AB,=AA1UQ,=AB2HV,=AB2QH,=AB9HF,=AB9OQ,=AC8CP,=AD5KT,=AD6YP,=AE6OG,=AF4IN, + =AF4KH,=AF6EO,=AG6BC,=AH2CW,=AH2U,=AJ6K,=AK1JA,=K0FRI,=K8KH,=K8RN,=KB5UAB,=KB9LQG,=KC2WIK,=KC7SDC, + =KC9GQX,=KD7GJX,=KF7COQ,=KG2QH,=KG6GQ,=KG6SB,=KG7DCN,=KH0EN/KT,=KH2GV,=KH2O,=KH2VL,=KI5DQL, + =KL7QOL,=KQ1J,=KW2X,=N0J,=N3QD,=N4VUC,=N6EAX,=N7NNG,=N8CS,=NA1M,=NH2B,=NH2FG,=NO3V,=NQ1J,=NS0C, + =W1FPU,=W2OTO,=W3FM,=W3STX,=W7KFS,=WA6AC,=WE1J,=WH6ZW,=WO2G; +Baker & Howland Islands: 31: 61: OC: 0.00: 176.00: 12.0: KH1: + AH1,KH1,NH1,WH1; +Guam: 27: 64: OC: 13.37: -144.70: -10.0: KH2: + AH2,KH2,NH2,WH2,=AB2AB,=AB8EW,=AC0FG,=AC7WL,=AE6QZ,=AE7CA,=AH0AX,=AH0F,=AH0FM,=AH0IM,=AI6ID, + =AJ6JF,=K1IWD,=K2QGC,=K4QFS,=K5GUA,=K5GUM,=KA0RU,=KA1I,=KA6BEG,=KB6IDK,=KB7OVT,=KB7PQU,=KC2OOX, + =KD0AA,=KD7IRV,=KE4YSP,=KE7GMC,=KE7IPG,=KF4UFC,=KF5ULC,=KF7BMU,=KG4BKW,=KG6AGT,=KG6ARL,=KG6DX, + =KG6FJG,=KG6JDX,=KG6JKR,=KG6JKT,=KG6TWZ,=KH0DX,=KH0ES,=KH0TF,=KH0UM,=KH6KK,=KI4KKH,=KI4KKI, + =KI7SSW,=KJ6AYQ,=KJ6KCJ,=KK6GVF,=KK7AV,=KM4NVB,=KN4IAS,=KN4LVP,=N0RY,=N2MI,=NH0A,=NH0B,=NH0Q, + =NH7TL,=NP3EZ,=W5LFA,=W6KV,=W7GVC,=W9MRE,=WA3KNB,=WB7AXZ,=WH0AC,=WI3O; +Johnston Island: 31: 61: OC: 16.72: 169.53: 10.0: KH3: + AH3,KH3,NH3,WH3,=KJ6BZ; +Midway Island: 31: 61: OC: 28.20: 177.37: 11.0: KH4: + AH4,KH4,NH4,WH4; +Palmyra & Jarvis Islands: 31: 61: OC: 5.87: 162.07: 11.0: KH5: + AH5,KH5,NH5,WH5; +Hawaii: 31: 61: OC: 21.12: 157.48: 10.0: KH6: + AH6,AH7,KH6,KH7,NH6,NH7,WH6,WH7,=AA7FL,=AA7LE,=AA8JA,=AB0JM,=AB3WS,=AB4CO,=AB6AP,=AB7RT,=AB8VQ, + =AC4PJ,=AC4TJ,=AC9PT,=AE3TT,=AE5AB,=AE5LR,=AG4FH,=AG5LT,=AH0A,=AH0AG,=AH2CC,=AH2CN,=AJ0M,=AJ8HT, + =AK2J,=AK4RA,=AL3U,=AL6D,=AL7RQ,=K0BAD,=K0LAS,=K0LIH,=K0OUS,=K1ENT,=K1ER,=K1HZM,=K1OSP,=K1OWL, + =K1RJ,=K1TOR,=K1VAN,=K2FFT,=K2GT,=K3NW,=K3UNS,=K4AJQ,=K4EVR,=K4JMB,=K4RAC,=K4UAI,=K4UHL,=K4XV, + =K5HQM,=K5PKT,=K5ZAI,=K5ZYO,=K6AMA,=K6APP,=K6BU,=K6CEE,=K6GJS,=K6GUY,=K6HI,=K6HNL,=K6IJ,=K6JAE, + =K6KKW,=K6LN,=K6RSB,=K7ALH,=K7ASH,=K7NRJ,=K7QAS,=K7ZOX,=K8EUT,=K9AGI,=K9FD,=K9UBS,=KA0FOR,=KA0VHP, + =KA1ICJ,=KA1YJ,=KA2IXG,=KA2WXU,=KA3HIZ,=KA3TUA,=KA4INK,=KA4SBE,=KA6QOD,=KA6SVW,=KA7APU,=KA7BSK, + =KA7RKW,=KA8EBL,=KA8KND,=KA9DMP,=KB0DJR,=KB0PXK,=KB0ZKZ,=KB1EUJ,=KB1GC,=KB1KAC,=KB1PCX,=KB1UHL, + =KB2MRY,=KB3DMT,=KB3FDP,=KB3HXI,=KB3IOC,=KB3OXU,=KB3PJS,=KB3SEV,=KB3UWV,=KB3UWW,=KB3VLO,=KB4NGN, + =KB5FCV,=KB5HVJ,=KB5MTI,=KB5NNY,=KB5OWT,=KB5OXR,=KB6CNU,=KB6EGA,=KB6INB,=KB6PKF,=KB6SWL,=KB7AKH, + =KB7AKQ,=KB7DDX,=KB7EA,=KB7G,=KB7JB,=KB7LPW,=KB7MEU,=KB7QKJ,=KB7UQH,=KB7UVR,=KB7WDC,=KB7WUP, + =KB8SKX,=KB9YGQ,=KC0HFI,=KC0WQU,=KC0YIH,=KC1DBY,=KC2CLQ,=KC2GSU,=KC2HL,=KC2MIU,=KC2PGW,=KC2SRW, + =KC2YL,=KC2ZSG,=KC2ZSH,=KC2ZSI,=KC3BW,=KC3GZT,=KC4HHS,=KC4TJB,=KC5GAX,=KC6HOX,=KC6JAE,=KC6MCC, + =KC6QQI,=KC6RYQ,=KC6SHT,=KC6SWR,=KC6YIO,=KC7ASJ,=KC7AXX,=KC7DUT,=KC7EJC,=KC7HNC,=KC7KAT,=KC7KAW, + =KC7KBA,=KC7KHW,=KC7KJT,=KC7LFM,=KC7NZ,=KC7PLG,=KC7USA,=KC7VWU,=KC7YXO,=KC8EFI,=KC8EJ,=KC8JNV, + =KC8KPX,=KC9AUA,=KC9EQS,=KC9KEX,=KC9NJG,=KC9SBG,=KD0JNO,=KD0OXU,=KD0QLQ,=KD0QLR,=KD0RPD,=KD0WVZ, + =KD0ZSP,=KD3FZ,=KD4GVR,=KD4GW,=KD4ML,=KD4NFW,=KD4QWO,=KD5BSK,=KD5HDA,=KD5HX,=KD5TBQ,=KD6CVU, + =KD6CWF,=KD6EPD,=KD6IPX,=KD6LRA,=KD6NVX,=KD6VTU,=KD7GWI,=KD7GWM,=KD7HTG,=KD7KFT,=KD7SME,=KD7SMV, + =KD7TZ,=KD7UV,=KD7UZG,=KD7WJM,=KD8GVO,=KD8LYB,=KE0JSB,=KE0KIE,=KE0TU,=KE2CX,=KE4DYE,=KE4RNU, + =KE4UXQ,=KE4ZXQ,=KE5CGA,=KE5FJM,=KE5UZN,=KE5VQB,=KE6AHX,=KE6AXN,=KE6AXP,=KE6AYZ,=KE6CQE,=KE6EDJ, + =KE6EVT,=KE6JXO,=KE6MKW,=KE6QQ,=KE6RAW,=KE6TFR,=KE6TIS,=KE6TIX,=KE6TKQ,=KE7DES,=KE7DET,=KE7FJA, + =KE7FSK,=KE7HEW,=KE7IZS,=KE7JTX,=KE7KRQ,=KE7LWN,=KE7MW,=KE7PEQ,=KE7PIZ,=KE7QML,=KE7RCT,=KE7UAJ, + =KE7UV,=KE7UW,=KF4DWA,=KF4FQR,=KF4IBW,=KF4JLZ,=KF4OOB,=KF4SGA,=KF4UJC,=KF4URD,=KF4VHS,=KF5AHW, + =KF5JFX,=KF5MXM,=KF5MXP,=KF6BS,=KF6FDG,=KF6IVV,=KF6LWN,=KF6LYU,=KF6MQT,=KF6OHL,=KF6OSA,=KF6PJ, + =KF6PQE,=KF6QZD,=KF6RLP,=KF6YYH,=KF6YZR,=KF6ZAL,=KF6ZVS,=KF7GNP,=KF7LRS,=KF7OJR,=KF7TUU,=KF7VUK, + =KG0XR,=KG4CAN,=KG4FJB,=KG4HZF,=KG4JKJ,=KG4MGL,=KG4SGC,=KG4SGV,=KG4TZD,=KG5CH,=KG5CNO,=KG5IVP, + =KG6CJA,=KG6CJK,=KG6DV,=KG6EZW,=KG6HRX,=KG6IER,=KG6IGY,=KG6JJP,=KG6LFX,=KG6MZJ,=KG6NNF,=KG6NQI, + =KG6OOB,=KG6RJI,=KG6SC,=KG6SDD,=KG6TFI,=KG6WZD,=KG6ZRY,=KG7AYU,=KG7CJI,=KG7EUP,=KG7JHH,=KG7TSD, + =KG7ZJM,=KG9MDR,=KH0AI,=KH0HL,=KH0WJ,=KH2DC,=KH2MD,=KH2TD,=KH2TE,=KH2YI,=KH3AE,=KH3AE/M,=KH3AF, + =KH8Z,=KI4CAU,=KI4HCZ,=KI4NOH,=KI4YAF,=KI4YOG,=KI6CRL,=KI6DVJ,=KI6EFY,=KI6FTE,=KI6HBZ,=KI6JEC, + =KI6LPT,=KI6NOC,=KI6QDQ,=KI6QQJ,=KI6SNP,=KI6VYB,=KI6WOJ,=KI6ZRV,=KI7AUZ,=KI7EZG,=KI7FJW,=KI7FJX, + =KI7FUT,=KI7OS,=KI7QZQ,=KJ4BHO,=KJ4EYV,=KJ4KND,=KJ4WOI,=KJ6CAV,=KJ6CKZ,=KJ6COM,=KJ6CPN,=KJ6CQT, + =KJ6FDF,=KJ6GYD,=KJ6LAW,=KJ6LAX,=KJ6LBI,=KJ6MQL,=KJ6NIA,=KJ6NIB,=KJ6NZH,=KJ6PEH,=KJ6QQT,=KJ6RGW, + =KJ6TJZ,=KJ7UOI,=KK4EEC,=KK4RNF,=KK6BRW,=KK6DIT,=KK6DWS,=KK6EJ,=KK6GM,=KK6GRC,=KK6OMX,=KK6PGA, + =KK6RM,=KK6VJN,=KK6ZQ,=KK6ZZE,=KK7WR,=KL0TK,=KL1TP,=KL3FN,=KL3JC,=KL7PN,=KL7TN/P,=KL7UB,=KL7XT, + =KM4FPS,=KM4IP,=KM6HPE,=KM6IK,=KM6RM,=KM6RWE,=KM6UVP,=KN6BE,=KN6ZU,=KN8AQR,=KO4BNK,=KO4LCM,=KO6KW, + =KO6QT,=KQ6CD,=KQ6M,=KR1LLR,=KU4OY,=KW4JC,=KX6RTG,=KY1I,=N0CAN,=N0KXY,=N0PJV,=N0VYO,=N0ZSJ,=N1CBF, + =N1CFD,=N1CNQ,=N1IDP,=N1SHV,=N1TEE,=N1TLE,=N1VOP,=N1YLH,=N2KJU,=N2KLQ,=N3BQY,=N3DJT,=N3FUR,=N3GWR, + =N3HQW,=N3RWD,=N3VDM,=N3ZFY,=N4BER,=N4ERA,=N4ZIW,=N5IWF,=N5JKJ,=N6BAA,=N6CGA,=N6DXW,=N6EQZ,=N6GOZ, + =N6IKX,=N6KB,=N6NCT,=N6OM,=N6PJQ,=N6QBK,=N6XLB,=N6ZAB,=N7AMY,=N7BLC,=N7BMD,=N7JRO,=N7KZB,=N7NYY, + =N7OBR,=N7ODC,=N7TSV,=N7WBX,=N9GFL,=N9SBL,=NB6R,=ND1A,=NE7SO,=NH2CC,=NH2CD,=NH2CF,=NH2CQ,=NH2CR, + =NH2HR,=NH2HS,=NH2HU,=NH2IB,=NH2IC,=NH2IF,=NH2II,=NH2IJ,=NH2IN,=NH2IO,=NH2JO,=NH2KF,=NH2KH,=NH2YL, + =NH2Z,=NI1J,=NL7UW,=NO0H,=NR0G,=NT0DA,=NT4AA,=NZ2F,=W0OHO,=W0UNX,=W1BMB,=W1ETT,=W1JJS,=W2UNS, + =W3ZRT,=W4AJM,=W4PRO,=W4YQS,=W5CHT,=W5FJG,=W6CAG,=W6CWJ,=W6DSD,=W6KEV,=W6KIT,=W6KPI,=W6KZL,=W6MQB, + =W6MRJ,=W6NBK,=W6QPV,=W6ROM,=W6SHH,=W6UNX,=W7EHP,=W7NVQ,=W7NX,=W7RCR,=W7TEN,=W7UEA,=W7WKS,=W8AYD, + =W8JAY,=W8WH,=WA0FUR,=WA0NHD,=WA0TFB,=WA2AUI,=WA3ZEM,=WA6AW,=WA6CZL,=WA6ECX,=WA6IIQ,=WA6JDA, + =WA6JJQ,=WA6QDQ,=WA6UVF,=WA7ESE,=WA7HEO,=WA7TFE,=WA7WSU,=WA7ZK,=WA8HEB,=WA8JQP,=WB0RUA,=WB0TZQ, + =WB1HAL,=WB2AHM,=WB2SQW,=WB4JTT,=WB4MNF,=WB5ZDH,=WB5ZOV,=WB6CVJ,=WB6PIO,=WB6PJT,=WB6SAA,=WB6VBM, + =WB8NCD,=WB9SMM,=WD0FTF,=WD0LFN,=WD4MLF,=WD8LIB,=WD8OBO,=WH2Y,=WH7K,=WK1K,=WV0Z,=WV6K,=WX0H,=WY6F; +Kure Island: 31: 61: OC: 29.00: 178.00: 10.0: KH7K: + AH7K,KH7K,NH7K,WH7K; +American Samoa: 32: 62: OC: -14.32: 170.78: 11.0: KH8: + AH8,KH8,NH8,WH8,=AB9OH,=AF7MN,=KD2UVU,=KD8TFY,=KH0WF,=KM4YJH,=KS6EL,=KS6FS,=NH0AA,=WH6BAR,=WL7BMP; +Swains Island: 32: 62: OC: -11.05: 171.25: 11.0: KH8/s: + =K9CS/KH8S,=KH6BK/KH8,=KH8/WH7S,=KH8S/K3UY,=KH8S/NA6M,=KH8S/W8TN,=KH8SI,=NH8S; +Wake Island: 31: 65: OC: 19.28: -166.63: -12.0: KH9: + AH9,KH9,NH9,WH9; +Alaska: 01: 01: NA: 61.40: 148.87: 8.0: KL: + AL,KL,NL,WL,=AA0NN,=AA7TV,=AA8FY,=AB0IC,=AB0WK,=AB0WS,=AB5JB,=AB7YB,=AB7YO,=AB8XX,=AB9OM,=AC3DF, + =AC9QX,=AD0DK,=AD0FQ,=AD0ZL,=AD3BJ,=AD6GC,=AD7MF,=AD7VV,=AE1DJ,=AE4QH,=AE5CP,=AE5EX,=AE5FN,=AE5IR, + =AE7ES,=AE7KS,=AE7SB,=AF7FV,=AG5LN,=AG5OF,=AH0AH,=AH0H,=AI7CF,=AJ4MY,=AJ4ZI,=AK4CM,=K0AZZ,=K0BHC, + =K0ESQ,=K1BZD,=K1IEE,=K1KAO,=K1LQ,=K1MAT,=K1TMT,=K2ICW,=K2NPS,=K3JMI,=K4DRC,=K4ETC,=K4HOE,=K4PSG, + =K4RND,=K4WPK,=K5DOW,=K5HL,=K5RD,=K5RSO,=K5RZW,=K5TDN,=K6ANE,=K6GKW,=K7BUF,=K7CAP,=K7EJM,=K7GRW, + =K7LOP,=K7MVX,=K7OCL,=K7RDR,=K7UNX,=K7VRK,=K8IEL,=K8OUA,=K9DUG,=KA0SIM,=KA0YPV,=KA1NCN,=KA2TJZ, + =KA2ZSD,=KA6DBB,=KA6UGT,=KA7ETQ,=KA7HHF,=KA7HOX,=KA7JOR,=KA7PUB,=KA7TMU,=KA7TOM,=KA7UKN,=KA7VCR, + =KA7YEY,=KA9GYQ,=KB0APK,=KB0LOW,=KB0TSU,=KB0UGE,=KB0UVK,=KB1CRT,=KB1FCX,=KB1IEV,=KB1KLH,=KB1PHP, + =KB1QCD,=KB1QCE,=KB1SYV,=KB1WQL,=KB2FWF,=KB2JWV,=KB2ZME,=KB3CYB,=KB3JFK,=KB3NCR,=KB3VQE,=KB4DX, + =KB5DNT,=KB5HEV,=KB5NOW,=KB5UWU,=KB5YLG,=KB6DKJ,=KB7AMA,=KB7BNG,=KB7BUF,=KB7DEL,=KB7FXJ,=KB7IBI, + =KB7JA,=KB7LJZ,=KB7LON,=KB7PHT,=KB7QLB,=KB7RWK,=KB7RXZ,=KB7SIQ,=KB7UBH,=KB7VFZ,=KB7YEC,=KB7ZVZ, + =KB8LJT,=KB8QKR,=KB8SBG,=KB8TEW,=KB8VYJ,=KB9MWG,=KB9RWE,=KB9RWJ,=KB9THD,=KB9YGR,=KC0ATI,=KC0CWG, + =KC0CYR,=KC0EF,=KC0EFL,=KC0GDH,=KC0GHH,=KC0GLN,=KC0JVX,=KC0LLL,=KC0NSV,=KC0OKQ,=KC0PSZ,=KC0TK, + =KC0TZL,=KC0UYK,=KC0VDN,=KC0WSG,=KC0YSW,=KC1DL,=KC1KPL,=KC1LVR,=KC2BYX,=KC2HRV,=KC2KMU,=KC2OJP, + =KC2PCV,=KC2PIO,=KC3BWW,=KC3DBK,=KC3NUH,=KC3QVN,=KC4MXQ,=KC4MXR,=KC4OPI,=KC5BNN,=KC5CHO,=KC5DJA, + =KC5IBS,=KC5KIG,=KC5LKF,=KC5LKG,=KC5NHL,=KC5QPJ,=KC5THY,=KC5YIB,=KC5YOX,=KC5ZAA,=KC6FRJ,=KC6RJW, + =KC7BUL,=KC7COW,=KC7DNT,=KC7ENM,=KC7FWK,=KC7HJM,=KC7HPF,=KC7IKE,=KC7IKF,=KC7INC,=KC7MIJ,=KC7MPY, + =KC7MRO,=KC7OQZ,=KC7PLJ,=KC7PLQ,=KC7RCP,=KC7TYT,=KC7UZY,=KC7WOA,=KC7YZR,=KC8GKK,=KC8MVW,=KC8NOY, + =KC8WWS,=KC8YIV,=KC9CMY,=KC9HIK,=KC9IKH,=KC9RQZ,=KC9SXX,=KC9VLD,=KD0CLU,=KD0CZC,=KD0DHU,=KD0FJG, + =KD0IXU,=KD0JJB,=KD0NSG,=KD0OAK,=KD0ONB,=KD0VAK,=KD0VAL,=KD0ZOD,=KD2CTE,=KD2GKT,=KD2NPD,=KD2SKJ, + =KD4EYW,=KD4MEY,=KD4QJL,=KD5DNA,=KD5DWV,=KD5GAL,=KD5MQC,=KD5NAH,=KD5QPD,=KD5RVD,=KD5SHW,=KD5WCF, + =KD5WEV,=KD5WYP,=KD6DLB,=KD6NFV,=KD6RVY,=KD6YKS,=KD7AWK,=KD7BBX,=KD7BGP,=KD7DIG,=KD7DUQ,=KD7FGL, + =KD7FUL,=KD7HXF,=KD7IMM,=KD7IMT,=KD7KRK,=KD7MGO,=KD7OOS,=KD7QAR,=KD7RYC,=KD7SIX,=KD7TOJ,=KD7TWB, + =KD7UAG,=KD7VOI,=KD7VXE,=KD7ZTJ,=KD8DDY,=KD8GEL,=KD8GMS,=KD8JOU,=KD8KQL,=KD8LNA,=KD8WMX,=KD9QKS, + =KD9TK,=KE0DYM,=KE0KKI,=KE0PRX,=KE4DGR,=KE4LJD,=KE4MQD,=KE4YEI,=KE4YLG,=KE5CVD,=KE5CVT,=KE5DQV, + =KE5FOC,=KE5GEB,=KE5HHR,=KE5JHS,=KE5JTB,=KE5NLG,=KE5QDJ,=KE5QDK,=KE5WGZ,=KE5ZRK,=KE5ZUM,=KE6DLM, + =KE6DUJ,=KE6DXH,=KE6IPM,=KE6SYD,=KE6TCE,=KE6VUB,=KE7DFO,=KE7ELL,=KE7EOP,=KE7EPZ,=KE7FNC,=KE7FXM, + =KE7GOE,=KE7HMJ,=KE7KYU,=KE7PXV,=KE7TRX,=KE7ZXH,=KE8RO,=KF3L,=KF4JET,=KF4PLR,=KF4TBD,=KF4YFD, + =KF5CVM,=KF5ETW,=KF5FJQ,=KF5HFB,=KF5HJC,=KF5NDT,=KF5UBP,=KF5YYK,=KF6AWG,=KF6AXS,=KF6BMF,=KF6BOV, + =KF6EJR,=KF6GNM,=KF6IAO,=KF6ILC,=KF6IOT,=KF6LGK,=KF6MFK,=KF6QOJ,=KF6RMG,=KF6RPC,=KF6SHS,=KF6TGR, + =KF6UWT,=KF7ARC,=KF7CXJ,=KF7FLL,=KF7FLM,=KF7GCF,=KF7GKY,=KF7ING,=KF7ITN,=KF7KTH,=KF7LEX,=KF7LUA, + =KF7MVM,=KF7PCJ,=KF7PFT,=KF7PSS,=KF7PUQ,=KF7UFY,=KF7VBO,=KF7WVE,=KF8ZB,=KG2IA,=KG4BBX,=KG4NBL/P, + =KG4TJS,=KG4WNZ,=KG5EQN,=KG5GDF,=KG5GTD,=KG5JQC,=KG5MIB,=KG5MIO,=KG6ALN,=KG6DTI,=KG6MBC,=KG6RJE, + =KG6TAL,=KG7CUR,=KG7DVI,=KG7GJL,=KG7JVJ,=KG7OQC,=KG7OUF,=KG7OYE,=KG7SEQ,=KG7SRS,=KG7TGE,=KG7ZEV, + =KH0NF,=KH0NG,=KH0RF,=KH2YN,=KH7BW,=KI4COG,=KI4ERC,=KI4FJK,=KI4GAG,=KI4GCF,=KI4GDI,=KI4NGY, + =KI4NVI,=KI4SET,=KI4SOM,=KI6BGR,=KI6DES,=KI6HGW,=KI6YXZ,=KI7BKQ,=KI7COR,=KI7PZ,=KI8JT,=KJ4HEW, + =KJ4IAQ,=KJ4NPK,=KJ4PSV,=KJ4WIQ,=KJ4YOY,=KJ4ZWI,=KJ6DCH,=KJ6KRG,=KJ6RFQ,=KJ6ZSX,=KJ7IR,=KJ7MY, + =KK4AMV,=KK4BAN,=KK4CAS,=KK4CAU,=KK4CHH,=KK4CLS,=KK4LRE,=KK4QXE,=KK4RYG,=KK4WWH,=KK4WWI,=KK6IUY, + =KK6LL,=KK6PGV,=KK6PLA,=KK6SNS,=KK7I,=KK7IV,=KK7STL,=KL7D/M,=KL7NC/IMD,=KM4AGL,=KM4KWS,=KM4KX, + =KM4NIC,=KM4OE,=KM4PJH,=KM4TJI,=KM6NOL,=KM6YOD,=KN4ENR,=KN4HGD,=KN4LJD,=KN4LVS,=KN4MGX,=KN4RXC, + =KN8IVE,=KO4DHN,=KR4WV,=KV3X,=KW1W,=KW4XD,=KY7J,=KZ6HJC,=N0GDT,=N0GDU,=N0GLI,=N0HJT,=N0HYI,=N0HZF, + =N0JEN,=N0JOB,=N0LHN,=N0SN,=N0SUB,=N0WXJ,=N0XKY,=N0XS,=N0ZKV,=N1HEN,=N1HUT,=N1KDQ,=N1KTI,=N1NDA, + =N1NJS,=N1QFE,=N1ROR,=N1TX,=N2CXH,=N2SHO,=N2TJY,=N2YZW,=N3QEH,=N4AVX,=N4CM,=N4DBX,=N4HCJ,=N4HZU, + =N4NAV,=N5AAR,=N5CSO,=N5UKX,=N5WPR,=N6BSC,=N6CVV,=N6CZU,=N6IGV,=N6JM,=N6QEK,=N6ZZX,=N7BUO,=N7DBN, + =N7DKL,=N7DUD,=N7ELD,=N7FCT,=N7GLP,=N7HER,=N7HQK,=N7IA,=N7JUX,=N7MGT,=N7MTG,=N7QAN,=N7QOV,=N7TBU, + =N7UTV,=N7UWT,=N7XEA,=N7XNM,=N7YKY,=N7YQS,=N8DDY,=N8EX,=N8JKB,=N8KCJ,=N8KYW,=N8SUG,=N9AIG,=N9YD, + =NA7WM,=NC2US,=NC4OI,=NE7EK,=NH2GZ,=NH2LS,=NH7UO,=NM0H,=NN5H,=NP4FU,=NU9Q,=NW7F,=W0EZM,=W0FJN, + =W0HPD,=W0OPT,=W0RWS,=W0UZJ,=W0ZEE,=W1JM,=W1LYD,=W1RSC,=W1ZKA,=W2DLS,=W2KRZ,=W2LUV,=W3ICG,=W3JPN, + =W3MKG,=W4AUL,=W4BMR,=W4RSB,=W5AIT,=W5JKT,=W5SPY,=W6DDP,=W6GTE,=W6ROW,=W7APM,=W7DDG,=W7EGG,=W7EIK, + =W7JMR,=W7PWA,=W7RAZ,=W7ROS,=W7WEZ,=W7ZWT,=W8MDD,=W8PVZ,=W8TCX,=W9ITU,=W9JMC,=W9WLN,=WA0JS, + =WA1FVJ,=WA1OUS,=WA2BGL,=WA2BIW,=WA4RRE,=WA6GFS,=WA7B,=WA7MDS,=WA7PXH,=WA7USX,=WA7YXF,=WB0CMZ, + =WB1GZL,=WB1ILS,=WB6COP,=WB7ULO,=WB9JZL,=WD6CET,=WE3B,=WH6CYY,=WH6DPL,=WH6GBB,=WH6GCO,=WH7AK, + =WI5GUY,=WJ6AA,=WJ8M,=WT5T,=WW4AL,=WX1NCC; +Navassa Island: 08: 11: NA: 18.40: 75.00: 5.0: KP1: + KP1,NP1,WP1; +US Virgin Islands: 08: 11: NA: 17.73: 64.80: 4.0: KP2: + KP2,NP2,WP2,=AC7FX,=AJ2O,=K5KFL,=K5KUB,=K5TP,=K8RF,=K9VV,=KA7KDU,=KB1MDZ,=KB1ZTY,=KB3ZUD,=KB9ALR, + =KC9MCN,=KD4SGB,=KD5QJN,=KE3QL,=KF2HC,=KF4CGR,=KF4MSI,=KG4CZD,=KG4SZC,=KG5KHO,=KG6KVR,=KH2XQ, + =KH2XR,=KI4FOE,=KI4FZD,=KI6BLD,=KJ6IR,=KL7NZ,=KO4ALI,=KR7O/R,=KV4/W2KW,=KV4AD,=KV4BA,=KV4BT, + =KV4BW,=KV4CF,=KV4CQ/P,=KV4DN,=KV4EY,=KV4FZ,=KV4HR,=KV4IH,=KV4JC,=KV4KW,=N1TKK,=N1VKI,=W0AIH/KV4, + =W0YNY,=W2AZK,=W2KW/KV4,=W3K/KD2CLB,=W4LIS,=WA4HLB,=WB2KQW,=WB4WFU,=WD8AHQ; +Puerto Rico: 08: 11: NA: 18.18: 66.55: 4.0: KP4: + KP3,KP4,NP3,NP4,WP3,WP4,=AA2ZN,=AB2DR,=AF4OU,=AF5IZ,=AG4CD,=AI4EZ,=K1NDN,=K4C/LH,=K4LCR,=K4PFH, + =K5YJR,=K6BOT,=K9JOS,=KA2ABJ,=KA2GNG,=KA2MBR,=KA2UCX,=KA2YGB,=KA3ZGQ,=KA4ROB,=KA7URH,=KA9UTY, + =KB0AQB,=KB0JRR,=KB0TEP,=KB1CKX,=KB1GIW,=KB1IJU,=KB1JMX,=KB1KDP,=KB1RUQ,=KB1TUA,=KB1UEK,=KB1UNX, + =KB1UZV,=KB1ZKF,=KB2ALR,=KB2BVX,=KB2CIE,=KB2KWB,=KB2MMX,=KB2NMT,=KB2NYN,=KB2OIF,=KB2OMN,=KB2OPM, + =KB2QQK,=KB2RYP,=KB2TID,=KB2VHY,=KB2WKT,=KB2YKJ,=KB3BPK,=KB3BTN,=KB3LUV,=KB3SBO,=KB3TTV,=KB8ZVP, + =KB9OWX,=KB9RZD,=KB9YVE,=KB9YVF,=KC1CRV,=KC1CUF,=KC1DRV,=KC1IHB,=KC1IHO,=KC1JLY,=KC1KZI,=KC2BZZ, + =KC2CJL,=KC2CTM,=KC2DUO,=KC2EMM,=KC2ERS,=KC2ERU,=KC2GRZ,=KC2HAS,=KC2JNE,=KC2LET,=KC2TE,=KC2UXP, + =KC2VCR,=KC3GEO,=KC3JYF,=KC4ADN,=KC5DKT,=KC5FWS,=KC8BFN,=KC8IRI,=KD2BK,=KD2KPC,=KD2VQ,=KD4TVS, + =KD5DVV,=KD5PKH,=KD9GIZ,=KD9MRY,=KE0AYJ,=KE0GFK,=KE0SH,=KE1MA,=KE3WW,=KE4GGD,=KE4GYA,=KE4SKH, + =KE4THL,=KE4WUE,=KE5LNG,=KF4KPO,=KF4TZG,=KF4VYH,=KF4WTX,=KF4ZDB,=KF5YGN,=KF5YGX,=KF6OGJ,=KG4EEG, + =KG4EEL,=KG4GYO,=KG4IRC,=KG4IVO,=KG4VCC,=KG5AFY,=KG6WWV,=KG9KG,=KH2RU,=KH4AA,=KI4LRJ,=KI4RGF, + =KI4TSW,=KI4WOA,=KI4WOB,=KI5KQH,=KJ4KZN,=KJ4LOZ,=KJ4UPN,=KJ4UXJ,=KJ4VSD,=KJ6OV,=KK4AOZ,=KK4DCX, + =KK4EBE,=KK4PHB,=KM4VDZ,=KM4WGI,=KM4YBN,=KM4YSR,=KM4ZJW,=KM4ZWY,=KM6CTO,=KN4AWH,=KN4GNO,=KN4IBD, + =KN4IDV,=KN4IGP,=KN4ILO,=KN4INP,=KN4JCC,=KN4KPX,=KN4KPY,=KN4MNT,=KN4NAR,=KN4NLZ,=KN4ODN,=KN4QBT, + =KN4QZZ,=KN4REC,=KN4SKZ,=KN4TNC,=KN4UAN,=KP2H,=KP2Z,=KP3CW/SKP,=KP3RE/LGT,=KP3RE/LH,=KP3RE/LT, + =KP4ES/L,=KP4ES/LGT,=KP4ES/LH,=KP4FD/IARU,=KP4FRA/IARU,=KP4FRD/LH,=KP4MD/P,=KP4VP/LH,=KR4SQ, + =KU4JI,=N0XAR,=N1CN,=N1HRV,=N1JFL,=N1QVU,=N1RWD,=N1SCD,=N1SZM,=N1YAY,=N1ZJC,=N2FVA,=N2IBR,=N2KKN, + =N2KUE,=N2OUS,=N2PGO,=N2WCS,=N3VIJ,=N3VVW,=N3YUB,=N3ZII,=N4CIE,=N4JZD,=N4LER,=N4MMT,=N4NDL,=N4UK, + =N6NVD,=N6RHF,=N8MQ,=NB0G,=NP3M/LH,=NP3VI/LH,=NP4VO/LH,=W1AW/PR,=W6WAW,=W9NKE,=WA2RVA,=WB2HMY, + =WB5YOF,=WB7ADC,=WB7VVV,=WP4L/TP,=WQ2N; +Desecheo Island: 08: 11: NA: 18.08: 67.88: 4.0: KP5: + KP5,NP5,WP5; +Norway: 14: 18: EU: 61.00: -9.00: -1.0: LA: + LA,LB,LC,LD,LE,LF,LG,LH,LI,LJ,LK,LL,LM,LN,=LA1BFA/U,=LA1EK/E,=LA1ENA/H,=LA1G/H,=LA1GZ/K,=LA1IO/L, + =LA1K/U,=LA1LO/H,=LA1MFA/X,=LA1RSA/X,=LA1TV/F,=LA1U/X,=LA1YE/C,=LA2AB/C,=LA2D/F,=LA2DS/C, + =LA2HFA/C,=LA2OJ/Z,=LA2SM/X,=LA2T/U,=LA3BO/Z,=LA3CC/C,=LA3DV/F,=LA3F/C,=LA3F/E,=LA3OCT/H,=LA3TK/E, + =LA4AAA/U,=LA4C/L,=LA4CIA/H,=LA4EJ/W,=LA4KF/K,=LA4KQ/X,=LA4NE/X,=LA4NE/Y,=LA4NL/X,=LA4PM/U, + =LA4RI/Y,=LA4RT/U,=LA4XX/U,=LA4YW/U,=LA5A/Y,=LA5FH/Z,=LA5G/E,=LA5HE/H,=LA5MT/D,=LA5SAA/L,=LA5UF/H, + =LA5UF/Z,=LA5UH/Z,=LA5YE/F,=LA5YI/F,=LA6DW/C,=LA6DW/S,=LA6FJA/E,=LA6GX/X,=LA6M/X,=LA6MT/D, + =LA6OM/C,=LA6QT/X,=LA6TPA/V,=LA6XI/F,=LA6XI/Z,=LA7AK/L,=LA7DHA/C,=LA7FF/F,=LA7HAA/W,=LA7HJ/W, + =LA7IM/X,=LA7QI/L,=LA7TO/L,=LA7VK/C,=LA8FTA/D,=LA8G/U,=LA8NHA/F,=LA8NSA/F,=LA8OM/K,=LA8OM/L, + =LA8QI/L,=LA8TIA/C,=LA8UL/X,=LA8WG/V,=LA9BM/F,=LA9DFA/D,=LA9DK/S,=LA9FG/P,=LA9GY/U,=LA9IX/U, + =LA9JM/Z,=LA9OI/C,=LA9YBA/W,=LA9ZL/I,=LB1JG/C,=LB2TB/F,=LB7FA/F,=LC5W/W,=LC8C/C,=LI3C/D,=LI7HJ/W, + =LI7VK/C,=LJ3RE/E,=LJ6BG/L; +Argentina: 13: 14: SA: -32.50: 62.13: 3.0: LU: + AY,AZ,L1,L2,L3,L4,L5,L6,L7,L8,L9,LO,LP,LQ,LR,LS,LT,LU,LV,LW,=LU8AEU/MM,=LU8YD/XA, + =AY3DR/D,=AY4EJ/D,=AY5E/D,=AY7DSY/D,=L21ESC/LH,=L25E/D,=L30DIM/D,=L30EY/D,=L30EY/E,=L40E/D, + =L44D/D,=L50DVA/D,=L50DVB/D,=L53DZV/D,=L80AA/D,=L82D/D,=L84VI/D,=LO0D/D,=LO7E/D,=LQ4D/D,=LR3D/D, + =LS4AA/D,=LT5D/LH,=LU1AAC/D,=LU1AAE/D,=LU1AAS/D,=LU1ACX/D,=LU1AEE/D,=LU1AET/D,=LU1AGP/D,=LU1AIM/D, + =LU1ALF/D,=LU1AM/D,=LU1APR/D,=LU1ARG/D,=LU1ASP/D,=LU1AW/D,=LU1AW/E,=LU1BCE/D,=LU1BMD/D,=LU1CHD/D, + =LU1CL/D,=LU1COA/D,=LU1DAR/D,=LU1DAS/D,=LU1DBI/D,=LU1DCB/D,=LU1DD/D,=LU1DDK/D,=LU1DDO/D,=LU1DHO/D, + =LU1DI/D,=LU1DK/D,=LU1DKD/D,=LU1DLB/D,=LU1DLF/D,=LU1DMA/E,=LU1DMK/D,=LU1DNQ/D,=LU1DP/D,=LU1DQ/D, + =LU1DS/D,=LU1DSO/D,=LU1DU/D,=LU1DVE/D,=LU1DYP/D,=LU1DZ/D,=LU1DZ/E,=LU1DZR/D,=LU1EEE/D,=LU1EEZ/D, + =LU1EFF/D,=LU1EJ/LH,=LU1EJ/YL,=LU1ELP/D,=LU1ELY/D,=LU1EPC/D,=LU1EPF/D,=LU1EQ/D,=LU1EQU/D, + =LU1ERA/D,=LU1EST/D,=LU1EUU/D,=LU1EW/D,=LU1EXU/D,=LU1EY/D,=LU1HBD/D,=LU1HLH/D,=LU1KCQ/D,=LU1UAG/D, + =LU1VCL/D,=LU1VDF/D,=LU1VOF/D,=LU1VYL/D,=LU1XWC/E,=LU1XZ/D,=LU1YY/D,=LU2AAS/D,=LU2ABT/D,=LU2AEZ/D, + =LU2AFE/D,=LU2AGQ/D,=LU2AHB/D,=LU2ALE/D,=LU2AMM/D,=LU2AOZ/D,=LU2AVG/D,=LU2AVW/D,=LU2BJA/D, + =LU2BN/D,=LU2BOE/D,=LU2BPM/D,=LU2CDE/D,=LU2CDO/D,=LU2CHP/D,=LU2CM/D,=LU2CRV/D,=LU2DAR/D,=LU2DB/D, + =LU2DG/D,=LU2DHM/D,=LU2DJB/D,=LU2DJB/PO,=LU2DJC/D,=LU2DJL/D,=LU2DKN/D,=LU2DPW/D,=LU2DRT/D, + =LU2DT/D,=LU2DT/D/LH,=LU2DT/LGT,=LU2DT/LH,=LU2DVF/D,=LU2ED/D,=LU2EDC/D,=LU2EE/D,=LU2EE/E, + =LU2EFI/D,=LU2EGA/D,=LU2EGI/D,=LU2EGP/D,=LU2EHA/D,=LU2EIT/D,=LU2EJL/D,=LU2EK/D,=LU2ELT/D, + =LU2EMQ/D,=LU2ENG/D,=LU2ENH/D,=LU2EPL/D,=LU2EPP/D,=LU2ERC/D,=LU2FBX/D,=LU2FGD/D,=LU2FNH/D, + =LU2HOD/D,=LU2JFC/D,=LU2VDV/D,=LU2YF/D,=LU3AAL/D,=LU3ADC/D,=LU3AJL/D,=LU3AOI/D,=LU3ARE/D, + =LU3ARM/D,=LU3AYE/D,=LU3CA/D,=LU3CM/D,=LU3CRA/D,=LU3CT/D,=LU3DAR/D,=LU3DAT/D,=LU3DAT/E,=LU3DC/D, + =LU3DEY/D,=LU3DFD/D,=LU3DH/D,=LU3DHF/D,=LU3DJA/D,=LU3DJI/D,=LU3DJT/D,=LU3DK/D,=LU3DLF/D,=LU3DMZ/D, + =LU3DO/D,=LU3DOC/D,=LU3DP/D,=LU3DPH/D,=LU3DQJ/D,=LU3DR/D,=LU3DRP/D,=LU3DRP/E,=LU3DXG/D,=LU3DXI/D, + =LU3DY/D,=LU3DYN/D,=LU3DZO/D,=LU3EBS/D,=LU3ED/D,=LU3EDU/D,=LU3EFL/D,=LU3EJ/L,=LU3EJD/D,=LU3ELR/D, + =LU3EMB/D,=LU3EOU/D,=LU3EP/D,=LU3ERU/D,=LU3ES/D,=LU3ESY/D,=LU3EZA/D,=LU3FCI/D,=LU3HKA/D,=LU4AA/D, + =LU4AA/X,=LU4AAO/D,=LU4AAO/E,=LU4ACA/D,=LU4ADE/D,=LU4AJC/D,=LU4ARU/D,=LU4BAN/D,=LU4BFP/D, + =LU4BMG/D,=LU4BR/D,=LU4CMF/D,=LU4DBL/D,=LU4DBP/D,=LU4DBT/D,=LU4DBV/D,=LU4DCE/D,=LU4DCY/D, + =LU4DGC/D,=LU4DHA/D,=LU4DHC/D,=LU4DHE/D,=LU4DIS/D,=LU4DJB/D,=LU4DK/D,=LU4DLJ/D,=LU4DLL/D, + =LU4DLN/D,=LU4DMI/D,=LU4DPB/D,=LU4DQ/D,=LU4DRC/D,=LU4DRH/D,=LU4DRH/E,=LU4DVD/D,=LU4EAE/D, + =LU4EET/D,=LU4EGP/D,=LU4EHP/D,=LU4EJ/D,=LU4EL/D,=LU4ELE/D,=LU4EOU/D,=LU4ERS/D,=LU4ESP/D,=LU4ETD/D, + =LU4ETJ/D,=LU4ETN/D,=LU4EV/D,=LU4HSA/D,=LU4HTD/D,=LU4MA/D,=LU4UWZ/D,=LU4UZW/D,=LU4VEN/D,=LU4VSD/D, + =LU4WAP/D,=LU5AHN/D,=LU5ALE/D,=LU5ALS/D,=LU5AM/D,=LU5ANL/D,=LU5AQV/D,=LU5ARS/D,=LU5ASA/D, + =LU5AVD/D,=LU5BDS/D,=LU5BE/D,=LU5BTL/D,=LU5CBA/D,=LU5CRE/D,=LU5DA/D,=LU5DA/E,=LU5DAS/D,=LU5DCO/D, + =LU5DDH/D,=LU5DEM/D,=LU5DF/D,=LU5DFR/D,=LU5DFT/D,=LU5DGG/D,=LU5DGR/D,=LU5DHE/D,=LU5DIT/D, + =LU5DJE/D,=LU5DKE/D,=LU5DLH/D,=LU5DLT/D,=LU5DLZ/D,=LU5DMG/D,=LU5DMI/D,=LU5DMP/D,=LU5DMR/D, + =LU5DQ/D,=LU5DRV/D,=LU5DSH/D,=LU5DSM/D,=LU5DT/D,=LU5DTB/D,=LU5DTF/D,=LU5DUC/D,=LU5DVB/D,=LU5DWS/D, + =LU5DYT/D,=LU5EAO/D,=LU5EC/D,=LU5ED/D,=LU5EDS/D,=LU5EFG/D,=LU5EH/D,=LU5EHC/D,=LU5EJL/D,=LU5EM/D, + =LU5EP/D,=LU5EPB/D,=LU5EW/D,=LU5FZ/D,=LU5FZ/E,=LU5JAH/D,=LU5JIB/D,=LU5OD/D,=LU5VAS/D,=LU5VAT/D, + =LU5XP/D,=LU5YBR/D,=LU5YF/D,=LU6AER/D,=LU6AMT/D,=LU6CN/D,=LU6DAX/D,=LU6DBL/D,=LU6DC/D,=LU6DCT/D, + =LU6DDC/D,=LU6DG/D,=LU6DIE/D,=LU6DIO/D,=LU6DK/D,=LU6DKT/D,=LU6DL/D,=LU6DM/D,=LU6DO/D,=LU6DRD/D, + =LU6DRD/E,=LU6DRN/D,=LU6DRR/D,=LU6DSA/D,=LU6DTB/D,=LU6EAG/D,=LU6EC/D,=LU6EDC/D,=LU6EE/D,=LU6EEG/D, + =LU6EGO/D,=LU6EI/D,=LU6EJJ/D,=LU6EKL/D,=LU6ELP/D,=LU6EMM/D,=LU6ENA/D,=LU6EPE/D,=LU6EPR/D, + =LU6EPR/E,=LU6EQV/D,=LU6EU/D,=LU6EVD/D,=LU6EWR/D,=LU6EXD/D,=LU6HBB/D,=LU6JJ/D,=LU6UAL/D,=LU6UO/D, + =LU6UVI/D,=LU6XQ/D,=LU7AA/D,=LU7AC/D,=LU7ADC/D,=LU7ADN/D,=LU7ARI/D,=LU7ARS/D,=LU7ART/D,=LU7AVW/D, + =LU7BSN/D,=LU7BTO/D,=LU7BTO/E,=LU7CAW/D,=LU7CC/E,=LU7CP/D,=LU7DAC/D,=LU7DAF/D,=LU7DAJ/D,=LU7DAR/D, + =LU7DBA/D,=LU7DBL/D,=LU7DCE/D,=LU7DD/D,=LU7DDC/D,=LU7DDO/D,=LU7DHE/D,=LU7DHG/D,=LU7DJH/D, + =LU7DLN/D,=LU7DNM/D,=LU7DOT/D,=LU7DP/D,=LU7DR/D,=LU7DS/D,=LU7DSC/D,=LU7DSS/D,=LU7DSU/D,=LU7DSY/D, + =LU7DTC/D,=LU7DUE/D,=LU7DW/D,=LU7DZL/D,=LU7DZL/E,=LU7DZV/D,=LU7ECZ/D,=LU7EGY/D,=LU7EHL/D, + =LU7EHR/E,=LU7EIA/D,=LU7EJC/D,=LU7ELY/D,=LU7EMA/D,=LU7EMM/D,=LU7EMP/D,=LU7ENP/D,=LU7EO/D, + =LU7EON/D,=LU7EPC/D,=LU7ETR/D,=LU7EXX/D,=LU7HBL/D,=LU7HW/D,=LU7HZ/D,=LU7VCH/D,=LU8ABR/D,=LU8ACH/D, + =LU8ADX/D,=LU8AE/D,=LU8AJM/D,=LU8ARI/D,=LU8ATM/D,=LU8DAF/D,=LU8DCF/D,=LU8DCH/D,=LU8DCK/D, + =LU8DCM/D,=LU8DIP/D,=LU8DIW/D,=LU8DJR/D,=LU8DLD/D,=LU8DLT/D,=LU8DMD/D,=LU8DQ/D,=LU8DR/D,=LU8DRA/D, + =LU8DRH/D,=LU8DRQ/D,=LU8DSJ/D,=LU8DTF/D,=LU8DUJ/D,=LU8DVQ/D,=LU8DW/D,=LU8DWR/D,=LU8DX/D,=LU8DY/D, + =LU8DZE/D,=LU8DZH/D,=LU8EAG/D,=LU8EAJ/D,=LU8EBJ/D,=LU8EBJ/E,=LU8EBK/D,=LU8EBK/E,=LU8EC/D, + =LU8ECF/D,=LU8ECF/E,=LU8EEM/D,=LU8EFF/D,=LU8EGC/D,=LU8EGS/D,=LU8EHQ/D,=LU8EHQ/E,=LU8EHS/D, + =LU8EHV/D,=LU8EHV/LH,=LU8EKC/D,=LU8EMC/D,=LU8ERH/D,=LU8ETC/D,=LU8EU/D,=LU8EXJ/D,=LU8EXN/D, + =LU8FAU/D,=LU8VCC/D,=LU8VER/D,=LU9ACJ/D,=LU9AEA/D,=LU9AJK/D,=LU9AOS/D,=LU9AUC/D,=LU9BGN/D, + =LU9BRC/D,=LU9BSA/D,=LU9CGN/D,=LU9CHL/D,=LU9CLH/D,=LU9DA/D,=LU9DAA/D,=LU9DAD/D,=LU9DB/D,=LU9DD/D, + =LU9DE/D,=LU9DEQ/D,=LU9DF/D,=LU9DGE/D,=LU9DHL/D,=LU9DJS/D,=LU9DKO/D,=LU9DMG/D,=LU9DNV/D,=LU9DO/D, + =LU9DPD/D,=LU9DPI/D,=LU9DPZ/E,=LU9DSD/D,=LU9DVO/D,=LU9DX/D,=LU9EAG/D,=LU9ECE/D,=LU9EI/D,=LU9EIM/D, + =LU9EJM/D,=LU9EJS/E,=LU9EJZ/D,=LU9ENH/D,=LU9EOE/D,=LU9ERA/D,=LU9ESD/D,=LU9ESD/E,=LU9ESD/LH, + =LU9EV/D,=LU9EV/E,=LU9EV/LH,=LU9EY/D,=LU9EYE/D,=LU9EZX/D,=LU9HDR/D,=LU9HJV/D,=LU9HVR/D,=LU9USD/D, + =LU9WM/D,=LV7E/D,=LW1DAL/D,=LW1DDX/D,=LW1DE/D,=LW1DEN/D,=LW1DEW/D,=LW1DG/D,=LW1DIW/D,=LW1DJ/D, + =LW1DOG/D,=LW1DQQ/D,=LW1DUQ/D,=LW1DVB/D,=LW1DXH/D,=LW1DXP/D,=LW1DYN/D,=LW1DYP/D,=LW1EA/D, + =LW1ECE/D,=LW1ECO/D,=LW1ELI/D,=LW1EQI/D,=LW1EQZ/D,=LW1EVO/D,=LW1EXU/D,=LW2DAF/D,=LW2DAW/D, + =LW2DET/D,=LW2DJM/D,=LW2DKF/D,=LW2DNC/D,=LW2DOD/D,=LW2DOM/D,=LW2DSM/D,=LW2DX/E,=LW2DYA/D, + =LW2ECC/D,=LW2ECK/D,=LW2ECM/D,=LW2EFS/D,=LW2EHD/D,=LW2ENB/D,=LW2EQS/D,=LW2ETF/D,=LW2EUA/D, + =LW3DAB/D,=LW3DAW/D,=LW3DBM/D,=LW3DC/D,=LW3DED/D,=LW3DER/D,=LW3DFP/D,=LW3DG/D,=LW3DGC/D,=LW3DJC/D, + =LW3DKC/D,=LW3DKC/E,=LW3DKO/D,=LW3DKO/E,=LW3DN/D,=LW3DRW/D,=LW3DSM/D,=LW3DSR/D,=LW3DTD/D,=LW3EB/D, + =LW3EIH/D,=LW3EK/D,=LW3EMP/D,=LW4DAF/D,=LW4DBE/D,=LW4DBM/D,=LW4DCV/D,=LW4DKI/D,=LW4DOR/D, + =LW4DRH/D,=LW4DRH/E,=LW4DRV/D,=LW4DTM/D,=LW4DTR/D,=LW4DWV/D,=LW4DXH/D,=LW4ECV/D,=LW4EIN/D, + =LW4EM/D,=LW4EM/E,=LW4EM/LH,=LW4ERO/D,=LW4ESY/D,=LW4ETG/D,=LW4EZT/D,=LW4HCL/D,=LW5DAD/D,=LW5DD/D, + =LW5DFR/D,=LW5DHG/D,=LW5DIE/D,=LW5DLY/D,=LW5DNN/D,=LW5DOG/D,=LW5DQ/D,=LW5DR/D,=LW5DR/LH,=LW5DTD/D, + =LW5DTQ/D,=LW5DUS/D,=LW5DWX/D,=LW5EE/D,=LW5EO/D,=LW5EOL/D,=LW6DCA/D,=LW6DLS/D,=LW6DNF/D,=LW6DTM/D, + =LW6DW/D,=LW6DYH/D,=LW6DYZ/D,=LW6EAK/D,=LW6EEA/D,=LW6EFR/D,=LW6EGE/D,=LW6EHD/D,=LW6EXM/D, + =LW7DAF/D,=LW7DAG/D,=LW7DAJ/D,=LW7DAR/D,=LW7DFD/D,=LW7DGT/D,=LW7DJ/D,=LW7DKB/D,=LW7DKX/D, + =LW7DLY/D,=LW7DMB/D,=LW7DNS/E,=LW7DPJ/D,=LW7DVC/D,=LW7DWX/D,=LW7ECZ/D,=LW7EDH/D,=LW7EDH/LH, + =LW7EJV/D,=LW7ELR/D,=LW7EOJ/D,=LW7HA/D,=LW8DAL/D,=LW8DCM/D,=LW8DIP/D,=LW8DMC/D,=LW8DMK/D, + =LW8DPZ/E,=LW8DRU/D,=LW8DYT/D,=LW8EAG/D,=LW8ECQ/D,=LW8EFR/D,=LW8EGA/D,=LW8EJ/D,=LW8ELR/D,=LW8EU/D, + =LW8EVB/D,=LW8EXF/D,=LW9DAD/D,=LW9DAE/D,=LW9DIH/D,=LW9DMM/D,=LW9DRD/D,=LW9DRT/D,=LW9DSP/D, + =LW9DTP/D,=LW9DTQ/D,=LW9DTR/D,=LW9DX/D,=LW9EAG/D,=LW9ECR/D,=LW9EDX/D,=LW9EGQ/D,=LW9ENF/D, + =LW9ESY/D,=LW9EUE/D,=LW9EUU/D,=LW9EVA/D,=LW9EVA/E,=LW9EVE/D,=LW9EYP/D,=LW9EZV/D,=LW9EZW/D, + =LW9EZX/D,=LW9EZY/D, + =LS4AA/F,=LT2F/F,=LU1FFF/F,=LU1FHE/F,=LU1FMC/F,=LU1FMS/F,=LU1FSE/F,=LU1FVG/F,=LU2FDA/F,=LU2FGD/F, + =LU2FLB/F,=LU2FNA/F,=LU2FP/F,=LU3FCA/F,=LU3FCI/F,=LU3FLG/F,=LU3FMD/F,=LU3FV/F,=LU3FVH/F,=LU4AA/F, + =LU4ETN/F,=LU4FKS/F,=LU4FM/F,=LU4FNO/F,=LU4FNP/F,=LU4FOO/F,=LU4HOD/F,=LU5ASA/F,=LU5FB/F,=LU5FBM/F, + =LU5FES/F,=LU5FHD/F,=LU5FJ/F,=LU5FJO/F,=LU5FYX/F,=LU5FZ/F,=LU6FE/F,=LU6FHO/F,=LU6FLZ/F,=LU7FAS/F, + =LU7FCU/F,=LU7FFF/F,=LU7FIA/F,=LU7FJ/F,=LU7FJF/F,=LU7FM/F,=LU7FOE/F,=LU7FRE/F,=LU7FYX/F,=LU7HBL/F, + =LU7YG/F,=LU8FAB/F,=LU8FC/F,=LU8FGB/F,=LU8FMA/F,=LU8SAN/F,=LU9EI/F,=LU9ESD/F,=LU9FBA/F,=LU9FNI/F, + =LU9FQR/F,=LU9RBI/F, + =LU1ACG/GP,=LU1GQQ/GP,=LU1GR/GP,=LU3AAL/GR,=LU4FM/G,=LU4FM/GP,=LU4GF/GA,=LU4GO/GA,=LU5BE/GR, + =LU5FZ/GA,=LU8EFF/GR,=LU8GCJ/GA,=LU8GCW/GP,=LU9GAH/G,=LU9GOO/GA,=LU9GOX/GA,=LU9GOY/GA,=LU9GRE/GP, + =LS4AA/H,=LU1DZ/H,=LU1EZ/H,=LU1HBD/H,=LU1HCG/H,=LU1HCP/H,=LU1HH/H,=LU1HK/H,=LU1HLH/H,=LU1HPW/H, + =LU1HRA/H,=LU1HYW/H,=LU1JB/H,=LU1QAC/H,=LU1XZ/H,=LU2DVI/H,=LU2HA/H,=LU2HAE/H,=LU2HC/H,=LU2HCG/H, + =LU2HEA/H,=LU2HEQ/H,=LU2HJ/H,=LU2HNV/H,=LU2MAA/H,=LU3AJL/H,=LU3FCR/H,=LU3FN/H,=LU3HAT/H,=LU3HAZ/H, + =LU3HE/H,=LU3HKA/H,=LU3HL/H,=LU3HN/H,=LU3HO/H,=LU3HPW/H,=LU3HT/H,=LU3HU/H,=LU3HZK/H,=LU4AA/H, + =LU4DPL/H,=LU4EG/H,=LU4ETN/H,=LU4FM/H,=LU4HAP/H,=LU4HK/H,=LU4HOQ/H,=LU4HSA/H,=LU4HSA/LGH, + =LU4HTD/H,=LU4MA/H,=LU5DGG/H,=LU5DX/H,=LU5DZ/H,=LU5FYX/H,=LU5HA/H,=LU5HAZ/H,=LU5HCB/H,=LU5HCW/H, + =LU5HFW/H,=LU5HGR/H,=LU5HIO/H,=LU5HPM/H,=LU5HR/H,=LU5HTA/H,=LU5WTE/H,=LU5YUS/H,=LU6FE/H,=LU6HAS/H, + =LU6HBB/H,=LU6HCA/H,=LU6HGH/H,=LU6HMT/H,=LU6HQH/H,=LU6HTR/H,=LU6HWT/H,=LU6XQ/H,=LU7ADC/H,=LU7DZ/H, + =LU7FBG/H,=LU7FTF/H,=LU7HA/H,=LU7HBC/H,=LU7HBL/H,=LU7HBV/H,=LU7HCS/H,=LU7HEO/H,=LU7HOM/H, + =LU7HOS/H,=LU7HSG/H,=LU7HW/H,=LU7HWB/H,=LU7HZ/H,=LU7JMS/H,=LU8FF/H,=LU8HAR/H,=LU8HBX/H,=LU8HH/H, + =LU8HJ/H,=LU8HOR/H,=LU9BSA/H,=LU9DPD/H,=LU9ERA/H,=LU9HCF/H,=LU9HJV/H,=LU9HMB/H,=LU9HVR/H, + =LW1HBD/H,=LW1HCM/H,=LW1HDI/H,=LW2EIY/H,=LW3HBS/H,=LW3HOH/H,=LW4HCL/H,=LW4HTA/H,=LW4HTD/H, + =LW6ENV/H,=LW6HAM/H,=LW7EIY/H,=LW7HA/H,=LW8EUA/H,=LW9HCF/H, + =LU1IAL/I,=LU1IBM/I,=LU1IG/I,=LU1II/I,=LU2IP/I,=LU2IV/I,=LU3EEA/I,=LU3EP/I,=LU4ERS/I,=LU5FZ/I, + =LU5IAL/I,=LU5IAO/I,=LU5ILA/I,=LU7FMA/F,=LU7IEI/I,=LU7IPI/I,=LU7IRS/I,=LU7ITR/I,=LU7IUE/I, + =LU8IEZ/I,=LU9DPI/I,=LU9EYE/I,=LU9IAE/I,=LU9IAL/I,=LU9IBJ/I,=LW8DRU/I, + =LU1HB/J,=LU1JAO/J,=LU1JAR/J,=LU1JCE/J,=LU1JCO/J,=LU1JEF/J,=LU1JEO/J,=LU1JES/J,=LU1JGU/J, + =LU1JHF/J,=LU1JHP/J,=LU1JKN/J,=LU1JMA/J,=LU1JMV/J,=LU1JN/J,=LU1JP/J,=LU1JPC/J,=LU2DJB/J,=LU2FGD/J, + =LU2FQ/J,=LU2JCI/J,=LU2JLC/J,=LU2JMG/J,=LU2JNV/J,=LU2JPE/J,=LU2JS/J,=LU3DYN/J,=LU3JFB/J,=LU3JVO/J, + =LU4AA/J,=LU4FM/J,=LU4JEA/J,=LU4JHF/J,=LU4JJ/J,=LU4JLX/J,=LU4JMO/J,=LU5JAH/J,=LU5JB/J,=LU5JCL/J, + =LU5JI/J,=LU5JJF/J,=LU5JKI/J,=LU5JLA/J,=LU5JLX/J,=LU5JNC/J,=LU5JOL/J,=LU5JU/J,=LU5JZZ/J,=LU6JAF/J, + =LU6JRA/J,=LU7DAC/J,=LU7JI/J,=LU7JLB/J,=LU7JMS/J,=LU7JR/J,=LU7JRM/J,=LU8JOP/J,=LU9CYV/J,=LU9JLV/J, + =LU9JMG/J,=LU9JPR/J,=LU9YB/J,=LW2DAF/J,=LW2DRJ/J,=LW3EMP/J, + =LU1KAF/K,=LU1KWC/K,=LU2KLC/K,=LU4AA/K,=LU4KC/K,=LU5KAH/K,=LU5OM/K,=LU6KAQ/K,=LU7KHB/K,=LU7KT/K, + =LU8KE/K,=LU9KMB/K,=LW1EVO/K,=LW3DFP/K, + =LU1AAS/L,=LU1DZ/L,=LU1JAP/L,=LU1LAA/L,=LU1LT/L,=LU1LTL/L,=LU2LDB/L,=LU3AYE/L,=LU4AGC/L,=LU4EFC/L, + =LU4LAD/L,=LU4LBU/L,=LU4LG/L,=LU4LMA/L,=LU5FZ/L,=LU5ILA/L,=LU5LA/L,=LU5LAE/L,=LU5LBV/L,=LU6JRA/L, + =LU8IEZ/L,=LU8LFV/L,=LU9GOO/L,=LU9GOY/L,=LU9JX/L,=LU9LEW/L,=LU9LOP/L,=LU9LZY/L,=LU9LZZ/L, + =LU9XPA/L,=LW3EMP/L,=LW8DTO/L, + =LU3PCJ/MA,=LW4DBE/MA, + =LS71N/N,=LU2DSV/N,=LU3AAL/N,=LU5BE/N,=LU5FZ/N,=LU8EFF/N,=LW5DR/N, + =LU1HZY/O,=LU1XS/O,=LU2HON/O,=LU3HL/O,=LU4AA/O,=LU5BOJ/O,=LU5OD/O,=LU6FEC/O,=LU6HWT/O,=LU7DW/O, + =LU7KGB/O,=LU8OAH/O, + =LU1DZ/Q,=LU1QA/Q,=LU1QAH/Q,=LU1QHC/Q,=LU1QR/Q,=LU1QRA/Q,=LU3QH/Q,=LU4EV/Q,=LU4QQ/Q,=LU5QAG/Q, + =LU5QAJ/Q,=LU5QR/Q,=LU6HBB/Q,=LU6QAN/Q,=LU6QB/Q,=LU6QER/Q,=LU6QI/Q,=LU6UO/Q,=LU7CG/Q,=LU7DJH/Q, + =LU7FCL/Q,=LU7QBE/Q,=LU7QN/Q,=LU7QV/Q,=LU8DCH/Q,=LU8QRD/Q,=LU8WFT/Q,=LU9QAW/Q,=LU9QFM/Q,=LU9QRV/Q, + =LW2DX/Q,=LW4HCL/Q, + =LU/DH4PB/S,=LU1DZ/S,=LU1SF/S,=LU6UO/S,=LU8SAN/S,=LW2DX/S,=LW4HCL/S, + =LU1UG/U,=LU1UM/U,=LU1UP/U,=LU3DAB/U,=LU3UU/U,=LU4UWZ/U,=LU5UBI/YL,=LU5UEA/U,=LU5UFM/U,=LU6UBM/U, + =LU6UO/U,=LU7AA/U,=LU7VB/U,=LU8UU/U,=LU8VCC/U,=LU9MHH/U, + AY0V[16],AY1V[16],AY2V[16],AY3V[16],AY4V[16],AY5V[16],AY6V[16],AY7V[16],AY8V[16],AY9V[16], + AZ0V[16],AZ1V[16],AZ2V[16],AZ3V[16],AZ4V[16],AZ5V[16],AZ6V[16],AZ7V[16],AZ8V[16],AZ9V[16], + L20V[16],L21V[16],L22V[16],L23V[16],L24V[16],L25V[16],L26V[16],L27V[16],L28V[16],L29V[16], + L30V[16],L31V[16],L32V[16],L33V[16],L34V[16],L35V[16],L36V[16],L37V[16],L38V[16],L39V[16], + L40V[16],L41V[16],L42V[16],L43V[16],L44V[16],L45V[16],L46V[16],L47V[16],L48V[16],L49V[16], + L50V[16],L51V[16],L52V[16],L53V[16],L54V[16],L55V[16],L56V[16],L57V[16],L58V[16],L59V[16], + L60V[16],L61V[16],L62V[16],L63V[16],L64V[16],L65V[16],L66V[16],L67V[16],L68V[16],L69V[16], + L70V[16],L71V[16],L72V[16],L73V[16],L74V[16],L75V[16],L76V[16],L77V[16],L78V[16],L79V[16], + L80V[16],L81V[16],L82V[16],L83V[16],L84V[16],L85V[16],L86V[16],L87V[16],L88V[16],L89V[16], + L90V[16],L91V[16],L92V[16],L93V[16],L94V[16],L95V[16],L96V[16],L97V[16],L98V[16],L99V[16], + LO0V[16],LO1V[16],LO2V[16],LO3V[16],LO4V[16],LO5V[16],LO6V[16],LO7V[16],LO8V[16],LO9V[16], + LP0V[16],LP1V[16],LP2V[16],LP3V[16],LP4V[16],LP5V[16],LP6V[16],LP7V[16],LP8V[16],LP9V[16], + LQ0V[16],LQ1V[16],LQ2V[16],LQ3V[16],LQ4V[16],LQ5V[16],LQ6V[16],LQ7V[16],LQ8V[16],LQ9V[16], + LR0V[16],LR1V[16],LR2V[16],LR3V[16],LR4V[16],LR5V[16],LR6V[16],LR7V[16],LR8V[16],LR9V[16], + LS0V[16],LS1V[16],LS2V[16],LS3V[16],LS4V[16],LS5V[16],LS6V[16],LS7V[16],LS8V[16],LS9V[16], + LT0V[16],LT1V[16],LT2V[16],LT3V[16],LT4V[16],LT5V[16],LT6V[16],LT7V[16],LT8V[16],LT9V[16], + LU0V[16],LU1V[16],LU2V[16],LU3V[16],LU4V[16],LU5V[16],LU6V[16],LU7V[16],LU8V[16],LU9V[16], + LV0V[16],LV1V[16],LV2V[16],LV3V[16],LV4V[16],LV5V[16],LV6V[16],LV7V[16],LV8V[16],LV9V[16], + LW0V[16],LW1V[16],LW2V[16],LW3V[16],LW4V[16],LW5V[16],LW6V[16],LW7V[16],LW8V[16],LW9V[16], + =L30EY/V[16],=LT5V/V[16],=LU1EDX/V[16],=LU1QR/V[16],=LU1VAP/V[16],=LU1VBC/V[16],=LU1VCK/V[16], + =LU1VCS/V[16],=LU1VDF/V[16],=LU1VEG/V[16],=LU1VFP/V[16],=LU1VKQ/V[16],=LU1VOF/LH[16], + =LU1VOF/V[16],=LU1VPH/V[16],=LU1VYL/V[16],=LU1VZ/V[16],=LU1WJV/V[16],=LU1WJY/V[16],=LU1XAB/V[16], + =LU1YJG/V[16],=LU1YY/V[16],=LU2DB/V[16],=LU2VA/V[16],=LU2VCD/V[16],=LU2VCR/V[16],=LU2VCS/V[16], + =LU2VDV/V[16],=LU2VJU/V[16],=LU2VV/V[16],=LU3AIY/V[16],=LU3DC/V[16],=LU3DR/V[16],=LU3DXG/V[16], + =LU3ES/V[16],=LU3VAL/V[16],=LU3VE/V[16],=LU3VHE/V[16],=LU3VMB/V[16],=LU3VSE/V[16],=LU3VSM/V[16], + =LU3VTG/V[16],=LU3XQN/V[16],=LU3YA/V[16],=LU3YLF/V[16],=LU4AA/V[16],=LU4DBP/V[16],=LU4DBT/V[16], + =LU4DDL/V[16],=LU4DQ/V[16],=LU4EHP/V[16],=LU4EJS/V[16],=LU4VAU/V[16],=LU4VBW/V[16],=LU4VDG/V[16], + =LU4VE/V[16],=LU4VEN/V[16],=LU4VMB/V[16],=LU4VMG/V[16],=LU4VV/V[16],=LU5AJX/V[16],=LU5BDS/V[16], + =LU5DEM/V[16],=LU5DIT/V[16],=LU5DRV/V[16],=LU5FYX/V[16],=LU5VAI/V[16],=LU5VAS/V[16],=LU5VAT/V[16], + =LU5VFL/V[16],=LU5VIE/V[16],=LU5VLB/V[16],=LU5YBJ/V[16],=LU5YBR/V[16],=LU5YEC/V[16],=LU5YF/V[16], + =LU6DAI/V[16],=LU6DBL/V[16],=LU6DKT/V[16],=LU6DO/V[16],=LU6VA/V[16],=LU6VAC/V[16],=LU6VDT/V[16], + =LU6VEO/V[16],=LU6VFL/V[16],=LU6VM/V[16],=LU6VR/V[16],=LU7DSY/V[16],=LU7DW/V[16],=LU7EGH/V[16], + =LU7EHL/V[16],=LU7VB/V[16],=LU7VBT/V[16],=LU7VFG/V[16],=LU7VRC/V[16],=LU7YZ/V[16],=LU8ARI/V[16], + =LU8BV/V[16],=LU8DWR/V[16],=LU8EB/M/V[16],=LU8EHQ/V[16],=LU8VCC/V[16],=LU8VER/V[16],=LU8VLW/V[16], + =LU9AEA/V[16],=LU9DR/V[16],=LU9ESD/V[16],=LU9EY/V[16],=LU9VEA/V[16],=LU9VRC/V[16],=LUVES/V[16], + =LW1ECO/V[16],=LW2DVM/V[16],=LW2DYA/V[16],=LW5EE/V[16],=LW6EQQ/V[16],=LW9EAG/V[16], + AY0W[16],AY1W[16],AY2W[16],AY3W[16],AY4W[16],AY5W[16],AY6W[16],AY7W[16],AY8W[16],AY9W[16], + AZ0W[16],AZ1W[16],AZ2W[16],AZ3W[16],AZ4W[16],AZ5W[16],AZ6W[16],AZ7W[16],AZ8W[16],AZ9W[16], + L20W[16],L21W[16],L22W[16],L23W[16],L24W[16],L25W[16],L26W[16],L27W[16],L28W[16],L29W[16], + L30W[16],L31W[16],L32W[16],L33W[16],L34W[16],L35W[16],L36W[16],L37W[16],L38W[16],L39W[16], + L40W[16],L41W[16],L42W[16],L43W[16],L44W[16],L45W[16],L46W[16],L47W[16],L48W[16],L49W[16], + L50W[16],L51W[16],L52W[16],L53W[16],L54W[16],L55W[16],L56W[16],L57W[16],L58W[16],L59W[16], + L60W[16],L61W[16],L62W[16],L63W[16],L64W[16],L65W[16],L66W[16],L67W[16],L68W[16],L69W[16], + L70W[16],L71W[16],L72W[16],L73W[16],L74W[16],L75W[16],L76W[16],L77W[16],L78W[16],L79W[16], + L80W[16],L81W[16],L82W[16],L83W[16],L84W[16],L85W[16],L86W[16],L87W[16],L88W[16],L89W[16], + L90W[16],L91W[16],L92W[16],L93W[16],L94W[16],L95W[16],L96W[16],L97W[16],L98W[16],L99W[16], + LO0W[16],LO1W[16],LO2W[16],LO3W[16],LO4W[16],LO5W[16],LO6W[16],LO7W[16],LO8W[16],LO9W[16], + LP0W[16],LP1W[16],LP2W[16],LP3W[16],LP4W[16],LP5W[16],LP6W[16],LP7W[16],LP8W[16],LP9W[16], + LQ0W[16],LQ1W[16],LQ2W[16],LQ3W[16],LQ4W[16],LQ5W[16],LQ6W[16],LQ7W[16],LQ8W[16],LQ9W[16], + LR0W[16],LR1W[16],LR2W[16],LR3W[16],LR4W[16],LR5W[16],LR6W[16],LR7W[16],LR8W[16],LR9W[16], + LS0W[16],LS1W[16],LS2W[16],LS3W[16],LS4W[16],LS5W[16],LS6W[16],LS7W[16],LS8W[16],LS9W[16], + LT0W[16],LT1W[16],LT2W[16],LT3W[16],LT4W[16],LT5W[16],LT6W[16],LT7W[16],LT8W[16],LT9W[16], + LU0W[16],LU1W[16],LU2W[16],LU3W[16],LU4W[16],LU5W[16],LU6W[16],LU7W[16],LU8W[16],LU9W[16], + LV0W[16],LV1W[16],LV2W[16],LV3W[16],LV4W[16],LV5W[16],LV6W[16],LV7W[16],LV8W[16],LV9W[16], + LW0W[16],LW1W[16],LW2W[16],LW3W[16],LW4W[16],LW5W[16],LW6W[16],LW7W[16],LW8W[16],LW9W[16], + =LT7W/LGT[16],=LT7W/LH[16],=LU1EJ/W[16],=LU1EUU/W[16],=LU1WBM/W[16],=LU1WCR/V[16],=LU1WCR/W[16], + =LU1WF/W[16],=LU1WFU/W[16],=LU1WIY/W[16],=LU1WJF/W[16],=LU1WJY/W[16],=LU1WL/W[16],=LU1WM/W[16], + =LU1WP/W[16],=LU1WRV/W[16],=LU2VJ/W[16],=LU2WA/LGT[16],=LU2WA/W[16],=LU2WC/W[16],=LU2WGG/W[16], + =LU3CW/W[16],=LU3DJI/W[16],=LU3DR/W[16],=LU3DXG/W[16],=LU3EGC/W[16],=LU3ES/W[16],=LU3HKA/W[16], + =LU3WAM/W[16],=LU3WDT/W[16],=LU3YK/W[16],=LU4DBP/W[16],=LU4DBT/W[16],=LU4DQ/W[16],=LU4DRC/W[16], + =LU4ETN/W[16],=LU4HMA/W[16],=LU4WCD/W[16],=LU4WFE/W[16],=LU4WG/W[16],=LU4WSM/W[16],=LU5DEM/W[16], + =LU5DGI/W[16],=LU5DIT/W[16],=LU5MFD/W[16],=LU5WOT/W[16],=LU5WQF/W[16],=LU5WSA/W[16],=LU5WT/W[16], + =LU6DBL/W[16],=LU6EC/W[16],=LU6VEK/W[16],=LU6WAZ/W[16],=LU6WFV/W[16],=LU6WG/LH[16],=LU6WG/W[16], + =LU7DD/W[16],=LU7DJJ/W[16],=LU7DSY/W[16],=LU7DW/W[16],=LU7EHL/W[16],=LU7EPC/W[16],=LU7EUZ/W[16], + =LU7HA/W[16],=LU7HD/W[16],=LU7WAH/W[16],=LU7WFM/W[16],=LU7WW/LH[16],=LU7WW/W[16],=LU8DRA/W[16], + =LU8DWR/W[16],=LU8EHQ/W[16],=LU8EKB/W[16],=LU8WDG/W[16],=LU8YD/W[16],=LU9DLM/W[16],=LU9ESD/W[16], + =LU9LEC/W[16],=LU9VEA/W[16],=LW1WJY/W[16],=LW3DKC/W[16],=LW7DAF/W[16],=LW7WFM/W[16],=LW8DMK/W[16], + =LW9DAE/W[16],=LW9EAG/W[16], + AY0X[16],AY1X[16],AY2X[16],AY3X[16],AY4X[16],AY5X[16],AY6X[16],AY7X[16],AY8X[16],AY9X[16], + AZ0X[16],AZ1X[16],AZ2X[16],AZ3X[16],AZ4X[16],AZ5X[16],AZ6X[16],AZ7X[16],AZ8X[16],AZ9X[16], + L20X[16],L21X[16],L22X[16],L23X[16],L24X[16],L25X[16],L26X[16],L27X[16],L28X[16],L29X[16], + L30X[16],L31X[16],L32X[16],L33X[16],L34X[16],L35X[16],L36X[16],L37X[16],L38X[16],L39X[16], + L40X[16],L41X[16],L42X[16],L43X[16],L44X[16],L45X[16],L46X[16],L47X[16],L48X[16],L49X[16], + L50X[16],L51X[16],L52X[16],L53X[16],L54X[16],L55X[16],L56X[16],L57X[16],L58X[16],L59X[16], + L60X[16],L61X[16],L62X[16],L63X[16],L64X[16],L65X[16],L66X[16],L67X[16],L68X[16],L69X[16], + L70X[16],L71X[16],L72X[16],L73X[16],L74X[16],L75X[16],L76X[16],L77X[16],L78X[16],L79X[16], + L80X[16],L81X[16],L82X[16],L83X[16],L84X[16],L85X[16],L86X[16],L87X[16],L88X[16],L89X[16], + L90X[16],L91X[16],L92X[16],L93X[16],L94X[16],L95X[16],L96X[16],L97X[16],L98X[16],L99X[16], + LO0X[16],LO1X[16],LO2X[16],LO3X[16],LO4X[16],LO5X[16],LO6X[16],LO7X[16],LO8X[16],LO9X[16], + LP0X[16],LP1X[16],LP2X[16],LP3X[16],LP4X[16],LP5X[16],LP6X[16],LP7X[16],LP8X[16],LP9X[16], + LQ0X[16],LQ1X[16],LQ2X[16],LQ3X[16],LQ4X[16],LQ5X[16],LQ6X[16],LQ7X[16],LQ8X[16],LQ9X[16], + LR0X[16],LR1X[16],LR2X[16],LR3X[16],LR4X[16],LR5X[16],LR6X[16],LR7X[16],LR8X[16],LR9X[16], + LS0X[16],LS1X[16],LS2X[16],LS3X[16],LS4X[16],LS5X[16],LS6X[16],LS7X[16],LS8X[16],LS9X[16], + LT0X[16],LT1X[16],LT2X[16],LT3X[16],LT4X[16],LT5X[16],LT6X[16],LT7X[16],LT8X[16],LT9X[16], + LU0X[16],LU1X[16],LU2X[16],LU3X[16],LU4X[16],LU5X[16],LU6X[16],LU7X[16],LU8X[16],LU9X[16], + LV0X[16],LV1X[16],LV2X[16],LV3X[16],LV4X[16],LV5X[16],LV6X[16],LV7X[16],LV8X[16],LV9X[16], + LW0X[16],LW1X[16],LW2X[16],LW3X[16],LW4X[16],LW5X[16],LW6X[16],LW7X[16],LW8X[16],LW9X[16], + =AY0N/X[16],=AY7X/X[16],=AZ1A/X[16],=L20X/LH[16],=LP0B/XP[16],=LR1AW/X[16],=LT5X/XP[16], + =LU/UA4WHX/X[16],=LU1AW/X[16],=LU1DNC/X[16],=LU1DZ/X[16],=LU1WFU/XA[16],=LU1WUD/XA[16], + =LU1XA/XA[16],=LU1XAW/X[16],=LU1XB/X[16],=LU1XB/XA[16],=LU1XBR/XA[16],=LU1XP/XP[16], + =LU1XPD/XP[16],=LU1XY/X[16],=LU1YY/XA[16],=LU1ZA/XA[16],=LU2CRM/XA[16],=LU2CRM/XB[16], + =LU2WA/XA[16],=LU2WBA/XA[16],=LU2WJV/XA[16],=LU2XBI/XA[16],=LU2XBI/XB[16],=LU2XWL/XP[16], + =LU2XX/X[16],=LU2XX/XA[16],=LU2XX/XP[16],=LU3DVN/X[16],=LU3DVN/XP[16],=LU3XEI/X[16], + =LU3XEI/XA[16],=LU3XEM/X[16],=LU3XUC/XP[16],=LU3XUJ/XP[16],=LU3XYL/XP[16],=LU4DBT/XA[16], + =LU4XAP/XA[16],=LU4XFN/XA[16],=LU4XPE/XP[16],=LU5BE/XA[16],=LU5BE/XC[16],=LU5DF/X[16], + =LU5EMB/X[16],=LU5HJC/X[16],=LU5HJC/XP[16],=LU5HJK/XP[16],=LU5XC/X[16],=LU5XP/X[16], + =LU5XWA/XP[16],=LU6EE/XA[16],=LU6XAH/X[16],=LU7DSY/XA[16],=LU7EUI/XP[16],=LU7XDY/X[16], + =LU7XDY/XA[16],=LU7XSC/XP[16],=LU8DLD/XA[16],=LU8DRA/XA[16],=LU8EOT/X[16],=LU8XC/X[16], + =LU8XUU/XP[16],=LU8XW/X[16],=LU8XW/XP[16],=LU9DPD/XA[16],=LU9HUP/X[16],=LU9WZO/XA[16], + =LU9XQG/XP[16],=LW3DKO/XA[16],=LW3DVN/X[16],=LW3ET/XP[16], + AY0Y[16],AY1Y[16],AY2Y[16],AY3Y[16],AY4Y[16],AY5Y[16],AY6Y[16],AY7Y[16],AY8Y[16],AY9Y[16], + AZ0Y[16],AZ1Y[16],AZ2Y[16],AZ3Y[16],AZ4Y[16],AZ5Y[16],AZ6Y[16],AZ7Y[16],AZ8Y[16],AZ9Y[16], + L20Y[16],L21Y[16],L22Y[16],L23Y[16],L24Y[16],L25Y[16],L26Y[16],L27Y[16],L28Y[16],L29Y[16], + L30Y[16],L31Y[16],L32Y[16],L33Y[16],L34Y[16],L35Y[16],L36Y[16],L37Y[16],L38Y[16],L39Y[16], + L40Y[16],L41Y[16],L42Y[16],L43Y[16],L44Y[16],L45Y[16],L46Y[16],L47Y[16],L48Y[16],L49Y[16], + L50Y[16],L51Y[16],L52Y[16],L53Y[16],L54Y[16],L55Y[16],L56Y[16],L57Y[16],L58Y[16],L59Y[16], + L60Y[16],L61Y[16],L62Y[16],L63Y[16],L64Y[16],L65Y[16],L66Y[16],L67Y[16],L68Y[16],L69Y[16], + L70Y[16],L71Y[16],L72Y[16],L73Y[16],L74Y[16],L75Y[16],L76Y[16],L77Y[16],L78Y[16],L79Y[16], + L80Y[16],L81Y[16],L82Y[16],L83Y[16],L84Y[16],L85Y[16],L86Y[16],L87Y[16],L88Y[16],L89Y[16], + L90Y[16],L91Y[16],L92Y[16],L93Y[16],L94Y[16],L95Y[16],L96Y[16],L97Y[16],L98Y[16],L99Y[16], + LO0Y[16],LO1Y[16],LO2Y[16],LO3Y[16],LO4Y[16],LO5Y[16],LO6Y[16],LO7Y[16],LO8Y[16],LO9Y[16], + LP0Y[16],LP1Y[16],LP2Y[16],LP3Y[16],LP4Y[16],LP5Y[16],LP6Y[16],LP7Y[16],LP8Y[16],LP9Y[16], + LQ0Y[16],LQ1Y[16],LQ2Y[16],LQ3Y[16],LQ4Y[16],LQ5Y[16],LQ6Y[16],LQ7Y[16],LQ8Y[16],LQ9Y[16], + LR0Y[16],LR1Y[16],LR2Y[16],LR3Y[16],LR4Y[16],LR5Y[16],LR6Y[16],LR7Y[16],LR8Y[16],LR9Y[16], + LS0Y[16],LS1Y[16],LS2Y[16],LS3Y[16],LS4Y[16],LS5Y[16],LS6Y[16],LS7Y[16],LS8Y[16],LS9Y[16], + LT0Y[16],LT1Y[16],LT2Y[16],LT3Y[16],LT4Y[16],LT5Y[16],LT6Y[16],LT7Y[16],LT8Y[16],LT9Y[16], + LU0Y[16],LU1Y[16],LU2Y[16],LU3Y[16],LU4Y[16],LU5Y[16],LU6Y[16],LU7Y[16],LU8Y[16],LU9Y[16], + LV0Y[16],LV1Y[16],LV2Y[16],LV3Y[16],LV4Y[16],LV5Y[16],LV6Y[16],LV7Y[16],LV8Y[16],LV9Y[16], + LW0Y[16],LW1Y[16],LW2Y[16],LW3Y[16],LW4Y[16],LW5Y[16],LW6Y[16],LW7Y[16],LW8Y[16],LW9Y[16], + =LU1DZ/Y[16],=LU1MAW/Y[16],=LU1VCS/Y[16],=LU1VYL/Y[16],=LU1YAE/Y[16],=LU1YDC/Y[16],=LU1YY/Y[16], + =LU2AAS/Y[16],=LU2VA/Y[16],=LU2VDQ/Y[16],=LU2XAN/Y[16],=LU2YMG/Y[16],=LU3XAP/XA[16],=LU3YEP/Y[16], + =LU3YLF/Y[16],=LU4AA/Y[16],=LU4DRC/Y[16],=LU4XEG/XA[16],=LU4YAB/Y[16],=LU4YAD/Y[16],=LU4YAL/Y[16], + =LU5HLR/Y[16],=LU5ILA/Y[16],=LU5YEC/Y[16],=LU5YF/Y[16],=LU5YFB/Y[16],=LU6VEO/Y[16],=LU6VM/Y[16], + =LU6YAB/Y[16],=LU6YBK/Y[16],=LU6YSG/Y[16],=LU7VB/Y[16],=LU7XBX/XA[16],=LU7YAR/Y[16],=LU7YCL/Y[16], + =LU7YG/Y[16],=LU7YP/Y[16],=LU7YTW/Y[16],=LU8DQ/Y[16],=LU8DRA/Y[16],=LU8EB/Y[16],=LU8EOT/Y[16], + =LU8IEZ/Y[16],=LU8VCC/Y[16],=LU8XBC/XA[16],=LU8XBS/XA[16],=LU8YAH/Y[16],=LU8YD/Y[16],=LU8YE/Y[16], + =LU8YMP/Y[16],=LU8YSF/Y[16],=LU9BSA/Y[16],=LU9ESD/Y[16],=LU9XCC/XA[16],=LW1EXU/Y[16],=LW2DX/Y[16], + =LW7DLY/Y[16],=LW7DQQ/Y[16],=LW9DCF/Y[16]; +Luxembourg: 14: 27: EU: 50.00: -6.00: -1.0: LX: + LX,=LX9S/J; +Lithuania: 15: 29: EU: 55.45: -23.63: -2.0: LY: + LY,=LY/4X4FC/LH,=LY/4Z5KJ/LH,=LY1CM/A/LH,=LY1CM/LH,=LY1CM/P/LGT,=LY1CM/P/LH,=LY1DF/LH,=LY1DR/LGT, + =LY1DS/LH,=LY1FW/LH,=LY2BIG/LH,=LY2DX/LGT,=LY2DX/LH,=LY2FN/LGT,=LY2FN/LH,=LY2UF/LGT,=LY2UF/LH, + =LY3BW/LH,=LY3MU/LH,=LY3TT/LH,=LY4Y/LH,=LY5O/P/LH,=LY5W/P/LH,=YL/LY1CM/LH; +Bulgaria: 20: 28: EU: 42.83: -25.08: -2.0: LZ: + LZ,=LZ/G0SGB/LH,=LZ2NU/LH,=LZ4HWF/LH; +Peru: 10: 12: SA: -10.00: 76.00: 5.0: OA: + 4T,OA,OB,OC; +Lebanon: 20: 39: AS: 33.83: -35.83: -2.0: OD: + OD,=OD5NJ/ID,=OD5QB/ID,=OD5RI/YOTA; +Austria: 15: 28: EU: 47.33: -13.33: -1.0: OE: + OE,=4U0R,=4U10NPT,=4U18FIFA,=4U1A,=4U1VIC,=4U1WED,=4U1XMAS,=4U2STAYHOME,=4U2U,=4U30VIC,=4U500M, + =4U70VIC,=4U75A,=4UNR,=4Y1A,=C7A,=OE2015XHQ/SC, + =OE3AIS/ANT, + =OE3AGA/AAW,=OE3AIS/AAW,=OE3HM/AAW,=OE3KKA/AAW,=OE3KKA/ANT,=OE3KTA/ANT,=OE3MWS/Y2K,=OE3RPB/AAW, + =OE3RPB/ANT,=OE3SGA/AAW,=OE3SGA/ANT,=OE3WWB/AAW,=OE3WWB/ANT,=OE4VIE/ANT, + =OE4PFU/Y2K,=OE6XMF/4/LH, + =OE5BJN/Y2K,=OE5OHO/Y2K, + =OE6XMF/FM,=OE6XMF/NOE,=OE6XMF/U20, + =OE3XHA/VFW06,=OE7AJT/Y2K,=OE7XBH/WM05; +Finland: 15: 18: EU: 61.38: -24.82: -2.0: OH: + OF,OG,OH,OI,OJ,=OH/RX3AMI/LH, + =OF100FI/1/LH,=OF1AD/S,=OF1LD/S,=OF1TX/S,=OH0HG/1,=OH0J/1,=OH0JJS/1,=OH0MDR/1,=OH0MRR/1,=OH1AD/S, + =OH1AF/LH,=OH1AH/LH,=OH1AH/LT,=OH1AM/LH,=OH1BGG/S,=OH1BGG/SA,=OH1BS/SA,=OH1CM/S,=OH1F/LGT, + =OH1F/LH,=OH1FJ/S,=OH1FJ/SA,=OH1KW/S,=OH1KW/SA,=OH1LD/S,=OH1LEO/S,=OH1MLZ/SA,=OH1NR/S,=OH1OD/S, + =OH1PP/S,=OH1PV/S,=OH1S/S,=OH1SJ/S,=OH1SJ/SA,=OH1SM/S,=OH1TX/S,=OH1TX/SA,=OH1UH/S,=OH1XW/S, + =OI1AXA/S,=OI1AY/S,=OI1SWM/S, + =OF2BNX/SA,=OG2O/YL,=OH0AM/2,=OH0BT/2,=OH0HG/2,=OH2AAF/S,=OH2AAF/SA,=OH2AAV/S,=OH2AN/SUB, + =OH2AUE/S,=OH2AUE/SA,=OH2AY/S,=OH2BAX/S,=OH2BMB/S,=OH2BMB/SA,=OH2BNB/SA,=OH2BNX/S,=OH2BNX/SA, + =OH2BQP/S,=OH2BXT/S,=OH2C/S,=OH2EO/S,=OH2ET/LH,=OH2ET/LS,=OH2ET/S,=OH2FBX/S,=OH2FBX/SA,=OH2HK/S, + =OH2HZ/S,=OH2MEE/S,=OH2MEE/SA,=OH2MH/S,=OH2MO/S,=OH2MO/SA,=OH2NAS/S,=OH2NAS/SA,=OH2NM/LH,=OH2PO/S, + =OH2PO/SA,=OH2S/S,=OH2S/SA,=OH2XL/S,=OH2XMP/S,=OH2ZL/SA,=OH2ZY/S,=OI2ABG/S, + =OF3HHO/S,=OF3KRB/S,=OG3X/LH,=OH0MZA/3,=OH3A/LH,=OH3ABN/S,=OH3ACA/S,=OH3AG/LH,=OH3CT/S,=OH3CT/SA, + =OH3FJQ/S,=OH3FJQ/SA,=OH3GDO/LH,=OH3GQM/S,=OH3HB/S,=OH3HB/SA,=OH3HHO/S,=OH3HHO/SA,=OH3IH/S, + =OH3IH/SA,=OH3IS/S,=OH3KRB/S,=OH3KRB/SA,=OH3LB/S,=OH3LB/SA,=OH3LS/S,=OH3MY/S,=OH3MY/SA,=OH3N/S, + =OH3NOB/S,=OH3NVK/S,=OH3R/SA,=OH3SUF/JOTA,=OH3TAM/LH,=OH3VV/S,=OH3W/S,=OH3WR/SA,=OI3SVM/S, + =OI3SVM/SA,=OI3V/LH,=OI3V/S,=OI3V/SA,=OI3W/LGT,=OI3W/LH, + =OG0V/4,=OH0I/4,=OH0V/4,=OH4FSL/SA,=OH4N/S,=OH4SG/S,=OI4JM/S,=OI4JM/SA,=OI4PM/S, + =OF200AD/LS,=OF200AD/S,=OF5AD/S,=OG5A/LS,=OG5A/S,=OH0AW/5,=OH5A/S,=OH5AA/LS,=OH5AD/LS,=OH5AD/S, + =OH5B/LH,=OH5EAB/S,=OH5EAB/SA,=OH5GOE/S,=OH5J/S,=OH5J/SA,=OH5JJL/S,=OH5K/S,=OH5LP/S,=OH5LP/SA, + =OH5R/S,=OH5ZB/S,=OI5AY/LH,=OI5AY/SA,=OI5PRM/SA, + =OF6FSQ/S,=OF6NL/SA,=OF6QR/S,=OG6M/S,=OH0Y/6,=OH2Y/6/LH,=OH6AC/LH,=OH6ADHD/LH,=OH6AG/S,=OH6AR/LH, + =OH6CT/S,=OH6CT/SA,=OH6EFH/SA,=OH6EOG/SA,=OH6FA/S,=OH6FA/SA,=OH6FMG/LH,=OH6FSQ/S,=OH6G/S, + =OH6GSR/S,=OH6HGW/S,=OH6K/S,=OH6MH/S,=OH6NL/S,=OH6NL/SA,=OH6NR/LGT,=OH6NR/LH,=OH6NZ/SA,=OH6OT/S, + =OH6PA/S,=OH6QR/S,=OH6QR/SA,=OH6RJ/S,=OH6VM/S,=OI6AY/LH,=OI6SP/S,=OI6SP/SA, + =OH7AB/S,=OH7AX/S,=OH7BD/S,=OH7ND/S,=OH7NE/S,=OH7QA/S,=OH7QA/SA,=OH7SV/SA,=OH7UE/S,=OH7VL/S, + =OH7XI/S,=OI7AX/S, + =OH8AAU/LH,=OH8FCK/S,=OH8FCK/SA,=OH8KN/S,=OH8KN/SA,=OI8VK/S, + =OH0KAG/9,=OH9AR/S,=OH9TM/S,=OH9TO/S; +Aland Islands: 15: 18: EU: 60.13: -20.37: -2.0: OH0: + OF0,OG0,OH0,OI0,=OF100FI/0,=OG2K/0,=OG2M/0,=OG3M/0,=OH1LWZ/0,=OH2FTJ/0,=OH2JXA/0,=OH6ZZ/0,=OH8K/0; +Market Reef: 15: 18: EU: 60.00: -19.00: -2.0: OJ0: + OJ0; +Czech Republic: 15: 28: EU: 50.00: -16.00: -1.0: OK: + OK,OL,=OK6RA/APF,=OK9BAR/YL,=OL0R/J, + =OK1KCR/J,=OK1KI/YL; +Slovak Republic: 15: 28: EU: 49.00: -20.00: -1.0: OM: + OM; +Belgium: 14: 27: EU: 50.70: -4.85: -1.0: ON: + ON,OO,OP,OQ,OR,OS,OT,=ON3BLB/YL,=ON3TC/YL,=ON4BRC/J,=ON4BRN/LGT,=ON4BRN/LH,=ON4BRN/LS,=ON4BRN/SUB, + =ON4CCC/LGT,=ON4CCC/LH,=ON4CEL/LGT,=ON4CEL/LH,=ON4CIS/LGT,=ON4CIS/LH,=ON4CJK/LH,=ON4CKZ/LH, + =ON4CP/JOTA,=ON4LO/LH,=ON4MCL/LH,=ON4OS/LH,=ON4OSA/LH,=ON4OSLN/LH,=ON6UJ/LH,=ON7PP/LH,=ON7RU/LGT, + =ON7RU/LH,=ON9BD/LH,=ON9BD/LS,=OO4BRN/LGT,=OO4BRN/LS,=OO4BRN/SUB,=OP5K/LGT,=OP5K/LH,=OP5K/LT, + =OR0OST/LGT,=OR0OST/LH,=OR0OST/SUB,=OR4BRN/SAIL,=OS4OSA/LH; +Greenland: 40: 05: NA: 74.00: 42.78: 3.0: OX: + OX,XP,=OX/ON6JUN/LH; +Faroe Islands: 14: 18: EU: 62.07: 6.93: 0.0: OY: + OW,OY,=OY1CT/HQ; +Denmark: 14: 18: EU: 56.00: -10.00: -1.0: OZ: + 5P,5Q,OU,OV,OZ,=5P0MF/LH,=5P2X/LH,=5P5CW/LH,=OU7LH/LH,=OV4JAM/J,=OZ/DG1EHM/LH,=OZ/DG2RON/LH, + =OZ/DJ5AA/LH,=OZ/DJ7AO/LGT,=OZ/DJ7AO/LH,=OZ/DL1BWU/LH,=OZ/DL3JJ/LH,=OZ/DL4AM/LH,=OZ/DL4ZZ/LH, + =OZ/DL5SE/LH,=OZ/DL7RSM/LH,=OZ/DR4X/LH,=OZ/ON6JUN/LH,=OZ/PH7Y/LH,=OZ0IL/LH,=OZ0MF/LH,=OZ0Q/LH, + =OZ0Y/LS,=OZ13LH/LH,=OZ1CF/LH,=OZ1IIL/LH,=OZ1KAH/LH,=OZ1KR/J,=OZ1SDB/LH,=OZ1SKA/LH,=OZ2F/LH, + =OZ2FG/LH,=OZ2GBW/LGT,=OZ2GBW/LH,=OZ2NYB/LGT,=OZ2ZB/LH,=OZ3EDR/LH,=OZ3EVA/LH,=OZ3FYN/LH, + =OZ3TL/JOTA,=OZ4EL/LH,=OZ4HAM/LH,=OZ50RN/LH,=OZ5ESB/LH,=OZ5GRE/LH,=OZ7AEI/LH,=OZ7DAL/LH, + =OZ7DAL/LS,=OZ7EA/YL,=OZ7HAM/LH,=OZ7LH/LH,=OZ7RJ/LGT,=OZ7RJ/LH,=OZ7SP/JOTA,=OZ7TOM/LH,=OZ8KV/LH, + =OZ8SMA/LGT,=OZ8SMA/LH,=OZ9HBO/JOTA,=OZ9HBO/LH,=OZ9WSR/J; +Papua New Guinea: 28: 51: OC: -9.50: -147.12: -10.0: P2: + P2; +Aruba: 09: 11: SA: 12.53: 69.98: 4.0: P4: + P4,=P40YL/YL; +DPR of Korea: 25: 44: AS: 39.78: -126.30: -9.0: P5: + P5,P6,P7,P8,P9; +Netherlands: 14: 27: EU: 52.28: -5.47: -1.0: PA: + PA,PB,PC,PD,PE,PF,PG,PH,PI,=PA/DF8WA/LH,=PA/DL0IGA/LH,=PA/DL1KVN/LH,=PA/DL2GW/LH,=PA/DL2KSB/LH, + =PA/DL5SE/LH,=PA/ON4NOK/LH,=PA/ON6EF/LH,=PA/ON7RU/LH,=PA0GOR/J,=PA0TLM/J,=PA0XAW/LH,=PA100J/J, + =PA100SH/J,=PA110HL/LH,=PA110LL/LH,=PA14NAWAKA/J,=PA1AW/J,=PA1BDO/LH,=PA1BP/J,=PA1EDL/J,=PA1ET/J, + =PA1FJ/J,=PA1FR/LH,=PA1VLD/LH,=PA2008NJ/J,=PA25SCH/LH,=PA2DK/J,=PA2LS/YL,=PA2RO/J,=PA3AAF/LH, + =PA3AFG/J,=PA3BDQ/LH,=PA3BIC/LH,=PA3BXR/MILL,=PA3CNI/LH,=PA3CNI/LT,=PA3CPI/J,=PA3CPI/JOTA, + =PA3DEW/J,=PA3EEQ/LH,=PA3EFR/J,=PA3ESO/J,=PA3EWG/J,=PA3FBO/LH,=PA3FYE/J,=PA3GAG/LH,=PA3GQS/J, + =PA3GWN/J,=PA3HFJ/J,=PA3WSK/JOTA,=PA40LAB/J,=PA4AGO/J,=PA4M/LH,=PA4RVS/MILL,=PA4WK/J,=PA5CA/LH, + =PA65DUIN/J,=PA65URK/LH,=PA6ADZ/MILL,=PA6ARC/LH,=PA6FUN/LGT,=PA6FUN/LH,=PA6FUN/LS,=PA6HOOP/MILL, + =PA6HYG/J,=PA6JAM/J,=PA6KMS/MILL,=PA6LH/LH,=PA6LL/LH,=PA6LST/LH,=PA6LST/LS,=PA6MZD/MILL, + =PA6OP/MILL,=PA6RCG/J,=PA6SB/L,=PA6SB/LH,=PA6SCH/LH,=PA6SHB/J,=PA6SJB/J,=PA6SJS/J,=PA6STAR/MILL, + =PA6URK/LH,=PA6VEN/LH,=PA6VLD/LH,=PA6WAD/LGT,=PA70HYG/JOTA,=PA75N/L,=PA75SM/J,=PA7AL/LH,=PA7HPH/J, + =PA7JWC/J,=PA99HYG/JOTA,=PA9JAS/J,=PA9M/LH,=PB6F/LH,=PB6KW/LH,=PB88XYL/YL,=PB9ZR/J,=PC2D/LH, + =PC5D/J,=PC6RH/J,=PD0ARI/MILL,=PD0FSB/LH,=PD1JL/MILL,=PD1JSH/J,=PD2C/LH,=PD2GCM/LH,=PD5CW/LH, + =PD5MVH/P/LH,=PD7DX/J,=PE18KA/J,=PE1BOJ/J,=PE1NCS/LGT,=PE1NCS/LH,=PE1NZJ/J,=PE1OPM/LH,=PE1ORG/J, + =PE1OXI/J,=PE1PEX/J,=PE1RBG/J,=PE1RBR/J,=PE2MC/J,=PE2MGA/J,=PE7M/J,=PF100ROVER/J,=PF18NAWAKA/J, + =PF4R/LH,=PG150N/LH,=PG64HOOP/MIL,=PG6HK/LH,=PG6N/LH,=PH4RTM/MILL,=PH4RTM/WHE,=PH50GFB/J,=PH6BB/J, + =PH6WAL/LH,=PH75S/J,=PH9GFB/J,=PI4ADH/LGT,=PI4ADH/LH,=PI4ADH/LS,=PI4ALK/LH,=PI4AZL/J,=PI4BG/J, + =PI4BOZ/LH,=PI4CQ/J,=PI4DHG/DM,=PI4DHG/MILL,=PI4ET/MILL,=PI4ETL/MILL,=PI4F/LH,=PI4LDN/L, + =PI4LDN/LH,=PI4RCK/LGT,=PI4RCK/LH,=PI4RIS/J,=PI4S/J,=PI4SHV/J,=PI4SRN/LH,=PI4SRN/MILL,=PI4VHW/J, + =PI4VNW/LGT,=PI4VNW/LH,=PI4VPO/LH,=PI4VPO/LT,=PI4WAL/LGT,=PI4WAL/LH,=PI4WBR/LH,=PI4WFL/MILL, + =PI4YLC/LH,=PI4ZHE/LH,=PI4ZHE/LS,=PI4ZHE/MILL,=PI4ZVL/FD,=PI4ZVL/LGT,=PI4ZVL/LH,=PI4ZWN/MILL, + =PI9NHL/LH,=PI9SRS/LH,=PI9TP/J; +Curacao: 09: 11: SA: 12.17: 69.00: 4.0: PJ2: + PJ2; +Bonaire: 09: 11: SA: 12.20: 68.25: 4.0: PJ4: + PJ4; +Saba & St. Eustatius: 08: 11: NA: 17.57: 63.10: 4.0: PJ5: + PJ5, + PJ6; +Sint Maarten: 08: 11: NA: 18.07: 63.07: 4.0: PJ7: + PJ0,PJ7,PJ8; +Brazil: 11: 15: SA: -10.00: 53.00: 3.0: PY: + PP,PQ,PR,PS,PT,PU,PV,PW,PX,PY,ZV,ZW,ZX,ZY,ZZ,=PQ5P/C,=PU1NEZ/LH,=ZW1BC/SD, + =PP5AA/SD,=PP5GFM/C,=PP5GFM/SD,=PP5VB/LH,=ZY5BI/SD, + PP6[13], + PP7[13],=PP7AA/LH[13], + PP8[12], + PQ2[13], + PQ8[13], + PR7[13], + PR8[13], + PS7[13],=PS7AA/SD[13], + PS8[13],=PS8AA/SD[13], + PT2[13],=ZW50CVA/SD[13], + PT7[13],=PT7AAC/SD[13],=PT7CB/J[13],=ZY7C/SD[13], + PT8[12], + =PT9AA/SD, + PV8[12],=PV8DX/SD[12],=PV8IG/SD[12], + PW8[12],=PW8AA/SD[12], + =PY1AA/LH,=PY1AA/SD,=PY1CML/SD,=PY1CRN/LH,=PY1DCS/SD,=PY1DCX/SD,=PY1WC/SD, + =PU2AIL/YL,=PU2RTO/LH,=PY2ASS/C,=PY2DS/Q,=PY2NDX/SD,=PY2TDP/SD,=ZX2T/SD,=ZY2CPC/SD, + =PU3KIT/YL,=PY3AA/LH,=PY3AA/SD,=PY3COM/SD,=PY3CQ/LH,=PY3CRA/SD,=PY3MHZ/SD,=PY3MSS/YL,=PY3RCA/SD, + =PY3RT/SD,=PY3UGR/SD,=PY3UR/SD,=PY3UU/SD,=ZW3RS/LH, + =PY4CEL/SD,=PY4CLK/SD,=PY4MAB/BNC,=PY4VL/SD,=PY4XX/SD,=ZW4CPC/SD, + =PY5AA/SD, + PY6[13],=ZY6BI/SD[13],=ZY6MP/SD[13], + PY7[13],=PY7AA/SD[13],=PY7COM/SD[13],=ZV7AA/LGT[13],=ZW7CTA/SD[13], + PY8[13],=PY3TEN/PY8/SD[13],=PY8ELO/SD[13], + PY9[13]; +Fernando de Noronha: 11: 13: SA: -3.85: 32.43: 2.0: PY0F: + PP0F,PP0ZF,PQ0F,PQ0ZF,PR0F,PR0ZF,PS0F,PS0ZF,PT0F,PT0ZF,PU0F,PU0ZF,PV0F,PV0ZF,PW0F,PW0ZF,PX0F, + PX0ZF,PY0F,PY0Z,ZV0F,ZV0ZF,ZW0F,ZW0ZF,ZX0F,ZX0ZF,ZY0F,ZY0Z,ZZ0F,ZZ0ZF,=PY0NY,=ZY0K, + PP0R,PP0ZR,PQ0R,PQ0ZR,PR0R,PR0ZR,PS0R,PS0ZR,PT0R,PT0ZR,PU0R,PU0ZR,PV0R,PV0ZR,PW0R,PW0ZR,PX0R, + PX0ZR,PY0R,ZV0R,ZV0ZR,ZW0R,ZW0ZR,ZX0R,ZX0ZR,ZY0R,ZZ0R,ZZ0ZR; +St. Peter & St. Paul: 11: 13: SA: 0.00: 29.00: 2.0: PY0S: + PP0S,PP0ZS,PQ0S,PQ0ZS,PR0S,PR0ZS,PS0S,PS0ZS,PT0S,PT0ZS,PU0S,PU0ZS,PV0S,PV0ZS,PW0S,PW0ZS,PX0S, + PX0ZS,PY0S,PY0ZS,ZV0S,ZV0ZS,ZW0S,ZW0ZS,ZX0S,ZX0ZS,ZY0S,ZY0ZS,ZZ0S,ZZ0ZS; +Trindade & Martim Vaz: 11: 15: SA: -20.50: 29.32: 2.0: PY0T: + PP0T,PP0ZT,PQ0T,PQ0ZT,PR0T,PR0ZT,PS0T,PS0ZT,PT0T,PT0ZT,PU0T,PU0ZT,PV0T,PV0ZT,PW0T,PW0ZT,PX0T, + PX0ZT,PY0T,PY0ZT,ZV0T,ZV0ZT,ZW0T,ZW0ZT,ZX0T,ZX0ZT,ZY0T,ZY0ZT,ZZ0T,ZZ0ZT; +Suriname: 09: 12: SA: 4.00: 56.00: 3.0: PZ: + PZ; +Franz Josef Land: 40: 75: EU: 80.68: -49.92: -3.0: R1FJ: + RI1F,=R1FJL,=R1FJM,=UA1PBN/1,=UA4RX/1; +Western Sahara: 33: 46: AF: 24.82: 13.85: 0.0: S0: + S0; +Bangladesh: 22: 41: AS: 24.12: -89.65: -6.0: S2: + S2,S3; +Slovenia: 15: 28: EU: 46.00: -14.00: -1.0: S5: + S5,=S51LGT/LH,=S52AL/YL,=S52L/LH,=S58U/LH,=S59HIJ/LH; +Seychelles: 39: 53: AF: -4.67: -55.47: -4.0: S7: + S7,=S79EC/F,=S79NAN/F,=S79RRC/C,=S79RRC/F; +Sao Tome & Principe: 36: 47: AF: 0.22: -6.57: 0.0: S9: + S9; +Sweden: 14: 18: EU: 58.90: -15.33: -1.0: SM: + 7S,8S,SA,SB,SC,SD,SE,SF,SG,SH,SI,SJ,SK,SL,SM,=8S8ODEN(40),=8S8ODEN/MM(40),=SM/DL6II/LH, + =SM/RX3AMI/LS,=SM7DAY/LH, + =7S0SFJ/LGT,=7S0SFJ/LH,=7S0SFJ/LS,=8S0UN/LH,=SK0BJ/LH,=SM0SVI/LGT, + =SF1B/LH,=SM1YRA/LH, + =SA2YLM/YL,=SI2SSA/LH,=SK2AU/LGT,=SK2AU/LH,=SM2JKI/S, + =SE3TLG/LH,=SK3BG/LH,=SK3GK/LGT,=SK3GK/LH,=SK3GK/LT,=SK3LH/LH,=SM/RX3AMI/LH,=SM3BDZ/2M,=SM3DMP/2M, + =SM3TLG/LGT,=SM3TLG/LH, + =7S5LH/LH,=SB5RAFS/LH,=SH5FEM/LH,=SK5BB/LS,=SK5UM/JOTA,=SK5WB/LH,=SM5EUG/2M,=SM5FAN/2M, + =8S6NAV/LH,=8S6VAN/LH,=SA6AJK/2M,=SB6HL/LH,=SH6HUL/LH,=SK6FL/LS,=SK6MA/LH,=SK6QA/LH,=SK6RM/IMD, + =SM6AAL/S, + =7S7KUL/LH,=7S7SAN/LH,=7S7V/LH,=8S7GL/LH,=8S7L/LH,=8S7LHJ/LH,=SA7SM/LH,=SA7SM/LT,=SE7M/LH, + =SF7KUL/LH,=SK7DX/LH,=SK7FK/LGT,=SK7FK/LH,=SK7FK/LHT,=SK7L/LH,=SK7RN/LH,=SM7AAL/S; +Poland: 15: 28: EU: 52.28: -18.67: -1.0: SP: + 3Z,HF,SN,SO,SP,SQ,SR,=3Z50KPN/FF,=SP0PGC/FF,=SP1NY/MM(34), + =3Z1EE/LH,=SN1D/LH,=SO1WE/LH,=SO1ZV/LH,=SP1/DM3VA/LH,=SP1KBK/LH,=SP1KNM/LH,=SP1RWK/LH,=SP1ZZ/1/LH, + =SP1ZZ/LH,=SP3VT/1/LH,=SQ1KSL/YL, + =SN2NP/LH,=SP2AYC/LH,=SP2BNJ/LH,=SP2FAP/FF,=SP2HHC/LH,=SP2KAC/LH,=SP2KDS/LH,=SP2KJF/FF,=SP2MHC/LH, + =SP2PHA/LH,=SP2PMW/LH,=SP2PZH/LH,=SP2QCR/LH,=SP2WGZ/LH,=SP5PB/2/LH,=SQ2PHG/LH,=SQ2PHI/LH, + =SQ3PMM/FF, + =SP4KDX/FF,=SQ4G/FF, + =HF25NHV/FF,=HF80BUJ/FF,=SP5EZJ/LH,=SP5G/FF,=SP5KAB/LH,=SP5VYI/FF,=SP5X/FF,=SQ5AWR/FF,=SQ5Q/FF, + =SP6HFT/FF,=SP6NIO/FF, + =SQ8VPS/YOTA, + =SP9EWM/FF,=SP9KJU/FF; +Sudan: 34: 48: AF: 14.47: -28.62: -3.0: ST: + 6T,6U,ST; +Egypt: 34: 38: AF: 26.28: -28.60: -2.0: SU: + 6A,6B,SS,SU; +Greece: 20: 28: EU: 39.78: -21.78: -2.0: SV: + J4,SV,SW,SX,SY,SZ,=J42004/DH1NA,=J42004/DH1PS,=J42004/HA3NU,=J42004/N3JWJ,=J42004/OE5ER,=SV54FF, + =SX90IARU, + =SV1/LY1DF/LGT,=SV1EOS/JOTA,=SV1EQU/J,=SV5FRI/1,=SV5FRQ/1,=SV9AWF/1,=SV9CUF/1,=SV9DRU/1,=SV9TJ/1, + =SV2AEL/J,=SV2CLJ/J,=SV2JAO/J,=SV2KBB/J,=SV2RNY/J,=SV94MIKIS,=SV94THEO,=SX100TSL/J,=SX94MIKIS, + =SY2AEI/J,=SY2WT/LH,=SZ2TSL/J, + =SV5CJK/3,=SV5FRK/3,=SV5FRP/3,=SV9ION/3, + =SV9OFL/4,=SZ4SRM/J, + =SV9DJO/7,=SZ7KAM/LH, + =SV5KJQ/8,=SV8/DJ5AA/LH,=SV8/LY1DF/LGT,=SV9GPM/8,=SW8SW/LH,=SX8DI/LH,=SZ8LES/LH,=SZ8XIO/J, + =SZ8XIO/P/JOTA; +Mount Athos: 20: 28: EU: 40.00: -24.00: -2.0: SV/a: + =SV2/SV1RP/T,=SV2ASP,=SV2ASP/A,=SV2ASP/P,=SV2RSG/A,=SY2A; +Dodecanese: 20: 28: EU: 36.17: -27.93: -2.0: SV5: + J45,SV5,SW5,SX5,SY5,SZ5,=J42004/SP5MXZ,=J45FRE/J,=SV0XAN,=SV0XAN/5,=SV0XAN/P,=SV0XBZ/5,=SV0XCA/5, + =SV0XCA/P,=SV1BJY/P,=SV1ENJ/5,=SV1GSX/5,=SV5/DJ5AA/LH,=SV5/LY1DF/LGT,=SV5CJQ/LH,=SV9DJO/5, + =SV9GPV/5,=SV9JI/5,=SV9OFS/5,=SX100SEP/5,=SX200ADL,=SX200AZK,=SX200AZR,=SX200BYR,=SX200CJK, + =SX200DKL,=SX200DZX,=SX200FRT,=SX200KKU,=SX200SKE,=SX65AP,=SX65AP/5,=SZ200RDS; +Crete: 20: 28: EU: 35.23: -24.78: -2.0: SV9: + J49,SV9,SW9,SX9,SY9,SZ9,=J42004/HB9IQB,=J42004/M0WTD,=J42004Q,=J42004ZFG,=SV0IG/9,=SV0LB,=SV0LB/9, + =SV0LK,=SV0LK/9,=SV0XAI,=SV0XAI/9,=SV0XAZ,=SV0XBJ,=SV0XBM/9,=SV0XBN,=SV0XBN/9,=SV0XBQ,=SV0XBQ/9, + =SV0XBR,=SV0XBW,=SV0XBZ/9,=SV0XCC/9,=SV1BJW/9,=SV1EIJ/9,=SV2KBS/9,=SV5FRP/9,=SV9/LY1DF/LGT, + =SX200ANK,=SX200BMG,=SX200CAF,=SX200CJO,=SX200COL,=SX200CVY,=SX200DJO,=SX200FBG,=SX200FBK, + =SX200JI,=SX200KNA,=SX200MBH,=SX200QWP,=SX200RGI,=SX200RKU,=SX200RMU,=SX200RNG,=SY200CGZ, + =SZ200ERK; +Tuvalu: 31: 65: OC: -8.50: -179.20: -12.0: T2: + T2; +Western Kiribati: 31: 65: OC: 1.42: -173.00: -12.0: T30: + T30,=T3AJ; +Central Kiribati: 31: 62: OC: -2.83: 171.72: -13.0: T31: + T31; +Eastern Kiribati: 31: 61: OC: 1.80: 157.35: -14.0: T32: + T32; +Banaba Island: 31: 65: OC: -0.88: -169.53: -12.0: T33: + T33; +Somalia: 37: 48: AF: 2.03: -45.35: -3.0: T5: + 6O,T5; +San Marino: 15: 28: EU: 43.95: -12.45: -1.0: T7: + T7; +Palau: 27: 64: OC: 7.45: -134.53: -9.0: T8: + T8; +Asiatic Turkey: 20: 39: AS: 39.18: -35.65: -2.0: TA: + TA,TB,TC,YM,=TC50TRAC/01K,=TC50TRAC/17B,=TC50TRAC/18E,=TC50TRAC/28GR,=TC50TRAC/41KF, + =TA1AD/0,=TA1E/0,=TA1ED/0,=TA1FL/0,=TA1ZK/0,=TC0SV/LH, + =TA1AJJ/2,=TA1BX/2,=TA1BZ/2,=TA1C/2,=TA1CM/2,=TA1CX/2,=TA1FA/2,=TA1FM/2,=TA1HZ/2,=TA2IJ/YOM, + =TC2ELH/LH,=TC50TRAC/34K,=TC50TRAC/41G,=TC50TRAC/41K,=TC50TRAC/67E,=TC50TRAC/67Z,=YM1SIZ/2, + =TA1BM/3,=TA1BX/3,=TA1BX/3/M,=TA1D/3,=TA1UT/3,=TA3J/LH,=TC50TRAC/10B,=TC50TRAC/16M,=TC50TRAC/35I, + =TC50TRAC/35K, + =TA1AO/4,=TA1D/4,=TA1HZ/4,=TA3J/4/LGT,=TA4/DJ5AA/LH,=TA4CS/LH,=TC50TRAC/03D,=TC50TRAC/15B, + =TC50TRAC/01A,=TC50TRAC/80K,=TC50TRAC/80O, + =TA1AYR/6,=TC50TRAC/18C, + =TA7KB/LGT,=TA7KB/LH,=TC50TRAC/28G,=TC50TRAC/29T,=TC50TRAC/38D,=TC50TRAC/38K,=TC7YLH/LH,=YM7KA/LH, + =TA1O/8, + =TA9J/LH; +European Turkey: 20: 39: EU: 41.02: -28.97: -2.0: *TA1: + TA1,TB1,TC1,YM1,=TA1BX/LH,=TA2AKG/1,=TA2LZ/1,=TA2ZF/1,=TA3CQ/1,=TA3HM/1,=TA5CT/1,=TA6CQ/1,=TC100A, + =TC100GLB,=TC100GP,=TC100GS,=TC100KT,=TC100VKZL,=TC101GLB,=TC101GP,=TC101GS,=TC101KT,=TC18MART, + =TC2ISAF/1,=TC50TRAC/17G,=TC50TRAC/34I,=TC9SAM/1; +Iceland: 40: 17: EU: 64.80: 18.73: 0.0: TF: + TF,=TF1IRA/LGT,=TF1IRA/LH,=TF1IRA/LT,=TF8IRA/LH,=TF8RX/LGT,=TF8RX/LH; +Guatemala: 07: 11: NA: 15.50: 90.30: 6.0: TG: + TD,TG; +Costa Rica: 07: 11: NA: 10.00: 84.00: 6.0: TI: + TE,TI,=TI90IARU; +Cocos Island: 07: 11: NA: 5.52: 87.05: 6.0: TI9: + TE9,TI9; +Cameroon: 36: 47: AF: 5.38: -11.87: -1.0: TJ: + TJ; +Corsica: 15: 28: EU: 42.00: -9.00: -1.0: TK: + TK,=TK/F4FET/LH; +Central African Republic: 36: 47: AF: 6.75: -20.33: -1.0: TL: + TL; +Republic of the Congo: 36: 52: AF: -1.02: -15.37: -1.0: TN: + TN; +Gabon: 36: 52: AF: -0.37: -11.73: -1.0: TR: + TR; +Chad: 36: 47: AF: 15.80: -18.17: -1.0: TT: + TT; +Cote d'Ivoire: 35: 46: AF: 7.58: 5.80: 0.0: TU: + TU; +Benin: 35: 46: AF: 9.87: -2.25: -1.0: TY: + TY; +Mali: 35: 46: AF: 18.00: 2.58: 0.0: TZ: + TZ; +European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA: + R,U,=R0AGD/6,=R0CAF/1,=R0XAD/6/P,=R25EMW(17)[19],=R7AB/M,=R80PSP,=R80UPOL,=R8CT/4/P,=R8FF/3/M, + =R8FF/7,=R90DOSAAF,=R9AV/6,=R9FCH/6,=R9HV/6,=R9JBF/1,=R9JBH/7,=R9JI/1,=R9KC/6/M,=R9WR/1,=R9XAU/6, + =RA0AM/6,=RA0BM/6,=RA0ZZ/3,=RA3CQ/9/M(17)[20],=RA80SP,=RA9JR/3,=RA9JX/3,=RA9P/4,=RA9RT/3, + =RA9UEZ/6,=RA9UUY/6,=RA9YA/6,=RC80SP,=RG0F/5,=RG50P(17),=RG50P/9(17)[30],=RJ80SP,=RK0HWW/1, + =RK80X(17)[19],=RK8O/4,=RL9AA/6,=RM80SP,=RM8A/4/M,=RM94AE,=RN9M/4,=RN9OI/3,=RO80RO, + =RP61XX(17)[19],=RP62X(17)[19],=RP63X(17)[19],=RP63XO(17)[19],=RP64X(17)[19],=RP65FPP(17)[30], + =RP8X(17)[30],=RQ80SP,=RT9T/3,=RU0ZW/6,=RU2FB/3,=RU2FB/3/P,=RU4SS/9(17)[30],=RU4WA/9(17)[30], + =RU9MU/3,=RV1CC/M,=RV9LM/3,=RV9XX/3,=RW0IM/1,=RW0QE/6,=RW2F/6,=RW9FF/3,=RW9W/3,=RW9W/4,=RX2FS/3, + =RX9TC/1,=RX9UL/1,=RZ9AWN/6,=UA0AK/3,=UA0FQ/6,=UA0KBG/3,=UA0KBG/6,=UA0KCX/3/P,=UA0KT/4,=UA0QNE/3, + =UA0QNU/3,=UA0QQJ/3,=UA0UV/6,=UA0XAK/3,=UA0XAK/6,=UA4NF/M,=UA9CCO/6,=UA9CDC/3,=UA9CTT/3, + =UA9FFS/1/MM,=UB8S/P,=UE23DKA,=UE6MAC/9(17),=UE95AE,=UE95E,=UE95ME,=UE96ME,=UE99PS, + =R900BL,=R900DM,=R900DV,=R9J/1,=RA2FN/1,=RA9KU/1,=RA9KU/1/M,=RA9MC/1,=RA9SGI/1,=RK9XWV/1,=RL1O, + =RM0L/1,=RM80DZ,=RN1M/P,=RN85AM,=RN85KN,=RT9T/1,=RU2FB/1,=RU9YT/1,=RU9YT/1/P,=RW1AI/ANT,=RW1AI/LH, + =RW8W/1,=RW9QA/1,=RX3AMI/1/LH,=UA1ADQ/ANT,=UA1BJ/ANT,=UA1JJ/ANT,=UA2FFX/1,=UA9B/1,=UA9KG/1, + =UA9KGH/1,=UA9KK/1,=UA9UDX/1,=UB9YUW/1,=UE21A,=UE21B,=UE21M,=UE22A,=UE25AC,=UE25AQ,=UE2AT/1, + =R0XAC/1,=R8FF/1,=R8XF/1,=R90LPU,=R9JNO/1,=RA0FU/1,=RA9FNV/1,=RD1A/M,=RN2FA/1,=RN9N/1,=RU9MU/1, + =RV0CA/1,=RV2FW/1,=RV9JD/1,=RX9TN/1,=UA0BDS/1,=UA0SIK/1,=UA1CDA/LH,=UA1CIO/LH,=UA9MA/1,=UA9MQR/1, + R1N[19],RA1N[19],RC1N[19],RD1N[19],RE1N[19],RF1N[19],RG1N[19],RJ1N[19],RK1N[19],RL1N[19],RM1N[19], + RN1N[19],RO1N[19],RQ1N[19],RT1N[19],RU1N[19],RV1N[19],RW1N[19],RX1N[19],RY1N[19],RZ1N[19],U1N[19], + UA1N[19],UB1N[19],UC1N[19],UD1N[19],UE1N[19],UF1N[19],UG1N[19],UH1N[19],UI1N[19],=R01DTV/1[19], + =R100RK[19],=R85KFF[19],=R90K[19],=RK75OP[19],=RN1NA/ANT[19],=RO25KL[19],=RO75RK[19],=RP72PT[19], + =RP72RK[19],=RP73PT[19],=RP73RK[19],=RP74PT[19],=RP74RK[19],=RP75PT[19],=RP75RK[19],=RP76OG[19], + =RP76PT[19],=RP76RK[19],=RV9JD/1/M[19],=UA9CSA/1[19],=UB5O/1[19], + R1O[19],RA1O[19],RC1O[19],RD1O[19],RE1O[19],RF1O[19],RG1O[19],RJ1O[19],RK1O[19],RL1O[19],RM1O[19], + RN1O[19],RO1O[19],RQ1O[19],RT1O[19],RU1O[19],RV1O[19],RW1O[19],RX1O[19],RY1O[19],RZ1O[19],U1O[19], + UA1O[19],UB1O[19],UC1O[19],UD1O[19],UE1O[19],UF1O[19],UG1O[19],UH1O[19],UI1O[19],=R0000O[19], + =R100FA[19],=R100K[19],=R20ARRS[19],=R25ILIM[19],=R5QA/1[19],=R9LI/1[19],=R9MCM/1[19], + =RA0NN/1[19],=RA9XA/1[19],=RA9XA/1/P[19],=RK0SE/1[19],=RM9X/1[19],=RO80KEDR[19],=RP72A[19], + =RP73A[19],=RP73AU[19],=RP74A[19],=RP74AU[19],=RP75A[19],=RP75AOS[19],=RP75AU[19],=RP75NK[19], + =RP75OM[19],=RP76A[19],=RP76AU[19],=UA1PAC/ANT[19],=UA9UAX/1[19],=UA9UAX/1/M[19],=UA9XK/1[19], + =UA9XMC/1[19],=UA9XRK/1[19],=UE25IK[19],=UE80AR[19],=UE80AR/M[19],=UE80AR/P[19],=UE90PR[19], + R1P[20],RA1P[20],RC1P[20],RD1P[20],RE1P[20],RF1P[20],RG1P[20],RJ1P[20],RK1P[20],RL1P[20],RM1P[20], + RN1P[20],RO1P[20],RQ1P[20],RT1P[20],RU1P[20],RV1P[20],RW1P[20],RX1P[20],RY1P[20],RZ1P[20],U1P[20], + UA1P[20],UB1P[20],UC1P[20],UD1P[20],UE1P[20],UF1P[20],UG1P[20],UH1P[20],UI1P[20],=R8XW/1[20], + =R9SAO/1[20],=R9XC/1[20],=R9XT/1[20],=RA2FW/1[20],=RA9JG/1[20],=RA9LI/1[20],=RC9XM/1[20], + =RK1PWA/ANT[20],=RL1P[20],=UA1PAC/1/ANT[20],=UA9FOJ/1[20],=UA9MRY/1[20],=UA9XRP/1[20], + =R1CF/M,=R9FM/1,=RA0BM/1,=RA0BM/1/P,=RA1QQ/LH,=RU9MX/1,=RW9XC/1,=UA1QV/ANT,=UA9XC/1,=UE80GS, + =R88EPC,=R95NRL,=RA9FBV/1,=RA9SC/1,=RA9XY/1,=RV2FW/1/M,=RZ0IWW/1,=UA9XF/1,=UE9WFF/1, + =R800ANP,=RA0ZD/1,=RP9X/1,=RP9XWM/1,=UE25WDW,=UE9XBW/1,=UF2F/1/M, + R1Z[19],RA1Z[19],RC1Z[19],RD1Z[19],RE1Z[19],RF1Z[19],RG1Z[19],RJ1Z[19],RK1Z[19],RL1Z[19],RM1Z[19], + RN1Z[19],RO1Z[19],RQ1Z[19],RT1Z[19],RU1Z[19],RV1Z[19],RW1Z[19],RX1Z[19],RY1Z[19],RZ1Z[19],U1Z[19], + UA1Z[19],UB1Z[19],UC1Z[19],UD1Z[19],UE1Z[19],UF1Z[19],UG1Z[19],UH1Z[19],UI1Z[19],=R25RRA[19], + =RA9CFH/1[19],=RA9CFH/1/P[19],=RK21Z[19],=RK3DZJ/1/LH[19],=RM9WN/1[19],=RP72MU[19],=RP73MU[19], + =RP73ZP[19],=RP74ZP[19],=RP75BFS[19],=RP75EP[19],=RP75PL[19],=RP76MU[19],=RP76PL[19],=RP76SFL[19], + =RP76SSF[19],=RP76ZZ[19],=RU1ZC/ANT[19],=RV1CC/P[19],=RW1ZQ/LH[19],=RY83HN[19],=UB1ZBD/N[19], + =R01DTV/3,=R0AI/3,=R85PAR,=R870B,=R870C,=R870K,=R870M,=R870O,=R9FM/3,=RA2AT,=RA2FDX/3,=RA3AL/M, + =RA9CO/3,=RA9USU/3,=RC85MP,=RL3AB/FF,=RT2F/3/M,=RT9K/3,=RW0LF/3,=RX9UL/3,=RX9WN/3,=RZ9UA/3, + =UA0KCX/3,=UA3AV/ANT,=UA8AA/3,=UA8AA/5,=UA9KHD/3,=UA9MA/3,=UA9MDU/3,=UA9MRX/3,=UA9QCP/3,=UA9UAX/3, + =UE24SU, + =R85AAL,=R85QMR,=R85WDW,=R8B,=R8FF/3,=R90DNF,=R90PAR,=R90WDW,=R99FSB,=R9YU/3,=RA0BY/3,=RA80KEDR, + =RA9KV/3,=RA9SB/3,=RA9XY/3,=RD0L/3,=RK3DSW/ANT,=RK3DWA/3/N,=RN9MD/3,=RT80KEDR,=RU0LM/3,=RU2FA/3, + =RU3HD/ANT,=RV0AO/3,=RV9LM/3/P,=RW0IM/3,=RW3DU/N,=RW9UEW/3,=RX9SN/3,=RZ9OL/3/M,=RZ9OL/3/P, + =RZ9SZ/3,=RZ9W/3,=UA0JAD/3,=UA0KCL/3,=UA0ZAZ/3,=UA9AJ/3/M,=UA9DD/3,=UA9HSI/3,=UA9ONJ/3,=UA9XGD/3, + =UA9XMC/3,=UE23DSA,=UE25FO,=UE95GA,=UE96WS, + =R80ORL,=UA0QGM/3,=UE80O,=UE80OL, + =R0CAF/3,=R3GO/FF,=RM0L/3,=RN3GL/FF,=RN3GW/FF,=RT5G/P/FF,=RW0IW/3,=UA3GM/ANT,=UE90FL, + =RA9KT/3,=RZ9SZ/3/M,=UA0FHC/3,=UF2F/3/M, + =R0IA/3,=R863LC,=R863LK,=R863LX,=R875R,=R9XZ/3,=RG80KEDR,=RL80KEDR,=RN0CF/3,=RN2FA/3,=RU9QRP/3, + =RZ90W/3,=UA3LMR/P,=UA9JFM/3,=UA9XZ/3,=UE80G,=UE80V,=UE80YG, + =RK3MXT/FF,=RV9AZ/3,=UA0AD/3, + =R870T,=RT90PK,=RU0ZW/3,=RW0UM/3,=RW9JV/3, + =R0AI/M,=R0AIB/3,=R89AFG,=RA0CCV/3,=RA0QA/3,=RC9YA/3/P,=RM8X/3,=RV9LC/3,=UA0QJE/3,=UA0QQO/3, + =UA9CGL/3,=UA9JLY/3,=UA9XLE/3,=UB0AJJ/3,=UC0LAF/3,=UE25AFG,=UE25R,=UE27AFG,=UE28AFG,=UE96SN, + =R80RTL,=R90IARU,=R9CZ/3,=RU80TO,=RZ9HK/3/P, + =R920RZ,=R925RZ,=R95DOD,=RA0QQ/3,=UA0KBA/3,=UE80S,=UE85NKN,=UE85WDW, + =R3TT/FF,=R8TA/4/P,=R8TR/3,=R90NOR,=R9KW/3,=R9KW/4,=R9PA/4,=RA95FL,=RA9AP/3,=RA9CKQ/4,=RA9KW/3, + =RA9KW/3/M,=RA9ST/3/P,=RG9A/3/P,=RM9T/4/P,=RM9T/P,=RN0CT/4,=RT9S/3,=RT9S/3/P,=RT9S/4,=RT9S/P, + =RU95FL,=RU9LA/4,=RV9FQ/3,=RV9FQ/3/M,=RV9WB/4,=RV9WLE/3/P,=RV9WZ/3,=RW9KW/3,=RW9WA/3,=RX9SN/P, + =UA0ADX/3,=UA0DM/4,=UA0S/4,=UA0SC/4,=UA9APA/3/P,=UA9CTT/4,=UA9PM/4,=UA9SSR/3,=UE200TARS,=UE25TF, + =UE9FDA/3,=UE9FDA/3/M,=UE9WDA/3,=UI8W/3/P, + =R5VAJ/N,=R850G,=R850PN,=RU0BW/3,=RV80KEDR,=RX9TL/3,=UA0FM/3,=UA3A/P, + =R110A/P,=R80PVB,=RK3AW/M, + =R8XF/3,=RA9XF/3,=RC80KEDR,=RK0BWW/3,=RN80KEDR,=RW9XC/3/M,=RX3XX/N,=UA0KBA/3/P,=UA9SIV/3, + =UE0ZOO/3, + =R85WTA,=R8FF/3/P,=R90WDWR,=R98KPM,=R99KPM,=RA3YV/ANT,=RK0UT/3,=RW0LX/3,=UA3YH/ANT,=UA9KZ/3, + =UB8JAF/3,=UE91L,=UE95K,=UE95RA, + =R3ZK/FF,=RA3ZZ/ANT,=RA9AK/3,=RA9KD/3,=RU3ZK/FF,=RW0BG/3,=UA0QBC/3, + =R89DRA,=RA07DR,=RA9DF/4/P,=RA9ODR/4/M,=RC4AF/FF,=RN4ACA/FF,=RV9CX/6/M,=UA4ASE/FF,=UA4ATL/FF, + =UA8WAA/6,=UA9FGR/4,=UE00S,=UE00S/P,=UE09VG,=UE80RWW, + =R4CDX/FF,=R8FF/4,=R8FR/4/M,=RA9KO/4,=RL96WS,=RL97WS,=RU80KEDR,=RU80KEDR/P,=RU9SO/4/M,=RV4CC/FF, + =RW0UZ/4,=RW9AW/4/M,=RZ0SB/4,=UA0KAT/4,=UA8WAA/4,=UA9AGR/4/M,=UA9JPX/4,=UA9OC/4,=UE23DZO,=UE95MS, + =UE95WS,=UE98WS,=UE99PW, + =R8CW/4,=R9CMA/4,=R9JBN/4, + R4H[30],R4I[30],RA4H[30],RA4I[30],RC4H[30],RC4I[30],RD4H[30],RD4I[30],RE4H[30],RE4I[30],RF4H[30], + RF4I[30],RG4H[30],RG4I[30],RJ4H[30],RJ4I[30],RK4H[30],RK4I[30],RL4H[30],RL4I[30],RM4H[30], + RM4I[30],RN4H[30],RN4I[30],RO4H[30],RO4I[30],RQ4H[30],RQ4I[30],RT4H[30],RT4I[30],RU4H[30], + RU4I[30],RV4H[30],RV4I[30],RW4H[30],RW4I[30],RX4H[30],RX4I[30],RY4H[30],RY4I[30],RZ4H[30], + RZ4I[30],U4H[30],U4I[30],UA4H[30],UA4I[30],UB4H[30],UB4I[30],UC4H[30],UC4I[30],UD4H[30],UD4I[30], + UE4H[30],UE4I[30],UF4H[30],UF4I[30],UG4H[30],UG4I[30],UH4H[30],UH4I[30],UI4H[30],UI4I[30], + =R170SG[30],=R20SAM[30],=R280TLT[30],=R3ARS/4[30],=R4HAT[29],=R4HC[29],=R4HCE[29],=R4HCZ[29], + =R4HD[29],=R4HDC[29],=R4HDR[29],=R4HL[29],=R4IC[29],=R4ID[29],=R4II[29],=R4IK[29],=R4IM[29], + =R4IN[29],=R4IO[29],=R4IT[29],=R50VAZ[30],=R9DA/4[30],=RA4HL[29],=RA9FAA/4/M[30],=RA9SC/4[30], + =RA9SC/4/P[30],=RC18SA[30],=RC20HZ[30],=RC4HT[29],=RC4I[29],=RC9YA/4/M[30],=RJ4I[29],=RK4HM[29], + =RM4I[29],=RN4HFJ[29],=RN4HIF[29],=RP72AG[30],=RP72I[30],=RP72MF[30],=RP72WO[30],=RP73DD[30], + =RP73I[30],=RP73PM[30],=RP74DD[30],=RP74I[30],=RP75AG[30],=RP75DD[30],=RP75FD[30],=RP75I[30], + =RP75SN[30],=RP75ZS[30],=RP76I[30],=RP76VN[30],=RP76ZS[30],=RT9K/4[30],=RU4HD[29],=RU4HP[29], + =RU4I[29],=RV9JD/4/M[30],=RW4HM[29],=RW4HTK[29],=RW4HW[29],=RW4HZ[29],=RW9SW/4[30],=RW9TP/4[30], + =RW9WJ/4[30],=RW9WJ/4/P[30],=RW9WJ/P[30],=RZ4HWF/LH[30],=RZ4HZW/FF[30],=RZ9WU/4/M[30], + =UA0KAO/4[30],=UA0QJA/4[30],=UA4H[29],=UA4HBM[29],=UA4HGL[29],=UA4HIP[29],=UA4HIP/M[30], + =UA4HRZ[29],=UA4HY[29],=UA9JGX/4[30],=UA9LAO/4[30],=UA9SQG/4/P[30],=UA9SY/4[30],=UC4I[29], + =UI4I[29], + =R01DTV/4,=R9XC/4,=RA9XAF/4,=UA4HIP/4,=UA9JFE/4, + =R8XF/4,=RA4NCC[30],=RA9FR/4/P,=RA9XSM/4,=RD9CX/4,=RD9CX/4/P,=RU0LM/4,=RW9XC/4/M,=UA4NE/M, + =UA4NF[30],=UA9APA/4/P,=UA9FIT/4,=UA9XI/4,=UE9FDA/4,=UE9FDA/4/M,=UE9GDA/4, + =R95PW,=R9WI/4/P,=RA9CKM/4/M,=RA9FR/4/M,=RJ4P[30],=RK4P[30],=RK4PK[30],=RM4P[30],=RM4R[30], + =RM8W/4/M,=RN9WWW/4,=RN9WWW/4/M,=RT05RO,=RV9FQ/4/M,=RV9WKI/4/M,=RV9WKI/4/P,=RV9WMZ/4/M,=RV9WZ/4, + =RW9TP/4/P,=RW9WA/4,=RW9WA/4/M,=RZ9WM/4,=UA2FM/4,=UA3AKO/4,=UA4PN[30],=UA4RF[30],=UA4RW[30], + =UA9AJ/4/M,=UA9JFN/4/M,=UA9JNQ/4,=UA9SG/4,=UB5O/M,=UE96MP,=UE9WDA/4,=UE9WDA/4/M, + =R8UT/4/P,=R9JBF/4,=RX9WN/4, + =RQ0C/4,=RZ5D/4,=UA9XX/4,=UE9WFF/4, + R4W[30],RA4W[30],RC4W[30],RD4W[30],RE4W[30],RF4W[30],RG4W[30],RJ4W[30],RK4W[30],RL4W[30],RM4W[30], + RN4W[30],RO4W[30],RQ4W[30],RT4W[30],RU4W[30],RV4W[30],RW4W[30],RX4W[30],RY4W[30],RZ4W[30],U4W[30], + UA4W[30],UB4W[30],UC4W[30],UD4W[30],UE4W[30],UF4W[30],UG4W[30],UH4W[30],UI4W[30],=R0CM/4[30], + =R100MTK[30],=R100UD[30],=R9GM/4[30],=R9UT/4[30],=RA9FDR/4/P[30],=RA9KV/4/M[30],=RA9WU/4[30], + =RA9WU/4/M[30],=RA9WU/4/P[30],=RP72IZ[30],=RP73IZ[30],=RP74IZ[30],=RP75IZ[30],=RP76IZ[30], + =RT20NY[30],=RT21NY[30],=RT30DX[30],=RT60YG[30],=RT78ML[30],=RW9FWB/4[30],=RW9FWR/4[30], + =RW9FWR/4/M[30],=RX9FW/4[30],=UA9UAX/4/M[30], + =RT9T/4,=RV9MD/4,=UA4PCM/M,=UE04YCS,=UE85AGN,=UE90AGN, + =R01DTV,=R01DTV/7,=R0IT/6,=R80TV,=R8XW/6,=R9JO/6,=R9KD/6,=R9OM/6,=R9WGM/6/M,=RA0APW/6,=RA0FW/6, + =RA0LIF/6,=RA0LLW/6,=RA0QR/6,=RA9ODR/6,=RA9ODR/6/M,=RA9SAS/6,=RA9UWD/6,=RA9WW/6,=RD9CX/6, + =RD9CX/6/P,=RK6AH/LH,=RK75KH,=RK75MP,=RK9JA/6,=RM8W/6,=RN0CF/6,=RN0JT/6,=RQ0C/6,=RT9K/6,=RT9K/6/P, + =RT9K/6/QRP,=RU2FB/6,=RU9MX/6,=RU9QRP/6/M,=RU9QRP/6/P,=RU9SO/6,=RV9FQ/6,=RW0LIF/6,=RW0LIF/6/LH, + =RW6AWW/LH,=RW9JZ/6,=RW9WA/6,=RX6AA/ANT,=RX6AAP/ANT,=RX9TX/6,=RZ9HG/6,=RZ9HT/6,=RZ9UF/6,=RZ9UZV/6, + =UA0AGE/6,=UA0IT/6,=UA0JL/6,=UA0LQQ/6/P,=UA0SEP/6,=UA2FT/6,=UA6ADC/N,=UA9COO/6,=UA9CTT/6, + =UA9JON/6,=UA9JPX/6,=UA9KB/6,=UA9KJ/6,=UA9KW/6,=UA9MQR/6,=UA9UAX/6,=UA9VR/6,=UA9XC/6,=UA9XCI/6, + =UE9WDA/6,=UE9WFF/6,=UF0W/6, + =RA6EE/FF,=RN7G/FF,=UA0LEC/6,=UA9KAS/6,=UA9KAS/6/P, + =R9XV/6,=RA0ZG/6,=RA9CHS/6,=RA9CHS/7,=RK7G/FF,=RT9K/7,=RU9CK/7,=RU9ZA/7,=RZ7G/FF,=RZ9ON/6, + =UA0ZDA/6,=UA0ZS/6,=UA6HBO/N,=UA6HBO/ST30,=UA6IC/6/FF,=UA9CE/6,=UA9UAX/7/M,=UE80HS, + =RM8A/6/M,=UA6IC/FF, + =RU2FB/6/P,=UA9UAX/7, + =R6LCA/J,=R8WC/6,=R8WC/6/P,=RA20NY,=RA21NY,=RA98AE,=RU97AE,=RV9CMT/6,=RV9DC/6/P,=RV9LC/6, + =RW9XC/6/M,=RX9KT/6,=UA0QBR/6,=UA0ZED/6,=UA6LP/P/LH,=UA6LV/ANT,=UA6MM/LH,=UE20DS,=UE28DX,=UE29DX, + =UE92L, + =RV0ANH/6,=RV0APR/6,=RW0AF/6, + =R8FF/6,=R9DA/6,=R9MAV/6,=RA9DF/6/M,=RA9DF/6/P,=RU9CK/6/M,=RU9CK/6/P,=RV9CX/6/P,=UA9CES/6, + =UA9FGR/6,=UA9WQK/6, + =R7AB/P,=RU9CK/7/M,=RU9CK/7/P,=RV9CX/7/P,=UA9JFN/6/M, + =RT9K/7/P,=RZ7G/6/FF, + =R01DTV/6,=RV9AB/6, + =R9FAZ/6/M,=R9MJ/6,=R9OM/5/P,=R9XT/6,=RA9KD/6,=RA9WU/6,=RC8C/6,=RN9N/6,=RT9T/6,=RT9T/6/M,=RU2FB/5, + =RU9WW/5/M,=RW9AW/5,=UA0LLM/5,=UA8WAA/5,=UA9CDC/6,=UA9UAX/5,=UE2KR,=UE98PW, + =R8AEU/6,=R9MJ/6/M,=RN9N/6/M,=UA0ZL/6,=UB8ADI/5,=UB8ADI/6,=UE2SE, + R8F(17)[30],R8G(17)[30],R9F(17)[30],R9G(17)[30],RA8F(17)[30],RA8G(17)[30],RA9F(17)[30], + RA9G(17)[30],RC8F(17)[30],RC8G(17)[30],RC9F(17)[30],RC9G(17)[30],RD8F(17)[30],RD8G(17)[30], + RD9F(17)[30],RD9G(17)[30],RE8F(17)[30],RE8G(17)[30],RE9F(17)[30],RE9G(17)[30],RF8F(17)[30], + RF8G(17)[30],RF9F(17)[30],RF9G(17)[30],RG8F(17)[30],RG8G(17)[30],RG9F(17)[30],RG9G(17)[30], + RJ8F(17)[30],RJ8G(17)[30],RJ9F(17)[30],RJ9G(17)[30],RK8F(17)[30],RK8G(17)[30],RK9F(17)[30], + RK9G(17)[30],RL8F(17)[30],RL8G(17)[30],RL9F(17)[30],RL9G(17)[30],RM8F(17)[30],RM8G(17)[30], + RM9F(17)[30],RM9G(17)[30],RN8F(17)[30],RN8G(17)[30],RN9F(17)[30],RN9G(17)[30],RO8F(17)[30], + RO8G(17)[30],RO9F(17)[30],RO9G(17)[30],RQ8F(17)[30],RQ8G(17)[30],RQ9F(17)[30],RQ9G(17)[30], + RT8F(17)[30],RT8G(17)[30],RT9F(17)[30],RT9G(17)[30],RU8F(17)[30],RU8G(17)[30],RU9F(17)[30], + RU9G(17)[30],RV8F(17)[30],RV8G(17)[30],RV9F(17)[30],RV9G(17)[30],RW8F(17)[30],RW8G(17)[30], + RW9F(17)[30],RW9G(17)[30],RX8F(17)[30],RX8G(17)[30],RX9F(17)[30],RX9G(17)[30],RY8F(17)[30], + RY8G(17)[30],RY9F(17)[30],RY9G(17)[30],RZ8F(17)[30],RZ8G(17)[30],RZ9F(17)[30],RZ9G(17)[30], + U8F(17)[30],U8G(17)[30],U9F(17)[30],U9G(17)[30],UA8F(17)[30],UA8G(17)[30],UA9F(17)[30], + UA9G(17)[30],UB8F(17)[30],UB8G(17)[30],UB9F(17)[30],UB9G(17)[30],UC8F(17)[30],UC8G(17)[30], + UC9F(17)[30],UC9G(17)[30],UD8F(17)[30],UD8G(17)[30],UD9F(17)[30],UD9G(17)[30],UE8F(17)[30], + UE8G(17)[30],UE9F(17)[30],UE9G(17)[30],UF8F(17)[30],UF8G(17)[30],UF9F(17)[30],UF9G(17)[30], + UG8F(17)[30],UG8G(17)[30],UG9F(17)[30],UG9G(17)[30],UH8F(17)[30],UH8G(17)[30],UH9F(17)[30], + UH9G(17)[30],UI8F(17)[30],UI8G(17)[30],UI9F(17)[30],UI9G(17)[30],=R120RP(17)[30],=R155PM(17)[30], + =R160PM(17)[30],=R18PER(17)[30],=R2011UFO(17)[30],=R2011UFO/M(17)[30],=R2011UFO/P(17)[30], + =R2014WOG(17)[30],=R20PRM(17)[30],=R290PM(17)[30],=R2AG/9(17)[30],=R34CZF(17)[30], + =R6DAB/9(17)[30],=R8CZ/4(17)[30],=R8CZ/4/M(17)[30],=R8CZ/M(17)[30],=R8FF/M(17)[30], + =R8FF/P(17)[30],=R95FR(17)[30],=R9CZ/4(17)[30],=R9CZ/4/M(17)[30],=R9GM/P(17)[30], + =R9KC/4/M(17)[30],=R9KC/8/M(17)[30],=RA27FM(17)[30],=RA9XAI/4(17)[30],=RC20FM(17)[30], + =RD4M/9(17)[30],=RG50P/M(17)[30],=RK3AW/4(17)[30],=RN9N/4(17)[30],=RP70PK(17)[30],=RP9FKU(17)[30], + =RP9FTK(17)[30],=RQ9F/M(17)[30],=RU27FQ(17)[30],=RU27FW(17)[30],=RU4W/9(17)[30],=RV22PM(17)[30], + =RX9TX/9(17)[30],=RZ16FM(17)[30],=RZ9WM/9(17)[30],=UA1ZQO/9(17)[30],=UA3FQ/4(17)[30], + =UA3FQ/4/P(17)[30],=UA3FQ/P(17)[30],=UA4NF/4/M(17)[30],=UA4WA/9(17)[30],=UA5B/4(17)[30], + =UA9CGL/4/M(17)[30],=UA9CGL/9/M(17)[30],=UA9CUA/4/M(17)[30],=UA9UAX/4(17)[30],=UE16SA(17)[30], + =UE55PM(17)[30], + =RP75TK(17)[30],=RP76TK(17)[30],=RW3TN/9(17)[30],=UE10SK(17)[30], + R1I(17)[20],R8X(17)[20],R9X(17)[20],RA1I(17)[20],RA8X(17)[20],RA9X(17)[20],RC1I(17)[20], + RC8X(17)[20],RC9X(17)[20],RD1I(17)[20],RD8X(17)[20],RD9X(17)[20],RE1I(17)[20],RE8X(17)[20], + RE9X(17)[20],RF1I(17)[20],RF8X(17)[20],RF9X(17)[20],RG1I(17)[20],RG8X(17)[20],RG9X(17)[20], + RI8X(17)[20],RI9X(17)[20],RJ1I(17)[20],RJ8X(17)[20],RJ9X(17)[20],RK1I(17)[20],RK8X(17)[20], + RK9X(17)[20],RL1I(17)[20],RL8X(17)[20],RL9X(17)[20],RM1I(17)[20],RM8X(17)[20],RM9X(17)[20], + RN1I(17)[20],RN8X(17)[20],RN9X(17)[20],RO1I(17)[20],RO8X(17)[20],RO9X(17)[20],RQ1I(17)[20], + RQ8X(17)[20],RQ9X(17)[20],RT1I(17)[20],RT8X(17)[20],RT9X(17)[20],RU1I(17)[20],RU8X(17)[20], + RU9X(17)[20],RV1I(17)[20],RV8X(17)[20],RV9X(17)[20],RW1I(17)[20],RW8X(17)[20],RW9X(17)[20], + RX1I(17)[20],RX8X(17)[20],RX9X(17)[20],RY1I(17)[20],RY8X(17)[20],RY9X(17)[20],RZ1I(17)[20], + RZ8X(17)[20],RZ9X(17)[20],U1I(17)[20],U8X(17)[20],U9X(17)[20],UA1I(17)[20],UA8X(17)[20], + UA9X(17)[20],UB1I(17)[20],UB8X(17)[20],UB9X(17)[20],UC1I(17)[20],UC8X(17)[20],UC9X(17)[20], + UD1I(17)[20],UD8X(17)[20],UD9X(17)[20],UE1I(17)[20],UE8X(17)[20],UE9X(17)[20],UF1I(17)[20], + UF8X(17)[20],UF9X(17)[20],UG1I(17)[20],UG8X(17)[20],UG9X(17)[20],UH1I(17)[20],UH8X(17)[20], + UH9X(17)[20],UI1I(17)[20],UI8X(17)[20],UI9X(17)[20],=R100AP(17)[20],=R100KOMI(17)[20], + =R120RK(17)[20],=R16NOR(17)[20],=R18ISL(17)[20],=R2014I(17)[20],=R20SZO(17)[20],=R240S(17)[20], + =R35MWC(17)[20],=R3CG/1(17)[20],=R3RRC/9(17)[20],=R41WCMB(17)[20],=R5QQ/1(17)[20], + =R6DGL/9/M(17)[20],=R6DLU/1(17)[20],=R70SRC(17)[20],=R7BA/1(17)[20],=R7BA/9(17)[20], + =R7BA/9/M(17)[20],=R8MB/1(17)[20],=R8MB/1/P(17)[20],=R9/UR7IMG(17)[20],=R95KOMI(17)[20], + =R9KD/9(17)[20],=R9XAK/1/P(17)[20],=RA/DK5JI(17)[20],=RA/UR5MKH(17)[20],=RA1WS/1(17)[20], + =RA22KO(17)[20],=RA22XA(17)[20],=RA22XF(17)[20],=RA22XU(17)[20],=RA3AMG/9/M(17)[20], + =RA3OM/9(17)[20],=RA3X/1(17)[20],=RA4NH/9(17)[20],=RA4NV/9(17)[20],=RA6ACI/9(17)[20], + =RD4CBQ/9(17)[20],=RK1OWZ/9(17)[20],=RK1OWZ/9/M(17)[20],=RK30DR(17)[20],=RK6K/9(17)[20], + =RK90DR(17)[20],=RN22OG(17)[20],=RN22OV(17)[20],=RN4ACZ/9(17)[20],=RO25KO(17)[20],=RP67KR(17)[20], + =RP68KR(17)[20],=RP70KW(17)[20],=RP71KW(17)[20],=RP72X(17)[20],=RP73X(17)[20],=RP74X(17)[20], + =RP75X(17)[20],=RP76X(17)[20],=RT73LF(17)[20],=RV1CC/1(17)[20],=RV3UI/9(17)[20],=RW1QN/9(17)[20], + =RW1QN/9/M(17)[20],=RW1QN/9/P(17)[20],=RW4NJ/9/M(17)[20],=RY110RAEM(17)[20],=UA1OOX/9(17)[20], + =UA1QV/9(17)[20],=UA4WP/9/M(17)[20],=UA6LTO/9(17)[20],=UB1OAD/1/P(17)[20],=UB1OAD/9/P(17)[20], + =UB5O/1/M(17)[20],=UE16ST(17)[20],=UE1RDA/9(17)[20],=UE85DRK(17)[20],=UE90K(17)[20]; +Kaliningrad: 15: 29: EU: 54.72: -20.52: -3.0: UA2: + R2F,R2K,RA2,RC2F,RC2K,RD2F,RD2K,RE2F,RE2K,RF2F,RF2K,RG2F,RG2K,RJ2F,RJ2K,RK2F,RK2K,RK75,RL2F,RL2K, + RM2F,RM2K,RN2F,RN2K,RO2F,RO2K,RQ2F,RQ2K,RT2F,RT2K,RU2F,RU2K,RV2F,RV2K,RW2F,RW2K,RX2F,RX2K,RY2F, + RY2K,RZ2F,RZ2K,U2F,U2K,UA2,UB2,UC2,UD2,UE2,UF2,UG2,UH2,UI2,=R01DTV/2,=R10RLHA/2,=R10RTRS/2, + =R1255F,=R1336FO,=R14CWC/2,=R15CWC/2,=R15CWC/2/QRP,=R18SRB,=R1NW/2,=R1QAP/2,=R2/DK2AI,=R2/DL1YMK, + =R2/N6TCZ,=R2/R6AF,=R2/UA6LV,=R2/UR0MC,=R21GGGR,=R22GGGR,=R22GGR,=R25ARCK/2,=R2MWO,=R310A/2, + =R3SRR/2,=R3XA/2,=R5K/2,=R5QA/2,=R60A,=R680FBO,=R6AF/2,=R777AN,=R7LV/2,=R900BL/2,=RA/DL6KV, + =RA/EU1FY/P,=RA/SP7VC,=RA2FDX/FF,=RA2FN/RP,=RA2FO/N,=RA3ATX/2,=RA3XM/2,=RA4LW/2,=RC18KA,=RD22FU, + =RD3FG/2,=RJ22DX,=RK3QS/2,=RM9I/2,=RM9IX/2,=RN3GM/2,=RP2F,=RP2K,=RP70KB,=RP70KG,=RP70MW,=RP70WB, + =RP75GC,=RP75IGS,=RP75KB,=RP75MW,=RP75STP,=RP76GC,=RP76IGS,=RP76KB,=RP76MW,=RT9T/2,=RU3FS/2, + =RU5A/2,=RU5D/2,=RV21NY,=RV30DX,=RV3FF/2,=RV3MA/2,=RV3UK/2,=RV60YG,=RV9WZ/2,=RW9QA/2,=RY1AAA/2, + =RZ3FA/2,=RZ6HB/2,=UA0SIK/2,=UA1AAE/2,=UA1AFT/2,=UA2DC/RP,=UA2FM/MM(13),=UA3DJG/2,=UA4RC/2, + =UA4WHX/2,=UA9UAX/2,=UB5O/2,=UB5O/2/M,=UB9KAA/2,=UE08F,=UE1RLH/2,=UE3QRP/2,=UE6MAC/2,=UF1M/2; +Asiatic Russia: 17: 30: AS: 55.88: -84.08: -7.0: UA9: + R0(19)[33],R8,R9,RA0(19)[33],RA8,RA9,RC0(19)[33],RC8,RC9,RD0(19)[33],RD8,RD9,RE0(19)[33],RE8,RE9, + RF0(19)[33],RF8,RF9,RG0(19)[33],RG8,RG9,RI0(19)[33],RI8,RI9,RJ0(19)[33],RJ8,RJ9,RK0(19)[33],RK8, + RK9,RL0(19)[33],RL8,RL9,RM0(19)[33],RM8,RM9,RN0(19)[33],RN8,RN9,RO0(19)[33],RO8,RO9,RQ0(19)[33], + RQ8,RQ9,RT0(19)[33],RT8,RT9,RU0(19)[33],RU8,RU9,RV0(19)[33],RV8,RV9,RW0(19)[33],RW8,RW9, + RX0(19)[33],RX8,RX9,RY0(19)[33],RY8,RY9,RZ0(19)[33],RZ8,RZ9,U0(19)[33],U8,U9,UA0(19)[33],UA8,UA9, + UB0(19)[33],UB8,UB9,UC0(19)[33],UC8,UC9,UD0(19)[33],UD8,UD9,UE0(19)[33],UE8,UE9,UF0(19)[33],UF8, + UF9,UG0(19)[33],UG8,UG9,UH0(19)[33],UH8,UH9,UI0(19)[33],UI8,UI9,=R0FK(40)[75],=R0PA(40)[75], + =R0POL(40)[75],=R0UPOL(40)[75],=R14CWC/0(19),=R16KAZ(18),=R18KDR/0(19),=R18KDR/8,=R2AKM/0(19), + =R34SP(40)[75],=R35NP,=R4CDO/9/M(18),=R8MZ/9(18),=RA0CCK/8,=RA1WS/9,=RA3TND/0(19),=RA3TND/9(18), + =RA4AAJ/9(18),=RD17CW(19),=RD1AL/0(40)[75],=RD3ARX/0/P(19),=RF1A/9(18),=RI18POL(40)[75],=RJ17WG, + =RK3Q/8,=RL19WF,=RM17NY,=RM19WF(18),=RN17CW,=RO19WF(19),=RQ17CW(18),=RQ17WG,=RQ4D/9(18), + =RU17NY(18),=RV3PZ/9,=RW1AI/0(19),=RW55YG,=RX17WG(19),=RX55YG(18),=RX80SP(18),=RY1AAB/0/M(19), + =RY80SP(19),=RZ6A/9,=RZ9YI/9,=UA0ZDA/MM(29),=UA3DND/8,=UA3TT/8,=UE18M,=UE18U(18),=UE18Z(19), + =R100RG,=R120RG,=R2014Y,=R2015TL,=R20UFO,=R22SKE,=R280A,=R280B,=R3HD/9,=R3RRC/8,=R55TV,=R6RA/9, + =R70PW,=R70PW/P,=R9SRR,=RA0QK/8,=RA1AIP/9/P,=RA1AR/9,=RA1QR/9,=RA3WJ/9,=RA3XBN/9,=RA3ZM/8, + =RA4FSC/9,=RA4HGN/9,=RA9SC/9,=RA9WJV/8/P,=RC20AB,=RC20AC,=RD3BN/9,=RD4CAQ/9,=RG110RAEM,=RJ17CW, + =RK9SZZ/9,=RL5G/8,=RL9AA/P,=RM30DX,=RM60YG,=RN20NY,=RN21NY,=RN4WA/9,=RN9O/8,=RP67TG,=RP68MZ, + =RP70AZ,=RP70PM,=RP70TG,=RP71AZ,=RP71TG,=RP72AZ,=RP72MS,=RP72TG,=RP73AZ,=RP73TG,=RP73U,=RP74AZ, + =RP74TG,=RP74U,=RP75AZ,=RP75IE,=RP75MMK,=RP75SU,=RP75TG,=RP75U,=RP76AZ,=RP76MMK,=RP76MVI,=RP76TG, + =RP76U,=RQ4D/8,=RT60RT,=RT73AB,=RU22AZ,=RV1AQ/9,=RV1CC/8,=RV1CC/9,=RV3BA/9,=RV9WB/9/M,=RV9WMZ/9/P, + =RV9WMZ/P,=RX3RC/9,=RX9WN/9/M,=RX9WT/8,=RZ0OO/9,=RZ6DR/9/M,=RZ9OO/9/M,=UA0MF/9,=UA3AKO/8,=UA4RC/9, + =UA6A/9,=UA6CW/9,=UA6YGY/8,=UA6YGY/9,=UA8WAA/9,=UA8WAA/9/P,=UA8WAA/M,=UA9SG/9,=UA9TO/9/M, + =UA9WMN/9/P,=UE45AWT,=UE70AAA,=UE9WDA/9, + =R01DTV/8,=R100RGA,=R105WWS,=R14CWC/8,=R14CWC/9,=R150DMP,=R155AP,=R15CWC/8,=R15CWC/8/QRP,=R160DMP, + =R16SVK,=R170GS/8,=R2015BP,=R2015R,=R2016DR,=R20EKB,=R22SKJ,=R27EKB,=R30ZF,=R35CZF,=R375I, + =R44YETI/8,=R4WAB/9/P,=R55EPC,=R55EPC/P,=R6UAE/9,=R70NIK,=R7LZ/8,=R8FF/8,=R9GM/8,=R9GM/8/M, + =R9WCJ/8,=RA/DL6XK,=RA/US5ETV,=RA0BA/8,=RA0BA/9,=RA27AA,=RA27EK,=RA36GS,=RA36ZF,=RA4YW/9, + =RA4YW/9/M,=RA9FW/9,=RC18EK,=RD0B/8,=RK3AW/8,=RK9AD/9/M,=RK9DR/N,=RL20NY,=RL21NY,=RL4R/8,=RL60YG, + =RM0B/9,=RM19NY,=RN16CW,=RN3QBG/9,=RP68DT,=RP68RG,=RP68TG,=RP68TK,=RP69GR,=RP70DT,=RP70G,=RP70GB, + =RP70GR,=RP70MA,=RP70SA,=RP70UH,=RP71DT,=RP71GA,=RP71GA/M,=RP71GB,=RP71GR,=RP71LT,=RP71MO,=RP71SA, + =RP72DT,=RP72FI,=RP72GB,=RP72GR,=RP72IM,=RP72KB,=RP72SA,=RP73DT,=RP73GB,=RP73GR,=RP73IM,=RP73SA, + =RP74DT,=RP74GB,=RP74GR,=RP74IM,=RP75DT,=RP75GB,=RP75IM,=RP75MF,=RP75MLI,=RP75RGA,=RP75TT,=RP75UR, + =RP76DT,=RP76GB,=RP76OIA,=RP76PAW,=RP76RGA,=RP76UR,=RT4C/8,=RT4W/9,=RT73BR,=RT73EB,=RT73FL, + =RT73HE,=RT73KB,=RT73SK,=RU22CR,=RU5D/8,=RU5D/9,=RU9CK/M,=RV6LGY/9,=RV6LGY/9/M,=RV6LGY/9/P, + =RV6MD/9,=RV9WB/8,=RW4NX/9,=RW9C[20],=RX0SD/9,=RX3Q/8,=RX3Q/9,=RX9UL/9,=RY9C/P,=RZ1CWC/8,=RZ37ZF, + =RZ38ZF,=RZ39ZF,=UA0BA/8,=UA3FQ/8,=UA3IHJ/8,=UA4WHX/9,=UA8WAA/8,=UA9CGL/M,=UA9MA/M,=UA9MW/9, + =UA9UAX/8,=UA9UAX/8/M,=UB5O/8,=UE16SR,=UE25F,=UE40CZF,=UE4NFF/9,=UE56S,=UE64RWA,=UE70SL,=UE75DT, + R8H(18)[31],R8I(18)[31],R9H(18)[31],R9I(18)[31],RA8H(18)[31],RA8I(18)[31],RA9H(18)[31], + RA9I(18)[31],RC8H(18)[31],RC8I(18)[31],RC9H(18)[31],RC9I(18)[31],RD8H(18)[31],RD8I(18)[31], + RD9H(18)[31],RD9I(18)[31],RE8H(18)[31],RE8I(18)[31],RE9H(18)[31],RE9I(18)[31],RF8H(18)[31], + RF8I(18)[31],RF9H(18)[31],RF9I(18)[31],RG8H(18)[31],RG8I(18)[31],RG9H(18)[31],RG9I(18)[31], + RJ8H(18)[31],RJ8I(18)[31],RJ9H(18)[31],RJ9I(18)[31],RK8H(18)[31],RK8I(18)[31],RK9H(18)[31], + RK9I(18)[31],RL8H(18)[31],RL8I(18)[31],RL9H(18)[31],RL9I(18)[31],RM8H(18)[31],RM8I(18)[31], + RM9H(18)[31],RM9I(18)[31],RN8H(18)[31],RN8I(18)[31],RN9H(18)[31],RN9I(18)[31],RO8H(18)[31], + RO8I(18)[31],RO9H(18)[31],RO9I(18)[31],RQ8H(18)[31],RQ8I(18)[31],RQ9H(18)[31],RQ9I(18)[31], + RT8H(18)[31],RT8I(18)[31],RT9H(18)[31],RT9I(18)[31],RU8H(18)[31],RU8I(18)[31],RU9H(18)[31], + RU9I(18)[31],RV8H(18)[31],RV8I(18)[31],RV9H(18)[31],RV9I(18)[31],RW8H(18)[31],RW8I(18)[31], + RW9H(18)[31],RW9I(18)[31],RX8H(18)[31],RX8I(18)[31],RX9H(18)[31],RX9I(18)[31],RY8H(18)[31], + RY8I(18)[31],RY9H(18)[31],RY9I(18)[31],RZ8H(18)[31],RZ8I(18)[31],RZ9H(18)[31],RZ9I(18)[31], + U8H(18)[31],U8I(18)[31],U9H(18)[31],U9I(18)[31],UA8H(18)[31],UA8I(18)[31],UA9H(18)[31], + UA9I(18)[31],UB8H(18)[31],UB8I(18)[31],UB9H(18)[31],UB9I(18)[31],UC8H(18)[31],UC8I(18)[31], + UC9H(18)[31],UC9I(18)[31],UD8H(18)[31],UD8I(18)[31],UD9H(18)[31],UD9I(18)[31],UE8H(18)[31], + UE8I(18)[31],UE9H(18)[31],UE9I(18)[31],UF8H(18)[31],UF8I(18)[31],UF9H(18)[31],UF9I(18)[31], + UG8H(18)[31],UG8I(18)[31],UG9H(18)[31],UG9I(18)[31],UH8H(18)[31],UH8I(18)[31],UH9H(18)[31], + UH9I(18)[31],UI8H(18)[31],UI8I(18)[31],UI9H(18)[31],UI9I(18)[31],=R135TU(18)[31],=R140TU(18)[31], + =R2DA/9(18)[31],=R9/UN0C(18)[31],=R9MJ/9(18)[31],=RA0LH/9(18)[31],=RA9JG/9/P(18)[31], + =RA9ODR/9/M(18)[31],=RM9H(18)[31],=RN9HM/A(18)[31],=RN9HM/P(18)[31],=RP73TP(18)[31],=RP9H(18)[31], + =RQ110RAEM(18)[31],=RQ9I(18)[31],=RU9AZ/9(18)[31],=RV3LO/9(18)[31],=RZ9HK/FF(18)[31], + =RZ9HX/FF(18)[31],=UA9JFN/9/M(18)[31],=UA9MUY/9(18)[31],=UA9OAP/9/P(18)[31],=UA9UAX/9/M(18)[31], + =UE14TS(18)[31],=UE9FDA/9(18)[31], + R8J[20],R9J[20],RA8J[20],RA9J[20],RC8J[20],RC9J[20],RD8J[20],RD9J[20],RE8J[20],RE9J[20],RF8J[20], + RF9J[20],RG8J[20],RG9J[20],RJ8J[20],RJ9J[20],RK8J[20],RK9J[20],RL8J[20],RL9J[20],RM8J[20], + RM9J[20],RN8J[20],RN9J[20],RO8J[20],RO9J[20],RQ8J[20],RQ9J[20],RT8J[20],RT9J[20],RU8J[20], + RU9J[20],RV8J[20],RV9J[20],RW8J[20],RW9J[20],RX8J[20],RX9J[20],RY8J[20],RY9J[20],RZ8J[20], + RZ9J[20],U8J[20],U9J[20],UA8J[20],UA9J[20],UB8J[20],UB9J[20],UC8J[20],UC9J[20],UD8J[20],UD9J[20], + UE8J[20],UE9J[20],UF8J[20],UF9J[20],UG8J[20],UG9J[20],UH8J[20],UH9J[20],UI8J[20],UI9J[20], + =R11UND[20],=R120RJ[20],=R123JDR[20],=R15UGRA[20],=R16UGRA[20],=R175JRGO[20],=R18KSA[20], + =R25ARCK/8[20],=R2AEA/9[20],=R4YA/8[20],=R4YAC/9[20],=R8JAJ/M[20],=R9SAO/P[20],=RA/UR8IF[20], + =RA/UT2LA[20],=RA1QBH/9[20],=RA3ARS/9[20],=RA3ARS/9/M[20],=RA3QQI/8[20],=RA4FCJ/9[20], + =RA4HRM/9[20],=RA60PD[20],=RA9WN/9[20],=RD4HM/9[20],=RJ9J[20],=RK4PA/9[20],=RK6ANP/9[20], + =RK6YM/8[20],=RK6YM/9[20],=RP67GS[20],=RP68GS[20],=RP68J[20],=RP68LK[20],=RP69GS[20],=RP69SF[20], + =RP70GS[20],=RP70LF[20],=RP70SF[20],=RP70SU[20],=RP70YF[20],=RP71GS[20],=RP71LF[20],=RP71SF[20], + =RP72DS[20],=RP72GS[20],=RP72SF[20],=RP72YF[20],=RP73GS[20],=RP73SF[20],=RP74GS[20],=RP75DS[20], + =RP75GS[20],=RP75J[20],=RP75JK[20],=RP75SF[20],=RP76GS[20],=RP76J[20],=RP76SF[20],=RQ0C/8[20], + =RU6YD/9[20],=RV6YM/9[20],=RW4HOH/9[20],=RW4LX/9[20],=RW6AHV/9[20],=RW9WX/9[20],=RX3BP/9[20], + =RX3BP/9/MM[20],=RZ5D/8[20],=RZ9WF/8[20],=RZ9WF/9[20],=UA3ZAF/9[20],=UA6WIO/9[20],=UA9JFN/M[20], + =UB2FCO/8[20], + R8K[20],R9K[20],RA8K[20],RA9K[20],RC8K[20],RC9K[20],RD8K[20],RD9K[20],RE8K[20],RE9K[20],RF8K[20], + RF9K[20],RG8K[20],RG9K[20],RI9K[20],RJ8K[20],RJ9K[20],RK8K[20],RK9K[20],RL8K[20],RL9K[20], + RM8K[20],RM9K[20],RN8K[20],RN9K[20],RO8K[20],RO9K[20],RQ8K[20],RQ9K[20],RT8K[20],RT9K[20], + RU8K[20],RU9K[20],RV8K[20],RV9K[20],RW8K[20],RW9K[20],RX8K[20],RX9K[20],RY8K[20],RY9K[20], + RZ8K[20],RZ9K[20],U8K[20],U9K[20],UA8K[20],UA9K[20],UB8K[20],UB9K[20],UC8K[20],UC9K[20],UD8K[20], + UD9K[20],UE8K[20],UE9K[20],UF8K[20],UF9K[20],UG8K[20],UG9K[20],UH8K[20],UH9K[20],UI8K[20], + UI9K[20],=R120RU[20],=R16LEV[20],=R1DA/8/M[20],=R1DA/9/M[20],=R1ZY/8[20],=R1ZY/9[20], + =R20RRC/8[20],=R3CA/8[20],=R3CG/8[20],=R8XW/8[20],=R9XC/9[20],=R9XT/9[20],=RA/EW1RR[20], + =RA/EW2R[20],=RA1ALA/8[20],=RA3III/8[20],=RA4RU/9[20],=RA4RU/9/P[20],=RC8X/9[20],=RC9XM/8[20], + =RI9K[20],=RI9K/MM[20],=RK6CT/9[20],=RN0CF/9[20],=RN3OF/9[20],=RU6UR/9[20],=RV1CC/8/M[20], + =RV6ARQ/9[20],=RV6LFE/9[20],=RV7B/9[20],=RW0BB/9[20],=RW0BB/9/LH[20],=RW0BG/9[20],=RW4AA/9[20], + =RW4HIF/9[20],=RW4HIH/9[20],=RW6BA/9[20],=RW9XU/9[20],=RX6CP/8[20],=RX6LMA/9[20],=RX9SN/8[20], + =UA0KY/9[20],=UA0QMU/0[20],=UA0QQO/9/P[20],=UA1FBP/9[20],=UA1PBA/9[20],=UA1PBP/9[20], + =UA3DFM/8[20],=UA3DFM/9[20],=UA3MGA/9[20],=UA6BTN/9[20],=UA9SUV/8[20], + =R110WG,=R115AN,=R11QRP/8,=R11QRP/8/P,=R120RL,=R18POR,=R1PN/8,=R2015EP,=R2015LY,=R2015LY/8, + =R22BIA,=R30STM,=R430LT,=R4FAA/8,=R8MC/9,=R8MD/9,=RA/EW8ADX,=RA0UAC/8,=RA0UF/8,=RA3CW/9,=RA9JG/9, + =RC1M/8/M,=RO25TN,=RP67JH,=RP67LK,=RP67LL,=RP67TT,=RP68LS,=RP68TT,=RP69CM,=RP69DK,=RP69GP,=RP69LK, + =RP69LL,=RP69LS,=RP69MM,=RP69P,=RP69YN,=RP70GP,=RP70LL,=RP70LM,=RP70P,=RP70TM,=RP71GP,=RP71LL, + =RP71P,=RP72GP,=RP72LL,=RP72P,=RP72PJ,=RP73LL,=RP73P,=RP74LL,=RP74P,=RP75GP,=RP75LL,=RP75P, + =RP75YN,=RP76P,=RR110RAEM,=RU22LR,=RW0QJ/9,=RX4W/8,=RX6DL/8,=RX6DL/8/P,=RX6DL/8/P/QRP,=RX6DL/9/P, + =RZ9MXM/9/M,=UB5O/8/P,=UE44Y/8,=UE9FDA/9/M,=UE9MDA/9, + =R16CAN,=R1716K,=R1716M,=R1716O,=R1716S,=R21HNY,=R30MDXC,=R9MJ/M,=RA/DK2AI/M,=RA22MX,=RA4CQ/9/M, + =RA9MR/0,=RA9MX/P,=RC20MX,=RG78ML,=RK6YYA/9,=RN0SZ/9,=RN9N/9,=RN9N/M,=RP65MOH,=RP67MC,=RP67MD, + =RP68MC,=RP68MD,=RP69MC,=RP69MD,=RP70GK,=RP70MC,=RP70MD,=RP70OB,=RP70OF,=RP70OS,=RP71GK,=RP71MJ, + =RP71OB,=RP72GK,=RP72MJ,=RP72OB,=RP72ZW,=RP73GK,=RP73OB,=RP74PO,=RP75GK,=RP8M,=RT22MC,=RT22MD, + =RU20NY,=RU20RU,=RV0SR/9,=RW22MW,=RY22MC,=UA1ZGD/9,=UA3AKO/9,=UE55OM,=UE70KRM/9,=UE70KRM/9/M, + =UE9OFF/9, + R8O(18)[31],R8P(18)[31],R9O(18)[31],R9P(18)[31],RA8O(18)[31],RA8P(18)[31],RA9O(18)[31], + RA9P(18)[31],RC8O(18)[31],RC8P(18)[31],RC9O(18)[31],RC9P(18)[31],RD8O(18)[31],RD8P(18)[31], + RD9O(18)[31],RD9P(18)[31],RE8O(18)[31],RE8P(18)[31],RE9O(18)[31],RE9P(18)[31],RF8O(18)[31], + RF8P(18)[31],RF9O(18)[31],RF9P(18)[31],RG8O(18)[31],RG8P(18)[31],RG9O(18)[31],RG9P(18)[31], + RJ8O(18)[31],RJ8P(18)[31],RJ9O(18)[31],RJ9P(18)[31],RK8O(18)[31],RK8P(18)[31],RK9O(18)[31], + RK9P(18)[31],RL8O(18)[31],RL8P(18)[31],RL9O(18)[31],RL9P(18)[31],RM8O(18)[31],RM8P(18)[31], + RM9O(18)[31],RM9P(18)[31],RN8O(18)[31],RN8P(18)[31],RN9O(18)[31],RN9P(18)[31],RO8O(18)[31], + RO8P(18)[31],RO9O(18)[31],RO9P(18)[31],RQ8O(18)[31],RQ8P(18)[31],RQ9O(18)[31],RQ9P(18)[31], + RT8O(18)[31],RT8P(18)[31],RT9O(18)[31],RT9P(18)[31],RU8O(18)[31],RU8P(18)[31],RU9O(18)[31], + RU9P(18)[31],RV8O(18)[31],RV8P(18)[31],RV9O(18)[31],RV9P(18)[31],RW8O(18)[31],RW8P(18)[31], + RW9O(18)[31],RW9P(18)[31],RX8O(18)[31],RX8P(18)[31],RX9O(18)[31],RX9P(18)[31],RY8O(18)[31], + RY8P(18)[31],RY9O(18)[31],RY9P(18)[31],RZ8O(18)[31],RZ8P(18)[31],RZ9O(18)[31],RZ9P(18)[31], + U8O(18)[31],U8P(18)[31],U9O(18)[31],U9P(18)[31],UA8O(18)[31],UA8P(18)[31],UA9O(18)[31], + UA9P(18)[31],UB8O(18)[31],UB8P(18)[31],UB9O(18)[31],UB9P(18)[31],UC8O(18)[31],UC8P(18)[31], + UC9O(18)[31],UC9P(18)[31],UD8O(18)[31],UD8P(18)[31],UD9O(18)[31],UD9P(18)[31],UE8O(18)[31], + UE8P(18)[31],UE9O(18)[31],UE9P(18)[31],UF8O(18)[31],UF8P(18)[31],UF9O(18)[31],UF9P(18)[31], + UG8O(18)[31],UG8P(18)[31],UG9O(18)[31],UG9P(18)[31],UH8O(18)[31],UH8P(18)[31],UH9O(18)[31], + UH9P(18)[31],UI8O(18)[31],UI8P(18)[31],UI9O(18)[31],UI9P(18)[31],=R0LY/9(18)[31],=R0QA/9(18)[31], + =R100MP(18)[31],=R110RAEM(18)[31],=R111EK(18)[31],=R120RW(18)[31],=R125NSK(18)[31], + =R15CWC/9(18)[31],=R18CRO(18)[31],=R2013T(18)[31],=R2013TP(18)[31],=R2017T(18)[31], + =R20NSK(18)[31],=R27ODR(18)[31],=R27ODR/M(18)[31],=R27ODW(18)[31],=R27OGA(18)[31],=R27OGF(18)[31], + =R27OSN(18)[31],=R27OUO(18)[31],=R2ET/9(18)[31],=R30SIB(18)[31],=R8OA/9/P(18)[31],=R8SRR(18)[31], + =R9/TA1FL(18)[31],=RA/DF8DX(18)[31],=RA/N3QQ(18)[31],=RA0LMC/9(18)[31],=RA27OA(18)[31], + =RA27OM(18)[31],=RA3DH/9(18)[31],=RA3ET/9(18)[31],=RA4FRH/0/P(18)[31],=RA9JJ/9/M(18)[31], + =RA9MX/9(18)[31],=RC1M/9(18)[31],=RC1M/9/M(18)[31],=RD0L/9(18)[31],=RG9O(18)[31],=RL3T/9(18)[31], + =RN9N/9/M(18)[31],=RO9O(18)[31],=RP67MP(18)[31],=RP68MP(18)[31],=RP70MP(18)[31],=RP71MP(18)[31], + =RP72MP(18)[31],=RP73MP(18)[31],=RP74MP(18)[31],=RP75MP(18)[31],=RP76MP(18)[31],=RP9OMP(18)[31], + =RP9OW(18)[31],=RQ16CW(18)[31],=RR9O(18)[31],=RS9O(18)[31],=RU0ZM/9(18)[31],=RU27OZ(18)[31], + =RU6LA/9(18)[31],=RV0CJ/9(18)[31],=RW1AC/9(18)[31],=RW30KR(18)[31],=RW9MD/9/M(18)[31], + =RZ9MXM/9(18)[31],=UA0KDR/9(18)[31],=UA0ZAY/9(18)[31],=UA6WFO/9(18)[31],=UA9MA/9(18)[31], + =UA9MA/9/M(18)[31],=UA9MRA/9(18)[31],=UE80NSO(18)[31], + =R110RP,=R120RDP,=R120RZ,=R120TM,=R150RP,=R155RP,=R160RP,=R18URU,=R30EMER,=R9CZ/M,=RA22QF,=RC20QA, + =RC20QC,=RC20QF,=RM20CC,=RM20NY,=RM21NY,=RM9RZ/A,=RM9RZ/P,=RP65R,=RP67KE,=RP67R,=RP68KE,=RP68R, + =RP69KE,=RP69R,=RP70KE,=RP70R,=RP71R,=RP72KE,=RP72R,=RP75KE,=RQ30KR,=RT73CW,=RT73JH,=RV3MN/9, + =RW22QA,=RW22QA/8,=RW22QC,=RW22QC/8,=RW4NW/9,=RY22RZ,=RY30DX,=RY60YG,=RZ9WM/9/M,=UE4WFF/9, + =UE4WFF/9/P,=UE70KRM/8/M, + R8S(16),R8T(16),R9S(16),R9T(16),RA8S(16),RA8T(16),RA9S(16),RA9T(16),RC8S(16),RC8T(16),RC9S(16), + RC9T(16),RD8S(16),RD8T(16),RD9S(16),RD9T(16),RE8S(16),RE8T(16),RE9S(16),RE9T(16),RF8S(16), + RF8T(16),RF9S(16),RF9T(16),RG8S(16),RG8T(16),RG9S(16),RG9T(16),RJ8S(16),RJ8T(16),RJ9S(16), + RJ9T(16),RK8S(16),RK8T(16),RK9S(16),RK9T(16),RL8S(16),RL8T(16),RL9S(16),RL9T(16),RM8S(16), + RM8T(16),RM9S(16),RM9T(16),RN8S(16),RN8T(16),RN9S(16),RN9T(16),RO8S(16),RO8T(16),RO9S(16), + RO9T(16),RQ8S(16),RQ8T(16),RQ9S(16),RQ9T(16),RT8S(16),RT8T(16),RT9S(16),RT9T(16),RU8S(16), + RU8T(16),RU9S(16),RU9T(16),RV8S(16),RV8T(16),RV9S(16),RV9T(16),RW8S(16),RW8T(16),RW9S(16), + RW9T(16),RX8S(16),RX8T(16),RX9S(16),RX9T(16),RY8S(16),RY8T(16),RY9S(16),RY9T(16),RZ8S(16), + RZ8T(16),RZ9S(16),RZ9T(16),U8S(16),U8T(16),U9S(16),U9T(16),UA8S(16),UA8T(16),UA9S(16),UA9T(16), + UB8S(16),UB8T(16),UB9S(16),UB9T(16),UC8S(16),UC8T(16),UC9S(16),UC9T(16),UD8S(16),UD8T(16), + UD9S(16),UD9T(16),UE8S(16),UE8T(16),UE9S(16),UE9T(16),UF8S(16),UF8T(16),UF9S(16),UF9T(16), + UG8S(16),UG8T(16),UG9S(16),UG9T(16),UH8S(16),UH8T(16),UH9S(16),UH9T(16),UI8S(16),UI8T(16), + UI9S(16),UI9T(16),=R2014FX(16),=R2015DM(16),=R270A(16),=R270E(16),=R270SR(16),=R3ARS/9(16), + =R40WK(16),=R9HQ(16),=R9JBN/8/M(16),=RA/UY7IQ(16),=RA27TR(16),=RA4HMT/9/M(16),=RA4HT/9(16), + =RA4PKR/9(16),=RA9CS/P(16),=RC20OB(16),=RC20TT(16),=RN3DHB/9(16),=RN3DHB/9/P(16),=RN3GW/8(16), + =RN3GW/8/QRP(16),=RN3GW/9(16),=RN3GW/9/QRP(16),=RN3QOP/4/M(16),=RN3QOP/9(16),=RN9S(16), + =RN9SM/P(16),=RN9WWW/9(16),=RO9S(16),=RP65TT(16),=RP68GR(16),=RP69NB(16),=RP71TK(16),=RP75TS(16), + =RP9SBO(16),=RP9SBR(16),=RP9SNK(16),=RT22TK(16),=RT73OA(16),=RT8T(16),=RT9S(16),=RT9T(16), + =RU22TU(16),=RU9SO/M(16),=RV1CC/4/M(16),=RV9WGF/4/M(16),=RV9WMZ/9/M(16),=RW4PJZ/9(16), + =RW4PJZ/9/M(16),=RW4PP/9(16),=RW9WA/9(16),=RW9WA/9/M(16),=RY4W/9(16),=RZ4HZW/9/M(16), + =UA0AGA/9/P(16),=UA0KBA/9(16),=UA3WB/9(16),=UA4LCQ/9(16),=UA9SIV/9(16),=UB5O/4(16), + =UB9JBN/9/M(16),=UE1RFF/9(16),=UE25ST(16),=UE55OB(16),=UE60TDP(16),=UE60TDP/P(16),=UE9WDA/9/M(16), + R8U(18)[31],R8V(18)[31],R9U(18)[31],R9V(18)[31],RA8U(18)[31],RA8V(18)[31],RA9U(18)[31], + RA9V(18)[31],RC8U(18)[31],RC8V(18)[31],RC9U(18)[31],RC9V(18)[31],RD8U(18)[31],RD8V(18)[31], + RD9U(18)[31],RD9V(18)[31],RE8U(18)[31],RE8V(18)[31],RE9U(18)[31],RE9V(18)[31],RF8U(18)[31], + RF8V(18)[31],RF9U(18)[31],RF9V(18)[31],RG8U(18)[31],RG8V(18)[31],RG9U(18)[31],RG9V(18)[31], + RJ8U(18)[31],RJ8V(18)[31],RJ9U(18)[31],RJ9V(18)[31],RK8U(18)[31],RK8V(18)[31],RK9U(18)[31], + RK9V(18)[31],RL8U(18)[31],RL8V(18)[31],RL9U(18)[31],RL9V(18)[31],RM8U(18)[31],RM8V(18)[31], + RM9U(18)[31],RM9V(18)[31],RN8U(18)[31],RN8V(18)[31],RN9U(18)[31],RN9V(18)[31],RO8U(18)[31], + RO8V(18)[31],RO9U(18)[31],RO9V(18)[31],RQ8U(18)[31],RQ8V(18)[31],RQ9U(18)[31],RQ9V(18)[31], + RT8U(18)[31],RT8V(18)[31],RT9U(18)[31],RT9V(18)[31],RU8U(18)[31],RU8V(18)[31],RU9U(18)[31], + RU9V(18)[31],RV8U(18)[31],RV8V(18)[31],RV9U(18)[31],RV9V(18)[31],RW8U(18)[31],RW8V(18)[31], + RW9U(18)[31],RW9V(18)[31],RX8U(18)[31],RX8V(18)[31],RX9U(18)[31],RX9V(18)[31],RY8U(18)[31], + RY8V(18)[31],RY9U(18)[31],RY9V(18)[31],RZ8U(18)[31],RZ8V(18)[31],RZ9U(18)[31],RZ9V(18)[31], + U8U(18)[31],U8V(18)[31],U9U(18)[31],U9V(18)[31],UA8U(18)[31],UA8V(18)[31],UA9U(18)[31], + UA9V(18)[31],UB8U(18)[31],UB8V(18)[31],UB9U(18)[31],UB9V(18)[31],UC8U(18)[31],UC8V(18)[31], + UC9U(18)[31],UC9V(18)[31],UD8U(18)[31],UD8V(18)[31],UD9U(18)[31],UD9V(18)[31],UE8U(18)[31], + UE8V(18)[31],UE9U(18)[31],UE9V(18)[31],UF8U(18)[31],UF8V(18)[31],UF9U(18)[31],UF9V(18)[31], + UG8U(18)[31],UG8V(18)[31],UG9U(18)[31],UG9V(18)[31],UH8U(18)[31],UH8V(18)[31],UH9U(18)[31], + UH9V(18)[31],UI8U(18)[31],UI8V(18)[31],UI9U(18)[31],UI9V(18)[31],=R10NRC(18)[31],=R22ULM(18)[31], + =R2SD/9(18)[31],=R400N(18)[31],=R70B(18)[31],=R9/EW1TM(18)[31],=R9UAG/N(18)[31],=RA30KR(18)[31], + =RA4CQ/9(18)[31],=RAEM(18)[31],=RC4W/9(18)[31],=RK6CG/9(18)[31],=RN30KR(18)[31],=RP65UMF(18)[31], + =RP67KM(18)[31],=RP68KM(18)[31],=RP69KM(18)[31],=RP70KM(18)[31],=RP70NM(18)[31],=RP70UK(18)[31], + =RP70ZF(18)[31],=RP71KM(18)[31],=RP72KM(18)[31],=RP72NM(18)[31],=RP73KM(18)[31],=RP73NZ(18)[31], + =RP73ZF(18)[31],=RP74KM(18)[31],=RP75KM(18)[31],=RP75YE(18)[31],=RP76KM(18)[31],=RP76KUF(18)[31], + =RT22UA(18)[31],=RT77VV(18)[31],=RW0CE/9(18)[31],=RW4CG/9(18)[31],=UA9JFE/9/P(18)[31], + =UA9UAX/M(18)[31],=UE3ATV/9(18)[31], + R8W(16),R9W(16),RA8W(16),RA9W(16),RC8W(16),RC9W(16),RD8W(16),RD9W(16),RE8W(16),RE9W(16),RF8W(16), + RF9W(16),RG8W(16),RG9W(16),RJ8W(16),RJ9W(16),RK8W(16),RK9W(16),RL8W(16),RL9W(16),RM8W(16), + RM9W(16),RN8W(16),RN9W(16),RO8W(16),RO9W(16),RQ8W(16),RQ9W(16),RT8W(16),RT9W(16),RU8W(16), + RU9W(16),RV8W(16),RV9W(16),RW8W(16),RW9W(16),RX8W(16),RX9W(16),RY8W(16),RY9W(16),RZ8W(16), + RZ9W(16),U8W(16),U9W(16),UA8W(16),UA9W(16),UB8W(16),UB9W(16),UC8W(16),UC9W(16),UD8W(16),UD9W(16), + UE8W(16),UE9W(16),UF8W(16),UF9W(16),UG8W(16),UG9W(16),UH8W(16),UH9W(16),UI8W(16),UI9W(16), + =R05SOTA(16),=R100W(16),=R10RTRS/9(16),=R18KDR/4(16),=R2013CG(16),=R2015AS(16),=R2015DS(16), + =R2015KM(16),=R2017F/P(16),=R2019CG(16),=R20BIS(16),=R20UFA(16),=R25ARCK/4(16),=R25MSB(16), + =R25WPW(16),=R27UFA(16),=R3XX/9(16),=R44WFF(16),=R53ICGA(16),=R53ICGB(16),=R53ICGC(16), + =R53ICGF(16),=R53ICGJ(16),=R53ICGS(16),=R53ICGV(16),=R53ICGW(16),=R7378TM(16),=R8JAJ/4(16), + =R8JAJ/4/P(16),=R8JAJ/9(16),=R90WGM(16),=R90WJV(16),=R90WOB(16),=R90WXK(16),=R9LY/4(16), + =RA0R/4(16),=RA1ZPC/9(16),=RA3AUU/9(16),=RA4POX/9(16),=RA8JA/4(16),=RA8JA/4/P(16),=RA9DF/4/M(16), + =RA9KDX/8/M(16),=RA9WU/9(16),=RF9W(16),=RG5A/8(16),=RK3PWJ/9(16),=RK6YYA/9/M(16),=RK9KWI/9(16), + =RK9KWI/9/P(16),=RL3DX/9(16),=RM90WF(16),=RM9RZ/9/P(16),=RN9S/M(16),=RN9WWW/9/M(16),=RN9WWW/P(16), + =RO17CW(16),=RO30KR(16),=RP67GI(16),=RP67MG(16),=RP67NG(16),=RP67RK(16),=RP67SW(16),=RP67UF(16), + =RP68GM(16),=RP68NK(16),=RP68UF(16),=RP69GI(16),=RP69PW(16),=RP69UF(16),=RP70GI(16),=RP70GM(16), + =RP70LS(16),=RP70NK(16),=RP70UF(16),=RP70ZO(16),=RP71GI(16),=RP71GM(16),=RP71UF(16),=RP72AR(16), + =RP72GI(16),=RP72GM(16),=RP72UF(16),=RP72WU(16),=RP73AR(16),=RP73GI(16),=RP73UF(16),=RP73WU(16), + =RP74GI(16),=RP74UF(16),=RP75DM(16),=RP75GI(16),=RP75MGI(16),=RP75UF(16),=RP75VAM(16),=RP75WU(16), + =RP76GI(16),=RP76UF(16),=RP76WAO(16),=RP76WU(16),=RT22WF(16),=RT2F/4(16),=RT2F/4/M(16), + =RT2F/9/M(16),=RT73EA(16),=RT73EL(16),=RT8A/4(16),=RT9W(16),=RT9W/P(16),=RU110RAEM(16), + =RU20WC(16),=RU22WZ(16),=RU27WB(16),=RU27WF(16),=RU27WN(16),=RU27WO(16),=RU3HD/9/P(16), + =RU90WZ(16),=RU9CK/4/M(16),=RU9KC/4/M(16),=RU9SO/4(16),=RU9SO/4/P(16),=RV22WB(16),=RV2FZ/9(16), + =RV90WB(16),=RV9CHB/4(16),=RV9CX/4/M(16),=RV9WB/M(16),=RW3SN/9(16),=RW3XX/9(16),=RW4WA/9/P(16), + =RW90WC(16),=RW95WJ(16),=RW9FWR/9/M(16),=RW9JZ/4(16),=RW9JZ/9(16),=RX22WN(16),=RX95WN(16), + =RZ16WF(16),=RZ90W(16),=RZ90WU(16),=UA0AZA/9(16),=UA1AAE/9(16),=UA1ZPC/9(16),=UA4LU/9/P(16), + =UA4PIE/9(16),=UA4PIE/9/M(16),=UA4PIE/9/P(16),=UA4PJM/9(16),=UA4PJM/9/M(16),=UA4PJM/9/P(16), + =UA4PXR/9/M(16),=UA9KAA/4(16),=UA9KAA/9(16),=UB5O/4/M(16),=UE10RFF/4(16),=UE90W(16), + R8Y(18)[31],R9Y(18)[31],RA8Y(18)[31],RA9Y(18)[31],RC8Y(18)[31],RC9Y(18)[31],RD8Y(18)[31], + RD9Y(18)[31],RE8Y(18)[31],RE9Y(18)[31],RF8Y(18)[31],RF9Y(18)[31],RG8Y(18)[31],RG9Y(18)[31], + RJ8Y(18)[31],RJ9Y(18)[31],RK8Y(18)[31],RK9Y(18)[31],RL8Y(18)[31],RL9Y(18)[31],RM8Y(18)[31], + RM9Y(18)[31],RN8Y(18)[31],RN9Y(18)[31],RO8Y(18)[31],RO9Y(18)[31],RQ8Y(18)[31],RQ9Y(18)[31], + RT8Y(18)[31],RT9Y(18)[31],RU8Y(18)[31],RU9Y(18)[31],RV8Y(18)[31],RV9Y(18)[31],RW8Y(18)[31], + RW9Y(18)[31],RX8Y(18)[31],RX9Y(18)[31],RY8Y(18)[31],RY9Y(18)[31],RZ8Y(18)[31],RZ9Y(18)[31], + U8Y(18)[31],U9Y(18)[31],UA8Y(18)[31],UA9Y(18)[31],UB8Y(18)[31],UB9Y(18)[31],UC8Y(18)[31], + UC9Y(18)[31],UD8Y(18)[31],UD9Y(18)[31],UE8Y(18)[31],UE9Y(18)[31],UF8Y(18)[31],UF9Y(18)[31], + UG8Y(18)[31],UG9Y(18)[31],UH8Y(18)[31],UH9Y(18)[31],UI8Y(18)[31],UI9Y(18)[31],=R100KM(18)[31], + =R2015RR(18)[31],=R2015SV(18)[31],=R6XBA/9(18)[31],=R9/UN7JHC(18)[31],=R9/UN7JMO(18)[31], + =R9PS/9(18)[31],=RA/IK5MIC(18)[31],=RA/IK5MIC/M(18)[31],=RA0CCJ/9(18)[31],=RA50VT(18)[31], + =RJ30KR(18)[31],=RK1B/9(18)[31],=RL30KR(18)[31],=RP68BP(18)[31],=RP68TZ(18)[31],=RP70AF(18)[31], + =RP70BP(18)[31],=RP70GA(18)[31],=RP71BP(18)[31],=RP72BP(18)[31],=RP73BP(18)[31],=RP9Y(18)[31], + =RP9YAF(18)[31],=RP9YTZ(18)[31],=RQ1A(18)[31],=RT73GM(18)[31],=RW22WG(18)[31],=RX6AY/9(18)[31], + =UA0LLW/9(18)[31],=UA0ZDY/9(18)[31],=UA9UAX/9/P(18)[31],=UB5O/9(18)[31],=UE0ZOO/9(18)[31], + =UE44R/9(18)[31],=UE80AL(18)[31], + R8Z(18)[31],R9Z(18)[31],RA8Z(18)[31],RA9Z(18)[31],RC8Z(18)[31],RC9Z(18)[31],RD8Z(18)[31], + RD9Z(18)[31],RE8Z(18)[31],RE9Z(18)[31],RF8Z(18)[31],RF9Z(18)[31],RG8Z(18)[31],RG9Z(18)[31], + RJ8Z(18)[31],RJ9Z(18)[31],RK8Z(18)[31],RK9Z(18)[31],RL8Z(18)[31],RL9Z(18)[31],RM8Z(18)[31], + RM9Z(18)[31],RN8Z(18)[31],RN9Z(18)[31],RO8Z(18)[31],RO9Z(18)[31],RQ8Z(18)[31],RQ9Z(18)[31], + RT8Z(18)[31],RT9Z(18)[31],RU8Z(18)[31],RU9Z(18)[31],RV8Z(18)[31],RV9Z(18)[31],RW8Z(18)[31], + RW9Z(18)[31],RX8Z(18)[31],RX9Z(18)[31],RY8Z(18)[31],RY9Z(18)[31],RZ8Z(18)[31],RZ9Z(18)[31], + U8Z(18)[31],U9Z(18)[31],UA8Z(18)[31],UA9Z(18)[31],UB8Z(18)[31],UB9Z(18)[31],UC8Z(18)[31], + UC9Z(18)[31],UD8Z(18)[31],UD9Z(18)[31],UE8Z(18)[31],UE9Z(18)[31],UF8Z(18)[31],UF9Z(18)[31], + UG8Z(18)[31],UG9Z(18)[31],UH8Z(18)[31],UH9Z(18)[31],UI8Z(18)[31],UI9Z(18)[31], + =RA/IK5MIC/P(18)[31],=RA3DS/P(18)[31],=RC9YA/9/M(18)[31],=RW9MD/9/P(18)[31],=UA0KBG/9/P(18)[31], + =UA9MAC/9(18)[31], + R0A(18)[32],R0B(18)[32],R0H(18)[32],RA0A(18)[32],RA0B(18)[32],RA0H(18)[32],RC0A(18)[32], + RC0B(18)[32],RC0H(18)[32],RD0A(18)[32],RD0B(18)[32],RD0H(18)[32],RE0A(18)[32],RE0B(18)[32], + RE0H(18)[32],RF0A(18)[32],RF0B(18)[32],RF0H(18)[32],RG0A(18)[32],RG0B(18)[32],RG0H(18)[32], + RI0A(18)[32],RI0B(18)[32],RI0H(18)[32],RJ0A(18)[32],RJ0B(18)[32],RJ0H(18)[32],RK0A(18)[32], + RK0B(18)[32],RK0H(18)[32],RL0A(18)[32],RL0B(18)[32],RL0H(18)[32],RM0A(18)[32],RM0B(18)[32], + RM0H(18)[32],RN0A(18)[32],RN0B(18)[32],RN0H(18)[32],RO0A(18)[32],RO0B(18)[32],RO0H(18)[32], + RQ0A(18)[32],RQ0B(18)[32],RQ0H(18)[32],RT0A(18)[32],RT0B(18)[32],RT0H(18)[32],RU0A(18)[32], + RU0B(18)[32],RU0H(18)[32],RV0A(18)[32],RV0B(18)[32],RV0H(18)[32],RW0A(18)[32],RW0B(18)[32], + RW0H(18)[32],RX0A(18)[32],RX0B(18)[32],RX0H(18)[32],RY0A(18)[32],RY0B(18)[32],RY0H(18)[32], + RZ0A(18)[32],RZ0B(18)[32],RZ0H(18)[32],U0A(18)[32],U0B(18)[32],U0H(18)[32],UA0A(18)[32], + UA0B(18)[32],UA0H(18)[32],UB0A(18)[32],UB0B(18)[32],UB0H(18)[32],UC0A(18)[32],UC0B(18)[32], + UC0H(18)[32],UD0A(18)[32],UD0B(18)[32],UD0H(18)[32],UE0A(18)[32],UE0B(18)[32],UE0H(18)[32], + UF0A(18)[32],UF0B(18)[32],UF0H(18)[32],UG0A(18)[32],UG0B(18)[32],UG0H(18)[32],UH0A(18)[32], + UH0B(18)[32],UH0H(18)[32],UI0A(18)[32],UI0B(18)[32],UI0H(18)[32],=R00BVB(18)[32],=R0WA/P(18)[32], + =R100RW(18)[32],=R120RB(18)[32],=R170GS(18)[32],=R18KDR/9(18)[32],=R18RUS(18)[32],=R2016A(18)[32], + =R20KRK(18)[32],=R44YETI/9(18)[32],=R50CQM(18)[32],=R63RRC(18)[32],=R7LZ/9(18)[32], + =RA/UR5HVR(18)[32],=RA0/UR5HVR(18)[32],=RA1AMW/0(18)[32],=RA3AUU/0(18)[32],=RA3BB/0(18)[32], + =RA3DA/0(18)[32],=RA3DA/9(18)[32],=RA4CQ/0(18)[32],=RA4CSX/0(18)[32],=RA4RU/0(18)[32], + =RA9UT/0(18)[32],=RD110RAEM(18)[32],=RI0BV/0(18)[32],=RK3DZJ/9(18)[32],=RK56GC(18)[32], + =RK6BBM/9(18)[32],=RK80KEDR(18)[32],=RL5G/9(18)[32],=RM0A(18)[32],=RM2D/9(18)[32], + =RM9RZ/0(18)[32],=RN0A(18)[32],=RN110RAEM(18)[32],=RN110RAEM/P(18)[32],=RP70KV(18)[32], + =RP70RS(18)[32],=RP73KT(18)[32],=RP74KT(18)[32],=RP75BKF(18)[32],=RQ21NY(18)[32],=RQ30DX(18)[32], + =RQ60YG(18)[32],=RT22SA(18)[32],=RT9K/9(18)[32],=RU19NY(18)[32],=RU3FF/0(18)[32],=RU4CO/0(18)[32], + =RV3DHC/0(18)[32],=RV3DHC/0/P(18)[32],=RV9WP/9(18)[32],=RW3XN/0(18)[32],=RW3YC/0(18)[32], + =RW3YC/9(18)[32],=RY1AAB/9(18)[32],=RY1AAB/9/M(18)[32],=RZ3DSA/0(18)[32],=RZ3DZS/0(18)[32], + =RZ9ON/9(18)[32],=UA0ACG/0(18)[32],=UA0FCB/0(18)[32],=UA0FCB/0/P(18)[32],=UA0WG/0(18)[32], + =UA0WG/P(18)[32],=UA0WW/0(18)[32],=UA0WW/M(18)[32],=UA0WY/0(18)[32],=UA3ADN/0(18)[32], + =UA4LU/0(18)[32],=UA4PT/0(18)[32],=UA6BTN/0(18)[32],=UA9UAX/9(18)[32],=UA9WDK/0(18)[32], + =UB1AJQ/0(18)[32],=UE1WFF/0(18)[32], + =R100D(18)[22],=R100DI(18)[22],=R3CA/9(18)[22],=RA3XR/0(18)[22],=RA9LI/0(18)[22],=RI0B(18)[22], + =RI0BDI(18)[22],=RP76OSR(18)[22],=RS0B(18)[22],=RS0B/P(18)[22],=RV3EFH/0(18)[22],=RW1AI/9(18)[22], + =RW3GW/0(18)[22],=RX6LMQ/0(18)[22],=RZ9DX/0(18)[22],=RZ9DX/0/A(18)[22],=RZ9DX/0/P(18)[22], + =RZ9DX/9(18)[22],=RZ9DX/9/P(18)[22],=RZ9OO/0(18)[22],=UA1ADQ/0(18)[22],=UA3HY/0(18)[22], + =UA3YH/0(18)[22],=UA4RX/0(18)[22],=UA9FL/0(18)[22],=UE0BFF(18)[22],=UE44POL(18)[22], + =UE44POL/P(18)[22],=UE73D(18)[22],=UE73DI(18)[22], + R0C(19)[34],RA0C(19)[34],RC0C(19)[34],RD0C(19)[34],RE0C(19)[34],RF0C(19)[34],RG0C(19)[34], + RI0C(19)[34],RJ0C(19)[34],RK0C(19)[34],RL0C(19)[34],RM0C(19)[34],RN0C(19)[34],RO0C(19)[34], + RQ0C(19)[34],RT0C(19)[34],RU0C(19)[34],RV0C(19)[34],RW0C(19)[34],RX0C(19)[34],RY0C(19)[34], + RZ0C(19)[34],U0C(19)[34],UA0C(19)[34],UB0C(19)[34],UC0C(19)[34],UD0C(19)[34],UE0C(19)[34], + UF0C(19)[34],UG0C(19)[34],UH0C(19)[34],UI0C(19)[34],=R120RN(19)[34],=R150C(19)[34],=R155C(19)[34], + =R15CWC/0(19)[34],=R15CWC/0/QRP(19)[34],=R160NA(19)[34],=R170GS/0(19)[34],=R20DFO(19)[34], + =R24RRC(19)[34],=R25ARCK/0(19)[34],=R27CGY(19)[34],=R44YETI/0(19)[34],=R7AL/0(19)[34], + =R7AL/0/M(19)[34],=R7AL/0/P(19)[34],=R7LZ/0(19)[34],=RA/JA8BMK(19)[34],=RA/N6TR(19)[34], + =RA/VE7MID(19)[34],=RA1QD/0(19)[34],=RA1ZZ/0(19)[34],=RA1ZZ/0/M(19)[34],=RA3NAN/0(19)[34], + =RA6GW/0(19)[34],=RA6XPL/0(19)[34],=RC110RAEM(19)[34],=RC20CD(19)[34],=RD0C(19)[34], + =RD16CW(19)[34],=RD30KR(19)[34],=RL3AA/0(19)[34],=RL5G/0(19)[34],=RM2D/0(19)[34],=RM30KR(19)[34], + =RP0CZA(19)[34],=RP68H(19)[34],=RP70H(19)[34],=RP71H(19)[34],=RP72H(19)[34],=RP76H(19)[34], + =RT22CT(19)[34],=RU3DX/0(19)[34],=RV30KR(19)[34],=RW3DTB/0(19)[34],=RZ17NY(19)[34], + =RZ20NY(19)[34],=RZ21NY(19)[34],=RZ30DX(19)[34],=RZ5D/0(19)[34],=RZ60YG(19)[34],=UA0AOZ/0(19)[34], + =UA3DX/0(19)[34],=UA6CW/0(19)[34],=UE150C(19)[34],=UE70VSV(19)[34],=UE80C(19)[34], + =UB5O/0(19)[33], + R0E(19)[34],R0F(19)[34],RA0E(19)[34],RA0F(19)[34],RC0E(19)[34],RC0F(19)[34],RD0E(19)[34], + RD0F(19)[34],RE0E(19)[34],RE0F(19)[34],RF0E(19)[34],RF0F(19)[34],RG0E(19)[34],RG0F(19)[34], + RI0F(19)[34],RJ0E(19)[34],RJ0F(19)[34],RK0E(19)[34],RK0F(19)[34],RL0E(19)[34],RL0F(19)[34], + RM0E(19)[34],RM0F(19)[34],RN0E(19)[34],RN0F(19)[34],RO0E(19)[34],RO0F(19)[34],RQ0E(19)[34], + RQ0F(19)[34],RT0E(19)[34],RT0F(19)[34],RU0E(19)[34],RU0F(19)[34],RV0E(19)[34],RV0F(19)[34], + RW0E(19)[34],RW0F(19)[34],RX0E(19)[34],RX0F(19)[34],RY0E(19)[34],RY0F(19)[34],RZ0E(19)[34], + RZ0F(19)[34],U0E(19)[34],U0F(19)[34],UA0E(19)[34],UA0F(19)[34],UB0E(19)[34],UB0F(19)[34], + UC0E(19)[34],UC0F(19)[34],UD0E(19)[34],UD0F(19)[34],UE0E(19)[34],UE0F(19)[34],UF0E(19)[34], + UF0F(19)[34],UG0E(19)[34],UG0F(19)[34],UH0E(19)[34],UH0F(19)[34],UI0E(19)[34],UI0F(19)[34], + =R10RLHA/0(19)[34],=R1FW/0(19)[34],=R26RRC(19)[34],=R7AA/0(19)[34],=R7LP/0(19)[34], + =R7MR/0(19)[34],=RA/KE5JA(19)[34],=RA/OG2K(19)[34],=RA0SS/0(19)[34],=RA1ALA/0(19)[34], + =RA4HKM/0(19)[34],=RA4HKM/0/P(19)[34],=RA6ABC/0(19)[34],=RM0F(19)[34],=RN0F(19)[34], + =RN1CR/0(19)[34],=RS0F(19)[34],=RT6A/0(19)[34],=RV1CC/0(19)[34],=RZ3DW/0(19)[34],=RZ4HD/0(19)[34], + =RZ55YG(19)[34],=RZ9ODD/0(19)[34],=RZ9OWE/0(19)[34],=UA1ANA/0(19)[34],=UA3EDP/0(19)[34], + =UB40FSU(19)[34],=UE1AAA/0(19)[34], + =RV9WP/0(18)[22],=U0H/UA0AGQ(18)[22], + R0I(19)[24],RA0I(19)[24],RC0I(19)[24],RD0I(19)[24],RE0I(19)[24],RF0I(19)[24],RG0I(19)[24], + RI0I(19)[24],RJ0I(19)[24],RK0I(19)[24],RL0I(19)[24],RM0I(19)[24],RN0I(19)[24],RO0I(19)[24], + RQ0I(19)[24],RT0I(19)[24],RU0I(19)[24],RV0I(19)[24],RW0I(19)[24],RX0I(19)[24],RY0I(19)[24], + RZ0I(19)[24],U0I(19)[24],UA0I(19)[24],UB0I(19)[24],UC0I(19)[24],UD0I(19)[24],UE0I(19)[24], + UF0I(19)[24],UG0I(19)[24],UH0I(19)[24],UI0I(19)[24],=RA/IK0PRH(19)[24],=RA/IK0PRH/P(19)[24], + =RA4CF/0(19)[24],=RM0I(19)[24],=RX6CM/0(19)[24],=RZ9ON/0(19)[24], + =R11QRP/0(19)[33],=R2016KW(19)[33],=R4AK/0/P(19)[33],=RA3AN/0(19)[33],=RP75AM(19)[33], + =RP76AM(19)[33],=RQ0J/QRP(19)[33],=RU3HD/0(19)[33],=RW80KEDR(19)[33],=UA9MUY/0(19)[33], + =UE75OJ(19)[33], + R0K(19)[25],RA0K(19)[25],RC0K(19)[25],RD0K(19)[25],RE0K(19)[25],RF0K(19)[25],RG0K(19)[25], + RI0K(19)[25],RJ0K(19)[25],RK0K(19)[25],RL0K(19)[25],RM0K(19)[25],RN0K(19)[25],RO0K(19)[25], + RQ0K(19)[25],RT0K(19)[25],RU0K(19)[25],RV0K(19)[25],RW0K(19)[25],RX0K(19)[25],RY0K(19)[25], + RZ0K(19)[25],U0K(19)[25],UA0K(19)[25],UB0K(19)[25],UC0K(19)[25],UD0K(19)[25],UE0K(19)[25], + UF0K(19)[25],UG0K(19)[25],UH0K(19)[25],UI0K(19)[25],=R2015RY(19)[25],=R207RRC(19)[25], + =R71RRC(19)[25],=RA3AV/0(19)[25],=RA3XV/0(19)[25],=RC85AO(19)[25],=RP70AS(19)[25],=RT65KI(19)[25], + =RT92KA(19)[25],=RU9MV/0(19)[25],=RV3MA/0(19)[25],=RZ3EC/0(19)[25],=RZ6LL/0(19)[25], + =RZ6MZ/0(19)[25],=UA1ORT/0(19)[25],=UA6LP/0(19)[25], + R0L(19)[34],R0M(19)[34],R0N(19)[34],RA0L(19)[34],RA0M(19)[34],RA0N(19)[34],RC0L(19)[34], + RC0M(19)[34],RC0N(19)[34],RD0L(19)[34],RD0M(19)[34],RD0N(19)[34],RE0L(19)[34],RE0M(19)[34], + RE0N(19)[34],RF0L(19)[34],RF0M(19)[34],RF0N(19)[34],RG0L(19)[34],RG0M(19)[34],RG0N(19)[34], + RI0L(19)[34],RJ0L(19)[34],RJ0M(19)[34],RJ0N(19)[34],RK0L(19)[34],RK0M(19)[34],RK0N(19)[34], + RL0L(19)[34],RL0M(19)[34],RL0N(19)[34],RM0L(19)[34],RM0M(19)[34],RM0N(19)[34],RN0L(19)[34], + RN0M(19)[34],RN0N(19)[34],RO0L(19)[34],RO0M(19)[34],RO0N(19)[34],RQ0L(19)[34],RQ0M(19)[34], + RQ0N(19)[34],RT0L(19)[34],RT0M(19)[34],RT0N(19)[34],RU0L(19)[34],RU0M(19)[34],RU0N(19)[34], + RV0L(19)[34],RV0M(19)[34],RV0N(19)[34],RW0L(19)[34],RW0M(19)[34],RW0N(19)[34],RX0L(19)[34], + RX0M(19)[34],RX0N(19)[34],RY0L(19)[34],RY0M(19)[34],RY0N(19)[34],RZ0L(19)[34],RZ0M(19)[34], + RZ0N(19)[34],U0L(19)[34],U0M(19)[34],U0N(19)[34],UA0L(19)[34],UA0M(19)[34],UA0N(19)[34], + UB0L(19)[34],UB0M(19)[34],UB0N(19)[34],UC0L(19)[34],UC0M(19)[34],UC0N(19)[34],UD0L(19)[34], + UD0M(19)[34],UD0N(19)[34],UE0L(19)[34],UE0M(19)[34],UE0N(19)[34],UF0L(19)[34],UF0M(19)[34], + UF0N(19)[34],UG0L(19)[34],UG0M(19)[34],UG0N(19)[34],UH0L(19)[34],UH0M(19)[34],UH0N(19)[34], + UI0L(19)[34],UI0M(19)[34],UI0N(19)[34],=R150L(19)[34],=R17CWH(19)[34],=R20RRC/0(19)[34], + =R3BY/0(19)[34],=R3HD/0(19)[34],=R66IOTA(19)[34],=R70LWA(19)[34],=R8CW/0(19)[34],=R8XW/0(19)[34], + =R9MI/0(19)[34],=R9XT/0(19)[34],=RA/IK7YTT(19)[34],=RA/OK1DWF(19)[34],=RD3ARD/0(19)[34], + =RD3BN/0(19)[34],=RL5G/0/P(19)[34],=RM0M(19)[34],=RM0M/LH(19)[34],=RM5M/0(19)[34], + =RN1NS/0(19)[34],=RP0L(19)[34],=RP0LPK(19)[34],=RP60P(19)[34],=RP66V(19)[34],=RP67SD(19)[34], + =RP67V(19)[34],=RP68SD(19)[34],=RP68V(19)[34],=RP69SD(19)[34],=RP69V(19)[34],=RP70DG(19)[34], + =RP70SD(19)[34],=RP70V(19)[34],=RP71DG(19)[34],=RP71SD(19)[34],=RP71V(19)[34],=RP72DG(19)[34], + =RP72SD(19)[34],=RP72V(19)[34],=RP73DG(19)[34],=RP73SD(19)[34],=RP73V(19)[34],=RP74DG(19)[34], + =RP74SD(19)[34],=RP74V(19)[34],=RP75DG(19)[34],=RP75SD(19)[34],=RP75V(19)[34],=RP76DG(19)[34], + =RP76V(19)[34],=RU3BY/0(19)[34],=RU5D/0(19)[34],=RV1AW/0(19)[34],=RV3DSA/0(19)[34], + =RW22GO(19)[34],=RW3LG/0(19)[34],=RX15RX(19)[34],=RX20NY(19)[34],=RX21NY(19)[34],=RX30DX(19)[34], + =RX60YG(19)[34],=UA0SDX/0(19)[34],=UA0SIK/0(19)[34],=UA3AHA/0(19)[34],=UA4SBZ/0(19)[34], + =UA6MF/0(19)[34],=UA7R/0(19)[34],=UB0LAP/P(19)[34],=UC0LAF/P(19)[34],=UE1RFF/0(19)[34], + =UE70MA(19)[34],=UE75L(19)[34], + R0O(18)[32],RA0O(18)[32],RC0O(18)[32],RD0O(18)[32],RE0O(18)[32],RF0O(18)[32],RG0O(18)[32], + RJ0O(18)[32],RK0O(18)[32],RL0O(18)[32],RM0O(18)[32],RN0O(18)[32],RO0O(18)[32],RQ0O(18)[32], + RT0O(18)[32],RU0O(18)[32],RV0O(18)[32],RW0O(18)[32],RX0O(18)[32],RY0O(18)[32],RZ0O(18)[32], + U0O(18)[32],UA0O(18)[32],UB0O(18)[32],UC0O(18)[32],UD0O(18)[32],UE0O(18)[32],UF0O(18)[32], + UG0O(18)[32],UH0O(18)[32],UI0O(18)[32],=R100FNR(18)[32],=RA0CGI/0(18)[32],=RA9FTM/0(18)[32], + =RA9JJ/0(18)[32],=RK3RB/0(18)[32],=RK4HM/0(18)[32],=RU0UA/0(18)[32],=RV3ACA/0(18)[32], + =RW4CG/0(18)[32],=RW4CG/0/P(18)[32],=RZ5D/9(18)[32], + R0Q(19)[23],RA0Q(19)[23],RC0Q(19)[23],RD0Q(19)[23],RE0Q(19)[23],RF0Q(19)[23],RG0Q(19)[23], + RI0Q(19)[23],RJ0Q(19)[23],RK0Q(19)[23],RL0Q(19)[23],RM0Q(19)[23],RN0Q(19)[23],RO0Q(19)[23], + RQ0Q(19)[23],RT0Q(19)[23],RU0Q(19)[23],RV0Q(19)[23],RW0Q(19)[23],RX0Q(19)[23],RY0Q(19)[23], + RZ0Q(19)[23],U0Q(19)[23],UA0Q(19)[23],UB0Q(19)[23],UC0Q(19)[23],UD0Q(19)[23],UE0Q(19)[23], + UF0Q(19)[23],UG0Q(19)[23],UH0Q(19)[23],UI0Q(19)[23],=R0/UR8LV(19)[23],=R1ZBH/0(19)[23], + =R2DG/0(19)[23],=R3CA/0(19)[23],=R3CA/0/M(19)[23],=R3LA/0(19)[23],=R3RRC/0(19)[23], + =R4AK/0(19)[23],=R70ASIA(19)[23],=R73EPC/P(19)[23],=R9OOO/0(19)[23],=RA/DK2AI/0(19)[23], + =RA/UT5IA(19)[23],=RA0STT/0/M(19)[23],=RA6AEW/0(19)[23],=RA6UAH/0(19)[23],=RA9DA/0(19)[23], + =RD3QA/0(19)[23],=RF3A/0(19)[23],=RK6YYA/0/P(19)[23],=RN6LFF/0(19)[23],=RP0Q(19)[23], + =RP70AY(19)[23],=RP71AS(19)[23],=RT0Q(19)[23],=RW110RAEM(19)[23],=RW22WR(19)[23],=RZ3BY/0(19)[23], + =UA0SVD/0(19)[23],=UA1PBA/0(19)[23],=UA9CTT/0(19)[23],=UA9KW/0(19)[23],=UE60QA(19)[23], + =UE6MAC/0(19)[23], + R0R(18)[32],R0S(18)[32],R0T(18)[32],RA0R(18)[32],RA0S(18)[32],RA0T(18)[32],RC0R(18)[32], + RC0S(18)[32],RC0T(18)[32],RD0R(18)[32],RD0S(18)[32],RD0T(18)[32],RE0R(18)[32],RE0S(18)[32], + RE0T(18)[32],RF0R(18)[32],RF0S(18)[32],RF0T(18)[32],RG0R(18)[32],RG0S(18)[32],RG0T(18)[32], + RJ0R(18)[32],RJ0S(18)[32],RJ0T(18)[32],RK0R(18)[32],RK0S(18)[32],RK0T(18)[32],RL0R(18)[32], + RL0S(18)[32],RL0T(18)[32],RM0R(18)[32],RM0S(18)[32],RM0T(18)[32],RN0R(18)[32],RN0S(18)[32], + RN0T(18)[32],RO0R(18)[32],RO0S(18)[32],RO0T(18)[32],RQ0R(18)[32],RQ0S(18)[32],RQ0T(18)[32], + RT0R(18)[32],RT0S(18)[32],RT0T(18)[32],RU0R(18)[32],RU0S(18)[32],RU0T(18)[32],RV0R(18)[32], + RV0S(18)[32],RV0T(18)[32],RW0R(18)[32],RW0S(18)[32],RW0T(18)[32],RX0R(18)[32],RX0S(18)[32], + RX0T(18)[32],RY0R(18)[32],RY0S(18)[32],RY0T(18)[32],RZ0R(18)[32],RZ0S(18)[32],RZ0T(18)[32], + U0R(18)[32],U0S(18)[32],U0T(18)[32],UA0R(18)[32],UA0S(18)[32],UA0T(18)[32],UB0R(18)[32], + UB0S(18)[32],UB0T(18)[32],UC0R(18)[32],UC0S(18)[32],UC0T(18)[32],UD0R(18)[32],UD0S(18)[32], + UD0T(18)[32],UE0R(18)[32],UE0S(18)[32],UE0T(18)[32],UF0R(18)[32],UF0S(18)[32],UF0T(18)[32], + UG0R(18)[32],UG0S(18)[32],UG0T(18)[32],UH0R(18)[32],UH0S(18)[32],UH0T(18)[32],UI0R(18)[32], + UI0S(18)[32],UI0T(18)[32],=R11QRP/9(18)[32],=R150LA(18)[32],=R150LB(18)[32],=R18SWE(18)[32], + =R1BDD/0(18)[32],=R1BDD/0/P(18)[32],=R25ARCK/9(18)[32],=R3RRC/0/MM(18)[32],=RA0SP/RP(18)[32], + =RA0SR/RP(18)[32],=RA110RAEM(18)[32],=RA3TO/0(18)[32],=RA4CSX/0/P(18)[32],=RA9JG/0(18)[32], + =RA9JG/0/P(18)[32],=RA9OBG/0(18)[32],=RA9USU/8(18)[32],=RD0L/0(18)[32],=RK17CW(18)[32], + =RK9MZZ/0(18)[32],=RN4HIT/0(18)[32],=RP0S(18)[32],=RP0SXR(18)[32],=RP0SZZ(18)[32],=RP67ST(18)[32], + =RP70AB(18)[32],=RP72AB(18)[32],=RP73AB(18)[32],=RP74AB(18)[32],=RP75AB(18)[32],=RP76AB(18)[32], + =RQ0C/9(18)[32],=RV3ACA/0/M(18)[32],=RV6AJ/0(18)[32],=RV7AD/0(18)[32],=RV9JD/0(18)[32], + =RW4YA/0(18)[32],=RW4YA/9(18)[32],=RX3AT/0(18)[32],=RX3DFH/0(18)[32],=RX9WN/0(18)[32], + =RX9WN/0/M(18)[32],=RX9WN/0/P(18)[32],=RZ0SO/P(18)[32],=UA0KBG/0(18)[32],=UA0KBG/9(18)[32], + =UA3EDQ/0(18)[32],=UA3EDQ/0/MM(18)[32],=UA3EDQ/0/P(18)[32],=UA9MBK/0(18)[32],=UA9UAX/0(18)[32], + =UA9WOB/0(18)[32],=UA9WOB/0/P(18)[32],=UE105SBM(18)[32],=UE55IR(18)[32],=UE60SWA(18)[32], + =UE70SVV(18)[32],=UE80IR(18)[32],=UE80SBR(18)[32], + R0W(18)[31],RA0W(18)[31],RC0W(18)[31],RD0W(18)[31],RE0W(18)[31],RF0W(18)[31],RG0W(18)[31], + RJ0W(18)[31],RK0W(18)[31],RL0W(18)[31],RM0W(18)[31],RN0W(18)[31],RO0W(18)[31],RQ0W(18)[31], + RT0W(18)[31],RU0W(18)[31],RV0W(18)[31],RW0W(18)[31],RX0W(18)[31],RY0W(18)[31],RZ0W(18)[31], + U0W(18)[31],UA0W(18)[31],UB0W(18)[31],UC0W(18)[31],UD0W(18)[31],UE0W(18)[31],UF0W(18)[31], + UG0W(18)[31],UH0W(18)[31],UI0W(18)[31],=R01DTV/9(18)[31],=R10RTRS/0(18)[31],=R3YAB/9/P(18)[31], + =RA0AM/0(18)[31],=RP0W(18)[31],=RP0W/P(18)[31],=RP0WWS(18)[31],=RP70SL(18)[31],=RP72SL(18)[31], + =RV0AE/0/FF(18)[31],=RZ0AM/0(18)[31],=RZ22WW(18)[31],=UA0FCB/P(18)[31],=UA9UAX/0/M(18)[31], + =UE0ARD/0(18)[31],=UE10RFF/9(18)[31],=UE1RFF/0/P(18)[31],=UE9FDA/0(18)[31],=UE9FDA/0/M(18)[31], + =R205NEW(19)[25],=R23RRC(19)[25],=UA6HMC/0(19)[25], + R0Y(23)[32],RA0Y(23)[32],RC0Y(23)[32],RD0Y(23)[32],RE0Y(23)[32],RF0Y(23)[32],RG0Y(23)[32], + RJ0Y(23)[32],RK0Y(23)[32],RL0Y(23)[32],RM0Y(23)[32],RN0Y(23)[32],RO0Y(23)[32],RQ0Y(23)[32], + RT0Y(23)[32],RU0Y(23)[32],RV0Y(23)[32],RW0Y(23)[32],RX0Y(23)[32],RY0Y(23)[32],RZ0Y(23)[32], + U0Y(23)[32],UA0Y(23)[32],UB0Y(23)[32],UC0Y(23)[32],UD0Y(23)[32],UE0Y(23)[32],UF0Y(23)[32], + UG0Y(23)[32],UH0Y(23)[32],UI0Y(23)[32],=R0WX/P(23)[32],=R8MZ/0(23)[32],=R9OOO/9/M(23)[32], + =R9OOO/9/P(23)[32],=R9OY/9/P(23)[32],=RA0AJ/0/P(23)[32],=RA0WA/0/P(23)[32],=RA9YME/0(23)[32], + =RK3BY/0(23)[32],=RP0Y(23)[32],=RX0AE/0(23)[32],=RX0AT/0/P(23)[32],=UA0ADU/0(23)[32], + =UA0WGD/0(23)[32],=UA9ZZ/0/P(23)[32],=UE0OFF/0(23)[32],=UE44Y/9(23)[32],=UE70Y(23)[32], + R0X(19)[35],R0Z(19)[35],RA0X(19)[35],RA0Z(19)[35],RC0X(19)[35],RC0Z(19)[35],RD0X(19)[35], + RD0Z(19)[35],RE0X(19)[35],RE0Z(19)[35],RF0X(19)[35],RF0Z(19)[35],RG0X(19)[35],RG0Z(19)[35], + RI0X(19)[35],RI0Z(19)[35],RJ0X(19)[35],RJ0Z(19)[35],RK0X(19)[35],RK0Z(19)[35],RL0X(19)[35], + RL0Z(19)[35],RM0X(19)[35],RM0Z(19)[35],RN0X(19)[35],RN0Z(19)[35],RO0X(19)[35],RO0Z(19)[35], + RQ0X(19)[35],RQ0Z(19)[35],RT0X(19)[35],RT0Z(19)[35],RU0X(19)[35],RU0Z(19)[35],RV0X(19)[35], + RV0Z(19)[35],RW0X(19)[35],RW0Z(19)[35],RX0X(19)[35],RX0Z(19)[35],RY0X(19)[35],RY0Z(19)[35], + RZ0X(19)[35],RZ0Z(19)[35],U0X(19)[35],U0Z(19)[35],UA0X(19)[35],UA0Z(19)[35],UB0X(19)[35], + UB0Z(19)[35],UC0X(19)[35],UC0Z(19)[35],UD0X(19)[35],UD0Z(19)[35],UE0X(19)[35],UE0Z(19)[35], + UF0X(19)[35],UF0Z(19)[35],UG0X(19)[35],UG0Z(19)[35],UH0X(19)[35],UH0Z(19)[35],UI0X(19)[35], + UI0Z(19)[35],=R120RI(19)[35],=R6MG/0(19)[35],=R750X(19)[35],=RK1B/0(19)[35],=RM7C/0(19)[35], + =RN6HI/0(19)[35],=RN7G/0(19)[35],=RP0Z(19)[35],=RP0ZKD(19)[35],=RP68PK(19)[35],=RT22ZS(19)[35], + =RT9K/0(19)[35],=RV2FW/0(19)[35],=RX3F/0(19)[35],=RZ9O/0(19)[35],=UA3AAC/0(19)[35], + =UA3AKO/0(19)[35],=UA6ANU/0(19)[35],=UD6AOP/0(19)[35],=UE23RRC(19)[35],=UE23RRC/P(19)[35], + =UE3ATV/0(19)[35],=UE44V(19)[35], + R0U(18)[32],R0V(18)[32],RA0U(18)[32],RA0V(18)[32],RC0U(18)[32],RC0V(18)[32],RD0U(18)[32], + RD0V(18)[32],RE0U(18)[32],RE0V(18)[32],RF0U(18)[32],RF0V(18)[32],RG0U(18)[32],RG0V(18)[32], + RJ0U(18)[32],RJ0V(18)[32],RK0U(18)[32],RK0V(18)[32],RL0U(18)[32],RL0V(18)[32],RM0U(18)[32], + RM0V(18)[32],RN0U(18)[32],RN0V(18)[32],RO0U(18)[32],RO0V(18)[32],RQ0U(18)[32],RQ0V(18)[32], + RT0U(18)[32],RT0V(18)[32],RU0U(18)[32],RU0V(18)[32],RV0U(18)[32],RV0V(18)[32],RW0U(18)[32], + RW0V(18)[32],RX0U(18)[32],RX0V(18)[32],RY0U(18)[32],RY0V(18)[32],RZ0U(18)[32],RZ0V(18)[32], + U0U(18)[32],U0V(18)[32],UA0U(18)[32],UA0V(18)[32],UB0U(18)[32],UB0V(18)[32],UC0U(18)[32], + UC0V(18)[32],UD0U(18)[32],UD0V(18)[32],UE0U(18)[32],UE0V(18)[32],UF0U(18)[32],UF0V(18)[32], + UG0U(18)[32],UG0V(18)[32],UH0U(18)[32],UH0V(18)[32],UI0U(18)[32],UI0V(18)[32],=R120RQ(18)[32], + =R16FRA(18)[32],=R20RCK(18)[32],=R20RCK/0(18)[32],=R25ARCK(18)[32],=R30ARCK(18)[32], + =R70BP/0(18)[32],=R7AB/9(18)[32],=RA/UR5WT(18)[32],=RA77VV(18)[32],=RB110RAEM(18)[32], + =RK0AXC/0(18)[32],=RK0AXC/0/M(18)[32],=RK6YYA/0(18)[32],=RK6YYA/0/M(18)[32],=RN4CU/0(18)[32], + =RN4CU/0/P(18)[32],=RN9A/0(18)[32],=RP0UWZ(18)[32],=RP0UZF(18)[32],=RW0UM/0(18)[32], + =RZ19NY(18)[32],=UA3AKO/0/M(18)[32],=UE15UWC(18)[32],=UE70UVV(18)[32],=UE70UWW(18)[32], + =UE75VV(18)[32]; +Uzbekistan: 17: 30: AS: 41.40: -63.97: -5.0: UK: + UJ,UK,UL,UM,=U8AG,=U8AH,=U8AI,=UK/DF3DS/Z; +Kazakhstan: 17: 30: AS: 48.17: -65.18: -5.0: UN: + UN,UO,UP,UQ,=R55SAT,=RG50SK,=U7GL,=UN7ECA/FF,=UN7EDG/FF,=UN7LAN/A/FF,=UN9LU/A/FF, + UN0F[31],UN2F[31],UN3F[31],UN4F[31],UN5F[31],UN6F[31],UN7F[31],UN8F[31],UN9F[31],UO0F[31], + UO1F[31],UO2F[31],UO3F[31],UO4F[31],UO5F[31],UO6F[31],UO7F[31],UO8F[31],UO9F[31],UP0F[31], + UP1F[31],UP2F[31],UP3F[31],UP4F[31],UP5F[31],UP6F[31],UP7F[31],UP8F[31],UP9F[31],UQ0F[31], + UQ1F[31],UQ2F[31],UQ3F[31],UQ4F[31],UQ5F[31],UQ6F[31],UQ7F[31],UQ8F[31],UQ9F[31], + UN0G[31],UN2G[31],UN3G[31],UN4G[31],UN5G[31],UN6G[31],UN7G[31],UN8G[31],UN9G[31],UO0G[31], + UO1G[31],UO2G[31],UO3G[31],UO4G[31],UO5G[31],UO6G[31],UO7G[31],UO8G[31],UO9G[31],UP0G[31], + UP1G[31],UP2G[31],UP3G[31],UP4G[31],UP5G[31],UP6G[31],UP7G[31],UP8G[31],UP9G[31],UQ0G[31], + UQ1G[31],UQ2G[31],UQ3G[31],UQ4G[31],UQ5G[31],UQ6G[31],UQ7G[31],UQ8G[31],UQ9G[31], + UN0J[31],UN2J[31],UN3J[31],UN4J[31],UN5J[31],UN6J[31],UN7J[31],UN8J[31],UN9J[31],UO0J[31], + UO1J[31],UO2J[31],UO3J[31],UO4J[31],UO5J[31],UO6J[31],UO7J[31],UO8J[31],UO9J[31],UP0J[31], + UP1J[31],UP2J[31],UP3J[31],UP4J[31],UP5J[31],UP6J[31],UP7J[31],UP8J[31],UP9J[31],UQ0J[31], + UQ1J[31],UQ2J[31],UQ3J[31],UQ4J[31],UQ5J[31],UQ6J[31],UQ7J[31],UQ8J[31],UQ9J[31], + =R50KEDR,=R50SK,=R50YG, + UN0Q[31],UN2Q[31],UN3Q[31],UN4Q[31],UN5Q[31],UN6Q[31],UN7Q[31],UN8Q[31],UN9Q[31],UO0Q[31], + UO1Q[31],UO2Q[31],UO3Q[31],UO4Q[31],UO5Q[31],UO6Q[31],UO7Q[31],UO8Q[31],UO9Q[31],UP0Q[31], + UP1Q[31],UP2Q[31],UP3Q[31],UP4Q[31],UP5Q[31],UP6Q[31],UP7Q[31],UP8Q[31],UP9Q[31],UQ0Q[31], + UQ1Q[31],UQ2Q[31],UQ3Q[31],UQ4Q[31],UQ5Q[31],UQ6Q[31],UQ7Q[31],UQ8Q[31],UQ9Q[31], + =R80KEDR; +Ukraine: 16: 29: EU: 50.00: -30.00: -2.0: UR: + EM,EN,EO,U5,UR,US,UT,UU,UV,UW,UX,UY,UZ,=KT5X/US0Q,=UR3IDD/MM(15), + =UU9CW/LH, + =UT2EE/YL,=UY5EI/LH, + =UR5FCZ/LGT,=UR5FOG/YL,=UT2FA/LH,=UT5FA/MM(9), + =UR6GWZ/YL,=UR7GO/LH,=UR7GO/P/LH,=UR7GW/LH,=UR7GW/P/LH,=US0GA/P/LH,=UW1GZ/LH,=UW1GZ/P/LH, + =UX2HR/FF,=UY5HC/LH,=UY5HF/LH, + =UR8IDX/A/LH,=US8IB/LH,=US8ICM/LH,=US8IM/LH,=UT/RA9JP/LH,=UT4IYZ/FF,=UT8IA/LH,=UT8IO/A/LH, + =UT8IO/P/LH,=UT8IV/LH,=UX2IJ/FF,=UX2IQ/P/LH,=UX8IX/LH, + =UU4JO/LH,=UU9JWM/LH, + =R200A,=UU4JWM/LGT,=UU4JWM/LH,=UU6JJ/LH,=UU7JF/LH, + =UR5KCC/WAP,=UR5KGG/WAP,=UT1KY/AAW,=UT1KY/WAP,=UT5KDS/YL, + =UR4LJ/LH,=UR4UC/LH,=UR8LV/WAP,=UR9LD/P/LH,=UT2LF/LH, + =UT1ML/LH, + =EM3QLH/LH,=UR4QI/M/LH,=UR4QKI/M/LH, + =EM0UBC/FF,=US5UCC/LH,=UT5UIA/P/LH,=UT7UA/WAP, + =UR4VWN/J, + =UR2XO/WAP, + =UR5ZVJ/LH; +Antigua & Barbuda: 08: 11: NA: 17.07: 61.80: 4.0: V2: + V2; +Belize: 07: 11: NA: 16.97: 88.67: 6.0: V3: + V3; +St. Kitts & Nevis: 08: 11: NA: 17.37: 62.78: 4.0: V4: + V4; +Namibia: 38: 57: AF: -22.00: -17.00: -1.0: V5: + V5,=V51AS/L,=V51NAM/L,=V51NAM/LH,=V51WW/L,=V51WW/LH,=V55V/LH,=V59PP/L,=V59SWK/L,=V59SWK/LH; +Micronesia: 27: 65: OC: 6.88: -158.20: -10.0: V6: + V6,=V63JQ/C,=V63JQ/K,=V63JY/C,=V63JY/K,=V63OP/C,=V63OP/K,=V63VE/C,=V63VE/K; +Marshall Islands: 31: 65: OC: 9.08: -167.33: -12.0: V7: + V7; +Brunei Darussalam: 28: 54: OC: 4.50: -114.60: -8.0: V8: + V8; +Canada: 05: 09: NA: 44.35: 78.75: 5.0: VE: + CF,CG,CJ,CK,VA,VB,VC,VE,VG,VX,VY9,XL,XM,=VE2EM/M,=VER20210421, + =CF7AAW/1,=CK7IG/1,=VA3QSL/1,=VA3WR/1,=VE1REC/LH,=VE1REC/M/LH,=VE3RSA/1,=VE7IG/1, + CF2[4],CG2[4],CJ2[4],CK2[4],VA2[4],VB2[4],VC2[4],VE2[4],VG2[4],VX2[4],XL2[4],XM2[4],=4Y1CAO[4], + =CY2ZT/2[4],=VA3MPM/2[4],=VA7AQ/P[4],=VE2/G3ZAY/P[4],=VE2/M0BLF/P[4],=VE2FK[9],=VE2HAY/P[4], + =VE2KK[9],=VE2MAM/P[4],=VE2OV/P[4],=VE3AP/2[4],=VE3EXY/2[4],=VE3GF/2[4],=VE3GNO/2[4],=VE3IAC/2[4], + =VE3ZZ/2[4],=VE6TC/2[4],=VE7IG/2[4],=XO0ICE/2[4], + CF3(4)[4],CG3(4)[4],CJ3(4)[4],CK3(4)[4],VA3(4)[4],VB3(4)[4],VC3(4)[4],VE3(4)[4],VG3(4)[4], + VX3(4)[4],XL3(4)[4],XM3(4)[4],=CF7EWK/3(4)[4],=CI0XN/P(4)[4],=CJ7EWK/3(4)[4],=VA7EWK/3(4)[4], + =VE1RM/3(4)[4],=VE2AEJ/3(4)[4],=VE2MAM/3(4)[4],=VE2MW/3(4)[4],=VE2PK/3(4)[4],=VE2QLF/3(4)[4], + =VE2QV/3(4)[4],=VE2XB/3(4)[4],=VE2XZ/3(4)[4],=VE2ZQ/3(4)[4],=VE7APF/3(4)[4],=VE8HI/3(4)[4], + =VX9GHD(4)[4],=VX9GHQ(4)[4],=VX9GLC(4)[4],=VX9GLI(4)[4],=VX9SHA(4)[4],=VY2MGY/3(4)[4], + =XK0XN(4)[4],=XK0XN/P(4)[4],=XO0XN(4)[4],=XO0XN/P(4)[4], + CF4(4)[3],CG4(4)[3],CJ4(4)[3],CK4(4)[3],VA4(4)[3],VB4(4)[3],VC4(4)[3],VE4(4)[3],VG4(4)[3], + VX4(4)[3],XL4(4)[3],XM4(4)[3],=VA7MPG/4(4)[3],=VE1RM/4(4)[3], + CF5(4)[3],CG5(4)[3],CJ5(4)[3],CK5(4)[3],VA5(4)[3],VB5(4)[3],VC5(4)[3],VE5(4)[3],VG5(4)[3], + VX5(4)[3],XL5(4)[3],XM5(4)[3],=VE1CZ/5(4)[3],=VE7LSE/5(4)[3],=VE7XF/5(4)[3],=VE7XF/6(4)[3], + =VE9TEN/5(4)[3],=VY0AA(4)[3],=VY0DXA(4)[3],=VY0PW(4)[3], + CF6(4)[2],CG6(4)[2],CJ6(4)[2],CK6(4)[2],VA6(4)[2],VB6(4)[2],VC6(4)[2],VE6(4)[2],VG6(4)[2], + VX6(4)[2],XL6(4)[2],XM6(4)[2],=VE7HII/6(4)[2],=VE9XX/6(4)[2],=VY0XYL/6(4)[2], + CF7(3)[2],CG7(3)[2],CJ7(3)[2],CK7(3)[2],VA7(3)[2],VB7(3)[2],VC7(3)[2],VE7(3)[2],VG7(3)[2], + VX7(3)[2],XL7(3)[2],XM7(3)[2],=CY7DP(3)[2],=VA6FUN/7(3)[2],=VA6SS/7(3)[2],=VE3AX/7(3)[2], + =VE3DO/7(3)[2],=VE3IKV/7(3)[2],=VE3LLV/7(3)[2],=VE3RSA/7(3)[2],=VE5DX/7(3)[2],=VE6100EMP/7(3)[2], + =VE6BIR/7(3)[2],=VE6EZ/7(3)[2],=VE6LK/7(3)[2],=VE6ZC/7(3)[2],=VX9GJD(3)[2], + CF8(1)[3],CG8(1)[3],CJ8(1)[3],CK8(1)[3],VA8(1)[3],VB8(1)[3],VC8(1)[3],VE8(1)[3],VG8(1)[3], + VX8(1)[3],XL8(1)[3],XM8(1)[3],=VY0M(1)[3], + =VE7IG/9,=VO2DX/9, + CH1,CY1,VD1,VO1,XJ1,XN1,=VO1BRK/L,=VO1VON/LH, + CH2(2),CY2(2),VD2(2),VO2(2),XJ2(2),XN2(2),=VO/DL2GF(2),=VO/DL2GF/P(2), + CI0(2)[4],CZ0(2)[4],VF0(2)[4],VY0(2)[4],XK0(2)[4],XO0(2)[4],=CG2NNX/P(2)[4],=VE0NWP(2)[4], + =VE8FS(2)[4],=VF0X/M(2)[4], + CI1(1)[2],CZ1(1)[2],VF1(1)[2],VY1(1)[2],XK1(1)[2],XO1(1)[2], + CI2,CZ2,VF2,VY2,XK2,XO2, + =CF2RC(2)[4],=CF2VVV(2)[4],=CJ2BY(2)[4],=CJ2KCE(2)[4],=K3FMQ/VE2(2)[4],=K5YG/VE2(2)[4], + =KD3RF/VE2(2)[4],=KD3TB/VE2(2)[4],=N5ZO/VE2(2)[4],=VA1CN/2(2)[4],=VA2BK(2)[4],=VA2BY(2)[4], + =VA2KCE(2)[4],=VA2MCJ/VE2(2)[4],=VA2RAG(2)[4],=VA2VFT(2)[4],=VA2VVV(2)[4],=VA3ELE/2(2)[4], + =VA3NA/2(2)[4],=VB2C(2)[4],=VB2R(2)[4],=VB2T(2)[4],=VB2V(2)[4],=VB2W(2)[4],=VC2C(2)[4], + =VC2EME(2)[4],=VC2Q(2)[4],=VC2R(2)[4],=VC2X(2)[4],=VC3W/2(2)[4],=VE2/JA8BMK(2)[4],=VE2/K5YG(2)[4], + =VE2/KD3RF(2)[4],=VE2/KD3RF/M(2)[4],=VE2/N1NK(2)[4],=VE2/UT3UA(2)[4],=VE2/W2NTJ(2)[4], + =VE2/W5GED(2)[4],=VE2A(2)[4],=VE2ACP/P(2)[4],=VE2AE(2)[4],=VE2CSI(2)[4],=VE2CVI(2)[4], + =VE2DXY(2)[4],=VE2EKA(2)[4],=VE2FDJ/2(2)[4],=VE2GHZ/2(2)[4],=VE2GT/150(2)[4],=VE2HRI(2)[4], + =VE2IDX(2)[4],=VE2III(2)[4],=VE2IM(2)[4],=VE2NN(2)[4],=VE2OTT(2)[4],=VE2PRG(2)[4],=VE2QIP/2(2)[4], + =VE2TKH(2)[4],=VE2TWO(2)[4],=VE2WDX(2)[4],=VE2XAA/2(2)[4],=VE2XB/2(2)[4],=VE2Z(2)[4], + =VE3AXC/2(2)[4],=VE3CWU/2(2)[4],=VE3EY/2(2)[4],=VE3FDX/2(2)[4],=VE3JM/2(2)[4],=VE3NE/2(2)[4], + =VE3NWA/2(2)[4],=VE3RHJ/2(2)[4],=VE3ZF/2(2)[4],=VE7ACN/VE2(2)[4],=VE7MID/VE2(2)[4],=VE8DX/2(2)[4], + =VY2NA/VE2(2)[4],=W0SD/VE2(2)[4],=W2NTJ/VE2(2)[4],=W4TMO/VE2(2)[4],=W5GED/VE2(2)[4], + =WB8YTZ/VE2(2)[4],=XM3NE/2(2)[4], + =K8JJ/VY0(4)[4],=K9AJ/VY0(4)[4],=KD6WW/VY0(4)[4],=VY0A(4)[4],=VY0V(4)[4]; +Australia: 30: 59: OC: -23.70: -132.33: -10.0: VK: + AX,VH,VI,VJ,VK,VL,VM,VN,VZ,=VK9MAV, + =VK6MB/1, + =AX2000/IMD,=AX2000/LH,=VI90IARU,=VK2IO/8,=VK6AV/2,=VK6AXB/2,=VK6DXI/2,=VK6MB/2,=VK6YB/2, + =VK6ZOA/2,=VK8GMT/2,=VK9LX/2, + =AX8AA,=VK3DK/LH,=VK6FMON/3,=VK6JON/3,=VK6MB/3,=VK6NX/3,=VK6SX/3,=VK9LA/3,=VK9ZLH/3, + AX4[55],VH4[55],VI4[55],VJ4[55],VK4[55],VL4[55],VM4[55],VN4[55],VZ4[55],=VK100WIA[55], + =VK4MM/LH[55],=VK4WIA/HQ[55],=VK5MAV/9[55],=VK65PFA[55],=VK6AV/4[55],=VK6CN/4[55],=VK6DW/4[55], + =VK6DXI/4[55],=VK6JON/4[55],=VK6KM/4[55],=VK6LC/4[55],=VK6MB/5[55],=VK6NAI/4[55],=VK6ZN/4[55], + =VK8FUNN/4[55],=VK8GM/4[55],=VK8RC/4[55],=VK9MAV/4[55], + =VK60LZ,=VK6ANZ/4,=VK6DW/5,=VK6GIO/5,=VK6GZ/5,=VK6JON/5,=VK6LB/5,=VK6ZG/5,=VK6ZN/5, + AX6(29)[58],VH6(29)[58],VI6(29)[58],VJ6(29)[58],VK6(29)[58],VL6(29)[58],VM6(29)[58],VN6(29)[58], + VZ6(29)[58],=VI103WIA(29)[58],=VI5RAS/6(29)[58],=VI90ANZAC(29)[58],=VK1FOC/6(29)[58], + =VK1LAJ/6(29)[58],=VK2015TDF(29)[58],=VK2BAA/6(29)[58],=VK2CV/6(29)[58],=VK2FDU/6(29)[58], + =VK2IA/6(29)[58],=VK2RAS/6(29)[58],=VK3DP/6(29)[58],=VK3DXI/6(29)[58],=VK3FM/6(29)[58], + =VK3FPF/6(29)[58],=VK3FPIL/6(29)[58],=VK3JBL/6(29)[58],=VK3KG/6(29)[58],=VK3MCD/6(29)[58], + =VK3NUT/6(29)[58],=VK3OHM/6(29)[58],=VK3TWO/6(29)[58],=VK3YQS/6(29)[58],=VK3ZK/6(29)[58], + =VK4FDJL/6(29)[58],=VK4IXU/6(29)[58],=VK4JWG/6(29)[58],=VK4NAI/6(29)[58],=VK4NH/6(29)[58], + =VK4SN/6(29)[58],=VK4VXX/6(29)[58],=VK5CC/6(29)[58],=VK5CE/6(29)[58],=VK5CE/9(29)[58], + =VK5FLEA/6(29)[58],=VK5FMAZ/6(29)[58],=VK5HYZ/6(29)[58],=VK5MAV/6(29)[58],=VK5NHG/6(29)[58], + =VK5PAS/6(29)[58],=VK6BV/AF(29)[58],=VK9AR(29)[58],=VK9AR/6(29)[58],=VK9ZLH/6(29)[58], + =VK6JON/7,=VK6KSJ/7,=VK6ZN/7,=VK7NWT/LH,=VK8XX/7, + AX8(29)[55],VH8(29)[55],VI8(29)[55],VJ8(29)[55],VK8(29)[55],VL8(29)[55],VM8(29)[55],VN8(29)[55], + VZ8(29)[55],=VI100AF(29)[55],=VI5RAS/8(29)[55],=VK100AF(29)[55],=VK1AHS/8(29)[55], + =VK1FOC/8(29)[55],=VK2CBD/8(29)[55],=VK2CR/8(29)[55],=VK2GR/8(29)[55],=VK2ZK/8(29)[55], + =VK3BYD/8(29)[55],=VK3DHI/8(29)[55],=VK3QB/8(29)[55],=VK3SN/8(29)[55],=VK3ZK/8(29)[55], + =VK4EMS/8(29)[55],=VK4FOC/8(29)[55],=VK4HDG/8(29)[55],=VK4KC/8(29)[55],=VK4VXX/8(29)[55], + =VK4WWI/8(29)[55],=VK5BC/8(29)[55],=VK5CE/8(29)[55],=VK5HSX/8(29)[55],=VK5MAV/8(29)[55], + =VK5UK/8(29)[55],=VK5WTF/8(29)[55],=VK8HLF/J(29)[55]; +Heard Island: 39: 68: AF: -53.08: -73.50: -5.0: VK0H: + =VK0/K2ARB,=VK0EK,=VK0LD; +Macquarie Island: 30: 60: OC: -54.60: -158.88: -10.0: VK0M: + =AX/VK0TH,=AX0LD,=AX0MQI,=AX0MT,=AX0TH,=VK0AI,=VK0AVT,=VK0KEV,=VK0M/ZL4DB/P,=VK0MM,=VK0MQI,=VK0MT, + =VK0TH,=ZL4DB/P/VK0M; +Cocos (Keeling) Islands: 29: 54: OC: -12.15: -96.82: -6.5: VK9C: + AX9C,AX9Y,VH9C,VH9Y,VI9C,VI9Y,VJ9C,VJ9Y,VK9C,VK9FC,VK9KC,VK9Y,VK9ZY,VL9C,VL9Y,VM9C,VM9Y,VN9C,VN9Y, + VZ9C,VZ9Y,=VK6XL/9,=VK8RR/9,=VK9/LB1GB,=VK9AW,=VK9EC,=VK9FISH; +Lord Howe Island: 30: 60: OC: -31.55: -159.08: -10.5: VK9L: + AX9L,VH9L,VI9L,VJ9L,VK9FL,VK9L,VK9ZL,VL9L,VM9L,VN9L,VZ9L,=VK2GEL/9,=VK2IAY/9,=VK3AFW/9,=VK3TKB/9, + =VK3YQS/9,=VK3YQS/VK9,=VK5CP/9,=VK9/OG1M,=VK9/OH1VR,=VK9/OH3JR,=VK9/OH3X,=VK9ALH,=VK9APX,=VK9CLF, + =VK9DJ,=VK9DLX,=VK9EHH,=VK9GLX,=VK9HR,=VK9IR,=VK9OL,=VK9PN,=VK9YL; +Mellish Reef: 30: 56: OC: -17.40: -155.85: -10.0: VK9M: + AX9M,VH9M,VI9M,VJ9M,VK9M,VL9M,VM9M,VN9M,VZ9M,=VK9GMW; +Norfolk Island: 32: 60: OC: -29.03: -167.93: -11.5: VK9N: + AX9,VH9,VI9,VJ9,VK9,VL9,VM9,VN9,VZ9,=AX9YL,=VK2ACC/9,=VK2CA/9,=VK2FBBB/9,=VK2XSE/9,=VK3CBV/9, + =VK3GK/9,=VK3PF/9,=VK3QB/9,=VK3TWO/9,=VK3YB/9,=VK4FSCC/9,=VK4HNS/9,=VK5FMAZ/9,=VK6FMON/9,=VK9CNC, + =VK9CNF,=VK9LX/9,=VK9WI,=VK9XIC; +Willis Island: 30: 55: OC: -16.22: -150.02: -10.0: VK9W: + AX9W,AX9Z,VH9W,VH9Z,VI9W,VI9Z,VJ9W,VJ9Z,VK9FW,VK9W,VK9Z,VL9W,VL9Z,VM9W,VM9Z,VN9W,VN9Z,VZ9W,VZ9Z, + =VK9DWX; +Christmas Island: 29: 54: OC: -10.48: -105.63: -7.0: VK9X: + AX9X,VH9X,VI9X,VJ9X,VK9FX,VK9KX,VK9X,VL9X,VM9X,VN9X,VZ9X,=VI9PEACE,=VK3FY/9,=VK3HEX/9,=VK9AA, + =VK9AN,=VK9ARH,=VK9ARH/P,=VK9EX,=VK9JD,=VK9VKL; +Anguilla: 08: 11: NA: 18.23: 63.00: 4.0: VP2E: + VP2E; +Montserrat: 08: 11: NA: 16.75: 62.18: 4.0: VP2M: + VP2M; +British Virgin Islands: 08: 11: NA: 18.33: 64.75: 4.0: VP2V: + VP2V; +Turks & Caicos Islands: 08: 11: NA: 21.77: 71.75: 5.0: VP5: + VP5,VQ5; +Pitcairn Island: 32: 63: OC: -25.07: 130.10: 8.0: VP6: + VP6; +Ducie Island: 32: 63: OC: -24.70: 124.80: 8.0: VP6/d: + =VP6D,=VP6DI,=VP6DIA,=VP6DX,=VP6UU,=VP6UU/VP6D; +Falkland Islands: 13: 16: SA: -51.63: 58.72: 4.0: VP8: + VP8; +South Georgia Island: 13: 73: SA: -54.48: 37.08: 2.0: VP8/g: + =VP8CA,=VP8CKB,=VP8DIF,=VP8DKX,=VP8DOZ,=VP8GEO,=VP8GI,=VP8SGB,=VP8SGI,=VP8SGK; +South Shetland Islands: 13: 73: SA: -62.08: 58.67: 4.0: VP8/h: + CE9,XR9,=BY/R1ANF,=CA8WCI/9,=CV0A,=D88S,=DP1ANF,=DT8A,=EA/FT5YK,=EA/FT5YK/P,=EA1CYK/P,=EA1CYK/VP8, + =EA4FZR,=EA4FZR/P,=ED3RKL,=HC/FT5YK,=HF0/R1ANF,=HF0ANT,=HF0APAS,=HF0ARC,=HF0POL,=HF0POL/LH,=HF0QF, + =HL0KSJ,=HL8KSJ,=I1SR,=KC4/HF0POL,=LU/R1ANF,=LU1ZC,=LU1ZI,=LU1ZI/HF0POL,=LU1ZS,=LU4AA/Z,=LU4CJM/Z, + =LU8DIP/Z,=LW8DOH/Z,=LZ0A,=OA0/FT5YJ,=OA0MP,=OL0ANT,=R1/HF0POL,=R1ANF,=R1ANF/A,=R1ANF/B, + =R1ANF/HF0POL,=R1ANF/MM,=R1ANF/P,=R1ANF/VP8,=R1ANY,=RI1ANB,=RI1ANF,=RI1ANF/B,=RI1ANF/FF,=RI1ANF/P, + =RI1ANO,=RI1ANU,=RI20ANT,=RI44ANT,=RI50ANO,=RI59ANT,=VP8/EA1CYK,=VP8/EA1CYK/P,=VP8/LZ1UQ, + =VP8/LZ2UU,=VP8DJK,=ZX0ECF,=ZX0GTI; +South Orkney Islands: 13: 73: SA: -60.60: 45.55: 3.0: VP8/o: + =AY1ZA,=LU1ZA,=LU2ERA/Z,=LU3DO/Z,=LU4ZD,=LW1ZA,=VP8ORK,=VP8PIG,=VP8PJ,=VP8SIG; +South Sandwich Islands: 13: 73: SA: -58.43: 26.33: 2.0: VP8/s: + =VP8STI,=VP8THU; +Bermuda: 05: 11: NA: 32.32: 64.73: 4.0: VP9: + VP9,=VP400BO,=VP9400/HW; +Chagos Islands: 39: 41: AF: -7.32: -72.42: -6.0: VQ9: + VQ9; +Hong Kong China: 24: 44: AS: 22.28: -114.18: -8.0: VR: + VR; +India: 22: 41: AS: 22.50: -77.58: -5.5: VU: + 8T,8U,8V,8W,8X,8Y,AT,AU,AV,AW,VT,VU,VV,VW,=AT16BSG/BL,=AT16BSG/JMA,=AT16BSG/JOS,=AT16BSG/LMS, + =AT16BSG/MCW,=AT16BSG/MY,=AT16BSG/MYH,=AT16BSG/RAT,=AT16BSG/RBI,=AT16BSG/SD,=AT16BSG/YAM, + =VU2ARC/FD,=VU2BGS/L,=VU2CBE/KNK,=VU2CDP/F1,=VU2LCI/L,=VU2PAI/F1,=VU2PAI/OK7MT,=VU2SWS/F1, + =VU2TS/FF,=VU2UR/F1,=VU2UR/FF,=VU2WAP/DL7BC,=VU3DJQ/F1,=VU3VOC/F1,=VU4SEA; +Andaman & Nicobar Is.: 26: 49: AS: 12.37: -92.78: -5.5: VU4: + VU4,=VU3VPX,=VU3VPY,=VU4AN/RBI,=VU4RBI/DBP,=VU4RBI/DVS; +Lakshadweep Islands: 22: 41: AS: 11.23: -72.78: -5.5: VU7: + VU7,=VU3EBX,=VU7MY/JOS,=VU7MY/RBI; +Mexico: 06: 10: NA: 21.32: 100.23: 6.0: XE: + 4A,4B,4C,6D,6E,6F,6G,6H,6I,6J,XA,XB,XC,XD,XE,XF,XG,XH,XI,=N5ZO/MM, + =XE3MAYA/C,=XE3MAYA/D,=XE3MAYA/E,=XE3MAYA/T,=XE3MAYA/X; +Revillagigedo: 06: 10: NA: 18.77: 110.97: 7.0: XF4: + 4A4,4B4,4C4,6D4,6E4,6F4,6G4,6H4,6I4,6J4,XA4,XB4,XC4,XD4,XE4,XF4,XG4,XH4,XI4; +Burkina Faso: 35: 46: AF: 12.00: 2.00: 0.0: XT: + XT; +Cambodia: 26: 49: AS: 12.93: -105.13: -7.0: XU: + XU; +Laos: 26: 49: AS: 18.20: -104.55: -7.0: XW: + XW,=XW8KPL/RU3DX; +Macao: 24: 44: AS: 22.10: -113.50: -8.0: XX9: + XX9; +Myanmar: 26: 49: AS: 20.00: -96.37: -6.5: XZ: + XY,XZ; +Afghanistan: 21: 40: AS: 34.70: -65.80: -4.5: YA: + T6,YA; +Indonesia: 28: 51: OC: -7.30: -109.88: -7.0: YB: + 7A,7B,7C,7D,7E,7F,7G,7H,7I,8A,8B,8C,8D,8E,8F,8G,8H,8I,PK,PL,PM,PN,PO,YB,YC,YD,YE,YF,YG,YH, + 7A0[54],7B0[54],7C0[54],7D0[54],7E0[54],7F0[54],7G0[54],7H0[54],7I0[54],8A0[54],8B0[54],8C0[54], + 8D0[54],8E0[54],8F0[54],8G0[54],8H0[54],8I0[54],YB0[54],YC0[54],YD0[54],YE0[54],YF0[54],YG0[54], + YH0[54],=YB0AI/LH[54],=YC0LND/YL[54], + 7A1[54],7B1[54],7C1[54],7D1[54],7E1[54],7F1[54],7G1[54],7H1[54],7I1[54],8A1[54],8B1[54],8C1[54], + 8D1[54],8E1[54],8F1[54],8G1[54],8H1[54],8I1[54],YB1[54],YC1[54],YD1[54],YE1[54],YF1[54],YG1[54], + YH1[54],=YB1LGP/YL[54],=YC1BWA/YL[54],=YC1CVA/YL[54],=YD1BZW/YL[54],=YD1MKQ/YL[54],=YD1NAA/YL[54], + 7A2[54],7B2[54],7C2[54],7D2[54],7E2[54],7F2[54],7G2[54],7H2[54],7I2[54],8A2[54],8B2[54],8C2[54], + 8D2[54],8E2[54],8F2[54],8G2[54],8H2[54],8I2[54],YB2[54],YC2[54],YD2[54],YE2[54],YF2[54],YG2[54], + YH2[54], + 7A3[54],7B3[54],7C3[54],7D3[54],7E3[54],7F3[54],7G3[54],7H3[54],7I3[54],8A3[54],8B3[54],8C3[54], + 8D3[54],8E3[54],8F3[54],8G3[54],8H3[54],8I3[54],YB3[54],YC3[54],YD3[54],YE3[54],YF3[54],YG3[54], + YH3[54], + 7A4[54],7B4[54],7C4[54],7D4[54],7E4[54],7F4[54],7G4[54],7H4[54],7I4[54],8A4[54],8B4[54],8C4[54], + 8D4[54],8E4[54],8F4[54],8G4[54],8H4[54],8I4[54],YB4[54],YC4[54],YD4[54],YE4[54],YF4[54],YG4[54], + YH4[54], + 7A5[54],7B5[54],7C5[54],7D5[54],7E5[54],7F5[54],7G5[54],7H5[54],7I5[54],8A5[54],8B5[54],8C5[54], + 8D5[54],8E5[54],8F5[54],8G5[54],8H5[54],8I5[54],YB5[54],YC5[54],YD5[54],YE5[54],YF5[54],YG5[54], + YH5[54], + 7A6[54],7B6[54],7C6[54],7D6[54],7E6[54],7F6[54],7G6[54],7H6[54],7I6[54],8A6[54],8B6[54],8C6[54], + 8D6[54],8E6[54],8F6[54],8G6[54],8H6[54],8I6[54],YB6[54],YC6[54],YD6[54],YE6[54],YF6[54],YG6[54], + YH6[54], + 7A7[54],7B7[54],7C7[54],7D7[54],7E7[54],7F7[54],7G7[54],7H7[54],7I7[54],8A7[54],8B7[54],8C7[54], + 8D7[54],8E7[54],8F7[54],8G7[54],8H7[54],8I7[54],YB7[54],YC7[54],YD7[54],YE7[54],YF7[54],YG7[54], + YH7[54], + 7A8[54],7B8[54],7C8[54],7D8[54],7E8[54],7F8[54],7G8[54],7H8[54],7I8[54],8A8[54],8B8[54],8C8[54], + 8D8[54],8E8[54],8F8[54],8G8[54],8H8[54],8I8[54],YB8[54],YC8[54],YD8[54],YE8[54],YF8[54],YG8[54], + YH8[54]; +Iraq: 21: 39: AS: 33.92: -42.78: -3.0: YI: + HN,YI,=K4CY/M,=YI1IRQ/ND; +Vanuatu: 32: 56: OC: -17.67: -168.38: -11.0: YJ: + YJ; +Syria: 20: 39: AS: 35.38: -38.20: -2.0: YK: + 6C,YK; +Latvia: 15: 29: EU: 57.03: -24.65: -2.0: YL: + YL,=YL0A/LH,=YL0WFF/LH,=YL1A/LH,=YL2AG/ANT,=YL2SW/MM(21),=YL3AD/LGT,=YL3BF/LH,=YL3BU/LH,=YL3FT/LH, + =YL3FT/P/LH,=YL3GED/LH,=YL3JD/LH; +Nicaragua: 07: 11: NA: 12.88: 85.05: 6.0: YN: + H6,H7,HT,YN; +Romania: 20: 28: EU: 45.78: -24.70: -2.0: YO: + YO,YP,YQ,YR, + =YO3FRI/YL, + =YO4ASG/LH,=YO4BBH/LH,=YO4GDP/LH,=YO4GJS/LH; +El Salvador: 07: 11: NA: 14.00: 89.00: 6.0: YS: + HU,YS; +Serbia: 15: 28: EU: 44.00: -21.00: -1.0: YU: + YT,YU,=4O0A,=4O5W,=4O5Z,=4U/DA1KY,=YT1S/J,=YT2A/LGT,=YT2A/LH,=YU/IZ1VUC/LH,=YU1BBA/J,=YU1CA/LH, + =YU1FW/LH,=YU1JF/LH,=YU7RQ/FAIR; +Venezuela: 09: 12: SA: 8.00: 66.00: 4.5: YV: + 4M,YV,YW,YX,YY; +Aves Island: 08: 11: NA: 15.67: 63.60: 4.0: YV0: + 4M0,YV0,YW0,YX0,YY0; +Zimbabwe: 38: 53: AF: -18.00: -31.00: -2.0: Z2: + Z2,=Z21KD/L,=Z27JAM/J; +North Macedonia: 15: 28: EU: 41.60: -21.65: -1.0: Z3: + Z3; +Republic of Kosovo: 15: 28: EU: 42.67: -21.17: -1.0: Z6: + Z6; +Republic of South Sudan: 34: 48: AF: 4.85: -31.60: -3.0: Z8: + Z8,=ST0R; +Albania: 15: 28: EU: 41.00: -20.00: -1.0: ZA: + ZA; +Gibraltar: 14: 37: EU: 36.15: 5.37: -1.0: ZB: + ZB,ZG,=ZB2LGT/LH; +UK Base Areas on Cyprus: 20: 39: AS: 35.32: -33.57: -2.0: ZC4: + ZC4,=ZC4ATC/2000Y; +St. Helena: 36: 66: AF: -15.97: 5.72: 0.0: ZD7: + ZD7; +Ascension Island: 36: 66: AF: -7.93: 14.37: 0.0: ZD8: + ZD8; +Tristan da Cunha & Gough: 38: 66: AF: -37.13: 12.30: 0.0: ZD9: + ZD9; +Cayman Islands: 08: 11: NA: 19.32: 81.22: 5.0: ZF: + ZF; +Tokelau Islands: 31: 62: OC: -9.40: 171.20: -13.0: ZK3: + ZK3; +New Zealand: 32: 60: OC: -39.03: -174.47: -12.0: ZL: + ZK,ZL,ZL50,ZM,=ZL1CT/MM(34),=ZL6A/HQ,=ZL6LH/LH,=ZL75KO,=ZL90IARU,=ZM50GW,=ZM50LA,=ZM50MAUQ, + =ZM80WB, + =ZL1AB/LH, + =ZL2ARG/LH,=ZL2III/LH,=ZL2VH/LH,=ZL80FOC; +Chatham Islands: 32: 60: OC: -43.85: 176.48: -12.75: ZL7: + ZL7,ZM7; +Kermadec Islands: 32: 60: OC: -29.25: 177.92: -12.0: ZL8: + ZL8,ZM8,=ZL1GO/8; +N.Z. Subantarctic Is.: 32: 60: OC: -51.62: -167.62: -12.0: ZL9: + ZL9; +Paraguay: 11: 14: SA: -25.27: 57.67: 4.0: ZP: + ZP; +South Africa: 38: 57: AF: -29.07: -22.63: -2.0: ZS: + H5,S4,S8,V9,ZR,ZS,ZT,ZU,=ZS70BAK/L,=ZS71SIG,=ZS75PTA,=ZS85SARL, + =ZS1BAK/L,=ZS1CT/L,=ZS1CT/LH,=ZS1ESC/L,=ZS1ESC/LH,=ZS1FRC/L,=ZS1FRC/LH,=ZS1OAK/LH,=ZS1OAR/LH, + =ZS1SKR/LH,=ZS1YVP/LH,=ZS70BAK, + =ZS2CR/YL, + =ZS5T/L,=ZS5ZLB/L, + =ZS6AUH/L,=ZS6BXN/L,=ZS6LCM/L,=ZS6STN/L,=ZS6WR/L,=ZS6WRL/L,=ZS80VT; +Pr. Edward & Marion Is.: 38: 57: AF: -46.88: -37.72: -3.0: ZS8: + ZR8,ZS8,ZT8,ZU8; diff --git a/feature/ft8/src/main/assets/decode_help.txt b/feature/ft8/src/main/assets/decode_help.txt new file mode 100644 index 00000000..566715ec --- /dev/null +++ b/feature/ft8/src/main/assets/decode_help.txt @@ -0,0 +1,4 @@ +关于解码模式 +快速解码:沿用原来FT8CN的解码,对接收到的音频做一次性的解码。 +多次解码:在快速解码的基础上,再做多次的解码,增加迭代的次数,并尝试解码频率有叠加的信号。 +注:多次解码增加的运算量,总的解码时间会变长,会缩短设备的续航时间。 \ No newline at end of file diff --git a/feature/ft8/src/main/assets/decode_help_en.txt b/feature/ft8/src/main/assets/decode_help_en.txt new file mode 100644 index 00000000..dbb179fb --- /dev/null +++ b/feature/ft8/src/main/assets/decode_help_en.txt @@ -0,0 +1,4 @@ +Decode mode: +Fast decode: Default mode, one decoding pass on received audio. +Deep decode: Recursive decoding that process received audio in multiple passes . +* Note: Deep decoding requires longer decoding time and more battery consumption. \ No newline at end of file diff --git a/feature/ft8/src/main/assets/dxcc_list.json b/feature/ft8/src/main/assets/dxcc_list.json new file mode 100644 index 00000000..ae5cf9eb --- /dev/null +++ b/feature/ft8/src/main/assets/dxcc_list.json @@ -0,0 +1,43950 @@ +{ + "0": { + "attribution": "Maidenhead(mh) data copyright 2020 Stephen Loomis and Henry Forte, use is granted for others provided this attribution remains in the data", + "dxcc": "1", + "cc": "CA", + "ccc": "CAN", + "name": "加拿大", + "continent": "NA", + "ituzone": ["2", "3", "4", "9", "75"], + "cqzone": ["1", "2", "3", "4", "5"], + "timezone": "-5", + "ccode": "124", + "aname": "Canada", + "mh": [ + "BP90", + "BP91", + "BP92", + "BP93", + "BP94", + "BP95", + "BP96", + "BP97", + "BP98", + "BP99", + "CN69", + "CN78", + "CN79", + "CN88", + "CN89", + "CN99", + "CO09", + "CO18", + "CO19", + "CO28", + "CO29", + "CO32", + "CO33", + "CO34", + "CO36", + "CO37", + "CO38", + "CO39", + "CO41", + "CO42", + "CO43", + "CO44", + "CO45", + "CO46", + "CO47", + "CO48", + "CO49", + "CO50", + "CO51", + "CO52", + "CO53", + "CO54", + "CO55", + "CO56", + "CO57", + "CO58", + "CO59", + "CO60", + "CO61", + "CO62", + "CO63", + "CO64", + "CO65", + "CO66", + "CO67", + "CO68", + "CO69", + "CO70", + "CO71", + "CO72", + "CO73", + "CO74", + "CO75", + "CO76", + "CO77", + "CO78", + "CO79", + "CO80", + "CO81", + "CO82", + "CO83", + "CO84", + "CO85", + "CO86", + "CO87", + "CO88", + "CO89", + "CO90", + "CO91", + "CO92", + "CO93", + "CO94", + "CO95", + "CO96", + "CO97", + "CO98", + "CO99", + "CP00", + "CP01", + "CP02", + "CP03", + "CP04", + "CP05", + "CP06", + "CP07", + "CP08", + "CP09", + "CP10", + "CP11", + "CP12", + "CP13", + "CP14", + "CP15", + "CP16", + "CP17", + "CP18", + "CP19", + "CP20", + "CP21", + "CP22", + "CP23", + "CP24", + "CP25", + "CP26", + "CP27", + "CP28", + "CP29", + "CP30", + "CP31", + "CP32", + "CP33", + "CP34", + "CP35", + "CP36", + "CP37", + "CP38", + "CP39", + "CP40", + "CP41", + "CP42", + "CP43", + "CP44", + "CP45", + "CP46", + "CP47", + "CP48", + "CP49", + "CP50", + "CP51", + "CP52", + "CP53", + "CP54", + "CP55", + "CP56", + "CP57", + "CP58", + "CP59", + "CP60", + "CP61", + "CP62", + "CP63", + "CP64", + "CP65", + "CP66", + "CP67", + "CP68", + "CP69", + "CP70", + "CP71", + "CP72", + "CP73", + "CP74", + "CP75", + "CP76", + "CP77", + "CP78", + "CP79", + "CP80", + "CP81", + "CP82", + "CP83", + "CP84", + "CP85", + "CP86", + "CP87", + "CP88", + "CP89", + "CP90", + "CP91", + "CP92", + "CP93", + "CP94", + "CP95", + "CP96", + "CP97", + "CP98", + "CP99", + "CQ40", + "CQ50", + "CQ60", + "CQ70", + "CQ71", + "CQ72", + "CQ73", + "CQ74", + "CQ80", + "CQ81", + "CQ82", + "CQ83", + "CQ84", + "CQ85", + "CQ86", + "CQ91", + "CQ92", + "CQ93", + "CQ94", + "CQ95", + "CQ96", + "CQ97", + "DN09", + "DN19", + "DN29", + "DN39", + "DN49", + "DN59", + "DN69", + "DN79", + "DN89", + "DN99", + "DO00", + "DO01", + "DO02", + "DO03", + "DO04", + "DO05", + "DO06", + "DO07", + "DO08", + "DO09", + "DO10", + "DO11", + "DO12", + "DO13", + "DO14", + "DO15", + "DO16", + "DO17", + "DO18", + "DO19", + "DO20", + "DO21", + "DO22", + "DO23", + "DO24", + "DO25", + "DO26", + "DO27", + "DO28", + "DO29", + "DO30", + "DO31", + "DO32", + "DO33", + "DO34", + "DO35", + "DO36", + "DO37", + "DO38", + "DO39", + "DO40", + "DO41", + "DO42", + "DO43", + "DO44", + "DO45", + "DO46", + "DO47", + "DO48", + "DO49", + "DO50", + "DO51", + "DO52", + "DO53", + "DO54", + "DO55", + "DO56", + "DO57", + "DO58", + "DO59", + "DO60", + "DO61", + "DO62", + "DO63", + "DO64", + "DO65", + "DO66", + "DO67", + "DO68", + "DO69", + "DO70", + "DO71", + "DO72", + "DO73", + "DO74", + "DO75", + "DO76", + "DO77", + "DO78", + "DO79", + "DO80", + "DO81", + "DO82", + "DO83", + "DO84", + "DO85", + "DO86", + "DO87", + "DO88", + "DO89", + "DO90", + "DO91", + "DO92", + "DO93", + "DO94", + "DO95", + "DO96", + "DO97", + "DO98", + "DO99", + "DP00", + "DP01", + "DP02", + "DP03", + "DP04", + "DP05", + "DP06", + "DP07", + "DP08", + "DP09", + "DP10", + "DP11", + "DP12", + "DP13", + "DP14", + "DP15", + "DP16", + "DP17", + "DP18", + "DP19", + "DP20", + "DP21", + "DP22", + "DP23", + "DP24", + "DP25", + "DP26", + "DP27", + "DP28", + "DP29", + "DP30", + "DP31", + "DP32", + "DP33", + "DP34", + "DP35", + "DP36", + "DP37", + "DP38", + "DP39", + "DP40", + "DP41", + "DP42", + "DP43", + "DP44", + "DP45", + "DP46", + "DP47", + "DP48", + "DP49", + "DP50", + "DP51", + "DP52", + "DP53", + "DP54", + "DP55", + "DP56", + "DP57", + "DP58", + "DP59", + "DP60", + "DP61", + "DP62", + "DP63", + "DP64", + "DP65", + "DP66", + "DP67", + "DP68", + "DP69", + "DP70", + "DP71", + "DP72", + "DP73", + "DP74", + "DP75", + "DP76", + "DP77", + "DP78", + "DP79", + "DP80", + "DP81", + "DP82", + "DP83", + "DP84", + "DP85", + "DP86", + "DP87", + "DP88", + "DP89", + "DP90", + "DP91", + "DP92", + "DP93", + "DP94", + "DP95", + "DP96", + "DP97", + "DP98", + "DP99", + "DQ00", + "DQ01", + "DQ02", + "DQ03", + "DQ04", + "DQ05", + "DQ06", + "DQ07", + "DQ10", + "DQ11", + "DQ12", + "DQ13", + "DQ14", + "DQ15", + "DQ16", + "DQ17", + "DQ20", + "DQ21", + "DQ22", + "DQ23", + "DQ24", + "DQ25", + "DQ26", + "DQ27", + "DQ28", + "DQ30", + "DQ31", + "DQ32", + "DQ33", + "DQ34", + "DQ35", + "DQ36", + "DQ37", + "DQ38", + "DQ40", + "DQ41", + "DQ42", + "DQ43", + "DQ44", + "DQ45", + "DQ46", + "DQ47", + "DQ48", + "DQ50", + "DQ51", + "DQ52", + "DQ53", + "DQ54", + "DQ55", + "DQ56", + "DQ57", + "DQ58", + "DQ60", + "DQ61", + "DQ62", + "DQ63", + "DQ64", + "DQ65", + "DQ66", + "DQ67", + "DQ70", + "DQ71", + "DQ72", + "DQ73", + "DQ75", + "DQ76", + "DQ77", + "DQ78", + "DQ79", + "DQ80", + "DQ81", + "DQ82", + "DQ83", + "DQ85", + "DQ86", + "DQ87", + "DQ88", + "DQ89", + "DQ90", + "DQ91", + "DQ92", + "DQ93", + "DQ94", + "DQ95", + "DQ96", + "DQ97", + "DQ98", + "DQ99", + "DR90", + "EN09", + "EN19", + "EN28", + "EN29", + "EN38", + "EN39", + "EN48", + "EN49", + "EN57", + "EN58", + "EN59", + "EN67", + "EN68", + "EN69", + "EN76", + "EN77", + "EN78", + "EN79", + "EN81", + "EN82", + "EN83", + "EN84", + "EN85", + "EN86", + "EN87", + "EN88", + "EN89", + "EN91", + "EN92", + "EN93", + "EN94", + "EN95", + "EN96", + "EN97", + "EN98", + "EN99", + "EO00", + "EO01", + "EO02", + "EO03", + "EO04", + "EO05", + "EO06", + "EO07", + "EO08", + "EO09", + "EO10", + "EO11", + "EO12", + "EO13", + "EO14", + "EO15", + "EO16", + "EO17", + "EO18", + "EO19", + "EO20", + "EO21", + "EO22", + "EO23", + "EO24", + "EO25", + "EO26", + "EO27", + "EO28", + "EO29", + "EO30", + "EO31", + "EO32", + "EO33", + "EO34", + "EO35", + "EO36", + "EO37", + "EO38", + "EO39", + "EO40", + "EO41", + "EO42", + "EO43", + "EO44", + "EO45", + "EO46", + "EO47", + "EO50", + "EO51", + "EO52", + "EO53", + "EO54", + "EO55", + "EO56", + "EO57", + "EO60", + "EO61", + "EO62", + "EO63", + "EO64", + "EO65", + "EO66", + "EO70", + "EO71", + "EO72", + "EO73", + "EO74", + "EO75", + "EO76", + "EO80", + "EO81", + "EO82", + "EO83", + "EO84", + "EO85", + "EO90", + "EO91", + "EO92", + "EO93", + "EO94", + "EO95", + "EO96", + "EO97", + "EO99", + "EP00", + "EP01", + "EP02", + "EP03", + "EP04", + "EP05", + "EP06", + "EP07", + "EP08", + "EP09", + "EP10", + "EP11", + "EP12", + "EP13", + "EP14", + "EP15", + "EP16", + "EP17", + "EP18", + "EP19", + "EP20", + "EP21", + "EP22", + "EP23", + "EP24", + "EP25", + "EP26", + "EP27", + "EP28", + "EP29", + "EP30", + "EP31", + "EP32", + "EP33", + "EP34", + "EP35", + "EP36", + "EP37", + "EP38", + "EP39", + "EP42", + "EP43", + "EP44", + "EP45", + "EP46", + "EP47", + "EP48", + "EP49", + "EP53", + "EP54", + "EP55", + "EP56", + "EP57", + "EP58", + "EP59", + "EP63", + "EP64", + "EP65", + "EP66", + "EP67", + "EP68", + "EP69", + "EP73", + "EP74", + "EP75", + "EP76", + "EP77", + "EP78", + "EP79", + "EP82", + "EP83", + "EP84", + "EP85", + "EP86", + "EP87", + "EP88", + "EP89", + "EP91", + "EP92", + "EP93", + "EP94", + "EP96", + "EP97", + "EP98", + "EP99", + "EQ00", + "EQ01", + "EQ02", + "EQ03", + "EQ04", + "EQ05", + "EQ06", + "EQ07", + "EQ08", + "EQ09", + "EQ10", + "EQ11", + "EQ12", + "EQ13", + "EQ14", + "EQ15", + "EQ16", + "EQ17", + "EQ18", + "EQ19", + "EQ20", + "EQ21", + "EQ22", + "EQ23", + "EQ24", + "EQ25", + "EQ26", + "EQ27", + "EQ28", + "EQ29", + "EQ30", + "EQ31", + "EQ32", + "EQ33", + "EQ34", + "EQ35", + "EQ36", + "EQ37", + "EQ38", + "EQ39", + "EQ40", + "EQ41", + "EQ42", + "EQ43", + "EQ44", + "EQ45", + "EQ46", + "EQ47", + "EQ48", + "EQ49", + "EQ50", + "EQ51", + "EQ52", + "EQ53", + "EQ54", + "EQ55", + "EQ56", + "EQ57", + "EQ58", + "EQ59", + "EQ60", + "EQ61", + "EQ62", + "EQ63", + "EQ64", + "EQ65", + "EQ66", + "EQ67", + "EQ68", + "EQ69", + "EQ70", + "EQ71", + "EQ72", + "EQ73", + "EQ74", + "EQ75", + "EQ76", + "EQ77", + "EQ78", + "EQ79", + "EQ80", + "EQ81", + "EQ82", + "EQ83", + "EQ84", + "EQ85", + "EQ86", + "EQ87", + "EQ88", + "EQ89", + "EQ90", + "EQ91", + "EQ92", + "EQ93", + "EQ94", + "EQ95", + "EQ96", + "EQ97", + "EQ98", + "EQ99", + "ER00", + "ER10", + "ER20", + "ER21", + "ER30", + "ER31", + "ER40", + "ER41", + "ER50", + "ER51", + "ER52", + "ER60", + "ER61", + "ER62", + "ER70", + "ER71", + "ER72", + "ER80", + "ER81", + "ER82", + "ER90", + "ER91", + "ER92", + "FN02", + "FN03", + "FN04", + "FN05", + "FN06", + "FN07", + "FN08", + "FN09", + "FN13", + "FN14", + "FN15", + "FN16", + "FN17", + "FN18", + "FN19", + "FN24", + "FN25", + "FN26", + "FN27", + "FN28", + "FN29", + "FN34", + "FN35", + "FN36", + "FN37", + "FN38", + "FN39", + "FN45", + "FN46", + "FN47", + "FN48", + "FN49", + "FN56", + "FN57", + "FN58", + "FN59", + "FN63", + "FN64", + "FN65", + "FN66", + "FN67", + "FN68", + "FN69", + "FN73", + "FN74", + "FN75", + "FN76", + "FN77", + "FN78", + "FN79", + "FN84", + "FN85", + "FN86", + "FN87", + "FN89", + "FN93", + "FN94", + "FN95", + "FN96", + "FN97", + "FN99", + "FO00", + "FO01", + "FO02", + "FO03", + "FO04", + "FO05", + "FO06", + "FO07", + "FO08", + "FO09", + "FO10", + "FO11", + "FO12", + "FO13", + "FO14", + "FO15", + "FO16", + "FO17", + "FO18", + "FO19", + "FO20", + "FO21", + "FO22", + "FO23", + "FO24", + "FO25", + "FO26", + "FO27", + "FO28", + "FO29", + "FO30", + "FO31", + "FO32", + "FO33", + "FO34", + "FO35", + "FO36", + "FO37", + "FO38", + "FO39", + "FO40", + "FO41", + "FO42", + "FO43", + "FO44", + "FO45", + "FO46", + "FO47", + "FO48", + "FO49", + "FO50", + "FO51", + "FO52", + "FO53", + "FO54", + "FO55", + "FO56", + "FO57", + "FO58", + "FO59", + "FO60", + "FO61", + "FO62", + "FO63", + "FO64", + "FO65", + "FO66", + "FO67", + "FO68", + "FO69", + "FO70", + "FO71", + "FO72", + "FO73", + "FO74", + "FO75", + "FO76", + "FO77", + "FO78", + "FO79", + "FO80", + "FO81", + "FO82", + "FO83", + "FO84", + "FO85", + "FO86", + "FO87", + "FO88", + "FO89", + "FO90", + "FO91", + "FO92", + "FO93", + "FO94", + "FO95", + "FO96", + "FO97", + "FP00", + "FP01", + "FP02", + "FP03", + "FP04", + "FP05", + "FP07", + "FP08", + "FP09", + "FP10", + "FP11", + "FP12", + "FP13", + "FP14", + "FP15", + "FP17", + "FP18", + "FP19", + "FP20", + "FP21", + "FP22", + "FP23", + "FP24", + "FP25", + "FP26", + "FP27", + "FP28", + "FP29", + "FP30", + "FP31", + "FP32", + "FP33", + "FP34", + "FP35", + "FP36", + "FP37", + "FP38", + "FP39", + "FP40", + "FP41", + "FP42", + "FP43", + "FP44", + "FP45", + "FP46", + "FP47", + "FP48", + "FP49", + "FP50", + "FP51", + "FP52", + "FP53", + "FP54", + "FP55", + "FP56", + "FP57", + "FP58", + "FP59", + "FP60", + "FP61", + "FP62", + "FP63", + "FP64", + "FP65", + "FP66", + "FP67", + "FP68", + "FP69", + "FP70", + "FP71", + "FP72", + "FP73", + "FP74", + "FP75", + "FP76", + "FP77", + "FP78", + "FP85", + "FP86", + "FP87", + "FP96", + "FP97", + "FQ00", + "FQ01", + "FQ02", + "FQ03", + "FQ04", + "FQ05", + "FQ06", + "FQ07", + "FQ08", + "FQ09", + "FQ10", + "FQ11", + "FQ12", + "FQ13", + "FQ16", + "FQ17", + "FQ18", + "FQ19", + "FQ20", + "FQ21", + "FQ22", + "FQ27", + "FQ28", + "FQ29", + "FQ30", + "FQ31", + "FQ39", + "FQ40", + "FQ41", + "FQ49", + "FQ50", + "FQ60", + "FR00", + "FR01", + "FR02", + "FR10", + "FR11", + "FR12", + "FR13", + "FR20", + "FR21", + "FR22", + "FR23", + "FR30", + "FR31", + "FR32", + "FR33", + "FR40", + "FR41", + "FR42", + "FR43", + "FR50", + "FR51", + "FR52", + "FR53", + "FR60", + "FR61", + "FR62", + "FR63", + "FR71", + "FR72", + "FR81", + "FR82", + "FR92", + "GN03", + "GN04", + "GN05", + "GN06", + "GN07", + "GN08", + "GN09", + "GN17", + "GN18", + "GN19", + "GN26", + "GN27", + "GN28", + "GN29", + "GN36", + "GN37", + "GN38", + "GN39", + "GO00", + "GO01", + "GO02", + "GO03", + "GO04", + "GO05", + "GO10", + "GO11", + "GO12", + "GO13", + "GO14", + "GO20", + "GO21", + "GO22", + "GO23" + ], + "prefix": [ + "=4Y1CAO", + "CF", + "CF2", + "=CF2RC", + "=CF2VVV", + "CF3", + "CF4", + "CF5", + "CF6", + "CF7", + "=CF7AAW/1", + "=CF7EWK/3", + "CF8", + "CG", + "CG2", + "=CG2NNX/P", + "CG3", + "CG4", + "CG5", + "CG6", + "CG7", + "CG8", + "CH1", + "CH2", + "CI0", + "=CI0XN/P", + "CI1", + "CI2", + "CJ", + "CJ2", + "=CJ2BY", + "=CJ2KCE", + "CJ3", + "CJ4", + "CJ5", + "CJ6", + "CJ7", + "=CJ7EWK/3", + "CJ8", + "CK", + "CK2", + "CK3", + "CK4", + "CK5", + "CK6", + "CK7", + "=CK7IG/1", + "CK8", + "CY1", + "CY2", + "=CY2ZT/2", + "=CY7DP", + "CZ0", + "CZ1", + "CZ2", + "=K3FMQ/VE2", + "=K5YG/VE2", + "=K8JJ/VY0", + "=K9AJ/VY0", + "=KD3RF/VE2", + "=KD3TB/VE2", + "=KD6WW/VY0", + "=N5ZO/VE2", + "VA", + "=VA1CN/2", + "VA2", + "=VA2BK", + "=VA2BY", + "=VA2KCE", + "=VA2MCJ/VE2", + "=VA2RAG", + "=VA2VFT", + "=VA2VVV", + "VA3", + "=VA3ELE/2", + "=VA3MPM/2", + "=VA3NA/2", + "=VA3QSL/1", + "=VA3WR/1", + "VA4", + "VA5", + "VA6", + "=VA6FUN/7", + "=VA6SS/7", + "VA7", + "=VA7AQ/P", + "=VA7EWK/3", + "=VA7MPG/4", + "VA8", + "VB", + "VB2", + "=VB2C", + "=VB2R", + "=VB2T", + "=VB2V", + "=VB2W", + "VB3", + "VB4", + "VB5", + "VB6", + "VB7", + "VB8", + "VC", + "VC2", + "=VC2C", + "=VC2EME", + "=VC2Q", + "=VC2R", + "=VC2X", + "VC3", + "=VC3W/2", + "VC4", + "VC5", + "VC6", + "VC7", + "VC8", + "VD1", + "VD2", + "VE", + "=VE0NWP", + "=VE1CZ/5", + "=VE1REC/LH", + "=VE1REC/M/LH", + "=VE1RM/3", + "=VE1RM/4", + "VE2", + "=VE2/G3ZAY/P", + "=VE2/JA8BMK", + "=VE2/K5YG", + "=VE2/KD3RF", + "=VE2/KD3RF/M", + "=VE2/M0BLF/P", + "=VE2/N1NK", + "=VE2/UT3UA", + "=VE2/W2NTJ", + "=VE2/W5GED", + "=VE2A", + "=VE2ACP/P", + "=VE2AE", + "=VE2AEJ/3", + "=VE2CSI", + "=VE2CVI", + "=VE2DXY", + "=VE2EKA", + "=VE2EM/M", + "=VE2FDJ/2", + "=VE2FK", + "=VE2GHZ/2", + "=VE2GT/150", + "=VE2HAY/P", + "=VE2HRI", + "=VE2IDX", + "=VE2III", + "=VE2IM", + "=VE2KK", + "=VE2MAM/3", + "=VE2MAM/P", + "=VE2MW/3", + "=VE2NN", + "=VE2OTT", + "=VE2OV/P", + "=VE2PK/3", + "=VE2PRG", + "=VE2QIP/2", + "=VE2QLF/3", + "=VE2QV/3", + "=VE2TKH", + "=VE2TWO", + "=VE2WDX", + "=VE2XAA/2", + "=VE2XB/2", + "=VE2XB/3", + "=VE2XZ/3", + "=VE2Z", + "=VE2ZQ/3", + "VE3", + "=VE3AP/2", + "=VE3AX/7", + "=VE3AXC/2", + "=VE3CWU/2", + "=VE3DO/7", + "=VE3EXY/2", + "=VE3EY/2", + "=VE3FDX/2", + "=VE3GF/2", + "=VE3GNO/2", + "=VE3IAC/2", + "=VE3IKV/7", + "=VE3JM/2", + "=VE3LLV/7", + "=VE3NE/2", + "=VE3NWA/2", + "=VE3RHJ/2", + "=VE3RSA/1", + "=VE3RSA/7", + "=VE3ZF/2", + "=VE3ZZ/2", + "VE4", + "VE5", + "=VE5DX/7", + "VE6", + "=VE6100EMP/7", + "=VE6BIR/7", + "=VE6EZ/7", + "=VE6LK/7", + "=VE6TC/2", + "=VE6ZC/7", + "VE7", + "=VE7ACN/VE2", + "=VE7APF/3", + "=VE7HII/6", + "=VE7IG/1", + "=VE7IG/2", + "=VE7IG/9", + "=VE7LSE/5", + "=VE7MID/VE2", + "=VE7XF/5", + "=VE7XF/6", + "VE8", + "=VE8AT", + "=VE8DX/2", + "=VE8FS", + "=VE8HI/3", + "=VE9TEN/5", + "=VE9XX/6", + "VF0", + "=VF0X/M", + "VF1", + "VF2", + "VG", + "VG2", + "VG3", + "VG4", + "VG5", + "VG6", + "VG7", + "VG8", + "=VO/DL2GF", + "=VO/DL2GF/P", + "VO1", + "=VO1BRK/L", + "=VO1VON/LH", + "VO2", + "=VO2DX/9", + "VX", + "VX2", + "VX3", + "VX4", + "VX5", + "VX6", + "VX7", + "VX8", + "=VX9GHD", + "=VX9GHQ", + "=VX9GJD", + "=VX9GLC", + "=VX9GLI", + "=VX9SHA", + "VY0", + "=VY0A", + "=VY0AA", + "=VY0DXA", + "=VY0M", + "=VY0PW", + "=VY0V", + "=VY0XYL/6", + "VY1", + "VY2", + "=VY2MGY/3", + "VY9", + "=W0SD/VE2", + "=W2NTJ/VE2", + "=W4TMO/VE2", + "=W5GED/VE2", + "=WB8YTZ/VE2", + "XJ1", + "XJ2", + "XK0", + "=XK0XN", + "=XK0XN/P", + "XK1", + "XK2", + "XL", + "XL2", + "XL3", + "XL4", + "XL5", + "XL6", + "XL7", + "XL8", + "XM", + "XM2", + "XM3", + "=XM3NE/2", + "XM4", + "XM5", + "XM6", + "XM7", + "XM8", + "XN1", + "XN2", + "XO0", + "=XO0ICE/2", + "=XO0XN", + "=XO0XN/P", + "XO1", + "XO2" + ], + "worked": false, + "confirmed": false, + "flag": "ca.png", + "pp": "VE", + "lat": 55.932488305291855, + "lon": -100.64814814814818, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "1": { + "dxcc": "2", + "cc": "SA", + "ccc": "SAU", + "name": "阿布阿里是群岛", + "continent": "AS", + "ituzone": ["39"], + "cqzone": ["21"], + "timezone": "0", + "ccode": "682", + "aname": "Abu Ali Is.", + "mh": ["LL47"], + "prefix": [], + "worked": false, + "confirmed": false, + "flag": "xx.png", + "pp": "", + "lat": 0, + "lon": 0, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "2": { + "dxcc": "3", + "cc": "AF", + "ccc": "AFG", + "name": "阿富汗", + "continent": "AS", + "ituzone": ["40"], + "cqzone": ["21"], + "timezone": "5", + "ccode": "4", + "aname": "Afghanistan", + "mh": [ + "ML09", + "ML19", + "ML29", + "ML39", + "MM00", + "MM01", + "MM02", + "MM03", + "MM04", + "MM05", + "MM10", + "MM11", + "MM12", + "MM13", + "MM14", + "MM15", + "MM16", + "MM20", + "MM21", + "MM22", + "MM23", + "MM24", + "MM25", + "MM26", + "MM27", + "MM30", + "MM31", + "MM32", + "MM33", + "MM34", + "MM35", + "MM36", + "MM37", + "MM41", + "MM42", + "MM43", + "MM44", + "MM45", + "MM46", + "MM47", + "MM53", + "MM54", + "MM55", + "MM56", + "MM57", + "MM58", + "MM66", + "MM67", + "MM76", + "MM77" + ], + "prefix": ["T6", "YA"], + "worked": false, + "confirmed": false, + "flag": "af.png", + "pp": "YA", + "lat": 34.359179382594505, + "lon": 65.63786008230451, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "3": { + "dxcc": "4", + "cc": "MP", + "ccc": "MNP", + "name": "阿加莱加群岛及圣布兰登群岛", + "continent": "AF", + "ituzone": ["53"], + "cqzone": ["39"], + "timezone": "4", + "ccode": "580", + "aname": "Agalega & St. Brandon Is.", + "mh": ["LH89"], + "prefix": ["3B6", "3B7"], + "worked": false, + "confirmed": false, + "flag": "mp.png", + "pp": "3B6", + "lat": -16.397000903751035, + "lon": 59.451303155006855, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "4": { + "dxcc": "5", + "cc": "AX", + "ccc": "ALA", + "name": "奥兰群岛", + "continent": "EU", + "ituzone": ["18"], + "cqzone": ["15"], + "timezone": "2", + "ccode": "248", + "aname": "Aland Is.", + "mh": ["JP90", "KO09", "KP00"], + "prefix": [ + "OF0", + "=OF100FI/0", + "OG0", + "=OG2K/0", + "=OG2M/0", + "=OG3M/0", + "OH0", + "=OH1LWZ/0", + "=OH2FTJ/0", + "=OH6ZZ/0", + "=OH8K/0", + "OI0" + ], + "worked": false, + "confirmed": false, + "flag": "ax.png", + "pp": "OH0", + "lat": 60.29529943971073, + "lon": 19.814814814814817, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "5": { + "dxcc": "6", + "cc": "US", + "ccc": "USA", + "name": "阿拉斯加", + "continent": "NA", + "ituzone": ["1", "2"], + "cqzone": ["1"], + "timezone": "-8", + "ccode": "840", + "aname": "Alaska", + "mh": [ + "AO01", + "AO11", + "AO12", + "AO21", + "AO22", + "AO32", + "AO42", + "AO47", + "AO52", + "AO53", + "AO56", + "AO63", + "AO64", + "AO69", + "AO74", + "AO79", + "AO84", + "AO85", + "AO88", + "AO89", + "AO94", + "AO95", + "AO96", + "AO98", + "AO99", + "AP30", + "AP43", + "AP52", + "AP53", + "AP54", + "AP55", + "AP60", + "AP61", + "AP64", + "AP65", + "AP66", + "AP68", + "AP70", + "AP71", + "AP72", + "AP73", + "AP74", + "AP75", + "AP76", + "AP77", + "AP78", + "AP80", + "AP81", + "AP82", + "AP83", + "AP84", + "AP85", + "AP86", + "AP87", + "AP88", + "AP89", + "AP90", + "AP91", + "AP92", + "AP93", + "AP94", + "AP95", + "AP96", + "AP97", + "AP98", + "AP99", + "AQ80", + "AQ90", + "BO04", + "BO05", + "BO06", + "BO07", + "BO08", + "BO09", + "BO16", + "BO17", + "BO18", + "BO19", + "BO25", + "BO26", + "BO27", + "BO28", + "BO29", + "BO36", + "BO37", + "BO38", + "BO39", + "BO48", + "BO49", + "BO59", + "BO69", + "BO79", + "BO89", + "BO99", + "BP00", + "BP01", + "BP02", + "BP03", + "BP04", + "BP05", + "BP06", + "BP07", + "BP08", + "BP09", + "BP10", + "BP11", + "BP12", + "BP13", + "BP14", + "BP15", + "BP16", + "BP17", + "BP18", + "BP19", + "BP20", + "BP21", + "BP22", + "BP23", + "BP24", + "BP25", + "BP26", + "BP27", + "BP28", + "BP29", + "BP30", + "BP31", + "BP32", + "BP33", + "BP34", + "BP35", + "BP36", + "BP37", + "BP38", + "BP39", + "BP40", + "BP41", + "BP42", + "BP43", + "BP44", + "BP45", + "BP46", + "BP47", + "BP48", + "BP49", + "BP50", + "BP51", + "BP52", + "BP53", + "BP54", + "BP55", + "BP56", + "BP57", + "BP58", + "BP59", + "BP60", + "BP61", + "BP62", + "BP63", + "BP64", + "BP65", + "BP66", + "BP67", + "BP68", + "BP69", + "BP70", + "BP71", + "BP72", + "BP73", + "BP74", + "BP75", + "BP76", + "BP77", + "BP78", + "BP79", + "BP80", + "BP81", + "BP82", + "BP83", + "BP84", + "BP85", + "BP86", + "BP87", + "BP88", + "BP89", + "BP90", + "BP91", + "BP92", + "BP93", + "BP94", + "BP95", + "BP96", + "BP97", + "BP98", + "BP99", + "BQ00", + "BQ10", + "BQ11", + "BQ20", + "BQ21", + "BQ30", + "BQ40", + "BQ50", + "BQ60", + "BQ70", + "BQ80", + "CO08", + "CO09", + "CO17", + "CO18", + "CO19", + "CO25", + "CO26", + "CO27", + "CO28", + "CO29", + "CO34", + "CO35", + "CO36", + "CO37", + "CO38", + "CO44", + "CO45", + "CO46", + "CO55", + "CP00", + "RO62", + "RO63", + "RO72", + "RO81", + "RO82", + "RO91", + "RO92" + ], + "prefix": [ + "=AA0NN", + "=AA8FY", + "=AB0IC", + "=AB0WK", + "=AB5JB", + "=AB7YB", + "=AB7YO", + "=AB8XX", + "=AB9OM", + "=AC0CW", + "=AC9QX", + "=AD0DK", + "=AD0FQ", + "=AD0ZL", + "=AD3BJ", + "=AD6GC", + "=AD7MF", + "=AD7VV", + "=AE1DJ", + "=AE4QH", + "=AE5CP", + "=AE5EX", + "=AE5FN", + "=AE5IR", + "=AE7ES", + "=AE7KS", + "=AE7SB", + "=AF7FV", + "=AG5LN", + "=AG5OF", + "=AH0AH", + "=AH0H", + "=AJ4MY", + "=AJ4ZI", + "=AK4CM", + "AL", + "=K0AZZ", + "=K0BHC", + "=K1BZD", + "=K1KAO", + "=K1MAT", + "=K2ICW", + "=K2NPS", + "=K3JMI", + "=K4DRC", + "=K4ETC", + "=K4HOE", + "=K4PSG", + "=K4RND", + "=K4WPK", + "=K5DOW", + "=K5HL", + "=K5RD", + "=K5RSO", + "=K5RZW", + "=K5TDN", + "=K6ANE", + "=K6GKW", + "=K7EJM", + "=K7GRW", + "=K7LOP", + "=K7MVX", + "=K7OCL", + "=K7RDR", + "=K7SGA", + "=K7UNX", + "=K7ZOA", + "=K8IEL", + "=K8OUA", + "=K9DUG", + "=K9WUV", + "=KA0SIM", + "=KA0YPV", + "=KA1NCN", + "=KA2TJZ", + "=KA2ZSD", + "=KA6UGT", + "=KA7ETQ", + "=KA7HOX", + "=KA7JOR", + "=KA7TMU", + "=KA7TOM", + "=KA7UKN", + "=KA7VCR", + "=KA7YEY", + "=KA9GYQ", + "=KB0APK", + "=KB0LOW", + "=KB0TSU", + "=KB0UGE", + "=KB0UVK", + "=KB1CRT", + "=KB1FCX", + "=KB1KLH", + "=KB1PHP", + "=KB1QCD", + "=KB1QCE", + "=KB1SYV", + "=KB1WQL", + "=KB2JWV", + "=KB2ZME", + "=KB3CYB", + "=KB3JFK", + "=KB3NCR", + "=KB3VQE", + "=KB4DX", + "=KB5DNT", + "=KB5HEV", + "=KB5UWU", + "=KB6DKJ", + "=KB7AMA", + "=KB7BNG", + "=KB7BUF", + "=KB7DEL", + "=KB7FXJ", + "=KB7IBI", + "=KB7JA", + "=KB7LJZ", + "=KB7LON", + "=KB7PHT", + "=KB7QLB", + "=KB7RXZ", + "=KB7SIQ", + "=KB7UBH", + "=KB7VFZ", + "=KB7YEC", + "=KB7ZVZ", + "=KB8QKR", + "=KB8SBG", + "=KB8TEW", + "=KB8VYJ", + "=KB9MWG", + "=KB9RWE", + "=KB9RWJ", + "=KB9YGR", + "=KC0ATI", + "=KC0CWG", + "=KC0CYR", + "=KC0EF", + "=KC0GDH", + "=KC0GHH", + "=KC0GLN", + "=KC0LLL", + "=KC0NSV", + "=KC0OKQ", + "=KC0PSZ", + "=KC0TK", + "=KC0TZL", + "=KC0UYK", + "=KC0VDN", + "=KC0WSG", + "=KC0YSW", + "=KC1DL", + "=KC1KPL", + "=KC2BYX", + "=KC2GVS", + "=KC2HRV", + "=KC2KMU", + "=KC2OJP", + "=KC2PCV", + "=KC2PIO", + "=KC3DBK", + "=KC4MXQ", + "=KC4MXR", + "=KC5BNN", + "=KC5CHO", + "=KC5DJA", + "=KC5KIG", + "=KC5LKF", + "=KC5LKG", + "=KC5QPJ", + "=KC5THY", + "=KC5YIB", + "=KC5YOX", + "=KC5ZAA", + "=KC6RJW", + "=KC7BUL", + "=KC7COW", + "=KC7ENM", + "=KC7FWK", + "=KC7GSO", + "=KC7HJM", + "=KC7HPF", + "=KC7IKE", + "=KC7IKF", + "=KC7INC", + "=KC7MIJ", + "=KC7MPY", + "=KC7MRO", + "=KC7OQZ", + "=KC7PLJ", + "=KC7PLQ", + "=KC7RCP", + "=KC7TYT", + "=KC7UZY", + "=KC7WOA", + "=KC7YZR", + "=KC8GKK", + "=KC8MVW", + "=KC8NMN", + "=KC8NOY", + "=KC8WWS", + "=KC8YIV", + "=KC9CMY", + "=KC9HIK", + "=KC9VLD", + "=KD0CLU", + "=KD0CZC", + "=KD0DHU", + "=KD0FJG", + "=KD0IXU", + "=KD0JJB", + "=KD0NSG", + "=KD0ONB", + "=KD0VAK", + "=KD0VAL", + "=KD0VGF", + "=KD0ZOD", + "=KD2CTE", + "=KD2GKT", + "=KD2NPD", + "=KD2SKJ", + "=KD4EYW", + "=KD4MEY", + "=KD4QJL", + "=KD5DNA", + "=KD5DWV", + "=KD5GAL", + "=KD5QPD", + "=KD5RVD", + "=KD5WCF", + "=KD5WEV", + "=KD5WYP", + "=KD6DLB", + "=KD6RVY", + "=KD6YKS", + "=KD7APU", + "=KD7AWK", + "=KD7BBX", + "=KD7BGP", + "=KD7DIG", + "=KD7DUQ", + "=KD7FGL", + "=KD7FUL", + "=KD7GFG", + "=KD7HXF", + "=KD7KRK", + "=KD7MGO", + "=KD7OOS", + "=KD7QAR", + "=KD7SIX", + "=KD7TWB", + "=KD7UAG", + "=KD7VOI", + "=KD7VXE", + "=KD7ZTJ", + "=KD8BVD", + "=KD8DDY", + "=KD8GEL", + "=KD8GMS", + "=KD8JOU", + "=KD8LNA", + "=KD8WMX", + "=KD9TK", + "=KE0DYM", + "=KE0KKI", + "=KE4DGR", + "=KE4MQD", + "=KE4YEI", + "=KE4YLG", + "=KE5CVD", + "=KE5CVT", + "=KE5DQV", + "=KE5FOC", + "=KE5GEB", + "=KE5HHR", + "=KE5JHS", + "=KE5JTB", + "=KE5NLG", + "=KE5QDI", + "=KE5QDJ", + "=KE5QDK", + "=KE5VPO", + "=KE5ZRK", + "=KE5ZUM", + "=KE6DLM", + "=KE6DUJ", + "=KE6DXH", + "=KE6IPM", + "=KE6SYD", + "=KE6TCE", + "=KE6VUB", + "=KE7DFO", + "=KE7ELL", + "=KE7EOP", + "=KE7EPZ", + "=KE7FNC", + "=KE7FXM", + "=KE7GOE", + "=KE7HMJ", + "=KE7KYU", + "=KE7PXV", + "=KE7TRX", + "=KE8RO", + "=KF3L", + "=KF4JET", + "=KF4PLR", + "=KF4TBD", + "=KF4YFD", + "=KF5CVM", + "=KF5ETW", + "=KF5FJQ", + "=KF5HFB", + "=KF5HJC", + "=KF5NDT", + "=KF5UBP", + "=KF5YYK", + "=KF6AWG", + "=KF6AXS", + "=KF6BMF", + "=KF6BOV", + "=KF6EJR", + "=KF6GNM", + "=KF6IAO", + "=KF6ILC", + "=KF6IOT", + "=KF6LGK", + "=KF6MFK", + "=KF6QOJ", + "=KF6RMG", + "=KF6RPC", + "=KF6SHS", + "=KF6TGR", + "=KF6UWT", + "=KF7CXJ", + "=KF7GKY", + "=KF7LEX", + "=KF7LUA", + "=KF7PCJ", + "=KF7PFT", + "=KF7PSS", + "=KF7PUQ", + "=KF7UFY", + "=KF7VBO", + "=KF8ZB", + "=KG2IA", + "=KG4BBX", + "=KG4NBL/P", + "=KG4TJS", + "=KG4WNZ", + "=KG5EQN", + "=KG5GDF", + "=KG5GTD", + "=KG5JQC", + "=KG5MIB", + "=KG5MIO", + "=KG6DTI", + "=KG6MBC", + "=KG6RJE", + "=KG6TAL", + "=KG7CUR", + "=KG7DVI", + "=KG7GJL", + "=KG7JVJ", + "=KG7OQC", + "=KG7OUF", + "=KG7SEQ", + "=KG7TGE", + "=KH0NF", + "=KH0NG", + "=KH0RF", + "=KH2YN", + "=KH7BW", + "=KH7DA", + "=KI4COG", + "=KI4ERC", + "=KI4GAG", + "=KI4GCF", + "=KI4GDI", + "=KI4NGY", + "=KI4NVI", + "=KI4SET", + "=KI4SOM", + "=KI6BGR", + "=KI6DES", + "=KI6HGW", + "=KI6YXZ", + "=KI7COR", + "=KI7PZ", + "=KI8JT", + "=KJ4HEW", + "=KJ4IAQ", + "=KJ4PSV", + "=KJ4WDI", + "=KJ4WIQ", + "=KJ4YOY", + "=KJ4ZWI", + "=KJ6DCH", + "=KJ6KRG", + "=KJ6ZSX", + "=KJ7IR", + "=KJ7MY", + "=KK4AMV", + "=KK4CLS", + "=KK4LRE", + "=KK4QXE", + "=KK4RYG", + "=KK4WWH", + "=KK4WWI", + "=KK6IUY", + "=KK6PGV", + "=KK7I", + "=KK7IV", + "=KK7STL", + "KL", + "=KL7D/M", + "=KL7NC/IMD", + "=KM4AGL", + "=KM4KWS", + "=KM4KX", + "=KM4NIC", + "=KM4OE", + "=KM4PJH", + "=KM4TJI", + "=KM6NOL", + "=KN4HGD", + "=KN4RXC", + "=KN8IVE", + "=KR4WV", + "=KV3X", + "=KW1W", + "=KY7J", + "=KZ6HJC", + "=N0GDT", + "=N0GDU", + "=N0GLI", + "=N0HJT", + "=N0HYI", + "=N0HZF", + "=N0JEN", + "=N0LHN", + "=N0SN", + "=N0SUB", + "=N0WXJ", + "=N0XKY", + "=N0XS", + "=N0ZKV", + "=N1HEN", + "=N1HUT", + "=N1KDQ", + "=N1KTI", + "=N1NDA", + "=N1NJS", + "=N1QFE", + "=N1TX", + "=N2CXH", + "=N2SHO", + "=N2TJY", + "=N2YZW", + "=N3QEH", + "=N4AVX", + "=N4CM", + "=N4HCJ", + "=N4HZU", + "=N4NAV", + "=N5CSO", + "=N5UKX", + "=N5WPR", + "=N6BSC", + "=N6CVV", + "=N6CZU", + "=N6JM", + "=N6QEK", + "=N6ZZX", + "=N7BUO", + "=N7DBN", + "=N7DKL", + "=N7FCT", + "=N7HER", + "=N7HQK", + "=N7HRO", + "=N7IA", + "=N7JUX", + "=N7MGT", + "=N7MTG", + "=N7PHB", + "=N7QAN", + "=N7TBU", + "=N7UTV", + "=N7UWT", + "=N7XEA", + "=N7XNM", + "=N7YKY", + "=N7YQS", + "=N8DDY", + "=N8EX", + "=N8JKB", + "=N8KCJ", + "=N8SUG", + "=N9AIG", + "=N9YD", + "=NA7WM", + "=NC4OI", + "=NE7EK", + "=NH2GZ", + "=NH7UO", + "=NJ7H", + "NL", + "=NM0H", + "=NN4NN", + "=NP4FU", + "=NU9Q", + "=NW7F", + "=W0EZM", + "=W0FJN", + "=W0RWS", + "=W0UZJ", + "=W0ZEE", + "=W1JM", + "=W1LYD", + "=W1RSC", + "=W1ZKA", + "=W2DLS", + "=W2KRZ", + "=W3JPN", + "=W3MKG", + "=W4AUL", + "=W4BMR", + "=W4RSB", + "=W5JKT", + "=W6DDP", + "=W6GTE", + "=W6ROW", + "=W7APM", + "=W7DDG", + "=W7EIK", + "=W7JMR", + "=W7PWA", + "=W7RAZ", + "=W7ROS", + "=W7WEZ", + "=W7ZWT", + "=W8MDD", + "=W8PVZ", + "=W8TCX", + "=W9ITU", + "=W9JMC", + "=WA0JS", + "=WA1FVJ", + "=WA2BGL", + "=WA2BIW", + "=WA6GFS", + "=WA7B", + "=WA7PXH", + "=WA7USX", + "=WA7YXF", + "=WB0CMZ", + "=WB1GZL", + "=WB1ILS", + "=WB6COP", + "=WB7TYK", + "=WB9JZL", + "=WD6CET", + "=WH6CYY", + "=WH6DPL", + "=WH6DX", + "=WH6GBB", + "=WH6GCO", + "=WH7AK", + "=WJ8M", + "WL", + "=WP4IYI", + "=WT5T", + "=WX1NCC" + ], + "worked": false, + "confirmed": false, + "flag": "us.png", + "pp": "KL", + "lat": 64.91434252406415, + "lon": -151.9444444444445, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "6": { + "dxcc": "7", + "cc": "AL", + "ccc": "ALB", + "name": "阿尔巴尼亚", + "continent": "EU", + "ituzone": ["28"], + "cqzone": ["15"], + "timezone": "1", + "ccode": "8", + "aname": "Albania", + "mh": ["JM99", "JN90", "JN91", "JN92", "KM09", "KN00", "KN01", "KN02"], + "prefix": ["ZA"], + "worked": false, + "confirmed": false, + "flag": "al.png", + "pp": "ZA", + "lat": 41.213639003680726, + "lon": 19.887212315195853, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "8": { + "dxcc": "9", + "cc": "AS", + "ccc": "ASM", + "name": "美属萨摩亚", + "continent": "OC", + "ituzone": ["62"], + "cqzone": ["32"], + "timezone": "-11", + "ccode": "16", + "aname": "American Samoa", + "mh": ["AH45", "AH55"], + "prefix": [ + "=AB9OH", + "=AF7MN", + "AH8", + "=KD8TFY", + "=KH0WF", + "KH8", + "=KM4YJH", + "=KS6EL", + "=KS6FS", + "NH8", + "=W3HG", + "=WH6BAR", + "WH8", + "=WL7BMP" + ], + "worked": false, + "confirmed": false, + "flag": "as.png", + "pp": "KH8", + "lat": -14.12095435042562, + "lon": -169.62048468221315, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "9": { + "dxcc": "10", + "cc": "FR", + "ccc": "FRA", + "name": "阿姆斯特丹岛和圣保罗岛", + "continent": "AF", + "ituzone": ["68"], + "cqzone": ["39"], + "timezone": "5", + "ccode": "250", + "aname": "Amsterdam & St. Paul Is.", + "mh": ["MF81", "MF82"], + "prefix": [ + "FT0Z", + "FT1Z", + "FT2Z", + "FT3Z", + "FT4Z", + "FT5Z", + "FT6Z", + "FT7Z", + "FT8Z" + ], + "worked": false, + "confirmed": false, + "flag": "fr.png", + "pp": "FT/z", + "lat": -38.25126858643041, + "lon": 77.51054209216068, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "10": { + "dxcc": "11", + "cc": "IN", + "ccc": "IND", + "name": "安达曼群岛和尼科巴群岛", + "continent": "AS", + "ituzone": ["49"], + "cqzone": ["26"], + "timezone": "6", + "ccode": "356", + "aname": "Andaman & Nicobar Is.", + "mh": [ + "NJ66", + "NJ67", + "NJ68", + "NJ69", + "NK60", + "NK61", + "NK62", + "NK63", + "NK73" + ], + "prefix": [ + "=VU3VPX", + "=VU3VPY", + "VU4", + "=VU4AN/RBI", + "=VU4RBI/DBP", + "=VU4RBI/DVS" + ], + "worked": false, + "confirmed": false, + "flag": "in.png", + "pp": "VU4", + "lat": 10.718816717406469, + "lon": 92.46913580246914, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "11": { + "dxcc": "12", + "cc": "AI", + "ccc": "AIA", + "name": "安圭拉岛", + "continent": "NA", + "ituzone": ["11"], + "cqzone": ["8"], + "timezone": "-4", + "ccode": "660", + "aname": "Anguilla", + "mh": ["FK88"], + "prefix": ["VP2E"], + "worked": false, + "confirmed": false, + "flag": "ai.png", + "pp": "VP2E", + "lat": 18.38082188736351, + "lon": -63.173296753543674, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "12": { + "dxcc": "13", + "cc": "AQ", + "ccc": "ATA", + "name": "南极洲", + "continent": "OC", + "ituzone": ["67", "69", "70", "71", "72", "73", "74"], + "cqzone": ["12", "13", "29", "30", "32", "38", "39"], + "timezone": "0", + "ccode": "10", + "aname": "Antarctica", + "mh": [ + "AA01", + "AA02", + "AA03", + "AA04", + "AA05", + "AA06", + "AA07", + "AA08", + "AA09", + "AA11", + "AA12", + "AA13", + "AA14", + "AA15", + "AA16", + "AA17", + "AA18", + "AA19", + "AA21", + "AA22", + "AA23", + "AA24", + "AA25", + "AA26", + "AA27", + "AA28", + "AA29", + "AA31", + "AA32", + "AA33", + "AA34", + "AA35", + "AA36", + "AA37", + "AA38", + "AA39", + "AA41", + "AA42", + "AA43", + "AA44", + "AA45", + "AA46", + "AA47", + "AA48", + "AA49", + "AA51", + "AA52", + "AA53", + "AA54", + "AA55", + "AA56", + "AA57", + "AA58", + "AA59", + "AA61", + "AA62", + "AA63", + "AA64", + "AA65", + "AA66", + "AA67", + "AA68", + "AA69", + "AA71", + "AA72", + "AA73", + "AA74", + "AA75", + "AA76", + "AA77", + "AA78", + "AA79", + "AA81", + "AA82", + "AA83", + "AA84", + "AA85", + "AA86", + "AA87", + "AA88", + "AA89", + "AA91", + "AA92", + "AA93", + "AA94", + "AA95", + "AA96", + "AA97", + "AA98", + "AA99", + "AB00", + "AB01", + "AB10", + "AB11", + "AB20", + "AB21", + "AB30", + "AB31", + "AB40", + "AB41", + "AB50", + "AB51", + "AB60", + "AB61", + "AB70", + "AB71", + "AB80", + "AB81", + "AB90", + "AB91", + "BA01", + "BA02", + "BA03", + "BA04", + "BA05", + "BA06", + "BA07", + "BA08", + "BA09", + "BA11", + "BA12", + "BA13", + "BA14", + "BA15", + "BA16", + "BA17", + "BA18", + "BA19", + "BA21", + "BA22", + "BA23", + "BA24", + "BA25", + "BA26", + "BA27", + "BA28", + "BA29", + "BA31", + "BA32", + "BA33", + "BA34", + "BA35", + "BA36", + "BA37", + "BA38", + "BA39", + "BA41", + "BA42", + "BA43", + "BA44", + "BA45", + "BA46", + "BA47", + "BA48", + "BA49", + "BA51", + "BA52", + "BA53", + "BA54", + "BA55", + "BA56", + "BA57", + "BA58", + "BA59", + "BA61", + "BA62", + "BA63", + "BA64", + "BA65", + "BA66", + "BA67", + "BA68", + "BA69", + "BA71", + "BA72", + "BA73", + "BA74", + "BA75", + "BA76", + "BA77", + "BA78", + "BA79", + "BA81", + "BA82", + "BA83", + "BA84", + "BA85", + "BA86", + "BA87", + "BA88", + "BA89", + "BA91", + "BA92", + "BA93", + "BA94", + "BA95", + "BA96", + "BA97", + "BA98", + "BA99", + "BB00", + "BB01", + "BB02", + "BB10", + "BB11", + "BB12", + "BB13", + "BB20", + "BB21", + "BB22", + "BB30", + "BB31", + "BB32", + "BB40", + "BB41", + "BB42", + "BB43", + "BB50", + "BB51", + "BB52", + "BB53", + "BB60", + "BB61", + "BB62", + "BB63", + "BB64", + "BB70", + "BB71", + "BB72", + "BB73", + "BB74", + "BB80", + "BB81", + "BB82", + "BB83", + "BB84", + "BB90", + "BB91", + "BB92", + "BB93", + "BB94", + "CA01", + "CA02", + "CA03", + "CA04", + "CA05", + "CA06", + "CA07", + "CA08", + "CA09", + "CA11", + "CA12", + "CA13", + "CA14", + "CA15", + "CA16", + "CA17", + "CA18", + "CA19", + "CA21", + "CA22", + "CA23", + "CA24", + "CA25", + "CA26", + "CA27", + "CA28", + "CA29", + "CA31", + "CA32", + "CA33", + "CA34", + "CA35", + "CA36", + "CA37", + "CA38", + "CA39", + "CA41", + "CA42", + "CA43", + "CA44", + "CA45", + "CA46", + "CA47", + "CA48", + "CA49", + "CA51", + "CA52", + "CA53", + "CA54", + "CA55", + "CA56", + "CA57", + "CA58", + "CA59", + "CA61", + "CA62", + "CA63", + "CA64", + "CA65", + "CA66", + "CA67", + "CA68", + "CA69", + "CA71", + "CA72", + "CA73", + "CA74", + "CA75", + "CA76", + "CA77", + "CA78", + "CA79", + "CA81", + "CA82", + "CA83", + "CA84", + "CA85", + "CA86", + "CA87", + "CA88", + "CA89", + "CA91", + "CA92", + "CA93", + "CA94", + "CA95", + "CA96", + "CA97", + "CA98", + "CA99", + "CB00", + "CB01", + "CB02", + "CB03", + "CB04", + "CB05", + "CB10", + "CB11", + "CB12", + "CB13", + "CB14", + "CB15", + "CB20", + "CB21", + "CB22", + "CB23", + "CB24", + "CB25", + "CB30", + "CB31", + "CB32", + "CB33", + "CB34", + "CB35", + "CB40", + "CB41", + "CB42", + "CB43", + "CB44", + "CB45", + "CB50", + "CB51", + "CB52", + "CB53", + "CB54", + "CB55", + "CB60", + "CB61", + "CB62", + "CB63", + "CB64", + "CB65", + "CB66", + "CB70", + "CB71", + "CB72", + "CB73", + "CB74", + "CB75", + "CB76", + "CB80", + "CB81", + "CB82", + "CB83", + "CB84", + "CB85", + "CB86", + "CB90", + "CB91", + "CB92", + "CB93", + "CB94", + "CB95", + "CB96", + "DA01", + "DA02", + "DA03", + "DA04", + "DA05", + "DA06", + "DA07", + "DA08", + "DA09", + "DA11", + "DA12", + "DA13", + "DA14", + "DA15", + "DA16", + "DA17", + "DA18", + "DA19", + "DA21", + "DA22", + "DA23", + "DA24", + "DA25", + "DA26", + "DA27", + "DA28", + "DA29", + "DA31", + "DA32", + "DA33", + "DA34", + "DA35", + "DA36", + "DA37", + "DA38", + "DA39", + "DA41", + "DA42", + "DA43", + "DA44", + "DA45", + "DA46", + "DA47", + "DA48", + "DA49", + "DA51", + "DA52", + "DA53", + "DA54", + "DA55", + "DA56", + "DA57", + "DA58", + "DA59", + "DA61", + "DA62", + "DA63", + "DA64", + "DA65", + "DA66", + "DA67", + "DA68", + "DA69", + "DA71", + "DA72", + "DA73", + "DA74", + "DA75", + "DA76", + "DA77", + "DA78", + "DA79", + "DA81", + "DA82", + "DA83", + "DA84", + "DA85", + "DA86", + "DA87", + "DA88", + "DA89", + "DA91", + "DA92", + "DA93", + "DA94", + "DA95", + "DA96", + "DA97", + "DA98", + "DA99", + "DB00", + "DB01", + "DB02", + "DB03", + "DB04", + "DB05", + "DB06", + "DB10", + "DB11", + "DB12", + "DB13", + "DB14", + "DB15", + "DB16", + "DB20", + "DB21", + "DB22", + "DB23", + "DB24", + "DB25", + "DB26", + "DB30", + "DB31", + "DB32", + "DB33", + "DB34", + "DB35", + "DB36", + "DB40", + "DB41", + "DB42", + "DB43", + "DB44", + "DB45", + "DB50", + "DB51", + "DB52", + "DB53", + "DB54", + "DB55", + "DB60", + "DB61", + "DB62", + "DB63", + "DB64", + "DB65", + "DB70", + "DB71", + "DB72", + "DB73", + "DB74", + "DB75", + "DB76", + "DB80", + "DB81", + "DB82", + "DB83", + "DB84", + "DB85", + "DB86", + "DB87", + "DB88", + "DB90", + "DB91", + "DB92", + "DB93", + "DB94", + "DB95", + "DB96", + "DB97", + "DB98", + "EA01", + "EA02", + "EA03", + "EA04", + "EA05", + "EA06", + "EA07", + "EA08", + "EA09", + "EA11", + "EA12", + "EA13", + "EA14", + "EA15", + "EA16", + "EA17", + "EA18", + "EA19", + "EA21", + "EA22", + "EA23", + "EA24", + "EA25", + "EA26", + "EA27", + "EA28", + "EA29", + "EA31", + "EA32", + "EA33", + "EA34", + "EA35", + "EA36", + "EA37", + "EA38", + "EA39", + "EA41", + "EA42", + "EA43", + "EA44", + "EA45", + "EA46", + "EA47", + "EA48", + "EA49", + "EA51", + "EA52", + "EA53", + "EA54", + "EA55", + "EA56", + "EA57", + "EA58", + "EA59", + "EA61", + "EA62", + "EA63", + "EA64", + "EA65", + "EA66", + "EA67", + "EA68", + "EA69", + "EA71", + "EA72", + "EA73", + "EA74", + "EA75", + "EA76", + "EA77", + "EA78", + "EA79", + "EA81", + "EA82", + "EA83", + "EA84", + "EA85", + "EA86", + "EA87", + "EA88", + "EA89", + "EA91", + "EA92", + "EA93", + "EA94", + "EA95", + "EA96", + "EA97", + "EA98", + "EA99", + "EB00", + "EB01", + "EB02", + "EB03", + "EB04", + "EB05", + "EB06", + "EB07", + "EB08", + "EB10", + "EB11", + "EB12", + "EB13", + "EB14", + "EB15", + "EB16", + "EB17", + "EB18", + "EB20", + "EB21", + "EB22", + "EB23", + "EB24", + "EB25", + "EB26", + "EB27", + "EB30", + "EB31", + "EB32", + "EB33", + "EB34", + "EB35", + "EB36", + "EB37", + "EB40", + "EB41", + "EB42", + "EB43", + "EB44", + "EB45", + "EB46", + "EB47", + "EB50", + "EB51", + "EB52", + "EB53", + "EB54", + "EB55", + "EB56", + "EB57", + "EB60", + "EB61", + "EB62", + "EB63", + "EB64", + "EB65", + "EB66", + "EB67", + "EB70", + "EB71", + "EB72", + "EB73", + "EB74", + "EB75", + "EB76", + "EB80", + "EB81", + "EB82", + "EB83", + "EB84", + "EB85", + "EB86", + "EB90", + "EB91", + "EB92", + "EB93", + "EB94", + "EB95", + "EB96", + "EC41", + "FA01", + "FA02", + "FA03", + "FA04", + "FA05", + "FA06", + "FA07", + "FA08", + "FA09", + "FA11", + "FA12", + "FA13", + "FA14", + "FA15", + "FA16", + "FA17", + "FA18", + "FA19", + "FA21", + "FA22", + "FA23", + "FA24", + "FA25", + "FA26", + "FA27", + "FA28", + "FA29", + "FA31", + "FA32", + "FA33", + "FA34", + "FA35", + "FA36", + "FA37", + "FA38", + "FA39", + "FA41", + "FA42", + "FA43", + "FA44", + "FA45", + "FA46", + "FA47", + "FA48", + "FA49", + "FA51", + "FA52", + "FA53", + "FA54", + "FA55", + "FA56", + "FA57", + "FA58", + "FA59", + "FA61", + "FA62", + "FA63", + "FA64", + "FA65", + "FA66", + "FA67", + "FA68", + "FA69", + "FA71", + "FA72", + "FA73", + "FA74", + "FA75", + "FA76", + "FA77", + "FA78", + "FA79", + "FA81", + "FA82", + "FA83", + "FA84", + "FA85", + "FA86", + "FA87", + "FA88", + "FA89", + "FA91", + "FA92", + "FA93", + "FA94", + "FA95", + "FA96", + "FA97", + "FA98", + "FA99", + "FB00", + "FB01", + "FB02", + "FB03", + "FB04", + "FB05", + "FB06", + "FB07", + "FB10", + "FB11", + "FB12", + "FB13", + "FB14", + "FB15", + "FB16", + "FB17", + "FB18", + "FB19", + "FB21", + "FB22", + "FB23", + "FB24", + "FB25", + "FB26", + "FB27", + "FB28", + "FB29", + "FB31", + "FB32", + "FB33", + "FB34", + "FB35", + "FB36", + "FB37", + "FB38", + "FB39", + "FB40", + "FB41", + "FB42", + "FB43", + "FB44", + "FB45", + "FB46", + "FB47", + "FB48", + "FB49", + "FB50", + "FB51", + "FB52", + "FB53", + "FB54", + "FB55", + "FB56", + "FB57", + "FB58", + "FB59", + "FB61", + "FB62", + "FB63", + "FB64", + "FB65", + "FB66", + "FB67", + "FB68", + "FB69", + "FB71", + "FB74", + "FB75", + "FB76", + "FB77", + "FB78", + "FB79", + "FB84", + "FB85", + "FB86", + "FB87", + "FB88", + "FB89", + "FB90", + "FB95", + "FB96", + "FB97", + "FB98", + "FB99", + "FC20", + "FC30", + "FC31", + "FC40", + "FC41", + "FC50", + "FC51", + "FC52", + "FC53", + "FC60", + "FC61", + "FC62", + "FC63", + "FC64", + "FC70", + "FC71", + "FC72", + "FC73", + "FC74", + "FC75", + "FC80", + "FC81", + "FC83", + "FC84", + "FC85", + "FC86", + "FC87", + "FC90", + "FC91", + "FC93", + "FC94", + "FC95", + "FC96", + "FC97", + "GA01", + "GA02", + "GA03", + "GA04", + "GA05", + "GA06", + "GA07", + "GA09", + "GA11", + "GA12", + "GA13", + "GA14", + "GA15", + "GA16", + "GA17", + "GA21", + "GA22", + "GA23", + "GA24", + "GA25", + "GA26", + "GA27", + "GA29", + "GA31", + "GA32", + "GA33", + "GA34", + "GA35", + "GA36", + "GA37", + "GA38", + "GA39", + "GA41", + "GA42", + "GA43", + "GA44", + "GA45", + "GA46", + "GA47", + "GA48", + "GA49", + "GA51", + "GA52", + "GA53", + "GA54", + "GA55", + "GA56", + "GA57", + "GA58", + "GA59", + "GA61", + "GA62", + "GA63", + "GA64", + "GA65", + "GA66", + "GA67", + "GA68", + "GA69", + "GA71", + "GA72", + "GA73", + "GA74", + "GA75", + "GA76", + "GA77", + "GA78", + "GA79", + "GA81", + "GA82", + "GA83", + "GA84", + "GA85", + "GA86", + "GA87", + "GA88", + "GA89", + "GA91", + "GA92", + "GA93", + "GA94", + "GA95", + "GA96", + "GA97", + "GA98", + "GB06", + "GB07", + "GB30", + "GB40", + "GB41", + "GB50", + "GB51", + "GB60", + "GB61", + "GB62", + "GB70", + "GB71", + "GB72", + "GB80", + "GB81", + "GB91", + "GC04", + "GC05", + "GC06", + "GC07", + "GC08", + "GC15", + "GC16", + "GC17", + "GC18", + "GC26", + "GC28", + "GC38", + "GC69", + "GC79", + "HA01", + "HA02", + "HA03", + "HA04", + "HA05", + "HA06", + "HA07", + "HA08", + "HA09", + "HA11", + "HA12", + "HA13", + "HA14", + "HA15", + "HA16", + "HA17", + "HA18", + "HA19", + "HA21", + "HA22", + "HA23", + "HA24", + "HA25", + "HA26", + "HA27", + "HA28", + "HA29", + "HA31", + "HA32", + "HA33", + "HA34", + "HA35", + "HA36", + "HA37", + "HA38", + "HA39", + "HA41", + "HA42", + "HA43", + "HA44", + "HA45", + "HA46", + "HA47", + "HA48", + "HA49", + "HA51", + "HA52", + "HA53", + "HA54", + "HA55", + "HA56", + "HA57", + "HA58", + "HA59", + "HA61", + "HA62", + "HA63", + "HA64", + "HA65", + "HA66", + "HA67", + "HA68", + "HA69", + "HA71", + "HA72", + "HA73", + "HA74", + "HA75", + "HA76", + "HA77", + "HA78", + "HA79", + "HA81", + "HA82", + "HA83", + "HA84", + "HA85", + "HA86", + "HA87", + "HA88", + "HA89", + "HA91", + "HA92", + "HA93", + "HA94", + "HA95", + "HA96", + "HA97", + "HA98", + "HA99", + "HB01", + "HB10", + "HB11", + "HB20", + "HB21", + "HB22", + "HB30", + "HB31", + "HB32", + "HB40", + "HB41", + "HB42", + "HB43", + "HB50", + "HB51", + "HB52", + "HB53", + "HB60", + "HB61", + "HB62", + "HB63", + "HB64", + "HB70", + "HB71", + "HB72", + "HB73", + "HB74", + "HB80", + "HB81", + "HB82", + "HB83", + "HB84", + "HB85", + "HB90", + "HB91", + "HB92", + "HB93", + "HB94", + "HB95", + "IA01", + "IA02", + "IA03", + "IA04", + "IA05", + "IA06", + "IA07", + "IA08", + "IA09", + "IA11", + "IA12", + "IA13", + "IA14", + "IA15", + "IA16", + "IA17", + "IA18", + "IA19", + "IA21", + "IA22", + "IA23", + "IA24", + "IA25", + "IA26", + "IA27", + "IA28", + "IA29", + "IA31", + "IA32", + "IA33", + "IA34", + "IA35", + "IA36", + "IA37", + "IA38", + "IA39", + "IA41", + "IA42", + "IA43", + "IA44", + "IA45", + "IA46", + "IA47", + "IA48", + "IA49", + "IA51", + "IA52", + "IA53", + "IA54", + "IA55", + "IA56", + "IA57", + "IA58", + "IA59", + "IA61", + "IA62", + "IA63", + "IA64", + "IA65", + "IA66", + "IA67", + "IA68", + "IA69", + "IA71", + "IA72", + "IA73", + "IA74", + "IA75", + "IA76", + "IA77", + "IA78", + "IA79", + "IA81", + "IA82", + "IA83", + "IA84", + "IA85", + "IA86", + "IA87", + "IA88", + "IA89", + "IA91", + "IA92", + "IA93", + "IA94", + "IA95", + "IA96", + "IA97", + "IA98", + "IA99", + "IB00", + "IB01", + "IB02", + "IB03", + "IB04", + "IB05", + "IB06", + "IB10", + "IB11", + "IB12", + "IB13", + "IB14", + "IB15", + "IB16", + "IB20", + "IB21", + "IB22", + "IB23", + "IB24", + "IB25", + "IB26", + "IB27", + "IB30", + "IB31", + "IB32", + "IB33", + "IB34", + "IB35", + "IB36", + "IB37", + "IB38", + "IB40", + "IB41", + "IB42", + "IB43", + "IB44", + "IB45", + "IB46", + "IB47", + "IB48", + "IB49", + "IB50", + "IB51", + "IB52", + "IB53", + "IB54", + "IB55", + "IB56", + "IB57", + "IB58", + "IB59", + "IB60", + "IB61", + "IB62", + "IB63", + "IB64", + "IB65", + "IB66", + "IB67", + "IB68", + "IB69", + "IB70", + "IB71", + "IB72", + "IB73", + "IB74", + "IB75", + "IB76", + "IB77", + "IB78", + "IB79", + "IB80", + "IB81", + "IB82", + "IB83", + "IB84", + "IB85", + "IB86", + "IB87", + "IB88", + "IB89", + "IB90", + "IB91", + "IB92", + "IB93", + "IB94", + "IB95", + "IB96", + "IB97", + "IB98", + "IB99", + "JA01", + "JA02", + "JA03", + "JA04", + "JA05", + "JA06", + "JA07", + "JA08", + "JA09", + "JA11", + "JA12", + "JA13", + "JA14", + "JA15", + "JA16", + "JA17", + "JA18", + "JA19", + "JA21", + "JA22", + "JA23", + "JA24", + "JA25", + "JA26", + "JA27", + "JA28", + "JA29", + "JA31", + "JA32", + "JA33", + "JA34", + "JA35", + "JA36", + "JA37", + "JA38", + "JA39", + "JA41", + "JA42", + "JA43", + "JA44", + "JA45", + "JA46", + "JA47", + "JA48", + "JA49", + "JA51", + "JA52", + "JA53", + "JA54", + "JA55", + "JA56", + "JA57", + "JA58", + "JA59", + "JA61", + "JA62", + "JA63", + "JA64", + "JA65", + "JA66", + "JA67", + "JA68", + "JA69", + "JA71", + "JA72", + "JA73", + "JA74", + "JA75", + "JA76", + "JA77", + "JA78", + "JA79", + "JA81", + "JA82", + "JA83", + "JA84", + "JA85", + "JA86", + "JA87", + "JA88", + "JA89", + "JA91", + "JA92", + "JA93", + "JA94", + "JA95", + "JA96", + "JA97", + "JA98", + "JA99", + "JB00", + "JB01", + "JB02", + "JB03", + "JB04", + "JB05", + "JB06", + "JB07", + "JB08", + "JB09", + "JB10", + "JB11", + "JB12", + "JB13", + "JB14", + "JB15", + "JB16", + "JB17", + "JB18", + "JB19", + "JB20", + "JB21", + "JB22", + "JB23", + "JB24", + "JB25", + "JB26", + "JB27", + "JB28", + "JB29", + "JB30", + "JB31", + "JB32", + "JB33", + "JB34", + "JB35", + "JB36", + "JB37", + "JB38", + "JB39", + "JB40", + "JB41", + "JB42", + "JB43", + "JB44", + "JB45", + "JB46", + "JB47", + "JB48", + "JB49", + "JB50", + "JB51", + "JB52", + "JB53", + "JB54", + "JB55", + "JB56", + "JB57", + "JB58", + "JB59", + "JB60", + "JB61", + "JB62", + "JB63", + "JB64", + "JB65", + "JB66", + "JB67", + "JB68", + "JB69", + "JB70", + "JB71", + "JB72", + "JB73", + "JB74", + "JB75", + "JB76", + "JB77", + "JB78", + "JB79", + "JB80", + "JB81", + "JB82", + "JB83", + "JB84", + "JB85", + "JB86", + "JB87", + "JB88", + "JB89", + "JB90", + "JB91", + "JB92", + "JB93", + "JB94", + "JB95", + "JB96", + "JB97", + "JB98", + "JB99", + "JC70", + "JC80", + "JC90", + "KA01", + "KA02", + "KA03", + "KA04", + "KA05", + "KA06", + "KA07", + "KA08", + "KA09", + "KA11", + "KA12", + "KA13", + "KA14", + "KA15", + "KA16", + "KA17", + "KA18", + "KA19", + "KA21", + "KA22", + "KA23", + "KA24", + "KA25", + "KA26", + "KA27", + "KA28", + "KA29", + "KA31", + "KA32", + "KA33", + "KA34", + "KA35", + "KA36", + "KA37", + "KA38", + "KA39", + "KA41", + "KA42", + "KA43", + "KA44", + "KA45", + "KA46", + "KA47", + "KA48", + "KA49", + "KA51", + "KA52", + "KA53", + "KA54", + "KA55", + "KA56", + "KA57", + "KA58", + "KA59", + "KA61", + "KA62", + "KA63", + "KA64", + "KA65", + "KA66", + "KA67", + "KA68", + "KA69", + "KA71", + "KA72", + "KA73", + "KA74", + "KA75", + "KA76", + "KA77", + "KA78", + "KA79", + "KA81", + "KA82", + "KA83", + "KA84", + "KA85", + "KA86", + "KA87", + "KA88", + "KA89", + "KA91", + "KA92", + "KA93", + "KA94", + "KA95", + "KA96", + "KA97", + "KA98", + "KA99", + "KB00", + "KB01", + "KB02", + "KB03", + "KB04", + "KB05", + "KB06", + "KB07", + "KB08", + "KB09", + "KB10", + "KB11", + "KB12", + "KB13", + "KB14", + "KB15", + "KB16", + "KB17", + "KB18", + "KB19", + "KB20", + "KB21", + "KB22", + "KB23", + "KB24", + "KB25", + "KB26", + "KB27", + "KB28", + "KB29", + "KB30", + "KB31", + "KB32", + "KB33", + "KB34", + "KB35", + "KB36", + "KB37", + "KB38", + "KB39", + "KB40", + "KB41", + "KB42", + "KB43", + "KB44", + "KB45", + "KB46", + "KB47", + "KB48", + "KB49", + "KB50", + "KB51", + "KB52", + "KB53", + "KB54", + "KB55", + "KB56", + "KB57", + "KB58", + "KB59", + "KB60", + "KB61", + "KB62", + "KB63", + "KB64", + "KB65", + "KB66", + "KB67", + "KB68", + "KB69", + "KB70", + "KB71", + "KB72", + "KB73", + "KB74", + "KB75", + "KB76", + "KB77", + "KB78", + "KB79", + "KB80", + "KB81", + "KB82", + "KB83", + "KB84", + "KB85", + "KB86", + "KB87", + "KB88", + "KB89", + "KB90", + "KB91", + "KB92", + "KB93", + "KB94", + "KB95", + "KB96", + "KB97", + "KB98", + "KB99", + "KC40", + "KC50", + "KC60", + "KC61", + "KC70", + "KC71", + "KC80", + "KC90", + "KC91", + "LA01", + "LA02", + "LA03", + "LA04", + "LA05", + "LA06", + "LA07", + "LA08", + "LA09", + "LA11", + "LA12", + "LA13", + "LA14", + "LA15", + "LA16", + "LA17", + "LA18", + "LA19", + "LA21", + "LA22", + "LA23", + "LA24", + "LA25", + "LA26", + "LA27", + "LA28", + "LA29", + "LA31", + "LA32", + "LA33", + "LA34", + "LA35", + "LA36", + "LA37", + "LA38", + "LA39", + "LA41", + "LA42", + "LA43", + "LA44", + "LA45", + "LA46", + "LA47", + "LA48", + "LA49", + "LA51", + "LA52", + "LA53", + "LA54", + "LA55", + "LA56", + "LA57", + "LA58", + "LA59", + "LA61", + "LA62", + "LA63", + "LA64", + "LA65", + "LA66", + "LA67", + "LA68", + "LA69", + "LA71", + "LA72", + "LA73", + "LA74", + "LA75", + "LA76", + "LA77", + "LA78", + "LA79", + "LA81", + "LA82", + "LA83", + "LA84", + "LA85", + "LA86", + "LA87", + "LA88", + "LA89", + "LA91", + "LA92", + "LA93", + "LA94", + "LA95", + "LA96", + "LA97", + "LA98", + "LA99", + "LB00", + "LB01", + "LB02", + "LB03", + "LB04", + "LB05", + "LB06", + "LB07", + "LB08", + "LB09", + "LB10", + "LB11", + "LB12", + "LB13", + "LB14", + "LB15", + "LB16", + "LB17", + "LB18", + "LB19", + "LB20", + "LB21", + "LB22", + "LB23", + "LB24", + "LB25", + "LB26", + "LB27", + "LB28", + "LB29", + "LB30", + "LB31", + "LB32", + "LB33", + "LB34", + "LB35", + "LB36", + "LB37", + "LB38", + "LB39", + "LB40", + "LB41", + "LB42", + "LB43", + "LB44", + "LB45", + "LB46", + "LB47", + "LB48", + "LB49", + "LB50", + "LB51", + "LB52", + "LB53", + "LB54", + "LB55", + "LB56", + "LB57", + "LB58", + "LB59", + "LB60", + "LB61", + "LB62", + "LB63", + "LB64", + "LB65", + "LB66", + "LB67", + "LB68", + "LB69", + "LB70", + "LB71", + "LB72", + "LB73", + "LB74", + "LB75", + "LB76", + "LB77", + "LB78", + "LB79", + "LB80", + "LB81", + "LB82", + "LB83", + "LB84", + "LB85", + "LB86", + "LB87", + "LB88", + "LB89", + "LB90", + "LB91", + "LB92", + "LB93", + "LB94", + "LB95", + "LB96", + "LB97", + "LB98", + "LB99", + "LC00", + "LC01", + "LC10", + "LC11", + "LC12", + "LC20", + "LC21", + "LC22", + "LC30", + "LC31", + "LC32", + "LC40", + "LC41", + "LC42", + "LC43", + "LC50", + "LC51", + "LC52", + "LC53", + "LC54", + "LC60", + "LC61", + "LC62", + "LC63", + "LC64", + "LC70", + "LC71", + "LC72", + "LC73", + "LC74", + "LC80", + "LC81", + "LC82", + "LC83", + "LC90", + "LC91", + "LC92", + "MA01", + "MA02", + "MA03", + "MA04", + "MA05", + "MA06", + "MA07", + "MA08", + "MA09", + "MA11", + "MA12", + "MA13", + "MA14", + "MA15", + "MA16", + "MA17", + "MA18", + "MA19", + "MA21", + "MA22", + "MA23", + "MA24", + "MA25", + "MA26", + "MA27", + "MA28", + "MA29", + "MA31", + "MA32", + "MA33", + "MA34", + "MA35", + "MA36", + "MA37", + "MA38", + "MA39", + "MA41", + "MA42", + "MA43", + "MA44", + "MA45", + "MA46", + "MA47", + "MA48", + "MA49", + "MA51", + "MA52", + "MA53", + "MA54", + "MA55", + "MA56", + "MA57", + "MA58", + "MA59", + "MA61", + "MA62", + "MA63", + "MA64", + "MA65", + "MA66", + "MA67", + "MA68", + "MA69", + "MA71", + "MA72", + "MA73", + "MA74", + "MA75", + "MA76", + "MA77", + "MA78", + "MA79", + "MA81", + "MA82", + "MA83", + "MA84", + "MA85", + "MA86", + "MA87", + "MA88", + "MA89", + "MA91", + "MA92", + "MA93", + "MA94", + "MA95", + "MA96", + "MA97", + "MA98", + "MA99", + "MB00", + "MB01", + "MB02", + "MB03", + "MB04", + "MB05", + "MB06", + "MB07", + "MB08", + "MB09", + "MB10", + "MB11", + "MB12", + "MB13", + "MB14", + "MB15", + "MB16", + "MB17", + "MB18", + "MB19", + "MB20", + "MB21", + "MB22", + "MB23", + "MB24", + "MB25", + "MB26", + "MB27", + "MB28", + "MB29", + "MB30", + "MB31", + "MB32", + "MB33", + "MB34", + "MB35", + "MB36", + "MB37", + "MB38", + "MB39", + "MB40", + "MB41", + "MB42", + "MB43", + "MB44", + "MB45", + "MB46", + "MB47", + "MB48", + "MB49", + "MB50", + "MB51", + "MB52", + "MB53", + "MB54", + "MB55", + "MB56", + "MB57", + "MB58", + "MB59", + "MB60", + "MB61", + "MB62", + "MB63", + "MB64", + "MB65", + "MB66", + "MB67", + "MB68", + "MB69", + "MB70", + "MB71", + "MB72", + "MB73", + "MB74", + "MB75", + "MB76", + "MB77", + "MB78", + "MB79", + "MB80", + "MB81", + "MB82", + "MB83", + "MB84", + "MB85", + "MB86", + "MB87", + "MB88", + "MB89", + "MB90", + "MB91", + "MB92", + "MB93", + "MB94", + "MB95", + "MB96", + "MB97", + "MB98", + "MB99", + "MC00", + "MC01", + "MC02", + "MC10", + "MC11", + "MC12", + "MC20", + "MC21", + "MC22", + "MC30", + "MC31", + "MC32", + "MC40", + "MC41", + "MC42", + "MC51", + "MC60", + "MC70", + "MC80", + "MC81", + "MC90", + "MC91", + "MC92", + "NA01", + "NA02", + "NA03", + "NA04", + "NA05", + "NA06", + "NA07", + "NA08", + "NA09", + "NA11", + "NA12", + "NA13", + "NA14", + "NA15", + "NA16", + "NA17", + "NA18", + "NA19", + "NA21", + "NA22", + "NA23", + "NA24", + "NA25", + "NA26", + "NA27", + "NA28", + "NA29", + "NA31", + "NA32", + "NA33", + "NA34", + "NA35", + "NA36", + "NA37", + "NA38", + "NA39", + "NA41", + "NA42", + "NA43", + "NA44", + "NA45", + "NA46", + "NA47", + "NA48", + "NA49", + "NA51", + "NA52", + "NA53", + "NA54", + "NA55", + "NA56", + "NA57", + "NA58", + "NA59", + "NA61", + "NA62", + "NA63", + "NA64", + "NA65", + "NA66", + "NA67", + "NA68", + "NA69", + "NA71", + "NA72", + "NA73", + "NA74", + "NA75", + "NA76", + "NA77", + "NA78", + "NA79", + "NA81", + "NA82", + "NA83", + "NA84", + "NA85", + "NA86", + "NA87", + "NA88", + "NA89", + "NA91", + "NA92", + "NA93", + "NA94", + "NA95", + "NA96", + "NA97", + "NA98", + "NA99", + "NB00", + "NB01", + "NB02", + "NB03", + "NB04", + "NB05", + "NB06", + "NB07", + "NB08", + "NB09", + "NB10", + "NB11", + "NB12", + "NB13", + "NB14", + "NB15", + "NB16", + "NB17", + "NB18", + "NB19", + "NB20", + "NB21", + "NB22", + "NB23", + "NB24", + "NB25", + "NB26", + "NB27", + "NB28", + "NB29", + "NB30", + "NB31", + "NB32", + "NB33", + "NB34", + "NB35", + "NB36", + "NB37", + "NB38", + "NB39", + "NB40", + "NB41", + "NB42", + "NB43", + "NB44", + "NB45", + "NB46", + "NB47", + "NB48", + "NB49", + "NB50", + "NB51", + "NB52", + "NB53", + "NB54", + "NB55", + "NB56", + "NB57", + "NB58", + "NB59", + "NB60", + "NB61", + "NB62", + "NB63", + "NB64", + "NB65", + "NB66", + "NB67", + "NB68", + "NB69", + "NB70", + "NB71", + "NB72", + "NB73", + "NB74", + "NB75", + "NB76", + "NB77", + "NB78", + "NB79", + "NB80", + "NB81", + "NB82", + "NB83", + "NB84", + "NB85", + "NB86", + "NB87", + "NB88", + "NB89", + "NB90", + "NB91", + "NB92", + "NB93", + "NB94", + "NB95", + "NB96", + "NB97", + "NB98", + "NB99", + "NC00", + "NC01", + "NC02", + "NC10", + "NC11", + "NC12", + "NC20", + "NC21", + "NC22", + "NC23", + "NC30", + "NC31", + "NC32", + "NC33", + "NC40", + "NC41", + "NC42", + "NC43", + "NC50", + "NC51", + "NC52", + "NC53", + "NC60", + "NC61", + "NC62", + "NC63", + "NC64", + "NC70", + "NC71", + "NC72", + "NC73", + "NC80", + "NC81", + "NC82", + "NC83", + "NC90", + "NC91", + "NC92", + "NC93", + "NC94", + "OA01", + "OA02", + "OA03", + "OA04", + "OA05", + "OA06", + "OA07", + "OA08", + "OA09", + "OA11", + "OA12", + "OA13", + "OA14", + "OA15", + "OA16", + "OA17", + "OA18", + "OA19", + "OA21", + "OA22", + "OA23", + "OA24", + "OA25", + "OA26", + "OA27", + "OA28", + "OA29", + "OA31", + "OA32", + "OA33", + "OA34", + "OA35", + "OA36", + "OA37", + "OA38", + "OA39", + "OA41", + "OA42", + "OA43", + "OA44", + "OA45", + "OA46", + "OA47", + "OA48", + "OA49", + "OA51", + "OA52", + "OA53", + "OA54", + "OA55", + "OA56", + "OA57", + "OA58", + "OA59", + "OA61", + "OA62", + "OA63", + "OA64", + "OA65", + "OA66", + "OA67", + "OA68", + "OA69", + "OA71", + "OA72", + "OA73", + "OA74", + "OA75", + "OA76", + "OA77", + "OA78", + "OA79", + "OA81", + "OA82", + "OA83", + "OA84", + "OA85", + "OA86", + "OA87", + "OA88", + "OA89", + "OA91", + "OA92", + "OA93", + "OA94", + "OA95", + "OA96", + "OA97", + "OA98", + "OA99", + "OB00", + "OB01", + "OB02", + "OB03", + "OB04", + "OB05", + "OB06", + "OB07", + "OB08", + "OB09", + "OB10", + "OB11", + "OB12", + "OB13", + "OB14", + "OB15", + "OB16", + "OB17", + "OB18", + "OB19", + "OB20", + "OB21", + "OB22", + "OB23", + "OB24", + "OB25", + "OB26", + "OB27", + "OB28", + "OB29", + "OB30", + "OB31", + "OB32", + "OB33", + "OB34", + "OB35", + "OB36", + "OB37", + "OB38", + "OB39", + "OB40", + "OB41", + "OB42", + "OB43", + "OB44", + "OB45", + "OB46", + "OB47", + "OB48", + "OB49", + "OB50", + "OB51", + "OB52", + "OB53", + "OB54", + "OB55", + "OB56", + "OB57", + "OB58", + "OB59", + "OB60", + "OB61", + "OB62", + "OB63", + "OB64", + "OB65", + "OB66", + "OB67", + "OB68", + "OB69", + "OB70", + "OB71", + "OB72", + "OB73", + "OB74", + "OB75", + "OB76", + "OB77", + "OB78", + "OB79", + "OB80", + "OB81", + "OB82", + "OB83", + "OB84", + "OB85", + "OB86", + "OB87", + "OB88", + "OB89", + "OB90", + "OB91", + "OB92", + "OB93", + "OB94", + "OB95", + "OB96", + "OB97", + "OB98", + "OB99", + "OC00", + "OC01", + "OC02", + "OC03", + "OC04", + "OC10", + "OC11", + "OC12", + "OC13", + "OC14", + "OC20", + "OC21", + "OC22", + "OC23", + "OC24", + "OC30", + "OC31", + "OC32", + "OC33", + "OC40", + "OC41", + "OC42", + "OC43", + "OC50", + "OC51", + "OC52", + "OC53", + "OC54", + "OC60", + "OC61", + "OC62", + "OC63", + "OC64", + "OC70", + "OC71", + "OC72", + "OC73", + "OC74", + "OC80", + "OC81", + "OC82", + "OC83", + "OC90", + "OC91", + "OC92", + "OC93", + "PA01", + "PA02", + "PA03", + "PA04", + "PA05", + "PA06", + "PA07", + "PA08", + "PA09", + "PA11", + "PA12", + "PA13", + "PA14", + "PA15", + "PA16", + "PA17", + "PA18", + "PA19", + "PA21", + "PA22", + "PA23", + "PA24", + "PA25", + "PA26", + "PA27", + "PA28", + "PA29", + "PA31", + "PA32", + "PA33", + "PA34", + "PA35", + "PA36", + "PA37", + "PA38", + "PA39", + "PA41", + "PA42", + "PA43", + "PA44", + "PA45", + "PA46", + "PA47", + "PA48", + "PA49", + "PA51", + "PA52", + "PA53", + "PA54", + "PA55", + "PA56", + "PA57", + "PA58", + "PA59", + "PA61", + "PA62", + "PA63", + "PA64", + "PA65", + "PA66", + "PA67", + "PA68", + "PA69", + "PA71", + "PA72", + "PA73", + "PA74", + "PA75", + "PA76", + "PA77", + "PA78", + "PA79", + "PA81", + "PA82", + "PA83", + "PA84", + "PA85", + "PA86", + "PA87", + "PA88", + "PA89", + "PA91", + "PA92", + "PA93", + "PA94", + "PA95", + "PA96", + "PA97", + "PA98", + "PA99", + "PB00", + "PB01", + "PB02", + "PB03", + "PB04", + "PB05", + "PB06", + "PB07", + "PB08", + "PB09", + "PB10", + "PB11", + "PB12", + "PB13", + "PB14", + "PB15", + "PB16", + "PB17", + "PB18", + "PB19", + "PB20", + "PB21", + "PB22", + "PB23", + "PB24", + "PB25", + "PB26", + "PB27", + "PB28", + "PB29", + "PB30", + "PB31", + "PB32", + "PB33", + "PB34", + "PB35", + "PB36", + "PB37", + "PB38", + "PB39", + "PB40", + "PB41", + "PB42", + "PB43", + "PB44", + "PB45", + "PB46", + "PB47", + "PB48", + "PB49", + "PB50", + "PB51", + "PB52", + "PB53", + "PB54", + "PB55", + "PB56", + "PB57", + "PB58", + "PB59", + "PB60", + "PB61", + "PB62", + "PB63", + "PB64", + "PB65", + "PB66", + "PB67", + "PB68", + "PB69", + "PB70", + "PB71", + "PB72", + "PB73", + "PB74", + "PB75", + "PB76", + "PB77", + "PB78", + "PB79", + "PB80", + "PB81", + "PB82", + "PB83", + "PB84", + "PB85", + "PB86", + "PB87", + "PB88", + "PB89", + "PB90", + "PB91", + "PB92", + "PB93", + "PB94", + "PB95", + "PB96", + "PB97", + "PB98", + "PB99", + "PC00", + "PC01", + "PC02", + "PC03", + "PC04", + "PC10", + "PC11", + "PC12", + "PC13", + "PC20", + "PC21", + "PC22", + "PC23", + "PC30", + "PC31", + "PC32", + "PC33", + "PC40", + "PC41", + "PC42", + "PC43", + "PC44", + "PC50", + "PC51", + "PC52", + "PC53", + "PC60", + "PC61", + "PC62", + "PC63", + "PC70", + "PC71", + "PC72", + "PC73", + "PC74", + "PC80", + "PC81", + "PC82", + "PC83", + "PC90", + "PC91", + "PC92", + "PC93", + "QA01", + "QA02", + "QA03", + "QA04", + "QA05", + "QA06", + "QA07", + "QA08", + "QA09", + "QA11", + "QA12", + "QA13", + "QA14", + "QA15", + "QA16", + "QA17", + "QA18", + "QA19", + "QA21", + "QA22", + "QA23", + "QA24", + "QA25", + "QA26", + "QA27", + "QA28", + "QA29", + "QA31", + "QA32", + "QA33", + "QA34", + "QA35", + "QA36", + "QA37", + "QA38", + "QA39", + "QA41", + "QA42", + "QA43", + "QA44", + "QA45", + "QA46", + "QA47", + "QA48", + "QA49", + "QA51", + "QA52", + "QA53", + "QA54", + "QA55", + "QA56", + "QA57", + "QA58", + "QA59", + "QA61", + "QA62", + "QA63", + "QA64", + "QA65", + "QA66", + "QA67", + "QA68", + "QA69", + "QA71", + "QA72", + "QA73", + "QA74", + "QA75", + "QA76", + "QA77", + "QA78", + "QA79", + "QA81", + "QA82", + "QA83", + "QA84", + "QA85", + "QA86", + "QA87", + "QA88", + "QA89", + "QA91", + "QA92", + "QA93", + "QA94", + "QA95", + "QA96", + "QA97", + "QA98", + "QA99", + "QB00", + "QB01", + "QB02", + "QB03", + "QB04", + "QB05", + "QB06", + "QB07", + "QB08", + "QB09", + "QB10", + "QB11", + "QB12", + "QB13", + "QB14", + "QB15", + "QB16", + "QB17", + "QB18", + "QB19", + "QB20", + "QB21", + "QB22", + "QB23", + "QB24", + "QB25", + "QB26", + "QB27", + "QB28", + "QB29", + "QB30", + "QB31", + "QB32", + "QB33", + "QB34", + "QB35", + "QB36", + "QB37", + "QB38", + "QB39", + "QB40", + "QB41", + "QB42", + "QB43", + "QB44", + "QB45", + "QB46", + "QB47", + "QB48", + "QB49", + "QB50", + "QB51", + "QB52", + "QB53", + "QB54", + "QB55", + "QB56", + "QB57", + "QB58", + "QB59", + "QB60", + "QB61", + "QB62", + "QB63", + "QB64", + "QB65", + "QB66", + "QB67", + "QB68", + "QB69", + "QB70", + "QB71", + "QB72", + "QB73", + "QB74", + "QB75", + "QB76", + "QB77", + "QB78", + "QB79", + "QB80", + "QB81", + "QB82", + "QB83", + "QB84", + "QB85", + "QB86", + "QB87", + "QB88", + "QB89", + "QB90", + "QB91", + "QB92", + "QB93", + "QB94", + "QB95", + "QB96", + "QB97", + "QB98", + "QB99", + "QC00", + "QC01", + "QC02", + "QC03", + "QC10", + "QC11", + "QC12", + "QC13", + "QC20", + "QC21", + "QC22", + "QC23", + "QC30", + "QC31", + "QC32", + "QC33", + "QC40", + "QC41", + "QC42", + "QC50", + "QC51", + "QC60", + "QC61", + "QC70", + "QC71", + "QC80", + "QC90", + "RA01", + "RA02", + "RA03", + "RA04", + "RA05", + "RA06", + "RA07", + "RA08", + "RA09", + "RA11", + "RA12", + "RA13", + "RA14", + "RA15", + "RA16", + "RA17", + "RA18", + "RA19", + "RA21", + "RA22", + "RA23", + "RA24", + "RA25", + "RA26", + "RA27", + "RA28", + "RA29", + "RA31", + "RA32", + "RA33", + "RA34", + "RA35", + "RA36", + "RA37", + "RA38", + "RA39", + "RA41", + "RA42", + "RA43", + "RA44", + "RA45", + "RA46", + "RA47", + "RA48", + "RA49", + "RA51", + "RA52", + "RA53", + "RA54", + "RA55", + "RA56", + "RA57", + "RA58", + "RA59", + "RA61", + "RA62", + "RA63", + "RA64", + "RA65", + "RA66", + "RA67", + "RA68", + "RA69", + "RA71", + "RA72", + "RA73", + "RA74", + "RA75", + "RA76", + "RA77", + "RA78", + "RA79", + "RA81", + "RA82", + "RA83", + "RA84", + "RA85", + "RA86", + "RA87", + "RA88", + "RA89", + "RA91", + "RA92", + "RA93", + "RA94", + "RA95", + "RA96", + "RA97", + "RA98", + "RA99", + "RB00", + "RB01", + "RB02", + "RB03", + "RB04", + "RB05", + "RB06", + "RB07", + "RB08", + "RB09", + "RB10", + "RB11", + "RB12", + "RB13", + "RB14", + "RB15", + "RB16", + "RB17", + "RB18", + "RB19", + "RB20", + "RB21", + "RB22", + "RB24", + "RB25", + "RB26", + "RB27", + "RB28", + "RB29", + "RB30", + "RB31", + "RB32", + "RB34", + "RB35", + "RB36", + "RB37", + "RB38", + "RB39", + "RB40", + "RB41", + "RB42", + "RB43", + "RB46", + "RB47", + "RB48", + "RB49", + "RB50", + "RB51", + "RB52", + "RB57", + "RB58", + "RB60", + "RB61", + "RB62", + "RB70", + "RB71", + "RB72", + "RB80", + "RB81", + "RB82", + "RB90", + "RB91", + "RB92", + "RC00", + "RC13", + "RC22" + ], + "prefix": [ + "3Y", + "=3Y8XSA", + "=7S8AAA", + "=8J1RF", + "=8J1RF/M", + "=8J1RL", + "=8J60JARE", + "=8T2BH", + "=9V0A", + "=AB0KG/KC4", + "=AT10BP", + "AX0", + "AY1Z", + "AY2Z", + "AY3Z", + "AY4Z", + "AY5Z", + "AY6Z", + "AY7Z", + "AY8Z", + "AY9Z", + "=CE9/K2ARB", + "=CE9/R3CA", + "=CE9/R3RRC", + "=CE9/R7C", + "=CE9/SQ1SGB", + "=CE9VPM", + "=D8A", + "=DH1HB/P", + "=DP0/OJ1ABOA", + "=DP0GVN", + "=DP0GVN/P", + "=DP1POL", + "=DP1POL/P", + "=EM1HO", + "=EM1KCC", + "=EM1KGG", + "=EM1KY", + "=EM1U", + "=EM1U/P", + "=EM1UA", + "=EM1UC", + "FT0Y", + "FT1Y", + "FT2Y", + "FT3Y", + "FT4Y", + "FT5Y", + "=FT5YJ/P", + "=FT5YK/KC4", + "=FT5YK/P", + "FT6Y", + "FT7Y", + "FT8Y", + "=HF0ANT", + "=HL1TJF/KC4", + "=HL1TR/KC4", + "=I0HCJ/KC4", + "=I0QHM/IA0PS", + "=I0QHM/KC4", + "=IA/IZ2QEJ", + "=IA/IZ3SUS", + "=IA0/IZ1KHY", + "=IA0/IZ1KHY/P", + "=IA0MZ", + "=IA0PS", + "=II0AMZS", + "=II0MZ", + "=IK7JGQ/KC4", + "=IR0PS", + "=JG2MLI/ANT", + "=JH1TOF/ANT", + "=KC4/AB0KG", + "=KC4/FT5YK", + "=KC4/HL1TJF", + "=KC4/HL1TR", + "=KC4/I0HCJ", + "=KC4/I0QHM", + "=KC4/IK0AIH/P", + "=KC4/IK7JGQ", + "=KC4/K2ARB", + "=KC4/K6REF", + "=KC4/KC5AEX", + "=KC4/KD4VMM", + "=KC4/KE6ZYK", + "=KC4/KK6KO", + "=KC4/KL7RL", + "=KC4/N0NHP", + "=KC4/N2TA", + "=KC4/N3SIG", + "=KC4/NK3T", + "=KC4/R3CA", + "=KC4/R7C", + "=KC4/RW1AI", + "=KC4/UA1PAC", + "=KC4/VE0HSS", + "=KC4/W1MRQ", + "=KC4/W3ASA", + "=KC4/W3WKO", + "=KC4/W3WKP", + "=KC4/W4OEP", + "=KC4/WA1O", + "=KC4/WA2DKJ", + "=KC4/WB9YSD", + "=KC4AAA", + "=KC4AAA/NH6ON", + "=KC4AAB", + "=KC4AAC", + "=KC4AAD", + "=KC4AAE", + "=KC4AAF", + "=KC4USA", + "=KC4USB", + "=KC4USC", + "=KC4USD", + "=KC4USE", + "=KC4USF", + "=KC4USG", + "=KC4USH", + "=KC4USI", + "=KC4USJ", + "=KC4USK", + "=KC4USL", + "=KC4USM", + "=KC4USN", + "=KC4USO", + "=KC4USP", + "=KC4USQ", + "=KC4USR", + "=KC4USS", + "=KC4UST", + "=KC4USU", + "=KC4USV", + "=KC4USW", + "=KC4USX", + "=KC4USY", + "=KC4USZ", + "=KC5AEX/KC4", + "=KD4VMM/KC4", + "=KE6ZYK/KC4", + "=KK6KO/KC4", + "=KL7RL/KC4", + "=LU/FT5YJ", + "=LU/FT5YK", + "=LU/G0HFX/Z", + "LU1Z", + "LU2Z", + "LU3Z", + "LU4Z", + "LU5Z", + "=LU6ECW/Z", + "LU6Z", + "LU7Z", + "=LU8DBS/Z", + "LU8Z", + "LU9Z", + "=N0NHP/KC4", + "=N3SIG/KC4", + "=NK3T/KC4", + "=OH2FFP/P", + "=OJ1ABOA", + "=OP0LE", + "=OP0OL", + "=OR3AX", + "=OR4AX", + "=OR4TN", + "=R1/AT10BP", + "=R1ANA", + "=R1ANB", + "=R1AND", + "=R1AND/A", + "=R1AND/AT10BP", + "=R1ANH", + "=R1ANJ", + "=R1ANL", + "=R1ANM", + "=R1ANN", + "=R1ANP", + "=R1ANP/A", + "=R1ANR", + "=R1ANR/A", + "=R1ANT", + "=R3CA/KC4", + "=R3RRC/ANT", + "=R7C/ANT", + "=R7C/KC4", + "RI1AN", + "=RI1ANA", + "=RI1ANC", + "=RI1ANC/A", + "=RI1ANC/P", + "=RI1AND", + "=RI1ANL", + "=RI1ANM", + "=RI1ANN", + "=RI1ANP", + "=RI1ANR", + "=RI1ANV", + "=RI1ANW", + "=RI1ANX", + "=RI1ANZ", + "=RI63ANT", + "=SM/OH2FFP", + "=VE0HSS/KC4", + "VI0", + "=VI0ANZAC", + "VK0", + "=VK0BFG", + "=VP8/G0VZM/P", + "=VP8/MM0TJR/P", + "=VP8/UT1KY", + "=VP8ADE", + "=VP8ADE/B", + "=VP8AL", + "=VP8BF", + "=VP8CPG", + "=VP8CTR", + "=VP8DFK", + "=VP8DJB", + "=VP8DJB/P", + "=VP8DKF", + "=VP8DLJ", + "=VP8DLM", + "=VP8DMH", + "=VP8DMH/P", + "=VP8DOI", + "=VP8DOU", + "=VP8DPE", + "=VP8DPJ", + "=VP8PJ", + "=VP8ROT", + "=VU/R1AND", + "=VU2JBK/AT10", + "=VU3BPZ/P", + "=VU3BPZ/RI1", + "=VU3LBP", + "=VU3LBP/P", + "=W1MRQ/KC4", + "=W3ASA/KC4", + "=W3WKO/KC4", + "=W3WKP/KC4", + "=W4OEP/KC4", + "=WA1O/KC4", + "=WA2DKJ/KC4", + "=WB9YSD/KC4", + "ZL5", + "ZM5", + "=ZS6KX/7", + "ZS7" + ], + "worked": false, + "confirmed": false, + "flag": "aq.png", + "pp": "CE9", + "lat": -75.18079459816255, + "lon": 29.687499999999996, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "13": { + "dxcc": "14", + "cc": "AM", + "ccc": "ARM", + "name": "亚美尼亚", + "continent": "AS", + "ituzone": ["29"], + "cqzone": ["21"], + "timezone": "4", + "ccode": "51", + "aname": "Armenia", + "mh": ["LM29", "LM38", "LM39", "LN10", "LN11", "LN20", "LN21"], + "prefix": ["EK"], + "worked": false, + "confirmed": false, + "flag": "am.png", + "pp": "EK", + "lat": 40.559154598116976, + "lon": 44.65020576131686, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "14": { + "dxcc": "15", + "cc": "RX", + "ccc": "RUS", + "name": "俄罗斯亚洲", + "continent": "AS", + "ituzone": [ + "20", + "21", + "22", + "23", + "24", + "25", + "26", + "30", + "31", + "32", + "33", + "34", + "35", + "75" + ], + "cqzone": ["16", "17", "18", "19", "23"], + "timezone": "7", + "ccode": "643", + "aname": "Asiatic Russia", + "mh": [ + "AP05", + "AP06", + "AP07", + "AP08", + "AP15", + "AP16", + "AP17", + "AP18", + "AP24", + "AP25", + "AP26", + "AP27", + "AP34", + "AP35", + "AP36", + "AP37", + "AP45", + "AP46", + "AP55", + "AP56", + "AQ00", + "AQ01", + "AQ11", + "AQ21", + "LO84", + "LO85", + "LO86", + "LO87", + "LO92", + "LO93", + "LO94", + "LO95", + "LO96", + "LO97", + "LO98", + "LO99", + "LP90", + "LP91", + "LP92", + "LP93", + "LP94", + "MO01", + "MO02", + "MO03", + "MO04", + "MO05", + "MO06", + "MO07", + "MO08", + "MO09", + "MO12", + "MO13", + "MO14", + "MO15", + "MO16", + "MO17", + "MO18", + "MO19", + "MO24", + "MO25", + "MO26", + "MO27", + "MO28", + "MO29", + "MO34", + "MO35", + "MO36", + "MO37", + "MO38", + "MO39", + "MO44", + "MO45", + "MO46", + "MO47", + "MO48", + "MO49", + "MO54", + "MO55", + "MO56", + "MO57", + "MO58", + "MO59", + "MO63", + "MO64", + "MO65", + "MO66", + "MO67", + "MO68", + "MO69", + "MO73", + "MO74", + "MO75", + "MO76", + "MO77", + "MO78", + "MO79", + "MO83", + "MO84", + "MO85", + "MO86", + "MO87", + "MO88", + "MO89", + "MO90", + "MO91", + "MO92", + "MO93", + "MO94", + "MO95", + "MO96", + "MO97", + "MO98", + "MO99", + "MP00", + "MP01", + "MP02", + "MP03", + "MP04", + "MP05", + "MP10", + "MP11", + "MP12", + "MP13", + "MP14", + "MP15", + "MP16", + "MP20", + "MP21", + "MP22", + "MP23", + "MP24", + "MP25", + "MP26", + "MP27", + "MP28", + "MP29", + "MP30", + "MP31", + "MP32", + "MP33", + "MP34", + "MP35", + "MP36", + "MP37", + "MP38", + "MP39", + "MP40", + "MP41", + "MP42", + "MP43", + "MP44", + "MP45", + "MP46", + "MP47", + "MP48", + "MP49", + "MP50", + "MP51", + "MP52", + "MP53", + "MP54", + "MP55", + "MP56", + "MP57", + "MP58", + "MP59", + "MP60", + "MP61", + "MP62", + "MP63", + "MP64", + "MP65", + "MP66", + "MP67", + "MP68", + "MP69", + "MP70", + "MP71", + "MP72", + "MP73", + "MP74", + "MP75", + "MP76", + "MP77", + "MP78", + "MP79", + "MP80", + "MP81", + "MP82", + "MP83", + "MP84", + "MP85", + "MP86", + "MP87", + "MP88", + "MP89", + "MP90", + "MP91", + "MP92", + "MP93", + "MP94", + "MP95", + "MP96", + "MP97", + "MP98", + "MP99", + "MQ30", + "MQ31", + "MQ40", + "MQ41", + "MQ42", + "MQ43", + "MQ50", + "MQ51", + "MQ52", + "MQ53", + "MQ60", + "MQ61", + "MQ62", + "MQ70", + "MQ71", + "MQ72", + "MQ73", + "MQ80", + "MQ81", + "MQ82", + "MQ83", + "MQ90", + "MQ91", + "MQ92", + "MQ93", + "MQ94", + "NN29", + "NN39", + "NN49", + "NN59", + "NN79", + "NN89", + "NO00", + "NO01", + "NO02", + "NO03", + "NO04", + "NO05", + "NO06", + "NO07", + "NO08", + "NO09", + "NO10", + "NO11", + "NO12", + "NO13", + "NO14", + "NO15", + "NO16", + "NO17", + "NO18", + "NO19", + "NO20", + "NO21", + "NO22", + "NO23", + "NO24", + "NO25", + "NO26", + "NO27", + "NO28", + "NO29", + "NO30", + "NO31", + "NO32", + "NO33", + "NO34", + "NO35", + "NO36", + "NO37", + "NO38", + "NO39", + "NO40", + "NO41", + "NO42", + "NO43", + "NO44", + "NO45", + "NO46", + "NO47", + "NO48", + "NO49", + "NO50", + "NO51", + "NO52", + "NO53", + "NO54", + "NO55", + "NO56", + "NO57", + "NO58", + "NO59", + "NO60", + "NO61", + "NO62", + "NO63", + "NO64", + "NO65", + "NO66", + "NO67", + "NO68", + "NO69", + "NO70", + "NO71", + "NO72", + "NO73", + "NO74", + "NO75", + "NO76", + "NO77", + "NO78", + "NO79", + "NO80", + "NO81", + "NO82", + "NO83", + "NO84", + "NO85", + "NO86", + "NO87", + "NO88", + "NO89", + "NO90", + "NO91", + "NO92", + "NO93", + "NO94", + "NO95", + "NO96", + "NO97", + "NO98", + "NO99", + "NP00", + "NP01", + "NP02", + "NP03", + "NP04", + "NP05", + "NP06", + "NP07", + "NP08", + "NP09", + "NP10", + "NP11", + "NP12", + "NP13", + "NP14", + "NP15", + "NP16", + "NP17", + "NP18", + "NP19", + "NP20", + "NP21", + "NP22", + "NP23", + "NP24", + "NP25", + "NP26", + "NP27", + "NP28", + "NP29", + "NP30", + "NP31", + "NP32", + "NP33", + "NP34", + "NP35", + "NP36", + "NP37", + "NP38", + "NP39", + "NP40", + "NP41", + "NP42", + "NP43", + "NP44", + "NP45", + "NP46", + "NP47", + "NP48", + "NP49", + "NP50", + "NP51", + "NP52", + "NP53", + "NP54", + "NP55", + "NP56", + "NP57", + "NP58", + "NP59", + "NP60", + "NP61", + "NP62", + "NP63", + "NP64", + "NP65", + "NP66", + "NP67", + "NP68", + "NP69", + "NP70", + "NP71", + "NP72", + "NP73", + "NP74", + "NP75", + "NP76", + "NP77", + "NP78", + "NP79", + "NP80", + "NP81", + "NP82", + "NP83", + "NP84", + "NP85", + "NP86", + "NP87", + "NP88", + "NP89", + "NP90", + "NP91", + "NP92", + "NP93", + "NP94", + "NP95", + "NP96", + "NP97", + "NP98", + "NP99", + "NQ00", + "NQ01", + "NQ02", + "NQ03", + "NQ05", + "NQ10", + "NQ11", + "NQ12", + "NQ13", + "NQ14", + "NQ15", + "NQ16", + "NQ17", + "NQ20", + "NQ21", + "NQ22", + "NQ23", + "NQ24", + "NQ30", + "NQ31", + "NQ32", + "NQ33", + "NQ34", + "NQ35", + "NQ40", + "NQ41", + "NQ42", + "NQ43", + "NQ44", + "NQ45", + "NQ47", + "NQ50", + "NQ51", + "NQ52", + "NQ53", + "NQ54", + "NQ55", + "NQ57", + "NQ60", + "NQ61", + "NQ62", + "NQ63", + "NQ64", + "NQ65", + "NQ66", + "NQ67", + "NQ70", + "NQ71", + "NQ72", + "NQ73", + "NQ74", + "NQ75", + "NQ76", + "NQ77", + "NQ80", + "NQ81", + "NQ82", + "NQ83", + "NQ84", + "NQ85", + "NQ86", + "NQ87", + "NQ90", + "NQ91", + "NQ92", + "NQ93", + "NQ94", + "NQ95", + "NQ96", + "NQ97", + "ON39", + "ON49", + "ON59", + "ON69", + "ON79", + "ON89", + "ON99", + "OO01", + "OO02", + "OO03", + "OO04", + "OO05", + "OO06", + "OO07", + "OO08", + "OO09", + "OO10", + "OO11", + "OO12", + "OO13", + "OO14", + "OO15", + "OO16", + "OO17", + "OO18", + "OO19", + "OO20", + "OO21", + "OO22", + "OO23", + "OO24", + "OO25", + "OO26", + "OO27", + "OO28", + "OO29", + "OO30", + "OO31", + "OO32", + "OO33", + "OO34", + "OO35", + "OO36", + "OO37", + "OO38", + "OO39", + "OO40", + "OO41", + "OO42", + "OO43", + "OO44", + "OO45", + "OO46", + "OO47", + "OO48", + "OO49", + "OO50", + "OO51", + "OO52", + "OO53", + "OO54", + "OO55", + "OO56", + "OO57", + "OO58", + "OO59", + "OO60", + "OO61", + "OO62", + "OO63", + "OO64", + "OO65", + "OO66", + "OO67", + "OO68", + "OO69", + "OO70", + "OO71", + "OO72", + "OO73", + "OO74", + "OO75", + "OO76", + "OO77", + "OO78", + "OO79", + "OO80", + "OO81", + "OO82", + "OO83", + "OO84", + "OO85", + "OO86", + "OO87", + "OO88", + "OO89", + "OO90", + "OO91", + "OO92", + "OO93", + "OO94", + "OO95", + "OO96", + "OO97", + "OO98", + "OO99", + "OP00", + "OP01", + "OP02", + "OP03", + "OP04", + "OP05", + "OP06", + "OP07", + "OP08", + "OP09", + "OP10", + "OP11", + "OP12", + "OP13", + "OP14", + "OP15", + "OP16", + "OP17", + "OP18", + "OP19", + "OP20", + "OP21", + "OP22", + "OP23", + "OP24", + "OP25", + "OP26", + "OP27", + "OP28", + "OP29", + "OP30", + "OP31", + "OP32", + "OP33", + "OP34", + "OP35", + "OP36", + "OP37", + "OP38", + "OP39", + "OP40", + "OP41", + "OP42", + "OP43", + "OP44", + "OP45", + "OP46", + "OP47", + "OP48", + "OP49", + "OP50", + "OP51", + "OP52", + "OP53", + "OP54", + "OP55", + "OP56", + "OP57", + "OP58", + "OP59", + "OP60", + "OP61", + "OP62", + "OP63", + "OP64", + "OP65", + "OP66", + "OP67", + "OP68", + "OP69", + "OP70", + "OP71", + "OP72", + "OP73", + "OP74", + "OP75", + "OP76", + "OP77", + "OP78", + "OP79", + "OP80", + "OP81", + "OP82", + "OP83", + "OP84", + "OP85", + "OP86", + "OP87", + "OP88", + "OP89", + "OP90", + "OP91", + "OP92", + "OP93", + "OP94", + "OP95", + "OP96", + "OP97", + "OP98", + "OP99", + "OQ00", + "OQ01", + "OQ02", + "OQ03", + "OQ04", + "OQ05", + "OQ06", + "OQ07", + "OQ10", + "OQ11", + "OQ12", + "OQ13", + "OQ14", + "OQ15", + "OQ16", + "OQ17", + "OQ20", + "OQ21", + "OQ22", + "OQ23", + "OQ24", + "OQ25", + "OQ26", + "OQ27", + "OQ30", + "OQ31", + "OQ32", + "OQ33", + "OQ34", + "OQ35", + "OQ36", + "OQ37", + "OQ40", + "OQ41", + "OQ42", + "OQ43", + "OQ44", + "OQ45", + "OQ46", + "OQ47", + "OQ50", + "OQ51", + "OQ52", + "OQ53", + "OQ54", + "OQ55", + "OQ56", + "OQ60", + "OQ61", + "OQ62", + "OQ63", + "OQ64", + "OQ65", + "OQ66", + "OQ70", + "OQ71", + "OQ72", + "OQ73", + "OQ74", + "OQ80", + "OQ81", + "OQ82", + "OQ83", + "OQ84", + "OQ90", + "OQ91", + "OQ92", + "OQ93", + "PN39", + "PN48", + "PN49", + "PN52", + "PN53", + "PN54", + "PN55", + "PN57", + "PN58", + "PN59", + "PN62", + "PN63", + "PN64", + "PN65", + "PN66", + "PN67", + "PN68", + "PN69", + "PN72", + "PN73", + "PN74", + "PN75", + "PN76", + "PN77", + "PN78", + "PN79", + "PN84", + "PN85", + "PN86", + "PN87", + "PN88", + "PN89", + "PN96", + "PN97", + "PN98", + "PN99", + "PO01", + "PO02", + "PO03", + "PO04", + "PO05", + "PO06", + "PO07", + "PO08", + "PO09", + "PO13", + "PO14", + "PO15", + "PO16", + "PO17", + "PO18", + "PO19", + "PO22", + "PO23", + "PO24", + "PO25", + "PO26", + "PO27", + "PO28", + "PO29", + "PO30", + "PO31", + "PO32", + "PO33", + "PO34", + "PO35", + "PO36", + "PO37", + "PO38", + "PO39", + "PO40", + "PO41", + "PO42", + "PO43", + "PO44", + "PO45", + "PO46", + "PO47", + "PO48", + "PO49", + "PO50", + "PO51", + "PO52", + "PO53", + "PO54", + "PO55", + "PO56", + "PO57", + "PO58", + "PO59", + "PO60", + "PO61", + "PO62", + "PO63", + "PO64", + "PO65", + "PO66", + "PO67", + "PO68", + "PO69", + "PO70", + "PO71", + "PO72", + "PO73", + "PO74", + "PO75", + "PO76", + "PO77", + "PO78", + "PO79", + "PO80", + "PO81", + "PO82", + "PO83", + "PO84", + "PO85", + "PO86", + "PO87", + "PO88", + "PO89", + "PO90", + "PO91", + "PO92", + "PO93", + "PO94", + "PO95", + "PO96", + "PO97", + "PO98", + "PO99", + "PP00", + "PP01", + "PP02", + "PP03", + "PP04", + "PP05", + "PP06", + "PP07", + "PP08", + "PP09", + "PP10", + "PP11", + "PP12", + "PP13", + "PP14", + "PP15", + "PP16", + "PP17", + "PP18", + "PP19", + "PP20", + "PP21", + "PP22", + "PP23", + "PP24", + "PP25", + "PP26", + "PP27", + "PP28", + "PP29", + "PP30", + "PP31", + "PP32", + "PP33", + "PP34", + "PP35", + "PP36", + "PP37", + "PP38", + "PP39", + "PP40", + "PP41", + "PP42", + "PP43", + "PP44", + "PP45", + "PP46", + "PP47", + "PP48", + "PP49", + "PP50", + "PP51", + "PP52", + "PP53", + "PP54", + "PP55", + "PP56", + "PP57", + "PP58", + "PP59", + "PP60", + "PP61", + "PP62", + "PP63", + "PP64", + "PP65", + "PP66", + "PP67", + "PP68", + "PP69", + "PP70", + "PP71", + "PP72", + "PP73", + "PP74", + "PP75", + "PP76", + "PP77", + "PP78", + "PP79", + "PP80", + "PP81", + "PP82", + "PP83", + "PP84", + "PP85", + "PP86", + "PP87", + "PP88", + "PP89", + "PP90", + "PP91", + "PP92", + "PP93", + "PP94", + "PP95", + "PP96", + "PP97", + "PP98", + "PP99", + "PQ00", + "PQ01", + "PQ02", + "PQ03", + "PQ10", + "PQ11", + "PQ12", + "PQ13", + "PQ20", + "PQ21", + "PQ22", + "PQ23", + "PQ30", + "PQ31", + "PQ32", + "PQ33", + "PQ40", + "PQ41", + "PQ42", + "PQ43", + "PQ50", + "PQ51", + "PQ60", + "PQ61", + "PQ70", + "PQ71", + "PQ73", + "PQ74", + "PQ75", + "PQ80", + "PQ81", + "PQ83", + "PQ84", + "PQ85", + "PQ86", + "PQ90", + "PQ91", + "PQ92", + "PQ93", + "PQ94", + "PQ95", + "PQ96", + "QN05", + "QN06", + "QN07", + "QN08", + "QN09", + "QN15", + "QN16", + "QN17", + "QN18", + "QN19", + "QN23", + "QN24", + "QN28", + "QN29", + "QN33", + "QN34", + "QN35", + "QN44", + "QN45", + "QN46", + "QN55", + "QN56", + "QN57", + "QN66", + "QN67", + "QN68", + "QN78", + "QN79", + "QO00", + "QO01", + "QO02", + "QO03", + "QO04", + "QO07", + "QO08", + "QO09", + "QO10", + "QO11", + "QO12", + "QO13", + "QO14", + "QO18", + "QO19", + "QO20", + "QO29", + "QO39", + "QO49", + "QO58", + "QO59", + "QO68", + "QO69", + "QO70", + "QO73", + "QO74", + "QO75", + "QO76", + "QO79", + "QO80", + "QO81", + "QO82", + "QO83", + "QO84", + "QO85", + "QO86", + "QO87", + "QO91", + "QO92", + "QO93", + "QO94", + "QO95", + "QO96", + "QO97", + "QO98", + "QO99", + "QP00", + "QP01", + "QP02", + "QP03", + "QP04", + "QP05", + "QP06", + "QP07", + "QP08", + "QP09", + "QP10", + "QP11", + "QP12", + "QP13", + "QP14", + "QP15", + "QP16", + "QP17", + "QP18", + "QP19", + "QP20", + "QP21", + "QP22", + "QP23", + "QP24", + "QP25", + "QP26", + "QP27", + "QP28", + "QP29", + "QP30", + "QP31", + "QP32", + "QP33", + "QP34", + "QP35", + "QP36", + "QP37", + "QP38", + "QP39", + "QP40", + "QP41", + "QP42", + "QP43", + "QP44", + "QP45", + "QP46", + "QP47", + "QP48", + "QP49", + "QP50", + "QP51", + "QP52", + "QP53", + "QP54", + "QP55", + "QP56", + "QP57", + "QP58", + "QP59", + "QP60", + "QP61", + "QP62", + "QP63", + "QP64", + "QP65", + "QP66", + "QP67", + "QP68", + "QP69", + "QP70", + "QP71", + "QP72", + "QP73", + "QP74", + "QP75", + "QP76", + "QP77", + "QP78", + "QP79", + "QP80", + "QP81", + "QP82", + "QP83", + "QP84", + "QP85", + "QP86", + "QP87", + "QP88", + "QP89", + "QP90", + "QP91", + "QP92", + "QP93", + "QP94", + "QP95", + "QP96", + "QP97", + "QP98", + "QP99", + "QQ00", + "QQ01", + "QQ02", + "QQ03", + "QQ04", + "QQ05", + "QQ06", + "QQ10", + "QQ11", + "QQ12", + "QQ13", + "QQ14", + "QQ15", + "QQ16", + "QQ20", + "QQ21", + "QQ22", + "QQ25", + "QQ30", + "QQ31", + "QQ32", + "QQ34", + "QQ35", + "QQ40", + "QQ41", + "QQ42", + "QQ44", + "QQ45", + "QQ46", + "QQ50", + "QQ51", + "QQ54", + "QQ55", + "QQ60", + "QQ61", + "QQ65", + "QQ66", + "QQ70", + "QQ71", + "QQ80", + "QQ81", + "QQ86", + "QQ87", + "QQ90", + "QQ91", + "QQ96", + "RO03", + "RO04", + "RO05", + "RO06", + "RO07", + "RO08", + "RO09", + "RO14", + "RO15", + "RO16", + "RO17", + "RO18", + "RO19", + "RO25", + "RO28", + "RO29", + "RO34", + "RO35", + "RO39", + "RO44", + "RO59", + "RP00", + "RP01", + "RP02", + "RP03", + "RP04", + "RP05", + "RP06", + "RP07", + "RP08", + "RP09", + "RP10", + "RP11", + "RP12", + "RP13", + "RP14", + "RP15", + "RP16", + "RP17", + "RP18", + "RP19", + "RP20", + "RP21", + "RP22", + "RP23", + "RP24", + "RP25", + "RP26", + "RP27", + "RP28", + "RP29", + "RP30", + "RP31", + "RP32", + "RP33", + "RP34", + "RP35", + "RP36", + "RP37", + "RP38", + "RP39", + "RP40", + "RP41", + "RP42", + "RP43", + "RP44", + "RP45", + "RP46", + "RP47", + "RP48", + "RP49", + "RP50", + "RP51", + "RP52", + "RP53", + "RP54", + "RP55", + "RP56", + "RP57", + "RP58", + "RP59", + "RP60", + "RP61", + "RP62", + "RP63", + "RP64", + "RP65", + "RP66", + "RP67", + "RP68", + "RP69", + "RP71", + "RP72", + "RP73", + "RP74", + "RP75", + "RP76", + "RP77", + "RP78", + "RP79", + "RP82", + "RP83", + "RP84", + "RP85", + "RP86", + "RP87", + "RP88", + "RP89", + "RP92", + "RP93", + "RP94", + "RP95", + "RP96", + "RP97", + "RP98", + "RP99", + "RQ00", + "RQ10", + "RQ40", + "RQ50", + "RQ90", + "RQ91" + ], + "prefix": [ + "R0", + "=R0/UR8LV", + "=R00BVB", + "=R01DTV/8", + "=R01DTV/9", + "R0A", + "R0B", + "R0C", + "R0E", + "R0F", + "=R0FK", + "R0H", + "=R0HQ", + "R0I", + "R0K", + "R0L", + "=R0LY/9", + "R0M", + "R0N", + "R0O", + "=R0PA", + "=R0POL", + "R0Q", + "=R0QA/9", + "R0R", + "R0S", + "R0T", + "R0U", + "=R0UPOL", + "R0V", + "R0W", + "=R0WX/P", + "R0X", + "R0Y", + "R0Z", + "=R100D", + "=R100DI", + "=R100FNR", + "=R100MP", + "=R100RG", + "=R100RW", + "=R100W", + "=R105WWS", + "=R10NRC", + "=R10RLHA/0", + "=R10RTRS/0", + "=R10RTRS/9", + "=R110RAEM", + "=R110RP", + "=R111EK", + "=R11QRP/0", + "=R11QRP/8", + "=R11QRP/8/P", + "=R11QRP/9", + "=R11UND", + "=R120RB", + "=R120RDP", + "=R120RG", + "=R120RI", + "=R120RJ", + "=R120RL", + "=R120RN", + "=R120RQ", + "=R120RU", + "=R120RW", + "=R120RZ", + "=R120TM", + "=R123JDR", + "=R125NSK", + "=R135TU", + "=R140TU", + "=R14CWC/0", + "=R14CWC/8", + "=R14CWC/9", + "=R150C", + "=R150DMP", + "=R150L", + "=R150LA", + "=R150LB", + "=R150RP", + "=R155AP", + "=R155C", + "=R155RP", + "=R15CWC/0", + "=R15CWC/0/QRP", + "=R15CWC/8", + "=R15CWC/8/QRP", + "=R15CWC/9", + "=R15UGRA", + "=R160DMP", + "=R160NA", + "=R160RP", + "=R16CAN", + "=R16FRA", + "=R16KAZ", + "=R16LEV", + "=R16SVK", + "=R16UGRA", + "=R170GS", + "=R170GS/0", + "=R170GS/8", + "=R1716K", + "=R1716M", + "=R1716O", + "=R1716S", + "=R17CWH", + "=R18CRO", + "=R18KDR/0", + "=R18KDR/4", + "=R18KDR/8", + "=R18KDR/9", + "=R18KSA", + "=R18POR", + "=R18RUS", + "=R18SWE", + "=R18URU", + "=R1991A", + "=R1BDD/0", + "=R1BDD/0/P", + "=R1DA/8/M", + "=R1DA/9/M", + "=R1FW/0", + "=R1ZBH/0", + "=R1ZY/8", + "=R1ZY/9", + "=R2013CG", + "=R2013T", + "=R2013TP", + "=R2014FX", + "=R2014Y", + "=R2015AS", + "=R2015BP", + "=R2015DM", + "=R2015DS", + "=R2015EP", + "=R2015KM", + "=R2015LY", + "=R2015LY/8", + "=R2015R", + "=R2015RR", + "=R2015RY", + "=R2015SV", + "=R2015TL", + "=R2016A", + "=R2016DR", + "=R2016KW", + "=R2017F/P", + "=R2017T", + "=R2019CG", + "=R205NEW", + "=R20BIS", + "=R20DFO", + "=R20EKB", + "=R20KRK", + "=R20NSK", + "=R20RCK", + "=R20RCK/0", + "=R20RRC/0", + "=R20RRC/8", + "=R20UFA", + "=R20UFO", + "=R22BIA", + "=R22SKE", + "=R22SKJ", + "=R22ULM", + "=R23RRC", + "=R24RRC", + "=R25ARCK", + "=R25ARCK/0", + "=R25ARCK/4", + "=R25ARCK/8", + "=R25ARCK/9", + "=R25MSB", + "=R25WPW", + "=R26RRC", + "=R270A", + "=R270E", + "=R270SR", + "=R27CGY", + "=R27EKB", + "=R27ODR", + "=R27ODR/M", + "=R27ODW", + "=R27OGA", + "=R27OGF", + "=R27OSN", + "=R27OUO", + "=R27UFA", + "=R280A", + "=R280B", + "=R2AEA/9", + "=R2AKM/0", + "=R2DA/9", + "=R2DG/0", + "=R2ET/9", + "=R30SIB", + "=R30STM", + "=R30ZF", + "=R34SP", + "=R35CZF", + "=R35NP", + "=R375I", + "=R3ARS/9", + "=R3BY/0", + "=R3CA/0", + "=R3CA/0/M", + "=R3CA/8", + "=R3CA/9", + "=R3CG/8", + "=R3HD/0", + "=R3HD/9", + "=R3RRC/0", + "=R3RRC/0/MM", + "=R3RRC/8", + "=R3XX/9", + "=R3YAB/9/P", + "=R400N", + "=R40WK", + "=R430LT", + "=R44WFF", + "=R44YETI/0", + "=R44YETI/8", + "=R44YETI/9", + "=R4AK/0", + "=R4AK/0/P", + "=R4CDO/9/M", + "=R4FAA/8", + "=R4WAB/9/P", + "=R4YAC/9", + "=R50CQM", + "=R53ICGA", + "=R53ICGB", + "=R53ICGC", + "=R53ICGF", + "=R53ICGJ", + "=R53ICGS", + "=R53ICGV", + "=R53ICGW", + "=R55EPC", + "=R55EPC/P", + "=R55TV", + "=R63RRC", + "=R66IOTA", + "=R6MG/0", + "=R6RA/9", + "=R6UAE/9", + "=R6XBA/9", + "=R70ASIA", + "=R70B", + "=R70BP/0", + "=R70LWA", + "=R70NIK", + "=R70PW", + "=R70PW/P", + "=R71RRC", + "=R7378TM", + "=R73EPC/P", + "=R750X", + "=R7AA/0", + "=R7AB/9", + "=R7AL/0", + "=R7AL/0/M", + "=R7AL/0/P", + "=R7LP/0", + "=R7LZ/0", + "=R7LZ/8", + "=R7LZ/9", + "=R7MR/0", + "R8", + "=R8CW/0", + "=R8FF/8", + "R8H", + "R8I", + "R8J", + "=R8JAJ/4", + "=R8JAJ/4/P", + "=R8JAJ/9", + "=R8JAJ/M", + "R8K", + "=R8MC/9", + "=R8MD/9", + "R8O", + "=R8OA/9/P", + "R8P", + "R8S", + "=R8SRR", + "R8T", + "R8U", + "R8V", + "R8W", + "=R8XW/0", + "=R8XW/8", + "R8Y", + "R8Z", + "R9", + "=R9/EW1TM", + "=R9/TA1FL", + "=R9/UN0C", + "=R9/UN7JHC", + "=R9/UN7JMO", + "=R90WGM", + "=R90WJV", + "=R90WOB", + "=R90WXK", + "=R9GM/8", + "=R9GM/8/M", + "R9H", + "=R9HQ", + "R9I", + "R9J", + "=R9JBN/8/M", + "R9K", + "=R9LY/4", + "=R9MJ/9", + "=R9MJ/M", + "R9O", + "=R9OOO/0", + "=R9OOO/9/M", + "=R9OOO/9/P", + "=R9OY/9/P", + "R9P", + "=R9PS/9", + "R9S", + "=R9SRR", + "R9T", + "R9U", + "=R9UAG/N", + "R9V", + "R9W", + "=R9XC/9", + "=R9XT/0", + "=R9XT/9", + "R9Y", + "R9Z", + "=RA/DF8DX", + "=RA/DK2AI/0", + "=RA/DK2AI/M", + "=RA/DL6XK", + "=RA/EW1RR", + "=RA/EW2R", + "=RA/EW8ADX", + "=RA/IK0PRH", + "=RA/IK0PRH/P", + "=RA/IK5MIC", + "=RA/IK5MIC/M", + "=RA/IK5MIC/P", + "=RA/IK7YTT", + "=RA/JA8BMK", + "=RA/KE5JA", + "=RA/N3QQ", + "=RA/N6TR", + "=RA/OG2K", + "=RA/OK1DWF", + "=RA/UR5HVR", + "=RA/UR5WT", + "=RA/UR8IF", + "=RA/US5ETV", + "=RA/UT2LA", + "=RA/UT5IA", + "=RA/UY7IQ", + "=RA/VE7MID", + "RA0", + "=RA0/UR5HVR", + "RA0A", + "=RA0AJ/0/P", + "=RA0AM/0", + "RA0B", + "=RA0BA/8", + "=RA0BA/9", + "RA0C", + "=RA0CCJ/9", + "=RA0CCK/8", + "=RA0CGI/0", + "RA0E", + "RA0F", + "RA0H", + "RA0I", + "RA0K", + "RA0L", + "=RA0LH/9", + "=RA0LMC/9", + "RA0M", + "RA0N", + "RA0O", + "RA0Q", + "=RA0QK/8", + "RA0R", + "=RA0R/4", + "RA0S", + "=RA0SP/RP", + "=RA0SR/RP", + "=RA0SS/0", + "=RA0STT/0/M", + "RA0T", + "RA0U", + "=RA0UAC/8", + "=RA0UF/8", + "RA0V", + "RA0W", + "=RA0WA/0/P", + "RA0X", + "RA0Y", + "RA0Z", + "=RA110RAEM", + "=RA1AIP/9/P", + "=RA1ALA/0", + "=RA1ALA/8", + "=RA1AMW/0", + "=RA1AR/9", + "=RA1QBH/9", + "=RA1QD/0", + "=RA1QR/9", + "=RA1WS/9", + "=RA1ZPC/9", + "=RA1ZZ/0", + "=RA1ZZ/0/M", + "=RA22MX", + "=RA22QF", + "=RA27AA", + "=RA27EK", + "=RA27OA", + "=RA27OM", + "=RA27TR", + "=RA36GS", + "=RA36ZF", + "=RA3AL/M", + "=RA3AN/0", + "=RA3ARS/9", + "=RA3ARS/9/M", + "=RA3AUU/0", + "=RA3AUU/9", + "=RA3AV/0", + "=RA3BB/0", + "=RA3CW/9", + "=RA3DA/0", + "=RA3DA/9", + "=RA3DH/9", + "=RA3DS/P", + "=RA3ET/9", + "=RA3III/8", + "=RA3NAN/0", + "=RA3QQI/8", + "=RA3TND/0", + "=RA3TND/9", + "=RA3TO/0", + "=RA3WJ/9", + "=RA3XBN/9", + "=RA3XR/0", + "=RA3XV/0", + "=RA3ZM/8", + "=RA4AAJ/9", + "=RA4CF/0", + "=RA4CQ/0", + "=RA4CQ/9", + "=RA4CQ/9/M", + "=RA4CSX/0", + "=RA4CSX/0/P", + "=RA4FCJ/9", + "=RA4FRH/0/P", + "=RA4FSC/9", + "=RA4HGN/9", + "=RA4HKM/0", + "=RA4HKM/0/P", + "=RA4HMT/9/M", + "=RA4HRM/9", + "=RA4HT/9", + "=RA4PKR/9", + "=RA4POX/9", + "=RA4RU/0", + "=RA4RU/9", + "=RA4RU/9/P", + "=RA4YW/9", + "=RA4YW/9/M", + "=RA50VT", + "=RA60PD", + "=RA6ABC/0", + "=RA6AEW/0", + "=RA6GW/0", + "=RA6UAH/0", + "=RA6XPL/0", + "=RA77VV", + "RA8", + "RA8H", + "RA8I", + "RA8J", + "=RA8JA/4", + "=RA8JA/4/P", + "RA8K", + "RA8O", + "RA8P", + "RA8S", + "RA8T", + "RA8U", + "RA8V", + "RA8W", + "RA8Y", + "RA8Z", + "RA9", + "=RA9CS/P", + "=RA9DA/0", + "=RA9FTM/0", + "=RA9FW/9", + "RA9H", + "RA9I", + "RA9J", + "=RA9JG/0", + "=RA9JG/0/P", + "=RA9JG/9", + "=RA9JG/9/P", + "=RA9JJ/0", + "=RA9JJ/9/M", + "RA9K", + "=RA9KDX/8/M", + "=RA9LI/0", + "=RA9MR/0", + "=RA9MX/9", + "=RA9MX/P", + "RA9O", + "=RA9OBG/0", + "=RA9ODR/9/M", + "RA9P", + "RA9S", + "=RA9SC/9", + "RA9T", + "RA9U", + "=RA9USU/8", + "=RA9UT/0", + "RA9V", + "RA9W", + "=RA9WJV/8/P", + "=RA9WN/9", + "=RA9WU/9", + "RA9Y", + "=RA9YME/0", + "RA9Z", + "=RAEM", + "=RB110RAEM", + "RC0", + "RC0A", + "RC0B", + "RC0C", + "RC0E", + "RC0F", + "RC0H", + "RC0I", + "RC0K", + "RC0L", + "RC0M", + "RC0N", + "RC0O", + "RC0Q", + "RC0R", + "RC0S", + "RC0T", + "RC0U", + "RC0V", + "RC0W", + "RC0X", + "RC0Y", + "RC0Z", + "=RC110RAEM", + "=RC18EK", + "=RC1M/8/M", + "=RC1M/9", + "=RC1M/9/M", + "=RC20AB", + "=RC20AC", + "=RC20CD", + "=RC20MX", + "=RC20OB", + "=RC20QA", + "=RC20QC", + "=RC20QF", + "=RC20TT", + "=RC4W/9", + "RC8", + "=RC85AO", + "RC8H", + "RC8I", + "RC8J", + "RC8K", + "RC8O", + "RC8P", + "RC8S", + "RC8T", + "RC8U", + "RC8V", + "RC8W", + "=RC8X/9", + "RC8Y", + "RC8Z", + "RC9", + "RC9H", + "RC9I", + "RC9J", + "RC9K", + "RC9O", + "RC9P", + "RC9S", + "RC9T", + "RC9U", + "RC9V", + "RC9W", + "=RC9XM/8", + "RC9Y", + "=RC9YA/9/M", + "RC9Z", + "RD0", + "RD0A", + "RD0B", + "=RD0B/8", + "RD0C", + "RD0E", + "RD0F", + "RD0H", + "RD0I", + "RD0K", + "RD0L", + "=RD0L/0", + "=RD0L/9", + "RD0M", + "RD0N", + "RD0O", + "RD0Q", + "RD0R", + "RD0S", + "RD0T", + "RD0U", + "RD0V", + "RD0W", + "RD0X", + "RD0Y", + "RD0Z", + "=RD110RAEM", + "=RD16CW", + "=RD17CW", + "=RD1AL/0", + "=RD3ARX/0/P", + "=RD3BN/0", + "=RD3BN/9", + "=RD3QA/0", + "=RD4CAQ/9", + "=RD4HM/9", + "RD8", + "RD8H", + "RD8I", + "RD8J", + "RD8K", + "RD8O", + "RD8P", + "RD8S", + "RD8T", + "RD8U", + "RD8V", + "RD8W", + "RD8Y", + "RD8Z", + "RD9", + "RD9H", + "RD9I", + "RD9J", + "RD9K", + "RD9O", + "RD9P", + "RD9S", + "RD9T", + "RD9U", + "RD9V", + "RD9W", + "RD9Y", + "RD9Z", + "RE0", + "RE0A", + "RE0B", + "RE0C", + "RE0E", + "RE0F", + "RE0H", + "RE0I", + "RE0K", + "RE0L", + "RE0M", + "RE0N", + "RE0O", + "RE0Q", + "RE0R", + "RE0S", + "RE0T", + "RE0U", + "RE0V", + "RE0W", + "RE0X", + "RE0Y", + "RE0Z", + "RE8", + "RE8H", + "RE8I", + "RE8J", + "RE8K", + "RE8O", + "RE8P", + "RE8S", + "RE8T", + "RE8U", + "RE8V", + "RE8W", + "RE8Y", + "RE8Z", + "RE9", + "RE9H", + "RE9I", + "RE9J", + "RE9K", + "RE9O", + "RE9P", + "RE9S", + "RE9T", + "RE9U", + "RE9V", + "RE9W", + "RE9Y", + "RE9Z", + "RF0", + "RF0A", + "RF0B", + "RF0C", + "RF0E", + "RF0F", + "RF0H", + "RF0I", + "RF0K", + "RF0L", + "RF0M", + "RF0N", + "RF0O", + "RF0Q", + "RF0R", + "RF0S", + "RF0T", + "RF0U", + "RF0V", + "RF0W", + "RF0X", + "RF0Y", + "RF0Z", + "=RF3A/0", + "RF8", + "RF8H", + "RF8I", + "RF8J", + "RF8K", + "RF8O", + "RF8P", + "RF8S", + "RF8T", + "RF8U", + "RF8V", + "RF8W", + "RF8Y", + "RF8Z", + "RF9", + "RF9H", + "RF9I", + "RF9J", + "RF9K", + "RF9O", + "RF9P", + "RF9S", + "RF9T", + "RF9U", + "RF9V", + "RF9W", + "RF9Y", + "RF9Z", + "RG0", + "RG0A", + "RG0B", + "RG0C", + "RG0E", + "RG0F", + "RG0H", + "RG0I", + "RG0K", + "RG0L", + "RG0M", + "RG0N", + "RG0O", + "RG0Q", + "RG0R", + "RG0S", + "RG0T", + "RG0U", + "RG0V", + "RG0W", + "RG0X", + "RG0Y", + "RG0Z", + "=RG110RAEM", + "=RG5A/8", + "RG8", + "RG8H", + "RG8I", + "RG8J", + "RG8K", + "RG8O", + "RG8P", + "RG8S", + "RG8T", + "RG8U", + "RG8V", + "RG8W", + "RG8Y", + "RG8Z", + "RG9", + "RG9H", + "RG9I", + "RG9J", + "RG9K", + "RG9O", + "RG9P", + "RG9S", + "RG9T", + "RG9U", + "RG9V", + "RG9W", + "RG9Y", + "RG9Z", + "RI0", + "RI0A", + "RI0B", + "=RI0BDI", + "=RI0BV/0", + "RI0C", + "RI0F", + "RI0H", + "RI0I", + "RI0K", + "RI0L", + "RI0Q", + "RI0X", + "RI0Z", + "=RI18POL", + "RI8", + "RI9", + "RI9K", + "RJ0", + "RJ0A", + "RJ0B", + "RJ0C", + "RJ0E", + "RJ0F", + "RJ0H", + "RJ0I", + "RJ0K", + "RJ0L", + "RJ0M", + "RJ0N", + "RJ0O", + "RJ0Q", + "RJ0R", + "RJ0S", + "RJ0T", + "RJ0U", + "RJ0V", + "RJ0W", + "RJ0X", + "RJ0Y", + "RJ0Z", + "=RJ17CW", + "=RJ17WG", + "RJ8", + "RJ8H", + "RJ8I", + "RJ8J", + "RJ8K", + "RJ8O", + "RJ8P", + "RJ8S", + "RJ8T", + "RJ8U", + "RJ8V", + "RJ8W", + "RJ8Y", + "RJ8Z", + "RJ9", + "RJ9H", + "RJ9I", + "RJ9J", + "RJ9K", + "RJ9O", + "RJ9P", + "RJ9S", + "RJ9T", + "RJ9U", + "RJ9V", + "RJ9W", + "RJ9Y", + "RJ9Z", + "RK0", + "RK0A", + "=RK0AXC/0", + "=RK0AXC/0/M", + "RK0B", + "RK0C", + "RK0E", + "RK0F", + "RK0H", + "RK0I", + "RK0K", + "RK0L", + "RK0M", + "RK0N", + "RK0O", + "RK0Q", + "RK0R", + "RK0S", + "RK0T", + "RK0U", + "RK0V", + "RK0W", + "RK0X", + "RK0Y", + "RK0Z", + "=RK17CW", + "=RK1B/0", + "=RK1B/9", + "=RK3AW/4", + "=RK3BY/0", + "=RK3DZJ/9", + "=RK3PWJ/9", + "=RK3RB/0", + "=RK4HM/0", + "=RK4PA/9", + "=RK56GC", + "=RK6ANP/9", + "=RK6BBM/9", + "=RK6CG/9", + "=RK6CT/9", + "=RK6YM/8", + "=RK6YM/9", + "=RK6YYA/0", + "=RK6YYA/0/M", + "=RK6YYA/0/P", + "=RK6YYA/9", + "=RK6YYA/9/M", + "RK8", + "=RK80KEDR", + "RK8H", + "RK8I", + "RK8J", + "RK8K", + "RK8O", + "RK8P", + "RK8S", + "RK8T", + "RK8U", + "RK8V", + "RK8W", + "RK8Y", + "RK8Z", + "RK9", + "=RK9AD/9/M", + "=RK9DR/N", + "RK9H", + "RK9I", + "RK9J", + "RK9K", + "=RK9KWI/9", + "=RK9KWI/9/P", + "=RK9MZZ/0", + "RK9O", + "RK9P", + "RK9S", + "=RK9SZZ/9", + "RK9T", + "RK9U", + "RK9V", + "RK9W", + "RK9Y", + "RK9Z", + "RL0", + "RL0A", + "RL0B", + "RL0C", + "RL0E", + "RL0F", + "RL0H", + "RL0I", + "RL0K", + "RL0L", + "RL0M", + "RL0N", + "RL0O", + "RL0Q", + "RL0R", + "RL0S", + "RL0T", + "RL0U", + "RL0V", + "RL0W", + "RL0X", + "RL0Y", + "RL0Z", + "=RL19WF", + "=RL3AA/0", + "=RL3DX/9", + "=RL4R/8", + "=RL5G/0", + "=RL5G/0/P", + "=RL5G/8", + "=RL5G/9", + "RL8", + "RL8H", + "RL8I", + "RL8J", + "RL8K", + "RL8O", + "RL8P", + "RL8S", + "RL8T", + "RL8U", + "RL8V", + "RL8W", + "RL8Y", + "RL8Z", + "RL9", + "=RL9AA/P", + "RL9H", + "RL9I", + "RL9J", + "RL9K", + "RL9O", + "RL9P", + "RL9S", + "RL9T", + "RL9U", + "RL9V", + "RL9W", + "RL9Y", + "RL9Z", + "RM0", + "RM0A", + "RM0B", + "=RM0B/9", + "RM0C", + "RM0E", + "RM0F", + "RM0H", + "RM0I", + "RM0K", + "RM0L", + "RM0M", + "=RM0M/LH", + "RM0N", + "RM0O", + "RM0Q", + "RM0R", + "RM0S", + "RM0T", + "RM0U", + "RM0V", + "RM0W", + "RM0X", + "RM0Y", + "RM0Z", + "=RM17NY", + "=RM19NY", + "=RM19WF", + "=RM20CC", + "=RM2D/0", + "=RM2D/9", + "=RM5M/0", + "=RM7C/0", + "RM8", + "RM8H", + "RM8I", + "RM8J", + "RM8K", + "RM8O", + "RM8P", + "RM8S", + "RM8T", + "RM8U", + "RM8V", + "RM8W", + "RM8Y", + "RM8Z", + "RM9", + "=RM90WF", + "RM9H", + "RM9I", + "RM9J", + "RM9K", + "RM9O", + "RM9P", + "=RM9RZ/0", + "=RM9RZ/9/P", + "=RM9RZ/A", + "=RM9RZ/P", + "RM9S", + "RM9T", + "RM9U", + "RM9V", + "RM9W", + "RM9Y", + "RM9Z", + "RN0", + "RN0A", + "RN0B", + "RN0C", + "=RN0CF/9", + "RN0E", + "RN0F", + "RN0H", + "RN0I", + "RN0K", + "RN0L", + "RN0M", + "RN0N", + "RN0O", + "RN0Q", + "RN0R", + "RN0S", + "=RN0SZ/9", + "RN0T", + "RN0U", + "RN0V", + "RN0W", + "RN0X", + "RN0Y", + "RN0Z", + "=RN110RAEM", + "=RN110RAEM/P", + "=RN16CW", + "=RN17CW", + "=RN1CR/0", + "=RN1NS/0", + "=RN3DHB/9", + "=RN3DHB/9/P", + "=RN3GW/8", + "=RN3GW/8/QRP", + "=RN3GW/9", + "=RN3GW/9/QRP", + "=RN3OF/9", + "=RN3QBG/9", + "=RN3QOP/9", + "=RN4CU/0", + "=RN4CU/0/P", + "=RN4HIT/0", + "=RN4WA/9", + "=RN6HI/0", + "=RN6LFF/0", + "=RN7G/0", + "RN8", + "RN8H", + "RN8I", + "RN8J", + "RN8K", + "RN8O", + "RN8P", + "RN8S", + "RN8T", + "RN8U", + "RN8V", + "RN8W", + "RN8Y", + "RN8Z", + "RN9", + "=RN9A/0", + "RN9H", + "=RN9HM/A", + "=RN9HM/P", + "RN9I", + "RN9J", + "RN9K", + "=RN9N/9", + "=RN9N/9/M", + "RN9O", + "=RN9O/8", + "RN9P", + "RN9S", + "=RN9S/M", + "=RN9SM/P", + "RN9T", + "RN9U", + "RN9V", + "RN9W", + "=RN9WWW/9", + "=RN9WWW/9/M", + "=RN9WWW/P", + "RN9Y", + "RN9Z", + "RO0", + "RO0A", + "RO0B", + "RO0C", + "RO0E", + "RO0F", + "RO0H", + "RO0I", + "RO0K", + "RO0L", + "RO0M", + "RO0N", + "RO0O", + "RO0Q", + "RO0R", + "RO0S", + "RO0T", + "RO0U", + "RO0V", + "RO0W", + "RO0X", + "RO0Y", + "RO0Z", + "=RO17CW", + "=RO19WF", + "=RO25TN", + "RO8", + "RO8H", + "RO8I", + "RO8J", + "RO8K", + "RO8O", + "RO8P", + "RO8S", + "RO8T", + "RO8U", + "RO8V", + "RO8W", + "RO8Y", + "RO8Z", + "RO9", + "RO9H", + "RO9I", + "RO9J", + "RO9K", + "RO9O", + "RO9P", + "RO9S", + "RO9T", + "RO9U", + "RO9V", + "RO9W", + "RO9Y", + "RO9Z", + "=RP0CZA", + "=RP0L", + "=RP0LPK", + "=RP0Q", + "=RP0S", + "=RP0SXR", + "=RP0SZZ", + "=RP0UWZ", + "=RP0UZF", + "=RP0W", + "=RP0W/P", + "=RP0WWS", + "=RP0Y", + "=RP0Z", + "=RP0ZKD", + "=RP60P", + "=RP65MOH", + "=RP65R", + "=RP65TT", + "=RP65UMF", + "=RP66V", + "=RP67GI", + "=RP67GS", + "=RP67JH", + "=RP67KE", + "=RP67KM", + "=RP67LK", + "=RP67LL", + "=RP67MC", + "=RP67MD", + "=RP67MG", + "=RP67MP", + "=RP67NG", + "=RP67R", + "=RP67RK", + "=RP67SD", + "=RP67ST", + "=RP67SW", + "=RP67TG", + "=RP67TT", + "=RP67UF", + "=RP67V", + "=RP68BP", + "=RP68DT", + "=RP68GM", + "=RP68GR", + "=RP68GS", + "=RP68H", + "=RP68J", + "=RP68KE", + "=RP68KM", + "=RP68LK", + "=RP68LS", + "=RP68MC", + "=RP68MD", + "=RP68MP", + "=RP68MZ", + "=RP68NK", + "=RP68PK", + "=RP68R", + "=RP68RG", + "=RP68SD", + "=RP68TG", + "=RP68TK", + "=RP68TT", + "=RP68TZ", + "=RP68UF", + "=RP68V", + "=RP69CM", + "=RP69DK", + "=RP69GI", + "=RP69GP", + "=RP69GR", + "=RP69GS", + "=RP69KE", + "=RP69KM", + "=RP69LK", + "=RP69LL", + "=RP69LS", + "=RP69MC", + "=RP69MD", + "=RP69MM", + "=RP69NB", + "=RP69P", + "=RP69PW", + "=RP69R", + "=RP69SD", + "=RP69SF", + "=RP69UF", + "=RP69V", + "=RP69YN", + "=RP70AB", + "=RP70AF", + "=RP70AS", + "=RP70AY", + "=RP70AZ", + "=RP70BP", + "=RP70DG", + "=RP70DT", + "=RP70G", + "=RP70GA", + "=RP70GB", + "=RP70GI", + "=RP70GK", + "=RP70GM", + "=RP70GP", + "=RP70GR", + "=RP70GS", + "=RP70H", + "=RP70KE", + "=RP70KM", + "=RP70KV", + "=RP70LF", + "=RP70LL", + "=RP70LM", + "=RP70LS", + "=RP70MA", + "=RP70MC", + "=RP70MD", + "=RP70MP", + "=RP70NK", + "=RP70NM", + "=RP70OB", + "=RP70OF", + "=RP70OS", + "=RP70P", + "=RP70PM", + "=RP70R", + "=RP70RS", + "=RP70SA", + "=RP70SD", + "=RP70SF", + "=RP70SL", + "=RP70SU", + "=RP70TG", + "=RP70TM", + "=RP70UF", + "=RP70UH", + "=RP70UK", + "=RP70V", + "=RP70YF", + "=RP70ZF", + "=RP70ZO", + "=RP71AS", + "=RP71AZ", + "=RP71BP", + "=RP71DG", + "=RP71DT", + "=RP71GA", + "=RP71GA/M", + "=RP71GB", + "=RP71GI", + "=RP71GK", + "=RP71GM", + "=RP71GP", + "=RP71GR", + "=RP71GS", + "=RP71H", + "=RP71KM", + "=RP71LF", + "=RP71LL", + "=RP71LT", + "=RP71MJ", + "=RP71MO", + "=RP71MP", + "=RP71OB", + "=RP71P", + "=RP71R", + "=RP71SA", + "=RP71SD", + "=RP71SF", + "=RP71TG", + "=RP71TK", + "=RP71UF", + "=RP71V", + "=RP72AB", + "=RP72AR", + "=RP72AZ", + "=RP72BP", + "=RP72DG", + "=RP72DS", + "=RP72DT", + "=RP72FI", + "=RP72GB", + "=RP72GI", + "=RP72GK", + "=RP72GM", + "=RP72GP", + "=RP72GR", + "=RP72GS", + "=RP72H", + "=RP72IM", + "=RP72KB", + "=RP72KE", + "=RP72KM", + "=RP72LL", + "=RP72MJ", + "=RP72MP", + "=RP72MS", + "=RP72NM", + "=RP72OB", + "=RP72P", + "=RP72PJ", + "=RP72R", + "=RP72SA", + "=RP72SD", + "=RP72SF", + "=RP72SL", + "=RP72TG", + "=RP72UF", + "=RP72V", + "=RP72WU", + "=RP72YF", + "=RP72ZW", + "=RP73AB", + "=RP73AR", + "=RP73AZ", + "=RP73BP", + "=RP73DG", + "=RP73DT", + "=RP73GB", + "=RP73GI", + "=RP73GK", + "=RP73GR", + "=RP73GS", + "=RP73IM", + "=RP73KM", + "=RP73KT", + "=RP73LL", + "=RP73MP", + "=RP73NZ", + "=RP73OB", + "=RP73P", + "=RP73SA", + "=RP73SD", + "=RP73SF", + "=RP73TG", + "=RP73TP", + "=RP73U", + "=RP73UF", + "=RP73V", + "=RP73WU", + "=RP73ZF", + "=RP74AB", + "=RP74AZ", + "=RP74DG", + "=RP74DT", + "=RP74GB", + "=RP74GI", + "=RP74GR", + "=RP74GS", + "=RP74IM", + "=RP74KM", + "=RP74KT", + "=RP74LL", + "=RP74MP", + "=RP74P", + "=RP74PO", + "=RP74SD", + "=RP74TG", + "=RP74U", + "=RP74UF", + "=RP74V", + "=RP8M", + "=RP9H", + "=RP9OMP", + "=RP9OW", + "=RP9SBO", + "=RP9SBR", + "=RP9SNK", + "=RP9Y", + "=RP9YAF", + "=RP9YTZ", + "RQ0", + "RQ0A", + "RQ0B", + "RQ0C", + "=RQ0C/8", + "=RQ0C/9", + "RQ0E", + "RQ0F", + "RQ0H", + "RQ0I", + "=RQ0J/QRP", + "RQ0K", + "RQ0L", + "RQ0M", + "RQ0N", + "RQ0O", + "RQ0Q", + "RQ0R", + "RQ0S", + "RQ0T", + "RQ0U", + "RQ0V", + "RQ0W", + "RQ0X", + "RQ0Y", + "RQ0Z", + "=RQ110RAEM", + "=RQ16CW", + "=RQ17CW", + "=RQ17WG", + "=RQ4D/8", + "=RQ4D/9", + "RQ8", + "RQ8H", + "RQ8I", + "RQ8J", + "RQ8K", + "RQ8O", + "RQ8P", + "RQ8S", + "RQ8T", + "RQ8U", + "RQ8V", + "RQ8W", + "RQ8Y", + "RQ8Z", + "RQ9", + "RQ9H", + "RQ9I", + "RQ9J", + "RQ9K", + "RQ9O", + "RQ9P", + "RQ9S", + "RQ9T", + "RQ9U", + "RQ9V", + "RQ9W", + "RQ9Y", + "RQ9Z", + "=RR110RAEM", + "=RR9O", + "=RS0B", + "=RS0B/P", + "=RS0F", + "=RS9O", + "RT0", + "RT0A", + "RT0B", + "RT0C", + "RT0E", + "RT0F", + "RT0H", + "RT0I", + "RT0K", + "RT0L", + "RT0M", + "RT0N", + "RT0O", + "RT0Q", + "RT0R", + "RT0S", + "RT0T", + "RT0U", + "RT0V", + "RT0W", + "RT0X", + "RT0Y", + "RT0Z", + "=RT22CT", + "=RT22MC", + "=RT22MD", + "=RT22SA", + "=RT22TK", + "=RT22UA", + "=RT22WF", + "=RT22ZS", + "=RT2F/4", + "=RT2F/4/M", + "=RT2F/9/M", + "=RT4C/8", + "=RT4W/9", + "=RT60RT", + "=RT65KI", + "=RT6A/0", + "=RT73AB", + "=RT73BR", + "=RT73CW", + "=RT73EA", + "=RT73EB", + "=RT73EL", + "=RT73FL", + "=RT73GM", + "=RT73HE", + "=RT73JH", + "=RT73KB", + "=RT73OA", + "=RT73SK", + "=RT77VV", + "RT8", + "=RT8A/4", + "RT8H", + "RT8I", + "RT8J", + "RT8K", + "RT8O", + "RT8P", + "RT8S", + "RT8T", + "RT8U", + "RT8V", + "RT8W", + "RT8Y", + "RT8Z", + "RT9", + "=RT92KA", + "RT9H", + "RT9I", + "RT9J", + "RT9K", + "=RT9K/0", + "=RT9K/9", + "RT9O", + "RT9P", + "RT9S", + "RT9T", + "RT9U", + "RT9V", + "RT9W", + "=RT9W/P", + "RT9Y", + "RT9Z", + "RU0", + "RU0A", + "RU0B", + "RU0C", + "RU0E", + "RU0F", + "RU0H", + "RU0I", + "RU0K", + "RU0L", + "RU0M", + "RU0N", + "RU0O", + "RU0Q", + "RU0R", + "RU0S", + "RU0T", + "RU0U", + "=RU0UA/0", + "RU0V", + "RU0W", + "RU0X", + "RU0Y", + "RU0Z", + "=RU0ZM/9", + "=RU110RAEM", + "=RU17NY", + "=RU19NY", + "=RU20WC", + "=RU22AZ", + "=RU22CR", + "=RU22LR", + "=RU22TU", + "=RU22WZ", + "=RU27OZ", + "=RU27WB", + "=RU27WF", + "=RU27WN", + "=RU27WO", + "=RU3BY/0", + "=RU3DX/0", + "=RU3FF/0", + "=RU3HD/0", + "=RU3HD/9/P", + "=RU4CO/0", + "=RU5D/0", + "=RU5D/8", + "=RU5D/9", + "=RU6LA/9", + "=RU6UR/9", + "=RU6YD/9", + "RU8", + "RU8H", + "RU8I", + "RU8J", + "RU8K", + "RU8O", + "RU8P", + "RU8S", + "RU8T", + "RU8U", + "RU8V", + "RU8W", + "RU8Y", + "RU8Z", + "RU9", + "=RU90WZ", + "=RU9AZ/9", + "=RU9CK/4/M", + "RU9H", + "RU9I", + "RU9J", + "RU9K", + "=RU9KC/4/M", + "=RU9MV/0", + "RU9O", + "RU9P", + "RU9S", + "=RU9SO/4", + "=RU9SO/4/P", + "=RU9SO/M", + "RU9T", + "RU9U", + "RU9V", + "RU9W", + "RU9Y", + "RU9Z", + "RV0", + "RV0A", + "=RV0AE/0/FF", + "RV0B", + "RV0C", + "=RV0CJ/9", + "RV0E", + "RV0F", + "RV0H", + "RV0I", + "RV0K", + "RV0L", + "RV0M", + "RV0N", + "RV0O", + "RV0Q", + "RV0R", + "RV0S", + "=RV0SR/9", + "RV0T", + "RV0U", + "RV0V", + "RV0W", + "RV0X", + "RV0Y", + "RV0Z", + "=RV1AQ/9", + "=RV1AW/0", + "=RV1CC/0", + "=RV1CC/4/M", + "=RV1CC/8", + "=RV1CC/8/M", + "=RV1CC/9", + "=RV22WB", + "=RV2FW/0", + "=RV2FZ/9", + "=RV3ACA/0", + "=RV3ACA/0/M", + "=RV3BA/9", + "=RV3DHC/0", + "=RV3DHC/0/P", + "=RV3DSA/0", + "=RV3EFH/0", + "=RV3LO/9", + "=RV3MA/0", + "=RV3MN/9", + "=RV3PZ/9", + "=RV6AJ/0", + "=RV6ARQ/9", + "=RV6LFE/9", + "=RV6LGY/9", + "=RV6LGY/9/M", + "=RV6LGY/9/P", + "=RV6MD/9", + "=RV6YM/9", + "=RV7AD/0", + "RV8", + "RV8H", + "RV8I", + "RV8J", + "RV8K", + "RV8O", + "RV8P", + "RV8S", + "RV8T", + "RV8U", + "RV8V", + "RV8W", + "RV8Y", + "RV8Z", + "RV9", + "=RV90WB", + "=RV9CHB/4", + "=RV9CX/4/M", + "RV9H", + "RV9I", + "RV9J", + "=RV9JD/0", + "RV9K", + "RV9O", + "RV9P", + "RV9S", + "RV9T", + "RV9U", + "RV9V", + "RV9W", + "=RV9WB/8", + "=RV9WB/9/M", + "=RV9WGF/4/M", + "=RV9WMZ/9/M", + "=RV9WMZ/9/P", + "=RV9WMZ/P", + "=RV9WP/0", + "=RV9WP/9", + "RV9Y", + "RV9Z", + "RW0", + "RW0A", + "RW0B", + "=RW0BB/9", + "=RW0BB/9/LH", + "=RW0BG/9", + "RW0C", + "RW0E", + "RW0F", + "RW0H", + "RW0I", + "RW0K", + "RW0L", + "RW0M", + "RW0N", + "RW0O", + "RW0Q", + "=RW0QJ/9", + "RW0R", + "RW0S", + "RW0T", + "RW0U", + "=RW0UM/0", + "RW0V", + "RW0W", + "RW0X", + "RW0Y", + "RW0Z", + "=RW110RAEM", + "=RW1AC/9", + "=RW1AI/0", + "=RW1AI/9", + "=RW22GO", + "=RW22MW", + "=RW22QA", + "=RW22QA/8", + "=RW22QC", + "=RW22QC/8", + "=RW22WG", + "=RW22WR", + "=RW3DTB/0", + "=RW3GW/0", + "=RW3LG/0", + "=RW3SN/9", + "=RW3XN/0", + "=RW3XX/9", + "=RW3YC/0", + "=RW3YC/9", + "=RW4AA/9", + "=RW4CG/0", + "=RW4CG/0/P", + "=RW4CG/9", + "=RW4HIF/9", + "=RW4HIH/9", + "=RW4HOH/9", + "=RW4LX/9", + "=RW4NW/9", + "=RW4NX/9", + "=RW4PJZ/9", + "=RW4PJZ/9/M", + "=RW4PP/9", + "=RW4WA/9/P", + "=RW4YA/0", + "=RW4YA/9", + "=RW55YG", + "=RW6AHV/9", + "=RW6BA/9", + "RW8", + "=RW80KEDR", + "RW8H", + "RW8I", + "RW8J", + "RW8K", + "RW8O", + "RW8P", + "RW8S", + "RW8T", + "RW8U", + "RW8V", + "RW8W", + "RW8Y", + "RW8Z", + "RW9", + "=RW90WC", + "=RW9C", + "=RW9FWR/9/M", + "RW9H", + "RW9I", + "RW9J", + "=RW9JZ/4", + "=RW9JZ/9", + "RW9K", + "=RW9MD/9/M", + "=RW9MD/9/P", + "RW9O", + "RW9P", + "RW9S", + "RW9T", + "RW9U", + "RW9V", + "RW9W", + "=RW9WA/9", + "=RW9WA/9/M", + "=RW9WX/9", + "=RW9XU/9", + "RW9Y", + "RW9Z", + "RX0", + "RX0A", + "=RX0AE/0", + "=RX0AT/0/P", + "RX0B", + "RX0C", + "RX0E", + "RX0F", + "RX0H", + "RX0I", + "RX0K", + "RX0L", + "RX0M", + "RX0N", + "RX0O", + "RX0Q", + "RX0R", + "RX0S", + "=RX0SD/9", + "RX0T", + "RX0U", + "RX0V", + "RX0W", + "RX0X", + "RX0Y", + "RX0Z", + "=RX15RX", + "=RX17WG", + "=RX22WN", + "=RX3AT/0", + "=RX3BP/9", + "=RX3BP/9/MM", + "=RX3DFH/0", + "=RX3F/0", + "=RX3Q/8", + "=RX3Q/9", + "=RX3RC/9", + "=RX4W/8", + "=RX55YG", + "=RX6AY/9", + "=RX6CM/0", + "=RX6CP/8", + "=RX6DL/8", + "=RX6DL/8/P", + "=RX6DL/8/P/QRP", + "=RX6DL/9/P", + "=RX6LMA/9", + "=RX6LMQ/0", + "RX8", + "=RX80SP", + "RX8H", + "RX8I", + "RX8J", + "RX8K", + "RX8O", + "RX8P", + "RX8S", + "RX8T", + "RX8U", + "RX8V", + "RX8W", + "RX8Y", + "RX8Z", + "RX9", + "RX9H", + "RX9I", + "RX9J", + "RX9K", + "RX9O", + "RX9P", + "RX9S", + "=RX9SN/8", + "RX9T", + "RX9U", + "=RX9UL/9", + "RX9V", + "RX9W", + "=RX9WN/0", + "=RX9WN/0/M", + "=RX9WN/0/P", + "=RX9WN/9/M", + "=RX9WT/8", + "RX9Y", + "RX9Z", + "RY0", + "RY0A", + "RY0B", + "RY0C", + "RY0E", + "RY0F", + "RY0H", + "RY0I", + "RY0K", + "RY0L", + "RY0M", + "RY0N", + "RY0O", + "RY0Q", + "RY0R", + "RY0S", + "RY0T", + "RY0U", + "RY0V", + "RY0W", + "RY0X", + "RY0Y", + "RY0Z", + "=RY1AAB/0/M", + "=RY1AAB/9", + "=RY1AAB/9/M", + "=RY22MC", + "=RY22RZ", + "=RY4W/9", + "RY8", + "=RY80SP", + "RY8H", + "RY8I", + "RY8J", + "RY8K", + "RY8O", + "RY8P", + "RY8S", + "RY8T", + "RY8U", + "RY8V", + "RY8W", + "RY8Y", + "RY8Z", + "RY9", + "=RY9C/P", + "RY9H", + "RY9I", + "RY9J", + "RY9K", + "RY9O", + "RY9P", + "RY9S", + "RY9T", + "RY9U", + "RY9V", + "RY9W", + "RY9Y", + "RY9Z", + "RZ0", + "RZ0A", + "=RZ0AM/0", + "RZ0B", + "RZ0C", + "RZ0E", + "RZ0F", + "RZ0H", + "RZ0I", + "RZ0K", + "RZ0L", + "RZ0M", + "RZ0N", + "RZ0O", + "=RZ0OO/9", + "RZ0Q", + "RZ0R", + "RZ0S", + "=RZ0SO/P", + "RZ0T", + "RZ0U", + "RZ0V", + "RZ0W", + "RZ0X", + "RZ0Y", + "RZ0Z", + "=RZ16WF", + "=RZ17NY", + "=RZ19NY", + "=RZ1CWC/8", + "=RZ22WW", + "=RZ37ZF", + "=RZ38ZF", + "=RZ39ZF", + "=RZ3BY/0", + "=RZ3DSA/0", + "=RZ3DW/0", + "=RZ3DZS/0", + "=RZ3EC/0", + "=RZ4HD/0", + "=RZ4HZW/9/M", + "=RZ55YG", + "=RZ5D/0", + "=RZ5D/8", + "=RZ5D/9", + "=RZ6A/9", + "=RZ6DR/9/M", + "=RZ6LL/0", + "=RZ6MZ/0", + "RZ8", + "RZ8H", + "RZ8I", + "RZ8J", + "RZ8K", + "RZ8O", + "RZ8P", + "RZ8S", + "RZ8T", + "RZ8U", + "RZ8V", + "RZ8W", + "RZ8Y", + "RZ8Z", + "RZ9", + "=RZ90W", + "=RZ90WU", + "=RZ9DX/0", + "=RZ9DX/0/A", + "=RZ9DX/0/P", + "=RZ9DX/9", + "=RZ9DX/9/P", + "RZ9H", + "=RZ9HK/FF", + "=RZ9HX/FF", + "RZ9I", + "RZ9J", + "RZ9K", + "=RZ9MXM/9", + "=RZ9MXM/9/M", + "RZ9O", + "=RZ9O/0", + "=RZ9ODD/0", + "=RZ9ON/0", + "=RZ9ON/9", + "=RZ9OO/0", + "=RZ9OO/9/M", + "=RZ9OWE/0", + "RZ9P", + "RZ9S", + "RZ9T", + "RZ9U", + "RZ9V", + "RZ9W", + "=RZ9WF/8", + "=RZ9WF/9", + "=RZ9WM/9/M", + "RZ9Y", + "=RZ9YI/9", + "RZ9Z", + "U0", + "U0A", + "U0B", + "U0C", + "U0E", + "U0F", + "U0H", + "=U0H/UA0AGQ", + "U0I", + "U0K", + "U0L", + "U0M", + "U0N", + "U0O", + "U0Q", + "U0R", + "U0S", + "U0T", + "U0U", + "U0V", + "U0W", + "U0X", + "U0Y", + "U0Z", + "U8", + "U8H", + "U8I", + "U8J", + "U8K", + "U8O", + "U8P", + "U8S", + "U8T", + "U8U", + "U8V", + "U8W", + "U8Y", + "U8Z", + "U9", + "U9H", + "U9I", + "U9J", + "U9K", + "U9O", + "U9P", + "U9S", + "U9T", + "U9U", + "U9V", + "U9W", + "U9Y", + "U9Z", + "UA0", + "UA0A", + "=UA0ACG/0", + "=UA0ADU/0", + "=UA0AGA/9/P", + "=UA0AOZ/0", + "=UA0AZA/9", + "UA0B", + "=UA0BA/8", + "UA0C", + "UA0E", + "UA0F", + "=UA0FCB/0", + "=UA0FCB/0/P", + "=UA0FCB/P", + "UA0H", + "UA0I", + "UA0K", + "=UA0KBA/9", + "=UA0KBG/0", + "=UA0KBG/9", + "=UA0KBG/9/P", + "=UA0KDR/9", + "=UA0KY/9", + "UA0L", + "=UA0LLW/9", + "UA0M", + "=UA0MF/9", + "UA0N", + "UA0O", + "UA0Q", + "=UA0QMU/0", + "=UA0QQO/9/P", + "UA0R", + "UA0S", + "=UA0SDX/0", + "=UA0SIK/0", + "=UA0SVD/0", + "UA0T", + "UA0U", + "UA0V", + "UA0W", + "=UA0WG/0", + "=UA0WGD/0", + "=UA0WW/0", + "=UA0WW/M", + "=UA0WY/0", + "UA0X", + "UA0Y", + "UA0Z", + "=UA0ZAY/9", + "=UA0ZDA/MM", + "=UA0ZDY/9", + "=UA1AAE/9", + "=UA1ADQ/0", + "=UA1ANA/0", + "=UA1FBP/9", + "=UA1ORT/0", + "=UA1PBA/0", + "=UA1PBA/9", + "=UA1PBP/9", + "=UA1ZGD/9", + "=UA1ZPC/9", + "=UA3A/P", + "=UA3AAC/0", + "=UA3ADN/0", + "=UA3AHA/0", + "=UA3AKO/0", + "=UA3AKO/0/M", + "=UA3AKO/8", + "=UA3AKO/9", + "=UA3DFM/8", + "=UA3DFM/9", + "=UA3DND/8", + "=UA3DX/0", + "=UA3EDP/0", + "=UA3EDQ/0", + "=UA3EDQ/0/MM", + "=UA3EDQ/0/P", + "=UA3FQ/8", + "=UA3HY/0", + "=UA3IHJ/8", + "=UA3MGA/9", + "=UA3TT/8", + "=UA3WB/9", + "=UA3YH/0", + "=UA3ZAF/9", + "=UA4LCQ/9", + "=UA4LU/0", + "=UA4LU/9/P", + "=UA4PIE/9", + "=UA4PIE/9/M", + "=UA4PIE/9/P", + "=UA4PJM/9", + "=UA4PJM/9/M", + "=UA4PJM/9/P", + "=UA4PT/0", + "=UA4PXR/9/M", + "=UA4RC/9", + "=UA4RX/0", + "=UA4SBZ/0", + "=UA4WHX/9", + "=UA6A/9", + "=UA6ANU/0", + "=UA6BTN/0", + "=UA6BTN/9", + "=UA6CW/0", + "=UA6CW/9", + "=UA6HMC/0", + "=UA6LP/0", + "=UA6MF/0", + "=UA6WFO/9", + "=UA6WIO/9", + "=UA6YGY/8", + "=UA6YGY/9", + "=UA7R/0", + "UA8", + "UA8H", + "UA8I", + "UA8J", + "UA8K", + "UA8O", + "UA8P", + "UA8S", + "UA8T", + "UA8U", + "UA8V", + "UA8W", + "=UA8WAA/8", + "=UA8WAA/9", + "=UA8WAA/9/P", + "=UA8WAA/M", + "UA8Y", + "UA8Z", + "UA9", + "=UA9CGL/9/M", + "=UA9CTT/0", + "=UA9FL/0", + "UA9H", + "UA9I", + "UA9J", + "=UA9JFE/9/P", + "=UA9JFN/9/M", + "=UA9JFN/M", + "UA9K", + "=UA9KAA/4", + "=UA9KAA/9", + "=UA9KW/0", + "=UA9MA/9", + "=UA9MA/9/M", + "=UA9MA/M", + "=UA9MAC/9", + "=UA9MBK/0", + "=UA9MRA/9", + "=UA9MUY/0", + "=UA9MUY/9", + "=UA9MW/9", + "UA9O", + "=UA9OAP/9/P", + "UA9P", + "UA9S", + "=UA9SG/9", + "=UA9SIV/9", + "=UA9SUV/8", + "UA9T", + "=UA9TO/9/M", + "UA9U", + "=UA9UAX/0", + "=UA9UAX/0/M", + "=UA9UAX/8", + "=UA9UAX/8/M", + "=UA9UAX/9", + "=UA9UAX/9/M", + "=UA9UAX/9/P", + "=UA9UAX/M", + "UA9V", + "UA9W", + "=UA9WDK/0", + "=UA9WMN/9/P", + "=UA9WOB/0", + "=UA9WOB/0/P", + "UA9Y", + "UA9Z", + "=UA9ZZ/0/P", + "UB0", + "UB0A", + "UB0B", + "UB0C", + "UB0E", + "UB0F", + "UB0H", + "UB0I", + "UB0K", + "UB0L", + "=UB0LAP/P", + "UB0M", + "UB0N", + "UB0O", + "UB0Q", + "UB0R", + "UB0S", + "UB0T", + "UB0U", + "UB0V", + "UB0W", + "UB0X", + "UB0Y", + "UB0Z", + "=UB1AJQ/0", + "=UB40FSU", + "=UB5O/0", + "=UB5O/4", + "=UB5O/4/M", + "=UB5O/8", + "=UB5O/8/P", + "=UB5O/9", + "UB8", + "UB8H", + "UB8I", + "UB8J", + "UB8K", + "UB8O", + "UB8P", + "UB8S", + "UB8T", + "UB8U", + "UB8V", + "UB8W", + "UB8Y", + "UB8Z", + "UB9", + "UB9H", + "UB9I", + "UB9J", + "=UB9JBN/9/M", + "UB9K", + "UB9O", + "UB9P", + "UB9S", + "UB9T", + "UB9U", + "UB9V", + "UB9W", + "UB9Y", + "UB9Z", + "UC0", + "UC0A", + "UC0B", + "UC0C", + "UC0E", + "UC0F", + "UC0H", + "UC0I", + "UC0K", + "UC0L", + "=UC0LAF/P", + "UC0M", + "UC0N", + "UC0O", + "UC0Q", + "UC0R", + "UC0S", + "UC0T", + "UC0U", + "UC0V", + "UC0W", + "UC0X", + "UC0Y", + "UC0Z", + "UC8", + "UC8H", + "UC8I", + "UC8J", + "UC8K", + "UC8O", + "UC8P", + "UC8S", + "UC8T", + "UC8U", + "UC8V", + "UC8W", + "UC8Y", + "UC8Z", + "UC9", + "UC9H", + "UC9I", + "UC9J", + "UC9K", + "UC9O", + "UC9P", + "UC9S", + "UC9T", + "UC9U", + "UC9V", + "UC9W", + "UC9Y", + "UC9Z", + "UD0", + "UD0A", + "UD0B", + "UD0C", + "UD0E", + "UD0F", + "UD0H", + "UD0I", + "UD0K", + "UD0L", + "UD0M", + "UD0N", + "UD0O", + "UD0Q", + "UD0R", + "UD0S", + "UD0T", + "UD0U", + "UD0V", + "UD0W", + "UD0X", + "UD0Y", + "UD0Z", + "=UD6AOP/0", + "UD8", + "UD8H", + "UD8I", + "UD8J", + "UD8K", + "UD8O", + "UD8P", + "UD8S", + "UD8T", + "UD8U", + "UD8V", + "UD8W", + "UD8Y", + "UD8Z", + "UD9", + "UD9H", + "UD9I", + "UD9J", + "UD9K", + "UD9O", + "UD9P", + "UD9S", + "UD9T", + "UD9U", + "UD9V", + "UD9W", + "UD9Y", + "UD9Z", + "UE0", + "UE0A", + "=UE0ARD/0", + "UE0B", + "=UE0BFF", + "UE0C", + "UE0E", + "UE0F", + "UE0H", + "UE0I", + "UE0K", + "UE0L", + "UE0M", + "UE0N", + "UE0O", + "=UE0OFF/0", + "UE0Q", + "UE0R", + "UE0S", + "UE0T", + "UE0U", + "UE0V", + "UE0W", + "UE0X", + "UE0Y", + "UE0Z", + "=UE0ZOO/9", + "=UE105SBM", + "=UE10RFF/4", + "=UE10RFF/9", + "=UE14TS", + "=UE150C", + "=UE15UWC", + "=UE16SR", + "=UE18M", + "=UE18U", + "=UE18Z", + "=UE1AAA/0", + "=UE1RFF/0", + "=UE1RFF/0/P", + "=UE1RFF/9", + "=UE1WFF/0", + "=UE23RRC", + "=UE23RRC/P", + "=UE25F", + "=UE25ST", + "=UE3ATV/0", + "=UE3ATV/9", + "=UE40CZF", + "=UE44POL", + "=UE44POL/P", + "=UE44R/9", + "=UE44V", + "=UE44Y/8", + "=UE44Y/9", + "=UE45AWT", + "=UE4NFF/9", + "=UE4WFF/9", + "=UE4WFF/9/P", + "=UE55IR", + "=UE55OB", + "=UE55OM", + "=UE56S", + "=UE60QA", + "=UE60SWA", + "=UE60TDP", + "=UE60TDP/P", + "=UE64RWA", + "=UE6MAC/0", + "=UE70AAA", + "=UE70KRM/8/M", + "=UE70KRM/9", + "=UE70KRM/9/M", + "=UE70MA", + "=UE70SL", + "=UE70SVV", + "=UE70UVV", + "=UE70UWW", + "=UE70VSV", + "=UE70Y", + "=UE73D", + "=UE73DI", + "=UE75DT", + "=UE75L", + "=UE75OJ", + "=UE75VV", + "UE8", + "=UE80AL", + "=UE80C", + "=UE80IR", + "=UE80NSO", + "=UE80SBR", + "UE8H", + "UE8I", + "UE8J", + "UE8K", + "UE8O", + "UE8P", + "UE8S", + "UE8T", + "UE8U", + "UE8V", + "UE8W", + "UE8Y", + "UE8Z", + "UE9", + "=UE90W", + "=UE9FDA/0", + "=UE9FDA/0/M", + "=UE9FDA/9", + "=UE9FDA/9/M", + "UE9H", + "UE9I", + "UE9J", + "UE9K", + "=UE9MDA/9", + "UE9O", + "=UE9OFF/9", + "UE9P", + "UE9S", + "UE9T", + "UE9U", + "UE9V", + "UE9W", + "=UE9WDA/9", + "=UE9WDA/9/M", + "UE9Y", + "UE9Z", + "UF0", + "UF0A", + "UF0B", + "UF0C", + "UF0E", + "UF0F", + "UF0H", + "UF0I", + "UF0K", + "UF0L", + "UF0M", + "UF0N", + "UF0O", + "UF0Q", + "UF0R", + "UF0S", + "UF0T", + "UF0U", + "UF0V", + "UF0W", + "UF0X", + "UF0Y", + "UF0Z", + "UF8", + "UF8H", + "UF8I", + "UF8J", + "UF8K", + "UF8O", + "UF8P", + "UF8S", + "UF8T", + "UF8U", + "UF8V", + "UF8W", + "UF8Y", + "UF8Z", + "UF9", + "UF9H", + "UF9I", + "UF9J", + "UF9K", + "UF9O", + "UF9P", + "UF9S", + "UF9T", + "UF9U", + "UF9V", + "UF9W", + "UF9Y", + "UF9Z", + "UG0", + "UG0A", + "UG0B", + "UG0C", + "UG0E", + "UG0F", + "UG0H", + "UG0I", + "UG0K", + "UG0L", + "UG0M", + "UG0N", + "UG0O", + "UG0Q", + "UG0R", + "UG0S", + "UG0T", + "UG0U", + "UG0V", + "UG0W", + "UG0X", + "UG0Y", + "UG0Z", + "UG8", + "UG8H", + "UG8I", + "UG8J", + "UG8K", + "UG8O", + "UG8P", + "UG8S", + "UG8T", + "UG8U", + "UG8V", + "UG8W", + "UG8Y", + "UG8Z", + "UG9", + "UG9H", + "UG9I", + "UG9J", + "UG9K", + "UG9O", + "UG9P", + "UG9S", + "UG9T", + "UG9U", + "UG9V", + "UG9W", + "UG9Y", + "UG9Z", + "UH0", + "UH0A", + "UH0B", + "UH0C", + "UH0E", + "UH0F", + "UH0H", + "UH0I", + "UH0K", + "UH0L", + "UH0M", + "UH0N", + "UH0O", + "UH0Q", + "UH0R", + "UH0S", + "UH0T", + "UH0U", + "UH0V", + "UH0W", + "UH0X", + "UH0Y", + "UH0Z", + "UH8", + "UH8H", + "UH8I", + "UH8J", + "UH8K", + "UH8O", + "UH8P", + "UH8S", + "UH8T", + "UH8U", + "UH8V", + "UH8W", + "UH8Y", + "UH8Z", + "UH9", + "UH9H", + "UH9I", + "UH9J", + "UH9K", + "UH9O", + "UH9P", + "UH9S", + "UH9T", + "UH9U", + "UH9V", + "UH9W", + "UH9Y", + "UH9Z", + "UI0", + "UI0A", + "UI0B", + "UI0C", + "UI0E", + "UI0F", + "UI0H", + "UI0I", + "UI0K", + "UI0L", + "UI0M", + "UI0N", + "UI0O", + "UI0Q", + "UI0R", + "UI0S", + "UI0T", + "UI0U", + "UI0V", + "UI0W", + "UI0X", + "UI0Y", + "UI0Z", + "UI8", + "UI8H", + "UI8I", + "UI8J", + "UI8K", + "UI8O", + "UI8P", + "UI8S", + "UI8T", + "UI8U", + "UI8V", + "UI8W", + "UI8Y", + "UI8Z", + "UI9", + "UI9H", + "UI9I", + "UI9J", + "UI9K", + "UI9O", + "UI9P", + "UI9S", + "UI9T", + "UI9U", + "UI9V", + "UI9W", + "UI9Y", + "UI9Z" + ], + "worked": false, + "confirmed": false, + "flag": "ru.png", + "pp": "UA9", + "lat": 64.03667348152678, + "lon": 116.38888888888889, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "15": { + "dxcc": "16", + "cc": "NZ", + "ccc": "NZL", + "name": "坎贝尔群岛", + "continent": "OC", + "ituzone": ["60"], + "cqzone": ["32"], + "timezone": "12", + "ccode": "554", + "aname": "亚南塔群岛", + "mh": ["RD47"], + "prefix": ["ZL9"], + "worked": false, + "confirmed": false, + "flag": "nz.png", + "pp": "ZL9", + "lat": -50.67573508006514, + "lon": 165.98079561042525, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "16": { + "dxcc": "17", + "cc": "VE", + "ccc": "VEN", + "name": "阿维斯岛", + "continent": "NA", + "ituzone": ["11"], + "cqzone": ["8"], + "timezone": "-4", + "ccode": "862", + "aname": "Aves I.", + "mh": ["FK85"], + "prefix": ["4M0", "YV0", "YW0", "YX0", "YY0"], + "worked": false, + "confirmed": false, + "flag": "ve.png", + "pp": "YV0", + "lat": 15.66847579303652, + "lon": -63.62254072731812, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "17": { + "dxcc": "18", + "cc": "AZ", + "ccc": "AZE", + "name": "阿塞拜疆", + "continent": "AS", + "ituzone": ["29"], + "cqzone": ["21"], + "timezone": "4", + "ccode": "31", + "aname": "Azerbaijan", + "mh": [ + "LM28", + "LM29", + "LM38", + "LM39", + "LM48", + "LM49", + "LN20", + "LN21", + "LN30", + "LN31", + "LN40", + "LN41", + "LN50" + ], + "prefix": ["4J", "=4J5T/FF", "=4J7WMF/FF", "4K", "=4K4K/FF", "=4K6AE/FF"], + "worked": false, + "confirmed": false, + "flag": "az.png", + "pp": "4J", + "lat": 40.433978547032694, + "lon": 47.69547325102881, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "18": { + "dxcc": "19", + "cc": "CO", + "ccc": "COL", + "name": "Bajo Neuvo", + "continent": "NA", + "ituzone": ["11"], + "cqzone": ["8"], + "timezone": "0", + "ccode": "170", + "aname": "Bajo Neuvo", + "mh": ["FK05"], + "prefix": [], + "worked": false, + "confirmed": false, + "flag": "xx.png", + "pp": "", + "lat": 0, + "lon": 0, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "19": { + "dxcc": "20", + "cc": "US", + "ccc": "USA", + "name": "贝克岛和豪兰岛", + "continent": "OC", + "ituzone": ["61"], + "cqzone": ["31"], + "timezone": "-12", + "ccode": "840", + "aname": "Baker & Howland Is.", + "mh": ["AJ10"], + "prefix": ["AH1", "KH1", "NH1", "WH1"], + "worked": false, + "confirmed": false, + "flag": "us.png", + "pp": "KH1", + "lat": 0.48384434314837677, + "lon": -176.549093251493, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "20": { + "dxcc": "21", + "cc": "ES", + "ccc": "ESP", + "name": "巴里亚利群岛", + "continent": "EU", + "ituzone": ["37"], + "cqzone": ["14"], + "timezone": "1", + "ccode": "724", + "aname": "Balearic Is.", + "mh": ["JM08", "JM09", "JM19", "JM29", "JN10", "JN20"], + "prefix": [ + "AM6", + "=AM70URE/6", + "AN6", + "AO6", + "=EA1QE/6", + "=EA1YO/6", + "=EA2EZ/6", + "=EA2SG/6", + "=EA2TW/6", + "=EA3BT/6", + "=EA3CBH/6", + "=EA3ERT/6", + "=EA3HSD/6", + "=EA3HUX/6", + "=EA3HZX/6", + "=EA3HZX/P", + "=EA3RKM/6", + "=EA4LO/6", + "=EA5ADM/6", + "=EA5BB/6", + "=EA5BK/6", + "=EA5BTL/6", + "=EA5EOR/6", + "=EA5ER/6", + "=EA5EZ", + "=EA5EZ/6", + "=EA5EZ/P", + "=EA5FL/P", + "=EA5HCC/6", + "=EA5IIG/6", + "=EA5IKT/6", + "=EA5RKB/6", + "EA6", + "=EA6/DJ5AA/LH", + "=EA6/DJ7AO/LH", + "=EA6/G0SGB/LH", + "=EA6HP/J", + "=EA6LU/P", + "=EA6URI/PAZ", + "=EA6URL/IF", + "=EA7DUT/6", + "=EA9CI/6", + "=EA9CP/6", + "=EB1BRH/6", + "=EB2GKK/6", + "=EB3CW/6", + "EB6", + "=EC5AC/6", + "=EC5BME/6", + "=EC5EA/P", + "=EC5EC/6", + "EC6", + "=EC6TV/N", + "=EC7AT/6", + "=ED4SHF/6", + "=ED5ON/6", + "ED6", + "EE6", + "EF6", + "EG6", + "EH6", + "=EH90IARU/6" + ], + "worked": false, + "confirmed": false, + "flag": "es.png", + "pp": "EA6", + "lat": 39.72024279482304, + "lon": 2.825788751714678, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "21": { + "dxcc": "22", + "cc": "PW", + "ccc": "PLW", + "name": "帛琉", + "continent": "OC", + "ituzone": ["64"], + "cqzone": ["27"], + "timezone": "10", + "ccode": "585", + "aname": "Palau", + "mh": ["PJ65", "PJ76", "PJ77"], + "prefix": ["T8"], + "worked": false, + "confirmed": false, + "flag": "pw.png", + "pp": "T8", + "lat": 7.409026557884673, + "lon": 134.47543565513385, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "23": { + "dxcc": "24", + "cc": "BV", + "ccc": "BVT", + "name": "布韦岛", + "continent": "AF", + "ituzone": ["67"], + "cqzone": ["38"], + "timezone": "0", + "ccode": "74", + "aname": "Bouvet", + "mh": ["JD15"], + "prefix": ["=3Y/ZS6GCM", "=3Y0C", "=3Y0E"], + "worked": false, + "confirmed": false, + "flag": "no.png", + "pp": "3Y/b", + "lat": -54.41024340725154, + "lon": 3.39582380734646, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "26": { + "dxcc": "27", + "cc": "BY", + "ccc": "BLR", + "name": "白俄罗斯", + "continent": "EU", + "ituzone": ["29"], + "cqzone": ["16"], + "timezone": "2", + "ccode": "112", + "aname": "Belarus", + "mh": [ + "KO11", + "KO12", + "KO13", + "KO21", + "KO22", + "KO23", + "KO24", + "KO31", + "KO32", + "KO33", + "KO34", + "KO35", + "KO36", + "KO41", + "KO42", + "KO43", + "KO44", + "KO45", + "KO46", + "KO51", + "KO52", + "KO53", + "KO54", + "KO55", + "KO63" + ], + "prefix": ["EU", "EV", "EW"], + "worked": false, + "confirmed": false, + "flag": "by.png", + "pp": "EW", + "lat": 53.655642599114344, + "lon": 27.716049382716058, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "28": { + "dxcc": "29", + "cc": "ES", + "ccc": "ESP", + "name": "加那利群岛", + "continent": "AF", + "ituzone": ["36"], + "cqzone": ["33"], + "timezone": "0", + "ccode": "724", + "aname": "Canary Is.", + "mh": ["IL07", "IL08", "IL17", "IL18", "IL27", "IL28", "IL38", "IL39"], + "prefix": [ + "=AM70URE/8", + "AM8", + "=AN400L", + "=AN400U", + "AN8", + "=AO150ITU/8", + "=AO150U", + "=AO3MWC/8", + "=AO4AAA/8", + "AO8", + "=EA1AK/8", + "=EA1AP/8", + "=EA1EHW/8", + "=EA1YO/8", + "=EA2SG/8", + "=EA2TW/8", + "=EA3FNZ/8", + "=EA3RKB/8", + "=EA4BFH/8", + "=EA4BQ/8", + "=EA4DE/8", + "=EA4ESI/8", + "=EA4SV/8", + "=EA4WT/8", + "=EA4ZK/8", + "=EA5BK/8", + "=EA5EZ/8", + "=EA5HCC/8", + "=EA5RKB/8", + "=EA5RKL/8", + "=EA7JR/8", + "EA8", + "=EA8/DJ5AA/LH", + "=EA8AKG/F", + "=EA8AKG/G", + "=EA8DO/LP", + "=EA8EE/L", + "=EA8TH/LP", + "=EA8URE/YOTA", + "=EA8URL/LH", + "=EA8URL/P/SBI", + "=EA9CI/8", + "=EA9CP/8", + "=EB2EMH/8", + "EB8", + "=EC1KR/8", + "EC8", + "=EC8AFM/LH", + "=ED4R/8", + "=ED5RKL/8", + "ED8", + "=ED8BTM/C", + "=ED8BTM/E", + "=ED8BTM/J", + "=ED8BTM/L", + "=ED8BTM/S", + "=ED8GSA/J", + "=ED8LIB/C", + "=ED8LIB/D", + "=ED8LIB/E", + "=ED8LIB/F", + "=ED8LIB/G", + "=ED8LIB/H", + "=ED8LIB/I", + "=ED8LIB/J", + "=ED8LIB/K", + "=ED8LIB/N", + "=ED8LIB/O", + "=ED8LIB/Q", + "=ED8LPA/L", + "=ED8MCC/LH", + "=ED8OTA/D", + "=ED8OTA/H", + "=ED8PDC/E", + "=ED8PDC/K", + "=ED8PDC/LP", + "=ED8PDC/O", + "EE8", + "EF8", + "=EF8LIB/N", + "EG8", + "=EG8LIB/C", + "=EG8LIB/D", + "=EG8LIB/E", + "=EG8LIB/F", + "=EG8LIB/G", + "=EG8LIB/H", + "=EG8LIB/I", + "=EG8LIB/L", + "=EG8LIB/M", + "=EG8LIB/N", + "=EG8LIB/O", + "=EG8LIB/P", + "=EG8LIB/Q", + "=EG8LP/YL", + "EH8", + "=EH8FLH/LH", + "=EH90IARU/8" + ], + "worked": false, + "confirmed": false, + "flag": "es.png", + "pp": "EA8", + "lat": 28.318532922774367, + "lon": -15.76131687242799, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "30": { + "dxcc": "31", + "cc": "KI", + "ccc": "KIR", + "name": "中吉里巴斯岛", + "continent": "OC", + "ituzone": ["62"], + "cqzone": ["31"], + "timezone": "12", + "ccode": "296", + "aname": "C. Kiribati (British Phoenix Is.)", + "mh": ["AI35", "AI45", "AI46", "AI47"], + "prefix": ["T31"], + "worked": false, + "confirmed": false, + "flag": "ki.png", + "pp": "T31", + "lat": -3.509463297900396, + "lon": -171.52263374485597, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "31": { + "dxcc": "32", + "cc": "ES", + "ccc": "ESP", + "name": "休达和梅利利亚", + "continent": "AF", + "ituzone": ["37"], + "cqzone": ["33"], + "timezone": "1", + "ccode": "724", + "aname": "Ceuta & Melilla", + "mh": ["IM75", "IM85"], + "prefix": [ + "=AM70URE/9", + "AM9", + "AN9", + "AO9", + "=EA3EGB/9", + "=EA4URE/9", + "=EA5DCL/9", + "=EA5RKB/9", + "=EA7JTF/9", + "=EA7URM/9", + "=EA7UV/P", + "EA9", + "=EA9CD/M", + "=EA9CD/P", + "=EA9CE/C", + "=EA9CE/D", + "=EA9CE/E", + "=EA9CE/F", + "=EA9CE/G", + "=EA9CE/H", + "=EA9CE/I", + "=EA9PD/M", + "=EA9PD/P", + "=EA9URC/PAZ", + "EB9", + "=EB9PH/P", + "=EC5ALJ/9", + "=EC7DRS/9", + "=EC7DZZ/9", + "EC9", + "=ED3AFR/9", + "ED9", + "=ED9CE/D", + "=ED9CE/E", + "=ED9CE/F", + "EE9", + "EF9", + "EG9", + "EH9" + ], + "worked": false, + "confirmed": false, + "flag": "es.png", + "pp": "EA9", + "lat": 35.888333, + "lon": -5.315556, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "32": { + "dxcc": "33", + "cc": "GB", + "ccc": "GBR", + "name": "查戈斯群岛", + "continent": "AF", + "ituzone": ["41"], + "cqzone": ["39"], + "timezone": "5", + "ccode": "826", + "aname": "Chagos Is.", + "mh": ["MI53", "MI62"], + "prefix": ["VQ9"], + "worked": false, + "confirmed": false, + "flag": "gb.png", + "pp": "VQ9", + "lat": -6.351832584684203, + "lon": 71.5775034293553, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "33": { + "dxcc": "34", + "cc": "NZ", + "ccc": "NZL", + "name": "查塔姆岛", + "continent": "OC", + "ituzone": ["60"], + "cqzone": ["32"], + "timezone": "13", + "ccode": "554", + "aname": "Chatham Is.", + "mh": ["AE15", "AE16"], + "prefix": ["ZL7", "ZM7"], + "worked": false, + "confirmed": false, + "flag": "nz.png", + "pp": "ZL7", + "lat": -43.79079512075513, + "lon": -176.74897119341563, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "34": { + "dxcc": "35", + "cc": "CX", + "ccc": "CXR", + "name": "圣诞节岛", + "continent": "OC", + "ituzone": ["54"], + "cqzone": ["29"], + "timezone": "7", + "ccode": "162", + "aname": "Christmas I.", + "mh": ["OH29"], + "prefix": [ + "AX9X", + "VH9X", + "=VI9PEACE", + "VI9X", + "VJ9X", + "=VK3FY/9", + "=VK3HEX/9", + "=VK9AA", + "=VK9AN", + "=VK9ARH", + "=VK9ARH/P", + "=VK9EX", + "VK9FX", + "=VK9JD", + "VK9KX", + "=VK9VKL", + "VK9X", + "VL9X", + "VM9X", + "VN9X", + "VZ9X" + ], + "worked": false, + "confirmed": false, + "flag": "cx.png", + "pp": "VK9X", + "lat": -10.404166416718084, + "lon": 105.62414266117969, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "35": { + "dxcc": "36", + "cc": "FR", + "ccc": "FRA", + "name": "克利珀顿岛", + "continent": "NA", + "ituzone": ["10"], + "cqzone": ["7"], + "timezone": "-7", + "ccode": "250", + "aname": "Clipperton I.", + "mh": ["DK50"], + "prefix": ["=FO0/F8UFT", "=FO0AAA", "=TX5C", "=TX5K", "=TX5P"], + "worked": false, + "confirmed": false, + "flag": "fr.png", + "pp": "FO/c", + "lat": 10.260219948775855, + "lon": -109.27297668038408, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "36": { + "dxcc": "37", + "cc": "CR", + "ccc": "CRI", + "name": "科科斯岛", + "continent": "NA", + "ituzone": ["11"], + "cqzone": ["7"], + "timezone": "-6", + "ccode": "188", + "aname": "Cocos I.", + "mh": ["EJ65"], + "prefix": ["TE9", "TI9"], + "worked": false, + "confirmed": false, + "flag": "cr.png", + "pp": "TI9", + "lat": 5.551421661968277, + "lon": -87.04770614235635, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "37": { + "dxcc": "38", + "cc": "CC", + "ccc": "CCK", + "name": "科科斯(基林)群岛", + "continent": "OC", + "ituzone": ["54"], + "cqzone": ["29"], + "timezone": "7", + "ccode": "166", + "aname": "Cocos (Keeling) Is.", + "mh": ["NH87", "NH88"], + "prefix": [ + "AX9C", + "AX9Y", + "VH9C", + "VH9Y", + "VI9C", + "VI9Y", + "VJ9C", + "VJ9Y", + "=VK6XL/9", + "=VK8RR/9", + "=VK9/LB1GB", + "=VK9AW", + "VK9C", + "=VK9EC", + "VK9FC", + "=VK9FISH", + "VK9KC", + "VK9Y", + "VK9ZY", + "VL9C", + "VL9Y", + "VM9C", + "VM9Y", + "VN9C", + "VN9Y", + "VZ9C", + "VZ9Y" + ], + "worked": false, + "confirmed": false, + "flag": "cc.png", + "pp": "VK9C", + "lat": -12.155237188391553, + "lon": 96.84702535182643, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "38": { + "dxcc": "40", + "cc": "GR", + "ccc": "GRC", + "name": "克里特岛", + "continent": "EU", + "ituzone": ["28"], + "cqzone": ["20"], + "timezone": "2", + "ccode": "300", + "aname": "Crete", + "mh": ["KM14", "KM15", "KM24", "KM25", "KM34", "KM35"], + "prefix": [ + "=J42004/HB9IQB", + "=J42004/M0WTD", + "=J42004Q", + "=J42004ZFG", + "J49", + "=SV0IG/9", + "=SV0LB", + "=SV0LB/9", + "=SV0LK", + "=SV0LK/9", + "=SV0XAI", + "=SV0XAI/9", + "=SV0XAZ", + "=SV0XBJ", + "=SV0XBM/9", + "=SV0XBN", + "=SV0XBN/9", + "=SV0XBQ", + "=SV0XBQ/9", + "=SV0XBR", + "=SV0XBW", + "=SV0XBZ/9", + "=SV0XCC", + "=SV0XCC/9", + "=SV0XCC/P", + "=SV1BJW/9", + "=SV1EIJ/9", + "=SV2KBS/9", + "=SV5FRP/9", + "SV9", + "=SV9/LY1DF/LGT", + "SW9", + "SX9", + "SY9", + "SZ9" + ], + "worked": false, + "confirmed": false, + "flag": "gr.png", + "pp": "SV9", + "lat": 35.202910469193554, + "lon": 24.764517604023773, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "39": { + "dxcc": "41", + "cc": "FR", + "ccc": "FRA", + "name": "克罗泽特岛", + "continent": "AF", + "ituzone": ["68"], + "cqzone": ["39"], + "timezone": "3", + "ccode": "250", + "aname": "Crozet I.", + "mh": ["LE53", "LE54"], + "prefix": ["FT0W", "FT4W", "FT5W", "FT8W"], + "worked": false, + "confirmed": false, + "flag": "fr.png", + "pp": "FT/w", + "lat": -46.32742942812778, + "lon": 50.98613016308491, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "40": { + "dxcc": "43", + "cc": "PR", + "ccc": "PRI", + "name": "德索乔岛", + "continent": "NA", + "ituzone": ["11"], + "cqzone": ["8"], + "timezone": "-4", + "ccode": "630", + "aname": "Desecheo I.", + "mh": ["FK68"], + "prefix": ["KP5", "NP5", "WP5"], + "worked": false, + "confirmed": false, + "flag": "pr.png", + "pp": "KP5", + "lat": 18.45023499082599, + "lon": -67.46532540771224, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "42": { + "dxcc": "45", + "cc": "GR", + "ccc": "GRC", + "name": "多德卡尼斯群岛", + "continent": "EU", + "ituzone": ["28"], + "cqzone": ["20"], + "timezone": "2", + "ccode": "300", + "aname": "Dodecanese", + "mh": ["KM36"], + "prefix": [ + "=J42004/SP5MXZ", + "J45", + "=J45FRE/J", + "=SV0XAN", + "=SV0XAN/5", + "=SV0XAN/P", + "=SV0XBZ/5", + "=SV0XCA/5", + "=SV0XCA/P", + "=SV1BJY/P", + "=SV1ENJ/5", + "=SV1GSX/5", + "SV5", + "=SV5/DJ5AA/LH", + "=SV5/LY1DF/LGT", + "=SV5CJQ/LH", + "=SV9DJO/5", + "=SV9GPV/5", + "=SV9JI/5", + "=SV9OFS/5", + "SW5", + "=SX100SEP/5", + "SX5", + "=SX65AP", + "=SX65AP/5", + "SY5", + "SZ5" + ], + "worked": false, + "confirmed": false, + "flag": "gr.png", + "pp": "SV5", + "lat": 36.46814942998131, + "lon": 27.00807803688462, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "43": { + "dxcc": "46", + "cc": "MY", + "ccc": "MYS", + "name": "东马来西亚", + "continent": "OC", + "ituzone": ["54"], + "cqzone": ["28"], + "timezone": "8", + "ccode": "458", + "aname": "East Malaysia", + "mh": [ + "NJ96", + "OJ02", + "OJ03", + "OJ04", + "OJ05", + "OJ06", + "OJ11", + "OJ12", + "OJ13", + "OJ14", + "OJ15", + "OJ16", + "OJ21", + "OJ22", + "OJ41", + "OJ50", + "OJ51", + "OJ52", + "OJ61", + "OJ62", + "OJ63", + "OJ64", + "OJ71", + "OJ72", + "OJ73", + "OJ74", + "OJ75", + "OJ84", + "OJ85", + "OJ86", + "OJ87", + "OJ94", + "OJ95", + "OJ96" + ], + "prefix": [ + "=9M1CSQ", + "=9M1CSS", + "=9M2/G3TMA/6", + "=9M2/PG5M/6", + "=9M2/R6AF/6", + "=9M2GCN/6", + "=9M2MDX/6", + "=9M4ARD/6", + "=9M4CBP", + "=9M4CCB", + "=9M4CHQ", + "=9M4CJN", + "=9M4CKT", + "=9M4CKT/6", + "=9M4CMY", + "=9M4CPB", + "=9M4CRB", + "=9M4CRP", + "=9M4CRP/6", + "=9M4CSR", + "=9M4CSS", + "=9M4CWS", + "=9M4GCW", + "=9M4JSE", + "=9M4LHM", + "=9M4LHS", + "=9M4LTW", + "=9M4RSA", + "=9M4SAB", + "=9M4SEB", + "=9M4SHQ", + "=9M4SJE", + "=9M4SJO", + "=9M4SJQ", + "=9M4SJS", + "=9M4SJSA", + "=9M4SJSB", + "=9M4SJSD", + "=9M4SJSL", + "=9M4SJSM", + "=9M4SJSP", + "=9M4SJST", + "=9M4SJSW", + "=9M4SJX", + "=9M4SMO", + "=9M4SMS", + "=9M4SMY", + "=9M4STA", + "=9M4SWK", + "=9M50IARU/6", + "=9M50IARU/8", + "=9M50MQ", + "=9M50MS", + "=9M51GW", + "=9M51SB", + "=9M53QA", + "=9M57MS", + "=9M57MW", + "=9M58MS", + "=9M58MW", + "=9M59MS", + "=9M59MW", + "9M6", + "9M8", + "=9M9/7M2VPR", + "=9M9/CCL", + "=9W2RCR/6", + "=9W2VVH/6", + "9W6", + "9W8" + ], + "worked": false, + "confirmed": false, + "flag": "my.png", + "pp": "9M6", + "lat": 2.742436464403923, + "lon": 113.33333333333333, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "44": { + "dxcc": "47", + "cc": "CL", + "ccc": "CHL", + "name": "复活节岛", + "continent": "SA", + "ituzone": ["63"], + "cqzone": ["12"], + "timezone": "-7", + "ccode": "152", + "aname": "Easter I.", + "mh": ["DG52"], + "prefix": ["3G0", "CA0", "CB0", "CC0", "CD0", "CE0", "XQ0", "XR0"], + "worked": false, + "confirmed": false, + "flag": "cl.png", + "pp": "CE0Y", + "lat": -27.193674058809528, + "lon": -109.31870141746685, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "45": { + "dxcc": "48", + "cc": "KI", + "ccc": "KIR", + "name": "东吉里巴斯岛", + "continent": "OC", + "ituzone": ["61", "63"], + "cqzone": ["31"], + "timezone": "12", + "ccode": "296", + "aname": "E. Kiribati (Line Is.)", + "mh": [ + "RI77", + "RI78", + "RI79", + "RI87", + "RI88", + "RJ60", + "RJ61", + "RJ62", + "RJ63" + ], + "prefix": ["T32"], + "worked": false, + "confirmed": false, + "flag": "ki.png", + "pp": "T32", + "lat": 4.6861247670443475, + "lon": -160.45267489711932, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "46": { + "dxcc": "49", + "cc": "GQ", + "ccc": "GNQ", + "name": "赤道几内亚", + "continent": "AF", + "ituzone": ["47"], + "cqzone": ["36"], + "timezone": "-1", + "ccode": "226", + "aname": "Equatorial Guinea", + "mh": ["JJ40", "JJ41", "JJ42", "JJ43", "JJ51", "JJ52"], + "prefix": ["3C"], + "worked": false, + "confirmed": false, + "flag": "gq.png", + "pp": "3C", + "lat": 1.6824284964354064, + "lon": 10.187471422039321, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "47": { + "dxcc": "50", + "cc": "MX", + "ccc": "MEX", + "name": "墨西哥", + "continent": "NA", + "ituzone": ["10"], + "cqzone": ["6"], + "timezone": "-6", + "ccode": "484", + "aname": "Mexico", + "mh": [ + "DK78", + "DK79", + "DK87", + "DK88", + "DK89", + "DK96", + "DK97", + "DK98", + "DK99", + "DL26", + "DL27", + "DL28", + "DL29", + "DL34", + "DL35", + "DL36", + "DL37", + "DL38", + "DL39", + "DL42", + "DL43", + "DL44", + "DL45", + "DL46", + "DL47", + "DL48", + "DL49", + "DL52", + "DL53", + "DL54", + "DL55", + "DL56", + "DL57", + "DL58", + "DL59", + "DL61", + "DL62", + "DL63", + "DL64", + "DL65", + "DL66", + "DL67", + "DL68", + "DL69", + "DL70", + "DL71", + "DL72", + "DL73", + "DL74", + "DL75", + "DL76", + "DL77", + "DL78", + "DL79", + "DL80", + "DL81", + "DL82", + "DL83", + "DL84", + "DL85", + "DL86", + "DL87", + "DL88", + "DL89", + "DL90", + "DL91", + "DL92", + "DL93", + "DL94", + "DL95", + "DL96", + "DL97", + "DL98", + "DL99", + "DM10", + "DM11", + "DM12", + "DM20", + "DM21", + "DM22", + "DM30", + "DM31", + "DM32", + "DM40", + "DM41", + "DM50", + "DM51", + "DM60", + "DM61", + "DM70", + "DM71", + "EK06", + "EK07", + "EK08", + "EK09", + "EK15", + "EK16", + "EK17", + "EK18", + "EK19", + "EK25", + "EK26", + "EK27", + "EK28", + "EK29", + "EK34", + "EK35", + "EK36", + "EK37", + "EK38", + "EK45", + "EK46", + "EK47", + "EK48", + "EK49", + "EK57", + "EK58", + "EK59", + "EK68", + "EK69", + "EL00", + "EL01", + "EL02", + "EL03", + "EL04", + "EL05", + "EL06", + "EL07", + "EL08", + "EL10", + "EL11", + "EL12", + "EL13", + "EL14", + "EL15", + "EL16", + "EL40", + "EL41", + "EL50", + "EL51", + "EL60", + "EL61" + ], + "prefix": [ + "4A", + "4B", + "4C", + "6D", + "6E", + "6F", + "6G", + "6H", + "6I", + "6J", + "XA", + "XB", + "XC", + "XD", + "XE", + "=XE3MAYA/C", + "=XE3MAYA/D", + "=XE3MAYA/E", + "=XE3MAYA/T", + "=XE3MAYA/X", + "XF", + "XG", + "XH", + "XI" + ], + "worked": false, + "confirmed": false, + "flag": "mx.png", + "pp": "XE", + "lat": 23.90435627714976, + "lon": -102.12962962962966, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "48": { + "dxcc": "51", + "cc": "ER", + "ccc": "ERI", + "name": "厄立特里亚", + "continent": "AF", + "ituzone": ["48"], + "cqzone": ["37"], + "timezone": "3", + "ccode": "232", + "aname": "Eritrea", + "mh": [ + "KK84", + "KK85", + "KK86", + "KK87", + "KK94", + "KK95", + "KK96", + "KK97", + "KK98", + "LK02", + "LK03", + "LK04", + "LK05", + "LK06", + "LK12", + "LK13" + ], + "prefix": ["E3"], + "worked": false, + "confirmed": false, + "flag": "er.png", + "pp": "E3", + "lat": 15.869915528394685, + "lon": 38.21673525377229, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "49": { + "dxcc": "52", + "cc": "EE", + "ccc": "EST", + "name": "爱沙尼亚", + "continent": "EU", + "ituzone": ["29"], + "cqzone": ["15"], + "timezone": "2", + "ccode": "233", + "aname": "Estonia", + "mh": [ + "KO07", + "KO08", + "KO17", + "KO18", + "KO19", + "KO27", + "KO28", + "KO29", + "KO37", + "KO38", + "KO39", + "KO49" + ], + "prefix": ["ES", "=ES/RX3AMI/LH", "=ES/SA5FYR/LH", "=ES0TI/LH"], + "worked": false, + "confirmed": false, + "flag": "ee.png", + "pp": "ES", + "lat": 58.7937582663254, + "lon": 25.61728395061729, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "50": { + "dxcc": "53", + "cc": "ET", + "ccc": "ETH", + "name": "埃塞俄比亚", + "continent": "AF", + "ituzone": ["48"], + "cqzone": ["37"], + "timezone": "3", + "ccode": "231", + "aname": "Ethiopia", + "mh": [ + "KJ67", + "KJ68", + "KJ74", + "KJ75", + "KJ76", + "KJ77", + "KJ78", + "KJ79", + "KJ83", + "KJ84", + "KJ85", + "KJ86", + "KJ87", + "KJ88", + "KJ89", + "KJ93", + "KJ94", + "KJ95", + "KJ96", + "KJ97", + "KJ98", + "KJ99", + "KK70", + "KK71", + "KK72", + "KK80", + "KK81", + "KK82", + "KK83", + "KK84", + "KK90", + "KK91", + "KK92", + "KK93", + "KK94", + "LJ03", + "LJ04", + "LJ05", + "LJ06", + "LJ07", + "LJ08", + "LJ09", + "LJ14", + "LJ15", + "LJ16", + "LJ17", + "LJ18", + "LJ19", + "LJ24", + "LJ25", + "LJ26", + "LJ27", + "LJ28", + "LJ29", + "LJ35", + "LJ36", + "LJ37", + "LJ38", + "LK00", + "LK01", + "LK02", + "LK03", + "LK04", + "LK10", + "LK11", + "LK12" + ], + "prefix": ["9E", "9F", "ET", "=ET3AA/YOTA"], + "worked": false, + "confirmed": false, + "flag": "et.png", + "pp": "ET", + "lat": 8.853444862011997, + "lon": 38.19444444444444, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "51": { + "dxcc": "54", + "cc": "RU", + "ccc": "RUS", + "name": "俄罗斯欧洲", + "continent": "EU", + "ituzone": ["19", "20", "29", "30"], + "cqzone": ["16"], + "timezone": "3", + "ccode": "643", + "aname": "European Russia", + "mh": [ + "KN64", + "KN65", + "KN66", + "KN74", + "KN75", + "KN76", + "KN84", + "KN85", + "KN86", + "KN89", + "KN93", + "KN94", + "KN95", + "KN96", + "KN97", + "KN98", + "KN99", + "KO36", + "KO37", + "KO38", + "KO39", + "KO45", + "KO46", + "KO47", + "KO48", + "KO49", + "KO52", + "KO53", + "KO54", + "KO55", + "KO56", + "KO57", + "KO58", + "KO59", + "KO62", + "KO63", + "KO64", + "KO65", + "KO66", + "KO67", + "KO68", + "KO69", + "KO70", + "KO71", + "KO72", + "KO73", + "KO74", + "KO75", + "KO76", + "KO77", + "KO78", + "KO79", + "KO80", + "KO81", + "KO82", + "KO83", + "KO84", + "KO85", + "KO86", + "KO87", + "KO88", + "KO89", + "KO90", + "KO91", + "KO92", + "KO93", + "KO94", + "KO95", + "KO96", + "KO97", + "KO98", + "KO99", + "KP30", + "KP40", + "KP41", + "KP44", + "KP45", + "KP46", + "KP47", + "KP48", + "KP49", + "KP50", + "KP51", + "KP52", + "KP53", + "KP54", + "KP55", + "KP56", + "KP57", + "KP58", + "KP59", + "KP60", + "KP61", + "KP62", + "KP63", + "KP64", + "KP65", + "KP66", + "KP67", + "KP68", + "KP69", + "KP70", + "KP71", + "KP72", + "KP73", + "KP74", + "KP75", + "KP76", + "KP77", + "KP78", + "KP79", + "KP80", + "KP81", + "KP82", + "KP83", + "KP84", + "KP85", + "KP86", + "KP87", + "KP88", + "KP89", + "KP90", + "KP91", + "KP92", + "KP93", + "KP94", + "KP95", + "KP96", + "KP97", + "KP98", + "LN03", + "LN04", + "LN05", + "LN06", + "LN07", + "LN08", + "LN09", + "LN12", + "LN13", + "LN14", + "LN15", + "LN16", + "LN17", + "LN18", + "LN19", + "LN22", + "LN23", + "LN24", + "LN25", + "LN26", + "LN27", + "LN28", + "LN29", + "LN31", + "LN32", + "LN33", + "LN34", + "LN35", + "LN36", + "LN37", + "LN38", + "LN39", + "LN41", + "LN42", + "LN45", + "LN46", + "LN47", + "LN49", + "LO00", + "LO01", + "LO02", + "LO03", + "LO04", + "LO05", + "LO06", + "LO07", + "LO08", + "LO09", + "LO10", + "LO11", + "LO12", + "LO13", + "LO14", + "LO15", + "LO16", + "LO17", + "LO18", + "LO19", + "LO20", + "LO21", + "LO22", + "LO23", + "LO24", + "LO25", + "LO26", + "LO27", + "LO28", + "LO29", + "LO30", + "LO31", + "LO32", + "LO33", + "LO34", + "LO35", + "LO36", + "LO37", + "LO38", + "LO39", + "LO40", + "LO41", + "LO42", + "LO43", + "LO44", + "LO45", + "LO46", + "LO47", + "LO48", + "LO49", + "LO51", + "LO52", + "LO53", + "LO54", + "LO55", + "LO56", + "LO57", + "LO58", + "LO59", + "LO61", + "LO62", + "LO63", + "LO64", + "LO65", + "LO66", + "LO67", + "LO68", + "LO69", + "LO70", + "LO71", + "LO72", + "LO73", + "LO74", + "LO75", + "LO76", + "LO77", + "LO78", + "LO79", + "LO80", + "LO81", + "LO82", + "LO83", + "LO84", + "LO85", + "LO86", + "LO87", + "LO88", + "LO89", + "LO90", + "LO91", + "LO92", + "LO93", + "LO94", + "LO95", + "LO96", + "LO97", + "LO98", + "LO99", + "LP00", + "LP01", + "LP02", + "LP03", + "LP04", + "LP05", + "LP06", + "LP07", + "LP08", + "LP10", + "LP11", + "LP12", + "LP13", + "LP14", + "LP15", + "LP16", + "LP17", + "LP18", + "LP20", + "LP21", + "LP22", + "LP23", + "LP24", + "LP25", + "LP26", + "LP27", + "LP28", + "LP30", + "LP31", + "LP32", + "LP33", + "LP34", + "LP35", + "LP36", + "LP37", + "LP38", + "LP40", + "LP41", + "LP42", + "LP43", + "LP44", + "LP45", + "LP46", + "LP47", + "LP48", + "LP49", + "LP50", + "LP51", + "LP52", + "LP53", + "LP54", + "LP55", + "LP56", + "LP57", + "LP58", + "LP59", + "LP60", + "LP61", + "LP62", + "LP63", + "LP64", + "LP65", + "LP66", + "LP67", + "LP68", + "LP70", + "LP71", + "LP72", + "LP73", + "LP74", + "LP75", + "LP76", + "LP77", + "LP78", + "LP80", + "LP81", + "LP82", + "LP83", + "LP84", + "LP85", + "LP86", + "LP87", + "LP88", + "LP90", + "LP91", + "LP92", + "LP93", + "LP94", + "LP95", + "LP96", + "LP97", + "LP98", + "LP99", + "LQ51", + "LQ52", + "LQ59", + "LQ60", + "LQ61", + "LQ62", + "LQ63", + "LQ70", + "LQ71", + "LQ72", + "LQ73", + "LQ74", + "LQ75", + "LQ80", + "LQ81", + "LQ82", + "LQ83", + "LQ84", + "LQ85", + "LQ90", + "LQ93", + "LQ94", + "LQ95", + "LQ96", + "LQ99", + "LR20", + "LR30", + "LR40", + "LR50", + "LR51", + "LR60", + "LR70", + "LR71", + "LR80", + "LR81", + "LR90", + "LR91", + "MO00", + "MO01", + "MO02", + "MP04", + "MP05", + "MP06", + "MP07", + "MP08", + "MP09", + "MP16", + "MP17", + "MP18", + "MP19", + "MP26", + "MP27", + "MP28", + "MP29", + "MP37", + "MQ04", + "MQ05", + "MQ06", + "MQ15", + "MQ16", + "MQ25", + "MQ26", + "MQ35", + "MQ36", + "MQ37", + "MQ46", + "MQ89", + "MR00", + "MR01", + "MR10", + "MR11", + "MR20", + "MR21", + "MR90", + "NQ59", + "NQ69", + "NQ79", + "NQ88", + "NQ89", + "NQ97", + "NQ98", + "NQ99", + "NR00", + "NR50", + "NR51", + "NR60", + "NR61", + "NR70", + "NR71", + "NR80", + "NR81", + "NR90", + "OQ07", + "OQ08", + "OQ09", + "OQ18", + "OQ19", + "OQ28", + "OQ38" + ], + "prefix": [ + "R", + "=R0000O", + "=R01DTV", + "=R01DTV/1", + "=R01DTV/3", + "=R01DTV/4", + "=R01DTV/6", + "=R01DTV/7", + "=R0AGD/6", + "=R0AIB/3", + "=R0CAF/1", + "=R0CAF/3", + "=R0CM/4", + "=R0IA/3", + "=R0IT/6", + "=R0XAC/1", + "=R0XAD/6/P", + "=R100AP", + "=R100K", + "=R110A/P", + "=R120RK", + "=R120RP", + "=R155PM", + "=R160PM", + "=R16NOR", + "=R18ISL", + "=R18PER", + "R1I", + "R1N", + "R1O", + "R1P", + "R1Z", + "=R2011UFO", + "=R2011UFO/M", + "=R2011UFO/P", + "=R2014I", + "=R2014WOG", + "=R20ARRS", + "=R20PRM", + "=R20SAM", + "=R20SZO", + "=R25EMW", + "=R25ILIM", + "=R25RRA", + "=R280TLT", + "=R290PM", + "=R2AG/9", + "=R34CZF", + "=R35MWC", + "=R3ARS/4", + "=R3GO/FF", + "=R3RRC/9", + "=R3TT/FF", + "=R3ZK/FF", + "=R4CDX/FF", + "R4H", + "=R4HAT", + "=R4HC", + "=R4HCE", + "=R4HCZ", + "=R4HD", + "=R4HDC", + "=R4HDR", + "=R4HL", + "R4I", + "=R4IC", + "=R4ID", + "=R4II", + "=R4IK", + "=R4IM", + "=R4IN", + "=R4IO", + "=R4IT", + "R4W", + "=R5QA/1", + "=R5QQ/1", + "=R5VAJ/N", + "=R6DAB/9", + "=R6DGL/9/M", + "=R6LCA/J", + "=R70SRC", + "=R7AB/M", + "=R7AB/P", + "=R7BA/1", + "=R7BA/9", + "=R7BA/9/M", + "=R80ORL", + "=R80PSP", + "=R80PVB", + "=R80RTL", + "=R80TV", + "=R80UPOL", + "=R850G", + "=R850PN", + "=R85AAL", + "=R85KFF", + "=R85PAR", + "=R85QMR", + "=R85WDW", + "=R85WTA", + "=R863LC", + "=R863LK", + "=R863LX", + "=R870B", + "=R870C", + "=R870K", + "=R870M", + "=R870O", + "=R870T", + "=R875R", + "=R88EPC", + "=R8AEU/6", + "=R8B", + "=R8CT/4/P", + "=R8CZ/4", + "=R8CZ/4/M", + "=R8CZ/M", + "R8F", + "=R8FF/1", + "=R8FF/3", + "=R8FF/3/M", + "=R8FF/3/P", + "=R8FF/4", + "=R8FF/6", + "=R8FF/M", + "=R8FF/P", + "=R8FR/4/M", + "R8G", + "=R8MB/1", + "=R8MB/1/P", + "=R8TA/4/P", + "=R8TR/3", + "=R8UT/4/P", + "=R8WC/6", + "=R8WC/6/P", + "R8X", + "=R8XF/1", + "=R8XF/4", + "=R8XW/1", + "=R8XW/6", + "=R9/UR7IMG", + "=R900BL", + "=R900DM", + "=R90DNF", + "=R90DOSAAF", + "=R90IARU", + "=R90K", + "=R90LPU", + "=R90NOR", + "=R920RZ", + "=R95DOD", + "=R95FR", + "=R95KOMI", + "=R95NRL", + "=R95PW", + "=R98KPM", + "=R99FSB", + "=R99KPM", + "=R9AV/6", + "=R9CMA/4", + "=R9CZ/3", + "=R9CZ/4", + "=R9CZ/4/M", + "=R9CZ/M", + "=R9DA/4", + "=R9DA/6", + "R9F", + "=R9FAZ/6/M", + "=R9FCH/6", + "=R9FM/1", + "=R9FM/3", + "R9G", + "=R9GM/4", + "=R9GM/P", + "=R9J/1", + "=R9JBN/4", + "=R9JI/1", + "=R9JNO/1", + "=R9JO/6", + "=R9KC/4/M", + "=R9KC/6/M", + "=R9KC/8/M", + "=R9KD/6", + "=R9KD/9", + "=R9KW/3", + "=R9KW/4", + "=R9LI/1", + "=R9MAV/6", + "=R9MCM/1", + "=R9MJ/6", + "=R9MJ/6/M", + "=R9OM/5/P", + "=R9OM/6", + "=R9PA/4", + "=R9SAO/1", + "=R9UT/4", + "=R9WGM/6/M", + "=R9WI/4/P", + "=R9WR/1", + "R9X", + "=R9XAK/1/P", + "=R9XAU/6", + "=R9XC/1", + "=R9XC/4", + "=R9XT/1", + "=R9XT/6", + "=R9XV/6", + "=R9XZ/3", + "=R9YU/3", + "=RA/DK5JI", + "=RA/UR5MKH", + "=RA07DR", + "=RA0AM/6", + "=RA0APW/6", + "=RA0BM/1", + "=RA0BM/1/P", + "=RA0BM/6", + "=RA0BY/3", + "=RA0CCV/3", + "=RA0FU/1", + "=RA0FW/6", + "=RA0LIF/6", + "=RA0LLW/6", + "=RA0NN/1", + "=RA0QA/3", + "=RA0QQ/3", + "=RA0QR/6", + "=RA0ZD/1", + "=RA0ZG/6", + "=RA0ZZ/3", + "RA1I", + "RA1N", + "RA1O", + "RA1P", + "=RA1QQ/LH", + "RA1Z", + "=RA22KO", + "=RA22XA", + "=RA22XF", + "=RA22XU", + "=RA27FM", + "=RA2AT", + "=RA2FDX/3", + "=RA2FN/1", + "=RA2FW/1", + "=RA3AMG/9/M", + "=RA3CQ/9/M", + "=RA3OM/9", + "=RA3X/1", + "=RA3YV/ANT", + "=RA3ZZ/ANT", + "RA4H", + "=RA4HL", + "RA4I", + "=RA4NCC", + "=RA4NH/9", + "=RA4NV/9", + "RA4W", + "=RA6ACI/9", + "=RA6EE/FF", + "=RA80KEDR", + "=RA80SP", + "RA8F", + "RA8G", + "RA8X", + "=RA9AK/3", + "=RA9AP/3", + "=RA9CFH/1", + "=RA9CFH/1/P", + "=RA9CHS/6", + "=RA9CHS/7", + "=RA9CKM/4/M", + "=RA9CKQ/4", + "=RA9CO/3", + "=RA9DF/4/P", + "=RA9DF/6/M", + "=RA9DF/6/P", + "RA9F", + "=RA9FAA/4/M", + "=RA9FBV/1", + "=RA9FDR/4/P", + "=RA9FNV/1", + "=RA9FR/4/M", + "=RA9FR/4/P", + "RA9G", + "=RA9JG/1", + "=RA9JR/3", + "=RA9JX/3", + "=RA9KD/3", + "=RA9KD/6", + "=RA9KO/4", + "=RA9KT/3", + "=RA9KU/1", + "=RA9KU/1/M", + "=RA9KV/3", + "=RA9KV/4/M", + "=RA9KW/3", + "=RA9KW/3/M", + "=RA9LI/1", + "=RA9MC/1", + "=RA9ODR/4/M", + "=RA9ODR/6", + "=RA9ODR/6/M", + "=RA9P/4", + "=RA9RT/3", + "=RA9SAS/6", + "=RA9SB/3", + "=RA9SC/1", + "=RA9SC/4", + "=RA9SC/4/P", + "=RA9SGI/1", + "=RA9ST/3/P", + "=RA9USU/3", + "=RA9UUY/6", + "=RA9UWD/6", + "=RA9WU/4", + "=RA9WU/4/M", + "=RA9WU/4/P", + "=RA9WU/6", + "=RA9WW/6", + "RA9X", + "=RA9XA/1", + "=RA9XA/1/P", + "=RA9XAF/4", + "=RA9XAI/4", + "=RA9XF/3", + "=RA9XSM/4", + "=RA9XY/1", + "=RA9XY/3", + "=RA9YA/6", + "=RC18SA", + "RC1I", + "RC1N", + "RC1O", + "RC1P", + "RC1Z", + "=RC20FM", + "=RC20HZ", + "=RC4AF/FF", + "RC4H", + "=RC4HT", + "RC4I", + "RC4W", + "=RC80KEDR", + "=RC80SP", + "=RC85MP", + "RC8F", + "RC8G", + "RC8X", + "RC9F", + "RC9G", + "RC9X", + "=RC9XM/1", + "=RC9YA/3/P", + "=RC9YA/4/M", + "=RD0L/3", + "RD1I", + "RD1N", + "RD1O", + "RD1P", + "RD1Z", + "=RD4CBQ/9", + "RD4H", + "RD4I", + "=RD4M/9", + "RD4W", + "RD8F", + "RD8G", + "RD8X", + "=RD9CX/4", + "=RD9CX/4/P", + "=RD9CX/6", + "=RD9CX/6/P", + "RD9F", + "RD9G", + "RD9X", + "RE1I", + "RE1N", + "RE1O", + "RE1P", + "RE1Z", + "RE4H", + "RE4I", + "RE4W", + "RE8F", + "RE8G", + "RE8X", + "RE9F", + "RE9G", + "RE9X", + "RF1I", + "RF1N", + "RF1O", + "RF1P", + "RF1Z", + "RF4H", + "RF4I", + "RF4W", + "RF8F", + "RF8G", + "RF8X", + "RF9F", + "RF9G", + "RF9X", + "=RG0F/5", + "RG1I", + "RG1N", + "RG1O", + "RG1P", + "RG1Z", + "RG4H", + "RG4I", + "RG4W", + "=RG50P", + "=RG50P/9", + "=RG50P/M", + "=RG80KEDR", + "RG8F", + "RG8G", + "RG8X", + "=RG9A/3/P", + "RG9F", + "RG9G", + "RG9X", + "RI8X", + "RI9X", + "RJ1I", + "RJ1N", + "RJ1O", + "RJ1P", + "RJ1Z", + "RJ4H", + "RJ4I", + "=RJ4P", + "RJ4W", + "=RJ80SP", + "RJ8F", + "RJ8G", + "RJ8X", + "RJ9F", + "RJ9G", + "RJ9X", + "=RK0BWW/3", + "=RK0SE/1", + "=RK0UT/3", + "RK1I", + "RK1N", + "RK1O", + "=RK1OWZ/9", + "=RK1OWZ/9/M", + "RK1P", + "=RK1PWA/ANT", + "RK1Z", + "=RK21Z", + "=RK30DR", + "=RK3DSW/ANT", + "=RK3DWA/3/N", + "=RK3DZJ/1/LH", + "=RK3MXT/FF", + "RK4H", + "=RK4HM", + "RK4I", + "=RK4P", + "=RK4PK", + "RK4W", + "=RK6AH/LH", + "=RK6K/9", + "=RK75OP", + "=RK7G/FF", + "=RK80X", + "RK8F", + "RK8G", + "=RK8O/4", + "RK8X", + "=RK90DR", + "RK9F", + "RK9G", + "=RK9JA/6", + "RK9X", + "=RK9XWV/1", + "RL1I", + "RL1N", + "RL1O", + "RL1P", + "RL1Z", + "=RL3AB/FF", + "RL4H", + "RL4I", + "RL4W", + "=RL80KEDR", + "RL8F", + "RL8G", + "RL8X", + "=RL96WS", + "=RL97WS", + "=RL9AA/6", + "RL9F", + "RL9G", + "RL9X", + "=RM0L/1", + "=RM0L/3", + "RM1I", + "RM1N", + "RM1O", + "RM1P", + "RM1Z", + "RM4H", + "RM4I", + "=RM4P", + "=RM4R", + "RM4W", + "=RM80DZ", + "=RM80SP", + "=RM8A/4/M", + "=RM8A/6/M", + "RM8F", + "RM8G", + "=RM8W/4/M", + "RM8X", + "=RM8X/3", + "=RM94AE", + "RM9F", + "RM9G", + "=RM9T/4/P", + "=RM9WN/1", + "RM9X", + "=RM9X/1", + "=RN0CF/3", + "=RN0CF/6", + "=RN0CT/4", + "=RN0JT/6", + "RN1I", + "RN1N", + "=RN1NA/ANT", + "RN1O", + "RN1P", + "RN1Z", + "=RN22OG", + "=RN22OV", + "=RN2FA/1", + "=RN3GL/FF", + "=RN3GW/FF", + "=RN4ACA/FF", + "=RN4ACZ/9", + "RN4H", + "=RN4HFJ", + "=RN4HIF", + "RN4I", + "RN4W", + "=RN7G/FF", + "=RN80KEDR", + "=RN85AM", + "=RN85KN", + "RN8F", + "RN8G", + "RN8X", + "RN9F", + "RN9G", + "=RN9M/4", + "=RN9MD/3", + "=RN9N/1", + "=RN9N/4", + "=RN9N/6", + "=RN9N/6/M", + "=RN9N/M", + "=RN9OI/3", + "=RN9WWW/4", + "=RN9WWW/4/M", + "RN9X", + "RO1I", + "RO1N", + "RO1O", + "RO1P", + "RO1Z", + "=RO25KL", + "=RO25KO", + "RO4H", + "RO4I", + "RO4W", + "=RO75RK", + "=RO80KEDR", + "=RO80RO", + "RO8F", + "RO8G", + "RO8X", + "RO9F", + "RO9G", + "RO9X", + "=RP61XX", + "=RP62X", + "=RP63X", + "=RP63XO", + "=RP64X", + "=RP65FPP", + "=RP67KR", + "=RP68KR", + "=RP70KW", + "=RP70PK", + "=RP71KW", + "=RP72A", + "=RP72AG", + "=RP72I", + "=RP72IZ", + "=RP72MF", + "=RP72MU", + "=RP72PT", + "=RP72RK", + "=RP72WO", + "=RP72X", + "=RP73A", + "=RP73AU", + "=RP73DD", + "=RP73I", + "=RP73IZ", + "=RP73MU", + "=RP73PM", + "=RP73PT", + "=RP73RK", + "=RP73X", + "=RP73ZP", + "=RP74A", + "=RP74AU", + "=RP74DD", + "=RP74I", + "=RP74IZ", + "=RP74PT", + "=RP74RK", + "=RP74X", + "=RP74ZP", + "=RP8X", + "=RP9FKU", + "=RP9FTK", + "=RP9X/1", + "=RP9XWM/1", + "=RQ0C/4", + "=RQ0C/6", + "RQ1I", + "RQ1N", + "RQ1O", + "RQ1P", + "RQ1Z", + "RQ4H", + "RQ4I", + "RQ4W", + "=RQ80SP", + "RQ8F", + "RQ8G", + "RQ8X", + "RQ9F", + "RQ9G", + "RQ9X", + "=RT05RO", + "RT1I", + "RT1N", + "RT1O", + "RT1P", + "RT1Z", + "=RT2F/3/M", + "RT4H", + "RT4I", + "RT4W", + "=RT5G/P/FF", + "=RT73LF", + "=RT80KEDR", + "RT8F", + "RT8G", + "RT8X", + "=RT90PK", + "RT9F", + "RT9G", + "=RT9K/3", + "=RT9K/4", + "=RT9K/6", + "=RT9K/6/P", + "=RT9K/6/QRP", + "=RT9K/7", + "=RT9K/7/P", + "=RT9S/3", + "=RT9S/3/P", + "=RT9S/4", + "=RT9S/P", + "=RT9T/1", + "=RT9T/3", + "=RT9T/4", + "=RT9T/6", + "=RT9T/6/M", + "RT9X", + "=RU0BW/3", + "=RU0LM/3", + "=RU0LM/4", + "=RU0ZW/3", + "=RU0ZW/6", + "RU1I", + "RU1N", + "RU1O", + "RU1P", + "RU1Z", + "=RU1ZC/ANT", + "=RU27FQ", + "=RU27FW", + "=RU2FA/3", + "=RU2FB/1", + "=RU2FB/3", + "=RU2FB/3/P", + "=RU2FB/5", + "=RU2FB/6", + "=RU2FB/6/P", + "=RU3HD/ANT", + "=RU3ZK/FF", + "RU4H", + "=RU4HD", + "=RU4HP", + "RU4I", + "=RU4SS/9", + "RU4W", + "=RU4W/9", + "=RU4WA/9", + "=RU80KEDR", + "=RU80KEDR/P", + "=RU80TO", + "RU8F", + "RU8G", + "RU8X", + "=RU9CK/6/M", + "=RU9CK/6/P", + "=RU9CK/7", + "=RU9CK/7/M", + "=RU9CK/7/P", + "RU9F", + "RU9G", + "=RU9LA/4", + "=RU9MU/1", + "=RU9MU/3", + "=RU9MX/1", + "=RU9MX/6", + "=RU9QRP/3", + "=RU9QRP/6/M", + "=RU9QRP/6/P", + "=RU9SO/4/M", + "=RU9SO/6", + "=RU9WW/5/M", + "RU9X", + "=RU9YT/1", + "=RU9YT/1/P", + "=RU9ZA/7", + "=RV0ANH/6", + "=RV0AO/3", + "=RV0APR/6", + "=RV0CA/1", + "=RV1CC/1", + "=RV1CC/M", + "RV1I", + "RV1N", + "RV1O", + "RV1P", + "RV1Z", + "=RV22PM", + "=RV2FW/1", + "=RV2FW/1/M", + "=RV3UI/9", + "=RV4CC/FF", + "RV4H", + "RV4I", + "RV4W", + "=RV80KEDR", + "RV8F", + "RV8G", + "RV8X", + "=RV9AB/6", + "=RV9AZ/3", + "=RV9CMT/6", + "=RV9CX/6/M", + "=RV9CX/6/P", + "=RV9CX/7/P", + "=RV9DC/6/P", + "RV9F", + "=RV9FQ/3", + "=RV9FQ/3/M", + "=RV9FQ/4/M", + "=RV9FQ/6", + "RV9G", + "=RV9JD/1", + "=RV9JD/1/M", + "=RV9JD/4/M", + "=RV9LC/3", + "=RV9LC/6", + "=RV9LM/3", + "=RV9LM/3/P", + "=RV9MD/4", + "=RV9WB/4", + "=RV9WKI/4/M", + "=RV9WKI/4/P", + "=RV9WLE/3/P", + "=RV9WMZ/4/M", + "=RV9WZ/3", + "=RV9WZ/4", + "RV9X", + "=RV9XX/3", + "=RW0AF/6", + "=RW0BG/3", + "=RW0IM/1", + "=RW0IM/3", + "=RW0IW/3", + "=RW0LF/3", + "=RW0LIF/6", + "=RW0LIF/6/LH", + "=RW0LX/3", + "=RW0QE/6", + "=RW0UM/3", + "=RW0UZ/4", + "=RW1AI/ANT", + "RW1I", + "RW1N", + "RW1O", + "RW1P", + "=RW1QN/9", + "=RW1QN/9/M", + "=RW1QN/9/P", + "RW1Z", + "=RW1ZQ/LH", + "=RW2F/6", + "=RW3DU/N", + "=RW3TN/9", + "RW4H", + "=RW4HM", + "=RW4HTK", + "=RW4HW", + "=RW4HZ", + "RW4I", + "=RW4NJ/9/M", + "RW4W", + "=RW6AWW/LH", + "RW8F", + "RW8G", + "=RW8W/1", + "RW8X", + "=RW9AW/4/M", + "=RW9AW/5", + "RW9F", + "=RW9FF/3", + "=RW9FWB/4", + "=RW9FWR/4", + "=RW9FWR/4/M", + "RW9G", + "=RW9JV/3", + "=RW9JZ/6", + "=RW9KW/3", + "=RW9QA/1", + "=RW9SW/4", + "=RW9TP/4", + "=RW9TP/4/P", + "=RW9UEW/3", + "=RW9W/3", + "=RW9W/4", + "=RW9WA/3", + "=RW9WA/4", + "=RW9WA/4/M", + "=RW9WA/6", + "=RW9WJ/4", + "=RW9WJ/4/P", + "=RW9WJ/P", + "RW9X", + "=RW9XC/1", + "=RW9XC/3/M", + "=RW9XC/4/M", + "=RW9XC/6/M", + "RX1I", + "RX1N", + "RX1O", + "RX1P", + "RX1Z", + "=RX2FS/3", + "=RX3AMI/1/LH", + "=RX3XX/N", + "RX4H", + "RX4I", + "RX4W", + "=RX6AA/ANT", + "=RX6AAP/ANT", + "RX8F", + "RX8G", + "RX8X", + "RX9F", + "=RX9FW/4", + "RX9G", + "=RX9SN/3", + "=RX9SN/P", + "=RX9TC/1", + "=RX9TL/3", + "=RX9TN/1", + "=RX9TX/6", + "=RX9TX/9", + "=RX9UL/1", + "=RX9UL/3", + "=RX9WN/3", + "=RX9WN/4", + "RX9X", + "=RY110RAEM", + "RY1I", + "RY1N", + "RY1O", + "RY1P", + "RY1Z", + "RY4H", + "RY4I", + "RY4W", + "=RY83HN", + "RY8F", + "RY8G", + "RY8X", + "RY9F", + "RY9G", + "RY9X", + "=RZ0IWW/1", + "=RZ0SB/4", + "=RZ16FM", + "RZ1I", + "RZ1N", + "RZ1O", + "RZ1P", + "RZ1Z", + "RZ4H", + "=RZ4HWF/LH", + "=RZ4HZW/FF", + "RZ4I", + "RZ4W", + "=RZ5D/4", + "=RZ7G/6/FF", + "=RZ7G/FF", + "RZ8F", + "RZ8G", + "RZ8X", + "=RZ90W/3", + "=RZ9AWN/6", + "RZ9F", + "RZ9G", + "=RZ9HG/6", + "=RZ9HK/3/P", + "=RZ9HT/6", + "=RZ9ON/6", + "=RZ9SZ/3", + "=RZ9SZ/3/M", + "=RZ9UA/3", + "=RZ9UF/6", + "=RZ9UZV/6", + "=RZ9W/3", + "=RZ9WM/4", + "=RZ9WM/9", + "=RZ9WU/4/M", + "RZ9X", + "U", + "U1I", + "U1N", + "U1O", + "U1P", + "U1Z", + "U4H", + "U4I", + "U4W", + "U8F", + "U8G", + "U8X", + "U9F", + "U9G", + "U9X", + "=UA0AD/3", + "=UA0ADX/3", + "=UA0AGE/6", + "=UA0AK/3", + "=UA0BDS/1", + "=UA0DM/4", + "=UA0FHC/3", + "=UA0FM/3", + "=UA0FQ/6", + "=UA0IT/6", + "=UA0JAD/3", + "=UA0JL/6", + "=UA0KAO/4", + "=UA0KAT/4", + "=UA0KBA/3", + "=UA0KBA/3/P", + "=UA0KBG/3", + "=UA0KBG/6", + "=UA0KCL/3", + "=UA0KCX/3", + "=UA0KCX/3/P", + "=UA0KT/4", + "=UA0LEC/6", + "=UA0LLM/5", + "=UA0LQQ/6/P", + "=UA0QBC/3", + "=UA0QBR/6", + "=UA0QGM/3", + "=UA0QJA/4", + "=UA0QJE/3", + "=UA0QNE/3", + "=UA0QNU/3", + "=UA0QQJ/3", + "=UA0QQO/3", + "=UA0S/4", + "=UA0SC/4", + "=UA0SEP/6", + "=UA0SIK/1", + "=UA0UV/6", + "=UA0XAK/3", + "=UA0XAK/6", + "=UA0ZAZ/3", + "=UA0ZDA/6", + "=UA0ZED/6", + "=UA0ZL/6", + "=UA0ZS/6", + "=UA1ADQ/ANT", + "=UA1BJ/ANT", + "=UA1CDA/LH", + "=UA1CIO/LH", + "UA1I", + "=UA1JJ/ANT", + "UA1N", + "UA1O", + "=UA1OOX/9", + "UA1P", + "=UA1PAC/1/ANT", + "=UA1PAC/ANT", + "=UA1QV/9", + "=UA1QV/ANT", + "UA1Z", + "=UA1ZQO/9", + "=UA2FFX/1", + "=UA2FM/4", + "=UA2FT/6", + "=UA3AKO/4", + "=UA3AV/ANT", + "=UA3FQ/4", + "=UA3FQ/4/P", + "=UA3FQ/P", + "=UA3GM/ANT", + "=UA3LMR/P", + "=UA3YH/ANT", + "=UA4ASE/FF", + "=UA4ATL/FF", + "UA4H", + "=UA4HBM", + "=UA4HGL", + "=UA4HIP", + "=UA4HIP/4", + "=UA4HIP/M", + "=UA4HRZ", + "=UA4HY", + "UA4I", + "=UA4NE/M", + "=UA4NF", + "=UA4NF/4/M", + "=UA4NF/M", + "=UA4PCM/M", + "=UA4PN", + "=UA4RF", + "=UA4RW", + "UA4W", + "=UA4WA/9", + "=UA4WP/9/M", + "=UA6ADC/N", + "=UA6HBO/N", + "=UA6HBO/ST30", + "=UA6IC/6/FF", + "=UA6IC/FF", + "=UA6LP/P/LH", + "=UA6LTO/9", + "=UA6LV/ANT", + "=UA6MM/LH", + "=UA8AA/3", + "=UA8AA/5", + "UA8F", + "UA8G", + "=UA8WAA/4", + "=UA8WAA/5", + "=UA8WAA/6", + "UA8X", + "=UA9AGR/4/M", + "=UA9AJ/3/M", + "=UA9AJ/4/M", + "=UA9APA/3/P", + "=UA9APA/4/P", + "=UA9B/1", + "=UA9CCO/6", + "=UA9CDC/3", + "=UA9CDC/6", + "=UA9CE/6", + "=UA9CES/6", + "=UA9CGL/3", + "=UA9CGL/4/M", + "=UA9COO/6", + "=UA9CTT/3", + "=UA9CTT/4", + "=UA9CTT/6", + "=UA9CUA/4/M", + "=UA9DD/3", + "UA9F", + "=UA9FFS/1/MM", + "=UA9FGR/4", + "=UA9FGR/6", + "=UA9FIT/4", + "=UA9FOJ/1", + "UA9G", + "=UA9HSI/3", + "=UA9JFE/4", + "=UA9JFM/3", + "=UA9JFN/4/M", + "=UA9JFN/6/M", + "=UA9JGX/4", + "=UA9JLY/3", + "=UA9JNQ/4", + "=UA9JON/6", + "=UA9JPX/4", + "=UA9JPX/6", + "=UA9KAS/6", + "=UA9KAS/6/P", + "=UA9KB/6", + "=UA9KG/1", + "=UA9KGH/1", + "=UA9KHD/3", + "=UA9KJ/6", + "=UA9KK/1", + "=UA9KW/6", + "=UA9KZ/3", + "=UA9LAO/4", + "=UA9MDU/3", + "=UA9MQR/1", + "=UA9MQR/6", + "=UA9MRX/3", + "=UA9MRY/1", + "=UA9OC/4", + "=UA9ONJ/3", + "=UA9PM/4", + "=UA9QCP/3", + "=UA9SG/4", + "=UA9SIV/3", + "=UA9SQG/4/P", + "=UA9SSR/3", + "=UA9SY/4", + "=UA9UAX/1", + "=UA9UAX/1/M", + "=UA9UAX/3", + "=UA9UAX/4", + "=UA9UAX/4/M", + "=UA9UAX/5", + "=UA9UAX/6", + "=UA9UAX/7", + "=UA9UAX/7/M", + "=UA9UDX/1", + "=UA9VR/6", + "=UA9WQK/6", + "UA9X", + "=UA9XC/1", + "=UA9XC/6", + "=UA9XCI/6", + "=UA9XF/1", + "=UA9XGD/3", + "=UA9XI/4", + "=UA9XK/1", + "=UA9XLE/3", + "=UA9XMC/1", + "=UA9XMC/3", + "=UA9XRK/1", + "=UA9XRP/1", + "=UA9XX/4", + "=UA9XZ/3", + "=UB0AJJ/3", + "UB1I", + "UB1N", + "UB1O", + "=UB1OAD/1/P", + "=UB1OAD/9/P", + "UB1P", + "UB1Z", + "=UB1ZBD/N", + "UB4H", + "UB4I", + "UB4W", + "=UB5O/1", + "=UB5O/1/M", + "=UB5O/M", + "=UB8ADI/5", + "=UB8ADI/6", + "UB8F", + "UB8G", + "=UB8JAF/3", + "UB8X", + "UB9F", + "UB9G", + "UB9X", + "=UB9YUW/1", + "=UC0LAF/3", + "UC1I", + "UC1N", + "UC1O", + "UC1P", + "UC1Z", + "UC4H", + "UC4I", + "UC4W", + "UC8F", + "UC8G", + "UC8X", + "UC9F", + "UC9G", + "UC9X", + "UD1I", + "UD1N", + "UD1O", + "UD1P", + "UD1Z", + "UD4H", + "UD4I", + "UD4W", + "UD8F", + "UD8G", + "UD8X", + "UD9F", + "UD9G", + "UD9X", + "=UE00S", + "=UE00S/P", + "=UE04YCS", + "=UE09VG", + "=UE0ZOO/3", + "=UE10SK", + "=UE16SA", + "=UE16ST", + "UE1I", + "UE1N", + "UE1O", + "UE1P", + "=UE1RDA/9", + "UE1Z", + "=UE200TARS", + "=UE21A", + "=UE21B", + "=UE21M", + "=UE22A", + "=UE23DKA", + "=UE23DSA", + "=UE23DZO", + "=UE24SU", + "=UE25AC", + "=UE25AFG", + "=UE25AQ", + "=UE25FO", + "=UE25IK", + "=UE25R", + "=UE25TF", + "=UE25WDW", + "=UE27AFG", + "=UE28AFG", + "=UE28DX", + "=UE2AT/1", + "=UE2KR", + "=UE2SE", + "UE4H", + "UE4I", + "UE4W", + "=UE55PM", + "=UE6MAC/9", + "=UE80AR", + "=UE80AR/M", + "=UE80AR/P", + "=UE80G", + "=UE80GS", + "=UE80HS", + "=UE80O", + "=UE80OL", + "=UE80RWW", + "=UE80S", + "=UE80V", + "=UE80YG", + "=UE85AGN", + "=UE85DRK", + "=UE85NKN", + "=UE85WDW", + "UE8F", + "UE8G", + "UE8X", + "=UE90AGN", + "=UE90FL", + "=UE90K", + "=UE90PR", + "=UE91L", + "=UE92L", + "=UE95AE", + "=UE95E", + "=UE95GA", + "=UE95K", + "=UE95ME", + "=UE95MS", + "=UE95RA", + "=UE95WS", + "=UE96ME", + "=UE96MP", + "=UE96SN", + "=UE96WS", + "=UE98PW", + "=UE98WS", + "=UE99PS", + "=UE99PW", + "UE9F", + "=UE9FDA/3", + "=UE9FDA/3/M", + "=UE9FDA/4", + "=UE9FDA/4/M", + "UE9G", + "=UE9GDA/4", + "=UE9WDA/3", + "=UE9WDA/4", + "=UE9WDA/4/M", + "=UE9WDA/6", + "=UE9WFF/1", + "=UE9WFF/4", + "=UE9WFF/6", + "UE9X", + "=UE9XBW/1", + "=UF0W/6", + "UF1I", + "UF1N", + "UF1O", + "UF1P", + "UF1Z", + "=UF2F/1/M", + "=UF2F/3/M", + "UF4H", + "UF4I", + "UF4W", + "UF8F", + "UF8G", + "UF8X", + "UF9F", + "UF9G", + "UF9X", + "UG1I", + "UG1N", + "UG1O", + "UG1P", + "UG1Z", + "UG4H", + "UG4I", + "UG4W", + "UG8F", + "UG8G", + "UG8X", + "UG9F", + "UG9G", + "UG9X", + "UH1I", + "UH1N", + "UH1O", + "UH1P", + "UH1Z", + "UH4H", + "UH4I", + "UH4W", + "UH8F", + "UH8G", + "UH8X", + "UH9F", + "UH9G", + "UH9X", + "UI1I", + "UI1N", + "UI1O", + "UI1P", + "UI1Z", + "UI4H", + "UI4I", + "UI4W", + "UI8F", + "UI8G", + "=UI8W/3/P", + "UI8X", + "UI9F", + "UI9G", + "UI9X" + ], + "worked": false, + "confirmed": false, + "flag": "ru.png", + "pp": "UA", + "lat": 55.58515926711283, + "lon": 39.19753086419753, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "53": { + "dxcc": "56", + "cc": "BR", + "ccc": "BRA", + "name": "费尔南多群岛", + "continent": "SA", + "ituzone": ["13"], + "cqzone": ["11"], + "timezone": "-2", + "ccode": "76", + "aname": "Fernando de Noronha", + "mh": ["HI36"], + "prefix": [ + "PP0F", + "PP0R", + "PP0ZF", + "PP0ZR", + "PQ0F", + "PQ0R", + "PQ0ZF", + "PQ0ZR", + "PR0F", + "PR0R", + "PR0ZF", + "PR0ZR", + "PS0F", + "PS0R", + "PS0ZF", + "PS0ZR", + "PT0F", + "PT0R", + "PT0ZF", + "PT0ZR", + "PU0F", + "PU0R", + "PU0ZF", + "PU0ZR", + "PV0F", + "PV0R", + "PV0ZF", + "PV0ZR", + "PW0F", + "PW0R", + "PW0ZF", + "PW0ZR", + "PX0F", + "PX0R", + "PX0ZF", + "PX0ZR", + "PY0F", + "=PY0NY", + "PY0R", + "PY0Z", + "ZV0F", + "ZV0R", + "ZV0ZF", + "ZV0ZR", + "ZW0F", + "ZW0R", + "ZW0ZF", + "ZW0ZR", + "ZX0F", + "ZX0R", + "ZX0ZF", + "ZX0ZR", + "ZY0F", + "=ZY0K", + "ZY0R", + "ZY0Z", + "ZZ0F", + "ZZ0R", + "ZZ0ZF", + "ZZ0ZR" + ], + "worked": false, + "confirmed": false, + "flag": "br.png", + "pp": "PY0F", + "lat": -3.8380044398004287, + "lon": -32.427983539094654, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "57": { + "dxcc": "60", + "cc": "BS", + "ccc": "BHS", + "name": "巴哈马", + "continent": "NA", + "ituzone": ["11"], + "cqzone": ["8"], + "timezone": "-5", + "ccode": "44", + "aname": "Bahamas", + "mh": [ + "FL04", + "FL05", + "FL06", + "FL07", + "FL13", + "FL14", + "FL15", + "FL16", + "FL17", + "FL22", + "FL23", + "FL24", + "FL30", + "FL31", + "FL32", + "FL33" + ], + "prefix": ["C6", "=WK2G/C6A/LH"], + "worked": false, + "confirmed": false, + "flag": "bs.png", + "pp": "C6", + "lat": 24.336285993040647, + "lon": -76.66666666666667, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "58": { + "dxcc": "61", + "cc": "RU", + "ccc": "RUS", + "name": "法兰士约瑟夫地群岛", + "continent": "EU", + "ituzone": ["75"], + "cqzone": ["40"], + "timezone": "3", + "ccode": "643", + "aname": "Franz Josef Land", + "mh": [ + "LQ49", + "LQ59", + "LQ99", + "LR20", + "LR30", + "LR40", + "LR50", + "LR51", + "LR60", + "LR70", + "LR71", + "LR80", + "LR81", + "LR90", + "LR91", + "MR00", + "MR01", + "MR10", + "MR11", + "MR20", + "MR21" + ], + "prefix": ["=R1FJL", "=R1FJM", "RI1F", "=UA1PBN/1", "=UA4RX/1"], + "worked": false, + "confirmed": false, + "flag": "ru.png", + "pp": "R1FJ", + "lat": 80.89757924115179, + "lon": 55.97222222222223, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "59": { + "dxcc": "62", + "cc": "BB", + "ccc": "BRB", + "name": "巴巴多斯", + "continent": "NA", + "ituzone": ["11"], + "cqzone": ["8"], + "timezone": "-4", + "ccode": "52", + "aname": "Barbados", + "mh": ["GK03"], + "prefix": ["8P"], + "worked": false, + "confirmed": false, + "flag": "bb.png", + "pp": "8P", + "lat": 13.205581842321735, + "lon": -59.607896266942134, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "60": { + "dxcc": "63", + "cc": "GF", + "ccc": "GUF", + "name": "法属圭亚那", + "continent": "SA", + "ituzone": ["12"], + "cqzone": ["9"], + "timezone": "-4", + "ccode": "254", + "aname": "French Guiana", + "mh": [ + "GJ22", + "GJ23", + "GJ24", + "GJ25", + "GJ32", + "GJ33", + "GJ34", + "GJ35", + "GJ43", + "GJ44" + ], + "prefix": [ + "FY", + "=TO1A", + "=TO2A", + "=TO2BC", + "=TO5BR", + "=TO5G", + "=TO5NED", + "=TO7C", + "=TO7IR", + "=TO7R" + ], + "worked": false, + "confirmed": false, + "flag": "gf.png", + "pp": "FY", + "lat": 4.111692675171227, + "lon": -53.12757201646092, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "61": { + "dxcc": "64", + "cc": "BM", + "ccc": "BMU", + "name": "百慕大", + "continent": "NA", + "ituzone": ["11"], + "cqzone": ["5"], + "timezone": "-4", + "ccode": "60", + "aname": "Bermuda", + "mh": ["FM72"], + "prefix": ["=VP400BO", "VP9", "=VP9400/HW"], + "worked": false, + "confirmed": false, + "flag": "bm.png", + "pp": "VP9", + "lat": 32.48937062434891, + "lon": -64.80109739368999, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "62": { + "dxcc": "65", + "cc": "VG", + "ccc": "VGB", + "name": "英属维京岛", + "continent": "NA", + "ituzone": ["11"], + "cqzone": ["8"], + "timezone": "-4", + "ccode": "92", + "aname": "British Virgin Is.", + "mh": ["FK78"], + "prefix": ["VP2V"], + "worked": false, + "confirmed": false, + "flag": "vg.png", + "pp": "VP2V", + "lat": 18.56586113057611, + "lon": -64.3682365493065, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "63": { + "dxcc": "66", + "cc": "BZ", + "ccc": "BLZ", + "name": "伯利兹", + "continent": "NA", + "ituzone": ["11"], + "cqzone": ["7"], + "timezone": "-6", + "ccode": "84", + "aname": "Belize", + "mh": ["EK55", "EK56", "EK57", "EK58", "EK67", "EK68"], + "prefix": ["V3"], + "worked": false, + "confirmed": false, + "flag": "bz.png", + "pp": "V3", + "lat": 17.05676611138483, + "lon": -88.63283036122542, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "66": { + "dxcc": "69", + "cc": "KY", + "ccc": "CYM", + "name": "开曼群岛", + "continent": "NA", + "ituzone": ["11"], + "cqzone": ["8"], + "timezone": "-5", + "ccode": "136", + "aname": "Cayman Is.", + "mh": ["EK99", "FK09"], + "prefix": ["ZF"], + "worked": false, + "confirmed": false, + "flag": "ky.png", + "pp": "ZF", + "lat": 19.57994760901832, + "lon": -80.6767261088249, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "67": { + "dxcc": "70", + "cc": "CU", + "ccc": "CUB", + "name": "古巴", + "continent": "NA", + "ituzone": ["11"], + "cqzone": ["8"], + "timezone": "-5", + "ccode": "192", + "aname": "Cuba", + "mh": [ + "EL71", + "EL72", + "EL81", + "EL82", + "EL83", + "EL91", + "EL92", + "EL93", + "FK19", + "FK29", + "FL00", + "FL01", + "FL02", + "FL10", + "FL11", + "FL12", + "FL20", + "FL21" + ], + "prefix": ["CL", "CM", "CO", "=CO2FRC/LH", "T4", "=T40C/LT"], + "worked": false, + "confirmed": false, + "flag": "cu.png", + "pp": "CM", + "lat": 21.668161998529385, + "lon": -78.33561957018748, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "68": { + "dxcc": "71", + "cc": "EC", + "ccc": "ECU", + "name": "加拉帕戈斯岛", + "continent": "SA", + "ituzone": ["12"], + "cqzone": ["10"], + "timezone": "-6", + "ccode": "218", + "aname": "Galapagos Is.", + "mh": ["EI48", "EI49", "EI58", "EI59", "EJ40", "EJ50"], + "prefix": [ + "=HC1HC/8", + "=HC2ANT/8", + "=HC2AO/8", + "=HC2AQ/8", + "=HC2IWM/8", + "=HC2OGT/8", + "=HC2RAT/8", + "=HC2RCT/8", + "=HC2RMT/8", + "=HC2WAT/8", + "HC8", + "HD8", + "=HD9IWH/8" + ], + "worked": false, + "confirmed": false, + "flag": "ec.png", + "pp": "HC8", + "lat": -0.18518486276585122, + "lon": -91.20370370370371, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "69": { + "dxcc": "72", + "cc": "DO", + "ccc": "DOM", + "name": "多米尼加共和国", + "continent": "NA", + "ituzone": ["11"], + "cqzone": ["8"], + "timezone": "-4", + "ccode": "214", + "aname": "Dominican Republic", + "mh": ["FK47", "FK48", "FK49", "FK58", "FK59"], + "prefix": ["HI"], + "worked": false, + "confirmed": false, + "flag": "do.png", + "pp": "HI", + "lat": 18.927647288273533, + "lon": -70.35783840539213, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "70": { + "dxcc": "74", + "cc": "SV", + "ccc": "SLV", + "name": "萨尔瓦多", + "continent": "NA", + "ituzone": ["11"], + "cqzone": ["7"], + "timezone": "-6", + "ccode": "222", + "aname": "El Salvador", + "mh": ["EK43", "EK53", "EK54", "EK63"], + "prefix": ["HU", "YS"], + "worked": false, + "confirmed": false, + "flag": "sv.png", + "pp": "YS", + "lat": 13.742248430286367, + "lon": -88.85230909922268, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "71": { + "dxcc": "75", + "cc": "GE", + "ccc": "GEO", + "name": "格鲁吉亚", + "continent": "AS", + "ituzone": ["29"], + "cqzone": ["21"], + "timezone": "4", + "ccode": "268", + "aname": "Georgia", + "mh": [ + "LN01", + "LN02", + "LN03", + "LN11", + "LN12", + "LN13", + "LN21", + "LN22", + "LN31", + "LN32" + ], + "prefix": [ + "4L", + "=4L1W/FF", + "=R3TT/UF6V", + "=RN7G/UF6V", + "=RV3F/UF6V", + "=RX3F/UF6V", + "=UF/UA6GG/FF" + ], + "worked": false, + "confirmed": false, + "flag": "ge.png", + "pp": "4L", + "lat": 42.04300308832697, + "lon": 43.74485596707819, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "72": { + "dxcc": "76", + "cc": "GT", + "ccc": "GTM", + "name": "危地马拉", + "continent": "NA", + "ituzone": ["11"], + "cqzone": ["7"], + "timezone": "-6", + "ccode": "320", + "aname": "Guatemala", + "mh": [ + "EK34", + "EK35", + "EK43", + "EK44", + "EK45", + "EK46", + "EK47", + "EK53", + "EK54", + "EK55", + "EK56", + "EK57" + ], + "prefix": ["TD", "TG"], + "worked": false, + "confirmed": false, + "flag": "gt.png", + "pp": "TG", + "lat": 15.6058519813851, + "lon": -90.26672763298276, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "73": { + "dxcc": "77", + "cc": "GD", + "ccc": "GRD", + "name": "格林纳达", + "continent": "NA", + "ituzone": ["11"], + "cqzone": ["8"], + "timezone": "-4", + "ccode": "308", + "aname": "Grenada", + "mh": ["FK91", "FK92"], + "prefix": ["J3"], + "worked": false, + "confirmed": false, + "flag": "gd.png", + "pp": "J3", + "lat": 12.149939402872548, + "lon": -61.75887821978356, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "74": { + "dxcc": "78", + "cc": "HT", + "ccc": "HTI", + "name": "海地", + "continent": "NA", + "ituzone": ["11"], + "cqzone": ["8"], + "timezone": "-5", + "ccode": "332", + "aname": "Haiti", + "mh": ["FK28", "FK38", "FK39", "FK48", "FK49", "FL30"], + "prefix": ["4V", "HH"], + "worked": false, + "confirmed": false, + "flag": "ht.png", + "pp": "HH", + "lat": 18.95840168440762, + "lon": -72.3087605209233, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "75": { + "dxcc": "79", + "cc": "GP", + "ccc": "GLP", + "name": "瓜德罗普岛", + "continent": "NA", + "ituzone": ["11"], + "cqzone": ["8"], + "timezone": "-4", + "ccode": "312", + "aname": "Guadeloupe", + "mh": ["FK95", "FK96"], + "prefix": [ + "FG", + "=TO0MT", + "=TO10RR", + "=TO11A", + "=TO11A/P", + "=TO1T", + "=TO1USB", + "=TO22C", + "=TO2ANT", + "=TO2E", + "=TO2FG", + "=TO2FG/P", + "=TO2HI", + "=TO2OOO", + "=TO2T", + "=TO3Z", + "=TO40R", + "=TO4D", + "=TO4R", + "=TO4T", + "=TO5BG", + "=TO5GI", + "=TO5ROM", + "=TO5S", + "=TO66R", + "=TO6A", + "=TO6D", + "=TO6T", + "=TO6T/P", + "=TO7ACR", + "=TO7AES", + "=TO7D", + "=TO7DSR", + "=TO7T", + "=TO8CW", + "=TO8FTDM", + "=TO8RR", + "=TO8S", + "=TO8UFT", + "=TO9RRG", + "=TO9T" + ], + "worked": false, + "confirmed": false, + "flag": "gp.png", + "pp": "FG", + "lat": 16.184383569047682, + "lon": -61.51094853426815, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "76": { + "dxcc": "80", + "cc": "HN", + "ccc": "HND", + "name": "洪都拉斯", + "continent": "NA", + "ituzone": ["11"], + "cqzone": ["7"], + "timezone": "-6", + "ccode": "340", + "aname": "Honduras", + "mh": [ + "EK53", + "EK54", + "EK55", + "EK62", + "EK63", + "EK64", + "EK65", + "EK66", + "EK73", + "EK74", + "EK75", + "EK76", + "EK84", + "EK85" + ], + "prefix": ["HQ", "HR"], + "worked": false, + "confirmed": false, + "flag": "hn.png", + "pp": "HR", + "lat": 14.864679915637936, + "lon": -87.05075445816185, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "77": { + "dxcc": "82", + "cc": "JM", + "ccc": "JAM", + "name": "牙买加", + "continent": "NA", + "ituzone": ["11"], + "cqzone": ["8"], + "timezone": "-5", + "ccode": "388", + "aname": "Jamaica", + "mh": ["FK08", "FK17", "FK18"], + "prefix": ["6Y"], + "worked": false, + "confirmed": false, + "flag": "jm.png", + "pp": "6Y", + "lat": 18.195583860613482, + "lon": -77.31138545953361, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "78": { + "dxcc": "84", + "cc": "MQ", + "ccc": "MTQ", + "name": "马提尼克岛", + "continent": "NA", + "ituzone": ["11"], + "cqzone": ["8"], + "timezone": "-4", + "ccode": "474", + "aname": "Martinique", + "mh": ["FK94"], + "prefix": [ + "FM", + "=TO0O", + "=TO1BT", + "=TO1C", + "=TO1J", + "=TO1N", + "=TO1YR", + "=TO2M", + "=TO2MB", + "=TO3GA", + "=TO3JA", + "=TO3M", + "=TO3T", + "=TO3W", + "=TO40CDXC", + "=TO4A", + "=TO4C", + "=TO4FM", + "=TO4GU", + "=TO4IPA", + "=TO4OC", + "=TO4YL", + "=TO5A", + "=TO5AA", + "=TO5J", + "=TO5K", + "=TO5PX", + "=TO5T", + "=TO5U", + "=TO5W", + "=TO5X", + "=TO5Y", + "=TO6ABM", + "=TO6M", + "=TO7A", + "=TO7HAM", + "=TO7X", + "=TO8A", + "=TO8M", + "=TO8T", + "=TO8Z", + "=TO90IARU", + "=TO972A", + "=TO972M", + "=TO9A", + "=TO9R" + ], + "worked": false, + "confirmed": false, + "flag": "mq.png", + "pp": "FM", + "lat": 14.657248399657036, + "lon": -61.00966993513861, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "79": { + "dxcc": "85", + "cc": "AN", + "ccc": "ANT", + "name": "荷属安的列斯群岛", + "continent": "SA", + "ituzone": ["0"], + "cqzone": ["0"], + "timezone": "0", + "ccode": "530", + "aname": "Netherlands Antilles", + "mh": ["FK52"], + "prefix": [], + "worked": false, + "confirmed": false, + "flag": "an.png", + "pp": "", + "lat": 0, + "lon": 0, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "80": { + "dxcc": "86", + "cc": "NI", + "ccc": "NIC", + "name": "尼加拉瓜", + "continent": "NA", + "ituzone": ["11"], + "cqzone": ["7"], + "timezone": "-6", + "ccode": "558", + "aname": "Nicaragua", + "mh": [ + "EK61", + "EK62", + "EK63", + "EK64", + "EK70", + "EK71", + "EK72", + "EK73", + "EK74", + "EK80", + "EK81", + "EK82", + "EK83", + "EK84", + "EK85" + ], + "prefix": ["H6", "H7", "HT", "YN"], + "worked": false, + "confirmed": false, + "flag": "ni.png", + "pp": "YN", + "lat": 12.893885162744581, + "lon": -85.18518518518518, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "81": { + "dxcc": "88", + "cc": "PA", + "ccc": "PAN", + "name": "巴拿马", + "continent": "NA", + "ituzone": ["11"], + "cqzone": ["7"], + "timezone": "-5", + "ccode": "591", + "aname": "Panama", + "mh": [ + "EJ88", + "EJ89", + "EJ97", + "EJ98", + "EJ99", + "FJ07", + "FJ08", + "FJ09", + "FJ17", + "FJ18", + "FJ19" + ], + "prefix": ["3E", "3F", "H3", "H8", "H9", "HO", "HP", "=HP2TP/LH"], + "worked": false, + "confirmed": false, + "flag": "pa.png", + "pp": "HP", + "lat": 8.744997091713714, + "lon": -80.2469135802469, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "82": { + "dxcc": "89", + "cc": "TC", + "ccc": "TCA", + "name": "特克斯和凯科斯群岛", + "continent": "NA", + "ituzone": ["11"], + "cqzone": ["8"], + "timezone": "-5", + "ccode": "796", + "aname": "Turks & Caicos Is.", + "mh": ["FL31", "FL41"], + "prefix": ["VP5", "VQ5"], + "worked": false, + "confirmed": false, + "flag": "tc.png", + "pp": "VP5", + "lat": 21.621568758897467, + "lon": -71.71264543006654, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "83": { + "dxcc": "90", + "cc": "TT", + "ccc": "TTO", + "name": "特立尼达和多巴哥共和国", + "continent": "SA", + "ituzone": ["11"], + "cqzone": ["9"], + "timezone": "-4", + "ccode": "780", + "aname": "Trinidad & Tobago", + "mh": ["FK90", "FK91"], + "prefix": ["9Y", "9Z"], + "worked": false, + "confirmed": false, + "flag": "tt.png", + "pp": "9Y", + "lat": 10.643929274152228, + "lon": -61.539399481786305, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "84": { + "dxcc": "91", + "cc": "AW", + "ccc": "ABW", + "name": "阿鲁巴", + "continent": "SA", + "ituzone": ["11"], + "cqzone": ["9"], + "timezone": "-4", + "ccode": "533", + "aname": "Aruba", + "mh": ["FK42", "FK52"], + "prefix": ["P4", "=P40YL/YL"], + "worked": false, + "confirmed": false, + "flag": "aw.png", + "pp": "P4", + "lat": 12.602514599287943, + "lon": -70.0259106843469, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "85": { + "dxcc": "94", + "cc": "AG", + "ccc": "ATG", + "name": "安地卡及巴布达", + "continent": "NA", + "ituzone": ["11"], + "cqzone": ["8"], + "timezone": "-4", + "ccode": "28", + "aname": "Antigua & Barbuda", + "mh": ["FK96", "FK97"], + "prefix": ["V2"], + "worked": false, + "confirmed": false, + "flag": "ag.png", + "pp": "V2", + "lat": 17.648162285725476, + "lon": -61.79124305426191, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "86": { + "dxcc": "95", + "cc": "DM", + "ccc": "DMA", + "name": "多米尼克", + "continent": "NA", + "ituzone": ["11"], + "cqzone": ["8"], + "timezone": "-4", + "ccode": "212", + "aname": "Dominica", + "mh": ["FK95"], + "prefix": ["J7"], + "worked": false, + "confirmed": false, + "flag": "dm.png", + "pp": "J7", + "lat": 15.496214334920978, + "lon": -61.36462937560332, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "87": { + "dxcc": "96", + "cc": "MS", + "ccc": "MSR", + "name": "蒙特塞拉特", + "continent": "NA", + "ituzone": ["11"], + "cqzone": ["8"], + "timezone": "-4", + "ccode": "500", + "aname": "Montserrat", + "mh": ["FK86"], + "prefix": ["VP2M"], + "worked": false, + "confirmed": false, + "flag": "ms.png", + "pp": "VP2M", + "lat": 16.776791048435626, + "lon": -62.17751359040798, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "88": { + "dxcc": "97", + "cc": "LC", + "ccc": "LCA", + "name": "圣卢西亚", + "continent": "NA", + "ituzone": ["11"], + "cqzone": ["8"], + "timezone": "-4", + "ccode": "662", + "aname": "St. Lucia", + "mh": ["FK93", "FK94"], + "prefix": ["J6", "=J69DS/LH"], + "worked": false, + "confirmed": false, + "flag": "lc.png", + "pp": "J6", + "lat": 13.900994724780503, + "lon": -60.98799302274382, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "89": { + "dxcc": "98", + "cc": "VC", + "ccc": "VCT", + "name": "圣文森特岛", + "continent": "NA", + "ituzone": ["11"], + "cqzone": ["8"], + "timezone": "-4", + "ccode": "670", + "aname": "St. Vincent", + "mh": ["FK92", "FK93"], + "prefix": ["J8"], + "worked": false, + "confirmed": false, + "flag": "vc.png", + "pp": "J8", + "lat": 13.240752144043384, + "lon": -61.20476214669172, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "90": { + "dxcc": "99", + "cc": "FR", + "ccc": "FRA", + "name": "格罗里奥索群岛", + "continent": "AF", + "ituzone": ["53"], + "cqzone": ["39"], + "timezone": "3", + "ccode": "250", + "aname": "Glorioso Is.", + "mh": ["LH38"], + "prefix": [ + "=FR5ZQ/G", + "FT0G", + "FT1G", + "FT2G", + "FT3G", + "FT4G", + "FT5G", + "FT6G", + "FT7G", + "FT8G", + "FT9G" + ], + "worked": false, + "confirmed": false, + "flag": "fr.png", + "pp": "FT/g", + "lat": -11.529382041726222, + "lon": 47.224508459076354, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "91": { + "dxcc": "100", + "cc": "AR", + "ccc": "ARG", + "name": "阿根廷", + "continent": "SA", + "ituzone": ["14", "16"], + "cqzone": ["13"], + "timezone": "-3", + "ccode": "32", + "aname": "Argentina", + "mh": [ + "FD38", + "FD39", + "FD48", + "FD49", + "FD55", + "FD56", + "FD57", + "FD58", + "FD59", + "FD64", + "FD65", + "FD66", + "FD69", + "FD74", + "FD75", + "FD85", + "FE30", + "FE31", + "FE32", + "FE35", + "FE36", + "FE37", + "FE40", + "FE41", + "FE42", + "FE43", + "FE44", + "FE45", + "FE46", + "FE47", + "FE48", + "FE49", + "FE50", + "FE51", + "FE52", + "FE53", + "FE54", + "FE55", + "FE56", + "FE57", + "FE58", + "FE59", + "FE60", + "FE61", + "FE62", + "FE63", + "FE64", + "FE65", + "FE66", + "FE67", + "FE68", + "FE69", + "FE71", + "FE72", + "FE74", + "FE75", + "FE76", + "FE77", + "FE78", + "FE79", + "FE87", + "FE88", + "FE89", + "FF40", + "FF41", + "FF42", + "FF43", + "FF44", + "FF45", + "FF46", + "FF47", + "FF48", + "FF49", + "FF50", + "FF51", + "FF52", + "FF53", + "FF54", + "FF55", + "FF56", + "FF57", + "FF58", + "FF59", + "FF60", + "FF61", + "FF62", + "FF63", + "FF64", + "FF65", + "FF66", + "FF67", + "FF68", + "FF69", + "FF70", + "FF71", + "FF72", + "FF73", + "FF74", + "FF75", + "FF76", + "FF77", + "FF78", + "FF79", + "FF80", + "FF81", + "FF82", + "FF83", + "FF84", + "FF85", + "FF86", + "FF87", + "FF88", + "FF89", + "FF90", + "FF91", + "FF92", + "FF93", + "FF94", + "FF95", + "FF96", + "FF97", + "FF98", + "FF99", + "FG40", + "FG50", + "FG51", + "FG52", + "FG53", + "FG54", + "FG55", + "FG60", + "FG61", + "FG62", + "FG63", + "FG64", + "FG65", + "FG66", + "FG67", + "FG68", + "FG70", + "FG71", + "FG72", + "FG73", + "FG74", + "FG75", + "FG76", + "FG77", + "FG78", + "FG80", + "FG81", + "FG82", + "FG83", + "FG84", + "FG85", + "FG86", + "FG87", + "FG90", + "FG91", + "FG92", + "FG93", + "FG94", + "FG95", + "FG96", + "FG97", + "GF01", + "GF02", + "GF03", + "GF04", + "GF05", + "GF06", + "GF07", + "GF08", + "GF09", + "GF11", + "GF12", + "GF13", + "GF14", + "GF15", + "GF18", + "GF19", + "GG00", + "GG01", + "GG02", + "GG03", + "GG04", + "GG05", + "GG10", + "GG11", + "GG12", + "GG13", + "GG14", + "GG21", + "GG22", + "GG23", + "GG24", + "GG32", + "GG33", + "GG34" + ], + "prefix": [ + "AY", + "AY0V", + "AY0W", + "AY0X", + "AY0Y", + "AY1V", + "AY1W", + "AY1X", + "AY1Y", + "AY2V", + "AY2W", + "AY2X", + "AY2Y", + "AY3V", + "AY3W", + "AY3X", + "AY3Y", + "AY4V", + "AY4W", + "AY4X", + "AY4Y", + "AY5V", + "AY5W", + "AY5X", + "AY5Y", + "AY6V", + "AY6W", + "AY6X", + "AY6Y", + "AY7V", + "AY7W", + "AY7X", + "AY7Y", + "AY8V", + "AY8W", + "AY8X", + "AY8Y", + "AY9V", + "AY9W", + "AY9X", + "AY9Y", + "AZ", + "AZ0V", + "AZ0W", + "AZ0X", + "AZ0Y", + "AZ1V", + "AZ1W", + "AZ1X", + "AZ1Y", + "AZ2V", + "AZ2W", + "AZ2X", + "AZ2Y", + "AZ3V", + "AZ3W", + "AZ3X", + "AZ3Y", + "AZ4V", + "AZ4W", + "AZ4X", + "AZ4Y", + "AZ5V", + "AZ5W", + "AZ5X", + "AZ5Y", + "AZ6V", + "AZ6W", + "AZ6X", + "AZ6Y", + "AZ7V", + "AZ7W", + "AZ7X", + "AZ7Y", + "AZ8V", + "AZ8W", + "AZ8X", + "AZ8Y", + "AZ9V", + "AZ9W", + "AZ9X", + "AZ9Y", + "L1", + "L2", + "L20V", + "L20W", + "L20X", + "L20Y", + "L21V", + "L21W", + "L21X", + "L21Y", + "L22V", + "L22W", + "L22X", + "L22Y", + "L23V", + "L23W", + "L23X", + "L23Y", + "L24V", + "L24W", + "L24X", + "L24Y", + "L25V", + "L25W", + "L25X", + "L25Y", + "L26V", + "L26W", + "L26X", + "L26Y", + "L27V", + "L27W", + "L27X", + "L27Y", + "L28V", + "L28W", + "L28X", + "L28Y", + "L29V", + "L29W", + "L29X", + "L29Y", + "L3", + "L30V", + "L30W", + "L30X", + "L30Y", + "L31V", + "L31W", + "L31X", + "L31Y", + "L32V", + "L32W", + "L32X", + "L32Y", + "L33V", + "L33W", + "L33X", + "L33Y", + "L34V", + "L34W", + "L34X", + "L34Y", + "L35V", + "L35W", + "L35X", + "L35Y", + "L36V", + "L36W", + "L36X", + "L36Y", + "L37V", + "L37W", + "L37X", + "L37Y", + "L38V", + "L38W", + "L38X", + "L38Y", + "L39V", + "L39W", + "L39X", + "L39Y", + "L4", + "L40V", + "L40W", + "L40X", + "L40Y", + "L41V", + "L41W", + "L41X", + "L41Y", + "L42V", + "L42W", + "L42X", + "L42Y", + "L43V", + "L43W", + "L43X", + "L43Y", + "L44V", + "L44W", + "L44X", + "L44Y", + "L45V", + "L45W", + "L45X", + "L45Y", + "L46V", + "L46W", + "L46X", + "L46Y", + "L47V", + "L47W", + "L47X", + "L47Y", + "L48V", + "L48W", + "L48X", + "L48Y", + "L49V", + "L49W", + "L49X", + "L49Y", + "L5", + "L50V", + "L50W", + "L50X", + "L50Y", + "L51V", + "L51W", + "L51X", + "L51Y", + "L52V", + "L52W", + "L52X", + "L52Y", + "L53V", + "L53W", + "L53X", + "L53Y", + "L54V", + "L54W", + "L54X", + "L54Y", + "L55V", + "L55W", + "L55X", + "L55Y", + "L56V", + "L56W", + "L56X", + "L56Y", + "L57V", + "L57W", + "L57X", + "L57Y", + "L58V", + "L58W", + "L58X", + "L58Y", + "L59V", + "L59W", + "L59X", + "L59Y", + "L6", + "L60V", + "L60W", + "L60X", + "L60Y", + "L61V", + "L61W", + "L61X", + "L61Y", + "L62V", + "L62W", + "L62X", + "L62Y", + "L63V", + "L63W", + "L63X", + "L63Y", + "L64V", + "L64W", + "L64X", + "L64Y", + "L65V", + "L65W", + "L65X", + "L65Y", + "L66V", + "L66W", + "L66X", + "L66Y", + "L67V", + "L67W", + "L67X", + "L67Y", + "L68V", + "L68W", + "L68X", + "L68Y", + "L69V", + "L69W", + "L69X", + "L69Y", + "L7", + "L70V", + "L70W", + "L70X", + "L70Y", + "L71V", + "L71W", + "L71X", + "L71Y", + "L72V", + "L72W", + "L72X", + "L72Y", + "L73V", + "L73W", + "L73X", + "L73Y", + "L74V", + "L74W", + "L74X", + "L74Y", + "L75V", + "L75W", + "L75X", + "L75Y", + "L76V", + "L76W", + "L76X", + "L76Y", + "L77V", + "L77W", + "L77X", + "L77Y", + "L78V", + "L78W", + "L78X", + "L78Y", + "L79V", + "L79W", + "L79X", + "L79Y", + "L8", + "L80V", + "L80W", + "L80X", + "L80Y", + "L81V", + "L81W", + "L81X", + "L81Y", + "L82V", + "L82W", + "L82X", + "L82Y", + "L83V", + "L83W", + "L83X", + "L83Y", + "L84V", + "L84W", + "L84X", + "L84Y", + "L85V", + "L85W", + "L85X", + "L85Y", + "L86V", + "L86W", + "L86X", + "L86Y", + "L87V", + "L87W", + "L87X", + "L87Y", + "L88V", + "L88W", + "L88X", + "L88Y", + "L89V", + "L89W", + "L89X", + "L89Y", + "L9", + "L90V", + "L90W", + "L90X", + "L90Y", + "L91V", + "L91W", + "L91X", + "L91Y", + "L92V", + "L92W", + "L92X", + "L92Y", + "L93V", + "L93W", + "L93X", + "L93Y", + "L94V", + "L94W", + "L94X", + "L94Y", + "L95V", + "L95W", + "L95X", + "L95Y", + "L96V", + "L96W", + "L96X", + "L96Y", + "L97V", + "L97W", + "L97X", + "L97Y", + "L98V", + "L98W", + "L98X", + "L98Y", + "L99V", + "L99W", + "L99X", + "L99Y", + "LO", + "LO0V", + "LO0W", + "LO0X", + "LO0Y", + "LO1V", + "LO1W", + "LO1X", + "LO1Y", + "LO2V", + "LO2W", + "LO2X", + "LO2Y", + "LO3V", + "LO3W", + "LO3X", + "LO3Y", + "LO4V", + "LO4W", + "LO4X", + "LO4Y", + "LO5V", + "LO5W", + "LO5X", + "LO5Y", + "LO6V", + "LO6W", + "LO6X", + "LO6Y", + "LO7V", + "LO7W", + "LO7X", + "LO7Y", + "LO8V", + "LO8W", + "LO8X", + "LO8Y", + "LO9V", + "LO9W", + "LO9X", + "LO9Y", + "LP", + "LP0V", + "LP0W", + "LP0X", + "LP0Y", + "LP1V", + "LP1W", + "LP1X", + "LP1Y", + "LP2V", + "LP2W", + "LP2X", + "LP2Y", + "LP3V", + "LP3W", + "LP3X", + "LP3Y", + "LP4V", + "LP4W", + "LP4X", + "LP4Y", + "LP5V", + "LP5W", + "LP5X", + "LP5Y", + "LP6V", + "LP6W", + "LP6X", + "LP6Y", + "LP7V", + "LP7W", + "LP7X", + "LP7Y", + "LP8V", + "LP8W", + "LP8X", + "LP8Y", + "LP9V", + "LP9W", + "LP9X", + "LP9Y", + "LQ", + "LQ0V", + "LQ0W", + "LQ0X", + "LQ0Y", + "LQ1V", + "LQ1W", + "LQ1X", + "LQ1Y", + "LQ2V", + "LQ2W", + "LQ2X", + "LQ2Y", + "LQ3V", + "LQ3W", + "LQ3X", + "LQ3Y", + "LQ4V", + "LQ4W", + "LQ4X", + "LQ4Y", + "LQ5V", + "LQ5W", + "LQ5X", + "LQ5Y", + "LQ6V", + "LQ6W", + "LQ6X", + "LQ6Y", + "LQ7V", + "LQ7W", + "LQ7X", + "LQ7Y", + "LQ8V", + "LQ8W", + "LQ8X", + "LQ8Y", + "LQ9V", + "LQ9W", + "LQ9X", + "LQ9Y", + "LR", + "LR0V", + "LR0W", + "LR0X", + "LR0Y", + "LR1V", + "LR1W", + "LR1X", + "LR1Y", + "LR2V", + "LR2W", + "LR2X", + "LR2Y", + "LR3V", + "LR3W", + "LR3X", + "LR3Y", + "LR4V", + "LR4W", + "LR4X", + "LR4Y", + "LR5V", + "LR5W", + "LR5X", + "LR5Y", + "LR6V", + "LR6W", + "LR6X", + "LR6Y", + "LR7V", + "LR7W", + "LR7X", + "LR7Y", + "LR8V", + "LR8W", + "LR8X", + "LR8Y", + "LR9V", + "LR9W", + "LR9X", + "LR9Y", + "LS", + "LS0V", + "LS0W", + "LS0X", + "LS0Y", + "LS1V", + "LS1W", + "LS1X", + "LS1Y", + "LS2V", + "LS2W", + "LS2X", + "LS2Y", + "LS3V", + "LS3W", + "LS3X", + "LS3Y", + "LS4V", + "LS4W", + "LS4X", + "LS4Y", + "LS5V", + "LS5W", + "LS5X", + "LS5Y", + "LS6V", + "LS6W", + "LS6X", + "LS6Y", + "LS7V", + "LS7W", + "LS7X", + "LS7Y", + "LS8V", + "LS8W", + "LS8X", + "LS8Y", + "LS9V", + "LS9W", + "LS9X", + "LS9Y", + "LT", + "LT0V", + "LT0W", + "LT0X", + "LT0Y", + "LT1V", + "LT1W", + "LT1X", + "LT1Y", + "LT2V", + "LT2W", + "LT2X", + "LT2Y", + "LT3V", + "LT3W", + "LT3X", + "LT3Y", + "LT4V", + "LT4W", + "LT4X", + "LT4Y", + "LT5V", + "LT5W", + "LT5X", + "LT5Y", + "LT6V", + "LT6W", + "LT6X", + "LT6Y", + "LT7V", + "LT7W", + "LT7X", + "LT7Y", + "LT8V", + "LT8W", + "LT8X", + "LT8Y", + "LT9V", + "LT9W", + "LT9X", + "LT9Y", + "LU", + "LU0V", + "LU0W", + "LU0X", + "LU0Y", + "LU1V", + "LU1W", + "LU1X", + "LU1Y", + "LU2V", + "LU2W", + "LU2X", + "LU2Y", + "LU3V", + "LU3W", + "LU3X", + "LU3Y", + "LU4V", + "LU4W", + "LU4X", + "LU4Y", + "LU5V", + "LU5W", + "LU5X", + "LU5Y", + "LU6V", + "LU6W", + "LU6X", + "LU6Y", + "LU7V", + "LU7W", + "LU7X", + "LU7Y", + "LU8V", + "LU8W", + "LU8X", + "LU8Y", + "LU9V", + "LU9W", + "LU9X", + "LU9Y", + "LV", + "LV0V", + "LV0W", + "LV0X", + "LV0Y", + "LV1V", + "LV1W", + "LV1X", + "LV1Y", + "LV2V", + "LV2W", + "LV2X", + "LV2Y", + "LV3V", + "LV3W", + "LV3X", + "LV3Y", + "LV4V", + "LV4W", + "LV4X", + "LV4Y", + "LV5V", + "LV5W", + "LV5X", + "LV5Y", + "LV6V", + "LV6W", + "LV6X", + "LV6Y", + "LV7V", + "LV7W", + "LV7X", + "LV7Y", + "LV8V", + "LV8W", + "LV8X", + "LV8Y", + "LV9V", + "LV9W", + "LV9X", + "LV9Y", + "LW", + "LW0V", + "LW0W", + "LW0X", + "LW0Y", + "LW1V", + "LW1W", + "LW1X", + "LW1Y", + "LW2V", + "LW2W", + "LW2X", + "LW2Y", + "LW3V", + "LW3W", + "LW3X", + "LW3Y", + "LW4V", + "LW4W", + "LW4X", + "LW4Y", + "LW5V", + "LW5W", + "LW5X", + "LW5Y", + "LW6V", + "LW6W", + "LW6X", + "LW6Y", + "LW7V", + "LW7W", + "LW7X", + "LW7Y", + "LW8V", + "LW8W", + "LW8X", + "LW8Y", + "LW9V", + "LW9W", + "LW9X", + "LW9Y" + ], + "worked": false, + "confirmed": false, + "flag": "ar.png", + "pp": "LU", + "lat": -33.95052760716311, + "lon": -64.32098765432099, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "93": { + "dxcc": "103", + "cc": "GU", + "ccc": "GUM", + "name": "关岛", + "continent": "OC", + "ituzone": ["64"], + "cqzone": ["27"], + "timezone": "10", + "ccode": "316", + "aname": "Guam", + "mh": ["QK23"], + "prefix": [ + "=AB2AB", + "=AB8EW", + "=AC0FG", + "=AC7WL", + "=AE6QZ", + "=AH0AX", + "=AH0F", + "=AH0FM", + "=AH0S", + "AH2", + "=AI6ID", + "=AJ6JF", + "=K1IWD", + "=K2QGC", + "=K4QFS", + "=K5GUA", + "=K5GUM", + "=KA0RU", + "=KA1I", + "=KA6BEG", + "=KB5OXR", + "=KB7OVT", + "=KB7PQU", + "=KC2OOX", + "=KD7IRV", + "=KE4YSP", + "=KE7GMC", + "=KE7IPG", + "=KF4UFC", + "=KF5ULC", + "=KF7BMU", + "=KG4BKW", + "=KG6AGT", + "=KG6ARL", + "=KG6DX", + "=KG6FJG", + "=KG6JDX", + "=KG6JKR", + "=KG6JKT", + "=KG6TWZ", + "=KH0C", + "=KH0DX", + "=KH0ES", + "=KH0TF", + "=KH0UM", + "KH2", + "=KH6KK", + "=KI4KKH", + "=KI4KKI", + "=KI7SSW", + "=KJ6AYQ", + "=KJ6KCJ", + "=KK6GVF", + "=KK7AV", + "=KM4NVB", + "=N0RY", + "=N2MI", + "=NH0A", + "=NH0B", + "=NH0Q", + "NH2", + "=NH7TL", + "=NH7WC", + "=NP3EZ", + "=W5LFA", + "=W6KV", + "=W7GVC", + "=W9MRE", + "=WA3KNB", + "=WB7AXZ", + "=WD6DGS", + "=WH0AC", + "WH2" + ], + "worked": false, + "confirmed": false, + "flag": "gu.png", + "pp": "KH2", + "lat": 13.472748166666449, + "lon": 144.79816197846986, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "94": { + "dxcc": "104", + "cc": "BO", + "ccc": "BOL", + "name": "玻利维亚", + "continent": "SA", + "ituzone": ["12", "14"], + "cqzone": ["10"], + "timezone": "-4", + "ccode": "68", + "aname": "Bolivia", + "mh": [ + "FG57", + "FG58", + "FG59", + "FG67", + "FG68", + "FG69", + "FG77", + "FG78", + "FG79", + "FG87", + "FG88", + "FG89", + "FG99", + "FH50", + "FH51", + "FH52", + "FH53", + "FH54", + "FH55", + "FH56", + "FH57", + "FH58", + "FH59", + "FH60", + "FH61", + "FH62", + "FH63", + "FH64", + "FH65", + "FH66", + "FH67", + "FH68", + "FH69", + "FH70", + "FH71", + "FH72", + "FH73", + "FH74", + "FH75", + "FH76", + "FH77", + "FH78", + "FH79", + "FH80", + "FH81", + "FH82", + "FH83", + "FH84", + "FH85", + "FH86", + "FH87", + "FH90", + "FH91", + "FH92", + "FH93", + "FH94", + "FH95", + "FH96", + "FI60", + "FI70", + "GG09", + "GG19", + "GH00", + "GH01", + "GH02", + "GH03", + "GH10", + "GH11", + "GH12" + ], + "prefix": ["CP", "CP2", "CP3", "CP4", "CP5", "CP6", "CP7"], + "worked": false, + "confirmed": false, + "flag": "bo.png", + "pp": "CP", + "lat": -16.948908363968258, + "lon": -64.32098765432099, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "95": { + "dxcc": "105", + "cc": "US", + "ccc": "USA", + "name": "关塔那摩湾", + "continent": "NA", + "ituzone": ["11"], + "cqzone": ["8"], + "timezone": "-5", + "ccode": "840", + "aname": "Guantanamo Bay", + "mh": ["FK29"], + "prefix": [ + "=KG4AA", + "=KG4AB", + "=KG4AC", + "=KG4AD", + "=KG4AE", + "=KG4AF", + "=KG4AG", + "=KG4AH", + "=KG4AI", + "=KG4AJ", + "=KG4AK", + "=KG4AL", + "=KG4AM", + "=KG4AN", + "=KG4AO", + "=KG4AP", + "=KG4AQ", + "=KG4AR", + "=KG4AS", + "=KG4AT", + "=KG4AU", + "=KG4AV", + "=KG4AW", + "=KG4AX", + "=KG4AY", + "=KG4AZ", + "=KG4BA", + "=KG4BB", + "=KG4BC", + "=KG4BD", + "=KG4BE", + "=KG4BF", + "=KG4BG", + "=KG4BH", + "=KG4BI", + "=KG4BJ", + "=KG4BK", + "=KG4BL", + "=KG4BM", + "=KG4BN", + "=KG4BO", + "=KG4BP", + "=KG4BQ", + "=KG4BR", + "=KG4BS", + "=KG4BT", + "=KG4BU", + "=KG4BV", + "=KG4BW", + "=KG4BX", + "=KG4BY", + "=KG4BZ", + "=KG4CA", + "=KG4CB", + "=KG4CC", + "=KG4CD", + "=KG4CE", + "=KG4CF", + "=KG4CG", + "=KG4CH", + "=KG4CI", + "=KG4CJ", + "=KG4CK", + "=KG4CL", + "=KG4CM", + "=KG4CN", + "=KG4CO", + "=KG4CP", + "=KG4CQ", + "=KG4CR", + "=KG4CS", + "=KG4CT", + "=KG4CU", + "=KG4CV", + "=KG4CW", + "=KG4CX", + "=KG4CY", + "=KG4CZ", + "=KG4DA", + "=KG4DB", + "=KG4DC", + "=KG4DD", + "=KG4DE", + "=KG4DF", + "=KG4DG", + "=KG4DH", + "=KG4DI", + "=KG4DJ", + "=KG4DK", + "=KG4DL", + "=KG4DM", + "=KG4DN", + "=KG4DO", + "=KG4DP", + "=KG4DQ", + "=KG4DR", + "=KG4DS", + "=KG4DT", + "=KG4DU", + "=KG4DV", + "=KG4DW", + "=KG4DX", + "=KG4DY", + "=KG4DZ", + "=KG4EA", + "=KG4EB", + "=KG4EC", + "=KG4ED", + "=KG4EE", + "=KG4EF", + "=KG4EG", + "=KG4EH", + "=KG4EI", + "=KG4EJ", + "=KG4EK", + "=KG4EL", + "=KG4EM", + "=KG4EN", + "=KG4EO", + "=KG4EP", + "=KG4EQ", + "=KG4ER", + "=KG4ES", + "=KG4ET", + "=KG4EU", + "=KG4EV", + "=KG4EW", + "=KG4EX", + "=KG4EY", + "=KG4EZ", + "=KG4FA", + "=KG4FB", + "=KG4FC", + "=KG4FD", + "=KG4FE", + "=KG4FF", + "=KG4FG", + "=KG4FH", + "=KG4FI", + "=KG4FJ", + "=KG4FK", + "=KG4FL", + "=KG4FM", + "=KG4FN", + "=KG4FO", + "=KG4FP", + "=KG4FQ", + "=KG4FR", + "=KG4FS", + "=KG4FT", + "=KG4FU", + "=KG4FV", + "=KG4FW", + "=KG4FX", + "=KG4FY", + "=KG4FZ", + "=KG4GA", + "=KG4GB", + "=KG4GC", + "=KG4GD", + "=KG4GE", + "=KG4GF", + "=KG4GG", + "=KG4GH", + "=KG4GI", + "=KG4GJ", + "=KG4GK", + "=KG4GL", + "=KG4GM", + "=KG4GN", + "=KG4GO", + "=KG4GP", + "=KG4GQ", + "=KG4GR", + "=KG4GS", + "=KG4GT", + "=KG4GU", + "=KG4GV", + "=KG4GW", + "=KG4GX", + "=KG4GY", + "=KG4GZ", + "=KG4HA", + "=KG4HB", + "=KG4HC", + "=KG4HD", + "=KG4HE", + "=KG4HF", + "=KG4HG", + "=KG4HH", + "=KG4HI", + "=KG4HJ", + "=KG4HK", + "=KG4HL", + "=KG4HM", + "=KG4HN", + "=KG4HO", + "=KG4HP", + "=KG4HQ", + "=KG4HR", + "=KG4HS", + "=KG4HT", + "=KG4HU", + "=KG4HV", + "=KG4HW", + "=KG4HX", + "=KG4HY", + "=KG4HZ", + "=KG4IA", + "=KG4IB", + "=KG4IC", + "=KG4ID", + "=KG4IE", + "=KG4IF", + "=KG4IG", + "=KG4IH", + "=KG4II", + "=KG4IJ", + "=KG4IK", + "=KG4IL", + "=KG4IM", + "=KG4IN", + "=KG4IO", + "=KG4IP", + "=KG4IQ", + "=KG4IR", + "=KG4IS", + "=KG4IT", + "=KG4IU", + "=KG4IV", + "=KG4IW", + "=KG4IX", + "=KG4IY", + "=KG4IZ", + "=KG4JA", + "=KG4JB", + "=KG4JC", + "=KG4JD", + "=KG4JE", + "=KG4JF", + "=KG4JG", + "=KG4JH", + "=KG4JI", + "=KG4JJ", + "=KG4JK", + "=KG4JL", + "=KG4JM", + "=KG4JN", + "=KG4JO", + "=KG4JP", + "=KG4JQ", + "=KG4JR", + "=KG4JS", + "=KG4JT", + "=KG4JU", + "=KG4JV", + "=KG4JW", + "=KG4JX", + "=KG4JY", + "=KG4JZ", + "=KG4KA", + "=KG4KB", + "=KG4KC", + "=KG4KD", + "=KG4KE", + "=KG4KF", + "=KG4KG", + "=KG4KH", + "=KG4KI", + "=KG4KJ", + "=KG4KK", + "=KG4KL", + "=KG4KM", + "=KG4KN", + "=KG4KO", + "=KG4KP", + "=KG4KQ", + "=KG4KR", + "=KG4KS", + "=KG4KT", + "=KG4KU", + "=KG4KV", + "=KG4KW", + "=KG4KX", + "=KG4KY", + "=KG4KZ", + "=KG4LA", + "=KG4LB", + "=KG4LC", + "=KG4LD", + "=KG4LE", + "=KG4LF", + "=KG4LG", + "=KG4LH", + "=KG4LI", + "=KG4LJ", + "=KG4LK", + "=KG4LL", + "=KG4LM", + "=KG4LN", + "=KG4LO", + "=KG4LP", + "=KG4LQ", + "=KG4LR", + "=KG4LS", + "=KG4LT", + "=KG4LU", + "=KG4LV", + "=KG4LW", + "=KG4LX", + "=KG4LY", + "=KG4LZ", + "=KG4MA", + "=KG4MB", + "=KG4MC", + "=KG4MD", + "=KG4ME", + "=KG4MF", + "=KG4MG", + "=KG4MH", + "=KG4MI", + "=KG4MJ", + "=KG4MK", + "=KG4ML", + "=KG4MM", + "=KG4MN", + "=KG4MO", + "=KG4MP", + "=KG4MQ", + "=KG4MR", + "=KG4MS", + "=KG4MT", + "=KG4MU", + "=KG4MV", + "=KG4MW", + "=KG4MX", + "=KG4MY", + "=KG4MZ", + "=KG4NA", + "=KG4NB", + "=KG4NC", + "=KG4ND", + "=KG4NE", + "=KG4NF", + "=KG4NG", + "=KG4NH", + "=KG4NI", + "=KG4NJ", + "=KG4NK", + "=KG4NL", + "=KG4NM", + "=KG4NN", + "=KG4NO", + "=KG4NP", + "=KG4NQ", + "=KG4NR", + "=KG4NS", + "=KG4NT", + "=KG4NU", + "=KG4NV", + "=KG4NW", + "=KG4NX", + "=KG4NY", + "=KG4NZ", + "=KG4OA", + "=KG4OB", + "=KG4OC", + "=KG4OD", + "=KG4OE", + "=KG4OF", + "=KG4OG", + "=KG4OH", + "=KG4OI", + "=KG4OJ", + "=KG4OK", + "=KG4OL", + "=KG4OM", + "=KG4ON", + "=KG4OO", + "=KG4OP", + "=KG4OQ", + "=KG4OR", + "=KG4OS", + "=KG4OT", + "=KG4OU", + "=KG4OV", + "=KG4OW", + "=KG4OX", + "=KG4OY", + "=KG4OZ", + "=KG4PA", + "=KG4PB", + "=KG4PC", + "=KG4PD", + "=KG4PE", + "=KG4PF", + "=KG4PG", + "=KG4PH", + "=KG4PI", + "=KG4PJ", + "=KG4PK", + "=KG4PL", + "=KG4PM", + "=KG4PN", + "=KG4PO", + "=KG4PP", + "=KG4PQ", + "=KG4PR", + "=KG4PS", + "=KG4PT", + "=KG4PU", + "=KG4PV", + "=KG4PW", + "=KG4PX", + "=KG4PY", + "=KG4PZ", + "=KG4QA", + "=KG4QB", + "=KG4QC", + "=KG4QD", + "=KG4QE", + "=KG4QF", + "=KG4QG", + "=KG4QH", + "=KG4QI", + "=KG4QJ", + "=KG4QK", + "=KG4QL", + "=KG4QM", + "=KG4QN", + "=KG4QO", + "=KG4QP", + "=KG4QQ", + "=KG4QR", + "=KG4QS", + "=KG4QT", + "=KG4QU", + "=KG4QV", + "=KG4QW", + "=KG4QX", + "=KG4QY", + "=KG4QZ", + "=KG4RA", + "=KG4RB", + "=KG4RC", + "=KG4RD", + "=KG4RE", + "=KG4RF", + "=KG4RG", + "=KG4RH", + "=KG4RI", + "=KG4RJ", + "=KG4RK", + "=KG4RL", + "=KG4RM", + "=KG4RN", + "=KG4RO", + "=KG4RP", + "=KG4RQ", + "=KG4RR", + "=KG4RS", + "=KG4RT", + "=KG4RU", + "=KG4RV", + "=KG4RW", + "=KG4RX", + "=KG4RY", + "=KG4RZ", + "=KG4SA", + "=KG4SB", + "=KG4SC", + "=KG4SD", + "=KG4SE", + "=KG4SF", + "=KG4SG", + "=KG4SH", + "=KG4SI", + "=KG4SJ", + "=KG4SK", + "=KG4SL", + "=KG4SM", + "=KG4SN", + "=KG4SO", + "=KG4SP", + "=KG4SQ", + "=KG4SR", + "=KG4SS", + "=KG4ST", + "=KG4SU", + "=KG4SV", + "=KG4SW", + "=KG4SX", + "=KG4SY", + "=KG4SZ", + "=KG4TA", + "=KG4TB", + "=KG4TC", + "=KG4TD", + "=KG4TE", + "=KG4TF", + "=KG4TG", + "=KG4TH", + "=KG4TI", + "=KG4TJ", + "=KG4TK", + "=KG4TL", + "=KG4TM", + "=KG4TN", + "=KG4TO", + "=KG4TP", + "=KG4TQ", + "=KG4TR", + "=KG4TS", + "=KG4TT", + "=KG4TU", + "=KG4TV", + "=KG4TW", + "=KG4TX", + "=KG4TY", + "=KG4TZ", + "=KG4UA", + "=KG4UB", + "=KG4UC", + "=KG4UD", + "=KG4UE", + "=KG4UF", + "=KG4UG", + "=KG4UH", + "=KG4UI", + "=KG4UJ", + "=KG4UK", + "=KG4UL", + "=KG4UM", + "=KG4UN", + "=KG4UO", + "=KG4UP", + "=KG4UQ", + "=KG4UR", + "=KG4US", + "=KG4UT", + "=KG4UU", + "=KG4UV", + "=KG4UW", + "=KG4UX", + "=KG4UY", + "=KG4UZ", + "=KG4VA", + "=KG4VB", + "=KG4VC", + "=KG4VD", + "=KG4VE", + "=KG4VF", + "=KG4VG", + "=KG4VH", + "=KG4VI", + "=KG4VJ", + "=KG4VK", + "=KG4VL", + "=KG4VM", + "=KG4VN", + "=KG4VO", + "=KG4VP", + "=KG4VQ", + "=KG4VR", + "=KG4VS", + "=KG4VT", + "=KG4VU", + "=KG4VV", + "=KG4VW", + "=KG4VX", + "=KG4VY", + "=KG4VZ", + "=KG4WA", + "=KG4WB", + "=KG4WC", + "=KG4WD", + "=KG4WE", + "=KG4WF", + "=KG4WG", + "=KG4WH", + "=KG4WI", + "=KG4WJ", + "=KG4WK", + "=KG4WL", + "=KG4WM", + "=KG4WN", + "=KG4WO", + "=KG4WP", + "=KG4WQ", + "=KG4WR", + "=KG4WS", + "=KG4WT", + "=KG4WU", + "=KG4WV", + "=KG4WW", + "=KG4WX", + "=KG4WY", + "=KG4WZ", + "=KG4XA", + "=KG4XB", + "=KG4XC", + "=KG4XD", + "=KG4XE", + "=KG4XF", + "=KG4XG", + "=KG4XH", + "=KG4XI", + "=KG4XJ", + "=KG4XK", + "=KG4XL", + "=KG4XM", + "=KG4XN", + "=KG4XO", + "=KG4XP", + "=KG4XQ", + "=KG4XR", + "=KG4XS", + "=KG4XT", + "=KG4XU", + "=KG4XV", + "=KG4XW", + "=KG4XX", + "=KG4XY", + "=KG4XZ", + "=KG4YA", + "=KG4YB", + "=KG4YC", + "=KG4YD", + "=KG4YE", + "=KG4YF", + "=KG4YG", + "=KG4YH", + "=KG4YI", + "=KG4YJ", + "=KG4YK", + "=KG4YL", + "=KG4YM", + "=KG4YN", + "=KG4YO", + "=KG4YP", + "=KG4YQ", + "=KG4YR", + "=KG4YS", + "=KG4YT", + "=KG4YU", + "=KG4YV", + "=KG4YW", + "=KG4YX", + "=KG4YY", + "=KG4YZ", + "=KG4ZA", + "=KG4ZB", + "=KG4ZC", + "=KG4ZD", + "=KG4ZE", + "=KG4ZF", + "=KG4ZG", + "=KG4ZH", + "=KG4ZI", + "=KG4ZJ", + "=KG4ZK", + "=KG4ZL", + "=KG4ZM", + "=KG4ZN", + "=KG4ZO", + "=KG4ZP", + "=KG4ZQ", + "=KG4ZR", + "=KG4ZS", + "=KG4ZT", + "=KG4ZU", + "=KG4ZV", + "=KG4ZW", + "=KG4ZX", + "=KG4ZY", + "=KG4ZZ", + "=W1AW/KG4" + ], + "worked": false, + "confirmed": false, + "flag": "us.png", + "pp": "KG4*2", + "lat": 19.92931743907232, + "lon": -75.15927450083828, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "96": { + "dxcc": "106", + "cc": "GG", + "ccc": "GGY", + "name": "格恩西岛", + "continent": "EU", + "ituzone": ["27"], + "cqzone": ["14"], + "timezone": "0", + "ccode": "831", + "aname": "Guernsey", + "mh": ["IN89"], + "prefix": [ + "=2O0FER", + "=2Q0ARE", + "=2Q0FER", + "2U", + "=2U0ARE/2K", + "=GB0HAM", + "=GB0SRK", + "=GB0U", + "=GB19CG", + "=GB2AFG", + "=GB2FG", + "=GB2GU", + "=GB2JTA", + "=GB4SGG", + "=GB50GSY", + "=GO8FBO", + "GP", + "=GQ8FBO", + "GU", + "=GU0DXX/2K", + "=GU4GG/2K", + "=MO0FAL", + "=MO0KWD", + "MP", + "=MQ0FAL", + "=MR0FAL", + "MU", + "=MU/OT9Z/LH" + ], + "worked": false, + "confirmed": false, + "flag": "gg.png", + "pp": "GU", + "lat": 49.632822209438814, + "lon": -2.4417009602194795, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "97": { + "dxcc": "107", + "cc": "GN", + "ccc": "GIN", + "name": "几内亚", + "continent": "AF", + "ituzone": ["46"], + "cqzone": ["35"], + "timezone": "0", + "ccode": "324", + "aname": "Guinea", + "mh": [ + "IJ29", + "IJ39", + "IJ48", + "IJ49", + "IJ57", + "IJ58", + "IJ59", + "IJ67", + "IJ68", + "IJ69", + "IK20", + "IK21", + "IK30", + "IK31", + "IK32", + "IK40", + "IK41", + "IK42", + "IK50", + "IK51", + "IK52", + "IK60" + ], + "prefix": ["3X"], + "worked": false, + "confirmed": false, + "flag": "gn.png", + "pp": "3X", + "lat": 11.069041746482185, + "lon": -10.946502057613166, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "98": { + "dxcc": "108", + "cc": "BR", + "ccc": "BRA", + "name": "巴西", + "continent": "SA", + "ituzone": ["12", "13", "15"], + "cqzone": ["11"], + "timezone": "-3", + "ccode": "76", + "aname": "Brazil", + "mh": [ + "FH39", + "FH48", + "FH49", + "FH58", + "FH59", + "FH69", + "FH77", + "FH78", + "FH79", + "FH86", + "FH87", + "FH88", + "FH89", + "FH93", + "FH94", + "FH95", + "FH96", + "FH97", + "FH98", + "FH99", + "FI30", + "FI31", + "FI32", + "FI33", + "FI34", + "FI35", + "FI40", + "FI41", + "FI42", + "FI43", + "FI44", + "FI45", + "FI49", + "FI50", + "FI51", + "FI52", + "FI53", + "FI54", + "FI55", + "FI56", + "FI57", + "FI58", + "FI59", + "FI60", + "FI61", + "FI62", + "FI63", + "FI64", + "FI65", + "FI66", + "FI67", + "FI68", + "FI69", + "FI70", + "FI71", + "FI72", + "FI73", + "FI74", + "FI75", + "FI76", + "FI77", + "FI78", + "FI79", + "FI80", + "FI81", + "FI82", + "FI83", + "FI84", + "FI85", + "FI86", + "FI87", + "FI88", + "FI89", + "FI90", + "FI91", + "FI92", + "FI93", + "FI94", + "FI95", + "FI96", + "FI97", + "FI98", + "FI99", + "FJ40", + "FJ50", + "FJ51", + "FJ60", + "FJ61", + "FJ62", + "FJ70", + "FJ71", + "FJ72", + "FJ73", + "FJ74", + "FJ80", + "FJ81", + "FJ82", + "FJ83", + "FJ84", + "FJ90", + "FJ91", + "FJ92", + "FJ93", + "FJ94", + "FJ95", + "GF18", + "GF19", + "GF28", + "GF29", + "GF36", + "GF37", + "GF38", + "GF39", + "GF47", + "GF48", + "GF49", + "GG09", + "GG10", + "GG11", + "GG17", + "GG18", + "GG19", + "GG20", + "GG21", + "GG22", + "GG24", + "GG25", + "GG26", + "GG27", + "GG28", + "GG29", + "GG30", + "GG31", + "GG32", + "GG33", + "GG34", + "GG35", + "GG36", + "GG37", + "GG38", + "GG39", + "GG40", + "GG41", + "GG42", + "GG43", + "GG44", + "GG45", + "GG46", + "GG47", + "GG48", + "GG49", + "GG50", + "GG51", + "GG52", + "GG53", + "GG54", + "GG55", + "GG56", + "GG57", + "GG58", + "GG59", + "GG64", + "GG65", + "GG66", + "GG67", + "GG68", + "GG69", + "GG76", + "GG77", + "GG78", + "GG79", + "GG86", + "GG87", + "GG88", + "GG89", + "GG97", + "GG98", + "GG99", + "GH00", + "GH02", + "GH03", + "GH04", + "GH05", + "GH06", + "GH07", + "GH08", + "GH09", + "GH10", + "GH11", + "GH12", + "GH13", + "GH14", + "GH15", + "GH16", + "GH17", + "GH18", + "GH19", + "GH20", + "GH21", + "GH22", + "GH23", + "GH24", + "GH25", + "GH26", + "GH27", + "GH28", + "GH29", + "GH30", + "GH31", + "GH32", + "GH33", + "GH34", + "GH35", + "GH36", + "GH37", + "GH38", + "GH39", + "GH40", + "GH41", + "GH42", + "GH43", + "GH44", + "GH45", + "GH46", + "GH47", + "GH48", + "GH49", + "GH50", + "GH51", + "GH52", + "GH53", + "GH54", + "GH55", + "GH56", + "GH57", + "GH58", + "GH59", + "GH60", + "GH61", + "GH62", + "GH63", + "GH64", + "GH65", + "GH66", + "GH67", + "GH68", + "GH69", + "GH70", + "GH71", + "GH72", + "GH73", + "GH74", + "GH75", + "GH76", + "GH77", + "GH78", + "GH79", + "GH80", + "GH81", + "GH82", + "GH83", + "GH84", + "GH85", + "GH86", + "GH87", + "GH88", + "GH89", + "GH90", + "GH91", + "GH92", + "GH93", + "GH94", + "GH95", + "GH96", + "GH97", + "GH98", + "GH99", + "GI00", + "GI01", + "GI02", + "GI03", + "GI04", + "GI05", + "GI06", + "GI07", + "GI08", + "GI09", + "GI10", + "GI11", + "GI12", + "GI13", + "GI14", + "GI15", + "GI16", + "GI17", + "GI18", + "GI19", + "GI20", + "GI21", + "GI22", + "GI23", + "GI24", + "GI25", + "GI26", + "GI27", + "GI28", + "GI29", + "GI30", + "GI31", + "GI32", + "GI33", + "GI34", + "GI35", + "GI36", + "GI37", + "GI38", + "GI39", + "GI40", + "GI41", + "GI42", + "GI43", + "GI44", + "GI45", + "GI46", + "GI47", + "GI48", + "GI49", + "GI50", + "GI51", + "GI52", + "GI53", + "GI54", + "GI55", + "GI56", + "GI57", + "GI58", + "GI59", + "GI60", + "GI61", + "GI62", + "GI63", + "GI64", + "GI65", + "GI66", + "GI67", + "GI68", + "GI69", + "GI70", + "GI71", + "GI72", + "GI73", + "GI74", + "GI75", + "GI76", + "GI77", + "GI78", + "GI79", + "GI80", + "GI81", + "GI82", + "GI83", + "GI84", + "GI85", + "GI86", + "GI87", + "GI90", + "GI91", + "GI92", + "GI93", + "GI94", + "GI95", + "GI96", + "GI97", + "GJ00", + "GJ01", + "GJ02", + "GJ03", + "GJ04", + "GJ05", + "GJ10", + "GJ11", + "GJ12", + "GJ20", + "GJ21", + "GJ22", + "GJ30", + "GJ31", + "GJ32", + "GJ33", + "GJ40", + "GJ41", + "GJ42", + "GJ43", + "GJ44", + "GJ50", + "GJ51", + "HG09", + "HH00", + "HH01", + "HH02", + "HH03", + "HH04", + "HH05", + "HH06", + "HH07", + "HH08", + "HH09", + "HH17", + "HH18", + "HH19", + "HH29", + "HI00", + "HI01", + "HI02", + "HI03", + "HI04", + "HI05", + "HI06", + "HI07", + "HI10", + "HI11", + "HI12", + "HI13", + "HI14", + "HI15", + "HI20", + "HI21", + "HI22", + "HI23", + "HI24" + ], + "prefix": [ + "PP", + "=PP5AA/SD", + "=PP5GFM/C", + "=PP5GFM/SD", + "=PP5VB/LH", + "PP6", + "PP7", + "=PP7AA/LH", + "PP8", + "PQ", + "PQ2", + "=PQ5P/C", + "PQ8", + "PR", + "PR7", + "PR8", + "PS", + "PS7", + "=PS7AA/SD", + "PS8", + "=PS8AA/SD", + "PT", + "PT2", + "PT7", + "=PT7AAC/SD", + "=PT7CB/J", + "PT8", + "=PT9AA/SD", + "PU", + "=PU1NEZ/LH", + "=PU2AIL/YL", + "=PU3KIT/YL", + "PV", + "PV8", + "=PV8DX/SD", + "=PV8IG/SD", + "PW", + "PW8", + "=PW8AA/SD", + "PX", + "PY", + "=PY1AA/LH", + "=PY1AA/SD", + "=PY1CML/SD", + "=PY1CRN/LH", + "=PY1DCS/SD", + "=PY1DCX/SD", + "=PY1WC/SD", + "=PY2ASS/C", + "=PY2DS/Q", + "=PY2NDX/SD", + "=PY2TDP/SD", + "=PY3AA/LH", + "=PY3AA/SD", + "=PY3COM/SD", + "=PY3CQ/LH", + "=PY3CRA/SD", + "=PY3MHZ/SD", + "=PY3MSS/YL", + "=PY3RCA/SD", + "=PY3RT/SD", + "=PY3TEN/PY8/SD", + "=PY3UGR/SD", + "=PY3UR/SD", + "=PY3UU/SD", + "=PY4CEL/SD", + "=PY4CLK/SD", + "=PY4MAB/BNC", + "=PY4VL/SD", + "=PY4XX/SD", + "=PY5AA/SD", + "PY6", + "PY7", + "=PY7AA/SD", + "=PY7COM/SD", + "PY8", + "=PY8ELO/SD", + "PY9", + "ZV", + "=ZV7AA/LGT", + "ZW", + "=ZW1BC/SD", + "=ZW3RS/LH", + "=ZW4CPC/SD", + "=ZW50CVA/SD", + "=ZW7CTA/SD", + "ZX", + "=ZX2T/SD", + "ZY", + "=ZY2CPC/SD", + "=ZY5BI/SD", + "=ZY6BI/SD", + "=ZY6MP/SD", + "=ZY7C/SD", + "ZZ" + ], + "worked": false, + "confirmed": false, + "flag": "br.png", + "pp": "PY", + "lat": -9.401963335568638, + "lon": -50.83333333333334, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "99": { + "dxcc": "109", + "cc": "GW", + "ccc": "GNB", + "name": "几内亚比绍", + "continent": "AF", + "ituzone": ["46"], + "cqzone": ["35"], + "timezone": "-1", + "ccode": "624", + "aname": "Guinea-Bissau", + "mh": ["IK11", "IK12", "IK20", "IK21", "IK22", "IK31", "IK32"], + "prefix": ["J5"], + "worked": false, + "confirmed": false, + "flag": "gw.png", + "pp": "J5", + "lat": 12.090332058811398, + "lon": -15.500685871056241, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "100": { + "dxcc": "110", + "cc": "US", + "ccc": "USA", + "name": "夏威夷", + "continent": "OC", + "ituzone": ["61"], + "cqzone": ["31"], + "timezone": "-10", + "ccode": "840", + "aname": "Hawaii", + "mh": [ + "AL36", + "AL45", + "AL55", + "AL64", + "AL65", + "AL73", + "AL91", + "AL92", + "AL93", + "BK19", + "BK28", + "BK29", + "BL01", + "BL02", + "BL10", + "BL11", + "BL20" + ], + "prefix": [ + "=AA7LE", + "=AA8JA", + "=AB0JM", + "=AB3WS", + "=AB6AP", + "=AB8VQ", + "=AC4PJ", + "=AC4TJ", + "=AC9PT", + "=AE3TT", + "=AE5AB", + "=AE5LR", + "=AG4FH", + "=AH0A", + "=AH0AG", + "=AH2CN", + "AH6", + "AH7", + "=AJ0M", + "=AJ8HT", + "=AK0P", + "=AK2J", + "=AL3U", + "=AL7RQ", + "=K0BAD", + "=K0LAS", + "=K0LIH", + "=K0LUC", + "=K0OUS", + "=K1ENT", + "=K1HZM", + "=K1OSP", + "=K1OWL", + "=K1RJ", + "=K1VAN", + "=K2FFT", + "=K2GT", + "=K3NW", + "=K3QHP", + "=K3UNS", + "=K4EVR", + "=K4RAC", + "=K4UAI", + "=K4UHL", + "=K4XS", + "=K4XSS", + "=K4XV", + "=K5HQM", + "=K5ZAI", + "=K5ZYO", + "=K6AMA", + "=K6APP", + "=K6BU", + "=K6CEE", + "=K6GJS", + "=K6GUY", + "=K6HI", + "=K6IJ", + "=K6JAE", + "=K6KKW", + "=K6MIO", + "=K6NLF", + "=K6RSB", + "=K7ALH", + "=K7ASH", + "=K7FAR", + "=K7FR", + "=K7NRJ", + "=K7QAS", + "=K8EUT", + "=K9AGI", + "=K9FD", + "=K9UBS", + "=KA0FOR", + "=KA0VHP", + "=KA1ICJ", + "=KA1YJ", + "=KA2IXG", + "=KA2WXU", + "=KA3HIZ", + "=KA3TUA", + "=KA4INK", + "=KA4SBE", + "=KA6QOD", + "=KA7APU", + "=KA7BSK", + "=KA7RKW", + "=KA8EBL", + "=KA8KND", + "=KA9DMP", + "=KB0DJR", + "=KB0PXK", + "=KB0ZKZ", + "=KB1EUJ", + "=KB1GC", + "=KB1PCX", + "=KB1UHL", + "=KB2MRY", + "=KB3DMT", + "=KB3IOC", + "=KB3OXU", + "=KB3PJS", + "=KB3SEV", + "=KB4NGN", + "=KB5HVJ", + "=KB5NNY", + "=KB5OWT", + "=KB6CNU", + "=KB6EGA", + "=KB6INB", + "=KB6PKF", + "=KB7AKH", + "=KB7AKQ", + "=KB7DDX", + "=KB7EA", + "=KB7G", + "=KB7JB", + "=KB7MEU", + "=KB7QKJ", + "=KB7UQH", + "=KB7UVR", + "=KB7WDC", + "=KB7WUP", + "=KB8SKX", + "=KC0WQU", + "=KC0YIH", + "=KC0ZER", + "=KC1DBY", + "=KC2GSU", + "=KC2HL", + "=KC2MIU", + "=KC2PGW", + "=KC2SRW", + "=KC2YL", + "=KC2ZSG", + "=KC2ZSH", + "=KC2ZSI", + "=KC3GZT", + "=KC4HHS", + "=KC5GAX", + "=KC6HOX", + "=KC6QQI", + "=KC6RYQ", + "=KC6SHT", + "=KC6SWR", + "=KC6YIO", + "=KC7ASJ", + "=KC7AXX", + "=KC7DUT", + "=KC7EJC", + "=KC7HNC", + "=KC7KAT", + "=KC7KAW", + "=KC7KBA", + "=KC7KHW", + "=KC7KJT", + "=KC7LFM", + "=KC7NZ", + "=KC7PLG", + "=KC7USA", + "=KC7VHF", + "=KC7VWU", + "=KC7YXO", + "=KC8EFI", + "=KC8EJ", + "=KC9AUA", + "=KC9EQS", + "=KC9KEX", + "=KC9NJG", + "=KC9SBG", + "=KD0OXU", + "=KD0QLQ", + "=KD0QLR", + "=KD0RPD", + "=KD0WVZ", + "=KD0ZSP", + "=KD3FZ", + "=KD4GVR", + "=KD4GW", + "=KD4ML", + "=KD4NFW", + "=KD4QWO", + "=KD5BSK", + "=KD5HDA", + "=KD5HX", + "=KD5TBQ", + "=KD6CVU", + "=KD6CWF", + "=KD6EPD", + "=KD6IPX", + "=KD6LRA", + "=KD6NVX", + "=KD6VTU", + "=KD7GWI", + "=KD7GWM", + "=KD7HTG", + "=KD7KFT", + "=KD7LMP", + "=KD7SME", + "=KD7SMV", + "=KD7TZ", + "=KD7UV", + "=KD7UZG", + "=KD7WJM", + "=KD8GVO", + "=KD8LYB", + "=KE0JSB", + "=KE0TU", + "=KE2CX", + "=KE4DYE", + "=KE4RNU", + "=KE4UXQ", + "=KE4ZXQ", + "=KE5CGA", + "=KE5FJM", + "=KE5UZN", + "=KE5VQB", + "=KE6AHX", + "=KE6AXN", + "=KE6AXP", + "=KE6AYZ", + "=KE6CQE", + "=KE6EDJ", + "=KE6EVT", + "=KE6JXO", + "=KE6MKW", + "=KE6RAW", + "=KE6TFR", + "=KE6TIS", + "=KE6TIX", + "=KE6TKQ", + "=KE7FJA", + "=KE7FSK", + "=KE7HEW", + "=KE7IZS", + "=KE7JTX", + "=KE7KRQ", + "=KE7LWN", + "=KE7MW", + "=KE7PEQ", + "=KE7PIZ", + "=KE7QML", + "=KE7RCT", + "=KE7UAJ", + "=KE7UV", + "=KE7UW", + "=KF4DWA", + "=KF4FQR", + "=KF4IBW", + "=KF4JLZ", + "=KF4OOB", + "=KF4URD", + "=KF4VHS", + "=KF5AHW", + "=KF5LBQ", + "=KF5MXM", + "=KF5MXP", + "=KF6BS", + "=KF6FDG", + "=KF6IVV", + "=KF6LWN", + "=KF6LYU", + "=KF6MQT", + "=KF6OSA", + "=KF6PJ", + "=KF6PQE", + "=KF6QZD", + "=KF6RLP", + "=KF6YZR", + "=KF6ZAL", + "=KF6ZVS", + "=KF7GNP", + "=KF7IJL", + "=KF7LRS", + "=KF7OJR", + "=KF7TUU", + "=KF7VUK", + "=KG0XR", + "=KG4CAN", + "=KG4FJB", + "=KG4HZF", + "=KG4SGC", + "=KG4SGV", + "=KG4TZD", + "=KG6DV", + "=KG6EFD", + "=KG6HRX", + "=KG6IGY", + "=KG6JJP", + "=KG6LFX", + "=KG6MZJ", + "=KG6NNF", + "=KG6NQI", + "=KG6OOB", + "=KG6RJI", + "=KG6SDD", + "=KG6TFI", + "=KG6WZD", + "=KG6ZRY", + "=KG7AYU", + "=KG7CJI", + "=KG7CVR", + "=KG7EUP", + "=KG9MDR", + "=KH0AI", + "=KH0HL", + "=KH0WJ", + "=KH2MD", + "=KH2TD", + "=KH2TE", + "=KH2YI", + "=KH3AE", + "=KH3AE/M", + "=KH3AF", + "KH6", + "KH7", + "=KH8Z", + "=KI4CAU", + "=KI4HCZ", + "=KI4NOH", + "=KI4YAF", + "=KI4YOG", + "=KI6CRL", + "=KI6DVJ", + "=KI6EFY", + "=KI6FTE", + "=KI6HBZ", + "=KI6JEC", + "=KI6LPT", + "=KI6NOC", + "=KI6QDQ", + "=KI6QQJ", + "=KI6SNP", + "=KI6VYB", + "=KI6WOJ", + "=KI6ZRV", + "=KI7AUZ", + "=KI7EZG", + "=KI7FJW", + "=KI7FJX", + "=KI7FUT", + "=KI7OS", + "=KI7QZQ", + "=KJ4BHO", + "=KJ4EYV", + "=KJ4KND", + "=KJ4WOI", + "=KJ6COM", + "=KJ6GYD", + "=KJ6LAW", + "=KJ6LAX", + "=KJ6LBI", + "=KJ6NZH", + "=KJ6QQT", + "=KJ6RGW", + "=KJ6SKC", + "=KJ6TJZ", + "=KK4EEC", + "=KK4RNF", + "=KK6BRW", + "=KK6EJ", + "=KK6GM", + "=KK6OMX", + "=KK6PGA", + "=KK6QAI", + "=KK6RM", + "=KK6VJN", + "=KK6ZQ", + "=KK6ZZE", + "=KK7WR", + "=KL0TK", + "=KL1TP", + "=KL3FN", + "=KL7PN", + "=KL7UB", + "=KL7XT", + "=KM4IP", + "=KM6IK", + "=KM6RM", + "=KN6BE", + "=KN6ZU", + "=KN8AQR", + "=KO6KW", + "=KO6QT", + "=KQ6CD", + "=KQ6M", + "=KR1LLR", + "=KU4OY", + "=KW4JC", + "=KX6RTG", + "=KY1I", + "=N0CAN", + "=N0DQD", + "=N0KXY", + "=N0PJV", + "=N0RMC", + "=N0ZSJ", + "=N1CBF", + "=N1CFD", + "=N1CNQ", + "=N1IDP", + "=N1SHV", + "=N1TEE", + "=N1TLE", + "=N1VOP", + "=N1YLH", + "=N2AL", + "=N2KJU", + "=N2KLQ", + "=N3BQY", + "=N3DJT", + "=N3FUR", + "=N3GWR", + "=N3HQW", + "=N3RWD", + "=N3VDM", + "=N3ZFY", + "=N4ERA", + "=N4ZIW", + "=N5IWF", + "=N5JKJ", + "=N6AI", + "=N6CGA", + "=N6DXW", + "=N6GOZ", + "=N6IKX", + "=N6KB", + "=N6NCT", + "=N6PJQ", + "=N6QBK", + "=N6XIV", + "=N6ZAB", + "=N7AMY", + "=N7BLC", + "=N7BMD", + "=N7KZB", + "=N7NYY", + "=N7ODC", + "=N7TSV", + "=N7WBX", + "=N9CRQ", + "=N9GFL", + "=N9SBL", + "=NB6R", + "=NE7SO", + "=NG1T", + "=NH2CC", + "=NH2CD", + "=NH2CF", + "=NH2CQ", + "=NH2CR", + "=NH2IB", + "=NH2IF", + "=NH2II", + "=NH2IJ", + "=NH2IO", + "=NH2JO", + "=NH2KF", + "=NH2KH", + "=NH2YL", + "=NH2Z", + "NH6", + "NH7", + "=NI1J", + "=NL7UW", + "=NM2B", + "=NO0H", + "=NT0DA", + "=NT4AA", + "=NZ2F", + "=W0UNX", + "=W1BMB", + "=W2UNS", + "=W3ZRT", + "=W4PRO", + "=W4YQS", + "=W5FJG", + "=W6AUS", + "=W6CAG", + "=W6CWJ", + "=W6KEV", + "=W6KIT", + "=W6KPI", + "=W6MQB", + "=W6MRJ", + "=W6NBK", + "=W6ROM", + "=W6SHH", + "=W6UNX", + "=W7EHP", + "=W7NVQ", + "=W7NX", + "=W7RCR", + "=W7UEA", + "=W8AYD", + "=W8JAY", + "=W8WH", + "=WA0FUR", + "=WA0NHD", + "=WA0TFB", + "=WA2AUI", + "=WA3ZEM", + "=WA6ECX", + "=WA6IIQ", + "=WA6JDA", + "=WA6JJQ", + "=WA6QDQ", + "=WA6UVF", + "=WA7ESE", + "=WA7HEO", + "=WA7TFE", + "=WA7ZK", + "=WA8JQP", + "=WB0RUA", + "=WB0TZQ", + "=WB2AHM", + "=WB2SQW", + "=WB4JTT", + "=WB4MNF", + "=WB5ZDH", + "=WB5ZOV", + "=WB6CVJ", + "=WB6PIO", + "=WB6PJT", + "=WB6SAA", + "=WB8NCD", + "=WB9SMM", + "=WC6B", + "=WD0FTF", + "=WD0LFN", + "=WD6EZL", + "=WD6GHJ", + "=WD8LIB", + "=WD8OBO", + "=WH2Y", + "WH6", + "WH7", + "=WU0H", + "=WV0Z", + "=WV6K", + "=WY6F" + ], + "worked": false, + "confirmed": false, + "flag": "us.png", + "pp": "KH6", + "lat": 20.838602621546954, + "lon": -156.43956713915563, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "101": { + "dxcc": "111", + "cc": "HM", + "ccc": "HMD", + "name": "赫德岛", + "continent": "AF", + "ituzone": ["68"], + "cqzone": ["39"], + "timezone": "5", + "ccode": "334", + "aname": "Heard I.", + "mh": ["MD66", "MD67"], + "prefix": ["=VK0/K2ARB", "=VK0EK", "=VK0LD"], + "worked": false, + "confirmed": false, + "flag": "hm.png", + "pp": "VK0H", + "lat": -52.95896205831255, + "lon": 73.49794238683126, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "102": { + "dxcc": "112", + "cc": "CL", + "ccc": "CHL", + "name": "智利", + "continent": "SA", + "ituzone": ["14", "16"], + "cqzone": ["12"], + "timezone": "-4", + "ccode": "152", + "aname": "Chile", + "mh": [ + "FD26", + "FD27", + "FD28", + "FD29", + "FD35", + "FD36", + "FD37", + "FD38", + "FD39", + "FD44", + "FD45", + "FD46", + "FD47", + "FD48", + "FD54", + "FD55", + "FD56", + "FD57", + "FD58", + "FD64", + "FD65", + "FE20", + "FE21", + "FE22", + "FE23", + "FE24", + "FE25", + "FE26", + "FE27", + "FE28", + "FE30", + "FE31", + "FE32", + "FE33", + "FE34", + "FE35", + "FE36", + "FE37", + "FE38", + "FE39", + "FE42", + "FE43", + "FE44", + "FE45", + "FE46", + "FE47", + "FE48", + "FE49", + "FF30", + "FF31", + "FF32", + "FF33", + "FF34", + "FF35", + "FF40", + "FF41", + "FF42", + "FF43", + "FF44", + "FF45", + "FF46", + "FF47", + "FF48", + "FF49", + "FF55", + "FF56", + "FF57", + "FF59", + "FG40", + "FG41", + "FG42", + "FG43", + "FG44", + "FG45", + "FG46", + "FG47", + "FG48", + "FG49", + "FG50", + "FG51", + "FG52", + "FG53", + "FG54", + "FG55", + "FG56", + "FG57", + "FG58", + "FG59", + "FG65", + "FG66", + "FG67", + "FH40", + "FH41", + "FH50", + "FH51", + "FH52" + ], + "prefix": [ + "3G", + "3G7", + "3G8", + "CA", + "CA7", + "CA8", + "CB", + "CB7", + "CB8", + "CC", + "CC7", + "CC8", + "CD", + "CD7", + "CD8", + "CE", + "=CE6PGO", + "=CE6RFP", + "CE7", + "CE8", + "=CE9/PA3EXX", + "=CE9/PA3EXX/P", + "=CE9/UA4WHX", + "=CE9/VE3LYC", + "=CE9/VE3LYC/P", + "XQ", + "=XQ6CFX", + "=XQ6OA", + "=XQ6UMR", + "XQ7", + "XQ8", + "XR", + "=XR6F", + "XR7", + "=XR7FTC/LH", + "XR8", + "=XR90IARU", + "=XR9A/8" + ], + "worked": false, + "confirmed": false, + "flag": "cl.png", + "pp": "CE", + "lat": -33.88222697069439, + "lon": -71.1522633744856, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "104": { + "dxcc": "114", + "cc": "IM", + "ccc": "IMN", + "name": "马恩岛", + "continent": "EU", + "ituzone": ["27"], + "cqzone": ["14"], + "timezone": "0", + "ccode": "833", + "aname": "Isle of Man", + "mh": ["IO74"], + "prefix": [ + "2D", + "=2O0YLX", + "=2Q0YLX", + "=2R0IOM", + "=2V0IOM", + "=2V0YLX", + "=GB0AOA", + "=GB0BEA", + "=GB0IOM", + "=GB0MST", + "=GB100TT", + "=GB19CIM", + "=GB1MSG", + "=GB1RT", + "=GB1SOI", + "=GB2IOM", + "=GB2MAD", + "=GB2RT", + "=GB2WB", + "=GB4COM", + "=GB4IOM", + "=GB4JDF", + "=GB4MGR", + "=GB4MNH", + "=GB4SPT", + "=GB4WXM", + "=GB4WXM/P", + "=GB5LB", + "=GB5MOB", + "=GB5TD", + "GD", + "=GD3JIU/2K", + "=GO0OUD", + "=GQ0OUD", + "=GR0AMD", + "=GR0HWA", + "=GR0OUD", + "=GR6AFB", + "GT", + "=GT3FLH/LGT", + "=GT3FLH/LT", + "=GT4IOM/LH", + "=GT8IOM/LH", + "=GV0OUD", + "=GV3YEO", + "=GV6AFB", + "=GV7HTG", + "=MB100TT", + "MD", + "=MO1CLV", + "=MQ1CLV", + "=MR0CCE", + "=MR3LJB", + "=MR3MLD", + "MT", + "=MV3YLX" + ], + "worked": false, + "confirmed": false, + "flag": "im.png", + "pp": "GD", + "lat": 54.29298875980979, + "lon": -4.636488340192046, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "106": { + "dxcc": "116", + "cc": "CO", + "ccc": "COL", + "name": "哥伦比亚", + "continent": "SA", + "ituzone": ["12"], + "cqzone": ["9"], + "timezone": "-5", + "ccode": "170", + "aname": "Colombia", + "mh": [ + "FI28", + "FI29", + "FI37", + "FI38", + "FI39", + "FI45", + "FI46", + "FI47", + "FI48", + "FI49", + "FI55", + "FI56", + "FI57", + "FI58", + "FI59", + "FJ00", + "FJ01", + "FJ02", + "FJ10", + "FJ11", + "FJ12", + "FJ13", + "FJ14", + "FJ15", + "FJ16", + "FJ17", + "FJ18", + "FJ19", + "FJ20", + "FJ21", + "FJ22", + "FJ23", + "FJ24", + "FJ25", + "FJ26", + "FJ27", + "FJ28", + "FJ29", + "FJ30", + "FJ31", + "FJ32", + "FJ33", + "FJ34", + "FJ35", + "FJ36", + "FJ37", + "FJ38", + "FJ39", + "FJ40", + "FJ41", + "FJ42", + "FJ43", + "FJ44", + "FJ45", + "FJ46", + "FJ47", + "FJ50", + "FJ51", + "FJ52", + "FJ53", + "FJ54", + "FJ55", + "FJ56", + "FJ61", + "FJ62", + "FJ63", + "FJ64", + "FJ65", + "FJ66", + "FK20", + "FK21", + "FK30", + "FK31", + "FK32", + "FK41", + "FK42" + ], + "prefix": ["5J", "5K", "HJ", "HK", "=HK0GU/1", "=HK0GU/3"], + "worked": false, + "confirmed": false, + "flag": "co.png", + "pp": "HK", + "lat": 3.8380044398004287, + "lon": -73.27846364883402, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "107": { + "dxcc": "117", + "cc": "IG", + "ccc": "CHE", + "name": "国际电联总部", + "continent": "EU", + "ituzone": ["28"], + "cqzone": ["14"], + "timezone": "1", + "ccode": "756", + "aname": "ITU HQ", + "mh": ["JN36"], + "prefix": ["=4U0ITU", "=4U150ITU", "=4U1ITU", "=4U1WRC"], + "worked": false, + "confirmed": false, + "flag": "ch.png", + "pp": "4U1I", + "lat": 46.220955643392585, + "lon": 6.137621339744736, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "108": { + "dxcc": "118", + "cc": "SJ", + "ccc": "SJM", + "name": "扬马延岛", + "continent": "EU", + "ituzone": ["18"], + "cqzone": ["40"], + "timezone": "-1", + "ccode": "744", + "aname": "Jan Mayen", + "mh": ["IQ50", "IQ51", "IQ61"], + "prefix": ["JX"], + "worked": false, + "confirmed": false, + "flag": "no.png", + "pp": "JX", + "lat": 70.97306543671374, + "lon": -8.45679012345679, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "110": { + "dxcc": "120", + "cc": "EC", + "ccc": "ECU", + "name": "厄瓜多尔", + "continent": "SA", + "ituzone": ["12"], + "cqzone": ["10"], + "timezone": "-5", + "ccode": "218", + "aname": "Ecuador", + "mh": [ + "EI95", + "EI96", + "EI97", + "EI98", + "EI99", + "EJ90", + "FI04", + "FI05", + "FI06", + "FI07", + "FI08", + "FI09", + "FI16", + "FI17", + "FI18", + "FI19", + "FI27", + "FI28", + "FI29", + "FJ00", + "FJ01", + "FJ10", + "FJ20" + ], + "prefix": ["HC", "=HC8GET/2", "HD"], + "worked": false, + "confirmed": false, + "flag": "ec.png", + "pp": "HC", + "lat": -0.5555468504155243, + "lon": -78.6111111111111, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "111": { + "dxcc": "122", + "cc": "JE", + "ccc": "JEY", + "name": "泽西岛", + "continent": "EU", + "ituzone": ["27"], + "cqzone": ["14"], + "timezone": "0", + "ccode": "832", + "aname": "Jersey", + "mh": ["IN89"], + "prefix": [ + "2J", + "=2R0ODX", + "=GB0JSA", + "=GB19CJ", + "=GB2BYL", + "=GB2JSA", + "=GB50JSA", + "=GB5OJR", + "=GB8LMI", + "GH", + "GJ", + "=GJ3DVC/L", + "=GJ6WRI/LH", + "=GJ8PVL/LH", + "=GO8PVL", + "=GQ8PVL", + "=GR6TMM", + "MH", + "MJ", + "=MO0ASP", + "=MQ0ASP", + "=MR0ASP", + "=MR0RZD", + "=MV0ASP" + ], + "worked": false, + "confirmed": false, + "flag": "je.png", + "pp": "GJ", + "lat": 49.168632724059165, + "lon": -2.331961591220852, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "112": { + "dxcc": "123", + "cc": "US", + "ccc": "USA", + "name": "约翰斯顿岛", + "continent": "OC", + "ituzone": ["61"], + "cqzone": ["31"], + "timezone": "-11", + "ccode": "840", + "aname": "Johnston I.", + "mh": ["AK56"], + "prefix": ["AH3", "KH3", "=KJ6BZ", "NH3", "WH3"], + "worked": false, + "confirmed": false, + "flag": "us.png", + "pp": "KH3", + "lat": 16.71257170046863, + "lon": -169.41015089163238, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "113": { + "dxcc": "124", + "cc": "FR", + "ccc": "FRA", + "name": "胡安德诺瓦岛", + "continent": "AF", + "ituzone": ["53"], + "cqzone": ["39"], + "timezone": "3", + "ccode": "250", + "aname": "胡安德诺瓦岛, 欧洲", + "mh": ["LH12"], + "prefix": [ + "=FR/F5NHJ/E", + "=FR5IZ/E", + "FT0E", + "FT0J", + "FT1E", + "FT1J", + "FT2E", + "FT2J", + "FT3E", + "FT3J", + "FT4E", + "FT4J", + "FT6E", + "FT6J", + "FT7E", + "FT7J", + "FT8E", + "FT8J", + "FT9E", + "FT9J", + "=TO4E", + "=TO4WW" + ], + "worked": false, + "confirmed": false, + "flag": "fr.png", + "pp": "FT/j", + "lat": -16.963487360906456, + "lon": 42.63984148757811, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "114": { + "dxcc": "125", + "cc": "CL", + "ccc": "CHL", + "name": "费南德斯岛", + "continent": "SA", + "ituzone": ["14"], + "cqzone": ["12"], + "timezone": "-4", + "ccode": "152", + "aname": "Juan Fernandez Is.", + "mh": ["EF96", "FF06"], + "prefix": [ + "3G0Z", + "CA0Z", + "CB0Z", + "CC0Z", + "CD0Z", + "CE0I", + "CE0Z", + "XQ0Z", + "XR0Z" + ], + "worked": false, + "confirmed": false, + "flag": "cl.png", + "pp": "CE0Z", + "lat": -33.60847777610798, + "lon": -79.79423868312757, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "115": { + "dxcc": "126", + "cc": "RU", + "ccc": "RUS", + "name": "加里宁格勒", + "continent": "EU", + "ituzone": ["29"], + "cqzone": ["15"], + "timezone": "2", + "ccode": "643", + "aname": "Kalingrad", + "mh": ["JO94", "KO04", "KO05", "KO14", "KO15"], + "prefix": [ + "=R01DTV/2", + "=R10RLHA/2", + "=R10RTRS/2", + "=R1255F", + "=R1336FO", + "=R14CWC/2", + "=R15CWC/2", + "=R15CWC/2/QRP", + "=R18SRB", + "=R1NW/2", + "=R1QAP/2", + "=R2/DK2AI", + "=R2/DL1YMK", + "=R2/N6TCZ", + "=R2/R6AF", + "=R2/UA6LV", + "=R2/UR0MC", + "=R21GGGR", + "=R22GGGR", + "=R22GGR", + "=R25ARCK/2", + "R2F", + "R2K", + "=R2MWO", + "=R310A/2", + "=R3SRR/2", + "=R3XA/2", + "=R5K/2", + "=R5QA/2", + "=R60A", + "=R680FBO", + "=R6AF/2", + "=R777AN", + "=R7LV/2", + "=R900BL/2", + "=RA/DL6KV", + "=RA/EU1FY/P", + "=RA/SP7VC", + "RA2", + "=RA2FDX/FF", + "=RA2FN/RP", + "=RA2FO/N", + "=RA3ATX/2", + "=RA3XM/2", + "=RA4LW/2", + "=RC18KA", + "RC2F", + "RC2K", + "=RD22FU", + "RD2F", + "RD2K", + "=RD3FG/2", + "RE2F", + "RE2K", + "RF2F", + "RF2K", + "RG2F", + "RG2K", + "=RJ22DX", + "RJ2F", + "RJ2K", + "RK2F", + "RK2K", + "=RK3QS/2", + "RL2F", + "RL2K", + "RM2F", + "RM2K", + "=RM9I/2", + "=RM9IX/2", + "RN2F", + "RN2K", + "=RN3GM/2", + "RO2F", + "RO2K", + "=RP2F", + "=RP2K", + "=RP70KB", + "=RP70KG", + "=RP70MW", + "=RP70WB", + "RQ2F", + "RQ2K", + "RT2F", + "RT2K", + "=RT9T/2", + "RU2F", + "RU2K", + "=RU3FS/2", + "=RU5A/2", + "RV2F", + "RV2K", + "=RV3FF/2", + "=RV3MA/2", + "=RV3UK/2", + "=RV9WZ/2", + "RW2F", + "RW2K", + "=RW9QA/2", + "RX2F", + "RX2K", + "=RY1AAA/2", + "RY2F", + "RY2K", + "RZ2F", + "RZ2K", + "=RZ3FA/2", + "=RZ6HB/2", + "U2F", + "U2K", + "=UA0SIK/2", + "=UA1AAE/2", + "=UA1AFT/2", + "UA2", + "=UA2DC/RP", + "=UA2FM/MM", + "=UA3DJG/2", + "=UA4RC/2", + "=UA4WHX/2", + "=UA9UAX/2", + "UB2", + "=UB5O/2", + "=UB5O/2/M", + "=UB9KAA/2", + "UC2", + "UD2", + "=UE08F", + "=UE1RLH/2", + "UE2", + "=UE3QRP/2", + "=UE6MAC/2", + "=UF1M/2", + "UF2", + "UG2", + "UH2", + "UI2" + ], + "worked": false, + "confirmed": false, + "flag": "ru.png", + "pp": "UA2", + "lat": 54.64375014406477, + "lon": 21.04252400548697, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "117": { + "dxcc": "129", + "cc": "GY", + "ccc": "GUY", + "name": "圭亚那", + "continent": "SA", + "ituzone": ["12"], + "cqzone": ["9"], + "timezone": "-4", + "ccode": "328", + "aname": "Guyana", + "mh": [ + "FJ94", + "FJ95", + "FJ96", + "FJ97", + "FJ98", + "GJ01", + "GJ02", + "GJ03", + "GJ04", + "GJ05", + "GJ06", + "GJ07", + "GJ08", + "GJ11", + "GJ12", + "GJ13", + "GJ14", + "GJ15", + "GJ16" + ], + "prefix": ["8R", "=8R1AK/LH"], + "worked": false, + "confirmed": false, + "flag": "gy.png", + "pp": "8R", + "lat": 5.096147952656921, + "lon": -58.971193415637856, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "118": { + "dxcc": "130", + "cc": "KZ", + "ccc": "KAZ", + "name": "哈萨克斯坦", + "continent": "AS", + "ituzone": ["29", "30", "31"], + "cqzone": ["17"], + "timezone": "6", + "ccode": "398", + "aname": "Kazakhstan", + "mh": [ + "LN37", + "LN38", + "LN39", + "LN46", + "LN47", + "LN48", + "LN49", + "LN52", + "LN53", + "LN54", + "LN55", + "LN56", + "LN57", + "LN58", + "LN59", + "LN61", + "LN62", + "LN63", + "LN64", + "LN65", + "LN66", + "LN67", + "LN68", + "LN69", + "LN71", + "LN72", + "LN73", + "LN74", + "LN75", + "LN76", + "LN77", + "LN78", + "LN79", + "LN85", + "LN86", + "LN87", + "LN88", + "LN89", + "LN94", + "LN95", + "LN96", + "LN97", + "LN98", + "LN99", + "LO30", + "LO40", + "LO41", + "LO50", + "LO51", + "LO60", + "LO61", + "LO70", + "LO71", + "LO80", + "LO81", + "LO90", + "LO91", + "MN03", + "MN04", + "MN05", + "MN06", + "MN07", + "MN08", + "MN09", + "MN13", + "MN14", + "MN15", + "MN16", + "MN17", + "MN18", + "MN19", + "MN22", + "MN23", + "MN24", + "MN25", + "MN26", + "MN27", + "MN28", + "MN29", + "MN30", + "MN31", + "MN32", + "MN33", + "MN34", + "MN35", + "MN36", + "MN37", + "MN38", + "MN39", + "MN40", + "MN41", + "MN42", + "MN43", + "MN44", + "MN45", + "MN46", + "MN47", + "MN48", + "MN49", + "MN51", + "MN52", + "MN53", + "MN54", + "MN55", + "MN56", + "MN57", + "MN58", + "MN59", + "MN62", + "MN63", + "MN64", + "MN65", + "MN66", + "MN67", + "MN68", + "MN69", + "MN72", + "MN73", + "MN74", + "MN75", + "MN76", + "MN77", + "MN78", + "MN79", + "MN82", + "MN83", + "MN84", + "MN85", + "MN86", + "MN87", + "MN88", + "MN89", + "MN92", + "MN93", + "MN94", + "MN95", + "MN96", + "MN97", + "MN98", + "MN99", + "MO00", + "MO01", + "MO02", + "MO03", + "MO04", + "MO10", + "MO11", + "MO12", + "MO13", + "MO14", + "MO20", + "MO21", + "MO22", + "MO23", + "MO24", + "MO30", + "MO31", + "MO32", + "MO33", + "MO34", + "MO35", + "MO40", + "MO41", + "MO42", + "MO43", + "MO44", + "MO45", + "MO50", + "MO51", + "MO52", + "MO53", + "MO54", + "MO55", + "MO60", + "MO61", + "MO62", + "MO63", + "MO64", + "MO70", + "MO71", + "MO72", + "MO73", + "MO74", + "MO80", + "MO81", + "MO82", + "MO83", + "MO84", + "MO90", + "MO91", + "MO92", + "MO93", + "NN02", + "NN03", + "NN04", + "NN05", + "NN06", + "NN07", + "NN08", + "NN09", + "NN15", + "NN16", + "NN17", + "NN18", + "NN19", + "NN26", + "NN27", + "NN28", + "NN29", + "NN38", + "NN39", + "NO00", + "NO01", + "NO10", + "NO20" + ], + "prefix": [ + "=R50KEDR", + "=R50SK", + "=R50YG", + "=R55SAT", + "=R80KEDR", + "=RG50SK", + "=U7GL", + "UN", + "UN0F", + "UN0G", + "UN0J", + "UN0Q", + "UN2F", + "UN2G", + "UN2J", + "UN2Q", + "UN3F", + "UN3G", + "UN3J", + "UN3Q", + "UN4F", + "UN4G", + "UN4J", + "UN4Q", + "UN5F", + "UN5G", + "UN5J", + "UN5Q", + "UN6F", + "UN6G", + "UN6J", + "UN6Q", + "=UN7ECA/FF", + "=UN7EDG/FF", + "UN7F", + "UN7G", + "UN7J", + "=UN7LAN/A/FF", + "UN7Q", + "UN8F", + "UN8G", + "UN8J", + "UN8Q", + "UN9F", + "UN9G", + "UN9J", + "=UN9LU/A/FF", + "UN9Q", + "UO", + "UO0F", + "UO0G", + "UO0J", + "UO0Q", + "UO1F", + "UO1G", + "UO1J", + "UO1Q", + "UO2F", + "UO2G", + "UO2J", + "UO2Q", + "UO3F", + "UO3G", + "UO3J", + "UO3Q", + "UO4F", + "UO4G", + "UO4J", + "UO4Q", + "UO5F", + "UO5G", + "UO5J", + "UO5Q", + "UO6F", + "UO6G", + "UO6J", + "UO6Q", + "UO7F", + "UO7G", + "UO7J", + "UO7Q", + "UO8F", + "UO8G", + "UO8J", + "UO8Q", + "UO9F", + "UO9G", + "UO9J", + "UO9Q", + "UP", + "UP0F", + "UP0G", + "UP0J", + "UP0Q", + "UP1F", + "UP1G", + "UP1J", + "UP1Q", + "UP2F", + "UP2G", + "UP2J", + "UP2Q", + "UP3F", + "UP3G", + "UP3J", + "UP3Q", + "UP4F", + "UP4G", + "UP4J", + "UP4Q", + "UP5F", + "UP5G", + "UP5J", + "UP5Q", + "UP6F", + "UP6G", + "UP6J", + "UP6Q", + "UP7F", + "UP7G", + "UP7J", + "UP7Q", + "UP8F", + "UP8G", + "UP8J", + "UP8Q", + "UP9F", + "UP9G", + "UP9J", + "UP9Q", + "UQ", + "UQ0F", + "UQ0G", + "UQ0J", + "UQ0Q", + "UQ1F", + "UQ1G", + "UQ1J", + "UQ1Q", + "UQ2F", + "UQ2G", + "UQ2J", + "UQ2Q", + "UQ3F", + "UQ3G", + "UQ3J", + "UQ3Q", + "UQ4F", + "UQ4G", + "UQ4J", + "UQ4Q", + "UQ5F", + "UQ5G", + "UQ5J", + "UQ5Q", + "UQ6F", + "UQ6G", + "UQ6J", + "UQ6Q", + "UQ7F", + "UQ7G", + "UQ7J", + "UQ7Q", + "UQ8F", + "UQ8G", + "UQ8J", + "UQ8Q", + "UQ9F", + "UQ9G", + "UQ9J", + "UQ9Q" + ], + "worked": false, + "confirmed": false, + "flag": "kz.png", + "pp": "UN", + "lat": 48.09438781474384, + "lon": 67.87037037037038, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "119": { + "dxcc": "131", + "cc": "FR", + "ccc": "FRA", + "name": "克尔格伦岛", + "continent": "AF", + "ituzone": ["68"], + "cqzone": ["39"], + "timezone": "5", + "ccode": "250", + "aname": "Kerguelen Is.", + "mh": ["ME40", "ME41", "ME50"], + "prefix": ["FT0X", "FT2X", "FT4X", "FT5X", "FT8X"], + "worked": false, + "confirmed": false, + "flag": "fr.png", + "pp": "FT/x", + "lat": -38.25126858643041, + "lon": 77.51054209216068, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "120": { + "dxcc": "132", + "cc": "PY", + "ccc": "PRY", + "name": "巴拉圭", + "continent": "SA", + "ituzone": ["14", "16"], + "cqzone": ["11"], + "timezone": "-4", + "ccode": "600", + "aname": "Paraguay", + "mh": [ + "FG87", + "FG88", + "FG89", + "FG95", + "FG96", + "FG97", + "FG98", + "FG99", + "FH90", + "GG02", + "GG03", + "GG04", + "GG05", + "GG06", + "GG07", + "GG08", + "GG09", + "GG12", + "GG13", + "GG14", + "GG15", + "GG16", + "GG17", + "GG18", + "GG19", + "GG22", + "GG23", + "GG24", + "GG25", + "GG26", + "GG27", + "GH00" + ], + "prefix": ["ZP"], + "worked": false, + "confirmed": false, + "flag": "py.png", + "pp": "ZP", + "lat": -23.206482883501806, + "lon": -58.14814814814816, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "121": { + "dxcc": "133", + "cc": "NZ", + "ccc": "NZL", + "name": "克马德克群岛", + "continent": "OC", + "ituzone": ["60"], + "cqzone": ["32"], + "timezone": "12", + "ccode": "554", + "aname": "Kermadec Is.", + "mh": ["AF09", "AF19", "AG00", "AG10"], + "prefix": ["=ZL1GO/8", "ZL8", "ZM8"], + "worked": false, + "confirmed": false, + "flag": "nz.png", + "pp": "ZL8", + "lat": -30.32761761233737, + "lon": -178.39506172839504, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "122": { + "dxcc": "134", + "cc": "US", + "ccc": "USA", + "name": "金曼礁", + "continent": "OC", + "ituzone": ["61"], + "cqzone": ["31"], + "timezone": "-11", + "ccode": "840", + "aname": "Kingman Reef", + "mh": ["AJ86"], + "prefix": [], + "worked": false, + "confirmed": false, + "flag": "us.png", + "pp": "", + "lat": 0, + "lon": 0, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "123": { + "dxcc": "135", + "cc": "KG", + "ccc": "KGZ", + "name": "吉尔吉斯斯坦", + "continent": "AS", + "ituzone": ["30", "31"], + "cqzone": ["17"], + "timezone": "6", + "ccode": "417", + "aname": "Kyrgyzstan", + "mh": [ + "MM49", + "MM59", + "MM69", + "MN40", + "MN50", + "MN51", + "MN52", + "MN60", + "MN61", + "MN62", + "MN63", + "MN70", + "MN71", + "MN72", + "MN73", + "MN80", + "MN81", + "MN82", + "MN91", + "MN92", + "NN02" + ], + "prefix": [ + "EX", + "=EX/RU3TT/FF", + "EX0P", + "EX0Q", + "EX2P", + "EX2Q", + "EX6P", + "EX6Q", + "EX7P", + "EX7Q", + "EX8P", + "EX8Q" + ], + "worked": false, + "confirmed": false, + "flag": "kg.png", + "pp": "EX", + "lat": 41.675208182408824, + "lon": 74.7599451303155, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "124": { + "dxcc": "136", + "cc": "PE", + "ccc": "PER", + "name": "秘鲁", + "continent": "SA", + "ituzone": ["12"], + "cqzone": ["10"], + "timezone": "-5", + "ccode": "604", + "aname": "Peru", + "mh": [ + "EI93", + "EI94", + "EI95", + "EI96", + "FH09", + "FH15", + "FH16", + "FH17", + "FH18", + "FH19", + "FH23", + "FH24", + "FH25", + "FH26", + "FH27", + "FH28", + "FH29", + "FH32", + "FH33", + "FH34", + "FH35", + "FH36", + "FH37", + "FH38", + "FH39", + "FH41", + "FH42", + "FH43", + "FH44", + "FH45", + "FH46", + "FH47", + "FH48", + "FH49", + "FH51", + "FH52", + "FH53", + "FH54", + "FH55", + "FH56", + "FH57", + "FH58", + "FH59", + "FI00", + "FI01", + "FI02", + "FI03", + "FI04", + "FI05", + "FI06", + "FI10", + "FI11", + "FI12", + "FI13", + "FI14", + "FI15", + "FI16", + "FI17", + "FI18", + "FI20", + "FI21", + "FI22", + "FI23", + "FI24", + "FI25", + "FI26", + "FI27", + "FI28", + "FI29", + "FI30", + "FI31", + "FI32", + "FI33", + "FI34", + "FI35", + "FI36", + "FI37", + "FI38", + "FI40", + "FI45", + "FI46", + "FI47", + "FI55" + ], + "prefix": ["4T", "OA", "OB", "OC"], + "worked": false, + "confirmed": false, + "flag": "pe.png", + "pp": "OA", + "lat": -7.93745139807902, + "lon": -76.01851851851852, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "125": { + "dxcc": "137", + "cc": "KR", + "ccc": "KOR", + "name": "韩国", + "continent": "AS", + "ituzone": ["44"], + "cqzone": ["25"], + "timezone": "9", + "ccode": "410", + "aname": "Republic of Korea", + "mh": [ + "PM24", + "PM27", + "PM33", + "PM34", + "PM35", + "PM36", + "PM37", + "PM38", + "PM44", + "PM45", + "PM46", + "PM47", + "PM48", + "PM57" + ], + "prefix": [ + "6K", + "=6K50ACS/C", + "6L", + "6M", + "6N", + "D7", + "D8", + "D9", + "DS", + "=DS50ARN/C", + "=DS50CYI/C", + "=DS50DBF/H", + "=DS50EXX/E", + "=DS50GOO/C", + "=DS50HWS/E", + "=DS50KJR/L", + "DT", + "HL", + "KL9K" + ], + "worked": false, + "confirmed": false, + "flag": "kr.png", + "pp": "HL", + "lat": 36.769086711592664, + "lon": 127.94238683127573, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "126": { + "dxcc": "138", + "cc": "US", + "ccc": "USA", + "name": "库雷环礁", + "continent": "OC", + "ituzone": ["61"], + "cqzone": ["31"], + "timezone": "-11", + "ccode": "840", + "aname": "Kure I.", + "mh": ["AL08"], + "prefix": ["AH7K", "KH7K", "NH7K", "WH7K"], + "worked": false, + "confirmed": false, + "flag": "us.png", + "pp": "KH7K", + "lat": 28.389815150417206, + "lon": -178.2976975180061, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "127": { + "dxcc": "140", + "cc": "SR", + "ccc": "SUR", + "name": "苏里南", + "continent": "SA", + "ituzone": ["12"], + "cqzone": ["9"], + "timezone": "-4", + "ccode": "740", + "aname": "Suriname", + "mh": [ + "GJ03", + "GJ04", + "GJ11", + "GJ12", + "GJ13", + "GJ14", + "GJ15", + "GJ21", + "GJ22", + "GJ23", + "GJ24", + "GJ25", + "GJ35" + ], + "prefix": ["PZ"], + "worked": false, + "confirmed": false, + "flag": "sr.png", + "pp": "PZ", + "lat": 4.439994001087058, + "lon": -55.76131687242799, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "128": { + "dxcc": "141", + "cc": "FK", + "ccc": "FLK", + "name": "福克兰群岛", + "continent": "SA", + "ituzone": ["16"], + "cqzone": ["13"], + "timezone": "-4", + "ccode": "238", + "aname": "Falkland Is.", + "mh": ["FD97", "FD98", "GD07", "GD08", "GD18"], + "prefix": ["VP8"], + "worked": false, + "confirmed": false, + "flag": "fk.png", + "pp": "VP8", + "lat": -51.65060960928611, + "lon": -59.451303155006855, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "129": { + "dxcc": "142", + "cc": "IN", + "ccc": "IND", + "name": "拉克沙威岛", + "continent": "AS", + "ituzone": ["41"], + "cqzone": ["22"], + "timezone": "6", + "ccode": "356", + "aname": "Lakshadweep Is.", + "mh": ["MJ68", "MK60", "MK61"], + "prefix": ["=VU3EBX", "VU7", "=VU7MY/JOS", "=VU7MY/RBI"], + "worked": false, + "confirmed": false, + "flag": "in.png", + "pp": "VU7", + "lat": 9.827991116821252, + "lon": 72.65432098765433, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "130": { + "dxcc": "143", + "cc": "LA", + "ccc": "LAO", + "name": "老挝", + "continent": "AS", + "ituzone": ["49"], + "cqzone": ["26"], + "timezone": "7", + "ccode": "418", + "aname": "Laos", + "mh": [ + "OK07", + "OK08", + "OK09", + "OK17", + "OK18", + "OK19", + "OK23", + "OK24", + "OK25", + "OK26", + "OK27", + "OK28", + "OK29", + "OK33", + "OK34", + "OK35", + "OK36", + "OK37", + "OL00", + "OL01", + "OL02", + "OL10", + "OL11", + "OL12", + "OL20" + ], + "prefix": ["XW", "=XW8KPL/RU3DX"], + "worked": false, + "confirmed": false, + "flag": "la.png", + "pp": "XW", + "lat": 19.683308045399514, + "lon": 102.44170096021948, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "131": { + "dxcc": "144", + "cc": "UY", + "ccc": "URY", + "name": "乌拉圭", + "continent": "SA", + "ituzone": ["14"], + "cqzone": ["13"], + "timezone": "-3", + "ccode": "858", + "aname": "Uruguay", + "mh": [ + "GF05", + "GF06", + "GF07", + "GF08", + "GF15", + "GF16", + "GF17", + "GF18", + "GF19", + "GF25", + "GF26", + "GF27", + "GF28", + "GF29", + "GF35", + "GF36", + "GF37", + "GF38" + ], + "prefix": [ + "CV", + "=CV1AA/LH", + "=CV9T/LH", + "CW", + "=CW5X/LH", + "CX", + "=CX1CAK/D", + "=CX1SI/D", + "=CX1TA/LH", + "=CX1TCR/LH", + "=CX5TR/U", + "=CX6DRA/V", + "=CX7OV/H" + ], + "worked": false, + "confirmed": false, + "flag": "uy.png", + "pp": "CX", + "lat": -33.05836684772896, + "lon": -56.172839506172835, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "132": { + "dxcc": "145", + "cc": "LV", + "ccc": "LVA", + "name": "拉脱维亚", + "continent": "EU", + "ituzone": ["29"], + "cqzone": ["15"], + "timezone": "2", + "ccode": "428", + "aname": "Latvia", + "mh": [ + "KO06", + "KO07", + "KO16", + "KO17", + "KO25", + "KO26", + "KO27", + "KO28", + "KO35", + "KO36", + "KO37", + "KO46" + ], + "prefix": [ + "YL", + "=YL/LY1CM/LH", + "=YL0A/LH", + "=YL0WFF/LH", + "=YL1A/LH", + "=YL2AG/ANT", + "=YL2SW/MM", + "=YL3AD/LGT", + "=YL3BF/LH", + "=YL3BU/LH", + "=YL3FT/LH", + "=YL3FT/P/LH", + "=YL3GED/LH", + "=YL3IZ/MM", + "=YL3JD/LH" + ], + "worked": false, + "confirmed": false, + "flag": "lv.png", + "pp": "YL", + "lat": 57.090414987387874, + "lon": 25.24691358024692, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "133": { + "dxcc": "146", + "cc": "LT", + "ccc": "LTU", + "name": "立陶宛", + "continent": "EU", + "ituzone": ["29"], + "cqzone": ["15"], + "timezone": "2", + "ccode": "440", + "aname": "Lithuania", + "mh": [ + "KO05", + "KO06", + "KO13", + "KO14", + "KO15", + "KO16", + "KO23", + "KO24", + "KO25", + "KO26", + "KO34", + "KO35" + ], + "prefix": [ + "LY", + "=LY/4X4FC/LH", + "=LY/4Z5KJ/LH", + "=LY1CM/A/LH", + "=LY1CM/LH", + "=LY1CM/P/LGT", + "=LY1CM/P/LH", + "=LY1DF/LH", + "=LY1DR/LGT", + "=LY1DS/LH", + "=LY1FW/LH", + "=LY2BIG/LH", + "=LY2DX/LGT", + "=LY2DX/LH", + "=LY2FN/LGT", + "=LY2FN/LH", + "=LY2UF/LGT", + "=LY2UF/LH", + "=LY3BW/LH", + "=LY3MU/LH", + "=LY3TT/LH", + "=LY4Y/LH", + "=LY5O/P/LH", + "=LY5W/P/LH" + ], + "worked": false, + "confirmed": false, + "flag": "lt.png", + "pp": "LY", + "lat": 55.445360257491046, + "lon": 23.518518518518523, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "134": { + "dxcc": "147", + "cc": "AU", + "ccc": "AUS", + "name": "豪勋爵岛", + "continent": "OC", + "ituzone": ["60"], + "cqzone": ["30"], + "timezone": "10", + "ccode": "36", + "aname": "Lord Howe I.", + "mh": ["QF98"], + "prefix": [ + "AX9L", + "VH9L", + "VI9L", + "VJ9L", + "=VK2GEL/9", + "=VK2IAY/9", + "=VK3AFW/9", + "=VK3TKB/9", + "=VK3YQS/9", + "=VK3YQS/VK9", + "=VK5CP/9", + "=VK9/OG1M", + "=VK9/OH1VR", + "=VK9/OH3JR", + "=VK9/OH3X", + "=VK9ALH", + "=VK9APX", + "=VK9CLF", + "=VK9DJ", + "=VK9DLX", + "=VK9EHH", + "VK9FL", + "=VK9GLX", + "=VK9HR", + "=VK9IR", + "VK9L", + "=VK9OL", + "=VK9PN", + "=VK9YL", + "VK9ZL", + "VL9L", + "VM9L", + "VN9L", + "VZ9L" + ], + "worked": false, + "confirmed": false, + "flag": "au.png", + "pp": "VK9L", + "lat": -31.496631498976733, + "lon": 159.06721536351165, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "135": { + "dxcc": "148", + "cc": "VE", + "ccc": "VEN", + "name": "委内瑞拉", + "continent": "SA", + "ituzone": ["12"], + "cqzone": ["9"], + "timezone": "-4", + "ccode": "862", + "aname": "Venezuela", + "mh": [ + "FJ37", + "FJ38", + "FJ39", + "FJ46", + "FJ47", + "FJ48", + "FJ49", + "FJ56", + "FJ57", + "FJ58", + "FJ59", + "FJ60", + "FJ61", + "FJ62", + "FJ63", + "FJ64", + "FJ65", + "FJ66", + "FJ67", + "FJ68", + "FJ69", + "FJ70", + "FJ71", + "FJ72", + "FJ73", + "FJ74", + "FJ75", + "FJ76", + "FJ77", + "FJ78", + "FJ79", + "FJ81", + "FJ82", + "FJ83", + "FJ84", + "FJ85", + "FJ86", + "FJ87", + "FJ88", + "FJ89", + "FJ94", + "FJ95", + "FJ96", + "FJ97", + "FJ98", + "FJ99", + "FK30", + "FK31", + "FK40", + "FK41", + "FK42", + "FK50", + "FK51", + "FK52", + "FK60", + "FK61", + "FK70", + "FK71", + "FK80", + "FK81", + "GJ08" + ], + "prefix": ["4M", "YV", "YW", "YX", "YY"], + "worked": false, + "confirmed": false, + "flag": "ve.png", + "pp": "YV", + "lat": 7.392904316541021, + "lon": -66.05090687395214, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "136": { + "dxcc": "149", + "cc": "PT", + "ccc": "PRT", + "name": "亚速尔群岛", + "continent": "EU", + "ituzone": ["36"], + "cqzone": ["14"], + "timezone": "-1", + "ccode": "620", + "aname": "Azores", + "mh": ["HM49", "HM58", "HM59", "HM68", "HM69", "HM76", "HM77"], + "prefix": [ + "CQ1", + "CQ8", + "=CQ8ARN/LH", + "CR1", + "CR2", + "CR8", + "CS4", + "CS8", + "CT8", + "=CT8/DK6EA/LH", + "CU", + "=CU2JU/ND", + "=CU5/CU3EJ/LH" + ], + "worked": false, + "confirmed": false, + "flag": "pt.png", + "pp": "CU", + "lat": 38.67136393188696, + "lon": -27.855509830818466, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "137": { + "dxcc": "150", + "cc": "AU", + "ccc": "AUS", + "name": "澳大利亚", + "continent": "OC", + "ituzone": ["55", "58", "59"], + "cqzone": ["29", "30"], + "timezone": "10", + "ccode": "36", + "aname": "Australia", + "mh": [ + "OF75", + "OF76", + "OF77", + "OF78", + "OF79", + "OF84", + "OF85", + "OF86", + "OF87", + "OF88", + "OF89", + "OF94", + "OF95", + "OF96", + "OF97", + "OF98", + "OF99", + "OG61", + "OG62", + "OG63", + "OG64", + "OG65", + "OG66", + "OG67", + "OG68", + "OG70", + "OG71", + "OG72", + "OG73", + "OG74", + "OG75", + "OG76", + "OG77", + "OG78", + "OG79", + "OG80", + "OG81", + "OG82", + "OG83", + "OG84", + "OG85", + "OG86", + "OG87", + "OG88", + "OG89", + "OG90", + "OG91", + "OG92", + "OG93", + "OG94", + "OG95", + "OG96", + "OG97", + "OG98", + "OG99", + "OH90", + "OH92", + "PF06", + "PF07", + "PF08", + "PF09", + "PF15", + "PF16", + "PF17", + "PF18", + "PF19", + "PF26", + "PF27", + "PF28", + "PF29", + "PF37", + "PF38", + "PF39", + "PF47", + "PF48", + "PF49", + "PF58", + "PF59", + "PF67", + "PF68", + "PF69", + "PF75", + "PF76", + "PF77", + "PF78", + "PF79", + "PF83", + "PF84", + "PF85", + "PF86", + "PF87", + "PF88", + "PF89", + "PF92", + "PF93", + "PF94", + "PF95", + "PF96", + "PF97", + "PF98", + "PF99", + "PG00", + "PG01", + "PG02", + "PG03", + "PG04", + "PG05", + "PG06", + "PG07", + "PG08", + "PG09", + "PG10", + "PG11", + "PG12", + "PG13", + "PG14", + "PG15", + "PG16", + "PG17", + "PG18", + "PG19", + "PG20", + "PG21", + "PG22", + "PG23", + "PG24", + "PG25", + "PG26", + "PG27", + "PG28", + "PG29", + "PG30", + "PG31", + "PG32", + "PG33", + "PG34", + "PG35", + "PG36", + "PG37", + "PG38", + "PG39", + "PG40", + "PG41", + "PG42", + "PG43", + "PG44", + "PG45", + "PG46", + "PG47", + "PG48", + "PG49", + "PG50", + "PG51", + "PG52", + "PG53", + "PG54", + "PG55", + "PG56", + "PG57", + "PG58", + "PG59", + "PG60", + "PG61", + "PG62", + "PG63", + "PG64", + "PG65", + "PG66", + "PG67", + "PG68", + "PG69", + "PG70", + "PG71", + "PG72", + "PG73", + "PG74", + "PG75", + "PG76", + "PG77", + "PG78", + "PG79", + "PG80", + "PG81", + "PG82", + "PG83", + "PG84", + "PG85", + "PG86", + "PG87", + "PG88", + "PG89", + "PG90", + "PG91", + "PG92", + "PG93", + "PG94", + "PG95", + "PG96", + "PG97", + "PG98", + "PG99", + "PH00", + "PH01", + "PH10", + "PH11", + "PH12", + "PH13", + "PH14", + "PH20", + "PH21", + "PH22", + "PH23", + "PH24", + "PH25", + "PH26", + "PH30", + "PH31", + "PH32", + "PH33", + "PH34", + "PH35", + "PH36", + "PH40", + "PH41", + "PH42", + "PH43", + "PH44", + "PH45", + "PH46", + "PH50", + "PH51", + "PH52", + "PH53", + "PH54", + "PH55", + "PH56", + "PH57", + "PH58", + "PH60", + "PH61", + "PH62", + "PH63", + "PH64", + "PH65", + "PH66", + "PH67", + "PH68", + "PH69", + "PH70", + "PH71", + "PH72", + "PH73", + "PH74", + "PH75", + "PH76", + "PH77", + "PH78", + "PH80", + "PH81", + "PH82", + "PH83", + "PH84", + "PH85", + "PH86", + "PH87", + "PH88", + "PH90", + "PH91", + "PH92", + "PH93", + "QE19", + "QE26", + "QE27", + "QE28", + "QE29", + "QE36", + "QE37", + "QE38", + "QE39", + "QE46", + "QE47", + "QE48", + "QE49", + "QF01", + "QF02", + "QF03", + "QF04", + "QF05", + "QF06", + "QF07", + "QF08", + "QF09", + "QF10", + "QF11", + "QF12", + "QF13", + "QF14", + "QF15", + "QF16", + "QF17", + "QF18", + "QF19", + "QF20", + "QF21", + "QF22", + "QF23", + "QF24", + "QF25", + "QF26", + "QF27", + "QF28", + "QF29", + "QF30", + "QF31", + "QF32", + "QF33", + "QF34", + "QF35", + "QF36", + "QF37", + "QF38", + "QF39", + "QF40", + "QF42", + "QF43", + "QF44", + "QF45", + "QF46", + "QF47", + "QF48", + "QF49", + "QF52", + "QF53", + "QF54", + "QF55", + "QF56", + "QF57", + "QF58", + "QF59", + "QF67", + "QF68", + "QF69", + "QG00", + "QG01", + "QG02", + "QG03", + "QG04", + "QG05", + "QG06", + "QG07", + "QG08", + "QG09", + "QG10", + "QG11", + "QG12", + "QG13", + "QG14", + "QG15", + "QG16", + "QG17", + "QG18", + "QG19", + "QG20", + "QG21", + "QG22", + "QG23", + "QG24", + "QG25", + "QG26", + "QG27", + "QG28", + "QG29", + "QG30", + "QG31", + "QG32", + "QG33", + "QG34", + "QG35", + "QG36", + "QG37", + "QG38", + "QG39", + "QG40", + "QG41", + "QG42", + "QG43", + "QG44", + "QG45", + "QG46", + "QG47", + "QG48", + "QG49", + "QG50", + "QG51", + "QG52", + "QG53", + "QG54", + "QG55", + "QG56", + "QG57", + "QG58", + "QG60", + "QG61", + "QG62", + "QG63", + "QG64", + "QG65", + "QH00", + "QH01", + "QH02", + "QH03", + "QH04", + "QH05", + "QH06", + "QH07", + "QH10", + "QH11", + "QH12", + "QH13", + "QH14", + "QH15", + "QH16", + "QH17", + "QH18", + "QH19", + "QH20", + "QH21", + "QH22", + "QH23", + "QH24", + "QH25", + "QH30", + "QH31", + "QH32", + "QH33", + "QH40" + ], + "prefix": [ + "AX", + "=AX2000/IMD", + "=AX2000/LH", + "AX4", + "AX6", + "AX8", + "=AX8AA", + "VH", + "VH4", + "VH6", + "VH8", + "VI", + "=VI103WIA", + "VI4", + "=VI5RAS/6", + "=VI5RAS/8", + "VI6", + "VI8", + "=VI90ANZAC", + "=VI90IARU", + "VJ", + "VJ4", + "VJ6", + "VJ8", + "VK", + "=VK100WIA", + "=VK1AHS/8", + "=VK1FOC/6", + "=VK1FOC/8", + "=VK1LAJ/6", + "=VK2015TDF", + "=VK2BAA/6", + "=VK2CBD/8", + "=VK2CR/8", + "=VK2CV/6", + "=VK2FDU/6", + "=VK2GR/8", + "=VK2IA/6", + "=VK2IO/8", + "=VK2RAS/6", + "=VK2ZK/8", + "=VK3BYD/8", + "=VK3DHI/8", + "=VK3DK/LH", + "=VK3DP/6", + "=VK3DXI/6", + "=VK3FPF/6", + "=VK3FPIL/6", + "=VK3JBL/6", + "=VK3KG/6", + "=VK3MCD/6", + "=VK3NUT/6", + "=VK3OHM/6", + "=VK3QB/8", + "=VK3TWO/6", + "=VK3YQS/6", + "=VK3ZK/6", + "=VK3ZK/8", + "VK4", + "=VK4FDJL/6", + "=VK4FOC/8", + "=VK4HDG/8", + "=VK4IXU/6", + "=VK4JWG/6", + "=VK4MM/LH", + "=VK4NAI/6", + "=VK4NH/6", + "=VK4SN/6", + "=VK4VXX/6", + "=VK4VXX/8", + "=VK4WIA/HQ", + "=VK4WWI/8", + "=VK5CC/6", + "=VK5CE/6", + "=VK5CE/8", + "=VK5CE/9", + "=VK5FLEA/6", + "=VK5FMAZ/6", + "=VK5HSX/8", + "=VK5HYZ/6", + "=VK5MAV/6", + "=VK5MAV/8", + "=VK5MAV/9", + "=VK5NHG/6", + "=VK5PAS/6", + "=VK5UK/8", + "=VK5WTF/8", + "VK6", + "=VK6ANZ/4", + "=VK6AV/2", + "=VK6AV/4", + "=VK6AXB/2", + "=VK6BV/AF", + "=VK6CN/4", + "=VK6DW/4", + "=VK6DW/5", + "=VK6DXI/2", + "=VK6DXI/4", + "=VK6FMON/3", + "=VK6GIO/5", + "=VK6GZ/5", + "=VK6JON/3", + "=VK6JON/4", + "=VK6JON/5", + "=VK6JON/7", + "=VK6KM/4", + "=VK6KSJ/7", + "=VK6LB/5", + "=VK6LC/4", + "=VK6MB/1", + "=VK6MB/2", + "=VK6MB/3", + "=VK6MB/5", + "=VK6NAI/4", + "=VK6NX/3", + "=VK6SX/3", + "=VK6YB/2", + "=VK6ZG/5", + "=VK6ZN/4", + "=VK6ZN/5", + "=VK6ZN/7", + "=VK6ZOA/2", + "=VK7NWT/LH", + "VK8", + "=VK8FUNN/4", + "=VK8GM/4", + "=VK8GMT/2", + "=VK8HLF/J", + "=VK8RC/4", + "=VK8XX/7", + "=VK9AR", + "=VK9AR/6", + "=VK9LA/3", + "=VK9LX/2", + "=VK9MAV", + "=VK9MAV/4", + "=VK9ZLH/3", + "=VK9ZLH/6", + "VL", + "VL4", + "VL6", + "VL8", + "VM", + "VM4", + "VM6", + "VM8", + "VN", + "VN4", + "VN6", + "VN8", + "VZ", + "VZ4", + "VZ6", + "VZ8" + ], + "worked": false, + "confirmed": false, + "flag": "au.png", + "pp": "VK", + "lat": -23.90435627714976, + "lon": 133.9814814814815, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "138": { + "dxcc": "151", + "cc": "RU", + "ccc": "RUS", + "name": "马里-维索茨克岛", + "continent": "EU", + "ituzone": ["29"], + "cqzone": ["16"], + "timezone": "3", + "ccode": "643", + "aname": "Malyj Vysotskij I.", + "mh": ["KP40"], + "prefix": [], + "worked": false, + "confirmed": false, + "flag": "ru.png", + "pp": "", + "lat": 0, + "lon": 0, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "139": { + "dxcc": "152", + "cc": "MO", + "ccc": "MAC", + "name": "中国澳门", + "continent": "AS", + "ituzone": ["44"], + "cqzone": ["24"], + "timezone": "8", + "ccode": "446", + "aname": "Macao", + "mh": ["OL61", "OL62"], + "prefix": ["XX9"], + "worked": false, + "confirmed": false, + "flag": "mo.png", + "pp": "XX9", + "lat": 22.193182, + "lon": 113.542436, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "140": { + "dxcc": "153", + "cc": "AU", + "ccc": "AUS", + "name": "麦格理岛", + "continent": "OC", + "ituzone": ["60"], + "cqzone": ["30"], + "timezone": "11", + "ccode": "36", + "aname": "Macquarie I.", + "mh": ["QD95"], + "prefix": [ + "=AX/VK0TH", + "=AX0LD", + "=AX0MQI", + "=AX0MT", + "=AX0TH", + "=VK0AI", + "=VK0AVT", + "=VK0KEV", + "=VK0M/ZL4DB/P", + "=VK0MM", + "=VK0MQI", + "=VK0MT", + "=VK0TH", + "=ZL4DB/P/VK0M" + ], + "worked": false, + "confirmed": false, + "flag": "au.png", + "pp": "VK0M", + "lat": -54.601393678482594, + "lon": 158.84773662551441, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "142": { + "dxcc": "157", + "cc": "NR", + "ccc": "NRU", + "name": "瑙鲁", + "continent": "OC", + "ituzone": ["65"], + "cqzone": ["31"], + "timezone": "12", + "ccode": "520", + "aname": "Nauru", + "mh": ["RI39"], + "prefix": ["C2"], + "worked": false, + "confirmed": false, + "flag": "nr.png", + "pp": "C2", + "lat": -0.4226959573314275, + "lon": 166.90951582583952, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "143": { + "dxcc": "158", + "cc": "VU", + "ccc": "VUT", + "name": "瓦努阿图", + "continent": "OC", + "ituzone": ["56"], + "cqzone": ["32"], + "timezone": "11", + "ccode": "548", + "aname": "Vanuatu", + "mh": [ + "RG49", + "RH33", + "RH34", + "RH35", + "RH36", + "RH40", + "RH41", + "RH42", + "RH43", + "RH44", + "RH45", + "RH50" + ], + "prefix": ["YJ"], + "worked": false, + "confirmed": false, + "flag": "vu.png", + "pp": "YJ", + "lat": -15.05021684444823, + "lon": 166.8724279835391, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "144": { + "dxcc": "159", + "cc": "MV", + "ccc": "MDV", + "name": "马尔代夫", + "continent": "AS", + "ituzone": ["41"], + "cqzone": ["22"], + "timezone": "5", + "ccode": "462", + "aname": "Maldives", + "mh": [ + "MI69", + "MJ60", + "MJ61", + "MJ62", + "MJ63", + "MJ64", + "MJ65", + "MJ66", + "MJ67" + ], + "prefix": ["8Q"], + "worked": false, + "confirmed": false, + "flag": "mv.png", + "pp": "8Q", + "lat": 3.8243176733476503, + "lon": 73.14814814814815, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "145": { + "dxcc": "160", + "cc": "TO", + "ccc": "TON", + "name": "汤加", + "continent": "OC", + "ituzone": ["62"], + "cqzone": ["32"], + "timezone": "13", + "ccode": "776", + "aname": "Tonga", + "mh": ["AG28", "AG29", "AH20", "AH21", "AH24", "AH31"], + "prefix": ["A3", "=A35JP/H", "=A35TN/N", "=A35TN/V", "=A35ZG/H"], + "worked": false, + "confirmed": false, + "flag": "to.png", + "pp": "A3", + "lat": -19.838223624605902, + "lon": -175.02057613168722, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "146": { + "dxcc": "161", + "cc": "CO", + "ccc": "COL", + "name": "马尔佩洛岛", + "continent": "SA", + "ituzone": ["12"], + "cqzone": ["9"], + "timezone": "-5", + "ccode": "170", + "aname": "Malpelo I.", + "mh": ["EJ93"], + "prefix": [ + "HJ0M", + "HK0M", + "=HK0NA", + "=HK0TU", + "=HK3JJH/0M", + "=HK5MQZ/0", + "=HK5MQZ/0M", + "=HK5QGX/0", + "=HK5QGX/0M" + ], + "worked": false, + "confirmed": false, + "flag": "co.png", + "pp": "HK0/m", + "lat": 3.996146520355751, + "lon": -81.63389727175735, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "147": { + "dxcc": "162", + "cc": "NC", + "ccc": "NCL", + "name": "新喀里多尼亚", + "continent": "OC", + "ituzone": ["56"], + "cqzone": ["32"], + "timezone": "11", + "ccode": "540", + "aname": "New Caledonia", + "mh": [ + "QH90", + "RG19", + "RG27", + "RG28", + "RG29", + "RG37", + "RG38", + "RG39", + "RG48", + "RG57", + "RH10" + ], + "prefix": [ + "FK", + "=FK8VHY/P", + "=T8HRC", + "=TX1A", + "=TX1B", + "=TX1CW", + "=TX3SAM", + "=TX4A", + "=TX5CW", + "=TX5FS", + "=TX8B", + "=TX8C", + "=TX8CW", + "=TX8D", + "=TX8F", + "=TX8JOTA", + "=TX8NC", + "=TX90IARU" + ], + "worked": false, + "confirmed": false, + "flag": "nc.png", + "pp": "FK", + "lat": -21.07203173407723, + "lon": 165.47325102880657, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "148": { + "dxcc": "163", + "cc": "PG", + "ccc": "PNG", + "name": "巴布亚纽几内亚", + "continent": "OC", + "ituzone": ["51"], + "cqzone": ["28"], + "timezone": "10", + "ccode": "598", + "aname": "Papua New Guinea", + "mh": [ + "QH39", + "QH49", + "QH59", + "QH68", + "QH69", + "QH78", + "QI00", + "QI01", + "QI02", + "QI03", + "QI04", + "QI05", + "QI06", + "QI07", + "QI10", + "QI11", + "QI12", + "QI13", + "QI14", + "QI15", + "QI16", + "QI17", + "QI18", + "QI21", + "QI22", + "QI23", + "QI24", + "QI25", + "QI26", + "QI28", + "QI30", + "QI31", + "QI32", + "QI33", + "QI34", + "QI35", + "QI36", + "QI37", + "QI38", + "QI40", + "QI41", + "QI42", + "QI43", + "QI44", + "QI45", + "QI46", + "QI47", + "QI48", + "QI50", + "QI51", + "QI52", + "QI53", + "QI54", + "QI55", + "QI56", + "QI57", + "QI60", + "QI61", + "QI62", + "QI63", + "QI64", + "QI65", + "QI66", + "QI67", + "QI72", + "QI73", + "QI74", + "QI75", + "QI76", + "QI83", + "QI95" + ], + "prefix": ["P2"], + "worked": false, + "confirmed": false, + "flag": "pg.png", + "pp": "P2", + "lat": -7.060253648336911, + "lon": 145.4732510288066, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "150": { + "dxcc": "165", + "cc": "MU", + "ccc": "MUS", + "name": "毛里求斯", + "continent": "AF", + "ituzone": ["53"], + "cqzone": ["39"], + "timezone": "4", + "ccode": "480", + "aname": "Mauritius", + "mh": ["LG89", "LH80"], + "prefix": ["3B8"], + "worked": false, + "confirmed": false, + "flag": "mu.png", + "pp": "3B8", + "lat": -20.2505911140305, + "lon": 57.75034293552812, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "151": { + "dxcc": "166", + "cc": "US", + "ccc": "USA", + "name": "马利亚纳群岛", + "continent": "OC", + "ituzone": ["64"], + "cqzone": ["27"], + "timezone": "10", + "ccode": "840", + "aname": "Mariana Is.", + "mh": ["QK24", "QK25", "QK26", "QK27", "QK28", "QK29", "QL20"], + "prefix": [ + "=AB2HV", + "=AB2QH", + "=AB9HF", + "=AB9OQ", + "=AC8CP", + "=AD5KT", + "=AD6YP", + "=AE6OG", + "=AF4IN", + "=AF4KH", + "=AF6EO", + "AH0", + "=AH2U", + "=AJ6K", + "=AK1JA", + "=K0FRI", + "=K8KH", + "=K8RN", + "=KB5UAB", + "=KB9LQG", + "=KC2WIK", + "=KC5SPG", + "=KC7SDC", + "=KC9GQX", + "=KD7GJX", + "=KF7COQ", + "=KG2QH", + "=KG6GQ", + "=KG6SB", + "=KG7DCN", + "KH0", + "=KH0EN/KT", + "=KH2GV", + "=KH2O", + "=KH2VL", + "=KL7QOL", + "=KW2X", + "=N3QD", + "=N6EAX", + "=N7NVX", + "=N8CS", + "=NA1M", + "NH0", + "=NH2B", + "=NH2FG", + "=NO3V", + "=NS0C", + "=NU2A", + "=W1FPU", + "=W3FM", + "=W3NL", + "=W3STX", + "=W7KFS", + "=WA6AC", + "=WE1J", + "WH0", + "=WH6ZW", + "=WO2G" + ], + "worked": false, + "confirmed": false, + "flag": "us.png", + "pp": "KH0", + "lat": 16.48471121840069, + "lon": 145.67901234567898, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "152": { + "dxcc": "167", + "cc": "SE", + "ccc": "SWE", + "name": "马凯特礁", + "continent": "EU", + "ituzone": ["18"], + "cqzone": ["15"], + "timezone": "2", + "ccode": "752", + "aname": "Market Reef", + "mh": ["JP90"], + "prefix": ["OJ0"], + "worked": false, + "confirmed": false, + "flag": "ax.png", + "pp": "OJ0", + "lat": 60.300833, + "lon": 19.131389, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "153": { + "dxcc": "168", + "cc": "MH", + "ccc": "MHL", + "name": "马歇尔岛", + "continent": "OC", + "ituzone": ["65"], + "cqzone": ["31"], + "timezone": "12", + "ccode": "584", + "aname": "Marshall Is.", + "mh": [ + "RJ29", + "RJ38", + "RJ39", + "RJ45", + "RJ46", + "RJ47", + "RJ48", + "RJ49", + "RJ56", + "RJ57", + "RJ58", + "RJ59", + "RJ66", + "RK11", + "RK21", + "RK31", + "RK40", + "RK41", + "RK44" + ], + "prefix": ["V7"], + "worked": false, + "confirmed": false, + "flag": "mh.png", + "pp": "V7", + "lat": 9.909077825456976, + "lon": 167.7777777777778, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "154": { + "dxcc": "169", + "cc": "YT", + "ccc": "MYT", + "name": "马约特岛", + "continent": "AF", + "ituzone": ["53"], + "cqzone": ["39"], + "timezone": "3", + "ccode": "175", + "aname": "Mayotte", + "mh": ["LH26", "LH27"], + "prefix": [ + "FH", + "=TO0X", + "=TO2FH", + "=TO2TT", + "=TO4M", + "=TO6OK", + "=TO7BC", + "=TO7RJ", + "=TO8MZ", + "=TX0P", + "=TX5M", + "=TX5NK", + "=TX7LX" + ], + "worked": false, + "confirmed": false, + "flag": "yt.png", + "pp": "FH", + "lat": -12.697692822566268, + "lon": 45.078494131992066, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "155": { + "dxcc": "170", + "cc": "NZ", + "ccc": "NZL", + "name": "纽西兰", + "continent": "OC", + "ituzone": ["60"], + "cqzone": ["32"], + "timezone": "12", + "ccode": "554", + "aname": "New Zealand", + "mh": [ + "AE15", + "AE16", + "AF09", + "AG10", + "RD29", + "RD39", + "RD47", + "RE32", + "RE33", + "RE34", + "RE35", + "RE42", + "RE43", + "RE44", + "RE45", + "RE46", + "RE53", + "RE54", + "RE55", + "RE56", + "RE57", + "RE58", + "RE66", + "RE67", + "RE68", + "RE69", + "RE77", + "RE78", + "RE79", + "RE88", + "RE89", + "RE90", + "RE92", + "RF60", + "RF63", + "RF64", + "RF65", + "RF70", + "RF71", + "RF72", + "RF73", + "RF74", + "RF80", + "RF81", + "RF82", + "RF90", + "RF91", + "RF92" + ], + "prefix": [ + "ZK", + "ZL", + "=ZL1AB/LH", + "=ZL1CT/MM", + "=ZL2ARG/LH", + "=ZL2III/LH", + "=ZL2VH/LH", + "ZL50", + "=ZL6A/HQ", + "=ZL6LH/LH", + "=ZL75KO", + "=ZL80FOC", + "=ZL90IARU", + "ZM", + "=ZM50GW", + "=ZM50LA", + "=ZM50MAUQ", + "=ZM80WB" + ], + "worked": false, + "confirmed": false, + "flag": "nz.png", + "pp": "ZL", + "lat": -41.49051786107231, + "lon": 173.62139917695475, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "156": { + "dxcc": "171", + "cc": "AU", + "ccc": "AUS", + "name": "梅利什礁", + "continent": "OC", + "ituzone": ["55"], + "cqzone": ["30"], + "timezone": "10", + "ccode": "36", + "aname": "Mellish Reef", + "mh": ["QH72"], + "prefix": [ + "AX9M", + "VH9M", + "VI9M", + "VJ9M", + "=VK9GMW", + "VK9M", + "VL9M", + "VM9M", + "VN9M", + "VZ9M" + ], + "worked": false, + "confirmed": false, + "flag": "au.png", + "pp": "VK9M", + "lat": -17.289758757324236, + "lon": 155.811614083219, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "157": { + "dxcc": "172", + "cc": "PN", + "ccc": "PCN", + "name": "皮特凯恩群岛", + "continent": "OC", + "ituzone": ["63"], + "cqzone": ["32"], + "timezone": "-9", + "ccode": "612", + "aname": "Pitcairn I.", + "mh": ["CG44", "CG55", "CG75"], + "prefix": ["VP6"], + "worked": false, + "confirmed": false, + "flag": "pn.png", + "pp": "VP6", + "lat": -25.059111102923353, + "lon": -130.10211857948485, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "158": { + "dxcc": "173", + "cc": "FM", + "ccc": "FSM", + "name": "密克罗尼西亚", + "continent": "OC", + "ituzone": ["64", "65"], + "cqzone": ["27"], + "timezone": "11", + "ccode": "583", + "aname": "Micronesia", + "mh": [ + "PJ99", + "QJ16", + "QJ17", + "QJ37", + "QJ46", + "QJ47", + "QJ48", + "QJ57", + "QJ58", + "QJ65", + "QJ86", + "QJ87", + "QJ96", + "QJ97", + "RJ15" + ], + "prefix": [ + "V6", + "=V63JQ/C", + "=V63JQ/K", + "=V63JY/C", + "=V63JY/K", + "=V63OP/C", + "=V63OP/K", + "=V63VE/C", + "=V63VE/K" + ], + "worked": false, + "confirmed": false, + "flag": "fm.png", + "pp": "V6", + "lat": 7.223585482852656, + "lon": 142.2039323273891, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "159": { + "dxcc": "174", + "cc": "US", + "ccc": "USA", + "name": "中途岛", + "continent": "OC", + "ituzone": ["61"], + "cqzone": ["31"], + "timezone": "-11", + "ccode": "840", + "aname": "Midway I.", + "mh": ["AL08", "AL18"], + "prefix": ["AH4", "KH4", "NH4", "WH4"], + "worked": false, + "confirmed": false, + "flag": "us.png", + "pp": "KH4", + "lat": 28.25977775301854, + "lon": -177.38827075818392, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "160": { + "dxcc": "175", + "cc": "PF", + "ccc": "PYF", + "name": "法属波利尼西亚", + "continent": "OC", + "ituzone": ["63"], + "cqzone": ["32"], + "timezone": "-10", + "ccode": "258", + "aname": "French Polynesia", + "mh": [ + "BG37", + "BG47", + "BG56", + "BG66", + "BG72", + "BG82", + "BG89", + "BG98", + "BH42", + "BH43", + "BH44", + "BH52", + "BH53", + "BH54", + "BH63", + "BH64", + "BH70", + "BH74", + "BI90", + "BI91", + "BI92", + "CG07", + "CG26", + "CH09", + "CI00", + "CI01" + ], + "prefix": [ + "FO", + "=FO0MIC/MM3", + "=TX0A", + "=TX0M", + "=TX2AH", + "=TX3T", + "=TX4FO", + "=TX4T", + "=TX5EG", + "=TX5J", + "=TX5JF", + "=TX5TES", + "=TX5X", + "=TX6A", + "=TX6T", + "=TX6T/P", + "=TX7EME" + ], + "worked": false, + "confirmed": false, + "flag": "pf.png", + "pp": "FO", + "lat": -18.204271308671764, + "lon": -142.42798353909464, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "161": { + "dxcc": "176", + "cc": "FJ", + "ccc": "FJI", + "name": "斐济", + "continent": "OC", + "ituzone": ["56"], + "cqzone": ["32"], + "timezone": "12", + "ccode": "242", + "aname": "Fiji", + "mh": [ + "AG09", + "AH00", + "AH01", + "AH02", + "AH03", + "AH04", + "RH80", + "RH81", + "RH82", + "RH83", + "RH87", + "RH90", + "RH91", + "RH92", + "RH93" + ], + "prefix": ["3D2", "=3D5X"], + "worked": false, + "confirmed": false, + "flag": "fj.png", + "pp": "3D2", + "lat": -17.638694376458602, + "lon": 177.97896662094192, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "162": { + "dxcc": "177", + "cc": "JP", + "ccc": "JPN", + "name": "南鸟岛", + "continent": "OC", + "ituzone": ["90"], + "cqzone": ["27"], + "timezone": "10", + "ccode": "392", + "aname": "Minami Torishima", + "mh": ["QL64"], + "prefix": [ + "=8J1ZIU/JD1", + "=8N1AQ/JD1", + "=JA6GXK/JD1", + "=JD1/8J1ZIU", + "=JD1/8N1AQ", + "=JD1/JA6GXK", + "=JD1/JD1BIC", + "=JD1/JD1BNA", + "=JD1/JD1YAB", + "=JD1/JE6XPF", + "=JD1/JF3CTR", + "=JD1/JF8HIQ", + "=JD1/JG1RHN", + "=JD1/JG8NQJ", + "=JD1/JH1EFP", + "=JD1/JI2AMA", + "=JD1/JK1PCN", + "=JD1/JR8XXQ", + "=JD1BCK", + "=JD1BIC/JD1", + "=JD1BME", + "=JD1BMM", + "=JD1BNA/JD1", + "=JD1BND", + "=JD1M/JI2AMA", + "=JD1YAA", + "=JD1YAB/JD1", + "=JD1YBJ", + "=JF3CTR/JD1", + "=JF8HIQ/JD1", + "=JG1RHN/JD1", + "=JG8NQJ/JD1", + "=JH1EFP/JD1", + "=JI2AMA/JD1", + "=JK1PCN/JD1", + "=JR8XXQ/JD1" + ], + "worked": false, + "confirmed": false, + "flag": "jp.png", + "pp": "JD/m", + "lat": 24.282680163886155, + "lon": 153.9759258318421, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "164": { + "dxcc": "179", + "cc": "MD", + "ccc": "MDA", + "name": "摩尔多瓦", + "continent": "EU", + "ituzone": ["29"], + "cqzone": ["16"], + "timezone": "3", + "ccode": "498", + "aname": "Moldova", + "mh": ["KN37", "KN38", "KN45", "KN46", "KN47", "KN48"], + "prefix": ["ER", "=ER3AC/FF", "=ER3CR/FF", "=ER4LX/FF"], + "worked": false, + "confirmed": false, + "flag": "md.png", + "pp": "ER", + "lat": 47.29266562633404, + "lon": 28.58710562414266, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "165": { + "dxcc": "180", + "cc": "GR", + "ccc": "GRC", + "name": "阿索斯圣山", + "continent": "EU", + "ituzone": ["28"], + "cqzone": ["20"], + "timezone": "2", + "ccode": "300", + "aname": "Mount Athos", + "mh": ["KN10"], + "prefix": [ + "=SV2/SV1RP/T", + "=SV2ASP", + "=SV2ASP/A", + "=SV2ASP/P", + "=SV2RSG/A", + "=SY2A" + ], + "worked": false, + "confirmed": false, + "flag": "gr.png", + "pp": "SV/a", + "lat": 40.327162946933925, + "lon": 24.17924096936442, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "166": { + "dxcc": "181", + "cc": "MZ", + "ccc": "MOZ", + "name": "莫桑比克", + "continent": "AF", + "ituzone": ["53"], + "cqzone": ["37"], + "timezone": "2", + "ccode": "508", + "aname": "Mozambique", + "mh": [ + "KG53", + "KG54", + "KG55", + "KG56", + "KG57", + "KG58", + "KG63", + "KG64", + "KG65", + "KG66", + "KG67", + "KG68", + "KG69", + "KG74", + "KG75", + "KG76", + "KG77", + "KG78", + "KG79", + "KH53", + "KH54", + "KH55", + "KH60", + "KH61", + "KH62", + "KH63", + "KH64", + "KH65", + "KH66", + "KH70", + "KH71", + "KH72", + "KH73", + "KH74", + "KH75", + "KH76", + "KH77", + "KH78", + "KH80", + "KH81", + "KH82", + "KH83", + "KH84", + "KH85", + "KH86", + "KH87", + "KH88", + "KH92", + "KH93", + "KH94", + "KH95", + "KH96", + "KH97", + "KH98", + "KH99", + "LH03", + "LH04", + "LH05", + "LH06", + "LH07", + "LH08", + "LH09" + ], + "prefix": ["C8", "C9", "=C98DC/YL"], + "worked": false, + "confirmed": false, + "flag": "mz.png", + "pp": "C9", + "lat": -18.555746963979672, + "lon": 33.88888888888889, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "167": { + "dxcc": "182", + "cc": "US", + "ccc": "USA", + "name": "纳瓦萨岛", + "continent": "NA", + "ituzone": ["11"], + "cqzone": ["8"], + "timezone": "-5", + "ccode": "840", + "aname": "Navassa I.", + "mh": ["FK28"], + "prefix": ["KP1", "NP1", "WP1"], + "worked": false, + "confirmed": false, + "flag": "us.png", + "pp": "KP1", + "lat": 18.393678277500243, + "lon": -75.05088993886433, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "170": { + "dxcc": "185", + "cc": "SB", + "ccc": "SLB", + "name": "所罗门群岛", + "continent": "OC", + "ituzone": ["51"], + "cqzone": ["28"], + "timezone": "11", + "ccode": "90", + "aname": "Solomon Is.", + "mh": [ + "QH98", + "QI72", + "QI73", + "QI81", + "QI82", + "QI83", + "QI90", + "QI91", + "QI92", + "QI94", + "RH08", + "RH09", + "RH19", + "RH29", + "RH38", + "RH39", + "RH47", + "RI00", + "RI01", + "RI02", + "RI11", + "RI30" + ], + "prefix": ["H4", "=H40/H44RK"], + "worked": false, + "confirmed": false, + "flag": "sb.png", + "pp": "H4", + "lat": -9.33370610944084, + "lon": 159.7859404901014, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "171": { + "dxcc": "187", + "cc": "NE", + "ccc": "NER", + "name": "尼日尔", + "continent": "AF", + "ituzone": ["46"], + "cqzone": ["35"], + "timezone": "1", + "ccode": "562", + "aname": "Niger", + "mh": [ + "JK02", + "JK03", + "JK04", + "JK05", + "JK11", + "JK12", + "JK13", + "JK14", + "JK15", + "JK16", + "JK22", + "JK23", + "JK24", + "JK25", + "JK26", + "JK27", + "JK28", + "JK29", + "JK33", + "JK34", + "JK35", + "JK36", + "JK37", + "JK38", + "JK39", + "JK42", + "JK43", + "JK44", + "JK45", + "JK46", + "JK47", + "JK48", + "JK49", + "JK52", + "JK53", + "JK54", + "JK55", + "JK56", + "JK57", + "JK58", + "JK59", + "JK63", + "JK64", + "JK65", + "JK66", + "JK67", + "JK68", + "JK69", + "JK75", + "JK76", + "JK77", + "JK78", + "JK79", + "JL30", + "JL31", + "JL40", + "JL41", + "JL42", + "JL50", + "JL51", + "JL52", + "JL53", + "JL60", + "JL61", + "JL62", + "JL63", + "JL70", + "JL71", + "JL72" + ], + "prefix": ["5U"], + "worked": false, + "confirmed": false, + "flag": "ne.png", + "pp": "5U", + "lat": 17.616905536984675, + "lon": 8.580246913580241, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "172": { + "dxcc": "188", + "cc": "NU", + "ccc": "NIU", + "name": "纽埃", + "continent": "OC", + "ituzone": ["62"], + "cqzone": ["32"], + "timezone": "-11", + "ccode": "570", + "aname": "Niue", + "mh": ["AH50", "AH51"], + "prefix": ["E6"], + "worked": false, + "confirmed": false, + "flag": "nu.png", + "pp": "E6", + "lat": -18.958401684407605, + "lon": -169.9131229995428, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "173": { + "dxcc": "189", + "cc": "NF", + "ccc": "NFK", + "name": "诺福克岛", + "continent": "OC", + "ituzone": ["60"], + "cqzone": ["32"], + "timezone": "12", + "ccode": "574", + "aname": "Norfolk I.", + "mh": ["RG30", "RG31"], + "prefix": [ + "AX9", + "=AX9YL", + "VH9", + "VI9", + "VJ9", + "=VK2ACC/9", + "=VK2CA/9", + "=VK2FBBB/9", + "=VK2XSE/9", + "=VK3CBV/9", + "=VK3GK/9", + "=VK3PF/9", + "=VK3QB/9", + "=VK3TWO/9", + "=VK3YB/9", + "=VK4FSCC/9", + "=VK4HNS/9", + "=VK5FMAZ/9", + "=VK6FMON/9", + "VK9", + "=VK9CNC", + "=VK9CNF", + "=VK9LX/9", + "=VK9WI", + "=VK9XIC", + "VL9", + "VM9", + "VN9", + "VZ9" + ], + "worked": false, + "confirmed": false, + "flag": "nf.png", + "pp": "VK9N", + "lat": -28.936607198410243, + "lon": 167.84636488340195, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "174": { + "dxcc": "190", + "cc": "WS", + "ccc": "WSM", + "name": "萨摩亚", + "continent": "OC", + "ituzone": ["62"], + "cqzone": ["32"], + "timezone": "-11", + "ccode": "882", + "aname": "Samoa", + "mh": ["AH36", "AH45", "AH46"], + "prefix": ["5W"], + "worked": false, + "confirmed": false, + "flag": "ws.png", + "pp": "5W", + "lat": -13.801462043237919, + "lon": -172.10791037951537, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "175": { + "dxcc": "191", + "cc": "NZ", + "ccc": "NZL", + "name": "北库克群岛", + "continent": "OC", + "ituzone": ["62"], + "cqzone": ["32"], + "timezone": "-11", + "ccode": "554", + "aname": "North Cook Is.", + "mh": ["BI00", "BI01", "BI10", "BI11"], + "prefix": [ + "=E50W", + "=E51AMF", + "=E51LYC", + "=E51M", + "=E51MAN", + "=E51MBX", + "=E51MKW", + "=E51MQT", + "=E51PDX", + "=E51PEN", + "=E51PT", + "=E51QMA", + "=E51QQQ", + "=E51TUG", + "=E51UFF", + "=E51WL", + "=E51WWB", + "=ZK1/AC4LN/N", + "=ZK1HCC", + "=ZK1KDN", + "=ZK1MA", + "=ZK1NCF", + "=ZK1NCI", + "=ZK1NCP", + "=ZK1NDK", + "=ZK1NJC", + "=ZK1QMA", + "=ZK1TTG", + "=ZK1TUG", + "=ZK1WL" + ], + "worked": false, + "confirmed": false, + "flag": "nz.png", + "pp": "E5/n", + "lat": -9.990144492126305, + "lon": -161.02880658436214, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "176": { + "dxcc": "192", + "cc": "JP", + "ccc": "JPN", + "name": "小笠原岛", + "continent": "AS", + "ituzone": ["45"], + "cqzone": ["27"], + "timezone": "10", + "ccode": "392", + "aname": "Ogasawara", + "mh": ["QL16", "QL17"], + "prefix": ["=8N1OGA", "JD1", "=JR7ISY/JD1/CM"], + "worked": false, + "confirmed": false, + "flag": "jp.png", + "pp": "JD/o", + "lat": 27.1032582682778, + "lon": 142.1653203271859, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "177": { + "dxcc": "193", + "cc": "JP", + "ccc": "JPN", + "name": "琉球群岛", + "continent": "AS", + "ituzone": ["45"], + "cqzone": ["25"], + "timezone": "0", + "ccode": "392", + "aname": "Okinawa (Ryukyu Is.)", + "mh": ["PL36", "PL37", "PL46", "PL47"], + "prefix": [], + "worked": false, + "confirmed": false, + "flag": "xx.png", + "pp": "", + "lat": 0, + "lon": 0, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "179": { + "dxcc": "195", + "cc": "GQ", + "ccc": "GNQ", + "name": "安诺本岛", + "continent": "AF", + "ituzone": ["52"], + "cqzone": ["36"], + "timezone": "-1", + "ccode": "226", + "aname": "Annobon I.", + "mh": ["JI28"], + "prefix": ["3C0"], + "worked": false, + "confirmed": false, + "flag": "gq.png", + "pp": "3C0", + "lat": -1.4264644118711374, + "lon": 5.6149977137631435, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "181": { + "dxcc": "197", + "cc": "US", + "ccc": "USA", + "name": "巴尔米拉岛", + "continent": "OC", + "ituzone": ["61", "62"], + "cqzone": ["31"], + "timezone": "-11", + "ccode": "840", + "aname": "Palmyra & Jarvis Is.", + "mh": ["AJ85"], + "prefix": ["AH5", "KH5", "NH5", "WH5"], + "worked": false, + "confirmed": false, + "flag": "us.png", + "pp": "KH5", + "lat": -0.24691281599523052, + "lon": -160.0411522633745, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "183": { + "dxcc": "199", + "cc": "NO", + "ccc": "NOR", + "name": "彼得一世岛", + "continent": "AN", + "ituzone": ["72"], + "cqzone": ["12"], + "timezone": "-6", + "ccode": "578", + "aname": "Peter I I.", + "mh": ["EC41"], + "prefix": ["=3Y0X"], + "worked": false, + "confirmed": false, + "flag": "no.png", + "pp": "3Y/p", + "lat": -68.84020992864185, + "lon": -90.55326931870141, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "185": { + "dxcc": "201", + "cc": "ZA", + "ccc": "ZAF", + "name": "爱德华王子岛", + "continent": "AF", + "ituzone": ["57"], + "cqzone": ["38"], + "timezone": "3", + "ccode": "710", + "aname": "Prince Edward & Marion Is.", + "mh": ["KE83"], + "prefix": ["ZR8", "ZS8", "ZT8", "ZU8"], + "worked": false, + "confirmed": false, + "flag": "za.png", + "pp": "ZS8", + "lat": -46.904392041921504, + "lon": 37.73340784771972, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "186": { + "dxcc": "202", + "cc": "PR", + "ccc": "PRI", + "name": "波多黎各", + "continent": "NA", + "ituzone": ["11"], + "cqzone": ["8"], + "timezone": "-4", + "ccode": "630", + "aname": "Puerto Rico", + "mh": ["FK67", "FK68", "FK77", "FK78"], + "prefix": [ + "=AA2ZN", + "=AB2DR", + "=AF4OU", + "=AF5IZ", + "=AG4CD", + "=AI4EZ", + "=K1NDN", + "=K4C/LH", + "=K4LCR", + "=K4PFH", + "=K5YJR", + "=K6BOT", + "=K9JOS", + "=KA2GNG", + "=KA2MBR", + "=KA2UCX", + "=KA2YGB", + "=KA3ZGQ", + "=KA7URH", + "=KA9UTY", + "=KB0AQB", + "=KB0JRR", + "=KB0TEP", + "=KB1CKX", + "=KB1IJU", + "=KB1KDP", + "=KB1RUQ", + "=KB1TUA", + "=KB1UEK", + "=KB1UZV", + "=KB1ZKF", + "=KB2ALR", + "=KB2CIE", + "=KB2KWB", + "=KB2MMX", + "=KB2NMT", + "=KB2NYN", + "=KB2OIF", + "=KB2OMN", + "=KB2OPM", + "=KB2QQK", + "=KB2RYP", + "=KB2TID", + "=KB2VHY", + "=KB2WKT", + "=KB2YKJ", + "=KB3BPK", + "=KB3BTN", + "=KB3LUV", + "=KB3SBO", + "=KB8ZVP", + "=KB9OWX", + "=KB9RZD", + "=KB9YVE", + "=KB9YVF", + "=KC1CRV", + "=KC1CUF", + "=KC1DRV", + "=KC1IHB", + "=KC1IHO", + "=KC1JLY", + "=KC1KZI", + "=KC2BZZ", + "=KC2CJL", + "=KC2CTM", + "=KC2DUO", + "=KC2EMM", + "=KC2ERU", + "=KC2JNE", + "=KC2LET", + "=KC2TE", + "=KC2UXP", + "=KC2VCR", + "=KC3GEO", + "=KC5DKT", + "=KC8BFN", + "=KC8IRI", + "=KD2KPC", + "=KD2VQ", + "=KD4TVS", + "=KD5DVV", + "=KD5PKH", + "=KD9GIZ", + "=KD9MRY", + "=KE0AYJ", + "=KE0GFK", + "=KE0SH", + "=KE1MA", + "=KE3WW", + "=KE4GGD", + "=KE4GYA", + "=KE4SKH", + "=KE4THL", + "=KE4WUE", + "=KE5LNG", + "=KF4KPO", + "=KF4ZDB", + "=KF6OGJ", + "=KG4EEG", + "=KG4EEL", + "=KG4GYO", + "=KG4IRC", + "=KG4IVO", + "=KG4VCC", + "=KG5AFY", + "=KH2RU", + "=KH4AA", + "=KI4LRJ", + "=KI4RGF", + "=KI4WOA", + "=KI4WOB", + "=KJ4KZN", + "=KJ4LOZ", + "=KJ4UPN", + "=KJ6OV", + "=KK4AOZ", + "=KK4DCX", + "=KK4EBE", + "=KK4PHB", + "=KM4VDZ", + "=KM4WGI", + "=KM4YBN", + "=KM4YSR", + "=KM4ZJW", + "=KM6CTO", + "=KN4AWH", + "=KN4GNO", + "=KN4IBD", + "=KN4IDV", + "=KN4IGP", + "=KN4ILO", + "=KN4INP", + "=KN4JCC", + "=KN4KPX", + "=KN4KPY", + "=KN4MNT", + "=KN4NLZ", + "=KN4ODN", + "=KN4QBT", + "=KN4QZZ", + "=KN4REC", + "=KN4SKZ", + "=KN4TNC", + "=KN4UAN", + "=KP2H", + "=KP2Z", + "KP3", + "=KP3CW/SKP", + "=KP3RE/LGT", + "=KP3RE/LH", + "=KP3RE/LT", + "KP4", + "=KP4ES/L", + "=KP4ES/LGT", + "=KP4ES/LH", + "=KP4FD/IARU", + "=KP4FRD/LH", + "=KP4MD/P", + "=KP4VP/LH", + "=N0XAR", + "=N1CN", + "=N1HRV", + "=N1JFL", + "=N1QVU", + "=N1SCD", + "=N1SZM", + "=N1VCW", + "=N1YAY", + "=N1ZJC", + "=N2IBR", + "=N2KKN", + "=N2KUE", + "=N2OUS", + "=N2PGO", + "=N3JAM", + "=N3VIJ", + "=N3YUB", + "=N3ZII", + "=N4CIE", + "=N4JZD", + "=N4LER", + "=N4UK", + "=N6NVD", + "=N6RHF", + "=NB0G", + "NP3", + "=NP3M/LH", + "NP4", + "=NP4VO/LH", + "=W1AW/PR", + "=W6WAW", + "=W9JS", + "=WA2RVA", + "=WB2HMY", + "=WB5YOF", + "=WB7ADC", + "=WB7VVV", + "=WD4LOL", + "WP3", + "WP4", + "=WP4L/TP", + "=WR8Z" + ], + "worked": false, + "confirmed": false, + "flag": "pr.png", + "pp": "KP4", + "lat": 18.288227614374364, + "lon": -66.48986434994666, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "187": { + "dxcc": "203", + "cc": "AD", + "ccc": "AND", + "name": "安道尔", + "continent": "EU", + "ituzone": ["27"], + "cqzone": ["14"], + "timezone": "1", + "ccode": "20", + "aname": "Andorra", + "mh": ["JN02"], + "prefix": ["C3"], + "worked": false, + "confirmed": false, + "flag": "ad.png", + "pp": "C3", + "lat": 42.565036867075946, + "lon": 1.622155610876843, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "188": { + "dxcc": "204", + "cc": "MX", + "ccc": "MEX", + "name": "雷维亚希赫多群岛", + "continent": "NA", + "ituzone": ["10"], + "cqzone": ["6"], + "timezone": "-7", + "ccode": "484", + "aname": "Revillagigedo", + "mh": ["DK28"], + "prefix": [ + "4A4", + "4B4", + "4C4", + "6D4", + "6E4", + "6F4", + "6G4", + "6H4", + "6I4", + "6J4", + "XA4", + "XB4", + "XC4", + "XD4", + "XE4", + "XF4", + "XG4", + "XH4", + "XI4" + ], + "worked": false, + "confirmed": false, + "flag": "mx.png", + "pp": "XF4", + "lat": 19.010286867390647, + "lon": -112.23593964334704, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "189": { + "dxcc": "205", + "cc": "AC", + "ccc": "ASC", + "name": "阿森松岛", + "continent": "AF", + "ituzone": ["66"], + "cqzone": ["36"], + "timezone": "0", + "ccode": "826", + "aname": "Ascension I.", + "mh": ["II22"], + "prefix": ["ZD8"], + "worked": false, + "confirmed": false, + "flag": "ky.png", + "pp": "ZD8", + "lat": -7.94877290883754, + "lon": -14.467306812985823, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "190": { + "dxcc": "206", + "cc": "AT", + "ccc": "AUT", + "name": "奥地利", + "continent": "EU", + "ituzone": ["28"], + "cqzone": ["15"], + "timezone": "1", + "ccode": "40", + "aname": "Austria", + "mh": [ + "JN46", + "JN47", + "JN56", + "JN57", + "JN66", + "JN67", + "JN68", + "JN76", + "JN77", + "JN78", + "JN79", + "JN86", + "JN87", + "JN88" + ], + "prefix": [ + "=4U0R", + "=4U10NPT", + "=4U18FIFA", + "=4U1A", + "=4U1VIC", + "=4U1WED", + "=4U1XMAS", + "=4U2U", + "=4U30VIC", + "=4U500M", + "=4U70VIC", + "=4Y1A", + "=C7A", + "OE", + "=OE2015XHQ/SC", + "=OE3AGA/AAW", + "=OE3AIS/AAW", + "=OE3AIS/ANT", + "=OE3HM/AAW", + "=OE3KKA/AAW", + "=OE3KKA/ANT", + "=OE3KTA/ANT", + "=OE3MWS/Y2K", + "=OE3RPB/AAW", + "=OE3RPB/ANT", + "=OE3SGA/AAW", + "=OE3SGA/ANT", + "=OE3WWB/AAW", + "=OE3WWB/ANT", + "=OE3XHA/VFW06", + "=OE4PFU/Y2K", + "=OE4VIE/ANT", + "=OE5BJN/Y2K", + "=OE5OHO/Y2K", + "=OE6XMF/4/LH", + "=OE6XMF/FM", + "=OE6XMF/NOE", + "=OE6XMF/U20", + "=OE7AJT/Y2K", + "=OE7XBH/WM05" + ], + "worked": false, + "confirmed": false, + "flag": "at.png", + "pp": "OE", + "lat": 47.72198976138523, + "lon": 14.259259259259265, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "191": { + "dxcc": "207", + "cc": "MU", + "ccc": "MUS", + "name": "罗德里格斯岛", + "continent": "AF", + "ituzone": ["53"], + "cqzone": ["39"], + "timezone": "4", + "ccode": "480", + "aname": "Rodriguez I.", + "mh": ["MH10"], + "prefix": ["3B9"], + "worked": false, + "confirmed": false, + "flag": "mu.png", + "pp": "3B9", + "lat": -19.73496328511436, + "lon": 63.34705075445817, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "193": { + "dxcc": "209", + "cc": "BE", + "ccc": "BEL", + "name": "比利时", + "continent": "EU", + "ituzone": ["27"], + "cqzone": ["14"], + "timezone": "1", + "ccode": "56", + "aname": "Belgium", + "mh": ["JN29", "JO10", "JO11", "JO20", "JO21", "JO30"], + "prefix": [ + "ON", + "=ON3BLB/YL", + "=ON3TC/YL", + "=ON4BRC/J", + "=ON4BRN/LGT", + "=ON4BRN/LH", + "=ON4BRN/LS", + "=ON4BRN/SUB", + "=ON4CCC/LGT", + "=ON4CCC/LH", + "=ON4CEL/LGT", + "=ON4CEL/LH", + "=ON4CIS/LGT", + "=ON4CIS/LH", + "=ON4CJK/LH", + "=ON4CKZ/LH", + "=ON4CP/JOTA", + "=ON4LO/LH", + "=ON4MCL/LH", + "=ON4OS/LH", + "=ON4OSA/LH", + "=ON4OSLN/LH", + "=ON6UJ/LH", + "=ON7PP/LH", + "=ON7RU/LGT", + "=ON7RU/LH", + "=ON9BD/LH", + "=ON9BD/LS", + "OO", + "=OO4BRN/LGT", + "=OO4BRN/LS", + "=OO4BRN/SUB", + "OP", + "=OP5K/LGT", + "=OP5K/LH", + "=OP5K/LT", + "OQ", + "OR", + "=OR0OST/LGT", + "=OR0OST/LH", + "=OR0OST/SUB", + "=OR4BRN/SAIL", + "OS", + "=OS4OSA/LH", + "OT" + ], + "worked": false, + "confirmed": false, + "flag": "be.png", + "pp": "ON", + "lat": 50.68732411157481, + "lon": 4.746227709190669, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "195": { + "dxcc": "211", + "cc": "CA", + "ccc": "CAN", + "name": "塞布尔岛", + "continent": "NA", + "ituzone": ["9"], + "cqzone": ["5"], + "timezone": "-5", + "ccode": "124", + "aname": "Sable I.", + "mh": ["FN93", "GN03"], + "prefix": ["CY0"], + "worked": false, + "confirmed": false, + "flag": "ca.png", + "pp": "CY0", + "lat": 43.96876917518907, + "lon": -59.89940557841793, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "196": { + "dxcc": "212", + "cc": "BG", + "ccc": "BGR", + "name": "保加利亚", + "continent": "EU", + "ituzone": ["28"], + "cqzone": ["20"], + "timezone": "2", + "ccode": "100", + "aname": "Bulgaria", + "mh": [ + "KN11", + "KN12", + "KN13", + "KN14", + "KN21", + "KN22", + "KN23", + "KN31", + "KN32", + "KN33", + "KN34", + "KN41", + "KN42", + "KN43" + ], + "prefix": ["LZ", "=LZ/G0SGB/LH", "=LZ2NU/LH", "=LZ4HWF/LH"], + "worked": false, + "confirmed": false, + "flag": "bg.png", + "pp": "LZ", + "lat": 42.62886522955213, + "lon": 25.20347508001829, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "197": { + "dxcc": "213", + "cc": "FR", + "ccc": "FRA", + "name": "圣马丁岛", + "continent": "NA", + "ituzone": ["11"], + "cqzone": ["8"], + "timezone": "-4", + "ccode": "250", + "aname": "Saint Martin", + "mh": ["FK88"], + "prefix": [ + "FS", + "=TO1E", + "=TO2EME", + "=TO4X", + "=TO5D", + "=TO5SM", + "=TO5SM/P", + "=TO9W" + ], + "worked": false, + "confirmed": false, + "flag": "fr.png", + "pp": "FS", + "lat": 18.090839686210003, + "lon": -63.03967263848042, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "198": { + "dxcc": "214", + "cc": "FR", + "ccc": "FRA", + "name": "科西嘉", + "continent": "EU", + "ituzone": ["28"], + "cqzone": ["15"], + "timezone": "1", + "ccode": "250", + "aname": "Corsica", + "mh": ["JN41", "JN42", "JN43"], + "prefix": ["TK", "=TK/F4FET/LH"], + "worked": false, + "confirmed": false, + "flag": "fr.png", + "pp": "TK", + "lat": 42.327602487802494, + "lon": 9.026063100137176, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "199": { + "dxcc": "215", + "cc": "CY", + "ccc": "CYP", + "name": "塞浦路斯", + "continent": "AS", + "ituzone": ["39"], + "cqzone": ["20"], + "timezone": "3", + "ccode": "196", + "aname": "Cyprus", + "mh": ["KM64", "KM65", "KM74", "KM75"], + "prefix": [ + "5B", + "=5B/DJ5AA/LH", + "=5B/LY1DF/LGT", + "=5B4AKV/EURO", + "=5B4PSG/J", + "=5B4STA/J", + "=5B8AP/LH", + "C4", + "H2", + "P3" + ], + "worked": false, + "confirmed": false, + "flag": "cy.png", + "pp": "5B", + "lat": 34.9434518252706, + "lon": 32.763298277701566, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "200": { + "dxcc": "216", + "cc": "NI", + "ccc": "NIC", + "name": "圣安德烈斯", + "continent": "NA", + "ituzone": ["11"], + "cqzone": ["7"], + "timezone": "-6", + "ccode": "558", + "aname": "San Andres & Providencia", + "mh": ["EK92", "EK93"], + "prefix": [ + "5J0", + "5K0", + "HJ0", + "HK0", + "=HK3ARR/0", + "=HK3JJH/0", + "=HK3JJH/0A", + "=HK3JJH/0B", + "=HK3JJH/HK0A", + "=HK3OSA/0" + ], + "worked": false, + "confirmed": false, + "flag": "co.png", + "pp": "HK0/a", + "lat": 14.8764648022794, + "lon": -80.63404968754762, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "201": { + "dxcc": "217", + "cc": "CL", + "ccc": "CHL", + "name": "圣菲力斯岛", + "continent": "SA", + "ituzone": ["14"], + "cqzone": ["12"], + "timezone": "-5", + "ccode": "152", + "aname": "San Felix & San Ambrosio", + "mh": ["EG93", "FG03"], + "prefix": [ + "3G0X", + "CA0X", + "CB0X", + "CC0X", + "CD0X", + "CE0X", + "XQ0X", + "XR0X", + "=XR0ZY" + ], + "worked": false, + "confirmed": false, + "flag": "cl.png", + "pp": "CE0X", + "lat": -26.34453905415765, + "lon": -80.12345679012347, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "203": { + "dxcc": "219", + "cc": "ST", + "ccc": "STP", + "name": "圣多美和普林西比", + "continent": "AF", + "ituzone": ["47"], + "cqzone": ["36"], + "timezone": "0", + "ccode": "678", + "aname": "Sao Tome & Principe", + "mh": ["JI39", "JJ30", "JJ31"], + "prefix": ["S9"], + "worked": false, + "confirmed": false, + "flag": "st.png", + "pp": "S9", + "lat": 0.8047289136386837, + "lon": 6.895290352080474, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "204": { + "dxcc": "221", + "cc": "DK", + "ccc": "DNK", + "name": "丹麦", + "continent": "EU", + "ituzone": ["18"], + "cqzone": ["14"], + "timezone": "1", + "ccode": "208", + "aname": "Denmark", + "mh": [ + "JO44", + "JO45", + "JO46", + "JO47", + "JO54", + "JO55", + "JO56", + "JO57", + "JO64", + "JO65", + "JO66", + "JO74", + "JO75" + ], + "prefix": [ + "5P", + "=5P0MF/LH", + "=5P2X/LH", + "=5P5CW/LH", + "5Q", + "OU", + "=OU7LH/LH", + "OV", + "OZ", + "=OZ/DG1EHM/LH", + "=OZ/DG2RON/LH", + "=OZ/DJ5AA/LH", + "=OZ/DJ7AO/LGT", + "=OZ/DJ7AO/LH", + "=OZ/DL1BWU/LH", + "=OZ/DL3JJ/LH", + "=OZ/DL4AM/LH", + "=OZ/DL4ZZ/LH", + "=OZ/DL5SE/LH", + "=OZ/DL7RSM/LH", + "=OZ/DR4X/LH", + "=OZ/ON6JUN/LH", + "=OZ/PH7Y/LH", + "=OZ0IL/LH", + "=OZ0MF/LH", + "=OZ0Q/LH", + "=OZ0Y/LS", + "=OZ13LH/LH", + "=OZ1CF/LH", + "=OZ1IIL/LH", + "=OZ1KAH/LH", + "=OZ1KR/J", + "=OZ1SDB/LH", + "=OZ1SKA/LH", + "=OZ2F/LH", + "=OZ2FG/LH", + "=OZ2GBW/LGT", + "=OZ2GBW/LH", + "=OZ2NYB/LGT", + "=OZ2NYB/LH", + "=OZ2ZB/LH", + "=OZ3EDR/LH", + "=OZ3EVA/LH", + "=OZ3FYN/LH", + "=OZ3TL/JOTA", + "=OZ4EL/LH", + "=OZ4HAM/LH", + "=OZ50RN/LH", + "=OZ5ESB/LH", + "=OZ7AEI/LH", + "=OZ7DAL/LH", + "=OZ7DAL/LS", + "=OZ7EA/YL", + "=OZ7HAM/LH", + "=OZ7LH/LH", + "=OZ7RJ/LGT", + "=OZ7RJ/LH", + "=OZ7SP/JOTA", + "=OZ7TOM/LH", + "=OZ8KV/LH", + "=OZ8SMA/LGT", + "=OZ8SMA/LH", + "=OZ9HBO/JOTA", + "=OZ9HBO/LH", + "=OZ9WSR/J" + ], + "worked": false, + "confirmed": false, + "flag": "dk.png", + "pp": "OZ", + "lat": 56.38320219699523, + "lon": 9.190672153635115, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "205": { + "dxcc": "222", + "cc": "FO", + "ccc": "FRO", + "name": "法罗群岛", + "continent": "EU", + "ituzone": ["18"], + "cqzone": ["14"], + "timezone": "0", + "ccode": "234", + "aname": "Faroe Is.", + "mh": ["IP61", "IP62"], + "prefix": ["OW", "OY", "=OY1CT/HQ"], + "worked": false, + "confirmed": false, + "flag": "fo.png", + "pp": "OY", + "lat": 62.02186755527086, + "lon": -6.728395061728399, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "206": { + "dxcc": "223", + "cc": "GB", + "ccc": "GBR", + "name": "英国", + "continent": "EU", + "ituzone": ["27"], + "cqzone": ["14"], + "timezone": "0", + "ccode": "826", + "aname": "England", + "mh": [ + "IN69", + "IN79", + "IO70", + "IO80", + "IO81", + "IO82", + "IO83", + "IO84", + "IO85", + "IO90", + "IO91", + "IO92", + "IO93", + "IO94", + "IO95", + "JO00", + "JO01", + "JO02", + "JO03" + ], + "prefix": [ + "2E", + "=2E0GWD/P/LH", + "=2MT", + "=2O0YYY/P", + "=2Q0XYL/P", + "=2Q0YYY/P", + "=2SZ", + "G", + "=G0IBN/LH", + "=G0IBN/LV", + "=G0IBN/P/LV", + "=G0SGB/LH", + "=G0VML/LV", + "=G3PRC/LH", + "=G6HH/LH", + "=GB0BLL/LH", + "=GB0BMB/LH", + "=GB0HLH/LH", + "=GB0NCI/LH", + "=GB0PL/LH", + "=GB0SLH/LH", + "=GB0WPS/JOTA", + "=GB1PBL/LH", + "=GB2APL/LH", + "=GB2BML/LGT", + "=GB2BML/LH", + "=GB2LZL/LH", + "=GB2PLH/LH", + "=GB2SCA/LH", + "=GB2SJ/LH", + "=GB2SML/LH", + "=GB2SNM/MILL", + "=GB3HQ/YOTA", + "=GB4CWM/YL", + "=GB4LL/LH", + "=GB4WL/LH", + "=GB5PW/LH", + "=GB6MD/IMD", + "=GB6MW/MILL", + "=GB8SL/LH", + "=GO4ONL/P", + "=GX0MWT/IMD", + "=GX3PRC/LH", + "=GX3SDS/LH", + "M", + "=M0DXT/LH", + "=M0HAZ/A/TCM", + "=M0TXS/YL", + "=M0WDC/LH", + "=M1MJT/YL", + "=M2000Y/21B", + "=M2000Y/21F", + "=M2000Y/28B", + "=M2000Y/29C", + "=M2000Y/71B", + "=M2001Y/21F", + "=M2001Y/71B", + "=M2001Y/97A", + "=M3AFR/LH", + "=M3MJT/YL", + "=M3ZKT/YL", + "=M6AIG/YL", + "=M6SUS/YL", + "=MQ6BWA/P" + ], + "worked": false, + "confirmed": false, + "flag": "en.png", + "pp": "G", + "lat": 52.61884235823834, + "lon": -0.9259259259259296, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "207": { + "dxcc": "224", + "cc": "FI", + "ccc": "FIN", + "name": "芬兰", + "continent": "EU", + "ituzone": ["18"], + "cqzone": ["15"], + "timezone": "2", + "ccode": "246", + "aname": "Finland", + "mh": [ + "KO19", + "KO29", + "KP00", + "KP01", + "KP02", + "KP03", + "KP08", + "KP09", + "KP10", + "KP11", + "KP12", + "KP13", + "KP14", + "KP15", + "KP16", + "KP17", + "KP18", + "KP19", + "KP20", + "KP21", + "KP22", + "KP23", + "KP24", + "KP25", + "KP26", + "KP27", + "KP28", + "KP29", + "KP30", + "KP31", + "KP32", + "KP33", + "KP34", + "KP35", + "KP36", + "KP37", + "KP38", + "KP39", + "KP40", + "KP41", + "KP42", + "KP43", + "KP44", + "KP45", + "KP46", + "KP47", + "KP48", + "KP49", + "KP51", + "KP52", + "KP53", + "KP54", + "KP55", + "KP57", + "KQ30", + "KQ40" + ], + "prefix": [ + "OF", + "=OF100FI/1/LH", + "=OF1AD/S", + "=OF1LD/S", + "=OF1TX/S", + "=OF200AD/LS", + "=OF200AD/S", + "=OF2BNX/SA", + "=OF3HHO/S", + "=OF3KRB/S", + "=OF5AD/S", + "=OF6FSQ/S", + "=OF6NL/SA", + "=OF6QR/S", + "OG", + "=OG0V/4", + "=OG2O/YL", + "=OG3X/LH", + "=OG5A/LS", + "=OG5A/S", + "=OG6M/S", + "OH", + "=OH/RX3AMI/LH", + "=OH0AM/2", + "=OH0AW/5", + "=OH0BT/2", + "=OH0HG/1", + "=OH0HG/2", + "=OH0I/4", + "=OH0J/1", + "=OH0JJS/1", + "=OH0KAG/9", + "=OH0MDR/1", + "=OH0MRR/1", + "=OH0V/4", + "=OH0Y/6", + "=OH1AD/S", + "=OH1AF/LH", + "=OH1AH/LH", + "=OH1AH/LT", + "=OH1AM/LH", + "=OH1BGG/S", + "=OH1BGG/SA", + "=OH1CM/S", + "=OH1F/LGT", + "=OH1F/LH", + "=OH1FJ/S", + "=OH1FJ/SA", + "=OH1KW/S", + "=OH1KW/SA", + "=OH1LD/S", + "=OH1LEO/S", + "=OH1MLZ/SA", + "=OH1NR/S", + "=OH1OD/S", + "=OH1PP/S", + "=OH1PV/S", + "=OH1S/S", + "=OH1SJ/S", + "=OH1SJ/SA", + "=OH1SM/S", + "=OH1TX/S", + "=OH1TX/SA", + "=OH1UH/S", + "=OH1XW/S", + "=OH2AAF/S", + "=OH2AAF/SA", + "=OH2AAV/S", + "=OH2AN/SUB", + "=OH2AUE/S", + "=OH2AUE/SA", + "=OH2AY/S", + "=OH2BAX/S", + "=OH2BMB/S", + "=OH2BMB/SA", + "=OH2BNX/S", + "=OH2BNX/SA", + "=OH2BQP/S", + "=OH2BXT/S", + "=OH2C/S", + "=OH2EO/S", + "=OH2ET/LH", + "=OH2ET/LS", + "=OH2ET/S", + "=OH2FBX/S", + "=OH2FBX/SA", + "=OH2HK/S", + "=OH2HZ/S", + "=OH2MEE/S", + "=OH2MEE/SA", + "=OH2MH/S", + "=OH2MO/S", + "=OH2MO/SA", + "=OH2NAS/S", + "=OH2NAS/SA", + "=OH2NM/LH", + "=OH2PO/S", + "=OH2PO/SA", + "=OH2S/S", + "=OH2S/SA", + "=OH2XL/S", + "=OH2XMP/S", + "=OH2Y/6/LH", + "=OH2ZL/SA", + "=OH2ZY/S", + "=OH3A/LH", + "=OH3ABN/S", + "=OH3ACA/S", + "=OH3AG/LH", + "=OH3CT/S", + "=OH3CT/SA", + "=OH3FJQ/S", + "=OH3FJQ/SA", + "=OH3GDO/LH", + "=OH3GQM/S", + "=OH3HB/S", + "=OH3HB/SA", + "=OH3HHO/S", + "=OH3HHO/SA", + "=OH3IH/S", + "=OH3IH/SA", + "=OH3IS/S", + "=OH3KRB/S", + "=OH3KRB/SA", + "=OH3LB/S", + "=OH3LB/SA", + "=OH3LS/S", + "=OH3MY/S", + "=OH3MY/SA", + "=OH3N/S", + "=OH3NOB/S", + "=OH3NVK/S", + "=OH3R/SA", + "=OH3SUF/JOTA", + "=OH3TAM/LH", + "=OH3VV/S", + "=OH3W/S", + "=OH3WR/SA", + "=OH4FSL/SA", + "=OH4N/S", + "=OH4SG/S", + "=OH5A/S", + "=OH5AA/LS", + "=OH5AD/LS", + "=OH5AD/S", + "=OH5B/LH", + "=OH5EAB/S", + "=OH5EAB/SA", + "=OH5GOE/S", + "=OH5J/S", + "=OH5J/SA", + "=OH5JJL/S", + "=OH5K/S", + "=OH5LP/S", + "=OH5LP/SA", + "=OH5R/S", + "=OH5ZB/S", + "=OH6AC/LH", + "=OH6ADHD/LH", + "=OH6AG/S", + "=OH6AR/LH", + "=OH6CT/S", + "=OH6CT/SA", + "=OH6EFH/SA", + "=OH6EOG/SA", + "=OH6FA/S", + "=OH6FA/SA", + "=OH6FMG/LH", + "=OH6FSQ/S", + "=OH6G/S", + "=OH6GSR/S", + "=OH6K/S", + "=OH6MH/S", + "=OH6NL/S", + "=OH6NL/SA", + "=OH6NR/LGT", + "=OH6NR/LH", + "=OH6NZ/SA", + "=OH6OT/S", + "=OH6PA/S", + "=OH6QR/S", + "=OH6QR/SA", + "=OH6RJ/S", + "=OH6VM/S", + "=OH7AB/S", + "=OH7AX/S", + "=OH7BD/S", + "=OH7ND/S", + "=OH7NE/S", + "=OH7QA/S", + "=OH7QA/SA", + "=OH7SV/SA", + "=OH7UE/S", + "=OH7VL/S", + "=OH7XI/S", + "=OH8AAU/LH", + "=OH8FCK/S", + "=OH8FCK/SA", + "=OH8KN/S", + "=OH8KN/SA", + "=OH9AR/S", + "=OH9TM/S", + "=OH9TO/S", + "OI", + "=OI1AXA/S", + "=OI1AY/S", + "=OI2ABG/S", + "=OI3SVM/S", + "=OI3SVM/SA", + "=OI3V/LH", + "=OI3V/S", + "=OI3V/SA", + "=OI3W/LGT", + "=OI3W/LH", + "=OI4JM/S", + "=OI4JM/SA", + "=OI4PM/S", + "=OI5AY/LH", + "=OI5AY/SA", + "=OI5PRM/SA", + "=OI6AY/LH", + "=OI6SP/S", + "=OI6SP/SA", + "=OI7AX/S", + "=OI8VK/S", + "OJ" + ], + "worked": false, + "confirmed": false, + "flag": "fi.png", + "pp": "OH", + "lat": 63.380503782510374, + "lon": 26.604938271604944, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "208": { + "dxcc": "225", + "cc": "IT", + "ccc": "ITA", + "name": "撒丁岛", + "continent": "EU", + "ituzone": ["28"], + "cqzone": ["15"], + "timezone": "1", + "ccode": "380", + "aname": "Sardinia", + "mh": ["JM48", "JM49", "JN40", "JN41"], + "prefix": [ + "=II0C", + "=II0EUDX", + "=II0FDR", + "=II0IAML", + "=II0ICH", + "=II0IDP", + "=II0M", + "=II0MQP", + "=II0P", + "=II0PAX", + "=II0RSB", + "=II0SB", + "=II0SB/MM", + "=II0SRE", + "=II0SRT/P", + "=II3EUDX", + "IM0", + "=IQ0AG", + "=IQ0AG/P", + "=IQ0AH", + "=IQ0AH/P", + "=IQ0AI", + "=IQ0AI/P", + "=IQ0AK", + "=IQ0AK/P", + "=IQ0AL", + "=IQ0AL/P", + "=IQ0AM", + "=IQ0AM/P", + "=IQ0EH", + "=IQ0EH/P", + "=IQ0HO", + "=IQ0ID", + "=IQ0ID/P", + "=IQ0NU", + "=IQ0NU/P", + "=IQ0NV", + "=IQ0NV/P", + "=IQ0OG", + "=IQ0OH", + "=IQ0QP", + "=IQ0QP/LH", + "=IQ0QP/P", + "=IQ0SS", + "=IQ0SS/P", + "=IQ0US", + "=IQ0UT", + "=IQ0XP", + "=IR0EO", + "=IR0FOC", + "=IR0IDP", + "=IR0IDP/1", + "=IR0IDP/2", + "=IR0IDP/3", + "=IR0LVC", + "=IR0MDC", + "IS", + "=IS0/4Z5KJ/LH", + "=IS0/DL5SE/LH", + "=IS0ICE/N", + "=IS0IGV/N", + "=IS0PGF/N", + "=IS0SDX/N", + "=IW0HRI", + "IW0U", + "IW0V", + "IW0W", + "IW0X", + "IW0Y", + "IW0Z", + "=IY0GA", + "=IY0NV" + ], + "worked": false, + "confirmed": false, + "flag": "it.png", + "pp": "IS", + "lat": 40.09903483384065, + "lon": 8.916323731138544, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "210": { + "dxcc": "227", + "cc": "FR", + "ccc": "FRA", + "name": "法国", + "continent": "EU", + "ituzone": ["27"], + "cqzone": ["14"], + "timezone": "1", + "ccode": "250", + "aname": "France", + "mh": [ + "IN77", + "IN78", + "IN86", + "IN87", + "IN88", + "IN92", + "IN93", + "IN94", + "IN95", + "IN96", + "IN97", + "IN98", + "IN99", + "JN02", + "JN03", + "JN04", + "JN05", + "JN06", + "JN07", + "JN08", + "JN09", + "JN12", + "JN13", + "JN14", + "JN15", + "JN16", + "JN17", + "JN18", + "JN19", + "JN23", + "JN24", + "JN25", + "JN26", + "JN27", + "JN28", + "JN29", + "JN33", + "JN34", + "JN35", + "JN36", + "JN37", + "JN38", + "JN39", + "JN48", + "JN49", + "JO00", + "JO01", + "JO10", + "JO11", + "JO20" + ], + "prefix": [ + "=4U60UO", + "F", + "=F/DL5SE/LH", + "=F/G0SGB/LH", + "=F/IK3MZS/LH", + "=F/ON4LO/LH", + "=F/ON7RU/LH", + "=F/PH2CV/LH", + "=F4FET/LH", + "=F5HPY/LH", + "=F5NBX/LH", + "=F5NMK/LH", + "=F6/4Z5KJ/LH", + "=F6DXB/YL", + "=F6HDH/LH", + "=F6IFC/LH", + "=F6KBG/MSW", + "=F6KMB/LH", + "=F6KMB/P/LH", + "=F6KUM/LH", + "HW", + "HX", + "HY", + "TH", + "TM", + "=TM0BSM/LH", + "=TM0PDC/LH", + "=TM0PDH/LH", + "=TM5AF/LH", + "TP", + "TQ", + "TV" + ], + "worked": false, + "confirmed": false, + "flag": "fr.png", + "pp": "F", + "lat": 46.88483457834579, + "lon": 2.407407407407407, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "213": { + "dxcc": "230", + "cc": "DE", + "ccc": "DEU", + "name": "德国", + "continent": "EU", + "ituzone": ["28"], + "cqzone": ["14"], + "timezone": "1", + "ccode": "276", + "aname": "Federal Republic of Germany", + "mh": [ + "JN37", + "JN38", + "JN39", + "JN47", + "JN48", + "JN49", + "JN57", + "JN58", + "JN59", + "JN67", + "JN68", + "JN69", + "JO20", + "JO21", + "JO30", + "JO31", + "JO32", + "JO33", + "JO40", + "JO41", + "JO42", + "JO43", + "JO44", + "JO45", + "JO50", + "JO51", + "JO52", + "JO53", + "JO54", + "JO60", + "JO61", + "JO62", + "JO63", + "JO64", + "JO70", + "JO71", + "JO72", + "JO73", + "JO74" + ], + "prefix": [ + "DA", + "=DA0BHV/LGT", + "=DA0BHV/LH", + "=DA0BLH/LGT", + "=DA0DAG/LH", + "=DA0FO/LH", + "=DA0LCC/LH", + "=DA0LGV/LH", + "=DA0LHT/LH", + "=DA0OIE/LGT", + "=DA0QS/LGT", + "=DA0QS/LH", + "=DA0WLH/LH", + "DB", + "=DB2BJT/LH", + "DC", + "=DC1HPS/LH", + "DD", + "=DD3D/LH", + "DE", + "DF", + "=DF0AWG/LH", + "=DF0BU/LH", + "=DF0CHE/LH", + "=DF0ELM/LH", + "=DF0HC/LH", + "=DF0IF/LGT", + "=DF0IF/LH", + "=DF0LR/LH", + "=DF0MF/LGT", + "=DF0MF/LH", + "=DF0MF/LS", + "=DF0SX/LH", + "=DF0VK/LH", + "=DF0WAT/LH", + "=DF0WFB/LH", + "=DF0WH/LGT", + "=DF0WLG/LH", + "=DF1AG/LH", + "=DF1HF/LH", + "=DF2BR/LH", + "=DF3LY/L", + "=DF5A/LH", + "=DF5FO/LH", + "=DF8AN/LGT", + "=DF8AN/LH", + "=DF8AN/P/LH", + "=DF9HG/LH", + "DG", + "=DG0GF/LH", + "=DG3XA/LH", + "DH", + "=DH0IPA/LH", + "=DH1DH/LH", + "=DH1DH/M/LH", + "=DH6RS/LH", + "=DH7RK/LH", + "=DH9JK/LH", + "=DH9UW/YL", + "DI", + "DJ", + "=DJ0PJ/LH", + "=DJ2OC/LH", + "=DJ3XG/LH", + "=DJ5AA/LH", + "=DJ7AO/LH", + "=DJ7MH/LH", + "=DJ8RH/LH", + "=DJ9QE/LH", + "DK", + "=DK0DAN/LH", + "=DK0FC/LGT", + "=DK0FC/LH", + "=DK0IZ/LH", + "=DK0KTL/LH", + "=DK0LWL/LH", + "=DK0OC/LH", + "=DK0PRE/LH", + "=DK0RA/LH", + "=DK0RBY/LH", + "=DK0RU/LH", + "=DK0RZ/LH", + "=DK3DUA/LH", + "=DK3R/LH", + "=DK4DS/LH", + "=DK4MT/LT", + "=DK5AN/P/LH", + "=DK5T/LH", + "=DK5T/LS", + "DL", + "=DL/HB9DQJ/LH", + "=DL0AWG/LH", + "=DL0BLA/LH", + "=DL0BPS/LH", + "=DL0BUX/LGT", + "=DL0BUX/LH", + "=DL0CA/LH", + "=DL0CUX/LGT", + "=DL0CUX/LV", + "=DL0DAB/LH", + "=DL0EJ/LH", + "=DL0EL/LH", + "=DL0EM/LGT", + "=DL0EM/LH", + "=DL0EO/LGT", + "=DL0EO/LH", + "=DL0FFF/LGT", + "=DL0FFF/LH", + "=DL0FFF/LS", + "=DL0FHD/LH", + "=DL0FL/FF", + "=DL0HDF/LH", + "=DL0HGW/LGT", + "=DL0HGW/LH", + "=DL0HST/LH", + "=DL0II/LH", + "=DL0IOO/LH", + "=DL0IPA/LH", + "=DL0LGT/LH", + "=DL0LNW/LH", + "=DL0MCM/LH", + "=DL0MFH/LGT", + "=DL0MFH/LH", + "=DL0MFK/LGT", + "=DL0MFK/LH", + "=DL0MFN/LH", + "=DL0MHR/LH", + "=DL0NH/LH", + "=DL0OF/LH", + "=DL0PAS/LH", + "=DL0PBS/LH", + "=DL0PJ/LH", + "=DL0RSH/LH", + "=DL0RUG/LGT", + "=DL0RUG/LH", + "=DL0RWE/LH", + "=DL0SH/LH", + "=DL0SY/LH", + "=DL0TO/LH", + "=DL0UEM/LH", + "=DL0VV/LH", + "=DL0YLM/LH", + "=DL1BSN/LH", + "=DL1DUT/LH", + "=DL1ELU/LH", + "=DL1HZM/YL", + "=DL1SKK/LH", + "=DL2FCA/YL", + "=DL2RPS/LH", + "=DL3ANK/LH", + "=DL3JJ/LH", + "=DL3KWR/YL", + "=DL3KZA/LH", + "=DL3RNZ/LH", + "=DL4ABB/LH", + "=DL5CX/LH", + "=DL5KUA/LH", + "=DL5SE/LH", + "=DL65DARC/LH", + "=DL6ABN/LH", + "=DL6AP/LH", + "=DL6KWN/LH", + "=DL7ANC/LH", + "=DL7BMG/LH", + "=DL7MFK/LH", + "=DL7UVO/LH", + "=DL7VDX/LH", + "=DL8HK/YL", + "=DL8MTG/LH", + "=DL8TG/LH", + "=DL8TG/LV", + "=DL8UAA/FF", + "=DL9CU/LH", + "=DL9NEI/ND2N", + "=DL9OE/LH", + "=DL9SEP/P/LH", + "DM", + "=DM2C/LH", + "=DM3B/LH", + "=DM3G/LH", + "=DM3KF/LH", + "=DM5C/LH", + "=DM5JBN/LH", + "DN", + "=DN0AWG/LH", + "=DN4MB/LH", + "=DN8RLS/YL", + "DO", + "=DO1EEW/YL", + "=DO1OMA/LH", + "=DO5MCL/LH", + "=DO5MCL/YL", + "=DO6KDS/LH", + "=DO6UVM/LH", + "=DO7DC/LH", + "=DO7RKL/LH", + "DP", + "DQ", + "=DQ4M/LH", + "=DQ4M/LT", + "DR", + "=DR100MF/LS", + "=DR3M/LH", + "=DR4W/FF", + "=DR4X/LH", + "=DR9Z/LH", + "Y2", + "Y3", + "Y4", + "Y5", + "Y6", + "Y7", + "Y8", + "Y9" + ], + "worked": false, + "confirmed": false, + "flag": "de.png", + "pp": "DL", + "lat": 51.274575098118106, + "lon": 9.739368998628255, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "215": { + "dxcc": "232", + "cc": "SO", + "ccc": "SOM", + "name": "索马里", + "continent": "AF", + "ituzone": ["48"], + "cqzone": ["37"], + "timezone": "3", + "ccode": "706", + "aname": "Somalia", + "mh": [ + "LI08", + "LI09", + "LI18", + "LI19", + "LJ00", + "LJ01", + "LJ02", + "LJ03", + "LJ04", + "LJ10", + "LJ11", + "LJ12", + "LJ13", + "LJ14", + "LJ19", + "LJ21", + "LJ22", + "LJ23", + "LJ24", + "LJ25", + "LJ26", + "LJ28", + "LJ29", + "LJ32", + "LJ33", + "LJ34", + "LJ35", + "LJ36", + "LJ37", + "LJ38", + "LJ39", + "LJ44", + "LJ45", + "LJ46", + "LJ47", + "LJ48", + "LJ49", + "LJ57", + "LJ58", + "LJ59", + "LK10", + "LK11", + "LK20", + "LK30", + "LK31", + "LK40", + "LK41", + "LK50", + "LK51" + ], + "prefix": ["6O", "T5"], + "worked": false, + "confirmed": false, + "flag": "so.png", + "pp": "T5", + "lat": 4.330575919388011, + "lon": 45.84362139917695, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "216": { + "dxcc": "233", + "cc": "GI", + "ccc": "GIB", + "name": "直布罗陀", + "continent": "EU", + "ituzone": ["37"], + "cqzone": ["14"], + "timezone": "1", + "ccode": "292", + "aname": "Gibraltar", + "mh": ["IM76"], + "prefix": ["ZB", "=ZB2LGT/LH", "ZG"], + "worked": false, + "confirmed": false, + "flag": "gi.png", + "pp": "ZB", + "lat": 36.133333, + "lon": -5.35, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "217": { + "dxcc": "234", + "cc": "GS", + "ccc": "SGS", + "name": "南库克群岛", + "continent": "OC", + "ituzone": ["63"], + "cqzone": ["32"], + "timezone": "-11", + "ccode": "239", + "aname": "South Cook Is.", + "mh": ["BG08", "BG09", "BG18", "BG19", "BH00", "BH01", "BH10"], + "prefix": [ + "E5", + "=ZK1/AC4LN", + "=ZK1AKF", + "=ZK1AKX", + "=ZK1APM", + "=ZK1ASQ", + "=ZK1AXU", + "=ZK1BS", + "=ZK1CG", + "=ZK1EAA", + "=ZK1ETW", + "=ZK1JD/J", + "=ZK1KH", + "=ZK1NDS", + "=ZK1NFK", + "=ZK1SDE", + "=ZK1SSB", + "=ZK1USA", + "=ZK1VVV", + "=ZK1XXC" + ], + "worked": false, + "confirmed": false, + "flag": "gs.png", + "pp": "E5/s", + "lat": -19.915624863099694, + "lon": -158.2304526748971, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "218": { + "dxcc": "235", + "cc": "GS", + "ccc": "SGS", + "name": "南乔治亚岛", + "continent": "SA", + "ituzone": ["73"], + "cqzone": ["13"], + "timezone": "-2", + "ccode": "239", + "aname": "South Georgia I.", + "mh": [ + "HD05", + "HD06", + "HD15", + "HD16", + "HD25", + "HD60", + "HD61", + "HD62", + "HD63" + ], + "prefix": [ + "=VP8CA", + "=VP8CKB", + "=VP8DIF", + "=VP8DKX", + "=VP8DOZ", + "=VP8GEO", + "=VP8GI", + "=VP8SGB", + "=VP8SGI", + "=VP8SGK" + ], + "worked": false, + "confirmed": false, + "flag": "gs.png", + "pp": "VP8/g", + "lat": -54.344995170504056, + "lon": -36.75925925925926, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "219": { + "dxcc": "236", + "cc": "GR", + "ccc": "GRC", + "name": "希腊", + "continent": "EU", + "ituzone": ["28"], + "cqzone": ["20"], + "timezone": "2", + "ccode": "300", + "aname": "Greece", + "mh": [ + "JM99", + "KM06", + "KM07", + "KM08", + "KM09", + "KM14", + "KM15", + "KM16", + "KM17", + "KM18", + "KM19", + "KM24", + "KM25", + "KM26", + "KM27", + "KM28", + "KM29", + "KM34", + "KM35", + "KM36", + "KM37", + "KM38", + "KM39", + "KM46", + "KN00", + "KN01", + "KN10", + "KN11", + "KN20", + "KN21", + "KN30", + "KN31" + ], + "prefix": [ + "J4", + "=J42004/DH1NA", + "=J42004/DH1PS", + "=J42004/HA3NU", + "=J42004/N3JWJ", + "=J42004/OE5ER", + "SV", + "=SV1/LY1DF/LGT", + "=SV1EOS/JOTA", + "=SV1EQU/J", + "=SV2CLJ/J", + "=SV2JAO/J", + "=SV2KBB/J", + "=SV2RNY/J", + "=SV54FF", + "=SV5CJK/3", + "=SV5FRI/1", + "=SV5FRK/3", + "=SV5FRP/3", + "=SV5FRQ/1", + "=SV5KJQ/8", + "=SV8/DJ5AA/LH", + "=SV8/LY1DF/LGT", + "=SV94MIKIS", + "=SV94THEO", + "=SV9AWF/1", + "=SV9CUF/1", + "=SV9DJO/7", + "=SV9DRU/1", + "=SV9GPM/8", + "=SV9ION/3", + "=SV9OFL/4", + "=SV9TJ/1", + "SW", + "=SW8SW/LH", + "SX", + "=SX100TSL/J", + "=SX8DI/LH", + "=SX90IARU", + "=SX94MIKIS", + "SY", + "=SY2AEI/J", + "=SY2WT/LH", + "SZ", + "=SZ2TSL/J", + "=SZ7KAM/LH", + "=SZ8LES/LH", + "=SZ8XIO/J", + "=SZ8XIO/P/JOTA" + ], + "worked": false, + "confirmed": false, + "flag": "gr.png", + "pp": "SV", + "lat": 39.37235706451992, + "lon": 21.740588324950462, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "220": { + "dxcc": "237", + "cc": "GL", + "ccc": "GRL", + "name": "格陵兰", + "continent": "NA", + "ituzone": ["5", "75"], + "cqzone": ["40"], + "timezone": "-3", + "ccode": "304", + "aname": "Greenland", + "mh": [ + "FQ37", + "FQ38", + "FQ46", + "FQ47", + "FQ48", + "FQ56", + "FQ57", + "FQ58", + "FQ59", + "FQ66", + "FQ67", + "FQ68", + "FQ69", + "FQ75", + "FQ76", + "FQ77", + "FQ78", + "FQ79", + "FQ86", + "FQ87", + "FQ88", + "FQ89", + "FQ95", + "FQ96", + "FQ97", + "FQ98", + "FQ99", + "FR60", + "FR70", + "FR71", + "FR80", + "FR81", + "FR90", + "FR91", + "GO79", + "GO89", + "GP29", + "GP34", + "GP35", + "GP36", + "GP37", + "GP38", + "GP39", + "GP42", + "GP43", + "GP44", + "GP45", + "GP46", + "GP47", + "GP48", + "GP49", + "GP50", + "GP51", + "GP52", + "GP53", + "GP54", + "GP55", + "GP56", + "GP57", + "GP58", + "GP59", + "GP60", + "GP61", + "GP62", + "GP63", + "GP64", + "GP65", + "GP66", + "GP67", + "GP68", + "GP69", + "GP70", + "GP71", + "GP72", + "GP73", + "GP74", + "GP75", + "GP76", + "GP77", + "GP78", + "GP79", + "GP80", + "GP81", + "GP82", + "GP83", + "GP84", + "GP85", + "GP86", + "GP87", + "GP88", + "GP89", + "GP92", + "GP93", + "GP94", + "GP95", + "GP96", + "GP97", + "GP98", + "GP99", + "GQ05", + "GQ06", + "GQ07", + "GQ08", + "GQ09", + "GQ12", + "GQ13", + "GQ14", + "GQ15", + "GQ16", + "GQ17", + "GQ18", + "GQ19", + "GQ20", + "GQ21", + "GQ22", + "GQ23", + "GQ24", + "GQ25", + "GQ26", + "GQ27", + "GQ28", + "GQ29", + "GQ30", + "GQ31", + "GQ32", + "GQ33", + "GQ34", + "GQ35", + "GQ36", + "GQ37", + "GQ38", + "GQ39", + "GQ40", + "GQ41", + "GQ42", + "GQ43", + "GQ44", + "GQ45", + "GQ46", + "GQ47", + "GQ48", + "GQ49", + "GQ50", + "GQ51", + "GQ52", + "GQ53", + "GQ54", + "GQ55", + "GQ56", + "GQ57", + "GQ58", + "GQ59", + "GQ60", + "GQ61", + "GQ62", + "GQ63", + "GQ64", + "GQ65", + "GQ66", + "GQ67", + "GQ68", + "GQ69", + "GQ70", + "GQ71", + "GQ72", + "GQ73", + "GQ74", + "GQ75", + "GQ76", + "GQ77", + "GQ78", + "GQ79", + "GQ80", + "GQ81", + "GQ82", + "GQ83", + "GQ84", + "GQ85", + "GQ86", + "GQ87", + "GQ88", + "GQ89", + "GQ90", + "GQ91", + "GQ92", + "GQ93", + "GQ94", + "GQ95", + "GQ96", + "GQ97", + "GQ98", + "GQ99", + "GR00", + "GR01", + "GR02", + "GR10", + "GR11", + "GR12", + "GR20", + "GR21", + "GR22", + "GR30", + "GR31", + "GR32", + "GR40", + "GR41", + "GR42", + "GR50", + "GR51", + "GR52", + "GR60", + "GR61", + "GR62", + "GR63", + "GR70", + "GR71", + "GR72", + "GR73", + "GR80", + "GR81", + "GR82", + "GR83", + "GR90", + "GR91", + "GR92", + "GR93", + "HP05", + "HP06", + "HP07", + "HP08", + "HP09", + "HP15", + "HP16", + "HP17", + "HP18", + "HP19", + "HP25", + "HP26", + "HP27", + "HP28", + "HP29", + "HP36", + "HP37", + "HP38", + "HP39", + "HP48", + "HP49", + "HP58", + "HP59", + "HP68", + "HP69", + "HP78", + "HP79", + "HP89", + "HQ00", + "HQ01", + "HQ02", + "HQ03", + "HQ04", + "HQ05", + "HQ06", + "HQ07", + "HQ08", + "HQ09", + "HQ10", + "HQ11", + "HQ12", + "HQ13", + "HQ14", + "HQ15", + "HQ16", + "HQ17", + "HQ18", + "HQ19", + "HQ20", + "HQ21", + "HQ22", + "HQ23", + "HQ24", + "HQ25", + "HQ26", + "HQ27", + "HQ28", + "HQ29", + "HQ30", + "HQ31", + "HQ32", + "HQ33", + "HQ34", + "HQ35", + "HQ36", + "HQ37", + "HQ38", + "HQ39", + "HQ40", + "HQ41", + "HQ42", + "HQ43", + "HQ44", + "HQ45", + "HQ46", + "HQ47", + "HQ48", + "HQ49", + "HQ50", + "HQ51", + "HQ52", + "HQ53", + "HQ54", + "HQ55", + "HQ56", + "HQ57", + "HQ58", + "HQ59", + "HQ60", + "HQ61", + "HQ62", + "HQ63", + "HQ64", + "HQ65", + "HQ66", + "HQ67", + "HQ68", + "HQ69", + "HQ70", + "HQ71", + "HQ72", + "HQ73", + "HQ74", + "HQ75", + "HQ76", + "HQ77", + "HQ78", + "HQ79", + "HQ80", + "HQ81", + "HQ82", + "HQ83", + "HQ84", + "HQ85", + "HQ86", + "HQ87", + "HQ88", + "HQ89", + "HQ90", + "HQ91", + "HQ93", + "HQ94", + "HQ95", + "HQ96", + "HQ97", + "HQ98", + "HQ99", + "HR00", + "HR01", + "HR02", + "HR03", + "HR10", + "HR11", + "HR12", + "HR13", + "HR20", + "HR21", + "HR22", + "HR23", + "HR30", + "HR31", + "HR32", + "HR33", + "HR40", + "HR41", + "HR42", + "HR43", + "HR50", + "HR51", + "HR52", + "HR53", + "HR60", + "HR61", + "HR62", + "HR63", + "HR70", + "HR71", + "HR72", + "HR73", + "HR80", + "HR81", + "HR82", + "HR90", + "HR91", + "HR92", + "IQ04", + "IQ05", + "IQ06", + "IQ07", + "IQ08", + "IQ09", + "IQ14", + "IQ15", + "IQ17", + "IQ18", + "IQ19", + "IR00", + "IR01", + "IR02", + "IR10", + "IR11", + "IR20", + "IR21", + "IR30", + "IR31", + "IR41" + ], + "prefix": ["OX", "=OX/ON6JUN/LH", "XP"], + "worked": false, + "confirmed": false, + "flag": "gl.png", + "pp": "OX", + "lat": 73.4695457135058, + "lon": -40.69958847736626, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "221": { + "dxcc": "238", + "cc": "GB", + "ccc": "GBR", + "name": "南奥克尼岛", + "continent": "SA", + "ituzone": ["73"], + "cqzone": ["13"], + "timezone": "-3", + "ccode": "826", + "aname": "South Orkney Is.", + "mh": ["GC69", "GC79"], + "prefix": [ + "=AY1ZA", + "=LU1ZA", + "=LU2ERA/Z", + "=LU3DO/Z", + "=LU4ZD", + "=LW1ZA", + "=VP8/VP8DXU", + "=VP8ORK", + "=VP8PIG", + "=VP8SIG" + ], + "worked": false, + "confirmed": false, + "flag": "gb.png", + "pp": "VP8/o", + "lat": -60.59301923576971, + "lon": -45.34979423868312, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "222": { + "dxcc": "239", + "cc": "HU", + "ccc": "HUN", + "name": "匈牙利", + "continent": "EU", + "ituzone": ["28"], + "cqzone": ["15"], + "timezone": "1", + "ccode": "348", + "aname": "Hungary", + "mh": [ + "JN85", + "JN86", + "JN87", + "JN88", + "JN95", + "JN96", + "JN97", + "JN98", + "KN06", + "KN07", + "KN08", + "KN17", + "KN18" + ], + "prefix": [ + "HA", + "=HA3FPI/YL", + "=HA5BA/YL", + "=HA5FQ/J", + "=HA5FQ/JOTA", + "=HA5YA/YL", + "=HA5YG/YL", + "HG", + "=HG4I/LH" + ], + "worked": false, + "confirmed": false, + "flag": "hu.png", + "pp": "HA", + "lat": 47.13737338862552, + "lon": 18.827160493827165, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "223": { + "dxcc": "240", + "cc": "GS", + "ccc": "SGS", + "name": "南桑德韦奇岛", + "continent": "SA", + "ituzone": ["73"], + "cqzone": ["13"], + "timezone": "-3", + "ccode": "239", + "aname": "South Sandwich Is.", + "mh": ["HD60", "HD61", "HD62", "HD63"], + "prefix": ["=VP8STI", "=VP8THU"], + "worked": false, + "confirmed": false, + "flag": "gs.png", + "pp": "VP8/s", + "lat": -57.952196072873775, + "lon": -26.57407407407408, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "224": { + "dxcc": "241", + "cc": "GB", + "ccc": "GBR", + "name": "南设特兰群岛", + "continent": "SA", + "ituzone": ["73"], + "cqzone": ["13"], + "timezone": "-4", + "ccode": "826", + "aname": "South Shetland Is.", + "mh": ["FC86", "FC87", "FC96", "FC97", "GC07", "GC08", "GC17", "GC18"], + "prefix": [ + "=BY/R1ANF", + "=CA8WCI/9", + "CE9", + "=CV0A", + "=D88S", + "=DP1ANF", + "=DT8A", + "=EA/FT5YK", + "=EA/FT5YK/P", + "=EA1CYK/P", + "=EA1CYK/VP8", + "=EA4FZR", + "=EA4FZR/P", + "=ED3RKL", + "=HC/FT5YK", + "=HF0/R1ANF", + "=HF0APAS", + "=HF0ARC", + "=HF0POL", + "=HF0POL/LH", + "=HF0QF", + "=HL0KSJ", + "=HL8KSJ", + "=I1SR", + "=KC4/HF0POL", + "=LU/R1ANF", + "=LU1ZC", + "=LU1ZI", + "=LU1ZI/HF0POL", + "=LU1ZS", + "=LU4AA/Z", + "=LU4CJM/Z", + "=LU8DIP/Z", + "=LW8DOH/Z", + "=LZ0A", + "=OA0/FT5YJ", + "=OA0MP", + "=OL0ANT", + "=R1/HF0POL", + "=R1ANF", + "=R1ANF/A", + "=R1ANF/B", + "=R1ANF/HF0POL", + "=R1ANF/MM", + "=R1ANF/P", + "=R1ANF/VP8", + "=R1ANY", + "=RI1ANB", + "=RI1ANF", + "=RI1ANF/B", + "=RI1ANF/FF", + "=RI1ANF/P", + "=RI1ANO", + "=RI1ANU", + "=RI20ANT", + "=RI44ANT", + "=RI50ANO", + "=RI59ANT", + "=VP8/EA1CYK", + "=VP8/EA1CYK/P", + "=VP8/LZ1UQ", + "=VP8/LZ2UU", + "=VP8DJK", + "XR9", + "=ZX0ECF", + "=ZX0GTI" + ], + "worked": false, + "confirmed": false, + "flag": "gb.png", + "pp": "VP8/h", + "lat": -62.601873599365966, + "lon": -60.877914951989034, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "225": { + "dxcc": "242", + "cc": "IS", + "ccc": "ISL", + "name": "冰岛", + "continent": "EU", + "ituzone": ["17"], + "cqzone": ["40"], + "timezone": "0", + "ccode": "352", + "aname": "Iceland", + "mh": [ + "HP74", + "HP75", + "HP83", + "HP84", + "HP85", + "HP86", + "HP93", + "HP94", + "HP95", + "HP96", + "IP03", + "IP04", + "IP05", + "IP06", + "IP13", + "IP14", + "IP15", + "IP16", + "IP24", + "IP25", + "IP26", + "IP34", + "IP35" + ], + "prefix": [ + "TF", + "=TF1IRA/LGT", + "=TF1IRA/LH", + "=TF1IRA/LT", + "=TF8IRA/LH", + "=TF8RX/LGT", + "=TF8RX/LH" + ], + "worked": false, + "confirmed": false, + "flag": "is.png", + "pp": "TF", + "lat": 64.83571405592735, + "lon": -18.580246913580247, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "227": { + "dxcc": "245", + "cc": "IE", + "ccc": "IRL", + "name": "爱尔兰", + "continent": "EU", + "ituzone": ["27"], + "cqzone": ["14"], + "timezone": "0", + "ccode": "372", + "aname": "Ireland", + "mh": [ + "IO41", + "IO42", + "IO43", + "IO44", + "IO51", + "IO52", + "IO53", + "IO54", + "IO55", + "IO61", + "IO62", + "IO63", + "IO64", + "IO65", + "IO72" + ], + "prefix": [ + "EI", + "=EI0CAR/LH", + "=EI0CPL/LH", + "=EI0LHL/LH", + "=EI0M/LH", + "=EI1K/LH", + "=EI1KARG/LH", + "=EI1NC/LH", + "=EI4LRC/LH", + "=EI5ML/LH", + "EJ" + ], + "worked": false, + "confirmed": false, + "flag": "ie.png", + "pp": "EI", + "lat": 53.582414036884984, + "lon": -8.333333333333337, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "228": { + "dxcc": "246", + "cc": "MT", + "ccc": "MLT", + "name": "马耳他", + "continent": "EU", + "ituzone": ["28"], + "cqzone": ["15"], + "timezone": "1", + "ccode": "470", + "aname": "Sovereign Military Order of Malta", + "mh": ["JN61"], + "prefix": ["1A"], + "worked": false, + "confirmed": false, + "flag": "mt.png", + "pp": "1A", + "lat": 41.905192, + "lon": 12.480572, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "229": { + "dxcc": "247", + "cc": "PH", + "ccc": "PHL", + "name": "中国南沙群岛", + "continent": "AS", + "ituzone": ["50"], + "cqzone": ["26"], + "timezone": "7", + "ccode": "608", + "aname": "Spratly Is.", + "mh": ["OJ79", "OJ89", "OK70", "OK71", "OK80", "OK81"], + "prefix": [ + "9M0", + "=9M2/PG5M", + "=9M4SDX", + "=9M4SLL", + "=9M6/LA6VM", + "=9M6/LA7XK", + "=9M6/N1UR", + "=9M6/OH2YY", + "BM9S", + "BN9S", + "BO9S", + "BP9S", + "BQ9S", + "BU9S", + "BV9S", + "BW9S", + "BX9S", + "=DX0JP", + "=DX0K", + "=DX0P" + ], + "worked": false, + "confirmed": false, + "flag": "cn.png", + "pp": "1S", + "lat": 9.74688452371069, + "lon": 114.44444444444443, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "230": { + "dxcc": "248", + "cc": "IT", + "ccc": "ITA", + "name": "意大利", + "continent": "EU", + "ituzone": ["28"], + "cqzone": ["15"], + "timezone": "1", + "ccode": "380", + "aname": "Italy", + "mh": [ + "JM67", + "JM68", + "JM76", + "JM77", + "JM78", + "JM79", + "JM87", + "JM88", + "JM89", + "JM99", + "JN33", + "JN34", + "JN35", + "JN36", + "JN43", + "JN44", + "JN45", + "JN46", + "JN51", + "JN52", + "JN53", + "JN54", + "JN55", + "JN56", + "JN57", + "JN60", + "JN61", + "JN62", + "JN63", + "JN64", + "JN65", + "JN66", + "JN67", + "JN70", + "JN71", + "JN72", + "JN80", + "JN81", + "JN90" + ], + "prefix": [ + "=4U0WFP", + "=4U13FEB", + "=4U1GSC", + "=4U20B", + "=4U24OCT", + "=4U29MAY", + "=4U4F", + "=4U5F", + "=4U6F", + "=4U73B", + "=4U7F", + "=4U7FOC", + "=4U80FOC", + "=4U8F", + "=4U8FOC", + "I", + "=I1MQ/N", + "=I1ULJ/N", + "=I1XSG/N", + "=I1YRL/GRA", + "=I2AZ/CA", + "=I2AZ/N", + "=I2CZQ/N", + "=I3GJJ/J", + "=I3TXQ/N", + "=I4CQO/N", + "=I5OYY/N", + "=I6DHY/CASA", + "=I6FDJ/LH", + "=I6FDJ/N", + "=I6HWD/CA", + "=I6HWD/LH", + "=I6KIU/6/LH", + "=I7PXV/LH", + "=I7PXV/P/LH", + "=I7XUW/MI/224", + "=IA5/IW3ILP/L", + "IB9", + "=IC8/DJ5AA/LH", + "ID9", + "IE9", + "IF9", + "IG9", + "IH9", + "=II0GDF/9", + "=II0IDR/NAVY", + "=II0PN/MM", + "=II1PV/LH", + "=II1RT/N", + "=II3T/LH", + "=II4CPG/LH", + "=II4GOR/LH", + "=II7IAOI/N", + "=II7PT/C", + "=II7PT/D", + "=II7PT/E", + "=II7PT/F", + "=II7PT/G", + "=II7PT/H", + "=II7PT/L", + "=II8ICN/NAVY", + "II9", + "IJ9", + "=IK0ATK/N", + "=IK0CNA/LH", + "=IK0JFS/N", + "=IK0XFD/N", + "=IK1RED/N", + "=IK1VDN/N", + "=IK2CZQ/N", + "=IK2FIQ/N", + "=IK2MKM/EXPO", + "=IK2RLS/8/LH", + "=IK2SOE/CA", + "=IK2SOE/N", + "=IK3TZB/N", + "=IK5IWU/N", + "=IK5TSZ/N", + "=IK6XOU/LH", + "=IK6XUL/LH", + "=IK6YXM/N", + "=IK7JWX/LH", + "=IK7SHC/MT", + "=IK8IJN/I/US", + "=IK8TEO/N", + "=IN3IKF/J", + "=IN3TJK/YL", + "IO9", + "=IO9Y", + "=IP1T/LH", + "=IP5P/LH", + "=IQ0AP/J", + "=IQ0CV/LH", + "=IQ0FM/LH", + "=IQ0FR/LH", + "=IQ0GV/AAW", + "=IQ1L/LH", + "=IQ1NM/REX", + "=IQ1QQ/9", + "=IQ1SP/N", + "=IQ2LB/EXPO", + "=IQ2MI/J", + "=IQ3DD/MCC", + "=IQ3FL/J", + "=IQ3TS/LGT", + "=IQ3TS/LH", + "=IQ3V/LH", + "=IQ4FA/J", + "=IQ4FJ/J", + "=IQ4RA/LH", + "=IQ4RN/LGT", + "=IQ4RN/LH", + "=IQ5AA/J", + "=IQ5AE/J", + "=IQ5LI/J", + "=IQ5LV/J", + "=IQ6FU/LH", + "=IQ6PS/LH", + "=IQ6SB/LGH", + "=IQ6SB/LGT", + "=IQ6SB/LH", + "=IQ6VP/J", + "=IQ7ML/J", + "=IQ7ML/LH", + "=IQ7QK/LH", + "=IQ8OM/N", + "=IQ8PC/BWL", + "=IQ8XS/CEU", + "IQ9", + "=IR0BP/J", + "IR9", + "IT9", + "=IT9AAK/8", + "=IT9CHU/J", + "=IT9CKA/CA", + "=IT9CLY/JZK", + "=IT9DSA/CA", + "=IT9DTU/N", + "=IT9GDS/WLK", + "=IT9HBS/LH", + "=IT9JZK/WLK", + "=IT9KKE/JZK", + "=IT9MRM/N", + "=IT9MRZ/LH", + "=IT9NCO/LH", + "=IT9NCO/N", + "=IT9OTF/JZK", + "=IT9RGY/4", + "=IT9RRU/LH", + "=IT9RYH/J", + "=IT9RYH/N", + "=IT9ZSB/LH", + "=IU0FSC/LH", + "=IU1LCI/EMG", + "=IU5JHK/J", + "=IU7SCT/J", + "=IU8CEU/8CZ", + "IU9", + "=IV3TRK/N", + "=IW0HBY/9", + "=IW0HP/N", + "=IW2NUY/N", + "=IW3BSQ/LH", + "=IW4EGX/LH", + "=IW5DAX/J", + "=IW8FFG/J", + "IW9", + "=IW9GSH/0", + "=IY1SP/ASB", + "=IY1SP/MTN", + "IY9", + "=IY9A", + "=IZ0BXZ/N", + "=IZ0DBA/N", + "=IZ0EGC/N", + "=IZ0FVD/N", + "=IZ0HTW/PS", + "=IZ0HTW/SP", + "=IZ0IAT/LH", + "=IZ0IJC/BSM", + "=IZ0IJC/FF", + "=IZ0IJC/N", + "=IZ1CLA/N", + "=IZ1ESH/EMG", + "=IZ1FCF/N", + "=IZ1GDB/EMG", + "=IZ1POA/N", + "=IZ1RGI/ECO", + "=IZ2DPX/7/LH", + "=IZ2MYA/EXPO", + "=IZ3DBA/N", + "=IZ3GHP/N", + "=IZ3QCH/N", + "=IZ3SZQ/N", + "=IZ4AIH/J", + "=IZ5AHB/N", + "=IZ5GST/1/LH", + "=IZ6ASI/LH", + "=IZ6ASI/N", + "=IZ6CDI/O", + "=IZ6RWD/O", + "=IZ6TGS/LH", + "=IZ6TGS/N", + "=IZ7DKA/YL", + "=IZ7KDX/LH", + "=IZ7LDC/LH", + "=IZ8AJQ/LGT", + "=IZ8AJQ/LH", + "=IZ8DBJ/LGT", + "=IZ8DBJ/LH", + "=IZ8FMU/KR", + "=IZ8IZK/YL", + "=IZ8JPV/N", + "=IZ8QNX/N" + ], + "worked": false, + "confirmed": false, + "flag": "it.png", + "pp": "I", + "lat": 43.21370806481059, + "lon": 12.04389574759945, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "231": { + "dxcc": "249", + "cc": "KN", + "ccc": "KNA", + "name": "圣基茨和尼维斯", + "continent": "NA", + "ituzone": ["11"], + "cqzone": ["8"], + "timezone": "-4", + "ccode": "659", + "aname": "St. Kitts & Nevis", + "mh": ["FK87"], + "prefix": ["V4"], + "worked": false, + "confirmed": false, + "flag": "kn.png", + "pp": "V4", + "lat": 17.26216013215648, + "lon": -62.64386827512367, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "232": { + "dxcc": "250", + "cc": "SH", + "ccc": "SHN", + "name": "圣赫勒拿岛", + "continent": "AF", + "ituzone": ["66"], + "cqzone": ["36"], + "timezone": "0", + "ccode": "654", + "aname": "St. Helena", + "mh": ["IH73", "IH74"], + "prefix": ["ZD7"], + "worked": false, + "confirmed": false, + "flag": "sh.png", + "pp": "ZD7", + "lat": -15.88750753624791, + "lon": -5.761316872427983, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "233": { + "dxcc": "251", + "cc": "LI", + "ccc": "LIE", + "name": "列支敦斯登", + "continent": "EU", + "ituzone": ["28"], + "cqzone": ["14"], + "timezone": "1", + "ccode": "438", + "aname": "Liechtenstein", + "mh": ["JN47"], + "prefix": ["HB0", "HE0"], + "worked": false, + "confirmed": false, + "flag": "li.png", + "pp": "HB0", + "lat": 47.14738202317682, + "lon": 9.535432907886296, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "234": { + "dxcc": "252", + "cc": "CA", + "ccc": "CAN", + "name": "圣保罗岛", + "continent": "NA", + "ituzone": ["9"], + "cqzone": ["5"], + "timezone": "-5", + "ccode": "124", + "aname": "St Paul I.", + "mh": ["AO47"], + "prefix": ["CY9"], + "worked": false, + "confirmed": false, + "flag": "ca.png", + "pp": "CY9", + "lat": 57.125, + "lon": -170.284167, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "235": { + "dxcc": "253", + "cc": "BR", + "ccc": "BRA", + "name": "圣彼得及圣保罗礁", + "continent": "SA", + "ituzone": ["13"], + "cqzone": ["11"], + "timezone": "-2", + "ccode": "76", + "aname": "St. Peter & St. Paul Rocks", + "mh": ["HJ50"], + "prefix": [ + "PP0S", + "PP0ZS", + "PQ0S", + "PQ0ZS", + "PR0S", + "PR0ZS", + "PS0S", + "PS0ZS", + "PT0S", + "PT0ZS", + "PU0S", + "PU0ZS", + "PV0S", + "PV0ZS", + "PW0S", + "PW0ZS", + "PX0S", + "PX0ZS", + "PY0S", + "PY0ZS", + "ZV0S", + "ZV0ZS", + "ZW0S", + "ZW0ZS", + "ZX0S", + "ZX0ZS", + "ZY0S", + "ZY0ZS", + "ZZ0S", + "ZZ0ZS" + ], + "worked": false, + "confirmed": false, + "flag": "br.png", + "pp": "PY0S", + "lat": 0.9144559159400387, + "lon": -29.355281207133064, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "236": { + "dxcc": "254", + "cc": "LU", + "ccc": "LUX", + "name": "卢森堡", + "continent": "EU", + "ituzone": ["27"], + "cqzone": ["14"], + "timezone": "1", + "ccode": "442", + "aname": "Luxembourg", + "mh": ["JN29", "JN39", "JO20", "JO30"], + "prefix": ["LX", "=LX9S/J"], + "worked": false, + "confirmed": false, + "flag": "lu.png", + "pp": "LX", + "lat": 49.80231992981862, + "lon": 5.938119189147995, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "237": { + "dxcc": "256", + "cc": "PT", + "ccc": "PRT", + "name": "马德拉岛", + "continent": "AF", + "ituzone": ["36"], + "cqzone": ["33"], + "timezone": "-1", + "ccode": "620", + "aname": "Madeira Is.", + "mh": ["IM12", "IM13"], + "prefix": [ + "CQ2", + "CQ3", + "CQ9", + "CR3", + "CR9", + "CS3", + "CS9", + "CT3", + "CT9", + "=CT9500AEP/J" + ], + "worked": false, + "confirmed": false, + "flag": "pt.png", + "pp": "CT3", + "lat": 32.92029745097433, + "lon": -16.99588477366256, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "238": { + "dxcc": "257", + "cc": "MT", + "ccc": "MLT", + "name": "马耳他", + "continent": "EU", + "ituzone": ["28"], + "cqzone": ["15"], + "timezone": "1", + "ccode": "470", + "aname": "Malta", + "mh": ["JM75", "JM76"], + "prefix": [ + "9H", + "=9H1AW/EU25", + "=9H1EI/EU25", + "=9H1JN/EU25", + "=9H1MRL/EU25", + "=9H1RV/EU25", + "=9H1SP/EU25", + "=9H1VC/CGA", + "=9H1VC/CGS", + "=9H1VC/KHS", + "=9H1VC/KHS/P", + "=9H1ZZ/EU25", + "=9H4GRS/LH", + "=9H9DSG/J", + "=9H9PSG/J", + "=9H9SEL/LH" + ], + "worked": false, + "confirmed": false, + "flag": "mt.png", + "pp": "9H", + "lat": 35.93683840789497, + "lon": 14.247828074988568, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "240": { + "dxcc": "259", + "cc": "SJ", + "ccc": "SJM", + "name": "斯瓦尔巴群岛", + "continent": "EU", + "ituzone": ["18"], + "cqzone": ["40"], + "timezone": "1", + "ccode": "744", + "aname": "Svalbard", + "mh": [ + "IQ50", + "IQ51", + "IQ61", + "JQ58", + "JQ59", + "JQ67", + "JQ68", + "JQ69", + "JQ76", + "JQ77", + "JQ78", + "JQ79", + "JQ86", + "JQ87", + "JQ88", + "JQ89", + "JQ94", + "JQ97", + "JQ98", + "JQ99", + "JR70", + "JR80", + "JR90", + "KQ07", + "KQ08", + "KQ09", + "KQ17", + "KQ18", + "KQ19", + "KQ26", + "KQ27", + "KQ29", + "KQ38", + "KQ39", + "KQ48", + "KQ58", + "KQ59", + "KR00", + "KR10", + "KR20", + "KR30", + "KR40", + "KR50", + "KR60", + "KR80" + ], + "prefix": [ + "JW", + "=JW/LB2PG", + "=JW0BEA", + "=JW1I", + "=JW2US", + "=JW2VOA", + "=JW3FL", + "=JW4GHA", + "=JW4JSA", + "=JW4LN", + "=JW5RIA", + "=JW7VW", + "=JW9JKA" + ], + "worked": false, + "confirmed": false, + "flag": "no.png", + "pp": "JW", + "lat": 78.90727011875092, + "lon": 14.305555555555562, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "241": { + "dxcc": "260", + "cc": "MC", + "ccc": "MCO", + "name": "摩纳哥", + "continent": "EU", + "ituzone": ["27"], + "cqzone": ["14"], + "timezone": "1", + "ccode": "492", + "aname": "Monaco", + "mh": ["JN33"], + "prefix": ["3A", "=3A/4Z5KJ/LH"], + "worked": false, + "confirmed": false, + "flag": "mc.png", + "pp": "3A", + "lat": 47.72198976138523, + "lon": 14.259259259259265, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "243": { + "dxcc": "262", + "cc": "TJ", + "ccc": "TJK", + "name": "塔吉克斯坦", + "continent": "AS", + "ituzone": ["30"], + "cqzone": ["17"], + "timezone": "6", + "ccode": "762", + "aname": "Tajikistan", + "mh": [ + "MM36", + "MM37", + "MM39", + "MM46", + "MM47", + "MM48", + "MM49", + "MM56", + "MM57", + "MM58", + "MM59", + "MM66", + "MM67", + "MM68", + "MM69", + "MM77", + "MM78", + "MN40", + "MN50", + "MN51" + ], + "prefix": ["EY", "=U8JB"], + "worked": false, + "confirmed": false, + "flag": "tj.png", + "pp": "EY", + "lat": 38.75699087356182, + "lon": 69.4833104709648, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "244": { + "dxcc": "263", + "cc": "NL", + "ccc": "NLD", + "name": "荷兰", + "continent": "EU", + "ituzone": ["27"], + "cqzone": ["14"], + "timezone": "1", + "ccode": "528", + "aname": "Netherlands", + "mh": [ + "JO11", + "JO20", + "JO21", + "JO22", + "JO23", + "JO30", + "JO31", + "JO32", + "JO33" + ], + "prefix": [ + "PA", + "=PA/DF8WA/LH", + "=PA/DL0IGA/LH", + "=PA/DL1KVN/LH", + "=PA/DL2GW/LH", + "=PA/DL2KSB/LH", + "=PA/DL5SE/LH", + "=PA/ON4NOK/LH", + "=PA/ON6EF/LH", + "=PA0GOR/J", + "=PA0XAW/LH", + "=PA100J/J", + "=PA100SH/J", + "=PA110HL/LH", + "=PA110LL/LH", + "=PA14NAWAKA/J", + "=PA1BDO/LH", + "=PA1BP/J", + "=PA1FJ/J", + "=PA1FR/LH", + "=PA1VLD/LH", + "=PA2008NJ/J", + "=PA25SCH/LH", + "=PA2DK/J", + "=PA2LS/YL", + "=PA3AAF/LH", + "=PA3AFG/J", + "=PA3BDQ/LH", + "=PA3BIC/LH", + "=PA3BXR/MILL", + "=PA3CNI/LH", + "=PA3CNI/LT", + "=PA3CPI/J", + "=PA3CPI/JOTA", + "=PA3DEW/J", + "=PA3EEQ/LH", + "=PA3EFR/J", + "=PA3ESO/J", + "=PA3EWG/J", + "=PA3FBO/LH", + "=PA3FYE/J", + "=PA3GAG/LH", + "=PA3GQS/J", + "=PA3GWN/J", + "=PA3HFJ/J", + "=PA3WSK/JOTA", + "=PA40LAB/J", + "=PA4RVS/MILL", + "=PA4WK/J", + "=PA5CA/LH", + "=PA65DUIN/J", + "=PA65URK/LH", + "=PA6ADZ/MILL", + "=PA6ARC/LH", + "=PA6FUN/LGT", + "=PA6FUN/LH", + "=PA6FUN/LS", + "=PA6HOOP/MILL", + "=PA6HYG/J", + "=PA6JAM/J", + "=PA6KMS/MILL", + "=PA6LH/LH", + "=PA6LL/LH", + "=PA6LST/LH", + "=PA6LST/LS", + "=PA6MZD/MILL", + "=PA6OP/MILL", + "=PA6RCG/J", + "=PA6SB/L", + "=PA6SB/LH", + "=PA6SCH/LH", + "=PA6SHB/J", + "=PA6SJB/J", + "=PA6SJS/J", + "=PA6STAR/MILL", + "=PA6URK/LH", + "=PA6VEN/LH", + "=PA6VLD/LH", + "=PA6WAD/LGT", + "=PA70HYG/JOTA", + "=PA75SM/J", + "=PA7AL/LH", + "=PA7HPH/J", + "=PA7JWC/J", + "=PA99HYG/JOTA", + "=PA9M/LH", + "PB", + "=PB6F/LH", + "=PB6KW/LH", + "=PB88XYL/YL", + "=PB9ZR/J", + "PC", + "=PC2D/LH", + "PD", + "=PD0ARI/MILL", + "=PD0FSB/LH", + "=PD1JL/MILL", + "=PD1JSH/J", + "=PD2C/LH", + "=PD2GCM/LH", + "=PD5CW/LH", + "=PD5MVH/P/LH", + "=PD7DX/J", + "PE", + "=PE18KA/J", + "=PE1NCS/LGT", + "=PE1NCS/LH", + "=PE1NZJ/J", + "=PE1OPM/LH", + "=PE1OXI/J", + "=PE1RBG/J", + "=PE1RBR/J", + "=PE2MC/J", + "=PE2MGA/J", + "PF", + "=PF100ROVER/J", + "=PF18NAWAKA/J", + "=PF4R/LH", + "PG", + "=PG150N/LH", + "=PG64HOOP/MIL", + "=PG6HK/LH", + "=PG6N/LH", + "PH", + "=PH4RTM/MILL", + "=PH4RTM/WHE", + "=PH50GFB/J", + "=PH6BB/J", + "=PH6WAL/LH", + "=PH75S/J", + "=PH9GFB/J", + "PI", + "=PI4ADH/LGT", + "=PI4ADH/LH", + "=PI4ADH/LS", + "=PI4ALK/LH", + "=PI4AZL/J", + "=PI4BG/J", + "=PI4BOZ/LH", + "=PI4CQ/J", + "=PI4DHG/DM", + "=PI4DHG/MILL", + "=PI4ET/MILL", + "=PI4ETL/MILL", + "=PI4F/LH", + "=PI4LDN/L", + "=PI4LDN/LH", + "=PI4RCK/LGT", + "=PI4RCK/LH", + "=PI4RIS/J", + "=PI4S/J", + "=PI4SHV/J", + "=PI4SRN/LH", + "=PI4SRN/MILL", + "=PI4VNW/LGT", + "=PI4VNW/LH", + "=PI4VPO/LH", + "=PI4VPO/LT", + "=PI4WAL/LGT", + "=PI4WAL/LH", + "=PI4WBR/LH", + "=PI4WFL/MILL", + "=PI4YLC/LH", + "=PI4ZHE/LH", + "=PI4ZHE/LS", + "=PI4ZHE/MILL", + "=PI4ZVL/FD", + "=PI4ZVL/LGT", + "=PI4ZVL/LH", + "=PI4ZWN/MILL", + "=PI9NHL/LH", + "=PI9SRS/LH", + "=PI9TP/J" + ], + "worked": false, + "confirmed": false, + "flag": "nl.png", + "pp": "PA", + "lat": 52.42687798783527, + "lon": 5.459533607681754, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "246": { + "dxcc": "265", + "cc": "IE", + "ccc": "IRL", + "name": "北爱尔兰", + "continent": "EU", + "ituzone": ["27"], + "cqzone": ["14"], + "timezone": "0", + "ccode": "372", + "aname": "Northern Ireland", + "mh": ["IO54", "IO64", "IO65", "IO74"], + "prefix": [ + "2I", + "=2O0BAD", + "=2O0HBO", + "=2O0HRV", + "=2O0MFB", + "=2O0TWA", + "=2O0VEP", + "=2O0VGW", + "=2O0VIM", + "=2O0WAI", + "=2O0ZXM", + "=2Q0BSA", + "=2Q0ETB", + "=2Q0HRV", + "=2Q0MFB", + "=2Q0NIE", + "=2Q0SXG", + "=2Q0TWA", + "=2Q0VEP", + "=2Q0VIM", + "=2Q0ZXM", + "=2R0IRZ", + "=2R0IRZ/P", + "=2R0KPY", + "=2R0KYE", + "=2R0MFB", + "=2R0PTX", + "=2R0RMD", + "=2R0RVH", + "=2R0TCA", + "=2R0TMR", + "=2R0VAX", + "=2R0VEP", + "=2R0VIM", + "=2R0WAI", + "=2R0WMN", + "=2V0CSB", + "=GB0ARM", + "=GB0AS", + "=GB0AVB", + "=GB0BIG", + "=GB0BMS", + "=GB0BPM", + "=GB0BTC", + "=GB0BVC", + "=GB0C", + "=GB0CAS", + "=GB0CBS", + "=GB0COA", + "=GB0CSC", + "=GB0DDF", + "=GB0EBG", + "=GB0EG", + "=GB0FMF", + "=GB0FMH", + "=GB0GDI", + "=GB0GLS", + "=GB0GPF", + "=GB0KKM", + "=GB0LNR", + "=GB0LSP", + "=GB0LVA", + "=GB0MAH", + "=GB0MAR", + "=GB0MFD", + "=GB0OGC", + "=GB0PAT", + "=GB0PSM", + "=GB0REL", + "=GB0RSL", + "=GB0SBG", + "=GB0SPD", + "=GB0TCH", + "=GB0TGN", + "=GB0USR", + "=GB0VC", + "=GB0WOA", + "=GB100BOS", + "=GB100RNR", + "=GB106TBC", + "=GB150WCB", + "=GB16SW", + "=GB1918EKN", + "=GB19CGI", + "=GB19CNI", + "=GB1AFP", + "=GB1BPM", + "=GB1DDG", + "=GB1IMD", + "=GB1RM", + "=GB1ROC", + "=GB1SPD", + "=GB1SRI", + "=GB1UAS", + "=GB1WWC", + "=GB2AD", + "=GB2AD/P", + "=GB2AS", + "=GB2BCW", + "=GB2BDS", + "=GB2BOA", + "=GB2CA", + "=GB2CRU", + "=GB2DCI", + "=GB2DMR", + "=GB2DPC", + "=GB2IL", + "=GB2LL", + "=GB2LOL", + "=GB2MAC", + "=GB2MRI", + "=GB2PP", + "=GB2PSW", + "=GB2REL", + "=GB2SDD", + "=GB2SPD", + "=GB2SPR", + "=GB2STI", + "=GB2STP", + "=GB2SW", + "=GB2UAS", + "=GB3NGI", + "=GB4CSC", + "=GB4CTL", + "=GB4ONI", + "=GB4PS", + "=GB4SOS", + "=GB4SPD", + "=GB4UAS", + "=GB50AAD", + "=GB50CSC", + "=GB5BIG", + "=GB5BL", + "=GB5BL/LH", + "=GB5DPR", + "=GB5NHS", + "=GB5OMU", + "=GB5SPD", + "=GB6EPC", + "=GB6VCB", + "=GB8BKY", + "=GB8BRM", + "=GB8DS", + "=GB8EGT", + "=GB8GLM", + "=GB8ROC", + "=GB8SPD", + "=GB90RSGB/82", + "=GB90SOM", + "=GB9RAF", + "=GB9SPD", + "GI", + "GN", + "=GN0LIX/LH", + "=GN4GTY/LH", + "=GO0AQD", + "=GO0BJH", + "=GO0DUP", + "=GO3KVD", + "=GO3MMF", + "=GO3SG", + "=GO4DOH", + "=GO4GID", + "=GO4GUH", + "=GO4LKG", + "=GO4NKB", + "=GO4ONL", + "=GO4OYM", + "=GO4SRQ", + "=GO4SZW", + "=GO6MTL", + "=GO7AXB", + "=GO7KMC", + "=GO8YYM", + "=GQ0AQD", + "=GQ0BJG", + "=GQ0NCA", + "=GQ0RQK", + "=GQ0TJV", + "=GQ0UVD", + "=GQ1CET", + "=GQ3KVD", + "=GQ3MMF", + "=GQ3SG", + "=GQ3UZJ", + "=GQ3XRQ", + "=GQ4DOH", + "=GQ4GID", + "=GQ4GUH", + "=GQ4JTF", + "=GQ4LKG", + "=GQ4LXL", + "=GQ4NKB", + "=GQ4ONL", + "=GQ4OYM", + "=GQ4SZW", + "=GQ6JPO", + "=GQ6MTL", + "=GQ7AXB", + "=GQ7JYK", + "=GQ7KMC", + "=GQ8RQI", + "=GQ8YYM", + "=GR0BJH", + "=GR0BRO", + "=GR0DVU", + "=GR0RQK", + "=GR0RWO", + "=GR0UVD", + "=GR1CET", + "=GR3GTR", + "=GR3KDR", + "=GR3SG", + "=GR3WEM", + "=GR4AAM", + "=GR4DHW", + "=GR4DOH", + "=GR4FUE", + "=GR4FUM", + "=GR4GID", + "=GR4GOS", + "=GR4GUH", + "=GR4KQU", + "=GR4LXL", + "=GR4NKB", + "=GR6JPO", + "=GR7AXB", + "=GR7KMC", + "=GR8RKC", + "=GR8RQI", + "=GR8YYM", + "=GV1BZT", + "=GV3KVD", + "=GV3SG", + "=GV4FUE", + "=GV4GUH", + "=GV4JTF", + "=GV4LXL", + "=GV4SRQ", + "=GV4WVN", + "=GV7AXB", + "=GV7THH", + "MI", + "=MI5AFK/2K", + "MN", + "=MN0NID/LH", + "=MO0ALS", + "=MO0BDZ", + "=MO0CBH", + "=MO0IOU", + "=MO0IRZ", + "=MO0JFC", + "=MO0JFC/P", + "=MO0JML", + "=MO0JST", + "=MO0KYE", + "=MO0LPO", + "=MO0MOD", + "=MO0MOD/P", + "=MO0MSR", + "=MO0MVP", + "=MO0RRE", + "=MO0RUC", + "=MO0RYL", + "=MO0TGO", + "=MO0VAX", + "=MO0ZXZ", + "=MO3RLA", + "=MO6AOX", + "=MO6NIR", + "=MO6TUM", + "=MO6WAG", + "=MO6WDB", + "=MO6YDR", + "=MQ0ALS", + "=MQ0BDZ", + "=MQ0BPB", + "=MQ0GGB", + "=MQ0IRZ", + "=MQ0JFC", + "=MQ0JST", + "=MQ0KAM", + "=MQ0KYE", + "=MQ0MOD", + "=MQ0MSR", + "=MQ0MVP", + "=MQ0RMD", + "=MQ0RRE", + "=MQ0RUC", + "=MQ0RYL", + "=MQ0TGO", + "=MQ0VAX", + "=MQ0ZXZ", + "=MQ3GHW", + "=MQ3RLA", + "=MQ3STV", + "=MQ5AFK", + "=MQ6AOX", + "=MQ6BJG", + "=MQ6GDN", + "=MQ6WAG", + "=MQ6WDB", + "=MQ6WGM", + "=MR0GDO", + "=MR0GGB", + "=MR0JFC", + "=MR0KQU", + "=MR0LPO", + "=MR0MOD", + "=MR0MSR", + "=MR0MVP", + "=MR0RUC", + "=MR0SAI", + "=MR0SMK", + "=MR0TFK", + "=MR0TLG", + "=MR0TMW", + "=MR0VAX", + "=MR0WWB", + "=MR1CCU", + "=MR3RLA", + "=MR3TFF", + "=MR3WHM", + "=MR5AMO", + "=MR6CCU", + "=MR6CWC", + "=MR6GDN", + "=MR6MME", + "=MR6MRJ", + "=MR6OKS", + "=MR6OLA", + "=MR6PUX", + "=MR6WAG", + "=MR6XGZ", + "=MV0ALS", + "=MV0GGB", + "=MV0IOU", + "=MV0JFC", + "=MV0JLC", + "=MV0MOD", + "=MV0MSR", + "=MV0MVP", + "=MV0TGO", + "=MV0VAX", + "=MV0WGM", + "=MV0ZAO", + "=MV1VOX", + "=MV6DTE", + "=MV6GTY", + "=MV6NIR", + "=MV6TLG" + ], + "worked": false, + "confirmed": false, + "flag": "ni2.png", + "pp": "GI", + "lat": 54.580198906226656, + "lon": -6.721536351165983, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "247": { + "dxcc": "266", + "cc": "NO", + "ccc": "NOR", + "name": "挪威", + "continent": "EU", + "ituzone": ["18"], + "cqzone": ["14"], + "timezone": "1", + "ccode": "578", + "aname": "Norway", + "mh": [ + "JO28", + "JO29", + "JO37", + "JO38", + "JO39", + "JO48", + "JO49", + "JO58", + "JO59", + "JO69", + "JP20", + "JP21", + "JP22", + "JP30", + "JP31", + "JP32", + "JP33", + "JP40", + "JP41", + "JP42", + "JP43", + "JP44", + "JP50", + "JP51", + "JP52", + "JP53", + "JP54", + "JP55", + "JP60", + "JP61", + "JP62", + "JP63", + "JP64", + "JP65", + "JP66", + "JP67", + "JP68", + "JP74", + "JP75", + "JP76", + "JP77", + "JP78", + "JP79", + "JP86", + "JP87", + "JP88", + "JP89", + "JP98", + "JP99", + "JQ90", + "KP08", + "KP09", + "KP18", + "KP19", + "KP28", + "KP29", + "KP39", + "KP49", + "KP59", + "KQ00", + "KQ10", + "KQ11", + "KQ20", + "KQ21", + "KQ30", + "KQ31", + "KQ40", + "KQ41", + "KQ50" + ], + "prefix": [ + "LA", + "=LA1BFA/U", + "=LA1EK/E", + "=LA1ENA/H", + "=LA1G/H", + "=LA1IO/L", + "=LA1K/U", + "=LA1LO/H", + "=LA1MFA/X", + "=LA1RSA/X", + "=LA1TV/F", + "=LA1U/X", + "=LA1YE/C", + "=LA2AB/C", + "=LA2D/F", + "=LA2DS/C", + "=LA2HFA/C", + "=LA2OJ/Z", + "=LA2SM/X", + "=LA2T/U", + "=LA3BO/Z", + "=LA3CC/C", + "=LA3F/C", + "=LA3F/E", + "=LA3TK/E", + "=LA4AAA/U", + "=LA4CIA/H", + "=LA4EJ/W", + "=LA4KF/K", + "=LA4KQ/X", + "=LA4NE/X", + "=LA4NE/Y", + "=LA4NL/X", + "=LA4PM/U", + "=LA4RI/Y", + "=LA4RT/U", + "=LA4XX/U", + "=LA4YW/U", + "=LA5A/Y", + "=LA5FH/Z", + "=LA5G/E", + "=LA5HE/H", + "=LA5MT/D", + "=LA5SAA/L", + "=LA5UF/H", + "=LA5UF/Z", + "=LA5UH/Z", + "=LA5YE/F", + "=LA5YI/F", + "=LA6DW/C", + "=LA6DW/S", + "=LA6FJA/E", + "=LA6GX/X", + "=LA6M/X", + "=LA6MT/D", + "=LA6OM/C", + "=LA6QT/X", + "=LA6TPA/V", + "=LA6XI/F", + "=LA6XI/Z", + "=LA7AK/L", + "=LA7DHA/C", + "=LA7FF/F", + "=LA7HAA/W", + "=LA7HJ/W", + "=LA7IM/X", + "=LA7QI/L", + "=LA7TO/L", + "=LA7VK/C", + "=LA8G/U", + "=LA8NHA/F", + "=LA8NSA/F", + "=LA8OM/K", + "=LA8OM/L", + "=LA8QI/L", + "=LA8TIA/C", + "=LA8UL/X", + "=LA8WG/V", + "=LA9BM/F", + "=LA9DFA/D", + "=LA9DK/S", + "=LA9FG/P", + "=LA9GY/U", + "=LA9IX/U", + "=LA9JM/Z", + "=LA9OI/C", + "=LA9YBA/W", + "=LA9ZL/I", + "LB", + "=LB1JG/C", + "=LB7FA/F", + "LC", + "LD", + "LE", + "LF", + "LG", + "LH", + "LI", + "=LI3C/D", + "=LI7HJ/W", + "=LI7VK/C", + "LJ", + "=LJ3RE/E", + "=LJ6BG/L", + "LK", + "LL", + "LM", + "LN" + ], + "worked": false, + "confirmed": false, + "flag": "no.png", + "pp": "LA", + "lat": 61.78931287876756, + "lon": 8.45679012345679, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "250": { + "dxcc": "269", + "cc": "PL", + "ccc": "POL", + "name": "波兰", + "continent": "EU", + "ituzone": ["28"], + "cqzone": ["15"], + "timezone": "1", + "ccode": "616", + "aname": "Poland", + "mh": [ + "JN89", + "JN99", + "JO70", + "JO71", + "JO72", + "JO73", + "JO74", + "JO80", + "JO81", + "JO82", + "JO83", + "JO84", + "JO90", + "JO91", + "JO92", + "JO93", + "JO94", + "KN09", + "KN19", + "KO00", + "KO01", + "KO02", + "KO03", + "KO04", + "KO10", + "KO11", + "KO12", + "KO13", + "KO14", + "KO20" + ], + "prefix": [ + "3Z", + "=3Z1EE/LH", + "=3Z50KPN/FF", + "HF", + "=HF25NHV/FF", + "=HF80BUJ/FF", + "SN", + "=SN1D/LH", + "=SN2NP/LH", + "SO", + "=SO1WE/LH", + "=SO1ZV/LH", + "SP", + "=SP0PGC/FF", + "=SP1/DM3VA/LH", + "=SP1KBK/LH", + "=SP1KNM/LH", + "=SP1NY/MM", + "=SP1RWK/LH", + "=SP1ZZ/1/LH", + "=SP1ZZ/LH", + "=SP2AYC/LH", + "=SP2BNJ/LH", + "=SP2FAP/FF", + "=SP2HHC/LH", + "=SP2KAC/LH", + "=SP2KDS/LH", + "=SP2KJF/FF", + "=SP2MHC/LH", + "=SP2PHA/LH", + "=SP2PMW/LH", + "=SP2PZH/LH", + "=SP2QCR/LH", + "=SP2WGZ/LH", + "=SP3VT/1/LH", + "=SP4KDX/FF", + "=SP5EZJ/LH", + "=SP5G/FF", + "=SP5KAB/LH", + "=SP5PB/2/LH", + "=SP5VYI/FF", + "=SP5X/FF", + "=SP6HFT/FF", + "=SP6NIO/FF", + "=SP9EWM/FF", + "=SP9KJU/FF", + "SQ", + "=SQ1KSL/YL", + "=SQ2PHG/LH", + "=SQ2PHI/LH", + "=SQ3PMM/FF", + "=SQ4G/FF", + "=SQ5AWR/FF", + "=SQ5Q/FF", + "=SQ8VPS/YOTA", + "SR" + ], + "worked": false, + "confirmed": false, + "flag": "pl.png", + "pp": "SP", + "lat": 52.39340721341131, + "lon": 18.827160493827165, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "251": { + "dxcc": "270", + "cc": "TK", + "ccc": "TKL", + "name": "托克劳群岛", + "continent": "OC", + "ituzone": ["62"], + "cqzone": ["31"], + "timezone": "-11", + "ccode": "772", + "aname": "Tokelau Is.", + "mh": ["AI31", "AI40", "AI41"], + "prefix": ["ZK3"], + "worked": false, + "confirmed": false, + "flag": "tk.png", + "pp": "ZK3", + "lat": -8.997992102417214, + "lon": -171.88843164151808, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "253": { + "dxcc": "272", + "cc": "PT", + "ccc": "PRT", + "name": "葡萄牙", + "continent": "EU", + "ituzone": ["37"], + "cqzone": ["14"], + "timezone": "0", + "ccode": "620", + "aname": "Portugal", + "mh": [ + "IM57", + "IM58", + "IM59", + "IM66", + "IM67", + "IM68", + "IM69", + "IN50", + "IN51", + "IN52", + "IN60", + "IN61" + ], + "prefix": [ + "CQ", + "CR", + "=CR5FB/LH", + "=CR6L/LT", + "=CR6YLH/LT", + "CS", + "=CS2HNI/LH", + "=CS5ARAM/LH", + "=CS5E/LH", + "CT", + "=CT/DJ5AA/LH", + "=CT1BWW/LH", + "=CT1GFK/LH", + "=CT1GPQ/LGT", + "=CT7/ON4LO/LH", + "=CT7/ON7RU/LH" + ], + "worked": false, + "confirmed": false, + "flag": "pt.png", + "pp": "CT", + "lat": 40.08854112698404, + "lon": -8.086419753086416, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "254": { + "dxcc": "273", + "cc": "BR", + "ccc": "BRA", + "name": "特林迪达岛", + "continent": "SA", + "ituzone": ["15"], + "cqzone": ["11"], + "timezone": "-2", + "ccode": "76", + "aname": "Trindade & Martim Vaz Is.", + "mh": ["HG49", "HG59"], + "prefix": [ + "PP0T", + "PP0ZT", + "PQ0T", + "PQ0ZT", + "PR0T", + "PR0ZT", + "PS0T", + "PS0ZT", + "PT0T", + "PT0ZT", + "PU0T", + "PU0ZT", + "PV0T", + "PV0ZT", + "PW0T", + "PW0ZT", + "PX0T", + "PX0ZT", + "PY0T", + "PY0ZT", + "ZV0T", + "ZV0ZT", + "ZW0T", + "ZW0ZT", + "ZX0T", + "ZX0ZT", + "ZY0T", + "ZY0ZT", + "ZZ0T", + "ZZ0ZT" + ], + "worked": false, + "confirmed": false, + "flag": "br.png", + "pp": "PY0T", + "lat": -20.43922902630665, + "lon": -29.318701417466844, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "255": { + "dxcc": "274", + "cc": "GB", + "ccc": "GBR", + "name": "特里斯坦达库尼亚岛", + "continent": "AF", + "ituzone": ["66"], + "cqzone": ["38"], + "timezone": "0", + "ccode": "826", + "aname": "Tristan da Cunha & Gough I.", + "mh": ["IE49", "IE59"], + "prefix": ["ZD9"], + "worked": false, + "confirmed": false, + "flag": "gb.png", + "pp": "ZD9", + "lat": -40.22483307510095, + "lon": -10.013717421124825, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "256": { + "dxcc": "275", + "cc": "RO", + "ccc": "ROU", + "name": "罗马尼亚", + "continent": "EU", + "ituzone": ["28"], + "cqzone": ["20"], + "timezone": "2", + "ccode": "642", + "aname": "Romania", + "mh": [ + "KN04", + "KN05", + "KN06", + "KN07", + "KN13", + "KN14", + "KN15", + "KN16", + "KN17", + "KN18", + "KN23", + "KN24", + "KN25", + "KN26", + "KN27", + "KN28", + "KN33", + "KN34", + "KN35", + "KN36", + "KN37", + "KN38", + "KN43", + "KN44", + "KN45", + "KN46", + "KN47" + ], + "prefix": [ + "YO", + "=YO3FRI/YL", + "=YO4ASG/LH", + "=YO4BBH/LH", + "=YO4GDP/LH", + "=YO4GJS/LH", + "YP", + "YQ", + "YR" + ], + "worked": false, + "confirmed": false, + "flag": "ro.png", + "pp": "YO", + "lat": 45.94863490370827, + "lon": 24.629629629629637, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "257": { + "dxcc": "276", + "cc": "FR", + "ccc": "FRA", + "name": "特罗梅林岛", + "continent": "AF", + "ituzone": ["53"], + "cqzone": ["39"], + "timezone": "4", + "ccode": "250", + "aname": "Tromelin I.", + "mh": ["LH74"], + "prefix": [ + "=FR/F6KDF/T", + "=FR5ZU/T", + "FT0T", + "FT1T", + "FT2T", + "FT3T", + "FT4T", + "FT5T", + "FT6T", + "FT7T", + "FT8T", + "FT9T" + ], + "worked": false, + "confirmed": false, + "flag": "fr.png", + "pp": "FT/t", + "lat": -15.869915528394685, + "lon": 54.45816186556929, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "258": { + "dxcc": "277", + "cc": "CA", + "ccc": "CAN", + "name": "克利珀顿岛", + "continent": "NA", + "ituzone": ["9"], + "cqzone": ["5"], + "timezone": "-4", + "ccode": "666", + "aname": "St Pierre & Miquelon", + "mh": ["GN16", "GN17"], + "prefix": ["FP", "=TO200SPM", "=TO2U", "=TO5FP", "=TO5M", "=TO80SP"], + "worked": false, + "confirmed": false, + "flag": "pm.png", + "pp": "FP", + "lat": 47.04397972429109, + "lon": -56.31458619112939, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "259": { + "dxcc": "278", + "cc": "SM", + "ccc": "SMR", + "name": "圣马利诺", + "continent": "EU", + "ituzone": ["28"], + "cqzone": ["15"], + "timezone": "1", + "ccode": "674", + "aname": "San Marino", + "mh": ["JN63"], + "prefix": ["T7"], + "worked": false, + "confirmed": false, + "flag": "sm.png", + "pp": "T7", + "lat": 43.933333, + "lon": 12.433333, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "260": { + "dxcc": "279", + "cc": "GB", + "ccc": "GBR", + "name": "苏格兰", + "continent": "EU", + "ituzone": ["27"], + "cqzone": ["14"], + "timezone": "0", + "ccode": "826", + "aname": "Scotland", + "mh": [ + "IO57", + "IO65", + "IO66", + "IO67", + "IO68", + "IO74", + "IO75", + "IO76", + "IO77", + "IO78", + "IO84", + "IO85", + "IO86", + "IO87", + "IO88", + "IO89", + "IO95", + "IO97", + "IO99", + "IP80", + "IP90" + ], + "prefix": [ + "2A", + "2M", + "=2M0BDR", + "=2M0BDT", + "=2M0CPN", + "=2M0GFC", + "=2M0SEG", + "=2M0SPX", + "=2M0VIK", + "=2M0ZET", + "=2M1ANT", + "=2M1ASQ", + "=2M1ODL", + "=2O0BSE", + "=2O0BZB", + "=2O0HJS", + "=2O0IMP", + "=2O0IOB", + "=2O0IVG", + "=2O0LIM", + "=2O0LJM", + "=2O0TOK", + "=2O1MIC", + "=2O1SJB", + "=2Q0BSE", + "=2Q0BZB", + "=2Q0FYG", + "=2Q0HJS", + "=2Q0IMP", + "=2Q0IOB", + "=2Q0JOK", + "=2Q0LDO", + "=2Q0TAX", + "=2Q0TOK", + "=2Q0YCG", + "=2Q1MIC", + "=2Q1SJB", + "=2R0BOO", + "=2R0BSE", + "=2R0BXN", + "=2R0BZB", + "=2R0DES", + "=2R0DXR", + "=2R0FYG", + "=2R0GLI", + "=2R0HJS", + "=2R0IMP", + "=2R0IOB", + "=2R0ISM", + "=2R0JVR", + "=2R0KAU", + "=2R0KAU/P", + "=2R0NCM", + "=2R0OXX", + "=2R0YCG", + "=2R0ZPS", + "=2R1MIC", + "=2R1SJB", + "=2V0GUL", + "=2V0IVG", + "=2V0JCH", + "=2V0KAU", + "=2V0TAX", + "=2V1HFE", + "=2V1MIC", + "=2V1SJB", + "=G0FBJ", + "=GA6NX/LH", + "=GB0AYR", + "=GB0BAJ", + "=GB0BCG", + "=GB0BCK", + "=GB0BD", + "=GB0BDC", + "=GB0BL", + "=GB0BNA", + "=GB0BNC", + "=GB0BOC", + "=GB0BOL", + "=GB0BSS", + "=GB0BWT", + "=GB0CCF", + "=GB0CHL", + "=GB0CLH", + "=GB0CML", + "=GB0CNL", + "=GB0CWF", + "=GB0CWS", + "=GB0DAM", + "=GB0DAW", + "=GB0DBS", + "=GB0DHL", + "=GB0DPK", + "=GB0EPC", + "=GB0FFS", + "=GB0FSG", + "=GB0GDS", + "=GB0GDS/J", + "=GB0GGR", + "=GB0GRN", + "=GB0HHW", + "=GB0HLD", + "=GB0JOG", + "=GB0KEY", + "=GB0KGS", + "=GB0KKS", + "=GB0KLT", + "=GB0LCS", + "=GB0LCW", + "=GB0LTM", + "=GB0MLH", + "=GB0MLM", + "=GB0MOG", + "=GB0MOL", + "=GB0MSL", + "=GB0MUL", + "=GB0NGG", + "=GB0NHL", + "=GB0NHL/LH", + "=GB0NRL", + "=GB0OYT", + "=GB0PLS", + "=GB0POS", + "=GB0PPE", + "=GB0PSW", + "=GB0RGC", + "=GB0SAA", + "=GB0SBC", + "=GB0SCD", + "=GB0SFM", + "=GB0SHP", + "=GB0SI", + "=GB0SK", + "=GB0SKG", + "=GB0SKY", + "=GB0SRC", + "=GB0SSB", + "=GB0TH", + "=GB0THL", + "=GB0TNL", + "=GB0TTS", + "=GB0WRH", + "=GB100MAS", + "=GB100MUC", + "=GB100ZET", + "=GB10SP", + "=GB150NRL", + "=GB18FIFA", + "=GB19CGM", + "=GB19CS", + "=GB1AJ", + "=GB1ASC", + "=GB1ASH", + "=GB1BD", + "=GB1BOL", + "=GB1CFL", + "=GB1DHL", + "=GB1FB", + "=GB1FRS", + "=GB1FS", + "=GB1FVS", + "=GB1FVT", + "=GB1GEO", + "=GB1HRS", + "=GB1KGG", + "=GB1KLD", + "=GB1LAY", + "=GB1LGG", + "=GB1LL", + "=GB1MAY", + "=GB1NHL", + "=GB1OL", + "=GB1OL/LH", + "=GB1PC", + "=GB1RB", + "=GB1RHU", + "=GB1SLH", + "=GB1TAY", + "=GB1WLG", + "=GB250RB", + "=GB2AES", + "=GB2AGG", + "=GB2AL", + "=GB2AST", + "=GB2ATC", + "=GB2AYR", + "=GB2BAJ", + "=GB2BHM", + "=GB2BHS", + "=GB2BMJ", + "=GB2BOL", + "=GB2CAS", + "=GB2CHC", + "=GB2CM", + "=GB2CMA", + "=GB2CVL", + "=GB2DAS", + "=GB2DAW", + "=GB2DHS", + "=GB2DL", + "=GB2DRC", + "=GB2DT", + "=GB2DTM", + "=GB2ELH", + "=GB2ELH/LH", + "=GB2EPC", + "=GB2FBM", + "=GB2FSM", + "=GB2FSW", + "=GB2GEO", + "=GB2GKR", + "=GB2GNL", + "=GB2GNL/LH", + "=GB2GTM", + "=GB2GVC", + "=GB2HLB", + "=GB2HMC", + "=GB2HRH", + "=GB2IGB", + "=GB2IGS", + "=GB2IMG", + "=GB2IMM", + "=GB2INV", + "=GB2IOT", + "=GB2JCM", + "=GB2KDR", + "=GB2KGB", + "=GB2KW", + "=GB2LBN", + "=GB2LBN/LH", + "=GB2LCL", + "=GB2LCP", + "=GB2LCT", + "=GB2LDG", + "=GB2LG", + "=GB2LGB", + "=GB2LHI", + "=GB2LK", + "=GB2LK/LH", + "=GB2LMG", + "=GB2LP", + "=GB2LS", + "=GB2LS/LH", + "=GB2LSS", + "=GB2LT", + "=GB2LT/LH", + "=GB2LXX", + "=GB2M", + "=GB2MAS", + "=GB2MBB", + "=GB2MDG", + "=GB2MN", + "=GB2MOF", + "=GB2MSL", + "=GB2MUC", + "=GB2MUL", + "=GB2NBC", + "=GB2NEF", + "=GB2NL", + "=GB2NMM", + "=GB2OL", + "=GB2OWM", + "=GB2PBF", + "=GB2PG", + "=GB2QM", + "=GB2RB", + "=GB2RDR", + "=GB2RRL", + "=GB2RWW", + "=GB2SAA", + "=GB2SAM", + "=GB2SAS", + "=GB2SB", + "=GB2SBG", + "=GB2SHL/LH", + "=GB2SKG", + "=GB2SLH", + "=GB2SMM", + "=GB2SOH", + "=GB2SQN", + "=GB2SR", + "=GB2SSB", + "=GB2SUM", + "=GB2SWF", + "=GB2TDS", + "=GB2THL", + "=GB2THL/LH", + "=GB2TNL", + "=GB2VCB", + "=GB2VEF", + "=GB2WAM", + "=GB2WBF", + "=GB2WG", + "=GB2WLS", + "=GB2YLS", + "=GB2ZE", + "=GB3ANG", + "=GB3GKR", + "=GB3LER", + "=GB3LER/B", + "=GB3ORK", + "=GB3ORK/B", + "=GB3SWF", + "=GB3WOI", + "=GB4AAS", + "=GB4AST", + "=GB4BBR", + "=GB4BG", + "=GB4CGS", + "=GB4CMA", + "=GB4DAS", + "=GB4DHX", + "=GB4DTD", + "=GB4DUK", + "=GB4EPC", + "=GB4FFS", + "=GB4GD", + "=GB4GDS", + "=GB4GS", + "=GB4IE", + "=GB4JCM", + "=GB4JPJ", + "=GB4JYS", + "=GB4LER", + "=GB4MSE", + "=GB4NFE", + "=GB4OL", + "=GB4PAS", + "=GB4SK", + "=GB4SKO", + "=GB4SLH", + "=GB4SMM", + "=GB4SRO", + "=GB4SWF", + "=GB50FVS", + "=GB50GDS", + "=GB50GT", + "=GB50JS", + "=GB5AG", + "=GB5AST", + "=GB5BBS", + "=GB5BOH", + "=GB5C", + "=GB5CCC", + "=GB5CS", + "=GB5DHL", + "=GB5DX", + "=GB5EMF", + "=GB5FHC", + "=GB5FLM", + "=GB5JS", + "=GB5LTH", + "=GB5RO", + "=GB5RO/LH", + "=GB5RR", + "=GB5SI", + "=GB5TAM", + "=GB5TI", + "=GB60CRB", + "=GB6BEN", + "=GB6TAA", + "=GB6WW", + "=GB75CC", + "=GB75GD", + "=GB80GD", + "=GB8AYR", + "=GB8CSL", + "=GB8FSG", + "=GB8RU", + "=GB8RUM", + "=GB90RSGB/11", + "=GB90RSGB/12", + "=GB90RSGB/21", + "=GB90RSGB/22", + "=GB90RSGB/23", + "=GB999SPC", + "=GG100AGG", + "=GG100GA", + "=GG100GCC", + "=GG100GGP", + "=GG100GGR", + "=GG100GLD", + "=GG100SBG", + "GM", + "=GM/DL5SE/LH", + "=GM0AVR", + "=GM0AZC/2K", + "=GM0CXQ", + "=GM0CYJ", + "=GM0DHZ/P", + "=GM0DJI", + "=GM0EKM", + "=GM0GFL", + "=GM0GFL/P", + "=GM0ILB", + "=GM0JDB", + "=GM0KTO/2K", + "=GM0MUN/2K", + "=GM0SGB/M", + "=GM0SGB/P", + "=GM0VFA", + "=GM0WUX/2K", + "=GM1BYL", + "=GM1CBQ", + "=GM1FGN", + "=GM1KKI", + "=GM1MXN", + "=GM1ZNR", + "=GM3JIJ/2K", + "=GM3KLA", + "=GM3KZH", + "=GM3OFT/P", + "=GM3RFR", + "=GM3SJA", + "=GM3SKN", + "=GM3TKV/LH", + "=GM3TTC/P", + "=GM3TXF/P", + "=GM3USR/P", + "=GM3VLB/P", + "=GM3WCH", + "=GM3WFK/P", + "=GM3WHT", + "=GM3ZET", + "=GM3ZXH", + "=GM4AFF/P", + "=GM4AGX", + "=GM4CHX/2K", + "=GM4CHX/P", + "=GM4ENK", + "=GM4FNE", + "=GM4GPN", + "=GM4GPP", + "=GM4GQD", + "=GM4GQM", + "=GM4IPK", + "=GM4JPI", + "=GM4LBE", + "=GM4LER", + "=GM4PXG", + "=GM4S", + "=GM4SLV", + "=GM4SSA", + "=GM4WSB/M", + "=GM4WSB/P", + "=GM4WXQ", + "=GM4ZHL", + "=GM4ZVD/P", + "=GM6RQW", + "=GM6RTO", + "=GM6VZB", + "=GM6WRW/P", + "=GM6WVI", + "=GM6YQA", + "=GM7AFE", + "=GM7GWW", + "=GM7RKD", + "=GM8LNH", + "=GM8MMA", + "=GM8YEC", + "=GO0AEG", + "=GO0AIR", + "=GO0BKC", + "=GO0DBW", + "=GO0DBW/M", + "=GO0DEQ", + "=GO0GMN", + "=GO0OGN", + "=GO0SYY", + "=GO0TUB", + "=GO0VRP", + "=GO0WEZ", + "=GO1BAN", + "=GO1BKF", + "=GO1MQE", + "=GO1TBW", + "=GO2MP", + "=GO3HVK", + "=GO3JIJ", + "=GO3NIG", + "=GO3VTB", + "=GO4BLO", + "=GO4CAU", + "=GO4CFS", + "=GO4CHX", + "=GO4CXM", + "=GO4DLG", + "=GO4EMX", + "=GO4FAM", + "=GO4FAU", + "=GO4JOJ", + "=GO4JPZ", + "=GO4JR", + "=GO4MOX", + "=GO4MSL", + "=GO4PRB", + "=GO4UBJ", + "=GO4VTB", + "=GO4WZG", + "=GO4XQJ", + "=GO6JEP", + "=GO6JRX", + "=GO6KON", + "=GO6LYJ", + "=GO6VCV", + "=GO7GAX", + "=GO7GDE", + "=GO7HUD", + "=GO7TUD", + "=GO7WEF", + "=GO8CBQ", + "=GO8MHU", + "=GO8SVB", + "=GO8TTD", + "=GQ0AEG", + "=GQ0AIR", + "=GQ0BKC", + "=GQ0BWR", + "=GQ0DBW", + "=GQ0DEQ", + "=GQ0DUX", + "=GQ0FNE", + "=GQ0GMN", + "=GQ0HUO", + "=GQ0KWL", + "=GQ0MUN", + "=GQ0NTL", + "=GQ0OGN", + "=GQ0RNR", + "=GQ0TKV/P", + "=GQ0VRP", + "=GQ0WEZ", + "=GQ0WNR", + "=GQ1BAN", + "=GQ1BKF", + "=GQ1MQE", + "=GQ1TBW", + "=GQ3JIJ", + "=GQ3JQJ", + "=GQ3NIG", + "=GQ3NTL", + "=GQ3TKP", + "=GQ3TKP/P", + "=GQ3TKV", + "=GQ3TKV/P", + "=GQ3VTB", + "=GQ3WUX", + "=GQ3ZBE", + "=GQ4AGG", + "=GQ4BAE", + "=GQ4BLO", + "=GQ4CAU", + "=GQ4CFS", + "=GQ4CHX", + "=GQ4CHX/P", + "=GQ4CXM", + "=GQ4DLG", + "=GQ4ELV", + "=GQ4EMX", + "=GQ4FAU", + "=GQ4JOJ", + "=GQ4JPZ", + "=GQ4JR", + "=GQ4MSL", + "=GQ4OBG", + "=GQ4PRB", + "=GQ4UIB", + "=GQ4UPL", + "=GQ4VTB", + "=GQ4WZG", + "=GQ4XQJ", + "=GQ4YMM", + "=GQ6JEP", + "=GQ6JRX", + "=GQ6KON", + "=GQ6LYJ", + "=GQ7GAX", + "=GQ7GDE", + "=GQ7HUD", + "=GQ7TUD", + "=GQ7UED", + "=GQ7WEF", + "=GQ8CBQ", + "=GQ8MHU", + "=GQ8PLR", + "=GQ8SVB", + "=GQ8TTD", + "=GR0AXY", + "=GR0CDV", + "=GR0DBW", + "=GR0EKM", + "=GR0GMN", + "=GR0GRD", + "=GR0HPK", + "=GR0HPL", + "=GR0HUO", + "=GR0OGN", + "=GR0PNS", + "=GR0SYV", + "=GR0TTV", + "=GR0TUB", + "=GR0UKZ", + "=GR0VRP", + "=GR0WED", + "=GR0WNR", + "=GR150NIB", + "=GR1BAN", + "=GR1MWK", + "=GR1TBW", + "=GR1ZIV", + "=GR3JFG", + "=GR3MZX", + "=GR3NIG", + "=GR3OFT", + "=GR3PPE", + "=GR3PYU", + "=GR3VAL", + "=GR3VTB", + "=GR3WFJ", + "=GR3YXJ", + "=GR3ZDH", + "=GR4BDJ", + "=GR4BLO", + "=GR4CAU", + "=GR4CCN", + "=GR4CFS", + "=GR4CMI", + "=GR4CXM", + "=GR4DLG", + "=GR4EMX", + "=GR4EOU", + "=GR4FQE", + "=GR4GIF", + "=GR4JOJ", + "=GR4NSZ", + "=GR4PRB", + "=GR4SQM", + "=GR4VTB", + "=GR4XAW", + "=GR4XMD", + "=GR4XQJ", + "=GR4YMM", + "=GR6JEP", + "=GR6JNJ", + "=GR7AAJ", + "=GR7GAX", + "=GR7GDE", + "=GR7GMC", + "=GR7HHB", + "=GR7HUD", + "=GR7LNO", + "=GR7NZI", + "=GR7TUD", + "=GR7USC", + "=GR7VSB", + "=GR8CBQ", + "=GR8KJO", + "=GR8KPH", + "=GR8MHU", + "=GR8OFQ", + "=GR8SVB", + "GS", + "=GS0AAA", + "=GS0GRC", + "=GS3BSQ", + "=GS3ZET", + "=GS4WAB/P", + "=GS7V", + "=GS8YL", + "=GV0DBW", + "=GV0GMN", + "=GV0GRD", + "=GV0LZE", + "=GV0OBX", + "=GV0OGN", + "=GV0SYV", + "=GV0VRP", + "=GV1BAN", + "=GV3EEW", + "=GV3JIJ", + "=GV3NHQ", + "=GV3NIG", + "=GV3NKG", + "=GV3NNZ", + "=GV3PIP", + "=GV3ULP", + "=GV3VTB", + "=GV4BLO", + "=GV4EMX", + "=GV4HRJ", + "=GV4ILS", + "=GV4JOJ", + "=GV4KLN", + "=GV4LVW", + "=GV4PRB", + "=GV4VTB", + "=GV4XQJ", + "=GV6KON", + "=GV7DHA", + "=GV7GDE", + "=GV7GMC", + "=GV8AVM", + "=GV8DPV", + "=GV8LYS", + "MA", + "=MA0XAU", + "=MA1FJM", + "=MA6PTE", + "=MB18FIFA", + "MM", + "=MM/DH5JBR/P", + "=MM/DJ4OK/M", + "=MM/DJ6OZ", + "=MM/DJ8OK/M", + "=MM/DL5KUA", + "=MM/DL5SE/LH", + "=MM/F5BLC/P", + "=MM/F5LMJ/P", + "=MM/HB9IAB/P", + "=MM/KE5TF/P", + "=MM/N5ET/P", + "=MM/OK1FZM/P", + "=MM/OK1HDU", + "=MM/OK7U", + "=MM/PA9D", + "=MM/PF9DC", + "=MM/W5ZE/P", + "=MM0/DJ6AU", + "=MM0/PA8MO", + "=MM0BNN/LH", + "=MM0BQI/2K", + "=MM0BQN/2K", + "=MM0BYE/2K", + "=MM0DFV/P", + "=MM0ECG", + "=MM0KAL", + "=MM0LON", + "=MM0LON/M", + "=MM0LSM", + "=MM0NQY", + "=MM0SHF/P", + "=MM0VIK", + "=MM0XAU", + "=MM0YHB/P", + "=MM0ZAL", + "=MM0ZCG", + "=MM0ZOL/LH", + "=MM0ZRC", + "=MM1FJM", + "=MM3VQO", + "=MM3ZET", + "=MM5PSL", + "=MM5PSL/P", + "=MM5YLO", + "=MM5YLO/P", + "=MM6ACW", + "=MM6BDU", + "=MM6BZQ", + "=MM6IKB", + "=MM6IMB", + "=MM6MFA", + "=MM6PTE", + "=MM6SJK", + "=MM6YLO", + "=MM6ZBG", + "=MM6ZDW", + "=MM8A", + "=MO0BFF", + "=MO0CWJ", + "=MO0CYR", + "=MO0DBC", + "=MO0DNX", + "=MO0FMF", + "=MO0GXQ", + "=MO0HZT", + "=MO0JST/P", + "=MO0KJG", + "=MO0KSS", + "=MO0NFC", + "=MO0SGQ", + "=MO0SJT", + "=MO0TGB", + "=MO0TSG", + "=MO0WKC", + "=MO0XXW", + "=MO0ZBH", + "=MO1AWV", + "=MO1HMV", + "=MO3BCA", + "=MO3BRR", + "=MO3GPL", + "=MO3OQR", + "=MO3TUP", + "=MO3UVL", + "=MO3YHA", + "=MO3YMU", + "=MO3ZRF", + "=MO5PSL", + "=MO6BJJ", + "=MO6CCS", + "=MO6CHM", + "=MO6CRQ", + "=MO6CRQ/M", + "=MO6DGZ", + "=MO6HUT", + "=MO6KAU", + "=MO6KAU/M", + "=MO6KSJ", + "=MO6MCV", + "=MO6SRL", + "=MO6TEW", + "=MQ0BNN/P", + "=MQ0BQM", + "=MQ0BRG", + "=MQ0CIN", + "=MQ0CXA", + "=MQ0CYR", + "=MQ0DNX", + "=MQ0DXD", + "=MQ0EQE", + "=MQ0FMF", + "=MQ0GXQ", + "=MQ0GYX", + "=MQ0GYX/P", + "=MQ0KJG", + "=MQ0KSS", + "=MQ0LEN", + "=MQ0NFC", + "=MQ0NJC", + "=MQ0SJT", + "=MQ0TSG", + "=MQ0WKC", + "=MQ0XXW", + "=MQ0ZBH", + "=MQ1AWV", + "=MQ1HMV", + "=MQ1JWF", + "=MQ3BCA", + "=MQ3BRR", + "=MQ3ERZ", + "=MQ3FET", + "=MQ3OVK", + "=MQ3SVK", + "=MQ3UIX", + "=MQ3UVL", + "=MQ3YHA", + "=MQ3YMU", + "=MQ3ZRF", + "=MQ5PSL", + "=MQ6AQM", + "=MQ6BJJ", + "=MQ6CCS", + "=MQ6CHM", + "=MQ6CRQ", + "=MQ6DGZ", + "=MQ6HUT", + "=MQ6KAJ", + "=MQ6KAU", + "=MQ6KSJ", + "=MQ6KUA", + "=MQ6LMP", + "=MQ6MCV", + "=MR0BQN", + "=MR0CWB", + "=MR0CXA", + "=MR0DHQ", + "=MR0DWF", + "=MR0DXD", + "=MR0DXH", + "=MR0EPC", + "=MR0EQE", + "=MR0FME", + "=MR0FMF", + "=MR0GCF", + "=MR0GGG", + "=MR0GGI", + "=MR0GOR", + "=MR0HAI", + "=MR0HVU", + "=MR0OIL", + "=MR0POD", + "=MR0PSL", + "=MR0RDM", + "=MR0SGQ", + "=MR0SJT", + "=MR0TAI", + "=MR0TSG", + "=MR0TSS", + "=MR0VTV", + "=MR0WEI", + "=MR0XAF", + "=MR0XXP", + "=MR0XXW", + "=MR1AWV", + "=MR1HMV", + "=MR1JWF", + "=MR1VTB", + "=MR3AWA", + "=MR3AWD", + "=MR3BRR", + "=MR3PTS", + "=MR3UIX", + "=MR3UVL", + "=MR3WJZ", + "=MR3XGP", + "=MR3YHA", + "=MR3YPH", + "=MR3ZCS", + "=MR5PSL", + "=MR6AHB", + "=MR6ARN", + "=MR6ATU", + "=MR6CHM", + "=MR6CTH", + "=MR6CTL", + "=MR6HFC", + "=MR6MCV", + "=MR6RLL", + "=MR6SSI", + "=MR6TMS", + "MS", + "=MS0OXE", + "=MS0ZCG", + "=MS0ZET", + "=MV0DXH", + "=MV0FME", + "=MV0FMF", + "=MV0GHM", + "=MV0HAR", + "=MV0LGS", + "=MV0NFC", + "=MV0NJS", + "=MV0SGQ", + "=MV0SJT", + "=MV0XXW", + "=MV1VTB", + "=MV3BRR", + "=MV3CVB", + "=MV3YHA", + "=MV3YMU", + "=MV5PSL", + "=MV6BJJ", + "=MV6KSJ", + "=MV6NRQ" + ], + "worked": false, + "confirmed": false, + "flag": "sc2.png", + "pp": "GM", + "lat": 56.71589490275045, + "lon": -4.471879286694103, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "261": { + "dxcc": "280", + "cc": "TM", + "ccc": "TKM", + "name": "土库曼斯坦", + "continent": "AS", + "ituzone": ["30"], + "cqzone": ["17"], + "timezone": "5", + "ccode": "795", + "aname": "Turkmenistan", + "mh": [ + "LM67", + "LM68", + "LM69", + "LM77", + "LM78", + "LM79", + "LM87", + "LM88", + "LM89", + "LM96", + "LM97", + "LM98", + "LM99", + "LN60", + "LN61", + "LN62", + "LN70", + "LN71", + "LN72", + "LN80", + "LN81", + "LN82", + "LN90", + "LN91", + "LN92", + "MM05", + "MM06", + "MM07", + "MM08", + "MM09", + "MM15", + "MM16", + "MM17", + "MM18", + "MM19", + "MM26", + "MM27", + "MM28", + "MM29", + "MM37", + "MM38", + "MN00", + "MN01", + "MN02", + "MN10" + ], + "prefix": ["EZ"], + "worked": false, + "confirmed": false, + "flag": "tm.png", + "pp": "EZ", + "lat": 39.105568601836495, + "lon": 59.95884773662552, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "262": { + "dxcc": "281", + "cc": "ES", + "ccc": "ESP", + "name": "西班牙", + "continent": "EU", + "ituzone": ["37"], + "cqzone": ["14"], + "timezone": "1", + "ccode": "724", + "aname": "Spain", + "mh": [ + "IM66", + "IM67", + "IM68", + "IM69", + "IM76", + "IM77", + "IM78", + "IM79", + "IM86", + "IM87", + "IM88", + "IM89", + "IM96", + "IM97", + "IM98", + "IM99", + "IN51", + "IN52", + "IN53", + "IN60", + "IN61", + "IN62", + "IN63", + "IN70", + "IN71", + "IN72", + "IN73", + "IN80", + "IN81", + "IN82", + "IN83", + "IN90", + "IN91", + "IN92", + "IN93", + "JM08", + "JM09", + "JN00", + "JN01", + "JN02", + "JN11", + "JN12" + ], + "prefix": [ + "AM", + "=AM08ATU/H", + "=AM08CAZ/H", + "=AM08CYQ/H", + "=AM08EIE/Z", + "=AM08FAC/H", + "=AM1TDH/LH", + "AN", + "=AN08ADE/H", + "=AN92EXPO", + "AO", + "=AO08BQH/Z", + "=AO08BTM/Z", + "=AO08CIK/H", + "=AO08CVV/Z", + "=AO08CXK/H", + "=AO08CYL/H", + "=AO08DI/Z", + "=AO08EIE/Z", + "=AO08HV/Z", + "=AO08ICA/Z", + "=AO08ID/Z", + "=AO08KJ/Z", + "=AO08KV/Z", + "=AO08OK/H", + "=AO08PB/Z", + "=AO08RKO/H", + "=AO08VK/Z", + "=AO2016DSS/LH", + "=AO7WRD/MA", + "EA", + "=EA1APV/LH", + "=EA1BEY/Y", + "=EA1EEY/L", + "=EA1EEY/LGT", + "=EA1EEY/LH", + "=EA1EK/ZAP", + "=EA1FGS/LH", + "=EA1HLW/YL", + "=EA1RCG/CPV", + "=EA1RCG/SEU", + "=EA1RCG/YOA", + "=EA1RCI/CA", + "=EA1RCI/CR", + "=EA1RCI/CVG", + "=EA1RCI/ESM", + "=EA1RCI/IA", + "=EA1RCI/ICA", + "=EA1RCI/JBN", + "=EA1RCI/KD", + "=EA1RCI/PAZ", + "=EA1RCI/PCV", + "=EA1RCI/RSM", + "=EA1RCI/YOA", + "=EA1URL/CVL", + "=EA1URO/D", + "=EA1URO/KD", + "=EA2/ON7RU/LH", + "=EA2CRX/LH", + "=EA2EZ/P", + "=EA2SPS/LH", + "=EA2URI/O", + "=EA3ESZ/Z", + "=EA3EVR/R", + "=EA3HSD/P", + "=EA3LD/D", + "=EA3RCV/PAZ", + "=EA4AAQ/O", + "=EA4RCH/CIE", + "=EA5/ON4LO/LH", + "=EA5ADM/P", + "=EA5AER/P", + "=EA5CC/P", + "=EA5EQ/N", + "=EA5FL/LH", + "=EA5GVT/AVW", + "=EA5HCC/P", + "=EA5IKT/P", + "=EA5KB/LH", + "=EA5ND/D", + "=EA5RCK/CDI", + "=EA5RKD/PAZ", + "=EA5TOM/AVW", + "=EA5URE/IVA", + "=EA5URE/P", + "=EA5URM/C", + "=EA5URM/F", + "=EA5URM/G", + "=EA5URM/H", + "=EA5URM/I", + "=EA5URM/L", + "=EA5URR/PAZ", + "=EA5URV/CAC", + "=EA6AFU/4", + "=EA6AKN/5", + "=EA6LU/3", + "=EA6QB/1", + "=EA6RC/4", + "=EA6SK/2", + "=EA6SK/7", + "=EA7CFU/U", + "=EA7FC/FCJ", + "=EA7HZ/F", + "=EA7OBH/LH", + "=EA7URA/GET", + "=EA7URA/PAZ", + "=EA7URA/SG", + "=EA7URA/YOTA", + "=EA7URE/PAZ", + "=EA7URF/PAZ", + "=EA7URI/MDL", + "=EA7URJ/CPM", + "=EA7URL/FSV", + "=EA7URM/PAZ", + "=EA7URP/LAI", + "=EA8BFH/1", + "=EA8BFH/4", + "=EA8BFH/5", + "=EA8BFH/P", + "=EA8BY/4", + "=EA8CWF/5", + "=EA8CZT/1", + "=EA8FC/1", + "=EA8RV/P", + "=EA8TL/3", + "=EA9BLJ/5", + "=EA9CD/1", + "=EA9CI/1", + "=EA9CI/3", + "=EA9CI/4", + "=EA9CI/5", + "=EA9CP/1", + "=EA9CP/2", + "=EA9CP/3", + "=EA9CP/4", + "=EA9CP/5", + "=EA9CP/7", + "=EA9FN/7", + "=EA9HU", + "=EA9HU/7", + "=EA9JS/7", + "=EA9LZ/7", + "=EA9PD/1", + "=EA9PD/5", + "=EA9PD/7", + "=EA9QD/7", + "=EA9UL/7", + "=EA9UV/7", + "EB", + "=EB1DH/LH", + "=EB9PH/7", + "EC", + "=EC7DZZ/LH", + "ED", + "=ED1IRM/LH", + "=ED5MFP/C", + "=ED5MFP/G", + "=ED5MFP/H", + "=ED5MFP/I", + "=ED5MFP/K", + "=ED5MFP/Q", + "=ED5MFP/R", + "=ED5MFP/S", + "=ED5URD/LH", + "EE", + "EF", + "EG", + "=EG1ILW/LH", + "=EG1LWB/LH", + "=EG1LWC/LH", + "=EG1LWI/LH", + "=EG1LWN/LH", + "=EG1TDH/LH", + "=EG5FOM/LH", + "=EG8AOP/4", + "=EG90IARU", + "=EG90IARU/1", + "=EG90IARU/2", + "=EG90IARU/3", + "=EG90IARU/4", + "=EG90IARU/5", + "=EG90IARU/7", + "EH", + "=EH5FL/LH" + ], + "worked": false, + "confirmed": false, + "flag": "es.png", + "pp": "EA", + "lat": 40.559154598116976, + "lon": -4.012345679012349, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "263": { + "dxcc": "282", + "cc": "TV", + "ccc": "TUV", + "name": "图瓦卢", + "continent": "OC", + "ituzone": ["65"], + "cqzone": ["31"], + "timezone": "12", + "ccode": "798", + "aname": "Tuvalu", + "mh": ["RI82", "RI83", "RI84", "RI91", "RI92"], + "prefix": ["T2"], + "worked": false, + "confirmed": false, + "flag": "tv.png", + "pp": "T2", + "lat": -7.957829892568569, + "lon": 178.39506172839504, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "264": { + "dxcc": "283", + "cc": "CY", + "ccc": "CYP", + "name": "英国塞浦路斯基地", + "continent": "AS", + "ituzone": ["39"], + "cqzone": ["20"], + "timezone": "2", + "ccode": "196", + "aname": "UK Sovereign Base Areas on Cyprus", + "mh": ["KM64"], + "prefix": ["ZC4", "=ZC4ATC/2000Y"], + "worked": false, + "confirmed": false, + "flag": "cy.png", + "pp": "ZC4", + "lat": 34.988108821063875, + "lon": 33.779579169340195, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "265": { + "dxcc": "284", + "cc": "SE", + "ccc": "SWE", + "name": "瑞典", + "continent": "EU", + "ituzone": ["18"], + "cqzone": ["14"], + "timezone": "1", + "ccode": "752", + "aname": "Sweden", + "mh": [ + "JO57", + "JO58", + "JO59", + "JO65", + "JO66", + "JO67", + "JO68", + "JO69", + "JO75", + "JO76", + "JO77", + "JO78", + "JO79", + "JO86", + "JO87", + "JO88", + "JO89", + "JO96", + "JO97", + "JO98", + "JO99", + "JP60", + "JP61", + "JP62", + "JP63", + "JP64", + "JP70", + "JP71", + "JP72", + "JP73", + "JP74", + "JP75", + "JP76", + "JP80", + "JP81", + "JP82", + "JP83", + "JP84", + "JP85", + "JP86", + "JP87", + "JP88", + "JP90", + "JP92", + "JP93", + "JP94", + "JP95", + "JP96", + "JP97", + "JP98", + "KP03", + "KP04", + "KP05", + "KP06", + "KP07", + "KP08", + "KP09", + "KP15", + "KP16", + "KP17", + "KP18", + "KP25", + "KP26" + ], + "prefix": [ + "7S", + "=7S0SFJ/LGT", + "=7S0SFJ/LH", + "=7S0SFJ/LS", + "=7S5LH/LH", + "=7S7KUL/LH", + "=7S7SAN/LH", + "=7S7V/LH", + "8S", + "=8S0UN/LH", + "=8S6NAV/LH", + "=8S6VAN/LH", + "=8S7GL/LH", + "=8S7L/LH", + "=8S7LHJ/LH", + "=8S8ODEN", + "=8S8ODEN/MM", + "SA", + "=SA2YLM/YL", + "=SA6AJK/2M", + "=SA7SM/LH", + "=SA7SM/LT", + "SB", + "=SB5RAFS/LH", + "=SB6HL/LH", + "SC", + "SD", + "SE", + "=SE3TLG/LH", + "=SE7M/LH", + "SF", + "=SF1B/LH", + "=SF7KUL/LH", + "SG", + "SH", + "=SH5FEM/LH", + "=SH6HUL/LH", + "SI", + "=SI2SSA/LH", + "SJ", + "SK", + "=SK0BJ/LH", + "=SK2AU/LGT", + "=SK2AU/LH", + "=SK3BG/LH", + "=SK3GK/LGT", + "=SK3GK/LH", + "=SK3GK/LT", + "=SK3LH/LH", + "=SK5BB/LS", + "=SK5UM/JOTA", + "=SK5WB/LH", + "=SK6FL/LS", + "=SK6MA/LH", + "=SK6QA/LH", + "=SK6RM/IMD", + "=SK7DX/LH", + "=SK7FK/LGT", + "=SK7FK/LH", + "=SK7FK/LHT", + "=SK7L/LH", + "=SK7RN/LH", + "SL", + "SM", + "=SM/DL6II/LH", + "=SM/RX3AMI/LH", + "=SM/RX3AMI/LS", + "=SM0SVI/LGT", + "=SM1YRA/LH", + "=SM2JKI/S", + "=SM3BDZ/2M", + "=SM3DMP/2M", + "=SM3TLG/LGT", + "=SM3TLG/LH", + "=SM5EUG/2M", + "=SM5FAN/2M", + "=SM6AAL/S", + "=SM7AAL/S", + "=SM7DAY/LH" + ], + "worked": false, + "confirmed": false, + "flag": "se.png", + "pp": "SM", + "lat": 62.93454916292774, + "lon": 15.370370370370368, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "266": { + "dxcc": "285", + "cc": "VI", + "ccc": "VIR", + "name": "美属维京岛", + "continent": "NA", + "ituzone": ["11"], + "cqzone": ["8"], + "timezone": "-4", + "ccode": "850", + "aname": "Virgin Is.", + "mh": ["FK77", "FK78"], + "prefix": [ + "=AC7FX", + "=AJ2O", + "=K5KFL", + "=K5TP", + "=K8RF", + "=KA7KDU", + "=KB1MDZ", + "=KB1ZTY", + "=KB3ZUD", + "=KB9ALR", + "=KC9MCN", + "=KD4SGB", + "=KD5QJN", + "=KF2HC", + "=KF4CGR", + "=KF4MSI", + "=KG4SZC", + "=KG5KHO", + "=KG6KVR", + "=KH2XQ", + "=KH2XR", + "=KI4FOE", + "=KI6BLD", + "=KJ6IR", + "=KL7NZ", + "KP2", + "=KR7O/R", + "=KV4/W2KW", + "=KV4AD", + "=KV4BA", + "=KV4BT", + "=KV4BW", + "=KV4CF", + "=KV4CQ/P", + "=KV4DN", + "=KV4EY", + "=KV4FZ", + "=KV4HR", + "=KV4IH", + "=KV4JC", + "=KV4KW", + "=N1TKK", + "=N1VKI", + "NP2", + "=W0AIH/KV4", + "=W0YNY", + "=W2AZK", + "=W2KW/KV4", + "=W3K/KD2CLB", + "=W4LIS", + "=WA4HLB", + "=WB2KQW", + "=WB4WFU", + "=WD8AHQ", + "=WI7C", + "WP2" + ], + "worked": false, + "confirmed": false, + "flag": "vi.png", + "pp": "KP2", + "lat": 17.754856960562208, + "lon": -64.78280749885687, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "267": { + "dxcc": "286", + "cc": "UG", + "ccc": "UGA", + "name": "乌干达", + "continent": "AF", + "ituzone": ["48"], + "cqzone": ["37"], + "timezone": "3", + "ccode": "800", + "aname": "Uganda", + "mh": [ + "KI48", + "KI49", + "KI58", + "KI59", + "KI69", + "KJ40", + "KJ50", + "KJ51", + "KJ52", + "KJ53", + "KJ60", + "KJ61", + "KJ62", + "KJ63", + "KJ64", + "KJ70", + "KJ71", + "KJ72", + "KJ73", + "KJ74" + ], + "prefix": ["5X"], + "worked": false, + "confirmed": false, + "flag": "ug.png", + "pp": "5X", + "lat": 1.7555551469176152, + "lon": 32.181069958847736, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "268": { + "dxcc": "287", + "cc": "CH", + "ccc": "CHE", + "name": "瑞士", + "continent": "EU", + "ituzone": ["28"], + "cqzone": ["14"], + "timezone": "1", + "ccode": "756", + "aname": "Switzerland", + "mh": ["JN26", "JN35", "JN36", "JN37", "JN45", "JN46", "JN47", "JN56"], + "prefix": [ + "=4U0G", + "=4U1AIDS", + "=4U1G", + "HB", + "=HB9DAR/LH", + "=HB9DDZ/LH", + "=HB9DLO/LH", + "=HB9DWR/LH", + "=HB9OMI/LH", + "HE", + "=HE1G/LGT" + ], + "worked": false, + "confirmed": false, + "flag": "ch.png", + "pp": "HB", + "lat": 46.93169112186115, + "lon": 8.203017832647463, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "269": { + "dxcc": "288", + "cc": "UA", + "ccc": "UKR", + "name": "乌克兰", + "continent": "EU", + "ituzone": ["29"], + "cqzone": ["16"], + "timezone": "2", + "ccode": "804", + "aname": "Ukraine", + "mh": [ + "KN17", + "KN18", + "KN19", + "KN27", + "KN28", + "KN29", + "KN37", + "KN38", + "KN39", + "KN45", + "KN46", + "KN47", + "KN48", + "KN49", + "KN55", + "KN56", + "KN57", + "KN58", + "KN59", + "KN64", + "KN65", + "KN66", + "KN67", + "KN68", + "KN69", + "KN74", + "KN75", + "KN76", + "KN77", + "KN78", + "KN79", + "KN85", + "KN86", + "KN87", + "KN88", + "KN89", + "KN97", + "KN98", + "KN99", + "KO10", + "KO11", + "KO20", + "KO21", + "KO30", + "KO31", + "KO40", + "KO41", + "KO50", + "KO51", + "KO52", + "KO60", + "KO61", + "KO62", + "KO70", + "KO71", + "KO72", + "KO80", + "KO90", + "LN08", + "LN09" + ], + "prefix": [ + "EM", + "=EM0UBC/FF", + "=EM3QLH/LH", + "EN", + "EO", + "=KT5X/US0Q", + "=R200A", + "U5", + "UR", + "=UR2XO/WAP", + "=UR3IDD/MM", + "=UR4LJ/LH", + "=UR4QI/M/LH", + "=UR4QKI/M/LH", + "=UR4UC/LH", + "=UR4VWN/J", + "=UR5FCZ/LGT", + "=UR5FOG/YL", + "=UR5KCC/WAP", + "=UR5KGG/WAP", + "=UR5ZVJ/LH", + "=UR6GWZ/YL", + "=UR7GO/LH", + "=UR7GO/P/LH", + "=UR7GW/LH", + "=UR7GW/P/LH", + "=UR8IDX/A/LH", + "=UR8LV/WAP", + "=UR9LD/P/LH", + "US", + "=US0GA/P/LH", + "=US5UCC/LH", + "=US8IB/LH", + "=US8ICM/LH", + "=US8IM/LH", + "UT", + "=UT/RA9JP/LH", + "=UT1KY/AAW", + "=UT1KY/WAP", + "=UT1ML/LH", + "=UT2EE/YL", + "=UT2FA/LH", + "=UT2LF/LH", + "=UT4IYZ/FF", + "=UT5FA/MM", + "=UT5KDS/YL", + "=UT5UIA/P/LH", + "=UT7UA/WAP", + "=UT8IA/LH", + "=UT8IO/A/LH", + "=UT8IO/P/LH", + "=UT8IV/LH", + "UU", + "=UU4JO/LH", + "=UU4JWM/LGT", + "=UU4JWM/LH", + "=UU6JJ/LH", + "=UU7JF/LH", + "=UU9CW/LH", + "=UU9JWM/LH", + "UV", + "UW", + "=UW1GZ/LH", + "=UW1GZ/P/LH", + "UX", + "=UX2HR/FF", + "=UX2IJ/FF", + "=UX2IQ/P/LH", + "=UX8IX/LH", + "UY", + "=UY5EI/LH", + "=UY5HC/LH", + "=UY5HF/LH", + "UZ" + ], + "worked": false, + "confirmed": false, + "flag": "ua.png", + "pp": "UR", + "lat": 49.19553220049758, + "lon": 30.80246913580247, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "270": { + "dxcc": "291", + "cc": "US", + "ccc": "USA", + "name": "美国", + "continent": "NA", + "ituzone": ["6", "7", "8"], + "cqzone": ["3", "4", "5"], + "timezone": "-5", + "ccode": "840", + "aname": "United States of America", + "mh": [ + "CM79", + "CM86", + "CM87", + "CM88", + "CM89", + "CM93", + "CM94", + "CM95", + "CM96", + "CM97", + "CM98", + "CM99", + "CN70", + "CN71", + "CN72", + "CN73", + "CN74", + "CN75", + "CN76", + "CN77", + "CN78", + "CN80", + "CN81", + "CN82", + "CN83", + "CN84", + "CN85", + "CN86", + "CN87", + "CN88", + "CN90", + "CN91", + "CN92", + "CN93", + "CN94", + "CN95", + "CN96", + "CN97", + "CN98", + "DL79", + "DL88", + "DL89", + "DL98", + "DL99", + "DM02", + "DM03", + "DM04", + "DM05", + "DM06", + "DM07", + "DM08", + "DM09", + "DM12", + "DM13", + "DM14", + "DM15", + "DM16", + "DM17", + "DM18", + "DM19", + "DM22", + "DM23", + "DM24", + "DM25", + "DM26", + "DM27", + "DM28", + "DM29", + "DM31", + "DM32", + "DM33", + "DM34", + "DM35", + "DM36", + "DM37", + "DM38", + "DM39", + "DM41", + "DM42", + "DM43", + "DM44", + "DM45", + "DM46", + "DM47", + "DM48", + "DM49", + "DM51", + "DM52", + "DM53", + "DM54", + "DM55", + "DM56", + "DM57", + "DM58", + "DM59", + "DM61", + "DM62", + "DM63", + "DM64", + "DM65", + "DM66", + "DM67", + "DM68", + "DM69", + "DM70", + "DM71", + "DM72", + "DM73", + "DM74", + "DM75", + "DM76", + "DM77", + "DM78", + "DM79", + "DM80", + "DM81", + "DM82", + "DM83", + "DM84", + "DM85", + "DM86", + "DM87", + "DM88", + "DM89", + "DM90", + "DM91", + "DM92", + "DM93", + "DM94", + "DM95", + "DM96", + "DM97", + "DM98", + "DM99", + "DN00", + "DN01", + "DN02", + "DN03", + "DN04", + "DN05", + "DN06", + "DN07", + "DN08", + "DN10", + "DN11", + "DN12", + "DN13", + "DN14", + "DN15", + "DN16", + "DN17", + "DN18", + "DN20", + "DN21", + "DN22", + "DN23", + "DN24", + "DN25", + "DN26", + "DN27", + "DN28", + "DN30", + "DN31", + "DN32", + "DN33", + "DN34", + "DN35", + "DN36", + "DN37", + "DN38", + "DN40", + "DN41", + "DN42", + "DN43", + "DN44", + "DN45", + "DN46", + "DN47", + "DN48", + "DN50", + "DN51", + "DN52", + "DN53", + "DN54", + "DN55", + "DN56", + "DN57", + "DN58", + "DN60", + "DN61", + "DN62", + "DN63", + "DN64", + "DN65", + "DN66", + "DN67", + "DN68", + "DN70", + "DN71", + "DN72", + "DN73", + "DN74", + "DN75", + "DN76", + "DN77", + "DN78", + "DN80", + "DN81", + "DN82", + "DN83", + "DN84", + "DN85", + "DN86", + "DN87", + "DN88", + "DN90", + "DN91", + "DN92", + "DN93", + "DN94", + "DN95", + "DN96", + "DN97", + "DN98", + "EL06", + "EL07", + "EL08", + "EL09", + "EL15", + "EL16", + "EL17", + "EL18", + "EL19", + "EL28", + "EL29", + "EL39", + "EL49", + "EL58", + "EL59", + "EL79", + "EL84", + "EL86", + "EL87", + "EL88", + "EL89", + "EL94", + "EL95", + "EL96", + "EL97", + "EL98", + "EL99", + "EM00", + "EM01", + "EM02", + "EM03", + "EM04", + "EM05", + "EM06", + "EM07", + "EM08", + "EM09", + "EM10", + "EM11", + "EM12", + "EM13", + "EM14", + "EM15", + "EM16", + "EM17", + "EM18", + "EM19", + "EM20", + "EM21", + "EM22", + "EM23", + "EM24", + "EM25", + "EM26", + "EM27", + "EM28", + "EM29", + "EM30", + "EM31", + "EM32", + "EM33", + "EM34", + "EM35", + "EM36", + "EM37", + "EM38", + "EM39", + "EM40", + "EM41", + "EM42", + "EM43", + "EM44", + "EM45", + "EM46", + "EM47", + "EM48", + "EM49", + "EM50", + "EM51", + "EM52", + "EM53", + "EM54", + "EM55", + "EM56", + "EM57", + "EM58", + "EM59", + "EM60", + "EM61", + "EM62", + "EM63", + "EM64", + "EM65", + "EM66", + "EM67", + "EM68", + "EM69", + "EM70", + "EM71", + "EM72", + "EM73", + "EM74", + "EM75", + "EM76", + "EM77", + "EM78", + "EM79", + "EM80", + "EM81", + "EM82", + "EM83", + "EM84", + "EM85", + "EM86", + "EM87", + "EM88", + "EM89", + "EM90", + "EM91", + "EM92", + "EM93", + "EM94", + "EM95", + "EM96", + "EM97", + "EM98", + "EM99", + "EN00", + "EN01", + "EN02", + "EN03", + "EN04", + "EN05", + "EN06", + "EN07", + "EN08", + "EN10", + "EN11", + "EN12", + "EN13", + "EN14", + "EN15", + "EN16", + "EN17", + "EN18", + "EN20", + "EN21", + "EN22", + "EN23", + "EN24", + "EN25", + "EN26", + "EN27", + "EN28", + "EN29", + "EN30", + "EN31", + "EN32", + "EN33", + "EN34", + "EN35", + "EN36", + "EN37", + "EN38", + "EN40", + "EN41", + "EN42", + "EN43", + "EN44", + "EN45", + "EN46", + "EN47", + "EN48", + "EN50", + "EN51", + "EN52", + "EN53", + "EN54", + "EN55", + "EN56", + "EN57", + "EN58", + "EN60", + "EN61", + "EN62", + "EN63", + "EN64", + "EN65", + "EN66", + "EN67", + "EN70", + "EN71", + "EN72", + "EN73", + "EN74", + "EN75", + "EN76", + "EN80", + "EN81", + "EN82", + "EN83", + "EN84", + "EN85", + "EN86", + "EN90", + "EN91", + "EN92", + "FM02", + "FM03", + "FM04", + "FM05", + "FM06", + "FM07", + "FM08", + "FM09", + "FM13", + "FM14", + "FM15", + "FM16", + "FM17", + "FM18", + "FM19", + "FM25", + "FM26", + "FM27", + "FM28", + "FM29", + "FN00", + "FN01", + "FN02", + "FN03", + "FN10", + "FN11", + "FN12", + "FN13", + "FN14", + "FN20", + "FN21", + "FN22", + "FN23", + "FN24", + "FN25", + "FN30", + "FN31", + "FN32", + "FN33", + "FN34", + "FN35", + "FN41", + "FN42", + "FN43", + "FN44", + "FN45", + "FN46", + "FN51", + "FN53", + "FN54", + "FN55", + "FN56", + "FN57", + "FN64", + "FN65", + "FN66", + "FN67" + ], + "prefix": [ + "=4U1WB", + "AA", + "AA0", + "AA5", + "AA6", + "AA7", + "AA8", + "AA9", + "AB", + "AB0", + "AB5", + "AB6", + "AB7", + "AB8", + "AB9", + "AC", + "AC0", + "AC5", + "AC6", + "AC7", + "AC8", + "AC9", + "AD", + "AD0", + "AD5", + "AD6", + "AD7", + "AD8", + "AD9", + "AE", + "AE0", + "AE5", + "AE6", + "AE7", + "AE8", + "AE9", + "AF", + "AF0", + "AF5", + "AF6", + "AF7", + "AF8", + "AF9", + "AG", + "AG0", + "AG5", + "AG6", + "AG7", + "AG8", + "AG9", + "=AH0AB", + "=AH0AJ", + "=AH0BR", + "=AH0BV", + "=AH0BZ", + "=AH0C", + "=AH0CN", + "=AH0CS", + "=AH0G", + "=AH0U", + "=AH0U/6", + "=AH0W", + "=AH0W/7", + "=AH2A", + "=AH2AJ", + "=AH2AK", + "=AH2AL", + "=AH2AM", + "=AH2AP", + "=AH2AQ", + "=AH2AQ/5", + "=AH2AR", + "=AH2AV", + "=AH2AV/4", + "=AH2BG", + "=AH2BW", + "=AH2BY", + "=AH2CF", + "=AH2DF", + "=AH2DG", + "=AH2DP", + "=AH2DR", + "=AH2DS", + "=AH2DY", + "=AH2EB", + "=AH2EH", + "=AH2H", + "=AH2JD", + "=AH2O", + "=AH2S", + "=AH2T", + "=AH2V", + "=AH2W", + "=AH2X", + "=AH3B", + "=AH3D", + "=AH6AF", + "=AH6AL", + "=AH6AO", + "=AH6AT", + "=AH6AU", + "=AH6AX", + "=AH6B/7", + "=AH6BJ", + "=AH6BS", + "=AH6BV", + "=AH6C", + "=AH6CY", + "=AH6CY/P", + "=AH6D", + "=AH6DA", + "=AH6DZ", + "=AH6EI", + "=AH6ES", + "=AH6ES/0", + "=AH6ET", + "=AH6EZ", + "=AH6EZ/4", + "=AH6EZ/7", + "=AH6EZ/9", + "=AH6FC/7", + "=AH6FF", + "=AH6FF/3", + "=AH6FV", + "=AH6FX", + "=AH6FX/4", + "=AH6FY", + "=AH6GA", + "=AH6HE", + "=AH6HK", + "=AH6HR", + "=AH6HR/4", + "=AH6HS", + "=AH6HT", + "=AH6HX", + "=AH6I", + "=AH6IC", + "=AH6IJ", + "=AH6IP", + "=AH6IW", + "=AH6JH", + "=AH6JN/4", + "=AH6JN/M", + "=AH6K", + "=AH6KB", + "=AH6KG", + "=AH6KS", + "=AH6KT", + "=AH6KT/4", + "=AH6LE", + "=AH6LE/7", + "=AH6LS", + "=AH6MD", + "=AH6ML", + "=AH6MQ", + "=AH6N", + "=AH6N/0", + "=AH6NJ", + "=AH6NL", + "=AH6NP", + "=AH6NR", + "=AH6O", + "=AH6OB", + "=AH6OD", + "=AH6OM", + "=AH6OS", + "=AH6OU", + "=AH6PC", + "=AH6PD", + "=AH6PJ", + "=AH6PW", + "=AH6QW", + "=AH6R", + "=AH6RB", + "=AH6RI", + "=AH6RI/7", + "=AH6RS", + "=AH6S", + "=AH6SU", + "=AH6SV", + "=AH6TD", + "=AH6TI", + "=AH6TX", + "=AH6UD", + "=AH6UK", + "=AH6UN", + "=AH6UX", + "=AH6VM", + "=AH6VP", + "=AH6Y", + "=AH6Z", + "=AH7A", + "=AH7D", + "=AH7DN", + "=AH7F", + "=AH7I", + "=AH7I/4", + "=AH7J", + "=AH7MI", + "=AH7MP", + "=AH8AC", + "=AH8B", + "=AH8C", + "=AH8DX", + "=AH8K", + "=AH8M", + "=AH8M/M", + "=AH8O", + "=AH8P", + "=AH8T", + "=AH9A", + "=AH9AC", + "=AH9B", + "=AH9C", + "AI", + "AI0", + "AI5", + "AI6", + "AI7", + "AI8", + "AI9", + "AJ", + "AJ0", + "AJ5", + "AJ6", + "AJ7", + "AJ8", + "AJ9", + "AK", + "AK0", + "AK5", + "AK6", + "AK7", + "AK8", + "AK9", + "=AL0A", + "=AL0AA", + "=AL0F", + "=AL0FT", + "=AL0G", + "=AL0H", + "=AL0I", + "=AL0P", + "=AL0Q", + "=AL0X", + "=AL0Y", + "=AL1A", + "=AL1B", + "=AL1B/M", + "=AL1CE", + "=AL1F", + "=AL1N", + "=AL1O", + "=AL1P", + "=AL1VE", + "=AL1VE/R", + "=AL2B", + "=AL2C", + "=AL2F", + "=AL2F/4", + "=AL2K", + "=AL2N", + "=AL2O", + "=AL2S", + "=AL3A", + "=AL3E", + "=AL3G", + "=AL3L", + "=AL3M", + "=AL3V", + "=AL4B", + "=AL4E", + "=AL4F", + "=AL4Q/7", + "=AL4T", + "=AL4T/4", + "=AL4U", + "=AL4V", + "=AL4X", + "=AL5A", + "=AL5B", + "=AL5ET", + "=AL5J", + "=AL5W", + "=AL6A", + "=AL6E", + "=AL6I", + "=AL6L", + "=AL6M", + "=AL7A", + "=AL7AA", + "=AL7AB", + "=AL7AH", + "=AL7AK", + "=AL7AK/9", + "=AL7AL", + "=AL7AM", + "=AL7AN", + "=AL7AU", + "=AL7AW", + "=AL7BA", + "=AL7BA/8", + "=AL7BN", + "=AL7BQ", + "=AL7BT", + "=AL7BX", + "=AL7C", + "=AL7CC", + "=AL7CG", + "=AL7CJ", + "=AL7CM", + "=AL7CM/7", + "=AL7CQ", + "=AL7CR", + "=AL7CS", + "=AL7CV", + "=AL7CX", + "=AL7D", + "=AL7D/7", + "=AL7D/P", + "=AL7D/R", + "=AL7DD", + "=AL7DF", + "=AL7DQ", + "=AL7DR", + "=AL7DS", + "=AL7DU", + "=AL7EI", + "=AL7EJ", + "=AL7EK", + "=AL7EL", + "=AL7EM", + "=AL7EP", + "=AL7EU", + "=AL7EW", + "=AL7FA", + "=AL7FB", + "=AL7FN", + "=AL7FU", + "=AL7GF", + "=AL7GI", + "=AL7GI/8", + "=AL7GK", + "=AL7GQ", + "=AL7GS", + "=AL7GY", + "=AL7HG", + "=AL7HH", + "=AL7HO/6", + "=AL7HS", + "=AL7HU", + "=AL7HW", + "=AL7HW/4", + "=AL7HY", + "=AL7IG", + "=AL7IH", + "=AL7II/5", + "=AL7II/9", + "=AL7IM", + "=AL7IS", + "=AL7IT", + "=AL7J", + "=AL7J/8", + "=AL7JF", + "=AL7JJ", + "=AL7JP", + "=AL7JS", + "=AL7JV", + "=AL7JW", + "=AL7JY", + "=AL7KE", + "=AL7KF", + "=AL7KG", + "=AL7KK", + "=AL7KL", + "=AL7KN", + "=AL7KT", + "=AL7KV", + "=AL7L/5", + "=AL7L/6", + "=AL7L/7", + "=AL7LH", + "=AL7LI", + "=AL7LL", + "=AL7LU", + "=AL7LV", + "=AL7MH", + "=AL7MQ", + "=AL7MR", + "=AL7ND", + "=AL7NI", + "=AL7NK", + "=AL7NL", + "=AL7NM", + "=AL7NN", + "=AL7NN/3", + "=AL7NS", + "=AL7NS/140", + "=AL7NY", + "=AL7NZ", + "=AL7O/0", + "=AL7OC", + "=AL7OK", + "=AL7OL", + "=AL7OP", + "=AL7OW", + "=AL7PB", + "=AL7PL", + "=AL7PM", + "=AL7PR", + "=AL7PS", + "=AL7PV", + "=AL7QI", + "=AL7QL", + "=AL7QO", + "=AL7QQ", + "=AL7QQ/P", + "=AL7QR", + "=AL7QS", + "=AL7R", + "=AL7R/7", + "=AL7RD", + "=AL7RE", + "=AL7RF", + "=AL7RF/7", + "=AL7RG", + "=AL7RI", + "=AL7RL", + "=AL7RM", + "=AL7RR", + "=AL7RS", + "=AL7RT", + "=AL7RT/7", + "=AL7V", + "=AL7W", + "=AL8E", + "=AL9DB", + "=G4KHG/M", + "=G8ERJ", + "=GO4AZM", + "=GQ4AZM", + "=GR4AZM", + "K", + "K0", + "K5", + "K6", + "K7", + "K8", + "K9", + "KA0", + "KA5", + "KA6", + "KA7", + "KA8", + "KA9", + "KB0", + "KB5", + "KB6", + "KB7", + "KB8", + "KB9", + "KC0", + "KC5", + "KC6", + "KC7", + "KC8", + "KC9", + "KD0", + "KD5", + "KD6", + "KD7", + "KD8", + "KD9", + "KE0", + "KE5", + "KE6", + "KE7", + "KE8", + "KE9", + "KF0", + "KF5", + "KF6", + "KF7", + "KF8", + "KF9", + "KG0", + "KG5", + "KG6", + "KG7", + "KG8", + "KG9", + "=KH0AS", + "=KH0BE", + "=KH0BR", + "=KH0BU", + "=KH0BZ", + "=KH0CA", + "=KH0CE", + "=KH0CG", + "=KH0CU", + "=KH0CW", + "=KH0DH", + "=KH0DJ", + "=KH0DW", + "=KH0EX", + "=KH0H", + "=KH0HQ", + "=KH0HR", + "=KH0JJ", + "=KH0K", + "=KH0NI", + "=KH0SH", + "=KH0TL", + "=KH0UN", + "=KH0V", + "=KH0X", + "=KH0XD", + "=KH0ZZ", + "=KH2AB", + "=KH2AI", + "=KH2AP", + "=KH2AR", + "=KH2AR/4", + "=KH2BA", + "=KH2BD", + "=KH2BH", + "=KH2BI", + "=KH2BR", + "=KH2BR/6", + "=KH2BR/7", + "=KH2BX", + "=KH2C", + "=KH2CH", + "=KH2CW", + "=KH2CZ", + "=KH2D", + "=KH2D/4", + "=KH2DF", + "=KH2DF/5", + "=KH2DN", + "=KH2EE", + "=KH2EH", + "=KH2FI", + "=KH2FI/6", + "=KH2FM", + "=KH2G", + "=KH2GG", + "=KH2GM", + "=KH2GUM/P", + "=KH2H", + "=KH2HB", + "=KH2IW", + "=KH2JA", + "=KH2JK", + "=KH2JX", + "=KH2KD", + "=KH2LU", + "=KH2LW", + "=KH2LZ", + "=KH2N", + "=KH2NC", + "=KH2OJ", + "=KH2OP", + "=KH2OP/0", + "=KH2P", + "=KH2PM", + "=KH2QE", + "=KH2QH", + "=KH2QL", + "=KH2QY", + "=KH2R", + "=KH2RK", + "=KH2RL", + "=KH2RP", + "=KH2SK", + "=KH2SL", + "=KH2SR", + "=KH2SX", + "=KH2TB", + "=KH2TI", + "=KH2TJ", + "=KH2TJ/6", + "=KH2TJ/7", + "=KH2TJ/P", + "=KH2UG", + "=KH2UV", + "=KH2VM", + "=KH2XD", + "=KH2XO", + "=KH2XP", + "=KH2XW", + "=KH2YJ", + "=KH2YL", + "=KH2YO", + "=KH2Z", + "=KH2ZM", + "=KH3AC", + "=KH3AD", + "=KH3AG", + "=KH4AB", + "=KH4AF", + "=KH4AG", + "=KH6AB", + "=KH6ABA", + "=KH6AHQ", + "=KH6ALN", + "=KH6AME", + "=KH6ARA", + "=KH6AS", + "=KH6BMD", + "=KH6BRY", + "=KH6BXZ", + "=KH6BZF/8", + "=KH6CG", + "=KH6CG/4", + "=KH6CN", + "=KH6CN/7", + "=KH6COL", + "=KH6COY", + "=KH6CQG", + "=KH6CQH", + "=KH6CQH/7", + "=KH6CT", + "=KH6CUJ", + "=KH6DAN", + "=KH6DB", + "=KH6DDW", + "=KH6DE", + "=KH6DHK", + "=KH6DM", + "=KH6DOT", + "=KH6DUT", + "=KH6DX/M", + "=KH6DX/M6", + "=KH6DZ", + "=KH6ED", + "=KH6EE", + "=KH6EE/7", + "=KH6EHF", + "=KH6EO", + "=KH6FH", + "=KH6FKA/7", + "=KH6FL", + "=KH6FOX", + "=KH6FQR", + "=KH6FQY", + "=KH6FU", + "=KH6GB", + "=KH6GBQ", + "=KH6GC", + "=KH6GDN", + "=KH6GGC", + "=KH6GJV", + "=KH6GJV/6", + "=KH6GK", + "=KH6GKR", + "=KH6GN", + "=KH6GR", + "=KH6HH", + "=KH6HHS", + "=KH6HHS/4", + "=KH6HJE", + "=KH6HNL", + "=KH6HO", + "=KH6HOU", + "=KH6HOW", + "=KH6HPQ", + "=KH6HTV", + "=KH6HTV/0", + "=KH6HU", + "=KH6HWK", + "=KH6HZ", + "=KH6IA", + "=KH6ICQ", + "=KH6IDF", + "=KH6II", + "=KH6IK", + "=KH6IKC", + "=KH6IKH", + "=KH6IKI", + "=KH6IKL", + "=KH6ILR", + "=KH6ILR/3", + "=KH6ILR/4", + "=KH6ILT", + "=KH6IMN", + "=KH6IP", + "=KH6IPJ", + "=KH6IQX", + "=KH6ITI", + "=KH6ITY", + "=KH6ITY/M", + "=KH6JAU", + "=KH6JCT", + "=KH6JEM", + "=KH6JFH", + "=KH6JFL", + "=KH6JGA", + "=KH6JGD", + "=KH6JIM", + "=KH6JIM/7", + "=KH6JIQ", + "=KH6JJD", + "=KH6JJN", + "=KH6JJN/P", + "=KH6JJS", + "=KH6JKQ", + "=KH6JN", + "=KH6JNK", + "=KH6JNW", + "=KH6JNY", + "=KH6JPJ", + "=KH6JPO", + "=KH6JQW", + "=KH6JR", + "=KH6JRB", + "=KH6JRC", + "=KH6JRW", + "=KH6JS", + "=KH6JT", + "=KH6JTM", + "=KH6JUA", + "=KH6JUK", + "=KH6JUQ", + "=KH6JUZ", + "=KH6JVF", + "=KH6JVL", + "=KH6JVS", + "=KH6JWG", + "=KH6KG/5", + "=KH6KI", + "=KH6KM", + "=KH6KS", + "=KH6KT", + "=KH6KW", + "=KH6KZ", + "=KH6LDO", + "=KH6LEM", + "=KH6LL", + "=KH6LO", + "=KH6LX", + "=KH6M", + "=KH6M/4", + "=KH6M/M", + "=KH6MB/5", + "=KH6ME", + "=KH6MF", + "=KH6MT", + "=KH6MT/4", + "=KH6MV", + "=KH6N", + "=KH6NA", + "=KH6NC", + "=KH6NG", + "=KH6NI", + "=KH6NM", + "=KH6NO/7", + "=KH6NO/M", + "=KH6NR", + "=KH6NU", + "=KH6O", + "=KH6OE", + "=KH6OU", + "=KH6OV", + "=KH6OZ", + "=KH6PG", + "=KH6PGA/6", + "=KH6PM", + "=KH6POI", + "=KH6PR", + "=KH6PU", + "=KH6PW", + "=KH6PX", + "=KH6QAI", + "=KH6QAI/7", + "=KH6QAJ", + "=KH6RD", + "=KH6RD/4", + "=KH6RF", + "=KH6RF/1", + "=KH6RF/M", + "=KH6RON", + "=KH6RP", + "=KH6RW", + "=KH6RY", + "=KH6SAT", + "=KH6SB", + "=KH6SC", + "=KH6SKY", + "=KH6SKY/4", + "=KH6SM", + "=KH6SP/5", + "=KH6SS", + "=KH6SZ", + "=KH6TG", + "=KH6TL", + "=KH6TO", + "=KH6TX", + "=KH6TY", + "=KH6TY/R", + "=KH6UC", + "=KH6UN", + "=KH6UQ", + "=KH6USA", + "=KH6UW", + "=KH6UX", + "=KH6VC", + "=KH6VC/6", + "=KH6VHF", + "=KH6VM", + "=KH6VM/7", + "=KH6VO", + "=KH6VT", + "=KH6VZ", + "=KH6WL", + "=KH6WX", + "=KH6WZ", + "=KH6XG", + "=KH6XH", + "=KH6XS", + "=KH6XT", + "=KH6YL", + "=KH7AL", + "=KH7AL/M", + "=KH7AL/P", + "=KH7AR", + "=KH7AX", + "=KH7BU", + "=KH7CB", + "=KH7CD", + "=KH7CD/1", + "=KH7CD/6", + "=KH7CF", + "=KH7CM", + "=KH7CO", + "=KH7CS", + "=KH7CZ", + "=KH7DK", + "=KH7DM", + "=KH7DR", + "=KH7DY", + "=KH7EI", + "=KH7EM", + "=KH7FB", + "=KH7FC", + "=KH7FJ", + "=KH7FR", + "=KH7FU", + "=KH7GA", + "=KH7GF", + "=KH7GM", + "=KH7GZ", + "=KH7HA", + "=KH7HH", + "=KH7HJ/4", + "=KH7HWK", + "=KH7HY", + "=KH7I", + "=KH7IC", + "=KH7IP", + "=KH7IZ", + "=KH7JE", + "=KH7JM", + "=KH7JO", + "=KH7JO/2", + "=KH7JR", + "=KH7LE", + "=KH7ME", + "=KH7MR", + "=KH7MX", + "=KH7NE", + "=KH7NI", + "=KH7NP", + "=KH7NS", + "=KH7OC", + "=KH7OV", + "=KH7QI", + "=KH7QJ", + "=KH7QL", + "=KH7QO", + "=KH7QS", + "=KH7QT", + "=KH7QU", + "=KH7R", + "=KH7RB", + "=KH7RD", + "=KH7RT", + "=KH7SP", + "=KH7SQ", + "=KH7SR", + "=KH7SS", + "=KH7TJ", + "=KH7TJ/6", + "=KH7TR", + "=KH7TW", + "=KH7UB", + "=KH7V", + "=KH7VB", + "=KH7VC", + "=KH7VD", + "=KH7WK", + "=KH7WN", + "=KH7WO", + "=KH7WR", + "=KH7WS", + "=KH7WW", + "=KH7WW/7", + "=KH7X/7", + "=KH7XS/4", + "=KH7XT", + "=KH7XX/6", + "=KH7Y", + "=KH7Y/6", + "=KH7YD", + "=KH7YD/7", + "=KH7ZC", + "=KH8A", + "=KH8AB", + "=KH8AC", + "=KH8AC/1", + "=KH8AF", + "=KH8AH", + "=KH8AZ", + "=KH8BB", + "=KH8BG", + "=KH8CG", + "=KH8CN", + "=KH8CW", + "=KH8D", + "=KH8DO", + "=KH8E", + "=KH8FL", + "=KH8K", + "=KH8ZK", + "=KH9AA", + "=KH9AE", + "KI0", + "KI5", + "KI6", + "KI7", + "KI8", + "KI9", + "KJ0", + "KJ5", + "KJ6", + "KJ7", + "KJ8", + "KJ9", + "KK0", + "KK5", + "KK6", + "KK7", + "KK8", + "KK9", + "=KL0AA", + "=KL0AF", + "=KL0AG", + "=KL0AH", + "=KL0AI", + "=KL0AL", + "=KL0AN", + "=KL0AP", + "=KL0BX", + "=KL0CA", + "=KL0CM", + "=KL0CP", + "=KL0CW", + "=KL0DF", + "=KL0DG", + "=KL0DN", + "=KL0DR", + "=KL0DT", + "=KL0DW", + "=KL0EQ", + "=KL0ET", + "=KL0ET/M", + "=KL0EU", + "=KL0EX", + "=KL0EY", + "=KL0FF", + "=KL0FOX", + "=KL0GI", + "=KL0GP", + "=KL0GQ", + "=KL0HU", + "=KL0HZ", + "=KL0IF", + "=KL0IP", + "=KL0IR", + "=KL0IS", + "=KL0IW", + "=KL0IX", + "=KL0KC", + "=KL0KE/4", + "=KL0L", + "=KL0LB", + "=KL0LF", + "=KL0LN", + "=KL0MG", + "=KL0MO", + "=KL0MP", + "=KL0MW", + "=KL0N", + "=KL0NM", + "=KL0NP", + "=KL0NR", + "=KL0NT", + "=KL0NV", + "=KL0NY", + "=KL0PC", + "=KL0PD", + "=KL0PE", + "=KL0PG", + "=KL0PM", + "=KL0PP", + "=KL0QD", + "=KL0RA", + "=KL0RN", + "=KL0S", + "=KL0SA", + "=KL0SS", + "=KL0ST", + "=KL0SV", + "=KL0SZ", + "=KL0TF", + "=KL0TR", + "=KL0TU", + "=KL0TV", + "=KL0TY", + "=KL0UA", + "=KL0UD", + "=KL0UP", + "=KL0VD", + "=KL0VE", + "=KL0VH", + "=KL0VM", + "=KL0VU", + "=KL0WF", + "=KL0WIZ", + "=KL0WV", + "=KL0XN", + "=KL1A/2", + "=KL1AA", + "=KL1AE", + "=KL1DA", + "=KL1DJ", + "=KL1DN", + "=KL1DO", + "=KL1DW", + "=KL1ED", + "=KL1HA", + "=KL1HE", + "=KL1HT", + "=KL1IF", + "=KL1IF/M", + "=KL1IG", + "=KL1J", + "=KL1JF", + "=KL1K", + "=KL1KM", + "=KL1KP", + "=KL1KU", + "=KL1LD", + "=KL1LE", + "=KL1LV", + "=KL1LZ", + "=KL1MF", + "=KL1MM", + "=KL1MW", + "=KL1NER", + "=KL1NK", + "=KL1NO", + "=KL1NS", + "=KL1OC", + "=KL1OH", + "=KL1OK", + "=KL1PA", + "=KL1PV", + "=KL1QL", + "=KL1QN", + "=KL1RH", + "=KL1RV", + "=KL1RX", + "=KL1SE", + "=KL1SE/4", + "=KL1SF/7", + "=KL1SO", + "=KL1SS", + "=KL1T", + "=KL1TS", + "=KL1TU", + "=KL1TV", + "=KL1U", + "=KL1UA", + "=KL1UM", + "=KL1UR", + "=KL1US", + "=KL1V/M", + "=KL1VN", + "=KL1WD", + "=KL1WE/6", + "=KL1WG", + "=KL1WO", + "=KL1XI", + "=KL1XK", + "=KL1Y", + "=KL1YO", + "=KL1YY/7", + "=KL1ZA", + "=KL1ZN", + "=KL1ZP", + "=KL1ZR", + "=KL1ZW", + "=KL2A", + "=KL2A/0", + "=KL2A/1", + "=KL2A/2", + "=KL2A/3", + "=KL2A/7", + "=KL2A/9", + "=KL2AK", + "=KL2AX", + "=KL2AX/5", + "=KL2BG", + "=KL2BO", + "=KL2BV", + "=KL2BW", + "=KL2BY", + "=KL2BZ", + "=KL2CD", + "=KL2CQ", + "=KL2CX", + "=KL2DM", + "=KL2EY", + "=KL2FD", + "=KL2FL", + "=KL2FU", + "=KL2GA", + "=KL2GB", + "=KL2GG", + "=KL2GP", + "=KL2GR", + "=KL2HC", + "=KL2HK", + "=KL2HN", + "=KL2HV", + "=KL2IC", + "=KL2JY", + "=KL2K", + "=KL2KL", + "=KL2KP", + "=KL2KY", + "=KL2LA", + "=KL2LK", + "=KL2LN", + "=KL2LT", + "=KL2LU", + "=KL2MA", + "=KL2MI", + "=KL2MP", + "=KL2MQ", + "=KL2MU", + "=KL2NI", + "=KL2NJ", + "=KL2NN", + "=KL2NP", + "=KL2NQ", + "=KL2NU", + "=KL2NW", + "=KL2NZ", + "=KL2OH", + "=KL2OJ", + "=KL2P", + "=KL2PS", + "=KL2QE", + "=KL2QO", + "=KL2RA", + "=KL2RB", + "=KL2SX", + "=KL2TP", + "=KL2TR", + "=KL2TV", + "=KL2TZ", + "=KL2UO", + "=KL2UP", + "=KL2UQ", + "=KL2UR", + "=KL2UY", + "=KL2VA", + "=KL2VK", + "=KL2WL", + "=KL2XF", + "=KL2XI", + "=KL2YD", + "=KL2YH", + "=KL2YU", + "=KL2ZL", + "=KL3DB", + "=KL3DL", + "=KL3DP", + "=KL3ET", + "=KL3EV", + "=KL3EZ", + "=KL3FE", + "=KL3HG", + "=KL3HK", + "=KL3HQ", + "=KL3HZ", + "=KL3IA", + "=KL3IC", + "=KL3IM", + "=KL3IO", + "=KL3IW", + "=KL3JC", + "=KL3JL", + "=KL3JY/6", + "=KL3KB", + "=KL3KG", + "=KL3KH", + "=KL3KI", + "=KL3LY", + "=KL3MA", + "=KL3MB", + "=KL3MC", + "=KL3MW", + "=KL3MZ", + "=KL3NE", + "=KL3NO", + "=KL3NR", + "=KL3OQ", + "=KL3PD", + "=KL3PG", + "=KL3PV", + "=KL3QS", + "=KL3SM", + "=KL3TB", + "=KL3TW", + "=KL3TY", + "=KL3VJ", + "=KL3VN", + "=KL3WM", + "=KL3X", + "=KL3XB", + "=KL3XS", + "=KL3YH", + "=KL3ZC", + "=KL4BQ", + "=KL4BS", + "=KL4CO", + "=KL4CX", + "=KL4CZ", + "=KL4DD", + "=KL4E", + "=KL4GW", + "=KL4H", + "=KL4IY", + "=KL4J", + "=KL4JN", + "=KL4JQ", + "=KL4KA", + "=KL4LV", + "=KL4NG", + "=KL4NZ", + "=KL4PQ", + "=KL4QJ", + "=KL4QW", + "=KL4RKH", + "=KL4T", + "=KL4UZ", + "=KL4YFD", + "=KL5A", + "=KL5L", + "=KL5X", + "=KL5YJ", + "=KL5Z", + "=KL7A", + "=KL7AB", + "=KL7AD", + "=KL7AH", + "=KL7AK", + "=KL7AL", + "=KL7AL/9", + "=KL7AR", + "=KL7AU", + "=KL7AW", + "=KL7AX", + "=KL7BCD", + "=KL7BD", + "=KL7BDC", + "=KL7BGR", + "=KL7BH", + "=KL7BL", + "=KL7BR", + "=KL7BS", + "=KL7BT", + "=KL7BUR", + "=KL7BX", + "=KL7BXP", + "=KL7BZ/5", + "=KL7BZL", + "=KL7C", + "=KL7CD", + "=KL7CE", + "=KL7CE/1", + "=KL7CE/6", + "=KL7CE/9", + "=KL7CM", + "=KL7CN", + "=KL7CPO", + "=KL7CT", + "=KL7CW/6", + "=KL7CX", + "=KL7CY", + "=KL7DA", + "=KL7DA/4", + "=KL7DB", + "=KL7DC", + "=KL7DE", + "=KL7DF", + "=KL7DI", + "=KL7DJ", + "=KL7DK", + "=KL7DL", + "=KL7DLG", + "=KL7DS", + "=KL7DT/4", + "=KL7DTJ", + "=KL7EAE", + "=KL7EAL", + "=KL7EBE", + "=KL7EBN", + "=KL7ED", + "=KL7EF", + "=KL7EFL", + "=KL7EH", + "=KL7EIN", + "=KL7EMH", + "=KL7EMH/M", + "=KL7EP", + "=KL7EP/0", + "=KL7EQQ", + "=KL7EU", + "=KL7F", + "=KL7FB", + "=KL7FD", + "=KL7FDQ", + "=KL7FDQ/7", + "=KL7FHI", + "=KL7FHK", + "=KL7FHX", + "=KL7FLY", + "=KL7FO", + "=KL7FO/P", + "=KL7FOZ", + "=KL7FQR", + "=KL7FRQ", + "=KL7FS", + "=KL7GA", + "=KL7GB", + "=KL7GCS", + "=KL7GF", + "=KL7GKY", + "=KL7GKY/0", + "=KL7GLK", + "=KL7GLK/0", + "=KL7GLK/3", + "=KL7GLK/B", + "=KL7GLL", + "=KL7GN/M", + "=KL7GNW", + "=KL7GRF", + "=KL7GT", + "=KL7H", + "=KL7HB", + "=KL7HBV", + "=KL7HF", + "=KL7HFI/7", + "=KL7HFV", + "=KL7HH", + "=KL7HI", + "=KL7HIM", + "=KL7HJR", + "=KL7HJZ", + "=KL7HLF", + "=KL7HM", + "=KL7HMK", + "=KL7HNY", + "=KL7HOT", + "=KL7HQL", + "=KL7HQR", + "=KL7HQR/6", + "=KL7HQW", + "=KL7HR", + "=KL7HR/3", + "=KL7HSG", + "=KL7HSR", + "=KL7HSY", + "=KL7HX", + "=KL7I", + "=KL7IAL", + "=KL7IBT", + "=KL7IBV", + "=KL7ID", + "=KL7IDM", + "=KL7IDY", + "=KL7IDY/6", + "=KL7IEI", + "=KL7IEK", + "=KL7IFK", + "=KL7IGB", + "=KL7IHK", + "=KL7IIK", + "=KL7IK", + "=KL7IKP", + "=KL7IKR", + "=KL7IKV", + "=KL7IKZ", + "=KL7IL", + "=KL7IME", + "=KL7IOP", + "=KL7IOW", + "=KL7IPS", + "=KL7IPV", + "=KL7ISB", + "=KL7ISE", + "=KL7ISN", + "=KL7ITF", + "=KL7IUQ", + "=KL7IUX", + "=KL7IV", + "=KL7IVK", + "=KL7IVY", + "=KL7IWC/7", + "=KL7IWF", + "=KL7IWU", + "=KL7IXI", + "=KL7IXX", + "=KL7IZC", + "=KL7IZH", + "=KL7IZW", + "=KL7JAB", + "=KL7JAR", + "=KL7JBB", + "=KL7JBE", + "=KL7JCQ", + "=KL7JDQ", + "=KL7JDS", + "=KL7JES", + "=KL7JEX", + "=KL7JFR", + "=KL7JGJ", + "=KL7JGS", + "=KL7JGS/M", + "=KL7JHM", + "=KL7JIE", + "=KL7JIJ", + "=KL7JIM", + "=KL7JIU", + "=KL7JJE", + "=KL7JJN", + "=KL7JKC", + "=KL7JKV", + "=KL7JM", + "=KL7JO", + "=KL7JR", + "=KL7JR/0", + "=KL7JR/1", + "=KL7JR/5", + "=KL7JT", + "=KL7JUL", + "=KL7JW", + "=KL7KA", + "=KL7KG/7", + "=KL7KNP", + "=KL7KX", + "=KL7LG", + "=KL7LH", + "=KL7LI", + "=KL7LJ", + "=KL7LK", + "=KL7LS", + "=KL7LT", + "=KL7LX", + "=KL7LY", + "=KL7LZ", + "=KL7M", + "=KL7MA", + "=KL7ME", + "=KL7MF", + "=KL7MF/6", + "=KL7MF/M", + "=KL7MH", + "=KL7MJ", + "=KL7ML", + "=KL7MU", + "=KL7MV", + "=KL7MVX", + "=KL7MY", + "=KL7MZ", + "=KL7NA", + "=KL7NCO", + "=KL7NE", + "=KL7NI", + "=KL7NL", + "=KL7NL/2", + "=KL7NL/4", + "=KL7NP", + "=KL7NP/7", + "=KL7NT", + "=KL7NW", + "=KL7OA", + "=KL7OF", + "=KL7OF/3", + "=KL7OG", + "=KL7OI", + "=KL7OL", + "=KL7OO", + "=KL7OQ", + "=KL7OR", + "=KL7OR/7", + "=KL7OS", + "=KL7OY", + "=KL7P/4", + "=KL7PC", + "=KL7PE/M", + "=KL7PO", + "=KL7PS", + "=KL7PZ", + "=KL7QA", + "=KL7QC", + "=KL7QH", + "=KL7QK", + "=KL7QK/140", + "=KL7QK/7", + "=KL7QR", + "=KL7QR/7", + "=KL7QU", + "=KL7QW", + "=KL7QW/0", + "=KL7R", + "=KL7RC", + "=KL7RF", + "=KL7RF/8", + "=KL7RH", + "=KL7RK", + "=KL7RM", + "=KL7RS", + "=KL7RT", + "=KL7RZ", + "=KL7S", + "=KL7SB/0", + "=KL7SFD", + "=KL7SG", + "=KL7SK", + "=KL7SL", + "=KL7SP", + "=KL7SR", + "=KL7SW", + "=KL7SY", + "=KL7T", + "=KL7TD", + "=KL7TJZ", + "=KL7TN/5", + "=KL7TU", + "=KL7UHF", + "=KL7UP", + "=KL7USI/1", + "=KL7USI/2", + "=KL7USI/4", + "=KL7USI/5", + "=KL7UT", + "=KL7UV", + "=KL7VK", + "=KL7VL", + "=KL7VN", + "=KL7VQ", + "=KL7VU", + "=KL7VU/6", + "=KL7W", + "=KL7WA", + "=KL7WC", + "=KL7WM", + "=KL7WN", + "=KL7WP", + "=KL7WP/7", + "=KL7WT", + "=KL7WW", + "=KL7XA", + "=KL7XH", + "=KL7XL", + "=KL7XP", + "=KL7XS", + "=KL7YJ", + "=KL7YL", + "=KL7YN", + "=KL7YQ", + "=KL7YT", + "=KL7YY/0", + "=KL7YY/5", + "=KL7YY/7", + "=KL7YY/M", + "=KL7ZD", + "=KL7ZH", + "=KL7ZT", + "=KL7ZW", + "=KL8DX", + "=KL8RV", + "=KL8SU", + "=KL8X", + "=KL9A", + "=KL9A/1", + "=KL9A/3", + "=KL9A/7", + "=KL9A/8", + "=KL9ER", + "=KL9MEK", + "=KL9PC", + "KM0", + "KM5", + "KM6", + "KM7", + "KM8", + "KM9", + "KN0", + "KN5", + "KN6", + "KN7", + "KN8", + "KN9", + "KO0", + "KO5", + "KO6", + "KO7", + "KO8", + "KO9", + "=KP2AF", + "=KP2AV", + "=KP2AV/4", + "=KP2AZ", + "=KP2BK", + "=KP2BX", + "=KP2CB", + "=KP2CH", + "=KP2CR", + "=KP2CT", + "=KP2L", + "=KP2L/4", + "=KP2N", + "=KP2NP", + "=KP2R", + "=KP2RF", + "=KP2U", + "=KP2US", + "=KP2V", + "=KP2X", + "=KP2XX", + "=KP2Y", + "=KP3AK", + "=KP3AMG", + "=KP3BL", + "=KP3BN", + "=KP3BP", + "=KP3J", + "=KP3JOS", + "=KP3LM", + "=KP3M", + "=KP3N", + "=KP3RC", + "=KP3SK", + "=KP3U", + "=KP3VA/M", + "=KP3Y", + "=KP3YL", + "=KP4AD", + "=KP4AK", + "=KP4AKB", + "=KP4AMC", + "=KP4AMZ", + "=KP4ANG", + "=KP4AOD", + "=KP4AOD/4", + "=KP4AQI", + "=KP4ATV", + "=KP4AYI", + "=KP4BBN", + "=KP4BEC", + "=KP4BEP", + "=KP4BLS", + "=KP4BM", + "=KP4BOB", + "=KP4BPR", + "=KP4BR", + "=KP4CAM", + "=KP4CBP", + "=KP4CEL", + "=KP4CH", + "=KP4CI", + "=KP4CML", + "=KP4CPP", + "=KP4CSJ", + "=KP4CSZ", + "=KP4CV", + "=KP4CW", + "=KP4CZ", + "=KP4DAC", + "=KP4DDS", + "=KP4DGF", + "=KP4DJT", + "=KP4DPQ", + "=KP4DQS", + "=KP4DSO", + "=KP4DX/6", + "=KP4E", + "=KP4EC/1", + "=KP4EDL", + "=KP4EFZ", + "=KP4EIA", + "=KP4EMY", + "=KP4ENK", + "=KP4ENM", + "=KP4EOR", + "=KP4EOR/4", + "=KP4ERR", + "=KP4ERT", + "=KP4ESC", + "=KP4FBS", + "=KP4FBT", + "=KP4FCF", + "=KP4FF", + "=KP4FFW", + "=KP4FGI", + "=KP4FIR", + "=KP4FJE", + "=KP4FLP", + "=KP4FOF", + "=KP4G", + "=KP4GB/3", + "=KP4GE/9", + "=KP4GEG", + "=KP4GMC", + "=KP4GVT", + "=KP4HE", + "=KP4HF", + "=KP4HN", + "=KP4HR", + "=KP4I", + "=KP4II", + "=KP4IP", + "=KP4IRI", + "=KP4IT", + "=KP4JB", + "=KP4JC", + "=KP4JCC", + "=KP4JDR", + "=KP4JE", + "=KP4JG", + "=KP4JMP", + "=KP4JOS", + "=KP4JWR", + "=KP4JY", + "=KP4KA", + "=KP4KD", + "=KP4KD/4", + "=KP4KE/4", + "=KP4KWB", + "=KP4LEU", + "=KP4LF", + "=KP4LUV", + "=KP4LX", + "=KP4MA", + "=KP4MAS", + "=KP4MD", + "=KP4MHC", + "=KP4MHG", + "=KP4MLF", + "=KP4MPR", + "=KP4MR", + "=KP4MSP", + "=KP4N", + "=KP4N/3", + "=KP4NBI", + "=KP4ND", + "=KP4NI", + "=KP4NPL", + "=KP4NW", + "=KP4OO", + "=KP4PC", + "=KP4PF", + "=KP4PMD", + "=KP4PRI", + "=KP4Q", + "=KP4QT", + "=KP4QT/4", + "=KP4R", + "=KP4RCD", + "=KP4REY", + "=KP4RGT", + "=KP4ROP", + "=KP4RRC", + "=KP4RT", + "=KP4RZ", + "=KP4SL", + "=KP4SU", + "=KP4TL", + "=KP4TOM", + "=KP4TR", + "=KP4UB", + "=KP4UFO", + "=KP4USA", + "=KP4UV", + "=KP4UZ", + "=KP4VZ", + "=KP4WG", + "=KP4WK", + "=KP4WR", + "=KP4WW", + "=KP4WY", + "=KP4X", + "=KP4XO", + "=KP4XP", + "=KP4XX", + "=KP4XZ", + "=KP4Y", + "=KP4YH", + "=KP4YLV", + "=KP4YP", + "=KP4ZD", + "=KP4ZEM", + "=KP4ZV", + "=KP4ZX", + "KQ0", + "KQ5", + "KQ6", + "KQ7", + "KQ8", + "KQ9", + "KR0", + "KR5", + "KR6", + "KR7", + "KR8", + "KR9", + "KS0", + "KS5", + "KS6", + "KS7", + "KS8", + "KS9", + "KT0", + "KT5", + "KT6", + "KT7", + "KT8", + "KT9", + "KU0", + "KU5", + "KU6", + "KU7", + "KU8", + "KU9", + "KV0", + "KV5", + "KV6", + "KV7", + "KV8", + "KV9", + "KW0", + "KW5", + "KW6", + "KW7", + "KW8", + "KW9", + "KX0", + "KX5", + "KX6", + "KX7", + "KX8", + "KX9", + "KY0", + "KY5", + "KY6", + "KY7", + "KY8", + "KY9", + "KZ0", + "KZ5", + "KZ6", + "KZ7", + "KZ8", + "KZ9", + "N", + "N0", + "N5", + "N6", + "N7", + "N8", + "N9", + "NA0", + "NA5", + "NA6", + "NA7", + "NA8", + "NA9", + "NB0", + "NB5", + "NB6", + "NB7", + "NB8", + "NB9", + "NC0", + "NC5", + "NC6", + "NC7", + "NC8", + "NC9", + "ND0", + "ND5", + "ND6", + "ND7", + "ND8", + "ND9", + "NE0", + "NE5", + "NE6", + "NE7", + "NE8", + "NE9", + "NF0", + "NF5", + "NF6", + "NF7", + "NF8", + "NF9", + "NG0", + "NG5", + "NG6", + "NG7", + "NG8", + "NG9", + "=NH0C", + "=NH0E", + "=NH0F", + "=NH0H", + "=NH0K", + "=NH0O", + "=NH0V/5", + "=NH0X", + "=NH2A", + "=NH2AR", + "=NH2BD", + "=NH2BQ", + "=NH2BV", + "=NH2CM", + "=NH2CW", + "=NH2DB", + "=NH2DC", + "=NH2DM", + "=NH2E", + "=NH2F", + "=NH2FT", + "=NH2FX", + "=NH2JE", + "=NH2KR", + "=NH2LA", + "=NH2LH", + "=NH2LP", + "=NH2R", + "=NH2S", + "=NH2W", + "=NH2W/9", + "=NH6AC", + "=NH6AE", + "=NH6AF", + "=NH6AU", + "=NH6AZ", + "=NH6B", + "=NH6BD", + "=NH6BD/4", + "=NH6BF", + "=NH6BK", + "=NH6CF", + "=NH6CI", + "=NH6CJ", + "=NH6CN", + "=NH6CN/8", + "=NH6DQ", + "=NH6DX", + "=NH6E", + "=NH6EF", + "=NH6FA", + "=NH6FF", + "=NH6FV", + "=NH6FX", + "=NH6GE", + "=NH6GR", + "=NH6GZ", + "=NH6HE", + "=NH6HW", + "=NH6HX", + "=NH6HX/4", + "=NH6HZ", + "=NH6IH", + "=NH6JX", + "=NH6KI", + "=NH6L", + "=NH6LF", + "=NH6LM", + "=NH6MG", + "=NH6NG", + "=NH6NS", + "=NH6QR", + "=NH6R", + "=NH6RG", + "=NH6SF", + "=NH6SR", + "=NH6ST", + "=NH6T", + "=NH6T/4", + "=NH6TL", + "=NH6U", + "=NH6VB", + "=NH6VJ", + "=NH6WF", + "=NH6WL", + "=NH6WL/5", + "=NH6WR", + "=NH6XN", + "=NH6XP", + "=NH6XW", + "=NH6Z", + "=NH6ZA", + "=NH6ZB", + "=NH6ZE", + "=NH7AA", + "=NH7AG", + "=NH7AQ", + "=NH7AR", + "=NH7C", + "=NH7CC", + "=NH7CY", + "=NH7EM", + "=NH7FG", + "=NH7FI", + "=NH7FK", + "=NH7FL", + "=NH7FO", + "=NH7FW", + "=NH7FZ", + "=NH7G", + "=NH7H", + "=NH7IG", + "=NH7IH", + "=NH7L", + "=NH7M", + "=NH7MV", + "=NH7MY", + "=NH7N", + "=NH7NA", + "=NH7ND", + "=NH7NJ/7", + "=NH7OC", + "=NH7OI", + "=NH7PL", + "=NH7PM", + "=NH7PZ", + "=NH7QV", + "=NH7R", + "=NH7RO", + "=NH7RO/5", + "=NH7RO/M", + "=NH7RS", + "=NH7RT", + "=NH7S", + "=NH7SH", + "=NH7ST", + "=NH7SU", + "=NH7T/4", + "=NH7TG", + "=NH7TK", + "=NH7TN", + "=NH7TR", + "=NH7UN", + "=NH7VA", + "=NH7VZ", + "=NH7W", + "=NH7WE", + "=NH7WG", + "=NH7WT", + "=NH7WU", + "=NH7XM", + "=NH7XN", + "=NH7YE", + "=NH7YI", + "=NH7YK", + "=NH7ZE", + "=NH7ZH", + "NI0", + "NI5", + "NI6", + "NI7", + "NI8", + "NI9", + "NJ0", + "NJ5", + "NJ6", + "NJ7", + "NJ8", + "NJ9", + "NK0", + "NK5", + "NK6", + "NK7", + "NK8", + "NK9", + "=NL5J", + "=NL5L", + "=NL7AH", + "=NL7AJ", + "=NL7AK", + "=NL7AR", + "=NL7AS", + "=NL7AU", + "=NL7AU/4", + "=NL7AX", + "=NL7AZ", + "=NL7BU", + "=NL7BV", + "=NL7C", + "=NL7CC", + "=NL7CF", + "=NL7CH", + "=NL7CK", + "=NL7CM", + "=NL7CO", + "=NL7CO/5", + "=NL7CO/M", + "=NL7CQ", + "=NL7CQ/0", + "=NL7D", + "=NL7D/7", + "=NL7DC", + "=NL7DH", + "=NL7DY", + "=NL7EO", + "=NL7FF", + "=NL7FJ", + "=NL7FJ/1", + "=NL7FK", + "=NL7FQ", + "=NL7FU", + "=NL7FX", + "=NL7GE", + "=NL7GM", + "=NL7GO", + "=NL7GW", + "=NL7HB", + "=NL7HH", + "=NL7HK", + "=NL7HQ", + "=NL7HU", + "=NL7IB", + "=NL7IE", + "=NL7IH", + "=NL7IN", + "=NL7JH", + "=NL7JI", + "=NL7JJ", + "=NL7JN", + "=NL7JY", + "=NL7K/5", + "=NL7KB", + "=NL7KD", + "=NL7KL", + "=NL7KV", + "=NL7KX", + "=NL7LC", + "=NL7LI", + "=NL7LO", + "=NL7LR", + "=NL7LY", + "=NL7MD", + "=NL7MO", + "=NL7MR", + "=NL7MS", + "=NL7MT", + "=NL7MW", + "=NL7NJ", + "=NL7NK", + "=NL7NL", + "=NL7NP", + "=NL7OB", + "=NL7OE", + "=NL7OF", + "=NL7OI", + "=NL7OM", + "=NL7OP", + "=NL7OS", + "=NL7OT", + "=NL7P", + "=NL7PD", + "=NL7PJ", + "=NL7PN", + "=NL7PV", + "=NL7QC", + "=NL7QC/9", + "=NL7QI", + "=NL7RC", + "=NL7RL", + "=NL7RN", + "=NL7RO", + "=NL7RQ", + "=NL7RQ/5", + "=NL7SI", + "=NL7TK", + "=NL7TO", + "=NL7U", + "=NL7UE", + "=NL7UH", + "=NL7UI", + "=NL7US", + "=NL7V/3", + "=NL7VV", + "=NL7VX", + "=NL7VX/4", + "=NL7VX/M", + "=NL7WD", + "=NL7WJ", + "=NL7XM", + "=NL7XM/B", + "=NL7XT", + "=NL7XU", + "=NL7XX", + "=NL7YB", + "=NL7YI", + "=NL7YU", + "=NL7YZ", + "=NL7ZL", + "=NL7ZM", + "=NL7ZN", + "=NL7ZP", + "=NL9H", + "NM0", + "NM5", + "NM6", + "NM7", + "NM8", + "NM9", + "NN0", + "NN5", + "NN6", + "NN7", + "NN8", + "NN9", + "NO0", + "NO5", + "NO6", + "NO7", + "NO8", + "NO9", + "=NP2AK", + "=NP2AQ", + "=NP2AV", + "=NP2B", + "=NP2B/4", + "=NP2BB", + "=NP2BW", + "=NP2C", + "=NP2C/4", + "=NP2CB", + "=NP2CT", + "=NP2D", + "=NP2DJ", + "=NP2EE", + "=NP2EI", + "=NP2EP", + "=NP2F", + "=NP2FJ", + "=NP2FT", + "=NP2FZ", + "=NP2FZ/1", + "=NP2G", + "=NP2GG", + "=NP2GI", + "=NP2GM", + "=NP2GN", + "=NP2GW", + "=NP2HQ", + "=NP2HS", + "=NP2HW", + "=NP2IE", + "=NP2IF", + "=NP2IJ", + "=NP2IS", + "=NP2IW", + "=NP2IX", + "=NP2JA", + "=NP2JS", + "=NP2JV", + "=NP2KL", + "=NP2KY", + "=NP2L", + "=NP2L/9", + "=NP2LC", + "=NP2MM", + "=NP2MN", + "=NP2MP", + "=NP2MR", + "=NP2MR/4", + "=NP2MU", + "=NP2NC", + "=NP2O", + "=NP2OL", + "=NP2OO", + "=NP2OR", + "=NP2PA", + "=NP2PN", + "=NP2PR", + "=NP2R", + "=NP2RA", + "=NP2T", + "=NP2W", + "=NP2X/7", + "=NP3AX", + "=NP3BA", + "=NP3BL", + "=NP3CC", + "=NP3CI", + "=NP3CM", + "=NP3CT", + "=NP3CV", + "=NP3D", + "=NP3E", + "=NP3ES", + "=NP3EU", + "=NP3FB", + "=NP3FR", + "=NP3G", + "=NP3HD", + "=NP3HG", + "=NP3HN", + "=NP3HP", + "=NP3HU", + "=NP3I", + "=NP3IL", + "=NP3IP", + "=NP3IU", + "=NP3IV", + "=NP3K", + "=NP3KH", + "=NP3KM", + "=NP3KP", + "=NP3LN", + "=NP3MM", + "=NP3MX", + "=NP3NA", + "=NP3NC", + "=NP3NT", + "=NP3OW", + "=NP3PG", + "=NP3PH", + "=NP3QC", + "=NP3QT", + "=NP3R", + "=NP3RG", + "=NP3ST", + "=NP3SU", + "=NP3TM", + "=NP3TY", + "=NP3UM", + "=NP3VJ", + "=NP3WX", + "=NP3YN", + "=NP4AB", + "=NP4AC", + "=NP4AC/4", + "=NP4AI", + "=NP4AI/0", + "=NP4AI/6", + "=NP4AI/M", + "=NP4AO", + "=NP4AS", + "=NP4AV", + "=NP4AZ", + "=NP4CC", + "=NP4CK", + "=NP4CV", + "=NP4DM", + "=NP4EA", + "=NP4EM", + "=NP4ER", + "=NP4ES", + "=NP4FP", + "=NP4GH", + "=NP4GW", + "=NP4H", + "=NP4I", + "=NP4IR", + "=NP4IT", + "=NP4IW", + "=NP4IW/6", + "=NP4J", + "=NP4JL", + "=NP4JQ", + "=NP4JU", + "=NP4JV", + "=NP4JV/7", + "=NP4KV", + "=NP4M", + "=NP4MV", + "=NP4ND", + "=NP4NQ", + "=NP4NQ/5", + "=NP4PF", + "=NP4RH", + "=NP4RJ", + "=NP4RW", + "=NP4RZ", + "=NP4SY", + "=NP4TR", + "=NP4WT", + "=NP4XB", + "=NP4XE", + "=NP4YZ", + "=NP4ZI", + "NQ0", + "NQ5", + "NQ6", + "NQ7", + "NQ8", + "NQ9", + "NR0", + "NR5", + "NR6", + "NR7", + "NR8", + "NR9", + "NS0", + "NS5", + "NS6", + "NS7", + "NS8", + "NS9", + "NT0", + "NT5", + "NT6", + "NT7", + "NT8", + "NT9", + "NU0", + "NU5", + "NU6", + "NU7", + "NU8", + "NU9", + "NV0", + "NV5", + "NV6", + "NV7", + "NV8", + "NV9", + "NW0", + "NW5", + "NW6", + "NW7", + "NW8", + "NW9", + "NX0", + "NX5", + "NX6", + "NX7", + "NX8", + "NX9", + "NY0", + "NY5", + "NY6", + "NY7", + "NY8", + "NY9", + "NZ0", + "NZ5", + "NZ6", + "NZ7", + "NZ8", + "NZ9", + "=VA2GLB/P", + "=VE1BES/M", + "=VE3ACW/M", + "=VE3CMB/M", + "=VE4AGT/M", + "=VE4CCN/M", + "=VE4XC/M", + "W", + "W0", + "W5", + "W6", + "W7", + "W8", + "W9", + "WA0", + "WA5", + "WA6", + "WA7", + "WA8", + "WA9", + "WB0", + "WB5", + "WB6", + "WB7", + "WB8", + "WB9", + "WC0", + "WC5", + "WC6", + "WC7", + "WC8", + "WC9", + "WD0", + "WD5", + "WD6", + "WD7", + "WD8", + "WD9", + "WE0", + "WE5", + "WE6", + "WE7", + "WE8", + "WE9", + "WF0", + "WF5", + "WF6", + "WF7", + "WF8", + "WF9", + "WG0", + "WG5", + "WG6", + "WG7", + "WG8", + "WG9", + "=WH0AAM", + "=WH0AAZ", + "=WH0AI", + "=WH0EWX", + "=WH0J", + "=WH0M", + "=WH0W", + "=WH2AAT", + "=WH2ABJ", + "=WH2ABS", + "=WH2ACT", + "=WH2ACT/5", + "=WH2ACV", + "=WH2AJF", + "=WH2ALN", + "=WH2B", + "=WH2C", + "=WH2G", + "=WH2K", + "=WH2M", + "=WH2S", + "=WH2T", + "=WH2U", + "=WH2Z", + "=WH6A", + "=WH6AAJ", + "=WH6ACF", + "=WH6ADS", + "=WH6AFM", + "=WH6AJS", + "=WH6AKZ", + "=WH6ANA", + "=WH6ANH", + "=WH6AQ", + "=WH6ARN", + "=WH6ARU", + "=WH6ASB", + "=WH6ASW/M", + "=WH6AUL", + "=WH6AVU", + "=WH6AWO", + "=WH6AX", + "=WH6AZN", + "=WH6B", + "=WH6BDR", + "=WH6BLM", + "=WH6BLT", + "=WH6BPL", + "=WH6BPL/4", + "=WH6BPU", + "=WH6BRQ", + "=WH6BUL", + "=WH6BXD", + "=WH6BYJ", + "=WH6BYP", + "=WH6BYT", + "=WH6CCQ", + "=WH6CDU", + "=WH6CE", + "=WH6CEF", + "=WH6CF", + "=WH6CIL", + "=WH6CK", + "=WH6CMS", + "=WH6CMT", + "=WH6CN", + "=WH6CNC", + "=WH6CO", + "=WH6COM", + "=WH6CPO", + "=WH6CPT", + "=WH6CRE", + "=WH6CSG", + "=WH6CT", + "=WH6CTC", + "=WH6CTO", + "=WH6CTU", + "=WH6CUE", + "=WH6CUF", + "=WH6CUL", + "=WH6CUS", + "=WH6CUU", + "=WH6CUX", + "=WH6CVJ", + "=WH6CWD", + "=WH6CWS", + "=WH6CXA", + "=WH6CXB", + "=WH6CXE", + "=WH6CXN", + "=WH6CXT", + "=WH6CYB", + "=WH6CYM", + "=WH6CYR", + "=WH6CZ", + "=WH6CZF", + "=WH6CZH", + "=WH6CZI", + "=WH6CZU", + "=WH6DAY", + "=WH6DBX", + "=WH6DCJ", + "=WH6DHN", + "=WH6DJO", + "=WH6DKC", + "=WH6DLD", + "=WH6DLQ", + "=WH6DM", + "=WH6DMJ", + "=WH6DMP", + "=WH6DNF", + "=WH6DNT", + "=WH6DOA", + "=WH6DOL", + "=WH6DQ", + "=WH6DSK", + "=WH6DSN", + "=WH6DST", + "=WH6DUJ", + "=WH6DUV", + "=WH6DVM", + "=WH6DVN", + "=WH6DVX", + "=WH6DXT", + "=WH6DYA", + "=WH6DZU", + "=WH6DZV", + "=WH6DZY", + "=WH6E", + "=WH6E/8", + "=WH6EAE", + "=WH6EAR", + "=WH6EBA", + "=WH6ECJ", + "=WH6ECO", + "=WH6EEC", + "=WH6EEG", + "=WH6EEL", + "=WH6EEN", + "=WH6EEZ", + "=WH6EFI", + "=WH6EGM", + "=WH6EHT", + "=WH6EHW", + "=WH6EHY", + "=WH6EI", + "=WH6EIJ", + "=WH6EIK", + "=WH6EIR", + "=WH6EJD", + "=WH6EJV", + "=WH6EKB", + "=WH6EKW", + "=WH6ELG", + "=WH6ELM", + "=WH6EMW", + "=WH6ENG", + "=WH6ENX", + "=WH6EOF", + "=WH6EOG", + "=WH6EQB", + "=WH6EQW", + "=WH6ERQ", + "=WH6ERS", + "=WH6ESS", + "=WH6ETE", + "=WH6ETF", + "=WH6ETO", + "=WH6ETU", + "=WH6EUA", + "=WH6EUH", + "=WH6EVP", + "=WH6EWB", + "=WH6EWE", + "=WH6EXQ", + "=WH6EZW", + "=WH6FAD", + "=WH6FBA", + "=WH6FBH", + "=WH6FCP", + "=WH6FCT", + "=WH6FEJ", + "=WH6FEU", + "=WH6FGK", + "=WH6FGM", + "=WH6FL", + "=WH6FOJ", + "=WH6FPS", + "=WH6FRH", + "=WH6FTF", + "=WH6FZ/5", + "=WH6GBC", + "=WH6HA", + "=WH6IF", + "=WH6IO", + "=WH6IZ", + "=WH6J", + "=WH6JO", + "=WH6L", + "=WH6L/5", + "=WH6LAK", + "=WH6LE", + "=WH6LE/4", + "=WH6LE/M", + "=WH6LE/P", + "=WH6LR", + "=WH6LZ", + "=WH6MC", + "=WH6MS", + "=WH6MY", + "=WH6NE", + "=WH6OB", + "=WH6OI", + "=WH6OL", + "=WH6OR", + "=WH6OY", + "=WH6PX", + "=WH6Q/4", + "=WH6QA", + "=WH6QS", + "=WH6QV", + "=WH6RF", + "=WH6SB", + "=WH6SD", + "=WH6SR", + "=WH6SW", + "=WH6SW/1", + "=WH6TB", + "=WH6TD", + "=WH6TI", + "=WH6TK", + "=WH6U", + "=WH6UO", + "=WH6USA", + "=WH6VM", + "=WH6VN", + "=WH6WX", + "=WH6XI", + "=WH6XV", + "=WH6XX", + "=WH6YH", + "=WH6YH/4", + "=WH6YJ", + "=WH6YM", + "=WH6YT", + "=WH6ZF", + "=WH6ZR", + "=WH6ZV", + "=WH7A", + "=WH7CY", + "=WH7DA", + "=WH7DB", + "=WH7DC", + "=WH7DE", + "=WH7DG", + "=WH7DH", + "=WH7DW", + "=WH7F", + "=WH7G", + "=WH7GC", + "=WH7GD", + "=WH7GY", + "=WH7HQ", + "=WH7HU", + "=WH7HX", + "=WH7IN", + "=WH7IR", + "=WH7IV", + "=WH7IZ", + "=WH7LB", + "=WH7LP", + "=WH7MZ", + "=WH7NI", + "=WH7NS", + "=WH7OK", + "=WH7OO", + "=WH7P", + "=WH7PM", + "=WH7PV", + "=WH7QC", + "=WH7R", + "=WH7RG", + "=WH7RU", + "=WH7TC", + "=WH7TP", + "=WH7TT", + "=WH7U", + "=WH7UP", + "=WH7USA", + "=WH7VM", + "=WH7VU", + "=WH7WP", + "=WH7WT", + "=WH7XK", + "=WH7XP", + "=WH7XR", + "=WH7XU", + "=WH7YL", + "=WH7YQ", + "=WH7YR", + "=WH7YV", + "=WH7ZM", + "=WH9AAF", + "=WH9AAH", + "WI0", + "WI5", + "WI6", + "WI7", + "WI8", + "WI9", + "WJ0", + "WJ5", + "WJ6", + "WJ7", + "WJ8", + "WJ9", + "WK0", + "WK5", + "WK6", + "WK7", + "WK8", + "WK9", + "=WL0JF", + "=WL1B", + "=WL1ON", + "=WL2NAS", + "=WL3AF", + "=WL3DZ", + "=WL3WX", + "=WL4B", + "=WL4JC", + "=WL5H", + "=WL7A", + "=WL7AAW", + "=WL7ACO", + "=WL7AEC", + "=WL7AF", + "=WL7AGO", + "=WL7AHP", + "=WL7AIT", + "=WL7AIU", + "=WL7AJA", + "=WL7AL", + "=WL7AM", + "=WL7ANY", + "=WL7AP", + "=WL7AQ", + "=WL7ATK", + "=WL7AUL", + "=WL7AUY", + "=WL7AWC", + "=WL7AWD", + "=WL7AX", + "=WL7AZG", + "=WL7AZL", + "=WL7B", + "=WL7BA", + "=WL7BAL", + "=WL7BBV", + "=WL7BCR", + "=WL7BEV", + "=WL7BGF", + "=WL7BHI", + "=WL7BHJ", + "=WL7BHR", + "=WL7BKF", + "=WL7BKR", + "=WL7BLM", + "=WL7BM", + "=WL7BNQ", + "=WL7BON", + "=WL7BOO", + "=WL7BPY", + "=WL7BRV", + "=WL7BSW", + "=WL7BT", + "=WL7BUI", + "=WL7BVN", + "=WL7BVS", + "=WL7CA", + "=WL7CAZ", + "=WL7CBF", + "=WL7CC", + "=WL7CEG", + "=WL7CES", + "=WL7CHA", + "=WL7CIB", + "=WL7CJA", + "=WL7CJC", + "=WL7CKJ", + "=WL7CLI", + "=WL7CMV", + "=WL7COL", + "=WL7COQ", + "=WL7CPE", + "=WL7CPI", + "=WL7CPL", + "=WL7CPW", + "=WL7CQE", + "=WL7CQF", + "=WL7CQH", + "=WL7CQK", + "=WL7CQT", + "=WL7CQX", + "=WL7CRJ", + "=WL7CRT", + "=WL7CSD", + "=WL7CSL", + "=WL7CTA", + "=WL7CTB", + "=WL7CTC", + "=WL7CTE", + "=WL7CTP", + "=WL7CTQ", + "=WL7CUP", + "=WL7CUY", + "=WL7CVD", + "=WL7CY", + "=WL7D", + "=WL7DD", + "=WL7DN/6", + "=WL7DP", + "=WL7E/4", + "=WL7EA", + "=WL7EKK", + "=WL7FA", + "=WL7FC", + "=WL7FE", + "=WL7FJ", + "=WL7FR", + "=WL7FT", + "=WL7FT/5", + "=WL7FU", + "=WL7GG", + "=WL7GV", + "=WL7H", + "=WL7HC", + "=WL7HE", + "=WL7HK", + "=WL7HL", + "=WL7HP/7", + "=WL7I", + "=WL7IP", + "=WL7IQ", + "=WL7IS", + "=WL7J", + "=WL7JAN", + "=WL7JB", + "=WL7JM", + "=WL7K", + "=WL7K/5", + "=WL7K/7", + "=WL7K/M", + "=WL7L", + "=WL7LB", + "=WL7LK", + "=WL7LZ", + "=WL7LZ/M", + "=WL7ME", + "=WL7MQ/5", + "=WL7NP", + "=WL7OA", + "=WL7OG", + "=WL7OP", + "=WL7OS", + "=WL7OT", + "=WL7OU", + "=WL7P", + "=WL7PC", + "=WL7PJ", + "=WL7QC", + "=WL7QX", + "=WL7RA", + "=WL7RV", + "=WL7RV/140", + "=WL7S", + "=WL7SD", + "=WL7SE", + "=WL7SF", + "=WL7SG", + "=WL7SO", + "=WL7SR", + "=WL7SV", + "=WL7T", + "=WL7TD", + "=WL7TG", + "=WL7UN", + "=WL7UU", + "=WL7VK", + "=WL7W", + "=WL7WB", + "=WL7WF", + "=WL7WG", + "=WL7WL", + "=WL7WN", + "=WL7WO", + "=WL7WO/1", + "=WL7WU", + "=WL7XE", + "=WL7XI", + "=WL7XJ", + "=WL7XN", + "=WL7XR", + "=WL7XW", + "=WL7XZ", + "=WL7YM", + "=WL7YQ", + "=WL7YQ/6", + "=WL7YX", + "=WL7Z", + "=WL7Z/1", + "=WL7ZM", + "WM0", + "WM5", + "WM6", + "WM7", + "WM8", + "WM9", + "WN0", + "WN5", + "WN6", + "WN7", + "WN8", + "WN9", + "WO0", + "WO5", + "WO6", + "WO7", + "WO8", + "WO9", + "=WP2AAO", + "=WP2ADG", + "=WP2AGD", + "=WP2AGO", + "=WP2AHC", + "=WP2AHG", + "=WP2AIG", + "=WP2B", + "=WP2B/0", + "=WP2BB", + "=WP2C", + "=WP2L", + "=WP2MA", + "=WP2MG", + "=WP2N", + "=WP2P", + "=WP2U", + "=WP2WP", + "=WP2XX", + "=WP3AL", + "=WP3AY", + "=WP3BC", + "=WP3BX", + "=WP3CC", + "=WP3DW", + "=WP3EC", + "=WP3FK", + "=WP3JE", + "=WP3JQ", + "=WP3JU", + "=WP3K", + "=WP3KU", + "=WP3LE", + "=WP3MB", + "=WP3MD", + "=WP3ME", + "=WP3NIS", + "=WP3NN", + "=WP3O", + "=WP3QE", + "=WP3QH", + "=WP3QV", + "=WP3QV/1", + "=WP3S", + "=WP3VU", + "=WP3WV", + "=WP3WZ", + "=WP3Y", + "=WP3ZA", + "=WP4A", + "=WP4ADA", + "=WP4AIE", + "=WP4AIL", + "=WP4AIZ", + "=WP4AKE", + "=WP4ALH", + "=WP4APJ", + "=WP4AQK", + "=WP4AR", + "=WP4AVW", + "=WP4AZJ", + "=WP4B", + "=WP4BAB", + "=WP4BAT", + "=WP4BC", + "=WP4BF", + "=WP4BFP", + "=WP4BGM", + "=WP4BIN", + "=WP4BJS", + "=WP4BK", + "=WP4BMU", + "=WP4BNI", + "=WP4BOC", + "=WP4BQV", + "=WP4BTQ", + "=WP4BXS", + "=WP4BZ", + "=WP4BZG", + "=WP4CB", + "=WP4CGI", + "=WP4CJH", + "=WP4CJY", + "=WP4CKW", + "=WP4CLS", + "=WP4CMH", + "=WP4CNA", + "=WP4CUJ", + "=WP4CW", + "=WP4DA", + "=WP4DC", + "=WP4DCB", + "=WP4DCK", + "=WP4DFK", + "=WP4DME", + "=WP4DNE", + "=WP4DPX", + "=WP4DWH", + "=WP4DYP", + "=WP4EDM", + "=WP4EHY", + "=WP4ENX", + "=WP4EVA", + "=WP4EVL", + "=WP4EXH", + "=WP4EYW", + "=WP4FEI", + "=WP4FRK", + "=WP4FS", + "=WP4GAK", + "=WP4GFH", + "=WP4GJL", + "=WP4GQR", + "=WP4GR", + "=WP4GX", + "=WP4GYA", + "=WP4HFZ", + "=WP4HJF", + "=WP4HLY", + "=WP4HNN", + "=WP4HOX", + "=WP4HRK", + "=WP4HSZ", + "=WP4HXS", + "=WP4IF", + "=WP4IJ", + "=WP4IK", + "=WP4ILP", + "=WP4JC", + "=WP4JF", + "=WP4JKO", + "=WP4JQJ", + "=WP4JSP", + "=WP4JSR", + "=WP4JT", + "=WP4KCJ", + "=WP4KDH", + "=WP4KDN", + "=WP4KFP", + "=WP4KGF", + "=WP4KGI", + "=WP4KI", + "=WP4KJV", + "=WP4KKX", + "=WP4KPK", + "=WP4KQ", + "=WP4KSK", + "=WP4KSP", + "=WP4KSU", + "=WP4KTD", + "=WP4KTF", + "=WP4KUW", + "=WP4KXX", + "=WP4LBK", + "=WP4LC", + "=WP4LDG", + "=WP4LDL", + "=WP4LDP", + "=WP4LE", + "=WP4LEM", + "=WP4LFO", + "=WP4LHA", + "=WP4LKA", + "=WP4LKY", + "=WP4LNP", + "=WP4LSQ", + "=WP4LTA", + "=WP4LYI", + "=WP4MAE", + "=WP4MD", + "=WP4MJP", + "=WP4MKJ", + "=WP4MMV", + "=WP4MNV", + "=WP4MO", + "=WP4MOC", + "=WP4MQF", + "=WP4MQN", + "=WP4MQX", + "=WP4MRB", + "=WP4MSD", + "=WP4MSX", + "=WP4MTN", + "=WP4MUJ", + "=WP4MVE", + "=WP4MVQ", + "=WP4MWB", + "=WP4MWE", + "=WP4MWS", + "=WP4MXE", + "=WP4MXP", + "=WP4MYG", + "=WP4MYI", + "=WP4MYK", + "=WP4MYL", + "=WP4MYM", + "=WP4MYN", + "=WP4MZO", + "=WP4MZR", + "=WP4NAE", + "=WP4NAI", + "=WP4NAK", + "=WP4NAQ", + "=WP4NBF", + "=WP4NBG", + "=WP4NBP", + "=WP4NBS", + "=WP4NEP", + "=WP4NFU", + "=WP4NKU", + "=WP4NKW", + "=WP4NLQ", + "=WP4NPV", + "=WP4NQA", + "=WP4NQL", + "=WP4NUV", + "=WP4NVL", + "=WP4NWW", + "=WP4NXG", + "=WP4NYQ", + "=WP4NYY", + "=WP4NZF", + "=WP4O/4", + "=WP4O/M", + "=WP4OAT", + "=WP4OBB", + "=WP4OBC", + "=WP4OBD", + "=WP4OBH", + "=WP4OCO", + "=WP4OCZ", + "=WP4ODR", + "=WP4OFA", + "=WP4OHJ", + "=WP4OIG", + "=WP4OJK", + "=WP4OLM", + "=WP4OMG", + "=WP4OMV", + "=WP4ONR", + "=WP4OOI", + "=WP4OPD", + "=WP4OPF", + "=WP4OPG", + "=WP4OPY", + "=WP4OSQ", + "=WP4OTP", + "=WP4OUE", + "=WP4OXA", + "=WP4P", + "=WP4PLR", + "=WP4PPH", + "=WP4PQN", + "=WP4PR", + "=WP4PUR", + "=WP4PUV", + "=WP4PWV", + "=WP4PXG", + "=WP4PYL", + "=WP4PYM", + "=WP4PYT", + "=WP4PYU", + "=WP4PYV", + "=WP4PYZ", + "=WP4PZA", + "=WP4PZB", + "=WP4QHU", + "=WP4QLB", + "=WP4R", + "=WP4RON", + "=WP4SW", + "=WP4TD", + "=WP4TX", + "=WP4UC", + "=WP4UM", + "=WP4VL", + "=WP4YG", + "WQ0", + "WQ5", + "WQ6", + "WQ7", + "WQ8", + "WQ9", + "WR0", + "WR5", + "WR6", + "WR7", + "WR8", + "WR9", + "WS0", + "WS5", + "WS6", + "WS7", + "WS8", + "WS9", + "WT0", + "WT5", + "WT6", + "WT7", + "WT8", + "WT9", + "WU0", + "WU5", + "WU6", + "WU7", + "WU8", + "WU9", + "WV0", + "WV5", + "WV6", + "WV7", + "WV8", + "WV9", + "WW0", + "WW5", + "WW6", + "WW7", + "WW8", + "WW9", + "WX0", + "WX5", + "WX6", + "WX7", + "WX8", + "WX9", + "WY0", + "WY5", + "WY6", + "WY7", + "WY8", + "WY9", + "WZ0", + "WZ5", + "WZ6", + "WZ7", + "WZ8", + "WZ9", + "=XL3TUV/M", + "=XM3CMB/M" + ], + "worked": false, + "confirmed": false, + "flag": "us.png", + "pp": "K", + "lat": 40.1357500646171, + "lon": -99.53703703703708, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "271": { + "dxcc": "292", + "cc": "UZ", + "ccc": "UZB", + "name": "乌兹别克斯坦", + "continent": "AS", + "ituzone": ["30"], + "cqzone": ["17"], + "timezone": "6", + "ccode": "860", + "aname": "Uzbekistan", + "mh": [ + "LN81", + "LN82", + "LN83", + "LN84", + "LN85", + "LN92", + "LN93", + "LN94", + "LN95", + "MM19", + "MM28", + "MM29", + "MM37", + "MM38", + "MM39", + "MM47", + "MM48", + "MM49", + "MN00", + "MN01", + "MN02", + "MN03", + "MN04", + "MN10", + "MN11", + "MN12", + "MN13", + "MN20", + "MN21", + "MN22", + "MN23", + "MN30", + "MN31", + "MN32", + "MN40", + "MN41", + "MN50", + "MN51", + "MN52", + "MN60", + "MN61" + ], + "prefix": [ + "=U8AG", + "=U8AH", + "=U8AI", + "UJ", + "UK", + "=UK/DF3DS/Z", + "UL", + "UM" + ], + "worked": false, + "confirmed": false, + "flag": "uz.png", + "pp": "UK", + "lat": 41.98185085896989, + "lon": 62.26337448559671, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "272": { + "dxcc": "293", + "cc": "VN", + "ccc": "VNM", + "name": "越南", + "continent": "AS", + "ituzone": ["49"], + "cqzone": ["26"], + "timezone": "7", + "ccode": "704", + "aname": "Viet Nam", + "mh": [ + "OJ19", + "OJ28", + "OJ29", + "OJ38", + "OJ39", + "OK10", + "OK19", + "OK20", + "OK21", + "OK27", + "OK28", + "OK29", + "OK30", + "OK31", + "OK32", + "OK33", + "OK34", + "OK35", + "OK36", + "OK37", + "OK38", + "OK39", + "OK40", + "OK41", + "OK42", + "OK43", + "OK44", + "OK45", + "OK46", + "OL10", + "OL11", + "OL12", + "OL20", + "OL21", + "OL22", + "OL23", + "OL30", + "OL31", + "OL32", + "OL41" + ], + "prefix": ["3W", "XV", "=XV2G/C"], + "worked": false, + "confirmed": false, + "flag": "vn.png", + "pp": "3W", + "lat": 10.961324168375285, + "lon": 106.79012345679013, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "273": { + "dxcc": "294", + "cc": "GB", + "ccc": "GBR", + "name": "威尔士", + "continent": "EU", + "ituzone": ["27"], + "cqzone": ["14"], + "timezone": "0", + "ccode": "826", + "aname": "Wales", + "mh": ["IO71", "IO72", "IO73", "IO81", "IO82", "IO83"], + "prefix": [ + "=2O0CDY", + "=2O0CGM", + "=2O0CJI", + "=2O0CVE", + "=2O0DAA", + "=2O0DUL", + "=2O0DVP", + "=2O0IDT", + "=2O0JBJ", + "=2O0OJA", + "=2O0RMR", + "=2O0RWF", + "=2O0TRR", + "=2O0UAA", + "=2O0WDS", + "=2O0ZJA", + "=2O12W", + "=2Q0CDY", + "=2Q0CGM", + "=2Q0CLJ", + "=2Q0CVE", + "=2Q0DAA", + "=2Q0DAA/M", + "=2Q0IDT", + "=2Q0MKG", + "=2Q0OJA", + "=2Q0OTL", + "=2Q0RMR", + "=2Q0RWF", + "=2Q0SVW", + "=2Q0TRR", + "=2Q0UAA", + "=2Q0VAY", + "=2Q0WDS", + "=2R0BRR", + "=2R0CDY", + "=2R0CDZ", + "=2R0CSS", + "=2R0CVE", + "=2R0DRB", + "=2R0IDT", + "=2R0OJA", + "=2R0PHP", + "=2R0PJP", + "=2R0REX", + "=2R0RWF", + "=2R0TRR", + "=2R0TYG", + "=2R0XTP", + "=2R0YKK", + "=2R3SFC", + "=2V0CDY", + "=2V0CGM", + "=2V0CLJ", + "=2V0CVL", + "=2V0DAA", + "=2V0DUN", + "=2V0GME", + "=2V0GNG", + "=2V0KED", + "=2V0WDS", + "=2V1EPO", + "2W", + "=GB0AAW", + "=GB0AD", + "=GB0ATM", + "=GB0AWE", + "=GB0AWS", + "=GB0BHR", + "=GB0BP", + "=GB0BRE", + "=GB0BTB", + "=GB0BVL", + "=GB0BYL", + "=GB0CAC", + "=GB0CCE", + "=GB0CEW", + "=GB0CFD", + "=GB0CGG", + "=GB0CLC", + "=GB0CQD", + "=GB0CSA", + "=GB0CSR", + "=GB0CTK", + "=GB0CVA", + "=GB0DFD", + "=GB0DMT", + "=GB0DS", + "=GB0DVP", + "=GB0EUL", + "=GB0FHD", + "=GB0FHI", + "=GB0GDD", + "=GB0GIW", + "=GB0GLV", + "=GB0GMD", + "=GB0GRM", + "=GB0HEL", + "=GB0HGC", + "=GB0HLT", + "=GB0HMM", + "=GB0HMT", + "=GB0KF", + "=GB0L", + "=GB0LBG", + "=GB0LM", + "=GB0LVF", + "=GB0MFH", + "=GB0MIW", + "=GB0ML", + "=GB0MPA", + "=GB0MSB", + "=GB0MUU", + "=GB0MWL", + "=GB0NAW", + "=GB0NEW", + "=GB0NG", + "=GB0NLC", + "=GB0PBR", + "=GB0PEM", + "=GB0PGG", + "=GB0PLB", + "=GB0PLL", + "=GB0PSG", + "=GB0RME", + "=GB0ROC", + "=GB0RPO", + "=GB0RS", + "=GB0RSC", + "=GB0RSF", + "=GB0RWM", + "=GB0SCB", + "=GB0SDD", + "=GB0SGC", + "=GB0SH", + "=GB0SH/LH", + "=GB0SOA", + "=GB0SPE", + "=GB0SPS", + "=GB0TD", + "=GB0TL", + "=GB0TPR", + "=GB0TS", + "=GB0TTT", + "=GB0VCA", + "=GB0VK", + "=GB0WHH", + "=GB0WHR", + "=GB0WIW", + "=GB0WUL", + "=GB0YG", + "=GB100AB", + "=GB100BP", + "=GB100CSW", + "=GB100GGC", + "=GB100GGM", + "=GB100HD", + "=GB100LB", + "=GB100LSG", + "=GB100MCV", + "=GB100TMD", + "=GB10SOTA", + "=GB19CGW", + "=GB19CW", + "=GB19SG", + "=GB1AD", + "=GB1ATC", + "=GB1BAF", + "=GB1BGS", + "=GB1BPL", + "=GB1BSW", + "=GB1BW", + "=GB1CCC", + "=GB1CDS", + "=GB1CPG", + "=GB1DS", + "=GB1FHS", + "=GB1HAS", + "=GB1HTW", + "=GB1JC", + "=GB1LSG", + "=GB1LW", + "=GB1OOC", + "=GB1PCA", + "=GB1PCS", + "=GB1PD", + "=GB1PGW", + "=GB1PJ", + "=GB1PLL", + "=GB1SEA", + "=GB1SL", + "=GB1SPN", + "=GB1SSL", + "=GB1TDS", + "=GB1WAA", + "=GB1WIW", + "=GB1WSM", + "=GB2000SET", + "=GB2003SET", + "=GB200HNT", + "=GB200TT", + "=GB250TMB", + "=GB250TT", + "=GB2ADU", + "=GB2BEF", + "=GB2BGG", + "=GB2BOM", + "=GB2BOW", + "=GB2BPM", + "=GB2BYF", + "=GB2CC", + "=GB2CI", + "=GB2COB", + "=GB2CR", + "=GB2CRS", + "=GB2DWR", + "=GB2EI", + "=GB2FC", + "=GB2FLB", + "=GB2GGM", + "=GB2GLS", + "=GB2GOL", + "=GB2GSG", + "=GB2GVA", + "=GB2HDG", + "=GB2HMM", + "=GB2IMD", + "=GB2LBR", + "=GB2LM", + "=GB2LNP", + "=GB2LSA", + "=GB2LSA/LH", + "=GB2LSH", + "=GB2MD", + "=GB2MGY", + "=GB2MIL", + "=GB2MLM", + "=GB2MMC", + "=GB2MOP", + "=GB2NF", + "=GB2NPH", + "=GB2NPL", + "=GB2OOA", + "=GB2ORM", + "=GB2PRC", + "=GB2RFS", + "=GB2RSG", + "=GB2RTB", + "=GB2SAC", + "=GB2SCC", + "=GB2SCD", + "=GB2SCP", + "=GB2SFM", + "=GB2SIP", + "=GB2SLA", + "=GB2TD", + "=GB2TD/LH", + "=GB2TTA", + "=GB2VK", + "=GB2WAA", + "=GB2WHO", + "=GB2WNA", + "=GB2WSF", + "=GB2WT", + "=GB3HLS", + "=GB3LMW", + "=GB4ADU", + "=GB4AFS", + "=GB4AOS", + "=GB4BB", + "=GB4BIT", + "=GB4BOJ", + "=GB4BPL", + "=GB4BPL/LH", + "=GB4BPL/P", + "=GB4BPR", + "=GB4BRS/P", + "=GB4BSG", + "=GB4CI", + "=GB4CTC", + "=GB4EUL", + "=GB4FAA", + "=GB4GM", + "=GB4GSS", + "=GB4HFH", + "=GB4HI", + "=GB4HLB", + "=GB4HMD", + "=GB4HMM", + "=GB4MBC", + "=GB4MD", + "=GB4MDH", + "=GB4MDI", + "=GB4MJS", + "=GB4MPI", + "=GB4MUU", + "=GB4NDG", + "=GB4NPL", + "=GB4NTB", + "=GB4ON", + "=GB4OST", + "=GB4PAT", + "=GB4PCS", + "=GB4PD", + "=GB4POW", + "=GB4RC", + "=GB4RME", + "=GB4RSL", + "=GB4SDD", + "=GB4SLC", + "=GB4SSP", + "=GB4SUB", + "=GB4TMS", + "=GB4UKG", + "=GB4VJD", + "=GB4WT", + "=GB4WWI", + "=GB4XT", + "=GB50ABS", + "=GB50EVS", + "=GB50RSC", + "=GB50SGP", + "=GB5AC", + "=GB5FI", + "=GB5GEO", + "=GB5IMD", + "=GB5MD", + "=GB5ONG", + "=GB5PSJ", + "=GB5SIP", + "=GB5WT", + "=GB60ATG", + "=GB60DITP", + "=GB60ER", + "=GB60PW", + "=GB60SPS", + "=GB60VLY", + "=GB65BTF", + "=GB6AC", + "=GB6BLB", + "=GB6CRI", + "=GB6GGM", + "=GB6OQA", + "=GB6ORA", + "=GB6PLB", + "=GB6RNLI", + "=GB6SPD", + "=GB6TS", + "=GB6TSG", + "=GB6WT", + "=GB6WWT", + "=GB70BTF", + "=GB750CC", + "=GB75ATC", + "=GB75BB", + "=GB8CCC", + "=GB8HI", + "=GB8MD", + "=GB8MG", + "=GB8ND", + "=GB8OAE", + "=GB8OQE", + "=GB8RAF", + "=GB8WOW", + "=GB8WT", + "=GB90RSGB/62", + "=GB90RSGB/72", + "=GB9GGM", + "GC", + "=GC4BRS/LH", + "=GG100ACD", + "=GG100ANG", + "=GG100CPG", + "=GG100RGG", + "=GG100SG", + "=GO0DIV", + "=GO0EZQ", + "=GO0EZY", + "=GO0JEQ", + "=GO0MNP", + "=GO0MNP/P", + "=GO0NPL", + "=GO0PLB", + "=GO0PNI", + "=GO0PUP", + "=GO0VKW", + "=GO0VML", + "=GO0VSW", + "=GO1DPL", + "=GO1IOT", + "=GO1JFV", + "=GO1MVL", + "=GO1PKM", + "=GO3PLB", + "=GO3UOF", + "=GO3UOF/M", + "=GO3XJQ", + "=GO4BKG", + "=GO4BLE", + "=GO4CQZ", + "=GO4DTQ", + "=GO4GTI", + "=GO4JKR", + "=GO4JUN", + "=GO4JUW", + "=GO4MVA", + "=GO4NOO", + "=GO4OKT", + "=GO4SUE", + "=GO4SUE/P", + "=GO4TNZ", + "=GO4WXM", + "=GO6IMS", + "=GO6NKG", + "=GO6UKO", + "=GO7DWR", + "=GO7SBO", + "=GO7VJK", + "=GO7VQD", + "=GO8BQK", + "=GO8IQC", + "=GO8JOY", + "=GO8OKR", + "=GQ0ANA", + "=GQ0DIV", + "=GQ0JEQ", + "=GQ0JRF", + "=GQ0MNO", + "=GQ0MNP", + "=GQ0NPL", + "=GQ0PUP", + "=GQ0RYT", + "=GQ0SLM", + "=GQ0TQM", + "=GQ0VKW", + "=GQ0VML", + "=GQ0VSW", + "=GQ0WVL", + "=GQ1FKY", + "=GQ1FOA/P", + "=GQ1IOT", + "=GQ1JFV", + "=GQ1MVL", + "=GQ1NRS", + "=GQ1WRV", + "=GQ1ZKN", + "=GQ3IRK", + "=GQ3PLB", + "=GQ3SB", + "=GQ3UOF", + "=GQ3VEN", + "=GQ3VKL", + "=GQ3WSU", + "=GQ3XJA", + "=GQ3XJQ", + "=GQ4BKG", + "=GQ4BLE", + "=GQ4CQZ", + "=GQ4EZW", + "=GQ4GSH", + "=GQ4GTI", + "=GQ4IIL", + "=GQ4JKR", + "=GQ4JUN", + "=GQ4JUW", + "=GQ4LZP", + "=GQ4MVA", + "=GQ4NOO", + "=GQ4OKT", + "=GQ4SUE", + "=GQ4VNS", + "=GQ4VZJ", + "=GQ4WXM", + "=GQ4WXM/P", + "=GQ6IMS", + "=GQ6ITJ", + "=GQ6NKG", + "=GQ6UKO", + "=GQ7BQK", + "=GQ7DWR", + "=GQ7FBV", + "=GQ7SBO", + "=GQ7UNJ", + "=GQ7UNV", + "=GQ7VJK", + "=GQ7VQD", + "=GQ8BQK", + "=GQ8IQC", + "=GQ8JOY", + "=GQ8OKR", + "=GR0ANA", + "=GR0DIV", + "=GR0DSP", + "=GR0HUS", + "=GR0JEQ", + "=GR0MYY", + "=GR0NPL", + "=GR0PSV", + "=GR0RYT", + "=GR0SYN", + "=GR0TKX", + "=GR0VKW", + "=GR0WGK", + "=GR1FJI", + "=GR1HNG", + "=GR1LFX", + "=GR1LHV", + "=GR1MCD", + "=GR1SGG", + "=GR1WVY", + "=GR1YQM", + "=GR3SB", + "=GR3SFC", + "=GR3TKH", + "=GR3UOF", + "=GR3XJQ", + "=GR4BKG", + "=GR4BLE", + "=GR4CQZ", + "=GR4GNY", + "=GR4GTI", + "=GR4HZA", + "=GR4JUN", + "=GR4JUW", + "=GR4OGO", + "=GR4SUE", + "=GR4VSS/P", + "=GR4XXJ", + "=GR4ZOM", + "=GR5PH", + "=GR6NKG", + "=GR6SIX", + "=GR6STK", + "=GR6UKO", + "=GR6ZDH", + "=GR7AAV", + "=GR7HOC", + "=GR7NAU", + "=GR7TKZ", + "=GR7UNV", + "=GR7VQD", + "=GR8BQK", + "=GR8IQC", + "=GR8OGI", + "=GR8TRO", + "=GV0ANA", + "=GV0DCK", + "=GV0DIV", + "=GV0EME", + "=GV0FRE", + "=GV0MNP", + "=GV0NPL", + "=GV1FKY", + "=GV1IOT", + "=GV1JFV", + "=GV1NBW", + "=GV1YQM", + "=GV3ATZ", + "=GV3TJE/P", + "=GV3UOF", + "=GV3WEZ", + "=GV3XJQ", + "=GV4BKG", + "=GV4BRS", + "=GV4CQZ", + "=GV4JKR", + "=GV4JQP", + "=GV4NQJ", + "=GV4PUC", + "=GV6BRC", + "=GV6JPC", + "=GV6NKG", + "=GV7UNV", + "=GV7VJK", + "=GV8IQC", + "GW", + "=GW0AWT/2K", + "=GW0GEI/2K", + "=GW0GIH/2K", + "=GW0MNO/2K", + "=GW0VSW/2K", + "=GW3JXN/2K", + "=GW3KJN/2K", + "=GW4IIL/2K", + "=GW4VHP/2K", + "=M2000Y/97A", + "MC", + "=MO0AQZ", + "=MO0ATI", + "=MO0COE", + "=MO0CVT", + "=MO0EQL", + "=MO0EZQ", + "=MO0GXE", + "=MO0HCX", + "=MO0IBZ", + "=MO0IML", + "=MO0KLW", + "=MO0LDJ", + "=MO0LLK", + "=MO0LUK", + "=MO0LZZ", + "=MO0MAU", + "=MO0MUM", + "=MO0MWZ", + "=MO0OWW", + "=MO0SGD", + "=MO0SGR", + "=MO0TBB", + "=MO0TMI", + "=MO0TTU", + "=MO0UPH", + "=MO0VVO", + "=MO1CFA", + "=MO1CFN", + "=MO3DAO", + "=MO3DQB", + "=MO3GKI", + "=MO3OJA", + "=MO3PUU", + "=MO3RNI", + "=MO3UEZ", + "=MO3WPH", + "=MO3YVO", + "=MO3ZCO", + "=MO6DVP", + "=MO6GWK", + "=MO6GWR", + "=MO6GWR/P", + "=MO6MAU", + "=MO6PAM", + "=MO6PLC", + "=MO6PUT", + "=MO6SEF", + "=MO6TBD", + "=MO6TBP", + "=MO6WLB", + "=MQ0AQZ", + "=MQ0ATI", + "=MQ0AWW", + "=MQ0CDO", + "=MQ0CNA", + "=MQ0CVT", + "=MQ0DHF", + "=MQ0EQL", + "=MQ0GXE", + "=MQ0GYV", + "=MQ0HCX", + "=MQ0IBZ", + "=MQ0IML", + "=MQ0LDJ", + "=MQ0LLK", + "=MQ0LUK", + "=MQ0LZZ", + "=MQ0MAU", + "=MQ0MUM", + "=MQ0MWA", + "=MQ0MWZ", + "=MQ0OWW", + "=MQ0PAD", + "=MQ0RHD", + "=MQ0SGD", + "=MQ0SGR", + "=MQ0TBB", + "=MQ0TMI", + "=MQ0TTU", + "=MQ0UPH", + "=MQ0UPH/P", + "=MQ0VVO", + "=MQ0XMC/P", + "=MQ1CFA", + "=MQ1CFN", + "=MQ1EYO/P", + "=MQ1LCR", + "=MQ3DAO", + "=MQ3EPA", + "=MQ3GKI", + "=MQ3JAT", + "=MQ3NDB", + "=MQ3OJA", + "=MQ3USK", + "=MQ3WPH", + "=MQ3ZCB/P", + "=MQ5AND", + "=MQ5EPA", + "=MQ5VZW", + "=MQ6DVP", + "=MQ6KLL", + "=MQ6MAU", + "=MQ6PAM", + "=MQ6PLC", + "=MQ6RHD", + "=MQ6SEF", + "=MQ6TBD", + "=MQ6TBP", + "=MR0AQZ", + "=MR0BXJ", + "=MR0CVT", + "=MR0GUK", + "=MR0GXE", + "=MR0IDX", + "=MR0JGE", + "=MR0LAO", + "=MR0LDJ", + "=MR0MAU", + "=MR0RLD", + "=MR0TTR", + "=MR0TTU", + "=MR0YAD", + "=MR0ZAP", + "=MR1CFN", + "=MR1EAA", + "=MR1LCR", + "=MR1MAJ/P", + "=MR1MDH", + "=MR3AVB", + "=MR3AVC", + "=MR3CBF", + "=MR3NYR", + "=MR3OBL", + "=MR3SET/P", + "=MR3UFN", + "=MR3XZP", + "=MR3YKL", + "=MR3YLO", + "=MR3YVO", + "=MR3ZCB/P", + "=MR5HOC", + "=MR6ADZ", + "=MR6KDA", + "=MR6VHF", + "=MR6YDP", + "=MV0AEL", + "=MV0BLM", + "=MV0EDX", + "=MV0GWT", + "=MV0GXE", + "=MV0HGY/P", + "=MV0IML", + "=MV0LLK", + "=MV0PJJ", + "=MV0PJJ/P", + "=MV0RRD", + "=MV0SGD", + "=MV0SGR", + "=MV0TBB", + "=MV0TDQ", + "=MV0UAA", + "=MV0USK", + "=MV0VRQ", + "=MV0WYN", + "=MV1CFA", + "=MV1CFN", + "=MV1EYP/P", + "=MV3RNI", + "=MV6CQN", + "=MV6GWR", + "=MV6GWR/P", + "=MV6URC", + "=MV6ZOL", + "MW", + "=MW0CND/2K", + "=MW0DHF/LH", + "=MW5AAM/2K", + "=MW5GOL/LH" + ], + "worked": false, + "confirmed": false, + "flag": "wa.png", + "pp": "GW", + "lat": 52.69373062176686, + "lon": -4.382716049382719, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "274": { + "dxcc": "295", + "cc": "VA", + "ccc": "VAT", + "name": "梵蒂冈", + "continent": "EU", + "ituzone": ["28"], + "cqzone": ["15"], + "timezone": "1", + "ccode": "336", + "aname": "Vatican", + "mh": ["JN61"], + "prefix": ["HV", "=HV50VR/IMD"], + "worked": false, + "confirmed": false, + "flag": "va.png", + "pp": "HV", + "lat": 41.903333, + "lon": 12.453333, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "275": { + "dxcc": "296", + "cc": "RS", + "ccc": "SRB", + "name": "塞尔维亚", + "continent": "EU", + "ituzone": ["28"], + "cqzone": ["15"], + "timezone": "1", + "ccode": "688", + "aname": "Serbia", + "mh": [ + "JN93", + "JN94", + "JN95", + "JN96", + "KN01", + "KN02", + "KN03", + "KN04", + "KN05", + "KN06", + "KN12", + "KN13", + "KN14" + ], + "prefix": [ + "=4O0A", + "=4O5W", + "=4O5Z", + "=4U/DA1KY", + "YT", + "=YT1S/J", + "=YT2A/LGT", + "=YT2A/LH", + "YU", + "=YU/IZ1VUC/LH", + "=YU1BBA/J", + "=YU1CA/LH", + "=YU1FW/LH", + "=YU1JF/LH", + "=YU7RQ/FAIR" + ], + "worked": false, + "confirmed": false, + "flag": "rs.png", + "pp": "YU", + "lat": 44.135273711063604, + "lon": 20.93583295229386, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "276": { + "dxcc": "297", + "cc": "US", + "ccc": "USA", + "name": "威克岛", + "continent": "OC", + "ituzone": ["65"], + "cqzone": ["31"], + "timezone": "12", + "ccode": "840", + "aname": "Wake I.", + "mh": ["RK39"], + "prefix": ["AH9", "KH9", "NH9", "WH9"], + "worked": false, + "confirmed": false, + "flag": "us.png", + "pp": "KH9", + "lat": 19.337237310744925, + "lon": 166.61416789446054, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "277": { + "dxcc": "298", + "cc": "WF", + "ccc": "WLF", + "name": "瓦利斯及富图纳群岛", + "continent": "OC", + "ituzone": ["62"], + "cqzone": ["32"], + "timezone": "-11", + "ccode": "876", + "aname": "Wallis & Futuna Is.", + "mh": ["AH05", "AH15", "AH16"], + "prefix": ["FW", "TW"], + "worked": false, + "confirmed": false, + "flag": "wf.png", + "pp": "FW", + "lat": -13.908008633750711, + "lon": -177.631458619113, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "278": { + "dxcc": "299", + "cc": "MY", + "ccc": "MYS", + "name": "西马来西亚", + "continent": "AS", + "ituzone": ["54"], + "cqzone": ["28"], + "timezone": "8", + "ccode": "458", + "aname": "West Malaysia", + "mh": [ + "NJ96", + "OJ02", + "OJ03", + "OJ04", + "OJ05", + "OJ06", + "OJ11", + "OJ12", + "OJ13", + "OJ14", + "OJ15", + "OJ16", + "OJ21", + "OJ22" + ], + "prefix": [ + "9M", + "=9M0SEA", + "=9M6/PA0RRS/2", + "=9M6/ZS6EZ/2", + "=9M6XX/2", + "=9M6YBG/2", + "=9M8DX/2", + "=9M8SYA/2", + "9W", + "=9W6KOM/2", + "=9W6MAN/2" + ], + "worked": false, + "confirmed": false, + "flag": "my.png", + "pp": "9M2", + "lat": 4.604090582312168, + "lon": 102.01646090534979, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "279": { + "dxcc": "301", + "cc": "KI", + "ccc": "KIR", + "name": "西吉里巴斯", + "continent": "OC", + "ituzone": ["65"], + "cqzone": ["31"], + "timezone": "12", + "ccode": "296", + "aname": "W. Kiribati (Gilbert Is.)", + "mh": [ + "AI35", + "AI45", + "AI46", + "AI47", + "AJ94", + "BH39", + "BH48", + "BI24", + "BI25", + "BI26", + "BI40", + "BJ03", + "BJ11", + "BJ12", + "RI77", + "RI78", + "RI79", + "RI87", + "RI88", + "RJ60", + "RJ61", + "RJ62", + "RJ63" + ], + "prefix": ["T30", "=T3AJ"], + "worked": false, + "confirmed": false, + "flag": "ki.png", + "pp": "T30", + "lat": 0.24691281599525894, + "lon": 173.7860082304527, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "280": { + "dxcc": "302", + "cc": "EH", + "ccc": "ESH", + "name": "西萨哈拉", + "continent": "AF", + "ituzone": ["46"], + "cqzone": ["33"], + "timezone": "0", + "ccode": "732", + "aname": "Western Sahara", + "mh": [ + "IL10", + "IL11", + "IL12", + "IL13", + "IL21", + "IL22", + "IL23", + "IL24", + "IL25", + "IL26", + "IL31", + "IL32", + "IL33", + "IL34", + "IL35", + "IL36", + "IL37", + "IL46", + "IL47", + "IL56", + "IL57" + ], + "prefix": ["S0"], + "worked": false, + "confirmed": false, + "flag": "eh.png", + "pp": "S0", + "lat": 24.035967349184517, + "lon": -12.222222222222227, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "281": { + "dxcc": "303", + "cc": "AU", + "ccc": "AUS", + "name": "威里斯岛", + "continent": "OC", + "ituzone": ["55"], + "cqzone": ["30"], + "timezone": "10", + "ccode": "36", + "aname": "Willis I.", + "mh": ["QH53"], + "prefix": [ + "AX9W", + "AX9Z", + "VH9W", + "VH9Z", + "VI9W", + "VI9Z", + "VJ9W", + "VJ9Z", + "=VK9DWX", + "VK9FW", + "VK9W", + "VK9Z", + "VL9W", + "VL9Z", + "VM9W", + "VM9Z", + "VN9W", + "VN9Z", + "VZ9W", + "VZ9Z" + ], + "worked": false, + "confirmed": false, + "flag": "au.png", + "pp": "VK9W", + "lat": -16.098491291459595, + "lon": 149.9588477366255, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "282": { + "dxcc": "304", + "cc": "BH", + "ccc": "BHR", + "name": "巴林", + "continent": "AS", + "ituzone": ["39"], + "cqzone": ["21"], + "timezone": "4", + "ccode": "48", + "aname": "Bahrain", + "mh": ["LL55", "LL56"], + "prefix": ["A9", "=A92AA/GR"], + "worked": false, + "confirmed": false, + "flag": "bh.png", + "pp": "A9", + "lat": 26.180519750016686, + "lon": 50.608139003200726, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "283": { + "dxcc": "305", + "cc": "BD", + "ccc": "BGD", + "name": "孟加拉", + "continent": "AS", + "ituzone": ["41"], + "cqzone": ["22"], + "timezone": "6", + "ccode": "50", + "aname": "Bangladesh", + "mh": [ + "NL41", + "NL42", + "NL43", + "NL44", + "NL45", + "NL46", + "NL51", + "NL52", + "NL53", + "NL54", + "NL55", + "NL60", + "NL61", + "NL62", + "NL63", + "NL64", + "NL65" + ], + "prefix": ["S2", "S3"], + "worked": false, + "confirmed": false, + "flag": "bd.png", + "pp": "S2", + "lat": 24.66082947284967, + "lon": 89.82167352537722, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "284": { + "dxcc": "306", + "cc": "BT", + "ccc": "BTN", + "name": "不丹", + "continent": "AS", + "ituzone": ["41"], + "cqzone": ["22"], + "timezone": "6", + "ccode": "64", + "aname": "Bhutan", + "mh": ["NL46", "NL47", "NL48", "NL56", "NL57", "NL58", "NL66", "NL67"], + "prefix": ["A5"], + "worked": false, + "confirmed": false, + "flag": "bt.png", + "pp": "A5", + "lat": 27.388721965315938, + "lon": 90.37037037037038, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "286": { + "dxcc": "308", + "cc": "CR", + "ccc": "CRI", + "name": "哥斯达黎加", + "continent": "NA", + "ituzone": ["11"], + "cqzone": ["7"], + "timezone": "-6", + "ccode": "188", + "aname": "Costa Rica", + "mh": ["EJ79", "EJ88", "EJ89", "EK70", "EK71", "EK80"], + "prefix": ["TE", "TI", "=TI90IARU"], + "worked": false, + "confirmed": false, + "flag": "cr.png", + "pp": "TI", + "lat": 10.098201932792449, + "lon": -83.97805212620025, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "287": { + "dxcc": "309", + "cc": "MM", + "ccc": "MMR", + "name": "缅甸", + "continent": "AS", + "ituzone": ["49"], + "cqzone": ["26"], + "timezone": "7", + "ccode": "104", + "aname": "Myanmar", + "mh": [ + "NJ89", + "NJ99", + "NK64", + "NK68", + "NK69", + "NK75", + "NK76", + "NK77", + "NK78", + "NK79", + "NK80", + "NK81", + "NK82", + "NK83", + "NK84", + "NK85", + "NK86", + "NK87", + "NK88", + "NK89", + "NK90", + "NK91", + "NK92", + "NK93", + "NK94", + "NK95", + "NK96", + "NK97", + "NK99", + "NL60", + "NL61", + "NL62", + "NL63", + "NL64", + "NL70", + "NL71", + "NL72", + "NL73", + "NL74", + "NL75", + "NL76", + "NL77", + "NL80", + "NL81", + "NL82", + "NL83", + "NL84", + "NL85", + "NL86", + "NL87", + "NL88", + "NL90", + "NL91", + "NL92", + "NL93", + "NL94", + "NL95", + "NL96", + "NL97", + "NL98", + "OL00", + "OL01" + ], + "prefix": ["XY", "XZ"], + "worked": false, + "confirmed": false, + "flag": "mm.png", + "pp": "XZ", + "lat": 21.29373458690327, + "lon": 95.82075903063557, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "288": { + "dxcc": "312", + "cc": "KH", + "ccc": "KHM", + "name": "柬埔寨", + "continent": "AS", + "ituzone": ["49"], + "cqzone": ["26"], + "timezone": "8", + "ccode": "116", + "aname": "Cambodia", + "mh": [ + "OJ19", + "OK10", + "OK11", + "OK12", + "OK13", + "OK14", + "OK20", + "OK21", + "OK22", + "OK23", + "OK24", + "OK30", + "OK31", + "OK32", + "OK33", + "OK34" + ], + "prefix": ["XU"], + "worked": false, + "confirmed": false, + "flag": "kh.png", + "pp": "XU", + "lat": 13.13445642357189, + "lon": 104.73251028806584, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "289": { + "dxcc": "315", + "cc": "LK", + "ccc": "LKA", + "name": "斯里兰卡", + "continent": "AS", + "ituzone": ["41"], + "cqzone": ["22"], + "timezone": "6", + "ccode": "144", + "aname": "Sri Lanka", + "mh": [ + "MJ96", + "MJ97", + "MJ98", + "MJ99", + "NJ05", + "NJ06", + "NJ07", + "NJ08", + "NJ09" + ], + "prefix": ["4P", "4Q", "4R", "4S", "=4S7CGM/AVR"], + "worked": false, + "confirmed": false, + "flag": "lk.png", + "pp": "4S", + "lat": 7.767591548815062, + "lon": 80.68587105624145, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "290": { + "dxcc": "318", + "cc": "CN", + "ccc": "CHN", + "name": "中国", + "continent": "AS", + "ituzone": ["33", "42", "43", "44"], + "cqzone": ["23", "24"], + "timezone": "8", + "ccode": "156", + "aname": "China", + "mh": [ + "MM68", + "MM69", + "MM76", + "MM77", + "MM78", + "MM79", + "MM85", + "MM86", + "MM87", + "MM88", + "MM89", + "MM90", + "MM91", + "MM92", + "MM93", + "MM94", + "MM95", + "MM96", + "MM97", + "MM98", + "MM99", + "MN60", + "MN70", + "MN80", + "MN81", + "MN90", + "MN91", + "MN92", + "MN94", + "NL19", + "NL27", + "NL28", + "NL29", + "NL37", + "NL38", + "NL39", + "NL47", + "NL48", + "NL49", + "NL57", + "NL58", + "NL59", + "NL67", + "NL68", + "NL69", + "NL78", + "NL79", + "NL83", + "NL84", + "NL85", + "NL88", + "NL89", + "NL91", + "NL92", + "NL93", + "NL94", + "NL95", + "NL96", + "NL97", + "NL98", + "NL99", + "NM00", + "NM01", + "NM02", + "NM03", + "NM04", + "NM05", + "NM06", + "NM07", + "NM08", + "NM09", + "NM10", + "NM11", + "NM12", + "NM13", + "NM14", + "NM15", + "NM16", + "NM17", + "NM18", + "NM19", + "NM20", + "NM21", + "NM22", + "NM23", + "NM24", + "NM25", + "NM26", + "NM27", + "NM28", + "NM29", + "NM30", + "NM31", + "NM32", + "NM33", + "NM34", + "NM35", + "NM36", + "NM37", + "NM38", + "NM39", + "NM40", + "NM41", + "NM42", + "NM43", + "NM44", + "NM45", + "NM46", + "NM47", + "NM48", + "NM49", + "NM50", + "NM51", + "NM52", + "NM53", + "NM54", + "NM55", + "NM56", + "NM57", + "NM58", + "NM59", + "NM60", + "NM61", + "NM62", + "NM63", + "NM64", + "NM65", + "NM66", + "NM67", + "NM68", + "NM69", + "NM70", + "NM71", + "NM72", + "NM73", + "NM74", + "NM75", + "NM76", + "NM77", + "NM78", + "NM79", + "NM80", + "NM81", + "NM82", + "NM83", + "NM84", + "NM85", + "NM86", + "NM87", + "NM88", + "NM89", + "NM90", + "NM91", + "NM92", + "NM93", + "NM94", + "NM95", + "NM96", + "NM97", + "NM98", + "NM99", + "NN00", + "NN01", + "NN02", + "NN03", + "NN04", + "NN05", + "NN10", + "NN11", + "NN12", + "NN13", + "NN14", + "NN15", + "NN16", + "NN17", + "NN20", + "NN21", + "NN22", + "NN23", + "NN24", + "NN25", + "NN26", + "NN27", + "NN28", + "NN30", + "NN31", + "NN32", + "NN33", + "NN34", + "NN35", + "NN36", + "NN37", + "NN38", + "NN39", + "NN40", + "NN41", + "NN42", + "NN43", + "NN44", + "NN45", + "NN46", + "NN47", + "NN48", + "NN50", + "NN51", + "NN52", + "NN53", + "NN54", + "NN55", + "NN56", + "NN57", + "NN60", + "NN61", + "NN62", + "NN63", + "NN64", + "NN65", + "NN70", + "NN71", + "NN72", + "NN73", + "NN74", + "NN80", + "NN81", + "NN82", + "NN83", + "NN90", + "NN91", + "NN92", + "OK48", + "OK49", + "OK58", + "OK59", + "OL01", + "OL02", + "OL03", + "OL04", + "OL05", + "OL06", + "OL07", + "OL08", + "OL09", + "OL12", + "OL13", + "OL14", + "OL15", + "OL16", + "OL17", + "OL18", + "OL19", + "OL22", + "OL23", + "OL24", + "OL25", + "OL26", + "OL27", + "OL28", + "OL29", + "OL31", + "OL32", + "OL33", + "OL34", + "OL35", + "OL36", + "OL37", + "OL38", + "OL39", + "OL40", + "OL41", + "OL42", + "OL43", + "OL44", + "OL45", + "OL46", + "OL47", + "OL48", + "OL49", + "OL50", + "OL51", + "OL52", + "OL53", + "OL54", + "OL55", + "OL56", + "OL57", + "OL58", + "OL59", + "OL61", + "OL62", + "OL63", + "OL64", + "OL65", + "OL66", + "OL67", + "OL68", + "OL69", + "OL71", + "OL72", + "OL73", + "OL74", + "OL75", + "OL76", + "OL77", + "OL78", + "OL79", + "OL80", + "OL82", + "OL83", + "OL84", + "OL85", + "OL86", + "OL87", + "OL88", + "OL89", + "OL94", + "OL95", + "OL96", + "OL97", + "OL98", + "OL99", + "OM00", + "OM01", + "OM02", + "OM03", + "OM04", + "OM05", + "OM06", + "OM07", + "OM08", + "OM09", + "OM10", + "OM11", + "OM12", + "OM13", + "OM14", + "OM15", + "OM16", + "OM17", + "OM18", + "OM19", + "OM20", + "OM21", + "OM22", + "OM23", + "OM24", + "OM25", + "OM26", + "OM27", + "OM28", + "OM29", + "OM30", + "OM31", + "OM32", + "OM33", + "OM34", + "OM35", + "OM36", + "OM37", + "OM38", + "OM39", + "OM40", + "OM41", + "OM42", + "OM43", + "OM44", + "OM45", + "OM46", + "OM47", + "OM48", + "OM49", + "OM50", + "OM51", + "OM52", + "OM53", + "OM54", + "OM55", + "OM56", + "OM57", + "OM58", + "OM59", + "OM60", + "OM61", + "OM62", + "OM63", + "OM64", + "OM65", + "OM66", + "OM67", + "OM68", + "OM69", + "OM70", + "OM71", + "OM72", + "OM73", + "OM74", + "OM75", + "OM76", + "OM77", + "OM78", + "OM79", + "OM80", + "OM81", + "OM82", + "OM83", + "OM84", + "OM85", + "OM86", + "OM87", + "OM88", + "OM89", + "OM90", + "OM91", + "OM92", + "OM93", + "OM94", + "OM95", + "OM96", + "OM97", + "OM98", + "OM99", + "ON00", + "ON01", + "ON02", + "ON10", + "ON11", + "ON12", + "ON20", + "ON21", + "ON22", + "ON30", + "ON31", + "ON32", + "ON40", + "ON41", + "ON42", + "ON50", + "ON51", + "ON52", + "ON53", + "ON54", + "ON55", + "ON60", + "ON61", + "ON62", + "ON63", + "ON64", + "ON65", + "ON70", + "ON71", + "ON72", + "ON73", + "ON74", + "ON75", + "ON77", + "ON78", + "ON80", + "ON81", + "ON82", + "ON83", + "ON84", + "ON85", + "ON86", + "ON87", + "ON88", + "ON89", + "ON90", + "ON91", + "ON92", + "ON93", + "ON94", + "ON95", + "ON96", + "ON97", + "ON98", + "ON99", + "OO90", + "OO91", + "PL06", + "PL07", + "PL08", + "PL09", + "PL19", + "PM00", + "PM01", + "PM02", + "PM03", + "PM04", + "PM05", + "PM06", + "PM07", + "PM08", + "PM09", + "PM10", + "PM16", + "PM17", + "PM19", + "PM29", + "PN00", + "PN01", + "PN02", + "PN03", + "PN04", + "PN05", + "PN06", + "PN07", + "PN08", + "PN09", + "PN10", + "PN11", + "PN12", + "PN13", + "PN14", + "PN15", + "PN16", + "PN17", + "PN18", + "PN19", + "PN20", + "PN21", + "PN22", + "PN23", + "PN24", + "PN25", + "PN26", + "PN27", + "PN28", + "PN29", + "PN30", + "PN31", + "PN32", + "PN33", + "PN34", + "PN35", + "PN36", + "PN37", + "PN38", + "PN39", + "PN41", + "PN42", + "PN43", + "PN44", + "PN45", + "PN46", + "PN47", + "PN48", + "PN49", + "PN52", + "PN53", + "PN54", + "PN55", + "PN56", + "PN57", + "PN58", + "PN59", + "PN65", + "PN66", + "PN67", + "PN68", + "PN76", + "PN77", + "PN78", + "PO00", + "PO01", + "PO02", + "PO03", + "PO10", + "PO11", + "PO12", + "PO13", + "PO20", + "PO21", + "PO22", + "PO23", + "PO30", + "PO31", + "PO32" + ], + "prefix": [ + "3H", + "3H0", + "3H2A", + "3H2B", + "3H2C", + "3H2D", + "3H2E", + "3H2F", + "3H2G", + "3H2H", + "3H2I", + "3H2J", + "3H2K", + "3H2L", + "3H2M", + "3H2N", + "3H2O", + "3H2P", + "3H3G", + "3H3H", + "3H3I", + "3H3J", + "3H3K", + "3H3L", + "3H6Q", + "3H6R", + "3H6S", + "3H6T", + "3H6U", + "3H6V", + "3H6W", + "3H6X", + "3H7A", + "3H7B", + "3H7C", + "3H7D", + "3H7E", + "3H7F", + "3H7G", + "3H7H", + "3H7Q", + "3H7R", + "3H7S", + "3H7T", + "3H7U", + "3H7V", + "3H7W", + "3H7X", + "3H8A", + "3H8B", + "3H8C", + "3H8D", + "3H8E", + "3H8F", + "3H8G", + "3H8H", + "3H8I", + "3H8J", + "3H8K", + "3H8L", + "3H8M", + "3H8N", + "3H8O", + "3H8P", + "3H8Q", + "3H8R", + "3H8S", + "3H8T", + "3H8U", + "3H8V", + "3H8W", + "3H8X", + "3H9", + "3H9A", + "3H9B", + "3H9C", + "3H9D", + "3H9E", + "3H9F", + "3H9S", + "3H9T", + "3H9U", + "3H9V", + "3H9W", + "3H9X", + "3I", + "3I0", + "3I2A", + "3I2B", + "3I2C", + "3I2D", + "3I2E", + "3I2F", + "3I2G", + "3I2H", + "3I2I", + "3I2J", + "3I2K", + "3I2L", + "3I2M", + "3I2N", + "3I2O", + "3I2P", + "3I3G", + "3I3H", + "3I3I", + "3I3J", + "3I3K", + "3I3L", + "3I6Q", + "3I6R", + "3I6S", + "3I6T", + "3I6U", + "3I6V", + "3I6W", + "3I6X", + "3I7A", + "3I7B", + "3I7C", + "3I7D", + "3I7E", + "3I7F", + "3I7G", + "3I7H", + "3I7Q", + "3I7R", + "3I7S", + "3I7T", + "3I7U", + "3I7V", + "3I7W", + "3I7X", + "3I8A", + "3I8B", + "3I8C", + "3I8D", + "3I8E", + "3I8F", + "3I8G", + "3I8H", + "3I8I", + "3I8J", + "3I8K", + "3I8L", + "3I8M", + "3I8N", + "3I8O", + "3I8P", + "3I8Q", + "3I8R", + "3I8S", + "3I8T", + "3I8U", + "3I8V", + "3I8W", + "3I8X", + "3I9", + "3I9A", + "3I9B", + "3I9C", + "3I9D", + "3I9E", + "3I9F", + "3I9S", + "3I9T", + "3I9U", + "3I9V", + "3I9W", + "3I9X", + "3J", + "3J0", + "3J2A", + "3J2B", + "3J2C", + "3J2D", + "3J2E", + "3J2F", + "3J2G", + "3J2H", + "3J2I", + "3J2J", + "3J2K", + "3J2L", + "3J2M", + "3J2N", + "3J2O", + "3J2P", + "3J3G", + "3J3H", + "3J3I", + "3J3J", + "3J3K", + "3J3L", + "3J6Q", + "3J6R", + "3J6S", + "3J6T", + "3J6U", + "3J6V", + "3J6W", + "3J6X", + "3J7A", + "3J7B", + "3J7C", + "3J7D", + "3J7E", + "3J7F", + "3J7G", + "3J7H", + "3J7Q", + "3J7R", + "3J7S", + "3J7T", + "3J7U", + "3J7V", + "3J7W", + "3J7X", + "3J8A", + "3J8B", + "3J8C", + "3J8D", + "3J8E", + "3J8F", + "3J8G", + "3J8H", + "3J8I", + "3J8J", + "3J8K", + "3J8L", + "3J8M", + "3J8N", + "3J8O", + "3J8P", + "3J8Q", + "3J8R", + "3J8S", + "3J8T", + "3J8U", + "3J8V", + "3J8W", + "3J8X", + "3J9", + "3J9A", + "3J9B", + "3J9C", + "3J9D", + "3J9E", + "3J9F", + "3J9S", + "3J9T", + "3J9U", + "3J9V", + "3J9W", + "3J9X", + "3K", + "3K0", + "3K2A", + "3K2B", + "3K2C", + "3K2D", + "3K2E", + "3K2F", + "3K2G", + "3K2H", + "3K2I", + "3K2J", + "3K2K", + "3K2L", + "3K2M", + "3K2N", + "3K2O", + "3K2P", + "3K3G", + "3K3H", + "3K3I", + "3K3J", + "3K3K", + "3K3L", + "3K6Q", + "3K6R", + "3K6S", + "3K6T", + "3K6U", + "3K6V", + "3K6W", + "3K6X", + "3K7A", + "3K7B", + "3K7C", + "3K7D", + "3K7E", + "3K7F", + "3K7G", + "3K7H", + "3K7Q", + "3K7R", + "3K7S", + "3K7T", + "3K7U", + "3K7V", + "3K7W", + "3K7X", + "3K8A", + "3K8B", + "3K8C", + "3K8D", + "3K8E", + "3K8F", + "3K8G", + "3K8H", + "3K8I", + "3K8J", + "3K8K", + "3K8L", + "3K8M", + "3K8N", + "3K8O", + "3K8P", + "3K8Q", + "3K8R", + "3K8S", + "3K8T", + "3K8U", + "3K8V", + "3K8W", + "3K8X", + "3K9", + "3K9A", + "3K9B", + "3K9C", + "3K9D", + "3K9E", + "3K9F", + "3K9S", + "3K9T", + "3K9U", + "3K9V", + "3K9W", + "3K9X", + "3L", + "3L0", + "3L2A", + "3L2B", + "3L2C", + "3L2D", + "3L2E", + "3L2F", + "3L2G", + "3L2H", + "3L2I", + "3L2J", + "3L2K", + "3L2L", + "3L2M", + "3L2N", + "3L2O", + "3L2P", + "3L3G", + "3L3H", + "3L3I", + "3L3J", + "3L3K", + "3L3L", + "3L6Q", + "3L6R", + "3L6S", + "3L6T", + "3L6U", + "3L6V", + "3L6W", + "3L6X", + "3L7A", + "3L7B", + "3L7C", + "3L7D", + "3L7E", + "3L7F", + "3L7G", + "3L7H", + "3L7Q", + "3L7R", + "3L7S", + "3L7T", + "3L7U", + "3L7V", + "3L7W", + "3L7X", + "3L8A", + "3L8B", + "3L8C", + "3L8D", + "3L8E", + "3L8F", + "3L8G", + "3L8H", + "3L8I", + "3L8J", + "3L8K", + "3L8L", + "3L8M", + "3L8N", + "3L8O", + "3L8P", + "3L8Q", + "3L8R", + "3L8S", + "3L8T", + "3L8U", + "3L8V", + "3L8W", + "3L8X", + "3L9", + "3L9A", + "3L9B", + "3L9C", + "3L9D", + "3L9E", + "3L9F", + "3L9S", + "3L9T", + "3L9U", + "3L9V", + "3L9W", + "3L9X", + "3M", + "3M0", + "3M2A", + "3M2B", + "3M2C", + "3M2D", + "3M2E", + "3M2F", + "3M2G", + "3M2H", + "3M2I", + "3M2J", + "3M2K", + "3M2L", + "3M2M", + "3M2N", + "3M2O", + "3M2P", + "3M3G", + "3M3H", + "3M3I", + "3M3J", + "3M3K", + "3M3L", + "3M6Q", + "3M6R", + "3M6S", + "3M6T", + "3M6U", + "3M6V", + "3M6W", + "3M6X", + "3M7A", + "3M7B", + "3M7C", + "3M7D", + "3M7E", + "3M7F", + "3M7G", + "3M7H", + "3M7Q", + "3M7R", + "3M7S", + "3M7T", + "3M7U", + "3M7V", + "3M7W", + "3M7X", + "3M8A", + "3M8B", + "3M8C", + "3M8D", + "3M8E", + "3M8F", + "3M8G", + "3M8H", + "3M8I", + "3M8J", + "3M8K", + "3M8L", + "3M8M", + "3M8N", + "3M8O", + "3M8P", + "3M8Q", + "3M8R", + "3M8S", + "3M8T", + "3M8U", + "3M8V", + "3M8W", + "3M8X", + "3M9", + "3M9A", + "3M9B", + "3M9C", + "3M9D", + "3M9E", + "3M9F", + "3M9S", + "3M9T", + "3M9U", + "3M9V", + "3M9W", + "3M9X", + "3N", + "3N0", + "3N2A", + "3N2B", + "3N2C", + "3N2D", + "3N2E", + "3N2F", + "3N2G", + "3N2H", + "3N2I", + "3N2J", + "3N2K", + "3N2L", + "3N2M", + "3N2N", + "3N2O", + "3N2P", + "3N3G", + "3N3H", + "3N3I", + "3N3J", + "3N3K", + "3N3L", + "3N6Q", + "3N6R", + "3N6S", + "3N6T", + "3N6U", + "3N6V", + "3N6W", + "3N6X", + "3N7A", + "3N7B", + "3N7C", + "3N7D", + "3N7E", + "3N7F", + "3N7G", + "3N7H", + "3N7Q", + "3N7R", + "3N7S", + "3N7T", + "3N7U", + "3N7V", + "3N7W", + "3N7X", + "3N8A", + "3N8B", + "3N8C", + "3N8D", + "3N8E", + "3N8F", + "3N8G", + "3N8H", + "3N8I", + "3N8J", + "3N8K", + "3N8L", + "3N8M", + "3N8N", + "3N8O", + "3N8P", + "3N8Q", + "3N8R", + "3N8S", + "3N8T", + "3N8U", + "3N8V", + "3N8W", + "3N8X", + "3N9", + "3N9A", + "3N9B", + "3N9C", + "3N9D", + "3N9E", + "3N9F", + "3N9S", + "3N9T", + "3N9U", + "3N9V", + "3N9W", + "3N9X", + "3O", + "3O0", + "3O2A", + "3O2B", + "3O2C", + "3O2D", + "3O2E", + "3O2F", + "3O2G", + "3O2H", + "3O2I", + "3O2J", + "3O2K", + "3O2L", + "3O2M", + "3O2N", + "3O2O", + "3O2P", + "3O3G", + "3O3H", + "3O3I", + "3O3J", + "3O3K", + "3O3L", + "3O6Q", + "3O6R", + "3O6S", + "3O6T", + "3O6U", + "3O6V", + "3O6W", + "3O6X", + "3O7A", + "3O7B", + "3O7C", + "3O7D", + "3O7E", + "3O7F", + "3O7G", + "3O7H", + "3O7Q", + "3O7R", + "3O7S", + "3O7T", + "3O7U", + "3O7V", + "3O7W", + "3O7X", + "3O8A", + "3O8B", + "3O8C", + "3O8D", + "3O8E", + "3O8F", + "3O8G", + "3O8H", + "3O8I", + "3O8J", + "3O8K", + "3O8L", + "3O8M", + "3O8N", + "3O8O", + "3O8P", + "3O8Q", + "3O8R", + "3O8S", + "3O8T", + "3O8U", + "3O8V", + "3O8W", + "3O8X", + "3O9", + "3O9A", + "3O9B", + "3O9C", + "3O9D", + "3O9E", + "3O9F", + "3O9S", + "3O9T", + "3O9U", + "3O9V", + "3O9W", + "3O9X", + "3P", + "3P0", + "3P2A", + "3P2B", + "3P2C", + "3P2D", + "3P2E", + "3P2F", + "3P2G", + "3P2H", + "3P2I", + "3P2J", + "3P2K", + "3P2L", + "3P2M", + "3P2N", + "3P2O", + "3P2P", + "3P3G", + "3P3H", + "3P3I", + "3P3J", + "3P3K", + "3P3L", + "3P6Q", + "3P6R", + "3P6S", + "3P6T", + "3P6U", + "3P6V", + "3P6W", + "3P6X", + "3P7A", + "3P7B", + "3P7C", + "3P7D", + "3P7E", + "3P7F", + "3P7G", + "3P7H", + "3P7Q", + "3P7R", + "3P7S", + "3P7T", + "3P7U", + "3P7V", + "3P7W", + "3P7X", + "3P8A", + "3P8B", + "3P8C", + "3P8D", + "3P8E", + "3P8F", + "3P8G", + "3P8H", + "3P8I", + "3P8J", + "3P8K", + "3P8L", + "3P8M", + "3P8N", + "3P8O", + "3P8P", + "3P8Q", + "3P8R", + "3P8S", + "3P8T", + "3P8U", + "3P8V", + "3P8W", + "3P8X", + "3P9", + "3P9A", + "3P9B", + "3P9C", + "3P9D", + "3P9E", + "3P9F", + "3P9S", + "3P9T", + "3P9U", + "3P9V", + "3P9W", + "3P9X", + "3Q", + "3Q0", + "3Q2A", + "3Q2B", + "3Q2C", + "3Q2D", + "3Q2E", + "3Q2F", + "3Q2G", + "3Q2H", + "3Q2I", + "3Q2J", + "3Q2K", + "3Q2L", + "3Q2M", + "3Q2N", + "3Q2O", + "3Q2P", + "3Q3G", + "3Q3H", + "3Q3I", + "3Q3J", + "3Q3K", + "3Q3L", + "3Q6Q", + "3Q6R", + "3Q6S", + "3Q6T", + "3Q6U", + "3Q6V", + "3Q6W", + "3Q6X", + "3Q7A", + "3Q7B", + "3Q7C", + "3Q7D", + "3Q7E", + "3Q7F", + "3Q7G", + "3Q7H", + "3Q7Q", + "3Q7R", + "3Q7S", + "3Q7T", + "3Q7U", + "3Q7V", + "3Q7W", + "3Q7X", + "3Q8A", + "3Q8B", + "3Q8C", + "3Q8D", + "3Q8E", + "3Q8F", + "3Q8G", + "3Q8H", + "3Q8I", + "3Q8J", + "3Q8K", + "3Q8L", + "3Q8M", + "3Q8N", + "3Q8O", + "3Q8P", + "3Q8Q", + "3Q8R", + "3Q8S", + "3Q8T", + "3Q8U", + "3Q8V", + "3Q8W", + "3Q8X", + "3Q9", + "3Q9A", + "3Q9B", + "3Q9C", + "3Q9D", + "3Q9E", + "3Q9F", + "3Q9S", + "3Q9T", + "3Q9U", + "3Q9V", + "3Q9W", + "3Q9X", + "3R", + "3R0", + "3R2A", + "3R2B", + "3R2C", + "3R2D", + "3R2E", + "3R2F", + "3R2G", + "3R2H", + "3R2I", + "3R2J", + "3R2K", + "3R2L", + "3R2M", + "3R2N", + "3R2O", + "3R2P", + "3R3G", + "3R3H", + "3R3I", + "3R3J", + "3R3K", + "3R3L", + "3R6Q", + "3R6R", + "3R6S", + "3R6T", + "3R6U", + "3R6V", + "3R6W", + "3R6X", + "3R7A", + "3R7B", + "3R7C", + "3R7D", + "3R7E", + "3R7F", + "3R7G", + "3R7H", + "3R7Q", + "3R7R", + "3R7S", + "3R7T", + "3R7U", + "3R7V", + "3R7W", + "3R7X", + "3R8A", + "3R8B", + "3R8C", + "3R8D", + "3R8E", + "3R8F", + "3R8G", + "3R8H", + "3R8I", + "3R8J", + "3R8K", + "3R8L", + "3R8M", + "3R8N", + "3R8O", + "3R8P", + "3R8Q", + "3R8R", + "3R8S", + "3R8T", + "3R8U", + "3R8V", + "3R8W", + "3R8X", + "3R9", + "3R9A", + "3R9B", + "3R9C", + "3R9D", + "3R9E", + "3R9F", + "3R9S", + "3R9T", + "3R9U", + "3R9V", + "3R9W", + "3R9X", + "3S", + "3S0", + "3S2A", + "3S2B", + "3S2C", + "3S2D", + "3S2E", + "3S2F", + "3S2G", + "3S2H", + "3S2I", + "3S2J", + "3S2K", + "3S2L", + "3S2M", + "3S2N", + "3S2O", + "3S2P", + "3S3G", + "3S3H", + "3S3I", + "3S3J", + "3S3K", + "3S3L", + "3S6Q", + "3S6R", + "3S6S", + "3S6T", + "3S6U", + "3S6V", + "3S6W", + "3S6X", + "3S7A", + "3S7B", + "3S7C", + "3S7D", + "3S7E", + "3S7F", + "3S7G", + "3S7H", + "3S7Q", + "3S7R", + "3S7S", + "3S7T", + "3S7U", + "3S7V", + "3S7W", + "3S7X", + "3S8A", + "3S8B", + "3S8C", + "3S8D", + "3S8E", + "3S8F", + "3S8G", + "3S8H", + "3S8I", + "3S8J", + "3S8K", + "3S8L", + "3S8M", + "3S8N", + "3S8O", + "3S8P", + "3S8Q", + "3S8R", + "3S8S", + "3S8T", + "3S8U", + "3S8V", + "3S8W", + "3S8X", + "3S9", + "3S9A", + "3S9B", + "3S9C", + "3S9D", + "3S9E", + "3S9F", + "3S9S", + "3S9T", + "3S9U", + "3S9V", + "3S9W", + "3S9X", + "3T", + "3T0", + "3T2A", + "3T2B", + "3T2C", + "3T2D", + "3T2E", + "3T2F", + "3T2G", + "3T2H", + "3T2I", + "3T2J", + "3T2K", + "3T2L", + "3T2M", + "3T2N", + "3T2O", + "3T2P", + "3T3G", + "3T3H", + "3T3I", + "3T3J", + "3T3K", + "3T3L", + "3T6Q", + "3T6R", + "3T6S", + "3T6T", + "3T6U", + "3T6V", + "3T6W", + "3T6X", + "3T7A", + "3T7B", + "3T7C", + "3T7D", + "3T7E", + "3T7F", + "3T7G", + "3T7H", + "3T7Q", + "3T7R", + "3T7S", + "3T7T", + "3T7U", + "3T7V", + "3T7W", + "3T7X", + "3T8A", + "3T8B", + "3T8C", + "3T8D", + "3T8E", + "3T8F", + "3T8G", + "3T8H", + "3T8I", + "3T8J", + "3T8K", + "3T8L", + "3T8M", + "3T8N", + "3T8O", + "3T8P", + "3T8Q", + "3T8R", + "3T8S", + "3T8T", + "3T8U", + "3T8V", + "3T8W", + "3T8X", + "3T9", + "3T9A", + "3T9B", + "3T9C", + "3T9D", + "3T9E", + "3T9F", + "3T9S", + "3T9T", + "3T9U", + "3T9V", + "3T9W", + "3T9X", + "3U", + "3U0", + "3U2A", + "3U2B", + "3U2C", + "3U2D", + "3U2E", + "3U2F", + "3U2G", + "3U2H", + "3U2I", + "3U2J", + "3U2K", + "3U2L", + "3U2M", + "3U2N", + "3U2O", + "3U2P", + "3U3G", + "3U3H", + "3U3I", + "3U3J", + "3U3K", + "3U3L", + "3U6Q", + "3U6R", + "3U6S", + "3U6T", + "3U6U", + "3U6V", + "3U6W", + "3U6X", + "3U7A", + "3U7B", + "3U7C", + "3U7D", + "3U7E", + "3U7F", + "3U7G", + "3U7H", + "3U7Q", + "3U7R", + "3U7S", + "3U7T", + "3U7U", + "3U7V", + "3U7W", + "3U7X", + "3U8A", + "3U8B", + "3U8C", + "3U8D", + "3U8E", + "3U8F", + "3U8G", + "3U8H", + "3U8I", + "3U8J", + "3U8K", + "3U8L", + "3U8M", + "3U8N", + "3U8O", + "3U8P", + "3U8Q", + "3U8R", + "3U8S", + "3U8T", + "3U8U", + "3U8V", + "3U8W", + "3U8X", + "3U9", + "3U9A", + "3U9B", + "3U9C", + "3U9D", + "3U9E", + "3U9F", + "3U9S", + "3U9T", + "3U9U", + "3U9V", + "3U9W", + "3U9X", + "=7K1OUO/BY4AOH", + "=AA1IZ/BY1DX", + "=AA2WN/BA4DW", + "=AJ3M/BY1RX", + "B0", + "B1", + "B2", + "B2A", + "B2B", + "B2C", + "B2D", + "B2E", + "B2F", + "B2G", + "B2H", + "B2I", + "B2J", + "B2K", + "B2L", + "B2M", + "B2N", + "B2O", + "B2P", + "B3", + "B3G", + "B3H", + "B3I", + "B3J", + "B3K", + "B3L", + "B4", + "B5", + "B6", + "B6Q", + "B6R", + "B6S", + "B6T", + "B6U", + "B6V", + "B6W", + "B6X", + "B7", + "B7A", + "B7B", + "B7C", + "B7D", + "B7E", + "B7F", + "B7G", + "B7H", + "B7Q", + "B7R", + "B7S", + "B7T", + "B7U", + "B7V", + "B7W", + "B7X", + "B8", + "B8A", + "B8B", + "B8C", + "B8D", + "B8E", + "B8F", + "B8G", + "B8H", + "B8I", + "B8J", + "B8K", + "B8L", + "B8M", + "B8N", + "B8O", + "B8P", + "B8Q", + "B8R", + "B8S", + "B8T", + "B8U", + "B8V", + "B8W", + "B8X", + "B9", + "=B9/BH1NGG", + "=B90IARU", + "B9A", + "B9B", + "B9C", + "B9D", + "B9E", + "B9F", + "B9S", + "B9T", + "B9U", + "B9V", + "B9W", + "B9X", + "BA", + "BA0", + "=BA0AA/8", + "BA2A", + "BA2B", + "BA2C", + "BA2D", + "BA2E", + "BA2F", + "BA2G", + "BA2H", + "BA2I", + "BA2J", + "BA2K", + "BA2L", + "BA2M", + "BA2N", + "BA2O", + "BA2P", + "BA3G", + "BA3H", + "BA3I", + "BA3J", + "BA3K", + "BA3L", + "=BA4DC/0", + "=BA4DT/0", + "=BA4RF/0", + "BA6Q", + "BA6R", + "BA6S", + "BA6T", + "BA6U", + "BA6V", + "BA6W", + "BA6X", + "BA7A", + "BA7B", + "BA7C", + "BA7D", + "BA7E", + "BA7F", + "BA7G", + "BA7H", + "=BA7IO/0", + "=BA7JS/0", + "=BA7JS/9", + "BA7Q", + "BA7R", + "BA7S", + "BA7T", + "BA7U", + "BA7V", + "BA7W", + "BA7X", + "BA8A", + "BA8B", + "BA8C", + "BA8D", + "BA8E", + "BA8F", + "BA8G", + "BA8H", + "BA8I", + "BA8J", + "BA8K", + "BA8L", + "BA8M", + "BA8N", + "BA8O", + "BA8P", + "BA8Q", + "BA8R", + "BA8S", + "BA8T", + "BA8U", + "BA8V", + "BA8W", + "BA8X", + "BA9", + "BA9A", + "BA9B", + "BA9C", + "BA9D", + "BA9E", + "BA9F", + "BA9S", + "BA9T", + "BA9U", + "BA9V", + "BA9W", + "BA9X", + "BD", + "BD0", + "=BD1PTA/0", + "BD2A", + "BD2B", + "BD2C", + "BD2D", + "BD2E", + "BD2F", + "BD2G", + "BD2H", + "BD2I", + "BD2J", + "BD2K", + "BD2L", + "BD2M", + "BD2N", + "BD2O", + "BD2P", + "BD3G", + "BD3H", + "BD3I", + "BD3J", + "BD3K", + "BD3L", + "=BD4HF/9", + "=BD5HSV/9", + "=BD5QDM/9", + "=BD6KF/0", + "BD6Q", + "BD6R", + "BD6S", + "BD6T", + "BD6U", + "BD6V", + "BD6W", + "BD6X", + "BD7A", + "BD7B", + "BD7C", + "BD7D", + "BD7E", + "BD7F", + "BD7G", + "BD7H", + "=BD7IEE/0", + "=BD7JZC/UT3GF", + "=BD7LPD/UT3GF", + "=BD7MQ/9", + "BD7Q", + "BD7R", + "BD7S", + "BD7T", + "BD7U", + "BD7V", + "BD7W", + "BD7X", + "BD8A", + "BD8B", + "BD8C", + "BD8D", + "BD8E", + "BD8F", + "BD8G", + "BD8H", + "BD8I", + "BD8J", + "BD8K", + "BD8L", + "BD8M", + "BD8N", + "BD8O", + "BD8P", + "BD8Q", + "BD8R", + "BD8S", + "BD8T", + "BD8U", + "BD8V", + "BD8W", + "BD8X", + "BD9", + "BD9A", + "BD9B", + "=BD9BI/0", + "BD9C", + "BD9D", + "BD9E", + "BD9F", + "BD9S", + "BD9T", + "BD9U", + "BD9V", + "BD9W", + "BD9X", + "BG", + "BG0", + "=BG0GE/9", + "=BG1KIY/0", + "=BG1LLB/0", + "=BG1PIP/0", + "BG2A", + "BG2B", + "BG2C", + "BG2D", + "BG2E", + "BG2F", + "BG2G", + "BG2H", + "BG2I", + "BG2J", + "BG2K", + "BG2L", + "BG2M", + "BG2N", + "BG2O", + "BG2P", + "BG3G", + "BG3H", + "BG3I", + "BG3J", + "BG3K", + "BG3L", + "=BG4WUA/0", + "=BG6IFR/9", + "BG6Q", + "BG6R", + "BG6S", + "BG6T", + "BG6U", + "BG6V", + "BG6W", + "BG6X", + "BG7A", + "BG7B", + "BG7C", + "BG7D", + "BG7E", + "BG7F", + "BG7G", + "BG7H", + "=BG7JJW/UT3GF", + "BG7Q", + "BG7R", + "BG7S", + "BG7T", + "BG7U", + "BG7V", + "BG7W", + "BG7X", + "BG8A", + "BG8B", + "BG8C", + "BG8D", + "BG8E", + "BG8F", + "=BG8FUL/0", + "BG8G", + "BG8H", + "BG8I", + "BG8J", + "BG8K", + "BG8L", + "BG8M", + "BG8N", + "BG8O", + "BG8P", + "BG8Q", + "BG8R", + "BG8S", + "BG8T", + "BG8U", + "BG8V", + "BG8W", + "BG8X", + "BG9", + "BG9A", + "BG9B", + "BG9C", + "BG9D", + "BG9E", + "BG9F", + "BG9S", + "BG9T", + "BG9U", + "BG9V", + "BG9W", + "BG9X", + "=BG9XD/1", + "=BG9XD/4", + "=BG9XD/5", + "=BG9XD/7", + "BH", + "BH0", + "BH2A", + "BH2B", + "BH2C", + "BH2D", + "BH2E", + "BH2F", + "BH2G", + "BH2H", + "BH2I", + "BH2J", + "BH2K", + "BH2L", + "BH2M", + "BH2N", + "BH2O", + "BH2P", + "BH3G", + "BH3H", + "BH3I", + "BH3J", + "BH3K", + "BH3L", + "=BH4CXY/9", + "BH6Q", + "BH6R", + "BH6S", + "BH6T", + "BH6U", + "BH6V", + "BH6W", + "BH6X", + "BH7A", + "BH7B", + "BH7C", + "BH7D", + "BH7E", + "BH7F", + "BH7G", + "BH7H", + "BH7Q", + "BH7R", + "BH7S", + "BH7T", + "BH7U", + "BH7V", + "BH7W", + "BH7X", + "BH8A", + "BH8B", + "BH8C", + "BH8D", + "BH8E", + "BH8F", + "BH8G", + "BH8H", + "BH8I", + "BH8J", + "BH8K", + "BH8L", + "BH8M", + "BH8N", + "BH8O", + "BH8P", + "BH8Q", + "BH8R", + "BH8S", + "BH8T", + "BH8U", + "BH8V", + "BH8W", + "BH8X", + "BH9", + "BH9A", + "BH9B", + "BH9C", + "BH9D", + "BH9E", + "BH9F", + "BH9S", + "BH9T", + "BH9U", + "BH9V", + "BH9W", + "BH9X", + "BI", + "BI0", + "BI2A", + "BI2B", + "BI2C", + "BI2D", + "BI2E", + "BI2F", + "BI2G", + "BI2H", + "BI2I", + "BI2J", + "BI2K", + "BI2L", + "BI2M", + "BI2N", + "BI2O", + "BI2P", + "BI3G", + "BI3H", + "BI3I", + "BI3J", + "BI3K", + "BI3L", + "BI6Q", + "BI6R", + "BI6S", + "BI6T", + "BI6U", + "BI6V", + "BI6W", + "BI6X", + "BI7A", + "BI7B", + "BI7C", + "BI7D", + "BI7E", + "BI7F", + "BI7G", + "BI7H", + "BI7Q", + "BI7R", + "BI7S", + "BI7T", + "BI7U", + "BI7V", + "BI7W", + "BI7X", + "BI8A", + "BI8B", + "BI8C", + "BI8D", + "BI8E", + "BI8F", + "BI8G", + "BI8H", + "BI8I", + "BI8J", + "BI8K", + "BI8L", + "BI8M", + "BI8N", + "BI8O", + "BI8P", + "BI8Q", + "BI8R", + "BI8S", + "BI8T", + "BI8U", + "BI8V", + "BI8W", + "BI8X", + "BI9", + "BI9A", + "BI9B", + "BI9C", + "BI9D", + "BI9E", + "BI9F", + "BI9S", + "BI9T", + "BI9U", + "BI9V", + "BI9W", + "BI9X", + "BJ", + "BJ0", + "BJ2A", + "BJ2B", + "BJ2C", + "BJ2D", + "BJ2E", + "BJ2F", + "BJ2G", + "BJ2H", + "BJ2I", + "BJ2J", + "BJ2K", + "BJ2L", + "BJ2M", + "BJ2N", + "BJ2O", + "BJ2P", + "BJ3G", + "BJ3H", + "BJ3I", + "BJ3J", + "BJ3K", + "BJ3L", + "BJ6Q", + "BJ6R", + "BJ6S", + "BJ6T", + "BJ6U", + "BJ6V", + "BJ6W", + "BJ6X", + "BJ7A", + "BJ7B", + "BJ7C", + "BJ7D", + "BJ7E", + "BJ7F", + "BJ7G", + "BJ7H", + "BJ7Q", + "BJ7R", + "BJ7S", + "BJ7T", + "BJ7U", + "BJ7V", + "BJ7W", + "BJ7X", + "BJ8A", + "BJ8B", + "BJ8C", + "BJ8D", + "BJ8E", + "BJ8F", + "BJ8G", + "BJ8H", + "BJ8I", + "BJ8J", + "BJ8K", + "BJ8L", + "BJ8M", + "BJ8N", + "BJ8O", + "BJ8P", + "BJ8Q", + "BJ8R", + "BJ8S", + "BJ8T", + "BJ8U", + "BJ8V", + "BJ8W", + "BJ8X", + "BJ9", + "BJ9A", + "BJ9B", + "BJ9C", + "BJ9D", + "BJ9E", + "BJ9F", + "BJ9S", + "BJ9T", + "BJ9U", + "BJ9V", + "BJ9W", + "BJ9X", + "BL", + "BL0", + "BL2A", + "BL2B", + "BL2C", + "BL2D", + "BL2E", + "BL2F", + "BL2G", + "BL2H", + "BL2I", + "BL2J", + "BL2K", + "BL2L", + "BL2M", + "BL2N", + "BL2O", + "BL2P", + "BL3G", + "BL3H", + "BL3I", + "BL3J", + "BL3K", + "BL3L", + "BL6Q", + "BL6R", + "BL6S", + "BL6T", + "BL6U", + "BL6V", + "BL6W", + "BL6X", + "BL7A", + "BL7B", + "BL7C", + "BL7D", + "BL7E", + "BL7F", + "BL7G", + "BL7H", + "BL7Q", + "BL7R", + "BL7S", + "BL7T", + "BL7U", + "BL7V", + "BL7W", + "BL7X", + "BL8A", + "BL8B", + "BL8C", + "BL8D", + "BL8E", + "BL8F", + "BL8G", + "BL8H", + "BL8I", + "BL8J", + "BL8K", + "BL8L", + "BL8M", + "BL8N", + "BL8O", + "BL8P", + "BL8Q", + "BL8R", + "BL8S", + "BL8T", + "BL8U", + "BL8V", + "BL8W", + "BL8X", + "BL9", + "BL9A", + "BL9B", + "BL9C", + "BL9D", + "BL9E", + "BL9F", + "BL9S", + "BL9T", + "BL9U", + "BL9V", + "BL9W", + "BL9X", + "BT", + "BT0", + "=BT1OY/YL", + "BT2A", + "BT2B", + "BT2C", + "BT2D", + "BT2E", + "BT2F", + "BT2G", + "BT2H", + "BT2I", + "BT2J", + "BT2K", + "BT2L", + "BT2M", + "BT2N", + "BT2O", + "BT2P", + "BT3G", + "BT3H", + "BT3I", + "BT3J", + "BT3K", + "BT3L", + "BT6Q", + "BT6R", + "BT6S", + "BT6T", + "BT6U", + "BT6V", + "BT6W", + "BT6X", + "BT7A", + "BT7B", + "BT7C", + "BT7D", + "BT7E", + "BT7F", + "BT7G", + "BT7H", + "BT7Q", + "BT7R", + "BT7S", + "BT7T", + "BT7U", + "BT7V", + "BT7W", + "BT7X", + "BT8A", + "BT8B", + "BT8C", + "BT8D", + "BT8E", + "BT8F", + "BT8G", + "BT8H", + "BT8I", + "BT8J", + "BT8K", + "BT8L", + "BT8M", + "BT8N", + "BT8O", + "BT8P", + "BT8Q", + "BT8R", + "BT8S", + "BT8T", + "BT8U", + "BT8V", + "BT8W", + "BT8X", + "BT9", + "BT9A", + "BT9B", + "BT9C", + "BT9D", + "BT9E", + "BT9F", + "BT9S", + "BT9T", + "BT9U", + "BT9V", + "BT9W", + "BT9X", + "BY", + "BY0", + "=BY1BJ/1DX", + "=BY1PK/I1ZB", + "=BY1TTY/OD5LN", + "=BY1WXD/0", + "BY2A", + "BY2B", + "BY2C", + "BY2D", + "BY2E", + "BY2F", + "BY2G", + "BY2H", + "BY2I", + "BY2J", + "BY2K", + "BY2L", + "BY2M", + "BY2N", + "BY2O", + "BY2P", + "BY3G", + "BY3H", + "BY3I", + "BY3J", + "BY3K", + "BY3L", + "=BY4DX/W9HQ", + "BY6Q", + "BY6R", + "BY6S", + "BY6T", + "BY6U", + "BY6V", + "BY6W", + "BY6X", + "BY7A", + "BY7B", + "BY7C", + "BY7D", + "BY7E", + "BY7F", + "BY7G", + "BY7H", + "BY7Q", + "BY7R", + "BY7S", + "=BY7STC/F4CYZ", + "BY7T", + "BY7U", + "BY7V", + "BY7W", + "BY7X", + "BY8A", + "BY8B", + "BY8C", + "BY8D", + "BY8E", + "BY8F", + "BY8G", + "BY8H", + "BY8I", + "BY8J", + "BY8K", + "BY8L", + "BY8M", + "BY8N", + "BY8O", + "BY8P", + "BY8Q", + "BY8R", + "BY8S", + "BY8T", + "BY8U", + "BY8V", + "BY8W", + "BY8X", + "BY9", + "BY9A", + "BY9B", + "BY9C", + "BY9D", + "BY9E", + "BY9F", + "BY9S", + "BY9T", + "BY9U", + "BY9V", + "BY9W", + "BY9X", + "BZ", + "BZ0", + "BZ2A", + "BZ2B", + "BZ2C", + "BZ2D", + "BZ2E", + "BZ2F", + "BZ2G", + "BZ2H", + "BZ2I", + "BZ2J", + "BZ2K", + "BZ2L", + "BZ2M", + "BZ2N", + "BZ2O", + "BZ2P", + "BZ3G", + "BZ3H", + "BZ3I", + "BZ3J", + "BZ3K", + "BZ3L", + "BZ6Q", + "BZ6R", + "BZ6S", + "BZ6T", + "BZ6U", + "BZ6V", + "BZ6W", + "BZ6X", + "BZ7A", + "BZ7B", + "BZ7C", + "BZ7D", + "BZ7E", + "BZ7F", + "BZ7G", + "BZ7H", + "BZ7Q", + "BZ7R", + "BZ7S", + "BZ7T", + "BZ7U", + "BZ7V", + "BZ7W", + "BZ7X", + "BZ8A", + "BZ8B", + "BZ8C", + "BZ8D", + "BZ8E", + "BZ8F", + "BZ8G", + "BZ8H", + "BZ8I", + "BZ8J", + "BZ8K", + "BZ8L", + "BZ8M", + "BZ8N", + "BZ8O", + "BZ8P", + "BZ8Q", + "BZ8R", + "BZ8S", + "BZ8T", + "BZ8U", + "BZ8V", + "BZ8W", + "BZ8X", + "BZ9", + "BZ9A", + "BZ9B", + "BZ9C", + "BZ9D", + "BZ9E", + "BZ9F", + "BZ9S", + "BZ9T", + "BZ9U", + "BZ9V", + "BZ9W", + "BZ9X", + "=DF4ZK/BY4AA", + "=DF4ZK/BY4BZB", + "=DJ7BU/BY4BZB", + "=DL2JRM/BY4RRR", + "=DL2JRM/BY8SKM", + "=DL3NM/BY7KG", + "=DL3OCH/BY4RRR", + "=DL5MC/BY1PK", + "=F4BKV/BY7PP", + "=F5JSD/BY4AA", + "=F5NVF/BY4AA", + "=F5RAV/BY1RX", + "=F6AJA/BY4RJZ", + "=F6HMJ/BY1TX", + "=G0SFJ/BY7KP", + "=G4DFN/BY1PK", + "=HZ1MD/BY4AOH", + "=JA0AZ/BY4AEE", + "=JA0AZ/BY4SZ", + "=JA1UQA/BY4AOH", + "=JE1PYH/BY4AOH", + "=JE2FUP/BY4AOH", + "=JE2LPC/BY4AOH", + "=JH1TEB/BY4AOH", + "=JH3TXR/BY4AOH", + "=JH7DFZ/BY4AOH", + "=JJ1LRD/BY4AOH", + "=JL1KBS/BY4HAM", + "=JP1STX/BY4HAM", + "=JT1BV/BY1DX", + "=JT1BV/BY1RX", + "=K0MD/BY1TX", + "=K5SF/BY1RX", + "=K8ZCT/BA5AN", + "=KA8PVS/BY4BBS", + "=KD3TB/BY4BZB", + "=KK7PW/BA4DW", + "=KO4RR/BY1PK", + "=KT8X/BY4BNS", + "=KU1CW/BY1RX", + "=KU1CW/BY4AE", + "=KU1CW/BY4DX", + "=LZ2HM/BY1RX", + "=LZ2HM/BY7PP", + "=N4OE/BY1TTY", + "=N4WV/BY1PK", + "=OD5LN/BA1RB", + "=OD5LN/BY1RX", + "=OD5LN/BY1TTY", + "=OH2MA/BY1DX", + "=OK7MT/BY5HB", + "=OM3UU/BY1CJL", + "=ON5TN/BY8AC", + "=PG5M/BA4RF", + "=UA9HW/BY6IA", + "=UA9OW/BY2HIT", + "=UW1GZ/BA1RB", + "=VE3FU/BY1TTY", + "=VE3LBQ/BY4AOH", + "=VE7AF/BY4AOH", + "=VE7AF/BY7KH", + "=VE7KC/BA4DW", + "=VK5GG/BA8MM", + "=VO1AU/BY1DX", + "=VO1AU/BY1RX", + "=VO1AU/BY1TTY", + "=VR2SS/BY4AOH", + "=W0NB/BY1PK", + "=W0NB/BY4AA", + "=W1DF/BA7MY", + "=W1DF/BA7NO", + "=W4IM/BY1PK", + "=W5FKX/BY1RX", + "=W6BBA/BD7PUZ", + "=W6BBA/BY7KTO", + "=W8NF/BY4AOH", + "=W8NF/BY4CYL", + "=WX8C/BY4AA", + "XS", + "XS0", + "XS2A", + "XS2B", + "XS2C", + "XS2D", + "XS2E", + "XS2F", + "XS2G", + "XS2H", + "XS2I", + "XS2J", + "XS2K", + "XS2L", + "XS2M", + "XS2N", + "XS2O", + "XS2P", + "XS3G", + "XS3H", + "XS3I", + "XS3J", + "XS3K", + "XS3L", + "XS6Q", + "XS6R", + "XS6S", + "XS6T", + "XS6U", + "XS6V", + "XS6W", + "XS6X", + "XS7A", + "XS7B", + "XS7C", + "XS7D", + "XS7E", + "XS7F", + "XS7G", + "XS7H", + "XS7Q", + "XS7R", + "XS7S", + "XS7T", + "XS7U", + "XS7V", + "XS7W", + "XS7X", + "XS8A", + "XS8B", + "XS8C", + "XS8D", + "XS8E", + "XS8F", + "XS8G", + "XS8H", + "XS8I", + "XS8J", + "XS8K", + "XS8L", + "XS8M", + "XS8N", + "XS8O", + "XS8P", + "XS8Q", + "XS8R", + "XS8S", + "XS8T", + "XS8U", + "XS8V", + "XS8W", + "XS8X", + "XS9", + "XS9A", + "XS9B", + "XS9C", + "XS9D", + "XS9E", + "XS9F", + "XS9S", + "XS9T", + "XS9U", + "XS9V", + "XS9W", + "XS9X", + "=XX9AH/BG8ST" + ], + "worked": false, + "confirmed": false, + "flag": "cn.png", + "pp": "BY", + "lat": 34.393144339806355, + "lon": 103.98148148148151, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "291": { + "dxcc": "321", + "cc": "HK", + "ccc": "HKG", + "name": "中国香港", + "continent": "AS", + "ituzone": ["44"], + "cqzone": ["24"], + "timezone": "8", + "ccode": "344", + "aname": "Hong Kong", + "mh": ["OL62", "OL72"], + "prefix": ["VR"], + "worked": false, + "confirmed": false, + "flag": "hk.png", + "pp": "VR", + "lat": 22.414094599590783, + "lon": 114.18381344307268, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "292": { + "dxcc": "324", + "cc": "IN", + "ccc": "IND", + "name": "印度", + "continent": "AS", + "ituzone": ["41"], + "cqzone": ["22"], + "timezone": "6", + "ccode": "356", + "aname": "India", + "mh": [ + "MJ88", + "MJ89", + "MJ98", + "MJ99", + "MK65", + "MK66", + "MK67", + "MK68", + "MK69", + "MK70", + "MK71", + "MK72", + "MK73", + "MK74", + "MK75", + "MK76", + "MK77", + "MK78", + "MK79", + "MK80", + "MK81", + "MK82", + "MK83", + "MK84", + "MK85", + "MK86", + "MK87", + "MK88", + "MK89", + "MK90", + "MK91", + "MK92", + "MK93", + "MK94", + "MK95", + "MK96", + "MK97", + "MK98", + "MK99", + "ML41", + "ML42", + "ML43", + "ML44", + "ML46", + "ML47", + "ML51", + "ML52", + "ML53", + "ML54", + "ML55", + "ML56", + "ML57", + "ML58", + "ML60", + "ML61", + "ML62", + "ML63", + "ML64", + "ML65", + "ML66", + "ML67", + "ML68", + "ML69", + "ML70", + "ML71", + "ML72", + "ML73", + "ML74", + "ML75", + "ML76", + "ML77", + "ML78", + "ML79", + "ML80", + "ML81", + "ML82", + "ML83", + "ML84", + "ML85", + "ML86", + "ML87", + "ML88", + "ML89", + "ML90", + "ML91", + "ML92", + "ML93", + "ML94", + "ML95", + "ML96", + "ML97", + "ML98", + "ML99", + "MM60", + "MM63", + "MM64", + "MM70", + "MM71", + "MM72", + "MM73", + "MM74", + "MM80", + "MM81", + "MM82", + "MM83", + "MM84", + "MM85", + "MM90", + "MM91", + "MM92", + "MM93", + "MM94", + "MM95", + "NK02", + "NK03", + "NK04", + "NK05", + "NK06", + "NK07", + "NK08", + "NK09", + "NK16", + "NK17", + "NK18", + "NK19", + "NK28", + "NK29", + "NK39", + "NL00", + "NL01", + "NL02", + "NL03", + "NL04", + "NL05", + "NL06", + "NL07", + "NL08", + "NL09", + "NL10", + "NL11", + "NL12", + "NL13", + "NL14", + "NL15", + "NL16", + "NL17", + "NL20", + "NL21", + "NL22", + "NL23", + "NL24", + "NL25", + "NL26", + "NL27", + "NL30", + "NL31", + "NL32", + "NL33", + "NL34", + "NL35", + "NL36", + "NL37", + "NL41", + "NL42", + "NL43", + "NL44", + "NL45", + "NL46", + "NL47", + "NL48", + "NL53", + "NL54", + "NL55", + "NL56", + "NL61", + "NL62", + "NL63", + "NL64", + "NL65", + "NL66", + "NL67", + "NL68", + "NL73", + "NL74", + "NL75", + "NL76", + "NL77", + "NL78", + "NL79", + "NL87", + "NL88", + "NL89", + "NM00" + ], + "prefix": [ + "8T", + "8U", + "8V", + "8W", + "8X", + "8Y", + "AT", + "=AT16BSG/BL", + "=AT16BSG/JMA", + "=AT16BSG/JOS", + "=AT16BSG/LMS", + "=AT16BSG/MCW", + "=AT16BSG/MY", + "=AT16BSG/MYH", + "=AT16BSG/RAT", + "=AT16BSG/RBI", + "=AT16BSG/SD", + "=AT16BSG/YAM", + "AU", + "AV", + "AW", + "VT", + "VU", + "=VU2ARC/FD", + "=VU2BGS/L", + "=VU2CBE/KNK", + "=VU2CDP/F1", + "=VU2LCI/L", + "=VU2PAI/F1", + "=VU2PAI/OK7MT", + "=VU2SWS/F1", + "=VU2TS/FF", + "=VU2UR/F1", + "=VU2UR/FF", + "=VU2WAP/DL7BC", + "=VU3DJQ/F1", + "=VU3VOC/F1", + "=VU4SEA", + "VV", + "VW" + ], + "worked": false, + "confirmed": false, + "flag": "in.png", + "pp": "VU", + "lat": 22.941462737245885, + "lon": 78.58024691358027, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "293": { + "dxcc": "327", + "cc": "ID", + "ccc": "IDN", + "name": "印度尼西亚", + "continent": "OC", + "ituzone": ["51", "54"], + "cqzone": ["28"], + "timezone": "8", + "ccode": "360", + "aname": "Indonesia", + "mh": [ + "NI89", + "NI97", + "NI98", + "NI99", + "NJ72", + "NJ74", + "NJ75", + "NJ80", + "NJ81", + "NJ82", + "NJ83", + "NJ84", + "NJ85", + "NJ90", + "NJ91", + "NJ92", + "NJ93", + "NJ94", + "OH99", + "OI06", + "OI07", + "OI08", + "OI09", + "OI14", + "OI15", + "OI16", + "OI17", + "OI18", + "OI19", + "OI23", + "OI24", + "OI25", + "OI26", + "OI27", + "OI28", + "OI29", + "OI32", + "OI33", + "OI34", + "OI35", + "OI36", + "OI37", + "OI38", + "OI39", + "OI42", + "OI43", + "OI44", + "OI45", + "OI46", + "OI47", + "OI48", + "OI49", + "OI51", + "OI52", + "OI53", + "OI54", + "OI55", + "OI56", + "OI57", + "OI58", + "OI59", + "OI61", + "OI62", + "OI63", + "OI64", + "OI65", + "OI66", + "OI67", + "OI68", + "OI69", + "OI71", + "OI72", + "OI73", + "OI74", + "OI75", + "OI76", + "OI77", + "OI78", + "OI79", + "OI80", + "OI81", + "OI82", + "OI83", + "OI84", + "OI85", + "OI86", + "OI87", + "OI88", + "OI89", + "OI90", + "OI91", + "OI92", + "OI93", + "OI94", + "OI95", + "OI96", + "OI97", + "OI98", + "OI99", + "OJ00", + "OJ01", + "OJ02", + "OJ10", + "OJ11", + "OJ20", + "OJ21", + "OJ30", + "OJ31", + "OJ33", + "OJ34", + "OJ40", + "OJ41", + "OJ42", + "OJ43", + "OJ44", + "OJ50", + "OJ51", + "OJ60", + "OJ61", + "OJ70", + "OJ71", + "OJ72", + "OJ73", + "OJ74", + "OJ80", + "OJ81", + "OJ82", + "OJ83", + "OJ84", + "OJ90", + "OJ91", + "OJ92", + "PH09", + "PH19", + "PH29", + "PI00", + "PI01", + "PI02", + "PI03", + "PI04", + "PI05", + "PI06", + "PI07", + "PI08", + "PI09", + "PI10", + "PI11", + "PI12", + "PI13", + "PI14", + "PI15", + "PI16", + "PI17", + "PI18", + "PI19", + "PI20", + "PI21", + "PI22", + "PI23", + "PI24", + "PI25", + "PI26", + "PI27", + "PI28", + "PI29", + "PI31", + "PI32", + "PI33", + "PI34", + "PI35", + "PI36", + "PI37", + "PI38", + "PI39", + "PI41", + "PI42", + "PI43", + "PI44", + "PI45", + "PI46", + "PI47", + "PI48", + "PI49", + "PI51", + "PI52", + "PI53", + "PI54", + "PI55", + "PI56", + "PI57", + "PI58", + "PI59", + "PI63", + "PI64", + "PI65", + "PI66", + "PI67", + "PI68", + "PI69", + "PI72", + "PI73", + "PI74", + "PI75", + "PI76", + "PI77", + "PI78", + "PI79", + "PI81", + "PI82", + "PI83", + "PI84", + "PI85", + "PI86", + "PI87", + "PI88", + "PI89", + "PI91", + "PI92", + "PI93", + "PI94", + "PI95", + "PI96", + "PI97", + "PI98", + "PJ00", + "PJ01", + "PJ10", + "PJ11", + "PJ20", + "PJ21", + "PJ22", + "PJ23", + "PJ30", + "PJ31", + "PJ32", + "PJ33", + "PJ34", + "PJ40", + "PJ41", + "PJ42", + "QI00", + "QI01", + "QI02", + "QI03", + "QI04", + "QI05", + "QI06", + "QI07" + ], + "prefix": [ + "7A", + "7B", + "7C", + "7D", + "7E", + "7F", + "7G", + "7H", + "7I", + "8A", + "8B", + "8C", + "8D", + "8E", + "8F", + "8G", + "8H", + "8I", + "PK", + "PL", + "PM", + "PN", + "PO", + "YB", + "YB0", + "=YB0AI/LH", + "YB1", + "=YB1LGP/YL", + "YB2", + "YB3", + "YB4", + "YB5", + "YB6", + "YB7", + "YB8", + "YC", + "YC0", + "=YC0LND/YL", + "YC1", + "=YC1BWA/YL", + "=YC1CVA/YL", + "YC2", + "YC3", + "YC4", + "YC5", + "YC6", + "YC7", + "YC8", + "YD", + "YD0", + "YD1", + "=YD1BZW/YL", + "=YD1MKQ/YL", + "=YD1NAA/YL", + "YD2", + "YD3", + "YD4", + "YD5", + "YD6", + "YD7", + "YD8", + "YE", + "YE0", + "YE1", + "YE2", + "YE3", + "YE4", + "YE5", + "YE6", + "YE7", + "YE8", + "YF", + "YF0", + "YF1", + "YF2", + "YF3", + "YF4", + "YF5", + "YF6", + "YF7", + "YF8", + "YG", + "YG0", + "YG1", + "YG2", + "YG3", + "YG4", + "YG5", + "YG6", + "YG7", + "YG8", + "YH", + "YH0", + "YH1", + "YH2", + "YH3", + "YH4", + "YH5", + "YH6", + "YH7", + "YH8" + ], + "worked": false, + "confirmed": false, + "flag": "id.png", + "pp": "YB", + "lat": 0.08230449844323573, + "lon": 101.35802469135803, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "294": { + "dxcc": "330", + "cc": "IR", + "ccc": "IRN", + "name": "伊朗", + "continent": "AS", + "ituzone": ["40"], + "cqzone": ["21"], + "timezone": "4", + "ccode": "364", + "aname": "Iran", + "mh": [ + "LL49", + "LL57", + "LL58", + "LL59", + "LL66", + "LL67", + "LL68", + "LL69", + "LL76", + "LL77", + "LL78", + "LL79", + "LL85", + "LL86", + "LL87", + "LL88", + "LL89", + "LL95", + "LL96", + "LL97", + "LL98", + "LL99", + "LM23", + "LM24", + "LM25", + "LM26", + "LM27", + "LM28", + "LM29", + "LM30", + "LM31", + "LM32", + "LM33", + "LM34", + "LM35", + "LM36", + "LM37", + "LM38", + "LM39", + "LM40", + "LM41", + "LM42", + "LM43", + "LM44", + "LM45", + "LM46", + "LM47", + "LM48", + "LM49", + "LM50", + "LM51", + "LM52", + "LM53", + "LM54", + "LM55", + "LM56", + "LM57", + "LM60", + "LM61", + "LM62", + "LM63", + "LM64", + "LM65", + "LM66", + "LM67", + "LM70", + "LM71", + "LM72", + "LM73", + "LM74", + "LM75", + "LM76", + "LM77", + "LM78", + "LM80", + "LM81", + "LM82", + "LM83", + "LM84", + "LM85", + "LM86", + "LM87", + "LM88", + "LM90", + "LM91", + "LM92", + "LM93", + "LM94", + "LM95", + "LM96", + "LM97", + "ML05", + "ML06", + "ML07", + "ML08", + "ML09", + "ML16", + "ML17", + "ML18", + "MM00", + "MM01", + "MM02", + "MM03", + "MM04", + "MM05", + "MM06", + "MM07" + ], + "prefix": ["9B", "9C", "9D", "EP", "EQ"], + "worked": false, + "confirmed": false, + "flag": "ir.png", + "pp": "EP", + "lat": 33.402593417767875, + "lon": 53.53909465020577, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "295": { + "dxcc": "333", + "cc": "IQ", + "ccc": "IRQ", + "name": "伊拉克", + "continent": "AS", + "ituzone": ["39"], + "cqzone": ["21"], + "timezone": "3", + "ccode": "368", + "aname": "Iraq", + "mh": [ + "KM92", + "KM93", + "LL19", + "LL29", + "LL39", + "LL49", + "LM01", + "LM02", + "LM03", + "LM04", + "LM05", + "LM06", + "LM10", + "LM11", + "LM12", + "LM13", + "LM14", + "LM15", + "LM16", + "LM17", + "LM20", + "LM21", + "LM22", + "LM23", + "LM24", + "LM25", + "LM26", + "LM27", + "LM30", + "LM31", + "LM32", + "LM33", + "LM35", + "LM40" + ], + "prefix": ["HN", "=K4CY/M", "YI", "=YI1IRQ/ND"], + "worked": false, + "confirmed": false, + "flag": "iq.png", + "pp": "YI", + "lat": 33.33385655141417, + "lon": 43.53909465020576, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "296": { + "dxcc": "336", + "cc": "IL", + "ccc": "ISR", + "name": "以色列", + "continent": "AS", + "ituzone": ["39"], + "cqzone": ["20"], + "timezone": "2", + "ccode": "376", + "aname": "Israel", + "mh": ["KL79", "KM70", "KM71", "KM72", "KM73"], + "prefix": [ + "4X", + "=4X01T/FF", + "=4X1FC/LH", + "=4X1GO/LH", + "=4X1IG/LH", + "=4X1KS/LH", + "=4X1OM/LH", + "=4X1OZ/LH", + "=4X1ST/LH", + "=4X1VF/LH", + "=4X1ZM/LH", + "=4X1ZZ/LH", + "=4X4FC/LH", + "=4X4FR/LH", + "=4X4YM/LH", + "=4X5HF/LH", + "=4X5IQ/LH", + "=4X5MG/LH", + "=4X6DK/LH", + "=4X6HP/LH", + "=4X6RE/LH", + "=4X6TT/JY1", + "=4X6UT/LH", + "=4X6UU/LH", + "=4X6ZM/LH", + "4Z", + "=4Z1DZ/LH", + "=4Z1KD/LH", + "=4Z1KM/LH", + "=4Z1ZV/LH", + "=4Z4DX/ANT", + "=4Z4DX/J", + "=4Z4DX/LGT", + "=4Z4DX/LH", + "=4Z4HC/LH", + "=4Z4KJ/LH", + "=4Z4KX/LH", + "=4Z5DZ/LH", + "=4Z5FL/LH", + "=4Z5FW/LH", + "=4Z5KJ/LGT", + "=4Z5KJ/LH", + "=4Z5NW/YL", + "=4Z5OT/LH", + "=4Z5SL/LH", + "=4Z8GZ/LH" + ], + "worked": false, + "confirmed": false, + "flag": "il.png", + "pp": "4X", + "lat": 31.065910517787543, + "lon": 34.880861657267694, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "297": { + "dxcc": "339", + "cc": "JP", + "ccc": "JPN", + "name": "日本", + "continent": "AS", + "ituzone": ["45"], + "cqzone": ["25"], + "timezone": "9", + "ccode": "392", + "aname": "Japan", + "mh": [ + "PL14", + "PL24", + "PL36", + "PL46", + "PL47", + "PL48", + "PL49", + "PL58", + "PM41", + "PM42", + "PM43", + "PM44", + "PM50", + "PM51", + "PM52", + "PM53", + "PM54", + "PM62", + "PM63", + "PM64", + "PM65", + "PM66", + "PM73", + "PM74", + "PM75", + "PM76", + "PM83", + "PM84", + "PM85", + "PM86", + "PM87", + "PM91", + "PM92", + "PM93", + "PM94", + "PM95", + "PM96", + "PM97", + "PM98", + "PM99", + "PN90", + "PN91", + "PN92", + "QM00", + "QM05", + "QM06", + "QM07", + "QM08", + "QM09", + "QN00", + "QN01", + "QN02", + "QN03", + "QN04", + "QN05", + "QN12", + "QN13", + "QN14", + "QN15", + "QN22", + "QN23", + "QN24" + ], + "prefix": [ + "7J", + "7K", + "7L", + "7M", + "7N", + "=7N2DAB/LH", + "=7N4RHO/BM", + "8J", + "8K", + "8L", + "8M", + "8N", + "JA", + "=JD1BHH/6", + "JE", + "=JE1LET/AE3RM", + "=JE1LET/VK3SS", + "=JE1XUZ/YOTA", + "JF", + "JG", + "JH", + "=JH1NBN/DF2OO", + "=JH1NBN/DL1BD", + "JI", + "JJ", + "JK", + "JL", + "JM", + "JN", + "JO", + "=JO1ZYB/L", + "JP", + "JQ", + "=JQ2UXA/YL", + "JR", + "JS" + ], + "worked": false, + "confirmed": false, + "flag": "jp.png", + "pp": "JA", + "lat": 36.30618715668925, + "lon": 138.80658436213992, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "298": { + "dxcc": "342", + "cc": "JO", + "ccc": "JOR", + "name": "约旦", + "continent": "AS", + "ituzone": ["39"], + "cqzone": ["20"], + "timezone": "2", + "ccode": "400", + "aname": "Jordan", + "mh": [ + "KL79", + "KL89", + "KM70", + "KM71", + "KM72", + "KM80", + "KM81", + "KM82", + "KM91", + "KM92", + "KM93" + ], + "prefix": ["JY"], + "worked": false, + "confirmed": false, + "flag": "jo.png", + "pp": "JY", + "lat": 31.71470993204386, + "lon": 36.40603566529492, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "299": { + "dxcc": "344", + "cc": "KP", + "ccc": "PRK", + "name": "朝鲜", + "continent": "AS", + "ituzone": ["44"], + "cqzone": ["25"], + "timezone": "9", + "ccode": "408", + "aname": "Democratic People's Rep. of Korea", + "mh": [ + "PM27", + "PM28", + "PM29", + "PM37", + "PM38", + "PM39", + "PM48", + "PM49", + "PN20", + "PN30", + "PN31", + "PN40", + "PN41", + "PN42", + "PN43", + "PN51", + "PN52" + ], + "prefix": ["P5", "P6", "P7", "P8", "P9"], + "worked": false, + "confirmed": false, + "flag": "kp.png", + "pp": "P5", + "lat": 39.994024967687494, + "lon": 126.37860082304528, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "300": { + "dxcc": "345", + "cc": "BN", + "ccc": "BRN", + "name": "文莱", + "continent": "OC", + "ituzone": ["54"], + "cqzone": ["28"], + "timezone": "8", + "ccode": "96", + "aname": "Brunei Darussalam", + "mh": ["OJ74", "OJ75"], + "prefix": ["V8"], + "worked": false, + "confirmed": false, + "flag": "bn.png", + "pp": "V8", + "lat": 4.731020069937742, + "lon": 114.91473183288453, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "301": { + "dxcc": "348", + "cc": "KW", + "ccc": "KWT", + "name": "科威特", + "continent": "AS", + "ituzone": ["39"], + "cqzone": ["21"], + "timezone": "3", + "ccode": "414", + "aname": "Kuwait", + "mh": ["LL38", "LL39", "LL48", "LL49", "LM30", "LM40"], + "prefix": ["9K", "=9K2BI/J", "=9K2BI/JOTA", "=9K2OK/KACC", "NLD"], + "worked": false, + "confirmed": false, + "flag": "kw.png", + "pp": "9K", + "lat": 29.383817029432933, + "lon": 47.645176040237764, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "302": { + "dxcc": "354", + "cc": "LB", + "ccc": "LBN", + "name": "黎巴嫩", + "continent": "AS", + "ituzone": ["39"], + "cqzone": ["20"], + "timezone": "2", + "ccode": "422", + "aname": "Lebanon", + "mh": ["KM73", "KM74", "KM83", "KM84"], + "prefix": ["OD", "=OD5NJ/ID", "=OD5QB/ID", "=OD5RI/YOTA"], + "worked": false, + "confirmed": false, + "flag": "lb.png", + "pp": "OD", + "lat": 33.863666729112026, + "lon": 35.69374587207235, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "303": { + "dxcc": "363", + "cc": "MN", + "ccc": "MNG", + "name": "蒙古", + "continent": "AS", + "ituzone": ["32", "33"], + "cqzone": ["23"], + "timezone": "8", + "ccode": "496", + "aname": "Mongolia", + "mh": [ + "NN38", + "NN39", + "NN47", + "NN48", + "NN49", + "NN55", + "NN56", + "NN57", + "NN58", + "NN59", + "NN64", + "NN65", + "NN66", + "NN67", + "NN68", + "NN69", + "NN73", + "NN74", + "NN75", + "NN76", + "NN77", + "NN78", + "NN79", + "NN82", + "NN83", + "NN84", + "NN85", + "NN86", + "NN87", + "NN88", + "NN89", + "NN92", + "NN93", + "NN94", + "NN95", + "NN96", + "NN97", + "NN98", + "NN99", + "NO50", + "NO60", + "NO70", + "NO80", + "NO81", + "NO90", + "NO91", + "NO92", + "ON02", + "ON03", + "ON04", + "ON05", + "ON06", + "ON07", + "ON08", + "ON09", + "ON11", + "ON12", + "ON13", + "ON14", + "ON15", + "ON16", + "ON17", + "ON18", + "ON19", + "ON21", + "ON22", + "ON23", + "ON24", + "ON25", + "ON26", + "ON27", + "ON28", + "ON29", + "ON31", + "ON32", + "ON33", + "ON34", + "ON35", + "ON36", + "ON37", + "ON38", + "ON39", + "ON42", + "ON43", + "ON44", + "ON45", + "ON46", + "ON47", + "ON48", + "ON49", + "ON52", + "ON53", + "ON54", + "ON55", + "ON56", + "ON57", + "ON58", + "ON59", + "ON64", + "ON65", + "ON66", + "ON67", + "ON68", + "ON69", + "ON74", + "ON75", + "ON76", + "ON77", + "ON78", + "ON79", + "ON85", + "ON86", + "ON87", + "ON88", + "ON89", + "ON96", + "ON97", + "ON98", + "OO00", + "OO01", + "OO10", + "OO11", + "OO20", + "OO30", + "OO60", + "OO70" + ], + "prefix": ["JT", "JT2", "JT3", "JU", "JU2", "JU3", "JV", "JV2", "JV3"], + "worked": false, + "confirmed": false, + "flag": "mn.png", + "pp": "JT", + "lat": 46.58869623778031, + "lon": 103.42592592592595, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "304": { + "dxcc": "369", + "cc": "NP", + "ccc": "NPL", + "name": "尼泊尔", + "continent": "AS", + "ituzone": ["42"], + "cqzone": ["22"], + "timezone": "545", + "ccode": "524", + "aname": "Nepal", + "mh": [ + "NL07", + "NL08", + "NL09", + "NL17", + "NL18", + "NL19", + "NL26", + "NL27", + "NL28", + "NL29", + "NL36", + "NL37", + "NL38", + "NL46", + "NL47", + "NM00", + "NM10" + ], + "prefix": ["9N"], + "worked": false, + "confirmed": false, + "flag": "np.png", + "pp": "9N", + "lat": 28.06867459530622, + "lon": 83.31047096479195, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "305": { + "dxcc": "370", + "cc": "OM", + "ccc": "OMN", + "name": "阿曼", + "continent": "AS", + "ituzone": ["39"], + "cqzone": ["21"], + "timezone": "4", + "ccode": "512", + "aname": "Oman", + "mh": [ + "LK66", + "LK67", + "LK68", + "LK69", + "LK76", + "LK77", + "LK78", + "LK79", + "LK87", + "LK88", + "LK89", + "LL70", + "LL71", + "LL72", + "LL73", + "LL74", + "LL80", + "LL81", + "LL82", + "LL83", + "LL84", + "LL85", + "LL86", + "LL90", + "LL91", + "LL92", + "LL93" + ], + "prefix": [ + "A4", + "=A41CK/ND", + "=A41JR/RD", + "=A41KA/ND", + "=A41KB/ND", + "=A41KC/ND", + "=A41KJ/ND", + "=A41LD/ND", + "=A41LD/ND/P", + "=A41LD/RD", + "=A41LD/SQ", + "=A41LX/M/ND", + "=A41LX/ND", + "=A41LX/RD", + "=A41LZ/RD", + "=A41MA/RD", + "=A41MD/RD", + "=A41ME/ND", + "=A41MO/ND", + "=A41MO/RD", + "=A41MO/SQ", + "=A41MX/ND", + "=A41NN/ND", + "=A41NN/ND/P", + "=A41NW/ND", + "=A41OD/ND", + "=A41OM/SQ", + "=A41OO/ND", + "=A41OO/ND/M", + "=A41OP/ND", + "=A41OR/ND", + "=A41PB/ND", + "=A41PB/ND/M", + "=A41PG/M/ND", + "=A41PG/ND", + "=A41PG/SQ", + "=A41PH/ND", + "=A41PJ/ND", + "=A41PY/ND", + "=A41RS/ND", + "=A41WM/ND", + "=A45ND/ND/P", + "=A45RS/ND", + "=A45VU/ND", + "=A45WH/MF", + "=A45WH/ND", + "=A45WH/P/ND", + "=A45WM/ND", + "=A45WR/ND", + "=A45XO/ND", + "=A45XO/ND/P", + "=A45XO/RD", + "=A45XW/ND", + "=A47RK/ND", + "=A47RS/JOTA", + "=A47RS/ND", + "=A47RS/SQ" + ], + "worked": false, + "confirmed": false, + "flag": "om.png", + "pp": "A4", + "lat": 21.498087115713915, + "lon": 57.302240512117045, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "306": { + "dxcc": "372", + "cc": "PK", + "ccc": "PAK", + "name": "巴基斯坦", + "continent": "AS", + "ituzone": ["41"], + "cqzone": ["21"], + "timezone": "5", + "ccode": "586", + "aname": "Pakistan", + "mh": [ + "ML05", + "ML06", + "ML08", + "ML09", + "ML15", + "ML16", + "ML17", + "ML18", + "ML19", + "ML25", + "ML26", + "ML27", + "ML28", + "ML29", + "ML33", + "ML34", + "ML35", + "ML36", + "ML37", + "ML38", + "ML39", + "ML43", + "ML44", + "ML45", + "ML46", + "ML47", + "ML48", + "ML49", + "ML54", + "ML55", + "ML56", + "ML57", + "ML58", + "ML59", + "ML68", + "ML69", + "MM30", + "MM31", + "MM40", + "MM41", + "MM42", + "MM43", + "MM44", + "MM50", + "MM51", + "MM52", + "MM53", + "MM54", + "MM55", + "MM56", + "MM60", + "MM61", + "MM62", + "MM63", + "MM64", + "MM65", + "MM66", + "MM70", + "MM71", + "MM72", + "MM73", + "MM74", + "MM75", + "MM76", + "MM84", + "MM85", + "MM86" + ], + "prefix": ["6P", "6Q", "6R", "6S", "AP", "AQ", "AR", "AS"], + "worked": false, + "confirmed": false, + "flag": "pk.png", + "pp": "AP", + "lat": 30.11426203997985, + "lon": 69.67078189300412, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "307": { + "dxcc": "375", + "cc": "PH", + "ccc": "PHL", + "name": "菲律宾", + "continent": "OC", + "ituzone": ["50"], + "cqzone": ["27"], + "timezone": "8", + "ccode": "608", + "aname": "Philippines", + "mh": [ + "OJ87", + "OJ88", + "OJ89", + "OJ94", + "OJ95", + "OJ96", + "OJ97", + "OJ98", + "OJ99", + "OK90", + "OK91", + "OK92", + "OK95", + "OK96", + "PJ05", + "PJ06", + "PJ07", + "PJ08", + "PJ09", + "PJ16", + "PJ17", + "PJ18", + "PJ19", + "PJ25", + "PJ26", + "PJ27", + "PJ28", + "PJ29", + "PJ36", + "PJ37", + "PJ38", + "PJ39", + "PK00", + "PK01", + "PK02", + "PK03", + "PK04", + "PK05", + "PK06", + "PK07", + "PK08", + "PK09", + "PK10", + "PK11", + "PK12", + "PK13", + "PK14", + "PK15", + "PK16", + "PK17", + "PK18", + "PK19", + "PK20", + "PK21", + "PK22", + "PK23", + "PK24", + "PL00", + "PL01", + "PL10" + ], + "prefix": [ + "4D", + "4E", + "4F", + "4G", + "4H", + "4I", + "DU", + "DV", + "DW", + "DX", + "DY", + "DZ" + ], + "worked": false, + "confirmed": false, + "flag": "ph.png", + "pp": "DU", + "lat": 9.972131417391026, + "lon": 118.64654778235025, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "308": { + "dxcc": "376", + "cc": "QA", + "ccc": "QAT", + "name": "卡塔尔", + "continent": "AS", + "ituzone": ["39"], + "cqzone": ["21"], + "timezone": "4", + "ccode": "634", + "aname": "Qatar", + "mh": ["LL54", "LL55", "LL56"], + "prefix": ["A7", "=A71CM/ND", "=A71EM/QND", "=A71FJ/QND"], + "worked": false, + "confirmed": false, + "flag": "qa.png", + "pp": "A7", + "lat": 25.423069474343762, + "lon": 51.15683584819387, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "309": { + "dxcc": "378", + "cc": "SA", + "ccc": "SAU", + "name": "沙特阿拉伯", + "continent": "AS", + "ituzone": ["39"], + "cqzone": ["21"], + "timezone": "3", + "ccode": "682", + "aname": "Saudi Arabia", + "mh": [ + "KL76", + "KL77", + "KL78", + "KL79", + "KL84", + "KL85", + "KL86", + "KL87", + "KL88", + "KL89", + "KL90", + "KL91", + "KL92", + "KL93", + "KL94", + "KL95", + "KL96", + "KL97", + "KL98", + "KL99", + "KM80", + "KM81", + "KM90", + "KM91", + "KM92", + "LK06", + "LK07", + "LK08", + "LK09", + "LK16", + "LK17", + "LK18", + "LK19", + "LK26", + "LK27", + "LK28", + "LK29", + "LK36", + "LK37", + "LK38", + "LK39", + "LK47", + "LK48", + "LK49", + "LK58", + "LK59", + "LK68", + "LK69", + "LK79", + "LL00", + "LL01", + "LL02", + "LL03", + "LL04", + "LL05", + "LL06", + "LL07", + "LL08", + "LL09", + "LL10", + "LL11", + "LL12", + "LL13", + "LL14", + "LL15", + "LL16", + "LL17", + "LL18", + "LL19", + "LL20", + "LL21", + "LL22", + "LL23", + "LL24", + "LL25", + "LL26", + "LL27", + "LL28", + "LL29", + "LL30", + "LL31", + "LL32", + "LL33", + "LL34", + "LL35", + "LL36", + "LL37", + "LL38", + "LL39", + "LL40", + "LL41", + "LL42", + "LL43", + "LL44", + "LL45", + "LL46", + "LL47", + "LL48", + "LL50", + "LL51", + "LL52", + "LL53", + "LL54", + "LL55", + "LL56", + "LL60", + "LL61", + "LL62", + "LL63", + "LL70", + "LL71", + "LL72", + "LM00", + "LM01", + "LM02", + "LM10", + "LM11" + ], + "prefix": [ + "7Z", + "=7Z1AL/ND", + "=7Z1AQ/ND", + "=7Z1BL/ND", + "=7Z1CQ/ND", + "=7Z1SJ/ND", + "=7Z1SS/M/ND", + "=7Z1TT/ND", + "=7Z1UG/ND", + "8Z", + "HZ", + "=HZ1AN/ND", + "=HZ1BH/ND", + "=HZ1BL/ND", + "=HZ1BO/ND", + "=HZ1BT/ND", + "=HZ1BW/ND", + "=HZ1BW/ND/M", + "=HZ1CH/ND", + "=HZ1DG/ND", + "=HZ1EA/ND", + "=HZ1FL/ND", + "=HZ1HN/M/ND", + "=HZ1HN/ND", + "=HZ1MD/ND", + "=HZ1MX/ND", + "=HZ1SBS/J", + "=HZ1SBS/JOTA", + "=HZ1SBS/ND", + "=HZ1SK/ND", + "=HZ1TL/ND", + "=HZ1TT/ND", + "=HZ1XB/ND", + "=HZ1ZH/ND" + ], + "worked": false, + "confirmed": false, + "flag": "sa.png", + "pp": "HZ", + "lat": 23.357687763572528, + "lon": 45.48696844993141, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "310": { + "dxcc": "379", + "cc": "SC", + "ccc": "SYC", + "name": "塞舌尔", + "continent": "AF", + "ituzone": ["53"], + "cqzone": ["39"], + "timezone": "4", + "ccode": "690", + "aname": "Seychelles", + "mh": ["LI75", "LI76"], + "prefix": ["S7", "=S79EC/F", "=S79NAN/F", "=S79RRC/C", "=S79RRC/F"], + "worked": false, + "confirmed": false, + "flag": "sc.png", + "pp": "S7", + "lat": -9.395196694906943, + "lon": 50.89163237311385, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "311": { + "dxcc": "381", + "cc": "SG", + "ccc": "SGP", + "name": "新加坡", + "continent": "AS", + "ituzone": ["54"], + "cqzone": ["28"], + "timezone": "8", + "ccode": "702", + "aname": "Singapore", + "mh": ["OJ11", "OJ21"], + "prefix": ["9V", "S6"], + "worked": false, + "confirmed": false, + "flag": "sg.png", + "pp": "9V", + "lat": 1.3330098408909663, + "lon": 103.79718538840623, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "312": { + "dxcc": "382", + "cc": "DJ", + "ccc": "DJI", + "name": "吉布提", + "continent": "AF", + "ituzone": ["48"], + "cqzone": ["37"], + "timezone": "3", + "ccode": "262", + "aname": "Djibouti", + "mh": ["LK00", "LK01", "LK10", "LK11", "LK12"], + "prefix": ["J2", "=VERSION"], + "worked": false, + "confirmed": false, + "flag": "dj.png", + "pp": "J2", + "lat": 11.768224377070212, + "lon": 42.331961591220846, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "313": { + "dxcc": "384", + "cc": "SY", + "ccc": "SYR", + "name": "叙利亚", + "continent": "AS", + "ituzone": ["39"], + "cqzone": ["20"], + "timezone": "2", + "ccode": "760", + "aname": "Syria", + "mh": [ + "KM72", + "KM73", + "KM74", + "KM75", + "KM82", + "KM83", + "KM84", + "KM85", + "KM86", + "KM92", + "KM93", + "KM94", + "KM95", + "KM96", + "LM04", + "LM05", + "LM06", + "LM07", + "LM16", + "LM17" + ], + "prefix": ["6C", "YK"], + "worked": false, + "confirmed": false, + "flag": "sy.png", + "pp": "YK", + "lat": 35.237774551746256, + "lon": 38.43621399176954, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "314": { + "dxcc": "386", + "cc": "TW", + "ccc": "TWN", + "name": "中国台湾", + "continent": "AS", + "ituzone": ["44"], + "cqzone": ["24"], + "timezone": "8", + "ccode": "158", + "aname": "Taiwan", + "mh": [ + "OL93", + "OL94", + "OL96", + "PL01", + "PL02", + "PL03", + "PL04", + "PL05", + "PL06", + "PL15" + ], + "prefix": ["BM", "BN", "BO", "BP", "BQ", "BU", "BV", "BW", "BX"], + "worked": false, + "confirmed": false, + "flag": "cn.png", + "pp": "BV", + "lat": 23.96077747924268, + "lon": 120.73159579332417, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "315": { + "dxcc": "387", + "cc": "TH", + "ccc": "THA", + "name": "泰国", + "continent": "AS", + "ituzone": ["49"], + "cqzone": ["26"], + "timezone": "7", + "ccode": "764", + "aname": "Thailand", + "mh": [ + "NJ89", + "NJ96", + "NJ97", + "NJ98", + "NJ99", + "NK87", + "NK88", + "NK89", + "NK90", + "NK91", + "NK92", + "NK93", + "NK94", + "NK95", + "NK96", + "NK97", + "NK98", + "NK99", + "NL90", + "OJ05", + "OJ06", + "OJ07", + "OJ08", + "OJ09", + "OJ16", + "OK02", + "OK03", + "OK04", + "OK05", + "OK06", + "OK07", + "OK08", + "OK09", + "OK11", + "OK12", + "OK13", + "OK14", + "OK15", + "OK16", + "OK17", + "OK18", + "OK24", + "OK25", + "OK26", + "OK27", + "OK28", + "OL00" + ], + "prefix": ["E2", "HS"], + "worked": false, + "confirmed": false, + "flag": "th.png", + "pp": "HS", + "lat": 15.764331284889323, + "lon": 101.44032921810698, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "316": { + "dxcc": "390", + "cc": "TR", + "ccc": "TUR", + "name": "土耳其", + "continent": "AS", + "ituzone": ["39"], + "cqzone": ["20"], + "timezone": "2", + "ccode": "792", + "aname": "Turkey", + "mh": [ + "KM29", + "KM36", + "KM37", + "KM38", + "KM39", + "KM46", + "KM47", + "KM48", + "KM49", + "KM56", + "KM57", + "KM58", + "KM59", + "KM66", + "KM67", + "KM68", + "KM69", + "KM75", + "KM76", + "KM77", + "KM78", + "KM79", + "KM85", + "KM86", + "KM87", + "KM88", + "KM89", + "KM96", + "KM97", + "KM98", + "KM99", + "KN20", + "KN30", + "KN31", + "KN32", + "KN40", + "KN41", + "KN50", + "KN51", + "KN60", + "KN61", + "KN62", + "KN70", + "KN71", + "KN72", + "KN80", + "KN81", + "KN90", + "KN91", + "LM06", + "LM07", + "LM08", + "LM09", + "LM17", + "LM18", + "LM19", + "LM26", + "LM27", + "LM28", + "LM29", + "LN00", + "LN01", + "LN10", + "LN11", + "LN20" + ], + "prefix": [ + "TA", + "TA1", + "=TA1AD/0", + "=TA1AJJ/2", + "=TA1AO/4", + "=TA1AYR/6", + "=TA1BM/3", + "=TA1BX/2", + "=TA1BX/3", + "=TA1BX/3/M", + "=TA1BZ/2", + "=TA1C/2", + "=TA1CM/2", + "=TA1D/3", + "=TA1D/4", + "=TA1E/0", + "=TA1ED/0", + "=TA1FA/2", + "=TA1FL/0", + "=TA1FM/2", + "=TA1HZ/2", + "=TA1HZ/4", + "=TA1O/8", + "=TA1ZK/0", + "=TA2AKG/1", + "=TA2IJ/YOM", + "=TA2LZ/1", + "=TA2ZF/1", + "=TA3CQ/1", + "=TA3HM/1", + "=TA3J/4/LGT", + "=TA3J/LH", + "=TA4/DJ5AA/LH", + "=TA5CT/1", + "=TA6CQ/1", + "=TA7KB/LGT", + "=TA7KB/LH", + "=TA9J/LH", + "TB", + "TB1", + "TC", + "=TC0SV/LH", + "TC1", + "=TC100A", + "=TC100GLB", + "=TC100GP", + "=TC100GS", + "=TC100KT", + "=TC100VKZL", + "=TC101GLB", + "=TC101GP", + "=TC101GS", + "=TC101KT", + "=TC18MART", + "=TC2ELH/LH", + "=TC2ISAF/1", + "=TC50TRAC/01A", + "=TC50TRAC/01K", + "=TC50TRAC/03D", + "=TC50TRAC/10B", + "=TC50TRAC/15B", + "=TC50TRAC/16M", + "=TC50TRAC/17B", + "=TC50TRAC/17G", + "=TC50TRAC/18C", + "=TC50TRAC/18E", + "=TC50TRAC/28G", + "=TC50TRAC/28GR", + "=TC50TRAC/29T", + "=TC50TRAC/34I", + "=TC50TRAC/34K", + "=TC50TRAC/35I", + "=TC50TRAC/35K", + "=TC50TRAC/38D", + "=TC50TRAC/38K", + "=TC50TRAC/41G", + "=TC50TRAC/41K", + "=TC50TRAC/41KF", + "=TC50TRAC/67E", + "=TC50TRAC/67Z", + "=TC50TRAC/80K", + "=TC50TRAC/80O", + "=TC7YLH/LH", + "=TC9SAM/1", + "YM", + "YM1", + "=YM1SIZ/2", + "=YM7KA/LH" + ], + "worked": false, + "confirmed": false, + "flag": "tr.png", + "pp": "TA", + "lat": 41.39683132470057, + "lon": 27.227556774881872, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "317": { + "dxcc": "391", + "cc": "AE", + "ccc": "ARE", + "name": "阿拉伯联合酋长国", + "continent": "AS", + "ituzone": ["39"], + "cqzone": ["21"], + "timezone": "4", + "ccode": "784", + "aname": "United Arab Emirates", + "mh": [ + "LL53", + "LL54", + "LL62", + "LL63", + "LL64", + "LL72", + "LL73", + "LL74", + "LL75", + "LL84", + "LL85", + "LL86" + ], + "prefix": [ + "A6", + "=A61B/ND", + "=A61BK/DM", + "=A61BK/JJ", + "=A61BK/ND", + "=A61C/ND", + "=A61D/ND", + "=A61DA/MD", + "=A61DD/FD", + "=A61DD/MD", + "=A61DD/ND", + "=A61DJ/ND", + "=A61E/ND", + "=A61EI/ARS", + "=A61FJ/ARS", + "=A61FJ/FD", + "=A61FJ/ND", + "=A61FK/47ND", + "=A61FK/FD", + "=A61FK/MD", + "=A61HA/ND", + "=A61K/ND", + "=A61LL/ND", + "=A61M/ND", + "=A61N/ND", + "=A61Q/ARS", + "=A61Q/FD", + "=A61Q/MD", + "=A61Q/ND", + "=A61QQ/ND", + "=A61R/ND", + "=A61RK/ND", + "=A61SM/ND", + "=A61ZA/FD", + "=A62ER/ND", + "=A62ER/ZM3", + "=A65DC/FD" + ], + "worked": false, + "confirmed": false, + "flag": "ae.png", + "pp": "A6", + "lat": 23.458395441329387, + "lon": 54.046639231824415, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "318": { + "dxcc": "400", + "cc": "DZ", + "ccc": "DZA", + "name": "阿尔及利亚", + "continent": "AF", + "ituzone": ["37"], + "cqzone": ["33"], + "timezone": "0", + "ccode": "12", + "aname": "Algeria", + "mh": [ + "IL56", + "IL57", + "IL58", + "IL59", + "IL65", + "IL66", + "IL67", + "IL68", + "IL69", + "IL74", + "IL75", + "IL76", + "IL77", + "IL78", + "IL79", + "IL83", + "IL84", + "IL85", + "IL86", + "IL87", + "IL88", + "IL89", + "IL91", + "IL92", + "IL93", + "IL94", + "IL95", + "IL96", + "IL97", + "IL98", + "IL99", + "IM70", + "IM80", + "IM81", + "IM82", + "IM84", + "IM85", + "IM90", + "IM91", + "IM92", + "IM93", + "IM94", + "IM95", + "IM96", + "JK18", + "JK19", + "JK29", + "JK39", + "JL00", + "JL01", + "JL02", + "JL03", + "JL04", + "JL05", + "JL06", + "JL07", + "JL08", + "JL09", + "JL10", + "JL11", + "JL12", + "JL13", + "JL14", + "JL15", + "JL16", + "JL17", + "JL18", + "JL19", + "JL20", + "JL21", + "JL22", + "JL23", + "JL24", + "JL25", + "JL26", + "JL27", + "JL28", + "JL29", + "JL30", + "JL31", + "JL32", + "JL33", + "JL34", + "JL35", + "JL36", + "JL37", + "JL38", + "JL39", + "JL41", + "JL42", + "JL43", + "JL44", + "JL45", + "JL46", + "JL47", + "JL48", + "JL49", + "JL52", + "JL53", + "JL54", + "JL55", + "JM00", + "JM01", + "JM02", + "JM03", + "JM04", + "JM05", + "JM06", + "JM10", + "JM11", + "JM12", + "JM13", + "JM14", + "JM15", + "JM16", + "JM20", + "JM21", + "JM22", + "JM23", + "JM24", + "JM25", + "JM26", + "JM30", + "JM31", + "JM32", + "JM33", + "JM34", + "JM35", + "JM36", + "JM37", + "JM40", + "JM41", + "JM42", + "JM43", + "JM44", + "JM45", + "JM46" + ], + "prefix": [ + "7R", + "7T", + "7U", + "7V", + "7W", + "7X", + "=7X2BDX/JOTA", + "=7X5VRK/ND", + "7Y" + ], + "worked": false, + "confirmed": false, + "flag": "dz.png", + "pp": "7X", + "lat": 28.39096286951431, + "lon": 3.271604938271602, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "319": { + "dxcc": "401", + "cc": "AO", + "ccc": "AGO", + "name": "安哥拉", + "continent": "AF", + "ituzone": ["52"], + "cqzone": ["36"], + "timezone": "1", + "ccode": "24", + "aname": "Angola", + "mh": [ + "JH52", + "JH53", + "JH54", + "JH62", + "JH63", + "JH64", + "JH65", + "JH66", + "JH67", + "JH68", + "JH69", + "JH72", + "JH73", + "JH74", + "JH75", + "JH76", + "JH77", + "JH78", + "JH79", + "JH82", + "JH83", + "JH84", + "JH85", + "JH86", + "JH87", + "JH88", + "JH89", + "JH92", + "JH93", + "JH94", + "JH95", + "JH96", + "JH97", + "JH98", + "JH99", + "JI60", + "JI61", + "JI62", + "JI63", + "JI64", + "JI65", + "JI70", + "JI71", + "JI72", + "JI73", + "JI74", + "JI80", + "JI81", + "JI82", + "JI83", + "JI84", + "JI90", + "JI91", + "JI92", + "JI93", + "KH01", + "KH02", + "KH03", + "KH04", + "KH05", + "KH06", + "KH07", + "KH08", + "KH09", + "KH12", + "KH13", + "KH14", + "KH16", + "KH17", + "KH18", + "KH19", + "KH26", + "KH27", + "KH28", + "KH29", + "KI00", + "KI01", + "KI02", + "KI03", + "KI10" + ], + "prefix": ["D2", "D3"], + "worked": false, + "confirmed": false, + "flag": "ao.png", + "pp": "D2", + "lat": -12.49242071366696, + "lon": 16.975308641975314, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "320": { + "dxcc": "402", + "cc": "BW", + "ccc": "BWA", + "name": "博茨瓦纳", + "continent": "AF", + "ituzone": ["57"], + "cqzone": ["38"], + "timezone": "2", + "ccode": "72", + "aname": "Botswana", + "mh": [ + "KG03", + "KG04", + "KG05", + "KG06", + "KG07", + "KG08", + "KG09", + "KG13", + "KG14", + "KG15", + "KG16", + "KG17", + "KG18", + "KG19", + "KG24", + "KG25", + "KG26", + "KG27", + "KG28", + "KG29", + "KG35", + "KG36", + "KG37", + "KG38", + "KG39", + "KG47", + "KG48", + "KH00", + "KH01", + "KH10", + "KH11", + "KH20", + "KH21", + "KH22", + "KH30" + ], + "prefix": ["8O", "A2"], + "worked": false, + "confirmed": false, + "flag": "bw.png", + "pp": "A2", + "lat": -21.11042715003589, + "lon": 23.51851851851852, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "321": { + "dxcc": "404", + "cc": "BI", + "ccc": "BDI", + "name": "布隆迪", + "continent": "AF", + "ituzone": ["52"], + "cqzone": ["36"], + "timezone": "3", + "ccode": "108", + "aname": "Burundi", + "mh": ["KI45", "KI46", "KI47", "KI55", "KI56", "KI57"], + "prefix": ["9U"], + "worked": false, + "confirmed": false, + "flag": "bi.png", + "pp": "9U", + "lat": -3.235590268134885, + "lon": 29.766803840877916, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "322": { + "dxcc": "406", + "cc": "CM", + "ccc": "CMR", + "name": "喀麦隆", + "continent": "AF", + "ituzone": ["47"], + "cqzone": ["36"], + "timezone": "1", + "ccode": "120", + "aname": "Cameroon", + "mh": [ + "JJ42", + "JJ43", + "JJ44", + "JJ45", + "JJ46", + "JJ52", + "JJ53", + "JJ54", + "JJ55", + "JJ56", + "JJ57", + "JJ62", + "JJ63", + "JJ64", + "JJ65", + "JJ66", + "JJ67", + "JJ68", + "JJ69", + "JJ71", + "JJ72", + "JJ73", + "JJ74", + "JJ75", + "JJ76", + "JJ77", + "JJ78", + "JJ79", + "JJ81", + "JJ82", + "JJ83", + "JK60", + "JK61", + "JK70", + "JK71", + "JK72", + "JK73" + ], + "prefix": ["TJ"], + "worked": false, + "confirmed": false, + "flag": "cm.png", + "pp": "TJ", + "lat": 4.93216889334677, + "lon": 11.790123456790118, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "323": { + "dxcc": "408", + "cc": "CF", + "ccc": "CAF", + "name": "中非共和国", + "continent": "AF", + "ituzone": ["47"], + "cqzone": ["36"], + "timezone": "1", + "ccode": "140", + "aname": "Central Africa", + "mh": [ + "JJ73", + "JJ74", + "JJ75", + "JJ76", + "JJ77", + "JJ82", + "JJ83", + "JJ84", + "JJ85", + "JJ86", + "JJ87", + "JJ88", + "JJ93", + "JJ94", + "JJ95", + "JJ96", + "JJ97", + "JJ98", + "JJ99", + "KJ04", + "KJ05", + "KJ06", + "KJ07", + "KJ08", + "KJ09", + "KJ14", + "KJ15", + "KJ16", + "KJ17", + "KJ18", + "KJ19", + "KJ24", + "KJ25", + "KJ26", + "KJ27", + "KJ28", + "KJ35", + "KJ36", + "KJ37", + "KK00", + "KK10", + "KK11" + ], + "prefix": ["TL"], + "worked": false, + "confirmed": false, + "flag": "cf.png", + "pp": "TL", + "lat": 6.95133362974633, + "lon": 20.60356652949245, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "324": { + "dxcc": "409", + "cc": "CV", + "ccc": "CPV", + "name": "佛得角", + "continent": "AF", + "ituzone": ["46"], + "cqzone": ["35"], + "timezone": "-2", + "ccode": "132", + "aname": "Cape Verde", + "mh": ["HK74", "HK75", "HK76", "HK77", "HK84", "HK85", "HK86"], + "prefix": ["D4"], + "worked": false, + "confirmed": false, + "flag": "cv.png", + "pp": "D4", + "lat": 16.13363354498911, + "lon": -24.060356652949245, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "325": { + "dxcc": "410", + "cc": "TD", + "ccc": "TCD", + "name": "乍得", + "continent": "AF", + "ituzone": ["47"], + "cqzone": ["36"], + "timezone": "1", + "ccode": "148", + "aname": "Chad", + "mh": [ + "JJ69", + "JJ77", + "JJ78", + "JJ79", + "JJ87", + "JJ88", + "JJ89", + "JJ97", + "JJ98", + "JJ99", + "JK63", + "JK64", + "JK65", + "JK70", + "JK71", + "JK72", + "JK73", + "JK74", + "JK75", + "JK76", + "JK77", + "JK78", + "JK79", + "JK80", + "JK81", + "JK82", + "JK83", + "JK84", + "JK85", + "JK86", + "JK87", + "JK88", + "JK89", + "JK90", + "JK91", + "JK92", + "JK93", + "JK94", + "JK95", + "JK96", + "JK97", + "JK98", + "JK99", + "JL70", + "JL71", + "JL72", + "JL73", + "JL80", + "JL81", + "JL82", + "JL83", + "JL90", + "JL91", + "JL92", + "KJ09", + "KK00", + "KK01", + "KK02", + "KK03", + "KK04", + "KK05", + "KK06", + "KK07", + "KK08", + "KK09", + "KK10", + "KK11", + "KK12", + "KK13", + "KK14", + "KK15", + "KK16", + "KK17", + "KK18", + "KK19", + "KK26", + "KK27", + "KK28", + "KK29", + "KL00", + "KL01", + "KL10" + ], + "prefix": ["TT"], + "worked": false, + "confirmed": false, + "flag": "td.png", + "pp": "TT", + "lat": 14.652442383493721, + "lon": 18.580246913580243, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "326": { + "dxcc": "411", + "cc": "KM", + "ccc": "COM", + "name": "科摩罗", + "continent": "AF", + "ituzone": ["53"], + "cqzone": ["39"], + "timezone": "3", + "ccode": "174", + "aname": "Comoros", + "mh": ["LH17", "LH18", "LH27"], + "prefix": ["D6"], + "worked": false, + "confirmed": false, + "flag": "km.png", + "pp": "D6", + "lat": -12.269113986095064, + "lon": 43.68846212467611, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "327": { + "dxcc": "412", + "cc": "CG", + "ccc": "COG", + "name": "刚果共和国", + "continent": "AF", + "ituzone": ["52"], + "cqzone": ["36"], + "timezone": "1", + "ccode": "178", + "aname": "Republic of the Congo", + "mh": [ + "JI54", + "JI55", + "JI56", + "JI57", + "JI64", + "JI65", + "JI66", + "JI67", + "JI69", + "JI75", + "JI76", + "JI77", + "JI78", + "JI79", + "JI86", + "JI87", + "JI88", + "JI89", + "JJ60", + "JJ61", + "JJ62", + "JJ70", + "JJ71", + "JJ72", + "JJ80", + "JJ81", + "JJ82", + "JJ83", + "JJ91", + "JJ92", + "JJ93" + ], + "prefix": ["TN"], + "worked": false, + "confirmed": false, + "flag": "cg.png", + "pp": "TN", + "lat": -1.6047284291759212, + "lon": 15.246913580246915, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "328": { + "dxcc": "414", + "cc": "CD", + "ccc": "COD", + "name": "刚果民主共和国", + "continent": "AF", + "ituzone": ["52"], + "cqzone": ["36"], + "timezone": "1", + "ccode": "180", + "aname": "Democratic Republic of the Congo", + "mh": [ + "JI63", + "JI64", + "JI65", + "JI74", + "JI75", + "JI76", + "JI81", + "JI82", + "JI83", + "JI84", + "JI85", + "JI86", + "JI87", + "JI88", + "JI89", + "JI91", + "JI92", + "JI93", + "JI94", + "JI95", + "JI96", + "JI97", + "JI98", + "JI99", + "JJ80", + "JJ81", + "JJ90", + "JJ91", + "JJ92", + "JJ93", + "JJ94", + "JJ95", + "KH18", + "KH19", + "KH28", + "KH29", + "KH37", + "KH38", + "KH39", + "KH46", + "KH47", + "KH48", + "KH49", + "KI00", + "KI01", + "KI02", + "KI03", + "KI04", + "KI05", + "KI06", + "KI07", + "KI08", + "KI09", + "KI10", + "KI11", + "KI12", + "KI13", + "KI14", + "KI15", + "KI16", + "KI17", + "KI18", + "KI19", + "KI20", + "KI21", + "KI22", + "KI23", + "KI24", + "KI25", + "KI26", + "KI27", + "KI28", + "KI29", + "KI30", + "KI31", + "KI32", + "KI33", + "KI34", + "KI35", + "KI36", + "KI37", + "KI38", + "KI39", + "KI40", + "KI41", + "KI42", + "KI43", + "KI44", + "KI45", + "KI46", + "KI47", + "KI48", + "KI49", + "KI51", + "KI52", + "KI53", + "KJ00", + "KJ01", + "KJ02", + "KJ03", + "KJ04", + "KJ10", + "KJ11", + "KJ12", + "KJ13", + "KJ14", + "KJ20", + "KJ21", + "KJ22", + "KJ23", + "KJ24", + "KJ25", + "KJ30", + "KJ31", + "KJ32", + "KJ33", + "KJ34", + "KJ35", + "KJ40", + "KJ41", + "KJ42", + "KJ43", + "KJ44", + "KJ50", + "KJ51", + "KJ52", + "KJ53", + "KJ54" + ], + "prefix": ["9O", "9P", "9Q", "9R", "9S", "9T"], + "worked": false, + "confirmed": false, + "flag": "cd.png", + "pp": "9Q", + "lat": -1.1110414749008868, + "lon": 24.30555555555555, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "329": { + "dxcc": "416", + "cc": "BJ", + "ccc": "BEN", + "name": "贝宁", + "continent": "AF", + "ituzone": ["46"], + "cqzone": ["35"], + "timezone": "0", + "ccode": "204", + "aname": "Benin", + "mh": [ + "JJ06", + "JJ07", + "JJ08", + "JJ09", + "JJ16", + "JJ17", + "JJ18", + "JJ19", + "JK00", + "JK01", + "JK10", + "JK11", + "JK12" + ], + "prefix": ["TY"], + "worked": false, + "confirmed": false, + "flag": "bj.png", + "pp": "TY", + "lat": 9.900069178012075, + "lon": 2.542295381801553, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "330": { + "dxcc": "420", + "cc": "GA", + "ccc": "GAB", + "name": "加蓬", + "continent": "AF", + "ituzone": ["52"], + "cqzone": ["36"], + "timezone": "1", + "ccode": "266", + "aname": "Gabon", + "mh": [ + "JI47", + "JI48", + "JI49", + "JI56", + "JI57", + "JI58", + "JI59", + "JI67", + "JI68", + "JI69", + "JI77", + "JI78", + "JI79", + "JJ40", + "JJ41", + "JJ50", + "JJ51", + "JJ52", + "JJ60", + "JJ61", + "JJ62", + "JJ70", + "JJ71" + ], + "prefix": ["TR"], + "worked": false, + "confirmed": false, + "flag": "ga.png", + "pp": "TR", + "lat": -0.37036779103594597, + "lon": 11.543209876543207, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "331": { + "dxcc": "422", + "cc": "GM", + "ccc": "GMB", + "name": "冈比亚", + "continent": "AF", + "ituzone": ["46"], + "cqzone": ["35"], + "timezone": "0", + "ccode": "270", + "aname": "The Gambia", + "mh": ["IK13", "IK23", "IK33"], + "prefix": ["C5", "=C56W/BI"], + "worked": false, + "confirmed": false, + "flag": "gm.png", + "pp": "C5", + "lat": 13.53488329107438, + "lon": -15.665294924554182, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "332": { + "dxcc": "424", + "cc": "GH", + "ccc": "GHA", + "name": "加纳", + "continent": "AF", + "ituzone": ["46"], + "cqzone": ["35"], + "timezone": "0", + "ccode": "288", + "aname": "Ghana", + "mh": [ + "IJ84", + "IJ85", + "IJ86", + "IJ87", + "IJ88", + "IJ89", + "IJ94", + "IJ95", + "IJ96", + "IJ97", + "IJ98", + "IJ99", + "IK80", + "IK81", + "IK90", + "IK91", + "JJ05", + "JJ06", + "JJ07", + "JJ08", + "JJ09", + "JK00", + "JK01" + ], + "prefix": ["9G"], + "worked": false, + "confirmed": false, + "flag": "gh.png", + "pp": "9G", + "lat": 7.80383413260266, + "lon": -1.152263374485597, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "333": { + "dxcc": "428", + "cc": "CI", + "ccc": "CIV", + "name": "象牙海岸", + "continent": "AF", + "ituzone": ["46"], + "cqzone": ["35"], + "timezone": "0", + "ccode": "384", + "aname": "Cote d'Ivorie", + "mh": [ + "IJ56", + "IJ57", + "IJ58", + "IJ59", + "IJ64", + "IJ65", + "IJ66", + "IJ67", + "IJ68", + "IJ69", + "IJ74", + "IJ75", + "IJ76", + "IJ77", + "IJ78", + "IJ79", + "IJ85", + "IJ86", + "IJ87", + "IJ88", + "IJ89", + "IK50", + "IK60", + "IK70" + ], + "prefix": ["TU"], + "worked": false, + "confirmed": false, + "flag": "ci.png", + "pp": "TU", + "lat": 7.513806691658928, + "lon": -5.651577503429356, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "334": { + "dxcc": "430", + "cc": "KE", + "ccc": "KEN", + "name": "肯尼亚", + "continent": "AF", + "ituzone": ["48"], + "cqzone": ["37"], + "timezone": "3", + "ccode": "404", + "aname": "Kenya", + "mh": [ + "KI68", + "KI69", + "KI77", + "KI78", + "KI79", + "KI86", + "KI87", + "KI88", + "KI89", + "KI95", + "KI96", + "KI97", + "KI98", + "KI99", + "KJ60", + "KJ70", + "KJ71", + "KJ72", + "KJ73", + "KJ74", + "KJ80", + "KJ81", + "KJ82", + "KJ83", + "KJ84", + "KJ90", + "KJ91", + "KJ92", + "KJ93", + "LI06", + "LI07", + "LI08", + "LI09", + "LJ00", + "LJ01", + "LJ02", + "LJ03", + "LJ04" + ], + "prefix": ["5Y", "5Z", "=5Z4IC/Y2K", "=5Z4RT/Y2K"], + "worked": false, + "confirmed": false, + "flag": "ke.png", + "pp": "5Z", + "lat": 0.4938210465655857, + "lon": 38.21673525377229, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "335": { + "dxcc": "432", + "cc": "LS", + "ccc": "LSO", + "name": "莱索托", + "continent": "AF", + "ituzone": ["57"], + "cqzone": ["38"], + "timezone": "2", + "ccode": "426", + "aname": "Lesotho", + "mh": ["KF39", "KF49", "KG30", "KG31", "KG40", "KG41"], + "prefix": ["7P"], + "worked": false, + "confirmed": false, + "flag": "ls.png", + "pp": "7P", + "lat": -29.57885705019254, + "lon": 28.333333333333332, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "336": { + "dxcc": "434", + "cc": "LR", + "ccc": "LBR", + "name": "利比里亚", + "continent": "AF", + "ituzone": ["46"], + "cqzone": ["35"], + "timezone": "-1", + "ccode": "430", + "aname": "Liberia", + "mh": [ + "IJ45", + "IJ46", + "IJ47", + "IJ48", + "IJ54", + "IJ55", + "IJ56", + "IJ57", + "IJ58", + "IJ64", + "IJ65", + "IJ66" + ], + "prefix": ["5L", "5M", "6Z", "A8", "D5", "EL"], + "worked": false, + "confirmed": false, + "flag": "lr.png", + "pp": "EL", + "lat": 6.351832584684217, + "lon": -9.455875628715136, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "337": { + "dxcc": "436", + "cc": "LY", + "ccc": "LBY", + "name": "利比亚", + "continent": "AF", + "ituzone": ["38"], + "cqzone": ["34"], + "timezone": "2", + "ccode": "434", + "aname": "Libya", + "mh": [ + "JL45", + "JL46", + "JL47", + "JL48", + "JL49", + "JL53", + "JL54", + "JL55", + "JL56", + "JL57", + "JL58", + "JL59", + "JL62", + "JL63", + "JL64", + "JL65", + "JL66", + "JL67", + "JL68", + "JL69", + "JL72", + "JL73", + "JL74", + "JL75", + "JL76", + "JL77", + "JL78", + "JL79", + "JL82", + "JL83", + "JL84", + "JL85", + "JL86", + "JL87", + "JL88", + "JL89", + "JL91", + "JL92", + "JL93", + "JL94", + "JL95", + "JL96", + "JL97", + "JL98", + "JL99", + "JM40", + "JM50", + "JM51", + "JM52", + "JM53", + "JM60", + "JM61", + "JM62", + "JM63", + "JM70", + "JM71", + "JM72", + "JM80", + "JM81", + "JM90", + "JM91", + "JM92", + "KK19", + "KL00", + "KL01", + "KL02", + "KL03", + "KL04", + "KL05", + "KL06", + "KL07", + "KL08", + "KL09", + "KL10", + "KL11", + "KL12", + "KL13", + "KL14", + "KL15", + "KL16", + "KL17", + "KL18", + "KL19", + "KL20", + "KL21", + "KL22", + "KL23", + "KL24", + "KL25", + "KL26", + "KL27", + "KL28", + "KL29", + "KM00", + "KM01", + "KM02", + "KM10", + "KM11", + "KM12", + "KM20", + "KM21", + "KM22" + ], + "prefix": ["5A"], + "worked": false, + "confirmed": false, + "flag": "ly.png", + "pp": "5A", + "lat": 26.749486242451, + "lon": 17.962962962962965, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "338": { + "dxcc": "438", + "cc": "MG", + "ccc": "MDG", + "name": "马达加斯加", + "continent": "AF", + "ituzone": ["53"], + "cqzone": ["39"], + "timezone": "3", + "ccode": "450", + "aname": "Madagascar", + "mh": [ + "LG15", + "LG16", + "LG17", + "LG18", + "LG19", + "LG24", + "LG25", + "LG26", + "LG27", + "LG28", + "LG29", + "LG34", + "LG35", + "LG36", + "LG37", + "LG38", + "LG39", + "LG47", + "LG48", + "LG49", + "LH12", + "LH20", + "LH21", + "LH22", + "LH23", + "LH24", + "LH30", + "LH31", + "LH32", + "LH33", + "LH34", + "LH35", + "LH36", + "LH40", + "LH41", + "LH42", + "LH43", + "LH44", + "LH45", + "LH46", + "LH47", + "LH53", + "LH54", + "LH55", + "LH56" + ], + "prefix": ["5R", "5S", "6X"], + "worked": false, + "confirmed": false, + "flag": "mg.png", + "pp": "5R", + "lat": -19.889828651386225, + "lon": 46.22770919067215, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "339": { + "dxcc": "440", + "cc": "MW", + "ccc": "MWI", + "name": "马拉维", + "continent": "AF", + "ituzone": ["53"], + "cqzone": ["37"], + "timezone": "2", + "ccode": "454", + "aname": "Malawi", + "mh": [ + "KH65", + "KH66", + "KH67", + "KH68", + "KH69", + "KH72", + "KH73", + "KH74", + "KH75", + "KH76", + "KH77", + "KH78", + "KH79", + "KI60", + "KI70" + ], + "prefix": ["7Q"], + "worked": false, + "confirmed": false, + "flag": "mw.png", + "pp": "7Q", + "lat": -13.16117210187521, + "lon": 33.77229080932784, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "340": { + "dxcc": "442", + "cc": "ML", + "ccc": "MLI", + "name": "马里", + "continent": "AF", + "ituzone": ["46"], + "cqzone": ["35"], + "timezone": "0", + "ccode": "466", + "aname": "Mali", + "mh": [ + "IK33", + "IK34", + "IK41", + "IK42", + "IK43", + "IK44", + "IK45", + "IK50", + "IK51", + "IK52", + "IK53", + "IK54", + "IK55", + "IK60", + "IK61", + "IK62", + "IK63", + "IK64", + "IK65", + "IK69", + "IK70", + "IK71", + "IK72", + "IK73", + "IK74", + "IK75", + "IK76", + "IK77", + "IK78", + "IK79", + "IK83", + "IK84", + "IK85", + "IK86", + "IK87", + "IK88", + "IK89", + "IK94", + "IK95", + "IK96", + "IK97", + "IK98", + "IK99", + "IL60", + "IL61", + "IL62", + "IL63", + "IL64", + "IL70", + "IL71", + "IL72", + "IL73", + "IL74", + "IL80", + "IL81", + "IL82", + "IL83", + "IL84", + "IL90", + "IL91", + "IL92", + "IL93", + "JK04", + "JK05", + "JK06", + "JK07", + "JK08", + "JK09", + "JK15", + "JK16", + "JK17", + "JK18", + "JK19", + "JK26", + "JK27", + "JK28", + "JK29", + "JL00", + "JL01", + "JL10" + ], + "prefix": ["TZ"], + "worked": false, + "confirmed": false, + "flag": "ml.png", + "pp": "TZ", + "lat": 16.922663320881128, + "lon": -1.7832647462277063, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "341": { + "dxcc": "444", + "cc": "MR", + "ccc": "MRT", + "name": "毛里塔尼亚", + "continent": "AF", + "ituzone": ["46"], + "cqzone": ["35"], + "timezone": "-1", + "ccode": "478", + "aname": "Mauritania", + "mh": [ + "IK16", + "IK17", + "IK18", + "IK19", + "IK26", + "IK27", + "IK28", + "IK29", + "IK34", + "IK35", + "IK36", + "IK37", + "IK38", + "IK39", + "IK44", + "IK45", + "IK46", + "IK47", + "IK48", + "IK49", + "IK55", + "IK56", + "IK57", + "IK58", + "IK59", + "IK65", + "IK66", + "IK67", + "IK68", + "IK69", + "IK75", + "IK76", + "IK77", + "IK78", + "IK79", + "IL10", + "IL11", + "IL20", + "IL21", + "IL30", + "IL31", + "IL32", + "IL33", + "IL40", + "IL41", + "IL42", + "IL43", + "IL44", + "IL45", + "IL50", + "IL51", + "IL52", + "IL53", + "IL54", + "IL55", + "IL56", + "IL57", + "IL60", + "IL61", + "IL62", + "IL63", + "IL64", + "IL65", + "IL66", + "IL75" + ], + "prefix": ["5T"], + "worked": false, + "confirmed": false, + "flag": "mr.png", + "pp": "5T", + "lat": 19.683308045399514, + "lon": -10.562414266117969, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "342": { + "dxcc": "446", + "cc": "MA", + "ccc": "MAR", + "name": "摩洛哥", + "continent": "AF", + "ituzone": ["37"], + "cqzone": ["33"], + "timezone": "0", + "ccode": "504", + "aname": "Morocco", + "mh": [ + "IL37", + "IL38", + "IL47", + "IL48", + "IL49", + "IL57", + "IL58", + "IL59", + "IL69", + "IL79", + "IM50", + "IM51", + "IM52", + "IM53", + "IM60", + "IM61", + "IM62", + "IM63", + "IM64", + "IM65", + "IM70", + "IM71", + "IM72", + "IM73", + "IM74", + "IM75", + "IM80", + "IM81", + "IM82", + "IM83", + "IM84", + "IM85", + "IM92", + "IM93", + "IM94" + ], + "prefix": ["5C", "5D", "5E", "5F", "5G", "CN"], + "worked": false, + "confirmed": false, + "flag": "ma.png", + "pp": "CN", + "lat": 28.68018729419576, + "lon": -10.082304526748976, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "343": { + "dxcc": "450", + "cc": "NG", + "ccc": "NGA", + "name": "尼日利亚", + "continent": "AF", + "ituzone": ["46"], + "cqzone": ["35"], + "timezone": "1", + "ccode": "566", + "aname": "Nigeria", + "mh": [ + "JJ16", + "JJ17", + "JJ18", + "JJ19", + "JJ24", + "JJ25", + "JJ26", + "JJ27", + "JJ28", + "JJ29", + "JJ34", + "JJ35", + "JJ36", + "JJ37", + "JJ38", + "JJ39", + "JJ44", + "JJ45", + "JJ46", + "JJ47", + "JJ48", + "JJ49", + "JJ56", + "JJ57", + "JJ58", + "JJ59", + "JJ67", + "JJ68", + "JJ69", + "JK10", + "JK11", + "JK12", + "JK13", + "JK20", + "JK21", + "JK22", + "JK23", + "JK30", + "JK31", + "JK32", + "JK33", + "JK40", + "JK41", + "JK42", + "JK43", + "JK50", + "JK51", + "JK52", + "JK53", + "JK60", + "JK61", + "JK62", + "JK63", + "JK71", + "JK72", + "JK73" + ], + "prefix": ["5N", "5O"], + "worked": false, + "confirmed": false, + "flag": "ng.png", + "pp": "5N", + "lat": 9.827991116821238, + "lon": 8.827160493827154, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "344": { + "dxcc": "452", + "cc": "ZW", + "ccc": "ZWE", + "name": "津巴布韦", + "continent": "AF", + "ituzone": ["53"], + "cqzone": ["38"], + "timezone": "2", + "ccode": "716", + "aname": "Zimbabwe", + "mh": [ + "KG38", + "KG39", + "KG47", + "KG48", + "KG49", + "KG57", + "KG58", + "KG59", + "KG68", + "KG69", + "KH20", + "KH21", + "KH22", + "KH30", + "KH31", + "KH32", + "KH33", + "KH40", + "KH41", + "KH42", + "KH43", + "KH44", + "KH50", + "KH51", + "KH52", + "KH53", + "KH54", + "KH60", + "KH61", + "KH62", + "KH63" + ], + "prefix": ["Z2", "=Z21KD/L", "=Z27JAM/J"], + "worked": false, + "confirmed": false, + "flag": "zw.png", + "pp": "Z2", + "lat": -18.204271308671764, + "lon": 29.32098765432099, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "345": { + "dxcc": "453", + "cc": "RE", + "ccc": "REU", + "name": "留尼旺岛", + "continent": "AF", + "ituzone": ["53"], + "cqzone": ["39"], + "timezone": "4", + "ccode": "638", + "aname": "Reunion I.", + "mh": ["LG78", "LG79"], + "prefix": [ + "FR", + "=TO019IEEE", + "=TO0FAR", + "=TO0MPB", + "=TO0R", + "=TO19A", + "=TO1PF", + "=TO1PF/P", + "=TO1TAAF", + "=TO2R", + "=TO2R/P", + "=TO2Z", + "=TO3R", + "=TO5R", + "=TO7CC", + "=TO90R" + ], + "worked": false, + "confirmed": false, + "flag": "re.png", + "pp": "FR", + "lat": -21.020822423114538, + "lon": 55.50068587105625, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "346": { + "dxcc": "454", + "cc": "RW", + "ccc": "RWA", + "name": "卢旺达", + "continent": "AF", + "ituzone": ["52"], + "cqzone": ["36"], + "timezone": "3", + "ccode": "646", + "aname": "Rwanda", + "mh": ["KI47", "KI48", "KI57", "KI58"], + "prefix": ["9X"], + "worked": false, + "confirmed": false, + "flag": "rw.png", + "pp": "9X", + "lat": -1.8652397220492816, + "lon": 29.82167352537723, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "347": { + "dxcc": "456", + "cc": "SN", + "ccc": "SEN", + "name": "塞内加尔", + "continent": "AF", + "ituzone": ["46"], + "cqzone": ["35"], + "timezone": "0", + "ccode": "686", + "aname": "Senegal", + "mh": [ + "IK12", + "IK13", + "IK14", + "IK15", + "IK16", + "IK22", + "IK23", + "IK24", + "IK25", + "IK26", + "IK32", + "IK33", + "IK34", + "IK35", + "IK36", + "IK42", + "IK43", + "IK44" + ], + "prefix": ["6V", "6W"], + "worked": false, + "confirmed": false, + "flag": "sn.png", + "pp": "6W", + "lat": 14.758587038281874, + "lon": -14.458161865569272, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "348": { + "dxcc": "458", + "cc": "SL", + "ccc": "SLE", + "name": "塞拉利昂", + "continent": "AF", + "ituzone": ["46"], + "cqzone": ["35"], + "timezone": "0", + "ccode": "694", + "aname": "Sierra Leone", + "mh": ["IJ37", "IJ38", "IJ39", "IJ46", "IJ47", "IJ48", "IJ49"], + "prefix": ["9L"], + "worked": false, + "confirmed": false, + "flag": "sl.png", + "pp": "9L", + "lat": 8.455649656633867, + "lon": -11.796982167352537, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "349": { + "dxcc": "460", + "cc": "FJ", + "ccc": "FJI", + "name": "罗图马岛", + "continent": "OC", + "ituzone": ["56"], + "cqzone": ["32"], + "timezone": "12", + "ccode": "242", + "aname": "Rotuma I.", + "mh": ["RH87"], + "prefix": [ + "=3D2AG/P", + "=3D2EU", + "=3D2GC/P", + "=3D2HY/R", + "=3D2NV/P", + "=3D2NV/R", + "=3D2R", + "=3D2RA", + "=3D2RI", + "=3D2RO", + "=3D2RR", + "=3D2RX", + "=3D2VB/R" + ], + "worked": false, + "confirmed": false, + "flag": "fj.png", + "pp": "3D2/r", + "lat": -12.412052317734833, + "lon": 177.07818930041154, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "350": { + "dxcc": "462", + "cc": "ZA", + "ccc": "ZAF", + "name": "南非", + "continent": "AF", + "ituzone": ["57"], + "cqzone": ["38"], + "timezone": "2", + "ccode": "710", + "aname": "South Africa", + "mh": [ + "JF86", + "JF87", + "JF88", + "JF89", + "JF95", + "JF96", + "JF97", + "JF98", + "JF99", + "JG80", + "JG81", + "JG90", + "JG91", + "KF05", + "KF06", + "KF07", + "KF08", + "KF09", + "KF15", + "KF16", + "KF17", + "KF18", + "KF19", + "KF25", + "KF26", + "KF27", + "KF28", + "KF29", + "KF36", + "KF37", + "KF38", + "KF39", + "KF47", + "KF48", + "KF49", + "KF58", + "KF59", + "KG00", + "KG01", + "KG02", + "KG03", + "KG04", + "KG05", + "KG10", + "KG11", + "KG12", + "KG13", + "KG14", + "KG20", + "KG21", + "KG22", + "KG23", + "KG24", + "KG25", + "KG30", + "KG31", + "KG32", + "KG33", + "KG34", + "KG35", + "KG36", + "KG37", + "KG40", + "KG41", + "KG42", + "KG43", + "KG44", + "KG45", + "KG46", + "KG47", + "KG50", + "KG51", + "KG52", + "KG53", + "KG54", + "KG55", + "KG56", + "KG57", + "KG61", + "KG62", + "KG63", + "KG64", + "KG65" + ], + "prefix": [ + "H5", + "S4", + "S8", + "V9", + "ZR", + "ZS", + "=ZS1BAK/L", + "=ZS1CT/L", + "=ZS1CT/LH", + "=ZS1ESC/L", + "=ZS1ESC/LH", + "=ZS1FRC/L", + "=ZS1FRC/LH", + "=ZS1OAK/LH", + "=ZS1OAR/LH", + "=ZS1SKR/LH", + "=ZS1YVP/LH", + "=ZS2CR/YL", + "=ZS5T/L", + "=ZS5ZLB/L", + "=ZS6AUH/L", + "=ZS6BXN/L", + "=ZS6LCM/L", + "=ZS6STN/L", + "=ZS6WR/L", + "=ZS6WRL/L", + "=ZS70BAK", + "=ZS70BAK/L", + "=ZS71SIG", + "=ZS75PTA", + "=ZS80VT", + "=ZS85SARL", + "ZT", + "ZU" + ], + "worked": false, + "confirmed": false, + "flag": "za.png", + "pp": "ZS", + "lat": -30.007410952612716, + "lon": 21.790123456790127, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "351": { + "dxcc": "464", + "cc": "NA", + "ccc": "NAM", + "name": "纳米比亚", + "continent": "AF", + "ituzone": ["57"], + "cqzone": ["38"], + "timezone": "2", + "ccode": "516", + "aname": "Namibia", + "mh": [ + "JG68", + "JG69", + "JG71", + "JG72", + "JG73", + "JG74", + "JG75", + "JG76", + "JG77", + "JG78", + "JG79", + "JG81", + "JG82", + "JG83", + "JG84", + "JG85", + "JG86", + "JG87", + "JG88", + "JG89", + "JG91", + "JG92", + "JG93", + "JG94", + "JG95", + "JG96", + "JG97", + "JG98", + "JG99", + "JH51", + "JH52", + "JH60", + "JH61", + "JH62", + "JH63", + "JH70", + "JH71", + "JH72", + "JH80", + "JH81", + "JH82", + "JH90", + "JH91", + "JH92", + "KG08", + "KG09", + "KH00", + "KH01", + "KH02", + "KH11", + "KH12", + "KH21", + "KH22" + ], + "prefix": [ + "V5", + "=V51AS/L", + "=V51NAM/L", + "=V51NAM/LH", + "=V51WW/L", + "=V51WW/LH", + "=V55V/LH", + "=V59PP/L", + "=V59SWK/L", + "=V59SWK/LH" + ], + "worked": false, + "confirmed": false, + "flag": "na.png", + "pp": "V5", + "lat": -22.257606470827625, + "lon": 16.60493827160494, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "352": { + "dxcc": "466", + "cc": "SD", + "ccc": "SDN", + "name": "苏丹", + "continent": "AF", + "ituzone": ["47", "48"], + "cqzone": ["34"], + "timezone": "2", + "ccode": "736", + "aname": "Sudan", + "mh": [ + "KJ19", + "KJ29", + "KJ39", + "KJ49", + "KJ59", + "KJ69", + "KJ79", + "KK02", + "KK03", + "KK10", + "KK11", + "KK12", + "KK13", + "KK14", + "KK15", + "KK20", + "KK21", + "KK22", + "KK23", + "KK24", + "KK25", + "KK26", + "KK27", + "KK28", + "KK29", + "KK30", + "KK31", + "KK32", + "KK33", + "KK34", + "KK35", + "KK36", + "KK37", + "KK38", + "KK39", + "KK40", + "KK41", + "KK42", + "KK43", + "KK44", + "KK45", + "KK46", + "KK47", + "KK48", + "KK49", + "KK50", + "KK51", + "KK52", + "KK53", + "KK54", + "KK55", + "KK56", + "KK57", + "KK58", + "KK59", + "KK60", + "KK61", + "KK62", + "KK63", + "KK64", + "KK65", + "KK66", + "KK67", + "KK68", + "KK69", + "KK70", + "KK71", + "KK72", + "KK73", + "KK74", + "KK75", + "KK76", + "KK77", + "KK78", + "KK79", + "KK82", + "KK83", + "KK84", + "KK85", + "KK86", + "KK87", + "KK88", + "KK89", + "KK97", + "KK98", + "KL20", + "KL21", + "KL22", + "KL30", + "KL31", + "KL32", + "KL40", + "KL41", + "KL42", + "KL50", + "KL51", + "KL52", + "KL60", + "KL61", + "KL70", + "KL71", + "KL80", + "KL81" + ], + "prefix": ["6T", "6U", "ST"], + "worked": false, + "confirmed": false, + "flag": "sd.png", + "pp": "ST", + "lat": 17.499200403619042, + "lon": 30.972222222222218, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "353": { + "dxcc": "468", + "cc": "SZ", + "ccc": "SWZ", + "name": "斯瓦蒂尼", + "continent": "AF", + "ituzone": ["57"], + "cqzone": ["38"], + "timezone": "2", + "ccode": "748", + "aname": "Swaziland", + "mh": ["KG52", "KG53", "KG54", "KG62", "KG63", "KG64"], + "prefix": ["3DA"], + "worked": false, + "confirmed": false, + "flag": "sz.png", + "pp": "3DA", + "lat": -26.49195793994481, + "lon": 31.30315500685871, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "354": { + "dxcc": "470", + "cc": "TZ", + "ccc": "TZA", + "name": "坦桑尼亚", + "continent": "AF", + "ituzone": ["53"], + "cqzone": ["37"], + "timezone": "3", + "ccode": "834", + "aname": "Tanzania", + "mh": [ + "KH78", + "KH79", + "KH88", + "KH89", + "KH98", + "KH99", + "KI43", + "KI44", + "KI45", + "KI50", + "KI51", + "KI52", + "KI53", + "KI54", + "KI55", + "KI56", + "KI57", + "KI58", + "KI59", + "KI60", + "KI61", + "KI62", + "KI63", + "KI64", + "KI65", + "KI66", + "KI67", + "KI68", + "KI70", + "KI71", + "KI72", + "KI73", + "KI74", + "KI75", + "KI76", + "KI77", + "KI78", + "KI80", + "KI81", + "KI82", + "KI83", + "KI84", + "KI85", + "KI86", + "KI87", + "KI90", + "KI91", + "KI92", + "KI93", + "KI94", + "KI95", + "KI96", + "LH09" + ], + "prefix": ["5H", "5I"], + "worked": false, + "confirmed": false, + "flag": "tz.png", + "pp": "5H", + "lat": -6.515404929830993, + "lon": 34.48559670781893, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "355": { + "dxcc": "474", + "cc": "TN", + "ccc": "TUN", + "name": "突尼斯", + "continent": "AF", + "ituzone": ["37"], + "cqzone": ["33"], + "timezone": "1", + "ccode": "788", + "aname": "Tunisia", + "mh": [ + "JM33", + "JM34", + "JM40", + "JM41", + "JM42", + "JM43", + "JM44", + "JM45", + "JM46", + "JM47", + "JM50", + "JM51", + "JM52", + "JM53", + "JM54", + "JM55", + "JM56", + "JM57" + ], + "prefix": ["3V", "=3V8CB/J", "=3V8ST/J", "TS"], + "worked": false, + "confirmed": false, + "flag": "tn.png", + "pp": "3V", + "lat": 34.393144339806355, + "lon": 9.320987654320989, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "356": { + "dxcc": "478", + "cc": "EG", + "ccc": "EGY", + "name": "埃及", + "continent": "AF", + "ituzone": ["38"], + "cqzone": ["34"], + "timezone": "2", + "ccode": "818", + "aname": "Egypt", + "mh": [ + "KL21", + "KL22", + "KL23", + "KL24", + "KL25", + "KL26", + "KL27", + "KL28", + "KL29", + "KL31", + "KL32", + "KL33", + "KL34", + "KL35", + "KL36", + "KL37", + "KL38", + "KL39", + "KL41", + "KL42", + "KL43", + "KL44", + "KL45", + "KL46", + "KL47", + "KL48", + "KL49", + "KL51", + "KL52", + "KL53", + "KL54", + "KL55", + "KL56", + "KL57", + "KL58", + "KL59", + "KL61", + "KL62", + "KL63", + "KL64", + "KL65", + "KL66", + "KL67", + "KL68", + "KL69", + "KL71", + "KL72", + "KL73", + "KL74", + "KL75", + "KL76", + "KL77", + "KL78", + "KL79", + "KL81", + "KL82", + "KM20", + "KM21", + "KM30", + "KM31", + "KM40", + "KM41", + "KM50", + "KM51", + "KM60", + "KM61", + "KM70", + "KM71" + ], + "prefix": ["6A", "6B", "SS", "SU"], + "worked": false, + "confirmed": false, + "flag": "eg.png", + "pp": "SU", + "lat": 26.573775785924298, + "lon": 30.013717421124827, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "357": { + "dxcc": "480", + "cc": "BF", + "ccc": "BFA", + "name": "布吉那法索", + "continent": "AF", + "ituzone": ["46"], + "cqzone": ["35"], + "timezone": "0", + "ccode": "854", + "aname": "Burkina Faso", + "mh": [ + "IJ79", + "IJ89", + "IK70", + "IK71", + "IK72", + "IK73", + "IK80", + "IK81", + "IK82", + "IK83", + "IK84", + "IK90", + "IK91", + "IK92", + "IK93", + "IK94", + "IK95", + "JK00", + "JK01", + "JK02", + "JK03", + "JK04", + "JK11", + "JK12" + ], + "prefix": ["XT"], + "worked": false, + "confirmed": false, + "flag": "bf.png", + "pp": "XT", + "lat": 12.679849610748022, + "lon": -1.7283950617283945, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "358": { + "dxcc": "482", + "cc": "ZM", + "ccc": "ZMB", + "name": "赞比亚", + "continent": "AF", + "ituzone": ["53"], + "cqzone": ["36"], + "timezone": "2", + "ccode": "894", + "aname": "Zambia", + "mh": [ + "KH12", + "KH13", + "KH14", + "KH15", + "KH16", + "KH17", + "KH18", + "KH19", + "KH22", + "KH23", + "KH24", + "KH25", + "KH26", + "KH27", + "KH28", + "KH29", + "KH31", + "KH32", + "KH33", + "KH34", + "KH35", + "KH36", + "KH37", + "KH38", + "KH43", + "KH44", + "KH45", + "KH46", + "KH47", + "KH48", + "KH49", + "KH54", + "KH55", + "KH56", + "KH57", + "KH58", + "KH59", + "KH65", + "KH66", + "KH67", + "KH68", + "KH69", + "KI40", + "KI41", + "KI50", + "KI51", + "KI60" + ], + "prefix": ["=4U/ON6TT/M", "9I", "9J"], + "worked": false, + "confirmed": false, + "flag": "zm.png", + "pp": "9J", + "lat": -15.486912030365446, + "lon": 25.987654320987655, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "359": { + "dxcc": "483", + "cc": "TG", + "ccc": "TGO", + "name": "多哥", + "continent": "AF", + "ituzone": ["46"], + "cqzone": ["35"], + "timezone": "0", + "ccode": "768", + "aname": "Togo", + "mh": ["IK90", "IK91", "JJ06", "JJ07", "JJ08", "JJ09", "JK00", "JK01"], + "prefix": ["5V"], + "worked": false, + "confirmed": false, + "flag": "tg.png", + "pp": "5V", + "lat": 8.78114987659741, + "lon": 1.0425240054869676, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "361": { + "dxcc": "489", + "cc": "FJ", + "ccc": "FJI", + "name": "康威礁", + "continent": "OC", + "ituzone": ["56"], + "cqzone": ["32"], + "timezone": "12", + "ccode": "242", + "aname": "Conway Reef", + "mh": ["RG78"], + "prefix": ["=3D20CR", "=3D2C", "=3D2CI", "=3D2CR", "=3D2CY"], + "worked": false, + "confirmed": false, + "flag": "fj.png", + "pp": "3D2/c", + "lat": -21.761617869297453, + "lon": 174.6090534979424, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "362": { + "dxcc": "490", + "cc": "KI", + "ccc": "KIR", + "name": "巴纳巴岛", + "continent": "OC", + "ituzone": ["65"], + "cqzone": ["31"], + "timezone": "12", + "ccode": "296", + "aname": "Banaba I. (Ocean I.)", + "mh": ["RI49", "RJ40"], + "prefix": ["T33"], + "worked": false, + "confirmed": false, + "flag": "ki.png", + "pp": "T33", + "lat": -0.8291129611792343, + "lon": 169.51074531321444, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "363": { + "dxcc": "492", + "cc": "YE", + "ccc": "YEM", + "name": "也门", + "continent": "AS", + "ituzone": ["39"], + "cqzone": ["21"], + "timezone": "3", + "ccode": "887", + "aname": "Yemen", + "mh": [ + "LK12", + "LK13", + "LK14", + "LK15", + "LK16", + "LK17", + "LK22", + "LK23", + "LK24", + "LK25", + "LK26", + "LK27", + "LK33", + "LK34", + "LK35", + "LK36", + "LK37", + "LK43", + "LK44", + "LK45", + "LK46", + "LK47", + "LK48", + "LK54", + "LK55", + "LK56", + "LK57", + "LK58", + "LK62", + "LK65", + "LK66", + "LK67", + "LK68", + "LK72" + ], + "prefix": ["7O", "=7O2A", "=7O6T"], + "worked": false, + "confirmed": false, + "flag": "ye.png", + "pp": "7O", + "lat": 15.922686938745997, + "lon": 47.90123456790123, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "365": { + "dxcc": "497", + "cc": "HR", + "ccc": "HRV", + "name": "克罗地亚", + "continent": "EU", + "ituzone": ["28"], + "cqzone": ["15"], + "timezone": "1", + "ccode": "191", + "aname": "Croatia", + "mh": [ + "JN64", + "JN65", + "JN72", + "JN73", + "JN74", + "JN75", + "JN76", + "JN82", + "JN83", + "JN84", + "JN85", + "JN86", + "JN92", + "JN94", + "JN95" + ], + "prefix": [ + "9A", + "=9A/DL9CHR/LH", + "=9A/F5OGG/LH", + "=9A/IK3MZS/LH", + "=9A/IW3ILP/LH", + "=9A/OK1FZM/LH", + "=9A0CI/LH", + "=9A2MF/LH", + "=9A2MF/LT", + "=9A2WJ/LH", + "=9A3FO/P/LH", + "=9A3KB/LH", + "=9A3KR/LH", + "=9A5JR/LH", + "=9A5SM/YL", + "=9A5V/LH", + "=9A6AA/LH", + "=9A6PBT/YL", + "=9A70DP/KA", + "=9A70DP/PU", + "=9A70DP/RI", + "=9A70DP/ZG", + "=9A7K/LH", + "=9A7SSY/LH" + ], + "worked": false, + "confirmed": false, + "flag": "hr.png", + "pp": "9A", + "lat": 45.55300522131421, + "lon": 16.32677945435147, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "366": { + "dxcc": "499", + "cc": "SI", + "ccc": "SVN", + "name": "斯洛文尼亚", + "continent": "EU", + "ituzone": ["28"], + "cqzone": ["15"], + "timezone": "1", + "ccode": "705", + "aname": "Slovenia", + "mh": ["JN65", "JN66", "JN75", "JN76", "JN86"], + "prefix": [ + "S5", + "=S51LGT/LH", + "=S52AL/YL", + "=S52L/LH", + "=S58U/LH", + "=S59HIJ/LH" + ], + "worked": false, + "confirmed": false, + "flag": "si.png", + "pp": "S5", + "lat": 46.11370961664835, + "lon": 14.814814814814817, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "367": { + "dxcc": "501", + "cc": "BA", + "ccc": "BIH", + "name": "波斯尼亚和黑塞哥维那", + "continent": "EU", + "ituzone": ["28"], + "cqzone": ["15"], + "timezone": "1", + "ccode": "70", + "aname": "Bosnia-Herzegovina", + "mh": [ + "JN74", + "JN75", + "JN82", + "JN83", + "JN84", + "JN85", + "JN92", + "JN93", + "JN94", + "JN95" + ], + "prefix": ["E7", "=YU4WU"], + "worked": false, + "confirmed": false, + "flag": "ba.png", + "pp": "E7", + "lat": 44.43206068953518, + "lon": 17.814357567443988, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "368": { + "dxcc": "502", + "cc": "MK", + "ccc": "MKD", + "name": "北马其顿", + "continent": "EU", + "ituzone": ["28"], + "cqzone": ["15"], + "timezone": "1", + "ccode": "807", + "aname": "Macedonia", + "mh": ["KN00", "KN01", "KN02", "KN11", "KN12"], + "prefix": ["Z3"], + "worked": false, + "confirmed": false, + "flag": "mk.png", + "pp": "Z3", + "lat": 41.61598243937419, + "lon": 21.667428745618047, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "369": { + "dxcc": "503", + "cc": "CZ", + "ccc": "CZE", + "name": "捷克", + "continent": "EU", + "ituzone": ["28"], + "cqzone": ["15"], + "timezone": "1", + "ccode": "203", + "aname": "Czech Republic", + "mh": [ + "JN68", + "JN69", + "JN78", + "JN79", + "JN88", + "JN89", + "JN99", + "JO60", + "JO70", + "JO71", + "JO80", + "JO90" + ], + "prefix": [ + "OK", + "=OK1KCR/J", + "=OK1KI/YL", + "=OK6RA/APF", + "=OK9BAR/YL", + "OL", + "=OL0R/J" + ], + "worked": false, + "confirmed": false, + "flag": "cz.png", + "pp": "OK", + "lat": 49.916298425287124, + "lon": 15.246913580246918, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "370": { + "dxcc": "504", + "cc": "SK", + "ccc": "SVK", + "name": "斯洛伐克", + "continent": "EU", + "ituzone": ["28"], + "cqzone": ["15"], + "timezone": "1", + "ccode": "703", + "aname": "Slovak Republic", + "mh": [ + "JN87", + "JN88", + "JN89", + "JN97", + "JN98", + "JN99", + "KN08", + "KN09", + "KN18", + "KN19" + ], + "prefix": ["OM"], + "worked": false, + "confirmed": false, + "flag": "sk.png", + "pp": "OM", + "lat": 48.790503798161865, + "lon": 19.44444444444445, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "371": { + "dxcc": "505", + "cc": "TW", + "ccc": "TWN", + "name": "中国东沙群岛", + "continent": "AS", + "ituzone": ["44"], + "cqzone": ["24"], + "timezone": "8", + "ccode": "158", + "aname": "Pratas I.", + "mh": ["OL80"], + "prefix": [ + "BM9P", + "BN9P", + "BO9P", + "BP9P", + "BQ9P", + "BU9P", + "BV9P", + "BW9P", + "BX9P" + ], + "worked": false, + "confirmed": false, + "flag": "cn.png", + "pp": "BV9P", + "lat": 20.78161356717223, + "lon": 116.74439871970733, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "372": { + "dxcc": "506", + "cc": "PH", + "ccc": "PHL", + "name": "中国黄岩岛", + "continent": "AS", + "ituzone": ["50"], + "cqzone": ["27"], + "timezone": "8", + "ccode": "608", + "aname": "Scarborough Reef", + "mh": ["OK85"], + "prefix": ["=BS7H"], + "worked": false, + "confirmed": false, + "flag": "cn.png", + "pp": "BS7", + "lat": 15.28852689750839, + "lon": 117.76863283036123, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "373": { + "dxcc": "507", + "cc": "SB", + "ccc": "SLB", + "name": "特莫图省", + "continent": "OC", + "ituzone": ["51"], + "cqzone": ["28"], + "timezone": "11", + "ccode": "90", + "aname": "Temotu Province", + "mh": ["RH29", "RH38", "RH39", "RI30"], + "prefix": ["H40"], + "worked": false, + "confirmed": false, + "flag": "sb.png", + "pp": "H40", + "lat": -10.637937482175971, + "lon": 166.46090534979425, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "374": { + "dxcc": "508", + "cc": "PF", + "ccc": "PYF", + "name": "奥斯亚群岛", + "continent": "OC", + "ituzone": ["63"], + "cqzone": ["32"], + "timezone": "-10", + "ccode": "258", + "aname": "Austral I.", + "mh": ["BG37"], + "prefix": [ + "=FO/AC4LN/A", + "=FO/DF6IC", + "=FO/DJ4OI", + "=FO/DL1AWI", + "=FO/DL1IAN", + "=FO/DL3APO", + "=FO/DL3GA", + "=FO/DL7FT", + "=FO/DL9AWI", + "=FO/F6CTL", + "=FO/F8CFU", + "=FO/G3BJ", + "=FO/HG9B", + "=FO/HG9B/P", + "=FO/IK2GNW", + "=FO/JA8BMK", + "=FO/K7AR", + "=FO/OH6KN", + "=FO/ON4AXU/A", + "=FO/UT6UD", + "=FO0CLA/A", + "=FO0ERI", + "=FO0FLA", + "=FO0FRY", + "=FO0HWU", + "=FO0MOT/P", + "=FO0SEV", + "=FO0WEG", + "=FO0WII", + "=FO5FD", + "=TX0HF", + "=TX2A", + "=TX3D", + "=TX5BTY", + "=TX5D", + "=TX5RV", + "=TX5SPA", + "=TX5T", + "=TX5W", + "=TX5Z", + "=TX6G" + ], + "worked": false, + "confirmed": false, + "flag": "pf.png", + "pp": "FO/a", + "lat": -22.29568730542931, + "lon": -151.4814814814815, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "375": { + "dxcc": "509", + "cc": "FR", + "ccc": "FRA", + "name": "马克萨斯岛", + "continent": "OC", + "ituzone": ["63"], + "cqzone": ["31"], + "timezone": "-10", + "ccode": "250", + "aname": "Marquesas Is.", + "mh": ["BI90", "BI91", "BI92", "CH09", "CI00", "CI01"], + "prefix": [ + "=FO/AC4LN/M", + "=FO/DJ7RJ", + "=FO/DL5XU", + "=FO/F6BFH/P", + "=FO/F6COW", + "=FO/F6EPY", + "=FO/F6GNZ", + "=FO/HA9G", + "=FO/IZ2ZTQ", + "=FO/JA0SC", + "=FO/JI1WTF", + "=FO/KA7OQQ", + "=FO/N7WLR", + "=FO/OH1RX", + "=FO/ON4AXU", + "=FO/ON4AXU/M", + "=FO/SP9FIH", + "=FO/W6TLD", + "=FO0ELY", + "=FO0POM", + "=FO0TOH", + "=FO5QS/M", + "=FO8RZ/P", + "=K7ST/FO", + "=TX0SIX", + "=TX4PG", + "=TX5A", + "=TX5SPM", + "=TX5VT", + "=TX7EU", + "=TX7G", + "=TX7M", + "=TX7T" + ], + "worked": false, + "confirmed": false, + "flag": "fr.png", + "pp": "FO/m", + "lat": -9.016056467309696, + "lon": -139.9588477366255, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "376": { + "dxcc": "510", + "cc": "PS", + "ccc": "PSE", + "name": "巴勒斯坦", + "continent": "AS", + "ituzone": ["39"], + "cqzone": ["20"], + "timezone": "2", + "ccode": "275", + "aname": "Palestine", + "mh": ["KM71", "KM72"], + "prefix": ["E4"], + "worked": false, + "confirmed": false, + "flag": "ps.png", + "pp": "E4", + "lat": 32.03569939219524, + "lon": 35.27104608037393, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "377": { + "dxcc": "511", + "cc": "TL", + "ccc": "TLS", + "name": "东帝汶", + "continent": "OC", + "ituzone": ["54"], + "cqzone": ["28"], + "timezone": "8", + "ccode": "626", + "aname": "Timor-Leste", + "mh": ["PI20", "PI21", "PI30", "PI31"], + "prefix": ["=4U1ET", "4W"], + "worked": false, + "confirmed": false, + "flag": "tl.png", + "pp": "4W", + "lat": -8.761065430199181, + "lon": 125.77757455672408, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "378": { + "dxcc": "512", + "cc": "GB", + "ccc": "GBR", + "name": "切斯特菲尔德岛", + "continent": "OC", + "ituzone": ["55"], + "cqzone": ["30"], + "timezone": "11", + "ccode": "826", + "aname": "Chesterfield Is.", + "mh": ["QH90"], + "prefix": [ + "=FK8C/AA7JV", + "=FK8IK/C", + "=TX0AT", + "=TX0C", + "=TX0DX", + "=TX3A", + "=TX3X", + "=TX9" + ], + "worked": false, + "confirmed": false, + "flag": "gb.png", + "pp": "FK/c", + "lat": -19.605793951272645, + "lon": 158.2304526748971, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "379": { + "dxcc": "513", + "cc": "PN", + "ccc": "PCN", + "name": "迪西岛", + "continent": "OC", + "ituzone": ["63"], + "cqzone": ["32"], + "timezone": "-9", + "ccode": "612", + "aname": "Ducie I.", + "mh": ["CG75"], + "prefix": ["=VP6D", "=VP6DI", "=VP6DIA", "=VP6DX", "=VP6UU", "=VP6UU/VP6D"], + "worked": false, + "confirmed": false, + "flag": "pn.png", + "pp": "VP6/d", + "lat": -24.690375733557588, + "lon": -124.78585581466241, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "380": { + "dxcc": "514", + "cc": "ME", + "ccc": "MNE", + "name": "黑山共和国", + "continent": "EU", + "ituzone": ["28"], + "cqzone": ["15"], + "timezone": "1", + "ccode": "499", + "aname": "Montenegro", + "mh": ["JN91", "JN92", "JN93", "KN02", "KN03"], + "prefix": ["4O"], + "worked": false, + "confirmed": false, + "flag": "me.png", + "pp": "4O", + "lat": 42.8259201270869, + "lon": 19.155616521871664, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "381": { + "dxcc": "515", + "cc": "US", + "ccc": "USA", + "name": "斯温斯岛", + "continent": "OC", + "ituzone": ["62"], + "cqzone": ["32"], + "timezone": "-11", + "ccode": "840", + "aname": "Swains I.", + "mh": ["AH48"], + "prefix": [ + "=KH6BK/KH8", + "=KH8/WH7S", + "=KH8S/K3UY", + "=KH8S/NA6M", + "=KH8SI", + "=NH8S" + ], + "worked": false, + "confirmed": false, + "flag": "us.png", + "pp": "KH8/s", + "lat": -11.051091557125972, + "lon": -171.19341563786008, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "382": { + "dxcc": "516", + "cc": "FR", + "ccc": "FRA", + "name": "圣巴泰勒米岛", + "continent": "NA", + "ituzone": ["0"], + "cqzone": ["0"], + "timezone": "0", + "ccode": "250", + "aname": "Saint Barthélemy", + "mh": ["FK87"], + "prefix": [ + "FJ", + "=TO2D", + "=TO2EE", + "=TO2SP", + "=TO3A", + "=TO3J", + "=TO3X", + "=TO4K", + "=TO5DX", + "=TO5E", + "=TO5FJ", + "=TO5RZ", + "=TO7ZG", + "=TO8YY" + ], + "worked": false, + "confirmed": false, + "flag": "fr.png", + "pp": "FJ", + "lat": 17.899436881632525, + "lon": -62.81273409884113, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "383": { + "dxcc": "517", + "cc": "AN", + "ccc": "ANT", + "name": "库拉索岛", + "continent": "SA", + "ituzone": ["11"], + "cqzone": ["9"], + "timezone": "-4", + "ccode": "530", + "aname": "Curacao", + "mh": ["FK52"], + "prefix": ["PJ2"], + "worked": false, + "confirmed": false, + "flag": "cw.png", + "pp": "PJ2", + "lat": 12.126098063540823, + "lon": -68.87974394147234, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "384": { + "dxcc": "518", + "cc": "SX", + "ccc": "SXM", + "name": " 圣马丁岛", + "continent": "SA", + "ituzone": ["11"], + "cqzone": ["8"], + "timezone": "0", + "ccode": "534", + "aname": "Sint Maarten", + "mh": ["FK88"], + "prefix": ["PJ0", "PJ7", "PJ8"], + "worked": false, + "confirmed": false, + "flag": "sx.png", + "pp": "PJ7", + "lat": 18.02841905665771, + "lon": -63.05109092978303, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "385": { + "dxcc": "519", + "cc": "AN", + "ccc": "ANT", + "name": "萨巴岛圣及尤斯特歇斯岛", + "continent": "NA", + "ituzone": ["11"], + "cqzone": ["8"], + "timezone": "-4", + "ccode": "530", + "aname": "Saba & St Eustatius", + "mh": ["FK87"], + "prefix": ["PJ5", "PJ6"], + "worked": false, + "confirmed": false, + "flag": "an.png", + "pp": "PJ5", + "lat": 17.57861310815197, + "lon": -63.0996186678191, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "386": { + "dxcc": "520", + "cc": "BQ", + "ccc": "BES", + "name": "博奈尔岛", + "continent": "SA", + "ituzone": ["11"], + "cqzone": ["9"], + "timezone": "0", + "ccode": "535", + "aname": "Bonaire", + "mh": ["FK52"], + "prefix": ["PJ4"], + "worked": false, + "confirmed": false, + "flag": "nl.png", + "pp": "PJ4", + "lat": 12.17377860655374, + "lon": -68.29446730681298, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "387": { + "dxcc": "521", + "cc": "SS", + "ccc": "SSD", + "name": "南苏丹", + "continent": "AF", + "ituzone": ["47", "48"], + "cqzone": ["34"], + "timezone": "-3", + "ccode": "728", + "aname": "South Sudan (Republic of)", + "mh": [ + "KJ18", + "KJ19", + "KJ27", + "KJ28", + "KJ29", + "KJ34", + "KJ35", + "KJ36", + "KJ37", + "KJ38", + "KJ39", + "KJ44", + "KJ45", + "KJ46", + "KJ47", + "KJ48", + "KJ49", + "KJ53", + "KJ54", + "KJ55", + "KJ56", + "KJ57", + "KJ58", + "KJ59", + "KJ63", + "KJ64", + "KJ65", + "KJ66", + "KJ67", + "KJ68", + "KJ69", + "KJ74", + "KJ75", + "KJ76", + "KJ77", + "KJ78", + "KJ79", + "KK20", + "KK30", + "KK40", + "KK50", + "KK60", + "KK61", + "KK62" + ], + "prefix": ["=ST0R", "Z8"], + "worked": false, + "confirmed": false, + "flag": "ss.png", + "pp": "Z8", + "lat": 7.203172202956907, + "lon": 30.41666666666667, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "388": { + "dxcc": "522", + "cc": "XK", + "ccc": "XKX", + "name": "科索沃", + "continent": "EU", + "ituzone": ["28"], + "cqzone": ["15"], + "timezone": "1", + "ccode": "999", + "aname": "Republic of Kosovo", + "mh": ["KN01", "KN02", "KN03"], + "prefix": ["Z6"], + "worked": false, + "confirmed": false, + "flag": "xk.png", + "pp": "Z6", + "lat": 42.648, + "lon": 21.006, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "389": { + "dxcc": "289", + "cc": "UN", + "ccc": "UNS", + "name": "联合国总部", + "continent": "NA", + "ituzone": ["8"], + "cqzone": ["5"], + "timezone": "1", + "ccode": "999", + "aname": "United Nations HQ", + "mh": ["FN30"], + "prefix": ["4U1U", "=4U1UN", "=4U50SPACE", "=4U60UN", "=4U64UN", "=4U70UN"], + "worked": false, + "confirmed": false, + "flag": "un.png", + "pp": "4U1U", + "lat": 40.750272, + "lon": -73.967649, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "-1": { + "dxcc": "-1", + "cc": "-", + "ccc": "-", + "name": "不详", + "continent": "-", + "ituzone": ["-1"], + "cqzone": ["-1"], + "timezone": "-", + "ccode": "-", + "aname": "-", + "mh": [], + "prefix": [], + "worked": false, + "confirmed": false, + "flag": "xx.png", + "pp": "?", + "lat": 0, + "lon": 0, + "geo": "deleted", + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + } +} diff --git a/feature/ft8/src/main/assets/excludeCallsign.txt b/feature/ft8/src/main/assets/excludeCallsign.txt new file mode 100644 index 00000000..852ea493 --- /dev/null +++ b/feature/ft8/src/main/assets/excludeCallsign.txt @@ -0,0 +1,3 @@ +排除的呼号前缀。是指FT8CN解码消息后,不会把带有指定呼号前缀列入到“呼叫”列表中,为自动程序排除掉对该呼号的呼叫。 +呼号前缀可以是多个,用逗号、或空格分隔。 +排除的呼号前缀的动作具有最高优先级,高于“关注”、“CQ”、”与我有关“。 \ No newline at end of file diff --git a/feature/ft8/src/main/assets/excludeCallsign_en.txt b/feature/ft8/src/main/assets/excludeCallsign_en.txt new file mode 100644 index 00000000..8218791d --- /dev/null +++ b/feature/ft8/src/main/assets/excludeCallsign_en.txt @@ -0,0 +1,4 @@ +Filtering - hide by prefixes +You can enter a list of prefix that separated by comma "," or space " ". FT8CN will loop up callsigns by your predefined prefixes and hide them from the Calling list. + +This filter has the highest priority, which will override any entry from "Tracked Callsign", "CQ", and "about me". \ No newline at end of file diff --git a/feature/ft8/src/main/assets/frequency.txt b/feature/ft8/src/main/assets/frequency.txt new file mode 100644 index 00000000..cd817730 --- /dev/null +++ b/feature/ft8/src/main/assets/frequency.txt @@ -0,0 +1,4 @@ +发射FT8信号的频率是指在当前波段上,发出的声音频率,频率范围一般是10-3000赫兹之间。 +同频发射:是指声音频率使用您呼叫目标的频率。此时默认频率值无效。 +异频发射:是指您的声音频率使用设定的默认频率。在异频发射模式下,您也可以在频谱界面中通过触摸瀑布图修改默认频率。 +关于发射频率,为了防止您的发射频率与其他友台的频率重叠,建议在频谱中观察一下当前所接收到的信号的频率情况,然后选择与接收的各信号不重叠的频率。 \ No newline at end of file diff --git a/feature/ft8/src/main/assets/frequency_en.txt b/feature/ft8/src/main/assets/frequency_en.txt new file mode 100644 index 00000000..d7f3c056 --- /dev/null +++ b/feature/ft8/src/main/assets/frequency_en.txt @@ -0,0 +1,7 @@ +The frequency of the transmitted FT8 signal refers to the frequency of the sound transmitted in the current band, and the frequency range is generally between 10 and 3000 Hz. +Locked TX=RX(locked transmission): It refers to the frequency of your target call. The default frequency value is not valid at this point. +Tx/Rx Split(split transmission): it refers to the default frequency that has been set. In Tx/Rx Split mode, you can also modify the default frequency in the spectrum interface by touching the waterfall chart. + +About the TX Frequency. + +In order to prevent your TX frequency from overlapping with the frequencies of others, it is recommended to observe the frequency of the currently received signal in the spectrum, and then select a frequency that does not overlap with each received signal. \ No newline at end of file diff --git a/feature/ft8/src/main/assets/ituzone.json b/feature/ft8/src/main/assets/ituzone.json new file mode 100644 index 00000000..8929a086 --- /dev/null +++ b/feature/ft8/src/main/assets/ituzone.json @@ -0,0 +1,42003 @@ +{ + "10": { + "mh": [ + "CL88", + "CL89", + "CL94", + "CL95", + "CL96", + "CL97", + "CL98", + "CL99", + "CM71", + "CM72", + "CM80", + "CM81", + "CM82", + "CM90", + "CM91", + "CM92", + "DJ46", + "DJ47", + "DJ48", + "DJ49", + "DJ56", + "DJ57", + "DJ58", + "DJ59", + "DJ66", + "DJ67", + "DJ68", + "DJ69", + "DJ76", + "DJ77", + "DJ78", + "DJ79", + "DJ86", + "DJ87", + "DJ88", + "DJ89", + "DJ96", + "DJ97", + "DJ98", + "DJ99", + "DK17", + "DK18", + "DK19", + "DK24", + "DK25", + "DK26", + "DK27", + "DK28", + "DK29", + "DK30", + "DK31", + "DK32", + "DK33", + "DK34", + "DK35", + "DK36", + "DK37", + "DK38", + "DK39", + "DK40", + "DK41", + "DK42", + "DK43", + "DK44", + "DK45", + "DK46", + "DK47", + "DK48", + "DK49", + "DK50", + "DK51", + "DK52", + "DK53", + "DK54", + "DK55", + "DK56", + "DK57", + "DK58", + "DK59", + "DK60", + "DK61", + "DK62", + "DK63", + "DK64", + "DK65", + "DK66", + "DK67", + "DK68", + "DK69", + "DK70", + "DK71", + "DK72", + "DK73", + "DK74", + "DK75", + "DK76", + "DK77", + "DK78", + "DK79", + "DK80", + "DK81", + "DK82", + "DK83", + "DK84", + "DK85", + "DK86", + "DK87", + "DK88", + "DK89", + "DK90", + "DK91", + "DK92", + "DK93", + "DK94", + "DK95", + "DK96", + "DK97", + "DK98", + "DK99", + "DL01", + "DL02", + "DL03", + "DL04", + "DL05", + "DL06", + "DL07", + "DL08", + "DL09", + "DL10", + "DL11", + "DL12", + "DL13", + "DL14", + "DL15", + "DL16", + "DL17", + "DL18", + "DL19", + "DL20", + "DL21", + "DL22", + "DL23", + "DL24", + "DL25", + "DL26", + "DL27", + "DL28", + "DL29", + "DL30", + "DL31", + "DL32", + "DL33", + "DL34", + "DL35", + "DL36", + "DL37", + "DL38", + "DL39", + "DL40", + "DL41", + "DL42", + "DL43", + "DL44", + "DL45", + "DL46", + "DL47", + "DL48", + "DL49", + "DL50", + "DL51", + "DL52", + "DL53", + "DL54", + "DL55", + "DL56", + "DL57", + "DL58", + "DL59", + "DL60", + "DL61", + "DL62", + "DL63", + "DL64", + "DL65", + "DL66", + "DL67", + "DL68", + "DL69", + "DL70", + "DL71", + "DL72", + "DL73", + "DL74", + "DL75", + "DL76", + "DL77", + "DL78", + "DL79", + "DL80", + "DL81", + "DL82", + "DL83", + "DL84", + "DL85", + "DL86", + "DL87", + "DL88", + "DL89", + "DL90", + "DL91", + "DL92", + "DL93", + "DL94", + "DL95", + "DL96", + "DL97", + "DL98", + "DL99", + "DM00", + "DM01", + "DM02", + "DM10", + "DM11", + "DM12", + "DM20", + "DM21", + "DM22", + "DM30", + "DM31", + "DM32", + "DM40", + "DM41", + "DM50", + "DM51", + "DM60", + "DM61", + "DM70", + "DM71", + "EJ06", + "EJ07", + "EJ08", + "EJ09", + "EJ16", + "EJ17", + "EJ18", + "EJ19", + "EJ26", + "EJ27", + "EJ28", + "EJ29", + "EJ36", + "EJ37", + "EJ38", + "EJ39", + "EK00", + "EK01", + "EK02", + "EK03", + "EK04", + "EK05", + "EK06", + "EK07", + "EK08", + "EK09", + "EK10", + "EK11", + "EK12", + "EK13", + "EK14", + "EK15", + "EK16", + "EK17", + "EK18", + "EK19", + "EK20", + "EK21", + "EK22", + "EK23", + "EK24", + "EK25", + "EK26", + "EK27", + "EK28", + "EK29", + "EK30", + "EK31", + "EK32", + "EK33", + "EK34", + "EK35", + "EK36", + "EK37", + "EK38", + "EK39", + "EK45", + "EK46", + "EK47", + "EK48", + "EK49", + "EK57", + "EK58", + "EK59", + "EK68", + "EK69", + "EL00", + "EL01", + "EL02", + "EL03", + "EL04", + "EL05", + "EL06", + "EL07", + "EL10", + "EL11", + "EL12", + "EL13", + "EL14", + "EL15", + "EL16", + "EL20", + "EL21", + "EL22", + "EL23", + "EL24", + "EL25", + "EL30", + "EL31", + "EL32", + "EL33", + "EL34", + "EL35", + "EL40", + "EL41", + "EL42", + "EL43", + "EL44", + "EL45", + "EL50", + "EL51", + "EL52", + "EL53", + "EL54", + "EL55", + "EL60", + "EL61", + "EL62", + "EL63", + "EL64" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-92.2371, 14.53839], + [-92.18997, 6.011], + [-109.89813, 6.32386], + [-124.63097, 32.46386], + [-117.12525, 32.53382], + [-115.92568, 32.6333], + [-114.71959, 32.71861], + [-114.80988, 32.61866], + [-114.80822, 32.603], + [-114.80231, 32.60025], + [-114.80147, 32.59575], + [-114.79916, 32.59276], + [-114.80038, 32.58793], + [-114.80332, 32.58497], + [-114.80385, 32.58144], + [-114.80324, 32.57383], + [-114.81293, 32.56939], + [-114.81429, 32.56532], + [-114.81428, 32.56096], + [-114.80842, 32.55803], + [-114.80437, 32.56009], + [-114.80134, 32.56272], + [-114.79763, 32.56435], + [-114.79457, 32.56776], + [-114.7922, 32.56915], + [-114.79065, 32.55697], + [-114.79443, 32.55157], + [-114.80121, 32.54916], + [-114.80662, 32.54603], + [-114.80507, 32.54237], + [-114.8019, 32.54011], + [-114.80147, 32.53785], + [-114.80271, 32.53511], + [-114.80505, 32.5336], + [-114.80636, 32.53122], + [-114.81194, 32.52604], + [-114.8134, 32.52401], + [-114.81031, 32.51834], + [-114.80799, 32.51689], + [-114.8031, 32.51652], + [-114.80147, 32.51281], + [-114.80683, 32.50872], + [-114.80972, 32.50849], + [-114.81432, 32.50913], + [-114.81666, 32.50752], + [-114.81385, 32.50453], + [-114.81235, 32.49957], + [-114.8142, 32.49786], + [-114.814, 32.49499], + [-112.94014, 31.91798], + [-111.07453, 31.33369], + [-110.00061, 31.33369], + [-108.20847, 31.33252], + [-108.2071, 31.78421], + [-106.531, 31.7845], + [-106.38062, 31.73196], + [-106.2045, 31.46469], + [-105.95456, 31.36565], + [-105.77328, 31.16727], + [-105.64797, 31.11556], + [-105.55665, 30.98835], + [-105.40215, 30.85566], + [-105.21744, 30.80555], + [-105.00733, 30.68575], + [-104.87343, 30.51258], + [-104.85901, 30.39123], + [-104.70589, 30.23474], + [-104.69559, 30.03581], + [-104.65714, 29.90375], + [-104.50539, 29.63315], + [-104.33716, 29.51969], + [-104.263, 29.51372], + [-104.16275, 29.39114], + [-103.96775, 29.30017], + [-103.78647, 29.26663], + [-103.71781, 29.18154], + [-103.55301, 29.15575], + [-103.4253, 29.04356], + [-103.2399, 28.98171], + [-103.11356, 28.98652], + [-103.10051, 29.06157], + [-102.91169, 29.2205], + [-102.87804, 29.35524], + [-102.8135, 29.40132], + [-102.80869, 29.52507], + [-102.67548, 29.7447], + [-102.51549, 29.78642], + [-102.38778, 29.76199], + [-102.32186, 29.88054], + [-102.05132, 29.78642], + [-101.84739, 29.80728], + [-101.70937, 29.76258], + [-101.456, 29.78762], + [-101.35918, 29.64867], + [-101.3118, 29.65822], + [-101.26168, 29.53881], + [-101.06049, 29.45813], + [-101.00899, 29.36781], + [-100.79613, 29.24626], + [-100.77485, 29.17614], + [-100.66636, 29.07717], + [-100.65056, 28.94266], + [-100.53315, 28.80376], + [-100.50019, 28.66287], + [-100.39856, 28.58391], + [-100.29419, 28.28382], + [-100.20562, 28.19066], + [-100.08683, 28.14526], + [-99.99276, 27.99561], + [-99.93096, 27.98045], + [-99.87877, 27.80203], + [-99.65355, 27.63061], + [-99.59725, 27.64095], + [-99.47983, 27.48817], + [-99.52858, 27.30528], + [-99.43932, 27.24669], + [-99.44756, 27.02487], + [-99.32671, 26.91839], + [-99.20861, 26.72598], + [-99.17016, 26.54062], + [-99.09256, 26.47733], + [-99.08432, 26.39802], + [-98.82409, 26.37034], + [-98.65929, 26.23615], + [-98.46085, 26.22691], + [-98.24387, 26.07282], + [-98.03994, 26.04136], + [-97.8003, 26.06048], + [-97.66091, 26.02963], + [-97.52015, 25.88579], + [-97.37183, 25.84253], + [-97.34848, 25.93149], + [-97.1473, 25.95681], + [-89.91211, 25.04081], + [-85.93506, 24.55327], + [-86.04493, 18.39623], + [-87.98127, 18.16933], + [-88.00049, 18.37016], + [-88.05268, 18.41447], + [-88.31498, 18.49133], + [-88.4784, 18.49654], + [-88.6171, 18.22674], + [-88.69675, 18.18369], + [-88.71598, 18.06231], + [-88.85331, 17.89642], + [-89.03733, 18.00355], + [-89.15268, 17.93954], + [-89.15268, 17.81537], + [-90.98809, 17.81603], + [-90.98809, 17.2523], + [-91.4399, 17.25099], + [-91.26275, 17.16637], + [-91.26755, 17.10863], + [-90.91805, 16.82031], + [-90.80544, 16.79862], + [-90.65781, 16.63816], + [-90.64614, 16.52036], + [-90.48134, 16.46176], + [-90.37354, 16.37482], + [-90.458, 16.21533], + [-90.4422, 16.07484], + [-91.73172, 16.07418], + [-92.211, 15.26166], + [-92.05925, 15.07079], + [-92.15058, 14.98856], + [-92.18354, 14.84923], + [-92.14783, 14.66065], + [-92.22336, 14.53706], + [-92.2371, 14.53839] + ] + ] + }, + "properties": { "ituzone": "10" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "11": { + "mh": [ + "EJ36", + "EJ37", + "EJ38", + "EJ39", + "EJ46", + "EJ47", + "EJ48", + "EJ49", + "EJ56", + "EJ57", + "EJ58", + "EJ59", + "EJ66", + "EJ67", + "EJ68", + "EJ69", + "EJ76", + "EJ77", + "EJ78", + "EJ79", + "EJ86", + "EJ87", + "EJ88", + "EJ89", + "EJ96", + "EJ97", + "EJ98", + "EJ99", + "EK30", + "EK31", + "EK32", + "EK33", + "EK34", + "EK35", + "EK40", + "EK41", + "EK42", + "EK43", + "EK44", + "EK45", + "EK46", + "EK47", + "EK50", + "EK51", + "EK52", + "EK53", + "EK54", + "EK55", + "EK56", + "EK57", + "EK58", + "EK60", + "EK61", + "EK62", + "EK63", + "EK64", + "EK65", + "EK66", + "EK67", + "EK68", + "EK70", + "EK71", + "EK72", + "EK73", + "EK74", + "EK75", + "EK76", + "EK77", + "EK78", + "EK79", + "EK80", + "EK81", + "EK82", + "EK83", + "EK84", + "EK85", + "EK86", + "EK87", + "EK88", + "EK89", + "EK90", + "EK91", + "EK92", + "EK93", + "EK94", + "EK95", + "EK96", + "EK97", + "EK98", + "EK99", + "EL70", + "EL71", + "EL72", + "EL73", + "EL74", + "EL80", + "EL81", + "EL82", + "EL83", + "EL84", + "EL90", + "EL91", + "EL92", + "EL93", + "EL94", + "FJ06", + "FJ07", + "FJ08", + "FJ09", + "FJ17", + "FJ18", + "FJ19", + "FK00", + "FK01", + "FK02", + "FK03", + "FK04", + "FK05", + "FK06", + "FK07", + "FK08", + "FK09", + "FK10", + "FK11", + "FK12", + "FK13", + "FK14", + "FK15", + "FK16", + "FK17", + "FK18", + "FK19", + "FK20", + "FK21", + "FK22", + "FK23", + "FK24", + "FK25", + "FK26", + "FK27", + "FK28", + "FK29", + "FK32", + "FK33", + "FK34", + "FK35", + "FK36", + "FK37", + "FK38", + "FK39", + "FK42", + "FK43", + "FK44", + "FK45", + "FK46", + "FK47", + "FK48", + "FK49", + "FK51", + "FK52", + "FK53", + "FK54", + "FK55", + "FK56", + "FK57", + "FK58", + "FK59", + "FK62", + "FK63", + "FK64", + "FK65", + "FK66", + "FK67", + "FK68", + "FK69", + "FK71", + "FK72", + "FK73", + "FK74", + "FK75", + "FK76", + "FK77", + "FK78", + "FK79", + "FK80", + "FK81", + "FK82", + "FK83", + "FK84", + "FK85", + "FK86", + "FK87", + "FK88", + "FK89", + "FK90", + "FK91", + "FK92", + "FK93", + "FK94", + "FK95", + "FK96", + "FK97", + "FK98", + "FK99", + "FL00", + "FL01", + "FL02", + "FL03", + "FL04", + "FL05", + "FL06", + "FL07", + "FL08", + "FL09", + "FL10", + "FL11", + "FL12", + "FL13", + "FL14", + "FL15", + "FL16", + "FL17", + "FL18", + "FL19", + "FL20", + "FL21", + "FL22", + "FL23", + "FL24", + "FL25", + "FL26", + "FL27", + "FL28", + "FL29", + "FL30", + "FL31", + "FL32", + "FL33", + "FL34", + "FL35", + "FL36", + "FL37", + "FL38", + "FL39", + "FL40", + "FL41", + "FL42", + "FL43", + "FL44", + "FL45", + "FL46", + "FL47", + "FL48", + "FL49", + "FL50", + "FL51", + "FL52", + "FL53", + "FL54", + "FL55", + "FL56", + "FL57", + "FL58", + "FL59", + "FL60", + "FL61", + "FL62", + "FL63", + "FL64", + "FL65", + "FL66", + "FL67", + "FL68", + "FL69", + "FL70", + "FL71", + "FL72", + "FL73", + "FL74", + "FL75", + "FL76", + "FL77", + "FL78", + "FL79", + "FL80", + "FL81", + "FL82", + "FL83", + "FL84", + "FL85", + "FL86", + "FL87", + "FL88", + "FL89", + "FL90", + "FL91", + "FL92", + "FL93", + "FL94", + "FL95", + "FL96", + "FL97", + "FL98", + "FL99", + "FM00", + "FM01", + "FM10", + "FM11", + "FM12", + "FM13", + "FM20", + "FM21", + "FM22", + "FM23", + "FM24", + "FM25", + "FM30", + "FM31", + "FM32", + "FM33", + "FM34", + "FM35", + "FM36", + "FM37", + "FM40", + "FM41", + "FM42", + "FM43", + "FM44", + "FM45", + "FM46", + "FM47", + "FM48", + "FM49", + "FM50", + "FM51", + "FM52", + "FM53", + "FM54", + "FM55", + "FM56", + "FM57", + "FM58", + "FM59", + "FM60", + "FM61", + "FM62", + "FM63", + "FM64", + "FM65", + "FM66", + "FM67", + "FM68", + "FM69", + "FM70", + "FM71", + "FM72", + "FM73", + "FM74", + "FM75", + "FM76", + "FM77", + "FM78", + "FM79", + "FM80", + "FM81", + "FM82", + "FM83", + "FM84", + "FM85", + "FM86", + "FM87", + "FM88", + "FM89", + "FM90", + "FM91", + "FM92", + "FM93", + "FM94", + "FM95", + "FM96", + "FM97", + "FM98", + "FM99", + "FN40", + "FN50", + "FN51", + "FN60", + "FN61", + "FN62", + "FN70", + "FN71", + "FN72", + "FN80", + "FN81", + "FN82", + "FN90", + "FN91", + "FN92", + "GK00", + "GK01", + "GK02", + "GK03", + "GK04", + "GK05", + "GK06", + "GK07", + "GK08", + "GK09", + "GK10", + "GK11", + "GK12", + "GK13", + "GK14", + "GK15", + "GK16", + "GK17", + "GK18", + "GK19", + "GL00", + "GL01", + "GL02", + "GL03", + "GL04", + "GL05", + "GL06", + "GL07", + "GL08", + "GL09", + "GL10", + "GL11", + "GL12", + "GL13", + "GL14", + "GL15", + "GL16", + "GL17", + "GL18", + "GL19", + "GM00", + "GM01", + "GM02", + "GM03", + "GM04", + "GM05", + "GM06", + "GM07", + "GM08", + "GM09", + "GM10", + "GM11", + "GM12", + "GM13", + "GM14", + "GM15", + "GM16", + "GM17", + "GM18", + "GM19", + "GN00", + "GN01", + "GN02", + "GN10", + "GN11", + "GN12" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-92.2371, 14.53839], + [-92.22336, 14.53706], + [-92.14783, 14.66065], + [-92.18354, 14.84923], + [-92.15058, 14.98856], + [-92.05925, 15.07079], + [-92.211, 15.26166], + [-91.73172, 16.07418], + [-90.4422, 16.07484], + [-90.458, 16.21533], + [-90.37354, 16.37482], + [-90.48134, 16.46176], + [-90.64614, 16.52036], + [-90.65781, 16.63816], + [-90.80544, 16.79862], + [-90.91805, 16.82031], + [-91.26755, 17.10863], + [-91.26275, 17.16637], + [-91.4399, 17.25099], + [-90.98809, 17.2523], + [-90.98809, 17.81603], + [-89.15268, 17.81537], + [-89.15268, 17.93954], + [-89.03733, 18.00355], + [-88.85331, 17.89642], + [-88.71598, 18.06231], + [-88.69675, 18.18369], + [-88.6171, 18.22674], + [-88.4784, 18.49654], + [-88.31498, 18.49133], + [-88.05268, 18.41447], + [-88.00049, 18.37016], + [-87.98127, 18.16933], + [-86.04493, 18.39623], + [-85.93506, 24.55327], + [-82.55359, 24.47636], + [-80.97272, 24.43788], + [-80.00708, 24.3994], + [-79.41498, 25.25532], + [-79.30627, 30.20248], + [-78.12207, 31.46898], + [-67, 43], + [-57, 43], + [-57, 10], + [-62, 10], + [-62.08817, 10.09876], + [-61.79586, 10.38444], + [-61.76056, 11.46168], + [-67.47384, 12.50658], + [-68.76514, 11.57026], + [-70.4916, 12.52683], + [-74.55974, 12.54661], + [-77.35667, 8.67584], + [-77.41076, 8.64078], + [-77.44703, 8.47228], + [-77.40059, 8.47708], + [-77.35342, 8.30366], + [-77.25939, 8.20799], + [-77.17611, 7.91785], + [-77.32321, 7.89523], + [-77.44099, 7.65723], + [-77.5646, 7.50547], + [-77.64609, 7.6481], + [-77.72781, 7.6979], + [-77.7519, 7.6153], + [-77.70237, 7.50817], + [-77.72246, 7.43321], + [-77.81809, 7.45672], + [-77.89316, 7.22534], + [-78.74091, 6.0945], + [-92.18997, 6.011], + [-92.2371, 14.53839] + ] + ] + }, + "properties": { "ituzone": "11" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "12": { + "mh": [ + "EH69", + "EH77", + "EH78", + "EH79", + "EH85", + "EH86", + "EH87", + "EH88", + "EH89", + "EH94", + "EH95", + "EH96", + "EH97", + "EH98", + "EH99", + "EI38", + "EI39", + "EI42", + "EI43", + "EI44", + "EI45", + "EI46", + "EI47", + "EI48", + "EI49", + "EI50", + "EI51", + "EI52", + "EI53", + "EI54", + "EI55", + "EI56", + "EI57", + "EI58", + "EI59", + "EI60", + "EI61", + "EI62", + "EI63", + "EI64", + "EI65", + "EI66", + "EI67", + "EI68", + "EI69", + "EI70", + "EI71", + "EI72", + "EI73", + "EI74", + "EI75", + "EI76", + "EI77", + "EI78", + "EI79", + "EI80", + "EI81", + "EI82", + "EI83", + "EI84", + "EI85", + "EI86", + "EI87", + "EI88", + "EI89", + "EI90", + "EI91", + "EI92", + "EI93", + "EI94", + "EI95", + "EI96", + "EI97", + "EI98", + "EI99", + "EJ30", + "EJ31", + "EJ32", + "EJ33", + "EJ34", + "EJ35", + "EJ40", + "EJ41", + "EJ42", + "EJ43", + "EJ44", + "EJ45", + "EJ50", + "EJ51", + "EJ52", + "EJ53", + "EJ54", + "EJ55", + "EJ60", + "EJ61", + "EJ62", + "EJ63", + "EJ64", + "EJ65", + "EJ70", + "EJ71", + "EJ72", + "EJ73", + "EJ74", + "EJ75", + "EJ76", + "EJ80", + "EJ81", + "EJ82", + "EJ83", + "EJ84", + "EJ85", + "EJ86", + "EJ90", + "EJ91", + "EJ92", + "EJ93", + "EJ94", + "EJ95", + "EJ96", + "FH02", + "FH03", + "FH04", + "FH05", + "FH06", + "FH07", + "FH08", + "FH09", + "FH11", + "FH12", + "FH13", + "FH14", + "FH15", + "FH16", + "FH17", + "FH18", + "FH19", + "FH21", + "FH22", + "FH23", + "FH24", + "FH25", + "FH26", + "FH27", + "FH28", + "FH29", + "FH31", + "FH32", + "FH33", + "FH34", + "FH35", + "FH36", + "FH37", + "FH38", + "FH39", + "FH41", + "FH42", + "FH43", + "FH44", + "FH45", + "FH46", + "FH47", + "FH48", + "FH49", + "FH51", + "FH52", + "FH53", + "FH54", + "FH55", + "FH56", + "FH57", + "FH58", + "FH59", + "FH63", + "FH64", + "FH65", + "FH66", + "FH67", + "FH68", + "FH69", + "FH73", + "FH74", + "FH75", + "FH76", + "FH77", + "FH78", + "FH79", + "FH83", + "FH84", + "FH85", + "FH86", + "FH87", + "FH88", + "FH89", + "FH93", + "FH94", + "FH95", + "FH96", + "FH97", + "FH98", + "FH99", + "FI00", + "FI01", + "FI02", + "FI03", + "FI04", + "FI05", + "FI06", + "FI07", + "FI08", + "FI09", + "FI10", + "FI11", + "FI12", + "FI13", + "FI14", + "FI15", + "FI16", + "FI17", + "FI18", + "FI19", + "FI20", + "FI21", + "FI22", + "FI23", + "FI24", + "FI25", + "FI26", + "FI27", + "FI28", + "FI29", + "FI30", + "FI31", + "FI32", + "FI33", + "FI34", + "FI35", + "FI36", + "FI37", + "FI38", + "FI39", + "FI40", + "FI41", + "FI42", + "FI43", + "FI44", + "FI45", + "FI46", + "FI47", + "FI48", + "FI49", + "FI50", + "FI51", + "FI52", + "FI53", + "FI54", + "FI55", + "FI56", + "FI57", + "FI58", + "FI59", + "FI60", + "FI61", + "FI62", + "FI63", + "FI64", + "FI65", + "FI66", + "FI67", + "FI68", + "FI69", + "FI70", + "FI71", + "FI72", + "FI73", + "FI74", + "FI75", + "FI76", + "FI77", + "FI78", + "FI79", + "FI80", + "FI81", + "FI82", + "FI83", + "FI84", + "FI85", + "FI86", + "FI87", + "FI88", + "FI89", + "FI90", + "FI91", + "FI92", + "FI93", + "FI94", + "FI95", + "FI96", + "FI97", + "FI98", + "FI99", + "FJ00", + "FJ01", + "FJ02", + "FJ03", + "FJ04", + "FJ05", + "FJ06", + "FJ10", + "FJ11", + "FJ12", + "FJ13", + "FJ14", + "FJ15", + "FJ16", + "FJ17", + "FJ18", + "FJ19", + "FJ20", + "FJ21", + "FJ22", + "FJ23", + "FJ24", + "FJ25", + "FJ26", + "FJ27", + "FJ28", + "FJ29", + "FJ30", + "FJ31", + "FJ32", + "FJ33", + "FJ34", + "FJ35", + "FJ36", + "FJ37", + "FJ38", + "FJ39", + "FJ40", + "FJ41", + "FJ42", + "FJ43", + "FJ44", + "FJ45", + "FJ46", + "FJ47", + "FJ48", + "FJ49", + "FJ50", + "FJ51", + "FJ52", + "FJ53", + "FJ54", + "FJ55", + "FJ56", + "FJ57", + "FJ58", + "FJ59", + "FJ60", + "FJ61", + "FJ62", + "FJ63", + "FJ64", + "FJ65", + "FJ66", + "FJ67", + "FJ68", + "FJ69", + "FJ70", + "FJ71", + "FJ72", + "FJ73", + "FJ74", + "FJ75", + "FJ76", + "FJ77", + "FJ78", + "FJ79", + "FJ80", + "FJ81", + "FJ82", + "FJ83", + "FJ84", + "FJ85", + "FJ86", + "FJ87", + "FJ88", + "FJ89", + "FJ90", + "FJ91", + "FJ92", + "FJ93", + "FJ94", + "FJ95", + "FJ96", + "FJ97", + "FJ98", + "FJ99", + "FK10", + "FK20", + "FK21", + "FK22", + "FK30", + "FK31", + "FK32", + "FK40", + "FK41", + "FK42", + "FK50", + "FK51", + "FK52", + "FK60", + "FK61", + "FK62", + "FK70", + "FK71", + "FK72", + "FK80", + "FK81", + "FK90", + "FK91", + "GJ01", + "GJ02", + "GJ03", + "GJ04", + "GJ05", + "GJ06", + "GJ07", + "GJ08", + "GJ09", + "GJ11", + "GJ12", + "GJ13", + "GJ14", + "GJ15", + "GJ16", + "GJ17", + "GJ18", + "GJ19", + "GJ21", + "GJ22", + "GJ23", + "GJ24", + "GJ25", + "GJ26", + "GJ27", + "GJ28", + "GJ32", + "GJ33", + "GJ34", + "GJ35", + "GJ36", + "GJ37", + "GJ43", + "GJ44", + "GJ45", + "GJ46", + "GJ47" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-92.18997, 6.011], + [-78.74091, 6.0945], + [-77.89316, 7.22534], + [-77.81809, 7.45672], + [-77.72246, 7.43321], + [-77.70237, 7.50817], + [-77.7519, 7.6153], + [-77.72781, 7.6979], + [-77.64609, 7.6481], + [-77.5646, 7.50547], + [-77.44099, 7.65723], + [-77.32321, 7.89523], + [-77.17611, 7.91785], + [-77.25939, 8.20799], + [-77.35342, 8.30366], + [-77.40059, 8.47708], + [-77.44703, 8.47228], + [-77.41076, 8.64078], + [-77.35667, 8.67584], + [-74.55974, 12.54661], + [-70.4916, 12.52683], + [-68.76514, 11.57026], + [-67.47384, 12.50658], + [-61.76056, 11.46168], + [-61.79586, 10.38444], + [-62.08817, 10.09876], + [-62, 10], + [-60, 10], + [-51.62045, 7], + [-51.61955, 4.15839], + [-51.66261, 4.05219], + [-51.74961, 3.98434], + [-51.80366, 3.87266], + [-51.91174, 3.79726], + [-52.22146, 3.25586], + [-52.31121, 3.20415], + [-52.34603, 3.0592], + [-52.55849, 2.54973], + [-52.63184, 2.40864], + [-52.82604, 2.28675], + [-52.94334, 2.16486], + [-53.09059, 2.20387], + [-53.25982, 2.1825], + [-53.31264, 2.35933], + [-53.51376, 2.25622], + [-53.75884, 2.37267], + [-54.11715, 2.10607], + [-54.69001, 2.34092], + [-54.69582, 2.43618], + [-54.75639, 2.47558], + [-54.86092, 2.41619], + [-54.95446, 2.55985], + [-54.93814, 2.62669], + [-55.09691, 2.53095], + [-55.31506, 2.5236], + [-55.35794, 2.42541], + [-55.49971, 2.44795], + [-55.71182, 2.39424], + [-55.94591, 2.53261], + [-56.18, 2.2868], + [-55.89055, 1.99647], + [-55.93259, 1.87326], + [-55.99661, 1.83789], + [-56.24441, 1.8785], + [-56.32849, 1.93311], + [-56.48104, 1.94847], + [-56.57954, 1.90152], + [-56.72591, 1.92374], + [-56.79557, 1.84933], + [-56.92206, 1.92674], + [-57.00606, 1.90834], + [-57.07763, 2.00084], + [-57.24914, 1.93], + [-57.32964, 1.97995], + [-57.43325, 1.89154], + [-57.53087, 1.70375], + [-57.63882, 1.67918], + [-57.74421, 1.70827], + [-57.93573, 1.62892], + [-57.98509, 1.651], + [-58.0028, 1.51259], + [-58.1325, 1.4983], + [-58.15102, 1.55169], + [-58.37964, 1.54317], + [-58.38973, 1.46667], + [-58.5086, 1.42886], + [-58.46563, 1.32341], + [-58.5032, 1.26338], + [-58.71225, 1.28453], + [-58.74034, 1.19633], + [-58.85668, 1.17447], + [-58.92108, 1.31007], + [-59.04783, 1.31744], + [-59.27991, 1.40418], + [-59.33342, 1.51045], + [-59.3833, 1.50103], + [-59.5331, 1.71668], + [-59.69075, 1.7545], + [-59.65093, 1.84785], + [-59.75226, 1.85898], + [-59.7195, 2.23639], + [-59.89674, 2.36031], + [-59.89608, 2.47871], + [-59.98437, 2.67628], + [-59.9905, 2.68633], + [-60, -16.5], + [-69.01446, -16.5], + [-69.04358, -16.58356], + [-68.99689, -16.65988], + [-69.17267, -16.72565], + [-69.18915, -16.79666], + [-69.3924, -17.02265], + [-69.37592, -17.07254], + [-69.55994, -17.16704], + [-69.63959, -17.28771], + [-69.47205, -17.36899], + [-69.4693, -17.49739], + [-69.6698, -17.66235], + [-69.79615, -17.64403], + [-69.82911, -17.74084], + [-69.75769, -17.98919], + [-69.85932, -18.17195], + [-69.96918, -18.26327], + [-70.15046, -18.31803], + [-70.30152, -18.3076], + [-70.37842, -18.34932], + [-77.10206, -18.33367], + [-92.02149, -5.96576], + [-92.18997, 6.011] + ] + ] + }, + "properties": { "ituzone": "12" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "13": { + "mh": [ + "GH03", + "GH04", + "GH05", + "GH06", + "GH07", + "GH08", + "GH09", + "GH13", + "GH14", + "GH15", + "GH16", + "GH17", + "GH18", + "GH19", + "GH23", + "GH24", + "GH25", + "GH26", + "GH27", + "GH28", + "GH29", + "GH33", + "GH34", + "GH35", + "GH36", + "GH37", + "GH38", + "GH39", + "GH43", + "GH44", + "GH45", + "GH46", + "GH47", + "GH48", + "GH49", + "GH53", + "GH54", + "GH55", + "GH56", + "GH57", + "GH58", + "GH59", + "GH63", + "GH64", + "GH65", + "GH66", + "GH67", + "GH68", + "GH69", + "GH73", + "GH74", + "GH75", + "GH76", + "GH77", + "GH78", + "GH79", + "GH83", + "GH84", + "GH85", + "GH86", + "GH87", + "GH88", + "GH89", + "GH93", + "GH94", + "GH95", + "GH96", + "GH97", + "GH98", + "GH99", + "GI00", + "GI01", + "GI02", + "GI03", + "GI04", + "GI05", + "GI06", + "GI07", + "GI08", + "GI09", + "GI10", + "GI11", + "GI12", + "GI13", + "GI14", + "GI15", + "GI16", + "GI17", + "GI18", + "GI19", + "GI20", + "GI21", + "GI22", + "GI23", + "GI24", + "GI25", + "GI26", + "GI27", + "GI28", + "GI29", + "GI30", + "GI31", + "GI32", + "GI33", + "GI34", + "GI35", + "GI36", + "GI37", + "GI38", + "GI39", + "GI40", + "GI41", + "GI42", + "GI43", + "GI44", + "GI45", + "GI46", + "GI47", + "GI48", + "GI49", + "GI50", + "GI51", + "GI52", + "GI53", + "GI54", + "GI55", + "GI56", + "GI57", + "GI58", + "GI59", + "GI60", + "GI61", + "GI62", + "GI63", + "GI64", + "GI65", + "GI66", + "GI67", + "GI68", + "GI69", + "GI70", + "GI71", + "GI72", + "GI73", + "GI74", + "GI75", + "GI76", + "GI77", + "GI78", + "GI79", + "GI80", + "GI81", + "GI82", + "GI83", + "GI84", + "GI85", + "GI86", + "GI87", + "GI88", + "GI89", + "GI90", + "GI91", + "GI92", + "GI93", + "GI94", + "GI95", + "GI96", + "GI97", + "GI98", + "GI99", + "GJ00", + "GJ01", + "GJ02", + "GJ10", + "GJ11", + "GJ12", + "GJ20", + "GJ21", + "GJ22", + "GJ30", + "GJ31", + "GJ32", + "GJ33", + "GJ40", + "GJ41", + "GJ42", + "GJ43", + "GJ44", + "GJ45", + "GJ46", + "GJ50", + "GJ51", + "GJ52", + "GJ53", + "GJ54", + "GJ55", + "GJ56", + "GJ60", + "GJ61", + "GJ62", + "GJ63", + "GJ64", + "GJ65", + "GJ66", + "GJ70", + "GJ71", + "GJ72", + "GJ73", + "GJ74", + "GJ75", + "GJ76", + "GJ80", + "GJ81", + "GJ82", + "GJ83", + "GJ84", + "GJ85", + "GJ86", + "GJ90", + "GJ91", + "GJ92", + "GJ93", + "GJ94", + "GJ95", + "GJ96", + "HH03", + "HH04", + "HH05", + "HH06", + "HH07", + "HH08", + "HH09", + "HH13", + "HH14", + "HH15", + "HH16", + "HH17", + "HH18", + "HH19", + "HH23", + "HH24", + "HH25", + "HH26", + "HH27", + "HH28", + "HH29", + "HH33", + "HH34", + "HH35", + "HH36", + "HH37", + "HH38", + "HH39", + "HH43", + "HH44", + "HH45", + "HH46", + "HH47", + "HH48", + "HH49", + "HH53", + "HH54", + "HH55", + "HH56", + "HH57", + "HH58", + "HH59", + "HI00", + "HI01", + "HI02", + "HI03", + "HI04", + "HI05", + "HI06", + "HI07", + "HI08", + "HI09", + "HI10", + "HI11", + "HI12", + "HI13", + "HI14", + "HI15", + "HI16", + "HI17", + "HI18", + "HI19", + "HI20", + "HI21", + "HI22", + "HI23", + "HI24", + "HI25", + "HI26", + "HI27", + "HI28", + "HI29", + "HI30", + "HI31", + "HI32", + "HI33", + "HI34", + "HI35", + "HI36", + "HI37", + "HI38", + "HI39", + "HI40", + "HI41", + "HI42", + "HI43", + "HI44", + "HI45", + "HI46", + "HI47", + "HI48", + "HI49", + "HI50", + "HI51", + "HI52", + "HI53", + "HI54", + "HI55", + "HI56", + "HI57", + "HI58", + "HI59", + "HJ00", + "HJ01", + "HJ02", + "HJ03", + "HJ04", + "HJ05", + "HJ06", + "HJ10", + "HJ11", + "HJ12", + "HJ13", + "HJ14", + "HJ15", + "HJ16", + "HJ20", + "HJ21", + "HJ22", + "HJ23", + "HJ24", + "HJ25", + "HJ26", + "HJ30", + "HJ31", + "HJ32", + "HJ33", + "HJ34", + "HJ35", + "HJ36", + "HJ40", + "HJ41", + "HJ42", + "HJ43", + "HJ44", + "HJ45", + "HJ46", + "HJ50", + "HJ51", + "HJ52", + "HJ53", + "HJ54", + "HJ55", + "HJ56" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-28, 7], + [-28, -16.5], + [-60, -16.5], + [-59.99471, 2.7022], + [-59.98437, 2.67628], + [-59.89608, 2.47871], + [-59.89674, 2.36031], + [-59.7195, 2.23639], + [-59.75226, 1.85898], + [-59.65093, 1.84785], + [-59.69075, 1.7545], + [-59.5331, 1.71668], + [-59.3833, 1.50103], + [-59.33342, 1.51045], + [-59.27991, 1.40418], + [-59.04783, 1.31744], + [-58.92108, 1.31007], + [-58.85668, 1.17447], + [-58.74034, 1.19633], + [-58.71225, 1.28453], + [-58.5032, 1.26338], + [-58.46563, 1.32341], + [-58.5086, 1.42886], + [-58.38973, 1.46667], + [-58.37964, 1.54317], + [-58.15102, 1.55169], + [-58.1325, 1.4983], + [-58.0028, 1.51259], + [-57.98509, 1.651], + [-57.93573, 1.62892], + [-57.74421, 1.70827], + [-57.63882, 1.67918], + [-57.53087, 1.70375], + [-57.43325, 1.89154], + [-57.32964, 1.97995], + [-57.24914, 1.93], + [-57.07763, 2.00084], + [-57.00606, 1.90834], + [-56.92206, 1.92674], + [-56.79557, 1.84933], + [-56.72591, 1.92374], + [-56.57954, 1.90152], + [-56.48104, 1.94847], + [-56.32849, 1.93311], + [-56.24441, 1.8785], + [-55.99661, 1.83789], + [-55.93259, 1.87326], + [-55.89055, 1.99647], + [-56.18, 2.2868], + [-55.94591, 2.53261], + [-55.71182, 2.39424], + [-55.49971, 2.44795], + [-55.35794, 2.42541], + [-55.31506, 2.5236], + [-55.09691, 2.53095], + [-54.93814, 2.62669], + [-54.95446, 2.55985], + [-54.86092, 2.41619], + [-54.75639, 2.47558], + [-54.69582, 2.43618], + [-54.69001, 2.34092], + [-54.11715, 2.10607], + [-53.75884, 2.37267], + [-53.51376, 2.25622], + [-53.31264, 2.35933], + [-53.25982, 2.1825], + [-53.09059, 2.20387], + [-52.94334, 2.16486], + [-52.82604, 2.28675], + [-52.63184, 2.40864], + [-52.55849, 2.54973], + [-52.34603, 3.0592], + [-52.31121, 3.20415], + [-52.22146, 3.25586], + [-51.91174, 3.79726], + [-51.80366, 3.87266], + [-51.74961, 3.98434], + [-51.66261, 4.05219], + [-51.61955, 4.15839], + [-51.62045, 7], + [-28, 7] + ] + ] + }, + "properties": { "ituzone": "13" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "14": { + "mh": [ + "EF92", + "EF93", + "EF94", + "EF95", + "EF96", + "EF97", + "EF98", + "EF99", + "EG80", + "EG81", + "EG90", + "EG91", + "EG92", + "EG93", + "EG94", + "EG95", + "FF00", + "FF01", + "FF02", + "FF03", + "FF04", + "FF05", + "FF06", + "FF07", + "FF08", + "FF09", + "FF10", + "FF11", + "FF12", + "FF13", + "FF14", + "FF15", + "FF16", + "FF17", + "FF18", + "FF19", + "FF20", + "FF21", + "FF22", + "FF23", + "FF24", + "FF25", + "FF26", + "FF27", + "FF28", + "FF29", + "FF30", + "FF31", + "FF32", + "FF33", + "FF34", + "FF35", + "FF36", + "FF37", + "FF38", + "FF39", + "FF40", + "FF41", + "FF42", + "FF43", + "FF44", + "FF45", + "FF46", + "FF47", + "FF48", + "FF49", + "FF50", + "FF51", + "FF52", + "FF53", + "FF54", + "FF55", + "FF56", + "FF57", + "FF58", + "FF59", + "FF60", + "FF61", + "FF62", + "FF63", + "FF64", + "FF65", + "FF66", + "FF67", + "FF68", + "FF69", + "FF70", + "FF71", + "FF72", + "FF73", + "FF74", + "FF75", + "FF76", + "FF77", + "FF78", + "FF79", + "FF80", + "FF81", + "FF82", + "FF83", + "FF84", + "FF85", + "FF86", + "FF87", + "FF88", + "FF89", + "FF90", + "FF91", + "FF92", + "FF93", + "FF94", + "FF95", + "FF96", + "FF97", + "FF98", + "FF99", + "FG00", + "FG01", + "FG02", + "FG03", + "FG04", + "FG05", + "FG06", + "FG07", + "FG08", + "FG09", + "FG10", + "FG11", + "FG12", + "FG13", + "FG14", + "FG15", + "FG16", + "FG17", + "FG18", + "FG19", + "FG20", + "FG21", + "FG22", + "FG23", + "FG24", + "FG25", + "FG26", + "FG27", + "FG28", + "FG29", + "FG30", + "FG31", + "FG32", + "FG33", + "FG34", + "FG35", + "FG36", + "FG37", + "FG38", + "FG39", + "FG40", + "FG41", + "FG42", + "FG43", + "FG44", + "FG45", + "FG46", + "FG47", + "FG48", + "FG49", + "FG50", + "FG51", + "FG52", + "FG53", + "FG54", + "FG55", + "FG56", + "FG57", + "FG58", + "FG59", + "FG60", + "FG61", + "FG62", + "FG63", + "FG64", + "FG65", + "FG66", + "FG67", + "FG68", + "FG69", + "FG70", + "FG71", + "FG72", + "FG73", + "FG74", + "FG75", + "FG76", + "FG77", + "FG78", + "FG79", + "FG80", + "FG81", + "FG82", + "FG83", + "FG84", + "FG85", + "FG86", + "FG87", + "FG88", + "FG89", + "FG90", + "FG91", + "FG92", + "FG93", + "FG94", + "FG95", + "FG96", + "FG97", + "FG98", + "FG99", + "FH10", + "FH11", + "FH20", + "FH21", + "FH30", + "FH31", + "FH40", + "FH41", + "FH50", + "FH51", + "FH52", + "FH53", + "FH60", + "FH61", + "FH62", + "FH63", + "FH70", + "FH71", + "FH72", + "FH73", + "FH80", + "FH81", + "FH82", + "FH83", + "FH90", + "FH91", + "FH92", + "FH93", + "GF00", + "GF01", + "GF02", + "GF03", + "GF04", + "GF05", + "GF06", + "GF07", + "GF08", + "GF09", + "GF10", + "GF11", + "GF12", + "GF13", + "GF14", + "GF15", + "GF16", + "GF17", + "GF18", + "GF19", + "GF20", + "GF21", + "GF22", + "GF23", + "GF24", + "GF25", + "GF26", + "GF27", + "GF28", + "GF29", + "GF30", + "GF31", + "GF32", + "GF33", + "GF34", + "GF35", + "GF36", + "GF37", + "GF38", + "GG00", + "GG01", + "GG02", + "GG03", + "GG04", + "GG05", + "GG06", + "GG07", + "GG08", + "GG09", + "GG10", + "GG11", + "GG12", + "GG13", + "GG14", + "GG15", + "GG16", + "GG17", + "GG18", + "GG19", + "GG21", + "GG22", + "GG23", + "GG24", + "GG25", + "GG26", + "GG27", + "GG32", + "GG33", + "GG34", + "GH00", + "GH01", + "GH02", + "GH03", + "GH10", + "GH11", + "GH12" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-58.3577, -16.52938], + [-58.46304, -16.65223], + [-58.47435, -16.93496], + [-58.43144, -16.99083], + [-58.39547, -17.18447], + [-58.24199, -17.36288], + [-58.06008, -17.45073], + [-58.00256, -17.51955], + [-57.8992, -17.4595], + [-57.7856, -17.55555], + [-57.78505, -17.6455], + [-57.71481, -17.73372], + [-57.7206, -17.82786], + [-57.5748, -18.13189], + [-57.45385, -18.2312], + [-57.55777, -18.24036], + [-57.76661, -18.89929], + [-57.71978, -18.89907], + [-57.71014, -19.0326], + [-57.7842, -19.03351], + [-58.1334, -19.75785], + [-57.87669, -19.96589], + [-58.15611, -20.15085], + [-58.16252, -20.23957], + [-58.09134, -20.2544], + [-58.07679, -20.37681], + [-57.99353, -20.44561], + [-58.01481, -20.60527], + [-57.95794, -20.69962], + [-57.86872, -20.73685], + [-57.92006, -20.88113], + [-57.81812, -20.98124], + [-57.8651, -21.03861], + [-57.85877, -21.31074], + [-57.96282, -21.54906], + [-57.89317, -21.68447], + [-57.94639, -21.74379], + [-57.92017, -21.87263], + [-58.00463, -22.02924], + [-57.92706, -22.11743], + [-57.79775, -22.14207], + [-57.61577, -22.09343], + [-57.58338, -22.16429], + [-57.24951, -22.24018], + [-56.99985, -22.22269], + [-56.83047, -22.29767], + [-56.70499, -22.21508], + [-56.64558, -22.24499], + [-56.51828, -22.10031], + [-56.40268, -22.07474], + [-56.34079, -22.20322], + [-56.20774, -22.27811], + [-55.861, -22.27633], + [-55.74503, -22.3865], + [-55.72369, -22.54521], + [-55.62668, -22.61865], + [-55.6255, -22.75897], + [-55.68268, -22.98044], + [-55.58928, -23.14399], + [-55.53882, -23.163], + [-55.5346, -23.61096], + [-55.43666, -23.70736], + [-55.44091, -23.90949], + [-55.23028, -24.0086], + [-55.11151, -23.96019], + [-54.93177, -23.96147], + [-54.90421, -23.90578], + [-54.67534, -23.81357], + [-54.48266, -23.8819], + [-54.31899, -24.00902], + [-54.28363, -24.08298], + [-54.33062, -24.14825], + [-54.26245, -24.37446], + [-54.33231, -24.48995], + [-54.3351, -24.64641], + [-54.40454, -24.83327], + [-54.46499, -25.07633], + [-54.43628, -25.14377], + [-54.61596, -25.45622], + [-54.59565, -25.59212], + [-54.44508, -25.69302], + [-54.38163, -25.60213], + [-54.25937, -25.59488], + [-54.11467, -25.50207], + [-54.10349, -25.61977], + [-54.02073, -25.56772], + [-53.89388, -25.62282], + [-53.82299, -25.79061], + [-53.82095, -25.9819], + [-53.71822, -26.07322], + [-53.72378, -26.12672], + [-53.59184, -26.26489], + [-53.68485, -26.33662], + [-53.7117, -26.55727], + [-53.74945, -26.64891], + [-53.67757, -26.92408], + [-53.83033, -27.17095], + [-53.94872, -27.15544], + [-54.08906, -27.30265], + [-54.18704, -27.27358], + [-54.22221, -27.38837], + [-54.33692, -27.46127], + [-54.41495, -27.41213], + [-54.53106, -27.50495], + [-54.58119, -27.46039], + [-54.62036, -27.54798], + [-54.78449, -27.58403], + [-54.817, -27.5399], + [-54.90295, -27.6465], + [-54.94719, -27.78002], + [-55.0809, -27.78733], + [-55.02546, -27.83086], + [-55.12523, -27.88991], + [-55.196, -27.86307], + [-55.323, -27.92809], + [-55.37864, -28.04034], + [-55.58501, -28.1196], + [-55.76515, -28.27185], + [-55.66826, -28.33715], + [-55.68982, -28.41537], + [-55.86767, -28.35383], + [-55.8935, -28.48135], + [-55.99896, -28.50311], + [-56.01221, -28.6042], + [-56.1917, -28.77275], + [-56.28426, -28.79104], + [-56.31402, -28.91597], + [-56.41017, -28.97657], + [-56.42479, -29.07289], + [-56.59307, -29.123], + [-56.70841, -29.36194], + [-56.76516, -29.38034], + [-57.1045, -29.74897], + [-57.23599, -29.77837], + [-57.31834, -29.86758], + [-57.34197, -30.00123], + [-57.50484, -30.14307], + [-57.614, -30.18079], + [-57.55003, -30.26362], + [-57.31236, -30.25684], + [-57.20678, -30.28146], + [-57.1094, -30.11184], + [-56.83509, -30.0882], + [-56.78015, -30.15948], + [-56.65871, -30.19724], + [-56.61652, -30.29963], + [-56.41555, -30.4267], + [-56.38321, -30.49237], + [-56.175, -30.6138], + [-56.13027, -30.73259], + [-56.06788, -30.73839], + [-55.98628, -30.85675], + [-56.00782, -31.06265], + [-55.8698, -31.07957], + [-55.65109, -30.95132], + [-55.60038, -30.84372], + [-55.38179, -31.02789], + [-55.24436, -31.25382], + [-55.11513, -31.31892], + [-55.01371, -31.28195], + [-54.82793, -31.44511], + [-54.7246, -31.43774], + [-54.50461, -31.51317], + [-54.42052, -31.62947], + [-54.4608, -31.66294], + [-54.09551, -31.90559], + [-54.02247, -31.8928], + [-53.7414, -32.0791], + [-53.6345, -32.29165], + [-53.63164, -32.3816], + [-53.41829, -32.56122], + [-53.243, -32.6024], + [-53.09425, -32.73335], + [-53.24783, -32.86353], + [-53.29846, -32.94844], + [-53.4844, -33.07807], + [-53.53154, -33.2077], + [-53.50012, -33.3998], + [-53.52366, -33.68611], + [-53.3721, -33.74812], + [-52, -33.7399], + [-52, -40], + [-79.31855, -40], + [-82.24915, -28.94332], + [-77.10206, -18.33367], + [-70.37842, -18.34932], + [-70.30152, -18.3076], + [-70.15046, -18.31803], + [-69.96918, -18.26327], + [-69.85932, -18.17195], + [-69.75769, -17.98919], + [-69.82911, -17.74084], + [-69.79615, -17.64403], + [-69.6698, -17.66235], + [-69.4693, -17.49739], + [-69.47205, -17.36899], + [-69.63959, -17.28771], + [-69.55994, -17.16704], + [-69.37592, -17.07254], + [-69.3924, -17.02265], + [-69.18915, -16.79666], + [-69.17267, -16.72565], + [-68.99689, -16.65988], + [-69.04358, -16.58356], + [-69.01447, -16.5], + [-58.3374, -16.5], + [-58.34377, -16.51773], + [-58.35383, -16.52347], + [-58.3577, -16.52938] + ] + ] + }, + "properties": { "ituzone": "14" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "15": { + "mh": [ + "GF19", + "GF28", + "GF29", + "GF36", + "GF37", + "GF38", + "GF39", + "GF40", + "GF41", + "GF42", + "GF43", + "GF44", + "GF45", + "GF46", + "GF47", + "GF48", + "GF49", + "GF50", + "GF51", + "GF52", + "GF53", + "GF54", + "GF55", + "GF56", + "GF57", + "GF58", + "GF59", + "GF60", + "GF61", + "GF62", + "GF63", + "GF64", + "GF65", + "GF66", + "GF67", + "GF68", + "GF69", + "GF70", + "GF71", + "GF72", + "GF73", + "GF74", + "GF75", + "GF76", + "GF77", + "GF78", + "GF79", + "GF80", + "GF81", + "GF82", + "GF83", + "GF84", + "GF85", + "GF86", + "GF87", + "GF88", + "GF89", + "GF90", + "GF91", + "GF92", + "GF93", + "GF94", + "GF95", + "GF96", + "GF97", + "GF98", + "GF99", + "GG09", + "GG10", + "GG11", + "GG17", + "GG18", + "GG19", + "GG20", + "GG21", + "GG22", + "GG24", + "GG25", + "GG26", + "GG27", + "GG28", + "GG29", + "GG30", + "GG31", + "GG32", + "GG33", + "GG34", + "GG35", + "GG36", + "GG37", + "GG38", + "GG39", + "GG40", + "GG41", + "GG42", + "GG43", + "GG44", + "GG45", + "GG46", + "GG47", + "GG48", + "GG49", + "GG50", + "GG51", + "GG52", + "GG53", + "GG54", + "GG55", + "GG56", + "GG57", + "GG58", + "GG59", + "GG60", + "GG61", + "GG62", + "GG63", + "GG64", + "GG65", + "GG66", + "GG67", + "GG68", + "GG69", + "GG70", + "GG71", + "GG72", + "GG73", + "GG74", + "GG75", + "GG76", + "GG77", + "GG78", + "GG79", + "GG80", + "GG81", + "GG82", + "GG83", + "GG84", + "GG85", + "GG86", + "GG87", + "GG88", + "GG89", + "GG90", + "GG91", + "GG92", + "GG93", + "GG94", + "GG95", + "GG96", + "GG97", + "GG98", + "GG99", + "GH00", + "GH02", + "GH03", + "GH10", + "GH11", + "GH12", + "GH13", + "GH20", + "GH21", + "GH22", + "GH23", + "GH30", + "GH31", + "GH32", + "GH33", + "GH40", + "GH41", + "GH42", + "GH43", + "GH50", + "GH51", + "GH52", + "GH53", + "GH60", + "GH61", + "GH62", + "GH63", + "GH70", + "GH71", + "GH72", + "GH73", + "GH80", + "GH81", + "GH82", + "GH83", + "GH90", + "GH91", + "GH92", + "GH93", + "HF00", + "HF01", + "HF02", + "HF03", + "HF04", + "HF05", + "HF06", + "HF07", + "HF08", + "HF09", + "HF10", + "HF11", + "HF12", + "HF13", + "HF14", + "HF15", + "HF16", + "HF17", + "HF18", + "HF19", + "HF20", + "HF21", + "HF22", + "HF23", + "HF24", + "HF25", + "HF26", + "HF27", + "HF28", + "HF29", + "HF30", + "HF31", + "HF32", + "HF33", + "HF34", + "HF35", + "HF36", + "HF37", + "HF38", + "HF39", + "HF40", + "HF41", + "HF42", + "HF43", + "HF44", + "HF45", + "HF46", + "HF47", + "HF48", + "HF49", + "HF50", + "HF51", + "HF52", + "HF53", + "HF54", + "HF55", + "HF56", + "HF57", + "HF58", + "HF59", + "HG00", + "HG01", + "HG02", + "HG03", + "HG04", + "HG05", + "HG06", + "HG07", + "HG08", + "HG09", + "HG10", + "HG11", + "HG12", + "HG13", + "HG14", + "HG15", + "HG16", + "HG17", + "HG18", + "HG19", + "HG20", + "HG21", + "HG22", + "HG23", + "HG24", + "HG25", + "HG26", + "HG27", + "HG28", + "HG29", + "HG30", + "HG31", + "HG32", + "HG33", + "HG34", + "HG35", + "HG36", + "HG37", + "HG38", + "HG39", + "HG40", + "HG41", + "HG42", + "HG43", + "HG44", + "HG45", + "HG46", + "HG47", + "HG48", + "HG49", + "HG50", + "HG51", + "HG52", + "HG53", + "HG54", + "HG55", + "HG56", + "HG57", + "HG58", + "HG59", + "HH00", + "HH01", + "HH02", + "HH03", + "HH10", + "HH11", + "HH12", + "HH13", + "HH20", + "HH21", + "HH22", + "HH23", + "HH30", + "HH31", + "HH32", + "HH33", + "HH40", + "HH41", + "HH42", + "HH43", + "HH50", + "HH51", + "HH52", + "HH53" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-28, -16.5], + [-28, -40], + [-52, -40], + [-52, -33.7399], + [-53.3721, -33.74812], + [-53.52366, -33.68611], + [-53.50012, -33.3998], + [-53.53154, -33.2077], + [-53.4844, -33.07807], + [-53.29846, -32.94844], + [-53.24783, -32.86353], + [-53.09425, -32.73335], + [-53.243, -32.6024], + [-53.41829, -32.56122], + [-53.63164, -32.3816], + [-53.6345, -32.29165], + [-53.7414, -32.0791], + [-54.02247, -31.8928], + [-54.09551, -31.90559], + [-54.4608, -31.66294], + [-54.42052, -31.62947], + [-54.50461, -31.51317], + [-54.7246, -31.43774], + [-54.82793, -31.44511], + [-55.01371, -31.28195], + [-55.11513, -31.31892], + [-55.24436, -31.25382], + [-55.38179, -31.02789], + [-55.60038, -30.84372], + [-55.65109, -30.95132], + [-55.8698, -31.07957], + [-56.00782, -31.06265], + [-55.98628, -30.85675], + [-56.06788, -30.73839], + [-56.13027, -30.73259], + [-56.175, -30.6138], + [-56.38321, -30.49237], + [-56.41555, -30.4267], + [-56.61652, -30.29963], + [-56.65871, -30.19724], + [-56.78015, -30.15948], + [-56.83509, -30.0882], + [-57.1094, -30.11184], + [-57.20678, -30.28146], + [-57.31236, -30.25684], + [-57.55003, -30.26362], + [-57.614, -30.18079], + [-57.50484, -30.14307], + [-57.34197, -30.00123], + [-57.31834, -29.86758], + [-57.23599, -29.77837], + [-57.1045, -29.74897], + [-56.76516, -29.38034], + [-56.70841, -29.36194], + [-56.59307, -29.123], + [-56.42479, -29.07289], + [-56.41017, -28.97657], + [-56.31402, -28.91597], + [-56.28426, -28.79104], + [-56.1917, -28.77275], + [-56.01221, -28.6042], + [-55.99896, -28.50311], + [-55.8935, -28.48135], + [-55.86767, -28.35383], + [-55.68982, -28.41537], + [-55.66826, -28.33715], + [-55.76515, -28.27185], + [-55.58501, -28.1196], + [-55.37864, -28.04034], + [-55.323, -27.92809], + [-55.196, -27.86307], + [-55.12523, -27.88991], + [-55.02546, -27.83086], + [-55.0809, -27.78733], + [-54.94719, -27.78002], + [-54.90295, -27.6465], + [-54.817, -27.5399], + [-54.78449, -27.58403], + [-54.62036, -27.54798], + [-54.58119, -27.46039], + [-54.53106, -27.50495], + [-54.41495, -27.41213], + [-54.33692, -27.46127], + [-54.22221, -27.38837], + [-54.18704, -27.27358], + [-54.08906, -27.30265], + [-53.94872, -27.15544], + [-53.83033, -27.17095], + [-53.67757, -26.92408], + [-53.74945, -26.64891], + [-53.7117, -26.55727], + [-53.68485, -26.33662], + [-53.59184, -26.26489], + [-53.72378, -26.12672], + [-53.71822, -26.07322], + [-53.82095, -25.9819], + [-53.82299, -25.79061], + [-53.89388, -25.62282], + [-54.02073, -25.56772], + [-54.10349, -25.61977], + [-54.11467, -25.50207], + [-54.25937, -25.59488], + [-54.38163, -25.60213], + [-54.44508, -25.69302], + [-54.59565, -25.59212], + [-54.61596, -25.45622], + [-54.43628, -25.14377], + [-54.46499, -25.07633], + [-54.40454, -24.83327], + [-54.3351, -24.64641], + [-54.33231, -24.48995], + [-54.26245, -24.37446], + [-54.33062, -24.14825], + [-54.28363, -24.08298], + [-54.31899, -24.00902], + [-54.48266, -23.8819], + [-54.67534, -23.81357], + [-54.90421, -23.90578], + [-54.93177, -23.96147], + [-55.11151, -23.96019], + [-55.23028, -24.0086], + [-55.44091, -23.90949], + [-55.43666, -23.70736], + [-55.5346, -23.61096], + [-55.53882, -23.163], + [-55.58928, -23.14399], + [-55.68268, -22.98044], + [-55.6255, -22.75897], + [-55.62668, -22.61865], + [-55.72369, -22.54521], + [-55.74503, -22.3865], + [-55.861, -22.27633], + [-56.20774, -22.27811], + [-56.34079, -22.20322], + [-56.40268, -22.07474], + [-56.51828, -22.10031], + [-56.64558, -22.24499], + [-56.70499, -22.21508], + [-56.83047, -22.29767], + [-56.99985, -22.22269], + [-57.24951, -22.24018], + [-57.58338, -22.16429], + [-57.61577, -22.09343], + [-57.79775, -22.14207], + [-57.92706, -22.11743], + [-58.00463, -22.02924], + [-57.92017, -21.87263], + [-57.94639, -21.74379], + [-57.89317, -21.68447], + [-57.96282, -21.54906], + [-57.85877, -21.31074], + [-57.8651, -21.03861], + [-57.81812, -20.98124], + [-57.92006, -20.88113], + [-57.86872, -20.73685], + [-57.95794, -20.69962], + [-58.01481, -20.60527], + [-57.99353, -20.44561], + [-58.07679, -20.37681], + [-58.09134, -20.2544], + [-58.16252, -20.23957], + [-58.15611, -20.15085], + [-57.87669, -19.96589], + [-58.1334, -19.75785], + [-57.7842, -19.03351], + [-57.71014, -19.0326], + [-57.71978, -18.89907], + [-57.76661, -18.89929], + [-57.55777, -18.24036], + [-57.45385, -18.2312], + [-57.5748, -18.13189], + [-57.7206, -17.82786], + [-57.71481, -17.73372], + [-57.78505, -17.6455], + [-57.7856, -17.55555], + [-57.8992, -17.4595], + [-58.00256, -17.51955], + [-58.06008, -17.45073], + [-58.24199, -17.36288], + [-58.39547, -17.18447], + [-58.43144, -16.99083], + [-58.47435, -16.93496], + [-58.46304, -16.65223], + [-58.3577, -16.52938], + [-58.35476, -16.52467], + [-28, -16.5] + ] + ] + }, + "properties": { "ituzone": "15" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "16": { + "mh": [ + "FD10", + "FD11", + "FD12", + "FD13", + "FD14", + "FD15", + "FD16", + "FD17", + "FD18", + "FD19", + "FD20", + "FD21", + "FD22", + "FD23", + "FD24", + "FD25", + "FD26", + "FD27", + "FD28", + "FD29", + "FD30", + "FD31", + "FD32", + "FD33", + "FD34", + "FD35", + "FD36", + "FD37", + "FD38", + "FD39", + "FD40", + "FD41", + "FD42", + "FD43", + "FD44", + "FD45", + "FD46", + "FD47", + "FD48", + "FD49", + "FD50", + "FD51", + "FD52", + "FD53", + "FD54", + "FD55", + "FD56", + "FD57", + "FD58", + "FD59", + "FD60", + "FD61", + "FD62", + "FD63", + "FD64", + "FD65", + "FD66", + "FD67", + "FD68", + "FD69", + "FD70", + "FD71", + "FD72", + "FD73", + "FD74", + "FD75", + "FD76", + "FD77", + "FD78", + "FD79", + "FD80", + "FD81", + "FD82", + "FD83", + "FD84", + "FD85", + "FD86", + "FD87", + "FD88", + "FD89", + "FD90", + "FD91", + "FD92", + "FD93", + "FD94", + "FD95", + "FD96", + "FD97", + "FD98", + "FD99", + "FE10", + "FE11", + "FE12", + "FE13", + "FE14", + "FE15", + "FE16", + "FE17", + "FE18", + "FE19", + "FE20", + "FE21", + "FE22", + "FE23", + "FE24", + "FE25", + "FE26", + "FE27", + "FE28", + "FE29", + "FE30", + "FE31", + "FE32", + "FE33", + "FE34", + "FE35", + "FE36", + "FE37", + "FE38", + "FE39", + "FE40", + "FE41", + "FE42", + "FE43", + "FE44", + "FE45", + "FE46", + "FE47", + "FE48", + "FE49", + "FE50", + "FE51", + "FE52", + "FE53", + "FE54", + "FE55", + "FE56", + "FE57", + "FE58", + "FE59", + "FE60", + "FE61", + "FE62", + "FE63", + "FE64", + "FE65", + "FE66", + "FE67", + "FE68", + "FE69", + "FE70", + "FE71", + "FE72", + "FE73", + "FE74", + "FE75", + "FE76", + "FE77", + "FE78", + "FE79", + "FE80", + "FE81", + "FE82", + "FE83", + "FE84", + "FE85", + "FE86", + "FE87", + "FE88", + "FE89", + "FE90", + "FE91", + "FE92", + "FE93", + "FE94", + "FE95", + "FE96", + "FE97", + "FE98", + "FE99", + "GD00", + "GD01", + "GD02", + "GD03", + "GD04", + "GD05", + "GD06", + "GD07", + "GD08", + "GD09", + "GD10", + "GD11", + "GD12", + "GD13", + "GD14", + "GD15", + "GD16", + "GD17", + "GD18", + "GD19", + "GD20", + "GD21", + "GD22", + "GD23", + "GD24", + "GD25", + "GD26", + "GD27", + "GD28", + "GD29", + "GE00", + "GE01", + "GE02", + "GE03", + "GE04", + "GE05", + "GE06", + "GE07", + "GE08", + "GE09", + "GE10", + "GE11", + "GE12", + "GE13", + "GE14", + "GE15", + "GE16", + "GE17", + "GE18", + "GE19", + "GE20", + "GE21", + "GE22", + "GE23", + "GE24", + "GE25", + "GE26", + "GE27", + "GE28", + "GE29" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-78, -40], + [-55, -40], + [-55, -60], + [-78, -60], + [-78, -40] + ] + ] + }, + "properties": { "ituzone": "16" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "17": { + "mh": [ + "GO54", + "GO55", + "GO64", + "GO65", + "GO66", + "GO74", + "GO75", + "GO76", + "GO77", + "GO85", + "GO86", + "GO87", + "GO88", + "GO95", + "GO96", + "GO97", + "GO98", + "GO99", + "HO05", + "HO06", + "HO07", + "HO08", + "HO09", + "HO16", + "HO17", + "HO18", + "HO19", + "HO26", + "HO27", + "HO28", + "HO29", + "HO37", + "HO38", + "HO39", + "HO47", + "HO48", + "HO49", + "HO57", + "HO58", + "HO59", + "HO68", + "HO69", + "HO78", + "HO79", + "HO88", + "HO89", + "HO99", + "HP00", + "HP01", + "HP10", + "HP11", + "HP12", + "HP20", + "HP21", + "HP22", + "HP23", + "HP30", + "HP31", + "HP32", + "HP33", + "HP34", + "HP40", + "HP41", + "HP42", + "HP43", + "HP44", + "HP45", + "HP50", + "HP51", + "HP52", + "HP53", + "HP54", + "HP55", + "HP56", + "HP60", + "HP61", + "HP62", + "HP63", + "HP64", + "HP65", + "HP66", + "HP70", + "HP71", + "HP72", + "HP73", + "HP74", + "HP75", + "HP76", + "HP77", + "HP80", + "HP81", + "HP82", + "HP83", + "HP84", + "HP85", + "HP86", + "HP87", + "HP88", + "HP90", + "HP91", + "HP92", + "HP93", + "HP94", + "HP95", + "HP96", + "HP97", + "HP98", + "HP99", + "IO09", + "IO19", + "IP00", + "IP01", + "IP02", + "IP03", + "IP04", + "IP05", + "IP06", + "IP07", + "IP08", + "IP09", + "IP10", + "IP11", + "IP12", + "IP13", + "IP14", + "IP15", + "IP16", + "IP17", + "IP18", + "IP19", + "IP20", + "IP21", + "IP22", + "IP23", + "IP24", + "IP25", + "IP26", + "IP27", + "IP28", + "IP29", + "IP30", + "IP31", + "IP32", + "IP33", + "IP34", + "IP35", + "IP36", + "IP37", + "IP38", + "IP39", + "IP40", + "IP41", + "IP42", + "IP43", + "IP44", + "IP45", + "IP46", + "IP47", + "IP48", + "IP49", + "IQ00", + "IQ10", + "IQ20", + "IQ21", + "IQ30", + "IQ31", + "IQ32", + "IQ40", + "IQ41", + "IQ42" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-10, 73], + [-10, 61], + [-50, 54], + [-10, 73] + ] + ] + }, + "properties": { "ituzone": "17" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "18": { + "mh": [ + "IP51", + "IP52", + "IP53", + "IP54", + "IP55", + "IP56", + "IP57", + "IP58", + "IP59", + "IP61", + "IP62", + "IP63", + "IP64", + "IP65", + "IP66", + "IP67", + "IP68", + "IP69", + "IP71", + "IP72", + "IP73", + "IP74", + "IP75", + "IP76", + "IP77", + "IP78", + "IP79", + "IP81", + "IP82", + "IP83", + "IP84", + "IP85", + "IP86", + "IP87", + "IP88", + "IP89", + "IP91", + "IP92", + "IP93", + "IP94", + "IP95", + "IP96", + "IP97", + "IP98", + "IP99", + "IQ50", + "IQ51", + "IQ52", + "IQ53", + "IQ54", + "IQ55", + "IQ56", + "IQ57", + "IQ58", + "IQ59", + "IQ60", + "IQ61", + "IQ62", + "IQ63", + "IQ64", + "IQ65", + "IQ66", + "IQ67", + "IQ68", + "IQ69", + "IQ70", + "IQ71", + "IQ72", + "IQ73", + "IQ74", + "IQ75", + "IQ76", + "IQ77", + "IQ78", + "IQ79", + "IQ80", + "IQ81", + "IQ82", + "IQ83", + "IQ84", + "IQ85", + "IQ86", + "IQ87", + "IQ88", + "IQ89", + "IQ90", + "IQ91", + "IQ92", + "IQ93", + "IQ94", + "IQ95", + "IQ96", + "IQ97", + "IQ98", + "IQ99", + "JO18", + "JO19", + "JO25", + "JO26", + "JO27", + "JO28", + "JO29", + "JO35", + "JO36", + "JO37", + "JO38", + "JO39", + "JO44", + "JO45", + "JO46", + "JO47", + "JO48", + "JO49", + "JO54", + "JO55", + "JO56", + "JO57", + "JO58", + "JO59", + "JO64", + "JO65", + "JO66", + "JO67", + "JO68", + "JO69", + "JO74", + "JO75", + "JO76", + "JO77", + "JO78", + "JO79", + "JO85", + "JO86", + "JO87", + "JO88", + "JO89", + "JO95", + "JO96", + "JO97", + "JO98", + "JO99", + "JP01", + "JP02", + "JP03", + "JP04", + "JP05", + "JP06", + "JP07", + "JP08", + "JP09", + "JP10", + "JP11", + "JP12", + "JP13", + "JP14", + "JP15", + "JP16", + "JP17", + "JP18", + "JP19", + "JP20", + "JP21", + "JP22", + "JP23", + "JP24", + "JP25", + "JP26", + "JP27", + "JP28", + "JP29", + "JP30", + "JP31", + "JP32", + "JP33", + "JP34", + "JP35", + "JP36", + "JP37", + "JP38", + "JP39", + "JP40", + "JP41", + "JP42", + "JP43", + "JP44", + "JP45", + "JP46", + "JP47", + "JP48", + "JP49", + "JP50", + "JP51", + "JP52", + "JP53", + "JP54", + "JP55", + "JP56", + "JP57", + "JP58", + "JP59", + "JP60", + "JP61", + "JP62", + "JP63", + "JP64", + "JP65", + "JP66", + "JP67", + "JP68", + "JP69", + "JP70", + "JP71", + "JP72", + "JP73", + "JP74", + "JP75", + "JP76", + "JP77", + "JP78", + "JP79", + "JP80", + "JP81", + "JP82", + "JP83", + "JP84", + "JP85", + "JP86", + "JP87", + "JP88", + "JP89", + "JP90", + "JP91", + "JP92", + "JP93", + "JP94", + "JP95", + "JP96", + "JP97", + "JP98", + "JP99", + "JQ00", + "JQ01", + "JQ02", + "JQ03", + "JQ04", + "JQ05", + "JQ06", + "JQ07", + "JQ08", + "JQ09", + "JQ10", + "JQ11", + "JQ12", + "JQ13", + "JQ14", + "JQ15", + "JQ16", + "JQ17", + "JQ18", + "JQ19", + "JQ20", + "JQ21", + "JQ22", + "JQ23", + "JQ24", + "JQ25", + "JQ26", + "JQ27", + "JQ28", + "JQ29", + "JQ30", + "JQ31", + "JQ32", + "JQ33", + "JQ34", + "JQ35", + "JQ36", + "JQ37", + "JQ38", + "JQ39", + "JQ40", + "JQ41", + "JQ42", + "JQ43", + "JQ44", + "JQ45", + "JQ46", + "JQ47", + "JQ48", + "JQ49", + "JQ50", + "JQ51", + "JQ52", + "JQ53", + "JQ54", + "JQ55", + "JQ56", + "JQ57", + "JQ58", + "JQ59", + "JQ60", + "JQ61", + "JQ62", + "JQ63", + "JQ64", + "JQ65", + "JQ66", + "JQ67", + "JQ68", + "JQ69", + "JQ70", + "JQ71", + "JQ72", + "JQ73", + "JQ74", + "JQ75", + "JQ76", + "JQ77", + "JQ78", + "JQ79", + "JQ80", + "JQ81", + "JQ82", + "JQ83", + "JQ84", + "JQ85", + "JQ86", + "JQ87", + "JQ88", + "JQ89", + "JQ90", + "JQ91", + "JQ92", + "JQ93", + "JQ94", + "JQ95", + "JQ96", + "JQ97", + "JQ98", + "JQ99", + "KO07", + "KO08", + "KO09", + "KO19", + "KO29", + "KP00", + "KP01", + "KP02", + "KP03", + "KP04", + "KP05", + "KP06", + "KP07", + "KP08", + "KP09", + "KP10", + "KP11", + "KP12", + "KP13", + "KP14", + "KP15", + "KP16", + "KP17", + "KP18", + "KP19", + "KP20", + "KP21", + "KP22", + "KP23", + "KP24", + "KP25", + "KP26", + "KP27", + "KP28", + "KP29", + "KP30", + "KP31", + "KP32", + "KP33", + "KP34", + "KP35", + "KP36", + "KP37", + "KP38", + "KP39", + "KP40", + "KP41", + "KP42", + "KP43", + "KP44", + "KP45", + "KP46", + "KP47", + "KP48", + "KP49", + "KP51", + "KP52", + "KP53", + "KP54", + "KP55", + "KP57", + "KP59", + "KQ00", + "KQ01", + "KQ02", + "KQ03", + "KQ04", + "KQ05", + "KQ06", + "KQ07", + "KQ08", + "KQ09", + "KQ10", + "KQ11", + "KQ12", + "KQ13", + "KQ14", + "KQ15", + "KQ16", + "KQ17", + "KQ18", + "KQ19", + "KQ20", + "KQ21", + "KQ22", + "KQ23", + "KQ24", + "KQ25", + "KQ26", + "KQ27", + "KQ28", + "KQ29", + "KQ30", + "KQ31", + "KQ32", + "KQ33", + "KQ34", + "KQ35", + "KQ36", + "KQ37", + "KQ38", + "KQ39", + "KQ40", + "KQ41", + "KQ42", + "KQ43", + "KQ44", + "KQ45", + "KQ46", + "KQ47", + "KQ48", + "KQ49", + "KQ50", + "KQ51", + "KQ52", + "KQ53", + "KQ54", + "KQ55", + "KQ56", + "KQ57", + "KQ58", + "KQ59" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-10, 61], + [-10, 80], + [32, 80], + [32, 70], + [30.83395, 69.80903], + [30.94652, 69.68099], + [30.93771, 69.5622], + [30.81534, 69.52842], + [30.52267, 69.54073], + [30.15328, 69.6702], + [30.18947, 69.56538], + [30.1128, 69.46647], + [29.95341, 69.40518], + [29.86853, 69.42553], + [29.56914, 69.3175], + [29.28618, 69.29669], + [29.31362, 69.23818], + [29.23943, 69.1116], + [29.04212, 69.01007], + [28.92959, 69.05153], + [28.41807, 68.91512], + [28.46719, 68.88589], + [28.80195, 68.86853], + [28.70864, 68.7334], + [28.43406, 68.54045], + [28.64708, 68.19796], + [29.33251, 68.07123], + [29.68346, 67.79256], + [30.01244, 67.66727], + [29.92944, 67.5234], + [29.05847, 66.98847], + [29.03704, 66.86997], + [29.10656, 66.79938], + [29.29144, 66.69851], + [29.4945, 66.53361], + [29.71044, 66.25916], + [29.92089, 66.11988], + [30.08361, 65.87291], + [30.13476, 65.67077], + [29.99782, 65.69433], + [29.71805, 65.63643], + [29.86164, 65.56583], + [29.73607, 65.47474], + [29.74234, 65.34715], + [29.6026, 65.26128], + [29.63358, 65.23096], + [29.89527, 65.20524], + [29.81639, 65.14263], + [29.88034, 65.11233], + [29.61821, 65.06358], + [29.60211, 64.91404], + [29.73983, 64.78778], + [30.03723, 64.78739], + [30.04563, 64.71539], + [30.13095, 64.64807], + [29.96486, 64.57907], + [30.12159, 64.3584], + [30.24454, 64.34419], + [30.3948, 64.27054], + [30.49902, 64.25873], + [30.46576, 64.19693], + [30.55305, 64.12588], + [30.53597, 64.04284], + [30.30954, 63.91156], + [30.26499, 63.81994], + [29.97814, 63.75289], + [30.50411, 63.46099], + [30.76194, 63.41026], + [31.22268, 63.22025], + [31.31572, 63.08066], + [31.62057, 62.92342], + [31.18934, 62.4652], + [30.03302, 61.78308], + [29.30239, 61.32151], + [29.23128, 61.25782], + [28.75426, 61.07212], + [28.65657, 60.95013], + [28.5351, 60.96115], + [27.85211, 60.58287], + [27.72636, 60.39067], + [27.58109, 60.29591], + [20.51806, 58.95105], + [19.39575, 56.23785], + [15.07727, 54.74072], + [13.40142, 54.83253], + [12.14602, 54.47168], + [11.28613, 54.5692], + [10.00537, 54.80993], + [9.81125, 54.81183], + [9.63911, 54.84221], + [9.60245, 54.88714], + [9.3421, 54.80049], + [9.24527, 54.84643], + [8.9575, 54.90195], + [8.72995, 54.89316], + [8.61343, 54.9164], + [8.53985, 55.03551], + [8.42565, 55.07829], + [5.97802, 55.07554], + [2, 61], + [-10, 61] + ] + ] + }, + "properties": { "ituzone": "18" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "19": { + "mh": [ + "KP41", + "KP44", + "KP45", + "KP46", + "KP47", + "KP48", + "KP49", + "KP50", + "KP51", + "KP52", + "KP53", + "KP54", + "KP55", + "KP56", + "KP57", + "KP58", + "KP59", + "KP60", + "KP61", + "KP62", + "KP63", + "KP64", + "KP65", + "KP66", + "KP67", + "KP68", + "KP69", + "KP70", + "KP71", + "KP72", + "KP73", + "KP74", + "KP75", + "KP76", + "KP77", + "KP78", + "KP79", + "KP80", + "KP81", + "KP82", + "KP83", + "KP84", + "KP85", + "KP86", + "KP87", + "KP88", + "KP89", + "KP90", + "KP91", + "KP92", + "KP93", + "KP94", + "KP95", + "KP96", + "KP97", + "KP98", + "KP99", + "KQ60", + "KQ61", + "KQ62", + "KQ63", + "KQ64", + "KQ65", + "KQ66", + "KQ67", + "KQ68", + "KQ69", + "KQ70", + "KQ71", + "KQ72", + "KQ73", + "KQ74", + "KQ75", + "KQ76", + "KQ77", + "KQ78", + "KQ79", + "KQ80", + "KQ81", + "KQ82", + "KQ83", + "KQ84", + "KQ85", + "KQ86", + "KQ87", + "KQ88", + "KQ89", + "KQ90", + "KQ91", + "KQ92", + "KQ93", + "KQ94", + "KQ95", + "KQ96", + "KQ97", + "KQ98", + "KQ99", + "LP00", + "LP01", + "LP02", + "LP03", + "LP04", + "LP05", + "LP06", + "LP07", + "LP08", + "LP09", + "LP10", + "LP11", + "LP12", + "LP13", + "LP14", + "LP15", + "LP16", + "LP17", + "LP18", + "LP19", + "LP20", + "LP21", + "LP22", + "LP23", + "LP24", + "LP25", + "LP26", + "LP27", + "LP28", + "LP29", + "LP30", + "LP31", + "LP32", + "LP33", + "LP34", + "LP35", + "LP36", + "LP37", + "LP38", + "LP39", + "LP40", + "LP41", + "LP42", + "LP43", + "LP44", + "LP45", + "LP46", + "LP47", + "LP48", + "LP49", + "LQ00", + "LQ01", + "LQ02", + "LQ03", + "LQ04", + "LQ05", + "LQ06", + "LQ07", + "LQ08", + "LQ09", + "LQ10", + "LQ11", + "LQ12", + "LQ13", + "LQ14", + "LQ15", + "LQ16", + "LQ17", + "LQ18", + "LQ19", + "LQ20", + "LQ21", + "LQ22", + "LQ23", + "LQ24", + "LQ25", + "LQ26", + "LQ27", + "LQ28", + "LQ29", + "LQ30", + "LQ31", + "LQ32", + "LQ33", + "LQ34", + "LQ35", + "LQ36", + "LQ37", + "LQ38", + "LQ39", + "LQ40", + "LQ41", + "LQ42", + "LQ43", + "LQ44", + "LQ45", + "LQ46", + "LQ47", + "LQ48", + "LQ49" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [50, 60], + [31.37316, 60], + [30.46556, 61.11219], + [29.57362, 61.18578], + [29.55061, 61.24308], + [29.41552, 61.26117], + [29.30239, 61.32151], + [30.03302, 61.78308], + [31.18934, 62.4652], + [31.62057, 62.92342], + [31.31572, 63.08066], + [31.22268, 63.22025], + [30.76194, 63.41026], + [30.50411, 63.46099], + [29.97814, 63.75289], + [30.26499, 63.81994], + [30.30954, 63.91156], + [30.53597, 64.04284], + [30.55305, 64.12588], + [30.46576, 64.19693], + [30.49902, 64.25873], + [30.3948, 64.27054], + [30.24454, 64.34419], + [30.12159, 64.3584], + [29.96486, 64.57907], + [30.13095, 64.64807], + [30.04563, 64.71539], + [30.03723, 64.78739], + [29.73983, 64.78778], + [29.60211, 64.91404], + [29.61821, 65.06358], + [29.88034, 65.11233], + [29.81639, 65.14263], + [29.89527, 65.20524], + [29.63358, 65.23096], + [29.6026, 65.26128], + [29.74234, 65.34715], + [29.73607, 65.47474], + [29.86164, 65.56583], + [29.71805, 65.63643], + [29.99782, 65.69433], + [30.13476, 65.67077], + [30.08361, 65.87291], + [29.92089, 66.11988], + [29.71044, 66.25916], + [29.4945, 66.53361], + [29.29144, 66.69851], + [29.10656, 66.79938], + [29.03704, 66.86997], + [29.05847, 66.98847], + [29.92944, 67.5234], + [30.01244, 67.66727], + [29.68346, 67.79256], + [29.33251, 68.07123], + [28.64708, 68.19796], + [28.43406, 68.54045], + [28.70864, 68.7334], + [28.80195, 68.86853], + [28.46719, 68.88589], + [28.41807, 68.91512], + [28.92959, 69.05153], + [29.04212, 69.01007], + [29.23943, 69.1116], + [29.31362, 69.23818], + [29.28618, 69.29669], + [29.56914, 69.3175], + [29.86853, 69.42553], + [29.95341, 69.40518], + [30.1128, 69.46647], + [30.18947, 69.56538], + [30.15328, 69.6702], + [30.52267, 69.54073], + [30.81534, 69.52842], + [30.93771, 69.5622], + [30.94652, 69.68099], + [30.83395, 69.80903], + [32, 70], + [32, 80], + [50, 80], + [50, 60] + ] + ] + }, + "properties": { "ituzone": "19" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "20": { + "mh": [ + "LP50", + "LP51", + "LP52", + "LP53", + "LP54", + "LP55", + "LP56", + "LP57", + "LP58", + "LP59", + "LP60", + "LP61", + "LP62", + "LP63", + "LP64", + "LP65", + "LP66", + "LP67", + "LP68", + "LP69", + "LP70", + "LP71", + "LP72", + "LP73", + "LP74", + "LP75", + "LP76", + "LP77", + "LP78", + "LP79", + "LP80", + "LP81", + "LP82", + "LP83", + "LP84", + "LP85", + "LP86", + "LP87", + "LP88", + "LP89", + "LP90", + "LP91", + "LP92", + "LP93", + "LP94", + "LP95", + "LP96", + "LP97", + "LP98", + "LP99", + "LQ50", + "LQ51", + "LQ52", + "LQ53", + "LQ54", + "LQ55", + "LQ56", + "LQ57", + "LQ58", + "LQ59", + "LQ60", + "LQ61", + "LQ62", + "LQ63", + "LQ64", + "LQ65", + "LQ66", + "LQ67", + "LQ68", + "LQ69", + "LQ70", + "LQ71", + "LQ72", + "LQ73", + "LQ74", + "LQ75", + "LQ76", + "LQ77", + "LQ78", + "LQ79", + "LQ80", + "LQ81", + "LQ82", + "LQ83", + "LQ84", + "LQ85", + "LQ86", + "LQ87", + "LQ88", + "LQ89", + "LQ90", + "LQ91", + "LQ92", + "LQ93", + "LQ94", + "LQ95", + "LQ96", + "LQ97", + "LQ98", + "LQ99", + "MP00", + "MP01", + "MP02", + "MP03", + "MP04", + "MP05", + "MP06", + "MP07", + "MP08", + "MP09", + "MP10", + "MP11", + "MP12", + "MP13", + "MP14", + "MP15", + "MP16", + "MP17", + "MP18", + "MP19", + "MP20", + "MP21", + "MP22", + "MP23", + "MP24", + "MP25", + "MP26", + "MP27", + "MP28", + "MP29", + "MP30", + "MP31", + "MP32", + "MP33", + "MP34", + "MP35", + "MP36", + "MP37", + "MP38", + "MP39", + "MP40", + "MP41", + "MP42", + "MP43", + "MP44", + "MP45", + "MP46", + "MP47", + "MP48", + "MP49", + "MP50", + "MP51", + "MP52", + "MP53", + "MP54", + "MP55", + "MP56", + "MP57", + "MP58", + "MP59", + "MP60", + "MP61", + "MP62", + "MP63", + "MP64", + "MP65", + "MP66", + "MP67", + "MP68", + "MP69", + "MP70", + "MP71", + "MP72", + "MP73", + "MP74", + "MP75", + "MP76", + "MP77", + "MP78", + "MP79", + "MQ00", + "MQ01", + "MQ02", + "MQ03", + "MQ04", + "MQ05", + "MQ06", + "MQ07", + "MQ08", + "MQ09", + "MQ10", + "MQ11", + "MQ12", + "MQ13", + "MQ14", + "MQ15", + "MQ16", + "MQ17", + "MQ18", + "MQ19", + "MQ20", + "MQ21", + "MQ22", + "MQ23", + "MQ24", + "MQ25", + "MQ26", + "MQ27", + "MQ28", + "MQ29", + "MQ30", + "MQ31", + "MQ32", + "MQ33", + "MQ34", + "MQ35", + "MQ36", + "MQ37", + "MQ38", + "MQ39", + "MQ40", + "MQ41", + "MQ42", + "MQ43", + "MQ44", + "MQ45", + "MQ46", + "MQ47", + "MQ48", + "MQ49", + "MQ50", + "MQ51", + "MQ52", + "MQ53", + "MQ54", + "MQ55", + "MQ56", + "MQ57", + "MQ58", + "MQ59", + "MQ60", + "MQ61", + "MQ62", + "MQ63", + "MQ64", + "MQ65", + "MQ66", + "MQ67", + "MQ68", + "MQ69", + "MQ70", + "MQ71", + "MQ72", + "MQ73", + "MQ74", + "MQ75", + "MQ76", + "MQ77", + "MQ78", + "MQ79" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [50, 80], + [75, 80], + [75, 60], + [50, 60], + [50, 80] + ] + ] + }, + "properties": { "ituzone": "20" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "21": { + "mh": [ + "MP70", + "MP71", + "MP72", + "MP73", + "MP74", + "MP75", + "MP76", + "MP77", + "MP78", + "MP79", + "MP80", + "MP81", + "MP82", + "MP83", + "MP84", + "MP85", + "MP86", + "MP87", + "MP88", + "MP89", + "MP90", + "MP91", + "MP92", + "MP93", + "MP94", + "MP95", + "MP96", + "MP97", + "MP98", + "MP99", + "MQ70", + "MQ71", + "MQ72", + "MQ73", + "MQ74", + "MQ75", + "MQ76", + "MQ77", + "MQ78", + "MQ79", + "MQ80", + "MQ81", + "MQ82", + "MQ83", + "MQ84", + "MQ85", + "MQ86", + "MQ87", + "MQ88", + "MQ89", + "MQ90", + "MQ91", + "MQ92", + "MQ93", + "MQ94", + "MQ95", + "MQ96", + "MQ97", + "MQ98", + "MQ99", + "NP00", + "NP01", + "NP02", + "NP03", + "NP04", + "NP05", + "NP06", + "NP07", + "NP08", + "NP09", + "NP10", + "NP11", + "NP12", + "NP13", + "NP14", + "NP15", + "NP16", + "NP17", + "NP18", + "NP19", + "NP20", + "NP21", + "NP22", + "NP23", + "NP24", + "NP25", + "NP26", + "NP27", + "NP28", + "NP29", + "NP30", + "NP31", + "NP32", + "NP33", + "NP34", + "NP35", + "NP36", + "NP37", + "NP38", + "NP39", + "NP40", + "NP41", + "NP42", + "NP43", + "NP44", + "NP45", + "NP46", + "NP47", + "NP48", + "NP49", + "NQ00", + "NQ01", + "NQ02", + "NQ03", + "NQ04", + "NQ05", + "NQ06", + "NQ07", + "NQ08", + "NQ09", + "NQ10", + "NQ11", + "NQ12", + "NQ13", + "NQ14", + "NQ15", + "NQ16", + "NQ17", + "NQ18", + "NQ19", + "NQ20", + "NQ21", + "NQ22", + "NQ23", + "NQ24", + "NQ25", + "NQ26", + "NQ27", + "NQ28", + "NQ29", + "NQ30", + "NQ31", + "NQ32", + "NQ33", + "NQ34", + "NQ35", + "NQ36", + "NQ37", + "NQ38", + "NQ39", + "NQ40", + "NQ41", + "NQ42", + "NQ43", + "NQ44", + "NQ45", + "NQ46", + "NQ47", + "NQ48", + "NQ49" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [75, 80], + [90, 80], + [90, 60], + [75, 60], + [75, 80] + ] + ] + }, + "properties": { "ituzone": "21" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "22": { + "mh": [ + "NP50", + "NP51", + "NP52", + "NP53", + "NP54", + "NP55", + "NP56", + "NP57", + "NP58", + "NP59", + "NP60", + "NP61", + "NP62", + "NP63", + "NP64", + "NP65", + "NP66", + "NP67", + "NP68", + "NP69", + "NP70", + "NP71", + "NP72", + "NP73", + "NP74", + "NP75", + "NP76", + "NP77", + "NP78", + "NP79", + "NP80", + "NP81", + "NP82", + "NP83", + "NP84", + "NP85", + "NP86", + "NP87", + "NP88", + "NP89", + "NP90", + "NP91", + "NP92", + "NP93", + "NP94", + "NP95", + "NP96", + "NP97", + "NP98", + "NP99", + "NQ50", + "NQ51", + "NQ52", + "NQ53", + "NQ54", + "NQ55", + "NQ56", + "NQ57", + "NQ58", + "NQ59", + "NQ60", + "NQ61", + "NQ62", + "NQ63", + "NQ64", + "NQ65", + "NQ66", + "NQ67", + "NQ68", + "NQ69", + "NQ70", + "NQ71", + "NQ72", + "NQ73", + "NQ74", + "NQ75", + "NQ76", + "NQ77", + "NQ78", + "NQ79", + "NQ80", + "NQ81", + "NQ82", + "NQ83", + "NQ84", + "NQ85", + "NQ86", + "NQ87", + "NQ88", + "NQ89", + "NQ90", + "NQ91", + "NQ92", + "NQ93", + "NQ94", + "NQ95", + "NQ96", + "NQ97", + "NQ98", + "NQ99", + "OP00", + "OP01", + "OP02", + "OP03", + "OP04", + "OP05", + "OP06", + "OP07", + "OP08", + "OP09", + "OP10", + "OP11", + "OP12", + "OP13", + "OP14", + "OP15", + "OP16", + "OP17", + "OP18", + "OP19", + "OP20", + "OP21", + "OP22", + "OP23", + "OP24", + "OP25", + "OP26", + "OP27", + "OP28", + "OP29", + "OP30", + "OP31", + "OP32", + "OP33", + "OP34", + "OP35", + "OP36", + "OP37", + "OP38", + "OP39", + "OP40", + "OP41", + "OP42", + "OP43", + "OP44", + "OP45", + "OP46", + "OP47", + "OP48", + "OP49", + "OQ00", + "OQ01", + "OQ02", + "OQ03", + "OQ04", + "OQ05", + "OQ06", + "OQ07", + "OQ08", + "OQ09", + "OQ10", + "OQ11", + "OQ12", + "OQ13", + "OQ14", + "OQ15", + "OQ16", + "OQ17", + "OQ18", + "OQ19", + "OQ20", + "OQ21", + "OQ22", + "OQ23", + "OQ24", + "OQ25", + "OQ26", + "OQ27", + "OQ28", + "OQ29", + "OQ30", + "OQ31", + "OQ32", + "OQ33", + "OQ34", + "OQ35", + "OQ36", + "OQ37", + "OQ38", + "OQ39", + "OQ40", + "OQ41", + "OQ42", + "OQ43", + "OQ44", + "OQ45", + "OQ46", + "OQ47", + "OQ48", + "OQ49" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [90, 80], + [110, 80], + [110, 60], + [90, 60], + [90, 80] + ] + ] + }, + "properties": { "ituzone": "22" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "23": { + "mh": [ + "OP50", + "OP51", + "OP52", + "OP53", + "OP54", + "OP55", + "OP56", + "OP57", + "OP58", + "OP59", + "OP60", + "OP61", + "OP62", + "OP63", + "OP64", + "OP65", + "OP66", + "OP67", + "OP68", + "OP69", + "OP70", + "OP71", + "OP72", + "OP73", + "OP74", + "OP75", + "OP76", + "OP77", + "OP78", + "OP79", + "OP80", + "OP81", + "OP82", + "OP83", + "OP84", + "OP85", + "OP86", + "OP87", + "OP88", + "OP89", + "OP90", + "OP91", + "OP92", + "OP93", + "OP94", + "OP95", + "OP96", + "OP97", + "OP98", + "OP99", + "OQ50", + "OQ51", + "OQ52", + "OQ53", + "OQ54", + "OQ55", + "OQ56", + "OQ57", + "OQ58", + "OQ59", + "OQ60", + "OQ61", + "OQ62", + "OQ63", + "OQ64", + "OQ65", + "OQ66", + "OQ67", + "OQ68", + "OQ69", + "OQ70", + "OQ71", + "OQ72", + "OQ73", + "OQ74", + "OQ75", + "OQ76", + "OQ77", + "OQ78", + "OQ79", + "OQ80", + "OQ81", + "OQ82", + "OQ83", + "OQ84", + "OQ85", + "OQ86", + "OQ87", + "OQ88", + "OQ89", + "OQ90", + "OQ91", + "OQ92", + "OQ93", + "OQ94", + "OQ95", + "OQ96", + "OQ97", + "OQ98", + "OQ99", + "PP00", + "PP01", + "PP02", + "PP03", + "PP04", + "PP05", + "PP06", + "PP07", + "PP08", + "PP09", + "PP10", + "PP11", + "PP12", + "PP13", + "PP14", + "PP15", + "PP16", + "PP17", + "PP18", + "PP19", + "PP20", + "PP21", + "PP22", + "PP23", + "PP24", + "PP25", + "PP26", + "PP27", + "PP28", + "PP29", + "PP30", + "PP31", + "PP32", + "PP33", + "PP34", + "PP35", + "PP36", + "PP37", + "PP38", + "PP39", + "PP40", + "PP41", + "PP42", + "PP43", + "PP44", + "PP45", + "PP46", + "PP47", + "PP48", + "PP49", + "PP50", + "PP51", + "PP52", + "PP53", + "PP54", + "PP55", + "PP56", + "PP57", + "PP58", + "PP59", + "PP60", + "PP61", + "PP62", + "PP63", + "PP64", + "PP65", + "PP66", + "PP67", + "PP68", + "PP69", + "PP70", + "PP71", + "PP72", + "PP73", + "PP74", + "PP75", + "PP76", + "PP77", + "PP78", + "PP79", + "PQ00", + "PQ01", + "PQ02", + "PQ03", + "PQ04", + "PQ05", + "PQ06", + "PQ07", + "PQ08", + "PQ09", + "PQ10", + "PQ11", + "PQ12", + "PQ13", + "PQ14", + "PQ15", + "PQ16", + "PQ17", + "PQ18", + "PQ19", + "PQ20", + "PQ21", + "PQ22", + "PQ23", + "PQ24", + "PQ25", + "PQ26", + "PQ27", + "PQ28", + "PQ29", + "PQ30", + "PQ31", + "PQ32", + "PQ33", + "PQ34", + "PQ35", + "PQ36", + "PQ37", + "PQ38", + "PQ39", + "PQ40", + "PQ41", + "PQ42", + "PQ43", + "PQ44", + "PQ45", + "PQ46", + "PQ47", + "PQ48", + "PQ49", + "PQ50", + "PQ51", + "PQ52", + "PQ53", + "PQ54", + "PQ55", + "PQ56", + "PQ57", + "PQ58", + "PQ59", + "PQ60", + "PQ61", + "PQ62", + "PQ63", + "PQ64", + "PQ65", + "PQ66", + "PQ67", + "PQ68", + "PQ69", + "PQ70", + "PQ71", + "PQ72", + "PQ73", + "PQ74", + "PQ75", + "PQ76", + "PQ77", + "PQ78", + "PQ79" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [110, 80], + [135, 80], + [135, 60], + [110, 60], + [110, 80] + ] + ] + }, + "properties": { "ituzone": "23" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "24": { + "mh": [ + "PP70", + "PP71", + "PP72", + "PP73", + "PP74", + "PP75", + "PP76", + "PP77", + "PP78", + "PP79", + "PP80", + "PP81", + "PP82", + "PP83", + "PP84", + "PP85", + "PP86", + "PP87", + "PP88", + "PP89", + "PP90", + "PP91", + "PP92", + "PP93", + "PP94", + "PP95", + "PP96", + "PP97", + "PP98", + "PP99", + "PQ70", + "PQ71", + "PQ72", + "PQ73", + "PQ74", + "PQ75", + "PQ76", + "PQ77", + "PQ78", + "PQ79", + "PQ80", + "PQ81", + "PQ82", + "PQ83", + "PQ84", + "PQ85", + "PQ86", + "PQ87", + "PQ88", + "PQ89", + "PQ90", + "PQ91", + "PQ92", + "PQ93", + "PQ94", + "PQ95", + "PQ96", + "PQ97", + "PQ98", + "PQ99", + "QP00", + "QP01", + "QP02", + "QP03", + "QP04", + "QP05", + "QP06", + "QP07", + "QP08", + "QP09", + "QP10", + "QP11", + "QP12", + "QP13", + "QP14", + "QP15", + "QP16", + "QP17", + "QP18", + "QP19", + "QP20", + "QP21", + "QP22", + "QP23", + "QP24", + "QP25", + "QP26", + "QP27", + "QP28", + "QP29", + "QP30", + "QP31", + "QP32", + "QP33", + "QP34", + "QP35", + "QP36", + "QP37", + "QP38", + "QP39", + "QP40", + "QP41", + "QP42", + "QP43", + "QP44", + "QP45", + "QP46", + "QP47", + "QP48", + "QP49", + "QP50", + "QP51", + "QP52", + "QP53", + "QP54", + "QP55", + "QP56", + "QP57", + "QP58", + "QP59", + "QP60", + "QP61", + "QP62", + "QP63", + "QP64", + "QP65", + "QP66", + "QP67", + "QP68", + "QP69", + "QP70", + "QP71", + "QP72", + "QP73", + "QP74", + "QP75", + "QP76", + "QP77", + "QP78", + "QP79", + "QQ00", + "QQ01", + "QQ02", + "QQ03", + "QQ04", + "QQ05", + "QQ06", + "QQ07", + "QQ08", + "QQ09", + "QQ10", + "QQ11", + "QQ12", + "QQ13", + "QQ14", + "QQ15", + "QQ16", + "QQ17", + "QQ18", + "QQ19", + "QQ20", + "QQ21", + "QQ22", + "QQ23", + "QQ24", + "QQ25", + "QQ26", + "QQ27", + "QQ28", + "QQ29", + "QQ30", + "QQ31", + "QQ32", + "QQ33", + "QQ34", + "QQ35", + "QQ36", + "QQ37", + "QQ38", + "QQ39", + "QQ40", + "QQ41", + "QQ42", + "QQ43", + "QQ44", + "QQ45", + "QQ46", + "QQ47", + "QQ48", + "QQ49", + "QQ50", + "QQ51", + "QQ52", + "QQ53", + "QQ54", + "QQ55", + "QQ56", + "QQ57", + "QQ58", + "QQ59", + "QQ60", + "QQ61", + "QQ62", + "QQ63", + "QQ64", + "QQ65", + "QQ66", + "QQ67", + "QQ68", + "QQ69", + "QQ70", + "QQ71", + "QQ72", + "QQ73", + "QQ74", + "QQ75", + "QQ76", + "QQ77", + "QQ78", + "QQ79" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [135, 80], + [155, 80], + [155, 60], + [135, 60], + [135, 80] + ] + ] + }, + "properties": { "ituzone": "24" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "25": { + "mh": [ + "QP70", + "QP71", + "QP72", + "QP73", + "QP74", + "QP75", + "QP76", + "QP77", + "QP78", + "QP79", + "QP80", + "QP81", + "QP82", + "QP83", + "QP84", + "QP85", + "QP86", + "QP87", + "QP88", + "QP89", + "QP90", + "QP91", + "QP92", + "QP93", + "QP94", + "QP95", + "QP96", + "QP97", + "QP98", + "QP99", + "QQ70", + "QQ71", + "QQ72", + "QQ73", + "QQ74", + "QQ75", + "QQ76", + "QQ77", + "QQ78", + "QQ79", + "QQ80", + "QQ81", + "QQ82", + "QQ83", + "QQ84", + "QQ85", + "QQ86", + "QQ87", + "QQ88", + "QQ89", + "QQ90", + "QQ91", + "QQ92", + "QQ93", + "QQ94", + "QQ95", + "QQ96", + "QQ97", + "QQ98", + "QQ99", + "RP00", + "RP01", + "RP02", + "RP03", + "RP04", + "RP05", + "RP06", + "RP07", + "RP08", + "RP09", + "RP10", + "RP11", + "RP12", + "RP13", + "RP14", + "RP15", + "RP16", + "RP17", + "RP18", + "RP19", + "RP20", + "RP21", + "RP22", + "RP23", + "RP24", + "RP25", + "RP26", + "RP27", + "RP28", + "RP29", + "RP30", + "RP31", + "RP32", + "RP33", + "RP34", + "RP35", + "RP36", + "RP37", + "RP38", + "RP39", + "RP40", + "RP41", + "RP42", + "RP43", + "RP44", + "RP45", + "RP46", + "RP47", + "RP48", + "RP49", + "RQ00", + "RQ01", + "RQ02", + "RQ03", + "RQ04", + "RQ05", + "RQ06", + "RQ07", + "RQ08", + "RQ09", + "RQ10", + "RQ11", + "RQ12", + "RQ13", + "RQ14", + "RQ15", + "RQ16", + "RQ17", + "RQ18", + "RQ19", + "RQ20", + "RQ21", + "RQ22", + "RQ23", + "RQ24", + "RQ25", + "RQ26", + "RQ27", + "RQ28", + "RQ29", + "RQ30", + "RQ31", + "RQ32", + "RQ33", + "RQ34", + "RQ35", + "RQ36", + "RQ37", + "RQ38", + "RQ39", + "RQ40", + "RQ41", + "RQ42", + "RQ43", + "RQ44", + "RQ45", + "RQ46", + "RQ47", + "RQ48", + "RQ49" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [155, 80], + [170, 80], + [170, 60], + [155, 60], + [155, 80] + ] + ] + }, + "properties": { "ituzone": "25" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "26": { + "mh": [ + "AP00", + "AP01", + "AP02", + "AP03", + "AP04", + "AP05", + "AP06", + "AP07", + "AP08", + "AP09", + "AP11", + "AP12", + "AP13", + "AP14", + "AP15", + "AP16", + "AP17", + "AP18", + "AP19", + "AP22", + "AP23", + "AP24", + "AP25", + "AP26", + "AP27", + "AP28", + "AP29", + "AP33", + "AP34", + "AP35", + "AP36", + "AP37", + "AP38", + "AP39", + "AP44", + "AP45", + "AP46", + "AP47", + "AP48", + "AP49", + "AP55", + "AP56", + "AP57", + "AP58", + "AP59", + "AQ00", + "AQ01", + "AQ02", + "AQ03", + "AQ04", + "AQ05", + "AQ06", + "AQ07", + "AQ08", + "AQ09", + "AQ10", + "AQ11", + "AQ12", + "AQ13", + "AQ14", + "AQ15", + "AQ16", + "AQ17", + "AQ18", + "AQ19", + "AQ20", + "AQ21", + "AQ22", + "AQ23", + "AQ24", + "AQ25", + "AQ26", + "AQ27", + "AQ28", + "AQ29", + "AQ30", + "AQ31", + "AQ32", + "AQ33", + "AQ34", + "AQ35", + "AQ36", + "AQ37", + "AQ38", + "AQ39", + "AQ40", + "AQ41", + "AQ42", + "AQ43", + "AQ44", + "AQ45", + "AQ46", + "AQ47", + "AQ48", + "AQ49", + "AQ50", + "AQ51", + "AQ52", + "AQ53", + "AQ54", + "AQ55", + "AQ56", + "AQ57", + "AQ58", + "AQ59", + "RP40", + "RP41", + "RP42", + "RP43", + "RP44", + "RP45", + "RP46", + "RP47", + "RP48", + "RP49", + "RP50", + "RP51", + "RP52", + "RP53", + "RP54", + "RP55", + "RP56", + "RP57", + "RP58", + "RP59", + "RP60", + "RP61", + "RP62", + "RP63", + "RP64", + "RP65", + "RP66", + "RP67", + "RP68", + "RP69", + "RP70", + "RP71", + "RP72", + "RP73", + "RP74", + "RP75", + "RP76", + "RP77", + "RP78", + "RP79", + "RP80", + "RP81", + "RP82", + "RP83", + "RP84", + "RP85", + "RP86", + "RP87", + "RP88", + "RP89", + "RP90", + "RP91", + "RP92", + "RP93", + "RP94", + "RP95", + "RP96", + "RP97", + "RP98", + "RP99", + "RQ40", + "RQ41", + "RQ42", + "RQ43", + "RQ44", + "RQ45", + "RQ46", + "RQ47", + "RQ48", + "RQ49", + "RQ50", + "RQ51", + "RQ52", + "RQ53", + "RQ54", + "RQ55", + "RQ56", + "RQ57", + "RQ58", + "RQ59", + "RQ60", + "RQ61", + "RQ62", + "RQ63", + "RQ64", + "RQ65", + "RQ66", + "RQ67", + "RQ68", + "RQ69", + "RQ70", + "RQ71", + "RQ72", + "RQ73", + "RQ74", + "RQ75", + "RQ76", + "RQ77", + "RQ78", + "RQ79", + "RQ80", + "RQ81", + "RQ82", + "RQ83", + "RQ84", + "RQ85", + "RQ86", + "RQ87", + "RQ88", + "RQ89", + "RQ90", + "RQ91", + "RQ92", + "RQ93", + "RQ94", + "RQ95", + "RQ96", + "RQ97", + "RQ98", + "RQ99" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-170, 80], + [-168.96149, 65.74529], + [-180, 60], + [-190, 60], + [-190, 80], + [-170, 80] + ] + ] + }, + "properties": { "ituzone": "26" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "27": { + "mh": [ + "IN34", + "IN35", + "IN36", + "IN37", + "IN38", + "IN39", + "IN44", + "IN45", + "IN46", + "IN47", + "IN48", + "IN49", + "IN54", + "IN55", + "IN56", + "IN57", + "IN58", + "IN59", + "IN64", + "IN65", + "IN66", + "IN67", + "IN68", + "IN69", + "IN74", + "IN75", + "IN76", + "IN77", + "IN78", + "IN79", + "IN83", + "IN84", + "IN85", + "IN86", + "IN87", + "IN88", + "IN89", + "IN92", + "IN93", + "IN94", + "IN95", + "IN96", + "IN97", + "IN98", + "IN99", + "IO30", + "IO31", + "IO32", + "IO33", + "IO34", + "IO35", + "IO36", + "IO37", + "IO38", + "IO39", + "IO40", + "IO41", + "IO42", + "IO43", + "IO44", + "IO45", + "IO46", + "IO47", + "IO48", + "IO49", + "IO50", + "IO51", + "IO52", + "IO53", + "IO54", + "IO55", + "IO56", + "IO57", + "IO58", + "IO59", + "IO60", + "IO61", + "IO62", + "IO63", + "IO64", + "IO65", + "IO66", + "IO67", + "IO68", + "IO69", + "IO70", + "IO71", + "IO72", + "IO73", + "IO74", + "IO75", + "IO76", + "IO77", + "IO78", + "IO79", + "IO80", + "IO81", + "IO82", + "IO83", + "IO84", + "IO85", + "IO86", + "IO87", + "IO88", + "IO89", + "IO90", + "IO91", + "IO92", + "IO93", + "IO94", + "IO95", + "IO96", + "IO97", + "IO98", + "IO99", + "IP30", + "IP40", + "IP50", + "IP60", + "IP70", + "IP80", + "IP90", + "JN02", + "JN03", + "JN04", + "JN05", + "JN06", + "JN07", + "JN08", + "JN09", + "JN12", + "JN13", + "JN14", + "JN15", + "JN16", + "JN17", + "JN18", + "JN19", + "JN22", + "JN23", + "JN24", + "JN25", + "JN26", + "JN27", + "JN28", + "JN29", + "JN32", + "JN33", + "JN34", + "JN35", + "JN36", + "JN37", + "JN38", + "JN39", + "JN48", + "JO00", + "JO01", + "JO02", + "JO03", + "JO04", + "JO05", + "JO06", + "JO07", + "JO08", + "JO09", + "JO10", + "JO11", + "JO12", + "JO13", + "JO14", + "JO15", + "JO16", + "JO17", + "JO18", + "JO19", + "JO20", + "JO21", + "JO22", + "JO23", + "JO24", + "JO25", + "JO26", + "JO27", + "JO30", + "JO31", + "JO32", + "JO33", + "JO34", + "JP00", + "JP10" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [7.5, 42.43575], + [3.17622, 42.43575], + [3.0802, 42.42369], + [3.03911, 42.4765], + [2.83737, 42.45891], + [2.65171, 42.38643], + [2.67494, 42.34413], + [2.5419, 42.33241], + [2.31059, 42.42729], + [2.16063, 42.42484], + [2.0887, 42.36553], + [1.97214, 42.37211], + [1.93906, 42.45392], + [1.67228, 42.49678], + [1.54842, 42.43229], + [1.45129, 42.43763], + [1.44496, 42.59425], + [1.35305, 42.71883], + [1.17197, 42.71045], + [1.08016, 42.78882], + [0.92346, 42.79057], + [0.70742, 42.86028], + [0.64214, 42.75722], + [0.67546, 42.69204], + [0.39025, 42.71627], + [0.29717, 42.67273], + [0.18618, 42.73661], + [-0.01058, 42.68374], + [-0.16114, 42.79346], + [-0.34326, 42.84056], + [-0.38783, 42.79657], + [-0.50649, 42.8269], + [-0.55585, 42.77731], + [-0.75055, 42.96568], + [-0.93517, 42.95218], + [-1.22885, 43.05503], + [-1.33073, 43.11144], + [-1.35249, 43.0256], + [-1.47324, 43.08696], + [-1.38184, 43.18915], + [-1.37975, 43.25661], + [-1.62288, 43.30683], + [-1.72886, 43.29722], + [-1.77717, 43.41047], + [-3, 44], + [-13, 44], + [-14, 60.35968], + [-10, 61], + [2, 61], + [5.97802, 55.07554], + [6.6318, 53.55729], + [6.91479, 53.44177], + [6.97869, 53.33729], + [7.18917, 53.3018], + [7.21807, 53.17974], + [7.21087, 53.00362], + [7.08461, 52.84969], + [7.04946, 52.63586], + [6.75082, 52.65146], + [6.68401, 52.55371], + [6.6947, 52.48604], + [6.95814, 52.44001], + [7.07285, 52.35915], + [6.98552, 52.22443], + [6.86588, 52.12202], + [6.6966, 52.07029], + [6.83033, 51.99238], + [6.72417, 51.89284], + [6.68668, 51.91864], + [6.40802, 51.82743], + [6.10835, 51.89526], + [5.94738, 51.82394], + [6.11582, 51.65513], + [6.0882, 51.60833], + [6.21164, 51.51546], + [6.23012, 51.35891], + [6.07778, 51.24085], + [6.07326, 51.17612], + [6.1712, 51.15972], + [5.97508, 51.0672], + [5.86773, 51.04802], + [5.89983, 50.97583], + [6.02438, 50.9847], + [6.0746, 50.84661], + [5.97234, 50.80028], + [6.11262, 50.72022], + [6.19332, 50.63334], + [6.2719, 50.62404], + [6.17501, 50.55488], + [6.22706, 50.49416], + [6.34433, 50.48636], + [6.31929, 50.32832], + [6.17221, 50.2239], + [6.1182, 50.05432], + [6.24182, 49.89587], + [6.32885, 49.83993], + [6.52878, 49.80827], + [6.49937, 49.70922], + [6.36844, 49.56511], + [6.36799, 49.47001], + [6.55621, 49.4214], + [6.5686, 49.34923], + [6.73829, 49.16588], + [6.83788, 49.15501], + [6.83491, 49.21308], + [7.03182, 49.19014], + [7.04667, 49.11539], + [7.29319, 49.11783], + [7.36668, 49.17059], + [7.63453, 49.05343], + [7.93808, 49.05856], + [8.1096, 48.98648], + [8.23199, 48.96976], + [8.09243, 48.80568], + [7.96622, 48.7598], + [7.84526, 48.64694], + [7.73099, 48.38871], + [7.74218, 48.3255], + [7.57811, 48.11908], + [7.62231, 47.96713], + [7.5578, 47.87995], + [7.51052, 47.69787], + [7.58608, 47.57675], + [7.39553, 47.4334], + [7.24246, 47.42126], + [7.12997, 47.50098], + [6.988, 47.49427], + [6.87836, 47.35284], + [7.0221, 47.37266], + [7.05963, 47.33601], + [6.9401, 47.28487], + [6.9524, 47.24305], + [6.74332, 47.10786], + [6.63026, 46.99501], + [6.43152, 46.92549], + [6.46546, 46.8872], + [6.43369, 46.75768], + [6.1124, 46.57677], + [6.1544, 46.5457], + [6.06628, 46.41611], + [6.17592, 46.36804], + [6.12287, 46.24857], + [5.96502, 46.19535], + [5.95321, 46.12828], + [6.14296, 46.1453], + [6.28549, 46.2177], + [6.21912, 46.31143], + [6.33691, 46.40369], + [6.51776, 46.45595], + [6.82179, 46.42604], + [6.76904, 46.3587], + [6.86629, 46.27923], + [6.79463, 46.13506], + [6.89875, 46.12404], + [7.0455, 45.92231], + [6.93664, 45.84667], + [6.82304, 45.83841], + [6.81462, 45.72032], + [6.99782, 45.63783], + [7.00457, 45.50379], + [7.18554, 45.40385], + [7.13659, 45.27578], + [6.8489, 45.1288], + [6.77211, 45.16015], + [6.62115, 45.10626], + [6.67282, 45.02096], + [6.74314, 45.01776], + [6.74912, 44.90859], + [7.02443, 44.82147], + [7.0765, 44.68107], + [6.97521, 44.68232], + [6.92969, 44.57378], + [6.8471, 44.52782], + [6.9418, 44.42939], + [6.88887, 44.36455], + [7.00024, 44.24371], + [7.18839, 44.19813], + [7.36282, 44.11873], + [7.62774, 44.15288], + [7.72083, 44.07895], + [7.66368, 43.99068], + [7.49109, 43.86835], + [7.61033, 43.69135], + [7.5, 42.43575] + ] + ] + }, + "properties": { "ituzone": "27" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "28": { + "mh": [ + "JM38", + "JM39", + "JM47", + "JM48", + "JM49", + "JM57", + "JM58", + "JM59", + "JM65", + "JM66", + "JM67", + "JM68", + "JM69", + "JM75", + "JM76", + "JM77", + "JM78", + "JM79", + "JM85", + "JM86", + "JM87", + "JM88", + "JM89", + "JM94", + "JM95", + "JM96", + "JM97", + "JM98", + "JM99", + "JN26", + "JN30", + "JN31", + "JN32", + "JN33", + "JN34", + "JN35", + "JN36", + "JN37", + "JN38", + "JN39", + "JN40", + "JN41", + "JN42", + "JN43", + "JN44", + "JN45", + "JN46", + "JN47", + "JN48", + "JN49", + "JN50", + "JN51", + "JN52", + "JN53", + "JN54", + "JN55", + "JN56", + "JN57", + "JN58", + "JN59", + "JN60", + "JN61", + "JN62", + "JN63", + "JN64", + "JN65", + "JN66", + "JN67", + "JN68", + "JN69", + "JN70", + "JN71", + "JN72", + "JN73", + "JN74", + "JN75", + "JN76", + "JN77", + "JN78", + "JN79", + "JN80", + "JN81", + "JN82", + "JN83", + "JN84", + "JN85", + "JN86", + "JN87", + "JN88", + "JN89", + "JN90", + "JN91", + "JN92", + "JN93", + "JN94", + "JN95", + "JN96", + "JN97", + "JN98", + "JN99", + "JO21", + "JO30", + "JO31", + "JO32", + "JO33", + "JO34", + "JO35", + "JO40", + "JO41", + "JO42", + "JO43", + "JO44", + "JO45", + "JO50", + "JO51", + "JO52", + "JO53", + "JO54", + "JO60", + "JO61", + "JO62", + "JO63", + "JO64", + "JO70", + "JO71", + "JO72", + "JO73", + "JO74", + "JO75", + "JO80", + "JO81", + "JO82", + "JO83", + "JO84", + "JO85", + "JO90", + "JO91", + "JO92", + "JO93", + "JO94", + "JO95", + "JO96", + "KM04", + "KM05", + "KM06", + "KM07", + "KM08", + "KM09", + "KM14", + "KM15", + "KM16", + "KM17", + "KM18", + "KM19", + "KM23", + "KM24", + "KM25", + "KM26", + "KM27", + "KM28", + "KM29", + "KM33", + "KM34", + "KM35", + "KM36", + "KM37", + "KM38", + "KM39", + "KM43", + "KM44", + "KM45", + "KM46", + "KN00", + "KN01", + "KN02", + "KN03", + "KN04", + "KN05", + "KN06", + "KN07", + "KN08", + "KN09", + "KN10", + "KN11", + "KN12", + "KN13", + "KN14", + "KN15", + "KN16", + "KN17", + "KN18", + "KN19", + "KN20", + "KN21", + "KN22", + "KN23", + "KN24", + "KN25", + "KN26", + "KN27", + "KN30", + "KN31", + "KN32", + "KN33", + "KN34", + "KN35", + "KN36", + "KN37", + "KN38", + "KN42", + "KN43", + "KN44", + "KN45", + "KN46", + "KO00", + "KO01", + "KO02", + "KO03", + "KO04", + "KO10", + "KO11", + "KO12", + "KO13", + "KO14", + "KO20" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [19.39575, 56.23785], + [19.64278, 54.45307], + [20.99953, 54.35362], + [21.50076, 54.32368], + [22.31843, 54.33941], + [22.7902, 54.36392], + [22.83892, 54.40981], + [23.01122, 54.38375], + [23.09038, 54.29791], + [23.33563, 54.25373], + [23.48779, 54.14798], + [23.52886, 54.06416], + [23.48078, 53.99675], + [23.54994, 53.76532], + [23.66246, 53.51491], + [23.81909, 53.24479], + [23.91433, 53.14512], + [23.87522, 53.07985], + [23.92873, 53.019], + [23.94078, 52.71251], + [23.78181, 52.62757], + [23.46714, 52.55046], + [23.36595, 52.48178], + [23.17857, 52.28457], + [23.19327, 52.2367], + [23.3979, 52.19513], + [23.642, 52.0812], + [23.68735, 51.9904], + [23.61486, 51.91848], + [23.63825, 51.79853], + [23.5258, 51.73677], + [23.56268, 51.54299], + [23.67688, 51.47347], + [23.69953, 51.40504], + [23.63506, 51.32394], + [23.82709, 51.16041], + [23.92215, 51.0076], + [24.05221, 50.89611], + [24.1505, 50.8653], + [23.99996, 50.83945], + [23.96713, 50.77008], + [24.07252, 50.71795], + [24.09197, 50.56429], + [23.995, 50.41362], + [23.80072, 50.40538], + [23.69725, 50.37249], + [23.57781, 50.26489], + [23.28355, 50.0978], + [22.63985, 49.52907], + [22.699, 49.49146], + [22.74716, 49.35926], + [22.70518, 49.17531], + [22.8945, 49.09499], + [22.8888, 49.00757], + [22.76628, 49.0538], + [22.65805, 49.04738], + [22.57894, 49.09923], + [22.38035, 48.86043], + [22.33897, 48.68536], + [22.17902, 48.6007], + [22.13285, 48.41294], + [22.21081, 48.42723], + [22.32026, 48.35073], + [22.37403, 48.23895], + [22.48823, 48.25331], + [22.59302, 48.1055], + [22.83024, 48.1103], + [22.92546, 48.01932], + [23.0821, 48.00447], + [23.16974, 48.12279], + [23.2685, 48.10067], + [23.33429, 48.01984], + [23.49609, 47.96832], + [23.52993, 48.01772], + [23.81739, 47.98267], + [23.86705, 47.93204], + [24.01347, 47.96397], + [24.23214, 47.90058], + [24.43545, 47.96642], + [24.6209, 47.95085], + [24.66917, 47.86446], + [24.81769, 47.81866], + [24.88786, 47.72477], + [25.11263, 47.75384], + [25.23436, 47.89106], + [25.6481, 47.94893], + [25.77532, 47.94151], + [26.19686, 47.99761], + [26.33627, 48.1828], + [26.63299, 48.25866], + [26.8031, 48.24522], + [26.94584, 48.17536], + [27.14589, 47.96338], + [27.2152, 47.95022], + [27.25149, 47.72029], + [27.48399, 47.48748], + [27.57077, 47.45903], + [27.60124, 47.32002], + [27.72784, 47.29081], + [27.79976, 47.14406], + [28.08867, 46.97678], + [28.11545, 46.82035], + [28.24557, 46.63226], + [28.21587, 46.51198], + [28.2587, 46.43492], + [28.13996, 46.27976], + [28.09167, 46.01296], + [28.10858, 45.83689], + [28.18637, 45.47152], + [28.26787, 45.45711], + [28.33859, 45.32557], + [28.71898, 45.22146], + [28.81415, 45.33831], + [28.92667, 45.27939], + [28.96203, 45.32961], + [29.24869, 45.43572], + [29.4289, 45.444], + [29.56621, 45.40518], + [29.65546, 45.33751], + [29.6788, 45.21198], + [30, 45], + [30, 42], + [28.02544, 41.97996], + [27.81715, 41.99087], + [27.58551, 41.93491], + [27.56975, 41.9025], + [27.23628, 42.10582], + [27.20428, 42.06247], + [27.06433, 42.09145], + [26.97056, 42.00022], + [26.6253, 41.97507], + [26.53944, 41.82431], + [26.37084, 41.82314], + [26.32515, 41.74416], + [26.39275, 41.68964], + [26.59245, 41.61039], + [26.63771, 41.37971], + [26.39841, 41.25035], + [26.32611, 41.25532], + [26.31264, 41.07472], + [26.367, 41.02023], + [26.22527, 40.88622], + [26.12188, 40.74187], + [26.03643, 40.72824], + [25.58284, 40.11726], + [26.08451, 39.41639], + [26.49005, 39.40783], + [26.73355, 38.97176], + [26.30455, 38.66595], + [26.32076, 38.44329], + [26.17643, 38.2822], + [27.13561, 37.79187], + [27.09334, 37.70565], + [26.95995, 37.67625], + [27.20893, 37.14941], + [27.22686, 36.95396], + [27.43454, 36.86791], + [27.3159, 36.66434], + [27.53398, 36.61334], + [27.84627, 36.69365], + [27.96671, 36.53534], + [28.51287, 36.5339], + [29.34707, 36.21821], + [29.58839, 36.17786], + [29.67334, 36.12332], + [30, 36], + [30, 33.03857], + [13.17828, 35.88434], + [12.36254, 37.03947], + [9.98889, 37.93682], + [7.5, 37.94803], + [7.5, 42.43575], + [7.61033, 43.69135], + [7.49109, 43.86835], + [7.66368, 43.99068], + [7.72083, 44.07895], + [7.62774, 44.15288], + [7.36282, 44.11873], + [7.18839, 44.19813], + [7.00024, 44.24371], + [6.88887, 44.36455], + [6.9418, 44.42939], + [6.8471, 44.52782], + [6.92969, 44.57378], + [6.97521, 44.68232], + [7.0765, 44.68107], + [7.02443, 44.82147], + [6.74912, 44.90859], + [6.74314, 45.01776], + [6.67282, 45.02096], + [6.62115, 45.10626], + [6.77211, 45.16015], + [6.8489, 45.1288], + [7.13659, 45.27578], + [7.18554, 45.40385], + [7.00457, 45.50379], + [6.99782, 45.63783], + [6.81462, 45.72032], + [6.82304, 45.83841], + [6.93664, 45.84667], + [7.0455, 45.92231], + [6.89875, 46.12404], + [6.79463, 46.13506], + [6.86629, 46.27923], + [6.76904, 46.3587], + [6.82179, 46.42604], + [6.51776, 46.45595], + [6.33691, 46.40369], + [6.21912, 46.31143], + [6.28549, 46.2177], + [6.14296, 46.1453], + [5.95321, 46.12828], + [5.96502, 46.19535], + [6.12287, 46.24857], + [6.17592, 46.36804], + [6.06628, 46.41611], + [6.1544, 46.5457], + [6.1124, 46.57677], + [6.43369, 46.75768], + [6.46546, 46.8872], + [6.43152, 46.92549], + [6.63026, 46.99501], + [6.74332, 47.10786], + [6.9524, 47.24305], + [6.9401, 47.28487], + [7.05963, 47.33601], + [7.0221, 47.37266], + [6.87836, 47.35284], + [6.988, 47.49427], + [7.12997, 47.50098], + [7.24246, 47.42126], + [7.39553, 47.4334], + [7.58608, 47.57675], + [7.51052, 47.69787], + [7.5578, 47.87995], + [7.62231, 47.96713], + [7.57811, 48.11908], + [7.74218, 48.3255], + [7.73099, 48.38871], + [7.84526, 48.64694], + [7.96622, 48.7598], + [8.09243, 48.80568], + [8.23199, 48.96976], + [8.1096, 48.98648], + [7.93808, 49.05856], + [7.63453, 49.05343], + [7.36668, 49.17059], + [7.29319, 49.11783], + [7.04667, 49.11539], + [7.03182, 49.19014], + [6.83491, 49.21308], + [6.83788, 49.15501], + [6.73829, 49.16588], + [6.5686, 49.34923], + [6.55621, 49.4214], + [6.36799, 49.47001], + [6.36844, 49.56511], + [6.49937, 49.70922], + [6.52878, 49.80827], + [6.32885, 49.83993], + [6.24182, 49.89587], + [6.1182, 50.05432], + [6.17221, 50.2239], + [6.31929, 50.32832], + [6.34433, 50.48636], + [6.22706, 50.49416], + [6.17501, 50.55488], + [6.2719, 50.62404], + [6.19332, 50.63334], + [6.11262, 50.72022], + [5.97234, 50.80028], + [6.0746, 50.84661], + [6.02438, 50.9847], + [5.89983, 50.97583], + [5.86773, 51.04802], + [5.97508, 51.0672], + [6.1712, 51.15972], + [6.07326, 51.17612], + [6.07778, 51.24085], + [6.23012, 51.35891], + [6.21164, 51.51546], + [6.0882, 51.60833], + [6.11582, 51.65513], + [5.94738, 51.82394], + [6.10835, 51.89526], + [6.40802, 51.82743], + [6.68668, 51.91864], + [6.72417, 51.89284], + [6.83033, 51.99238], + [6.6966, 52.07029], + [6.86588, 52.12202], + [6.98552, 52.22443], + [7.07285, 52.35915], + [6.95814, 52.44001], + [6.6947, 52.48604], + [6.68401, 52.55371], + [6.75082, 52.65146], + [7.04946, 52.63586], + [7.08461, 52.84969], + [7.21087, 53.00362], + [7.21807, 53.17974], + [7.18917, 53.3018], + [6.97869, 53.33729], + [6.91479, 53.44177], + [6.6318, 53.55729], + [5.97802, 55.07554], + [8.42565, 55.07829], + [8.53985, 55.03551], + [8.61343, 54.9164], + [8.72995, 54.89316], + [8.9575, 54.90195], + [9.24527, 54.84643], + [9.3421, 54.80049], + [9.60245, 54.88714], + [9.63911, 54.84221], + [9.81125, 54.81183], + [10.00537, 54.80993], + [11.28613, 54.5692], + [12.14602, 54.47168], + [13.40142, 54.83253], + [15.07727, 54.74072], + [19.39575, 56.23785] + ] + ] + }, + "properties": { "ituzone": "28" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "29": { + "mh": [ + "JO94", + "JO95", + "JO96", + "JO97", + "KN17", + "KN18", + "KN19", + "KN27", + "KN28", + "KN29", + "KN37", + "KN38", + "KN39", + "KN45", + "KN46", + "KN47", + "KN48", + "KN49", + "KN53", + "KN54", + "KN55", + "KN56", + "KN57", + "KN58", + "KN59", + "KN62", + "KN63", + "KN64", + "KN65", + "KN66", + "KN67", + "KN68", + "KN69", + "KN72", + "KN73", + "KN74", + "KN75", + "KN76", + "KN77", + "KN78", + "KN79", + "KN82", + "KN83", + "KN84", + "KN85", + "KN86", + "KN87", + "KN88", + "KN89", + "KN91", + "KN92", + "KN93", + "KN94", + "KN95", + "KN96", + "KN97", + "KN98", + "KN99", + "KO04", + "KO05", + "KO06", + "KO07", + "KO08", + "KO09", + "KO10", + "KO11", + "KO12", + "KO13", + "KO14", + "KO15", + "KO16", + "KO17", + "KO18", + "KO19", + "KO20", + "KO21", + "KO22", + "KO23", + "KO24", + "KO25", + "KO26", + "KO27", + "KO28", + "KO29", + "KO30", + "KO31", + "KO32", + "KO33", + "KO34", + "KO35", + "KO36", + "KO37", + "KO38", + "KO39", + "KO40", + "KO41", + "KO42", + "KO43", + "KO44", + "KO45", + "KO46", + "KO47", + "KO48", + "KO49", + "KO50", + "KO51", + "KO52", + "KO53", + "KO54", + "KO55", + "KO56", + "KO57", + "KO58", + "KO59", + "KO60", + "KO61", + "KO62", + "KO63", + "KO64", + "KO65", + "KO66", + "KO67", + "KO68", + "KO69", + "KO70", + "KO71", + "KO72", + "KO73", + "KO74", + "KO75", + "KO76", + "KO77", + "KO78", + "KO79", + "KO80", + "KO81", + "KO82", + "KO83", + "KO84", + "KO85", + "KO86", + "KO87", + "KO88", + "KO89", + "KO90", + "KO91", + "KO92", + "KO93", + "KO94", + "KO95", + "KO96", + "KO97", + "KO98", + "KO99", + "KP30", + "KP40", + "KP41", + "KP50", + "KP51", + "LM28", + "LM29", + "LM38", + "LM39", + "LM48", + "LM49", + "LM57", + "LM58", + "LM59", + "LN01", + "LN02", + "LN03", + "LN04", + "LN05", + "LN06", + "LN07", + "LN08", + "LN09", + "LN10", + "LN11", + "LN12", + "LN13", + "LN14", + "LN15", + "LN16", + "LN17", + "LN18", + "LN19", + "LN20", + "LN21", + "LN22", + "LN23", + "LN24", + "LN25", + "LN26", + "LN27", + "LN28", + "LN29", + "LN30", + "LN31", + "LN32", + "LN33", + "LN34", + "LN35", + "LN36", + "LN37", + "LN38", + "LN39", + "LN40", + "LN41", + "LN42", + "LN43", + "LN44", + "LN45", + "LN46", + "LN47", + "LN48", + "LN49", + "LN50", + "LN51", + "LN52", + "LN53", + "LO00", + "LO01", + "LO02", + "LO03", + "LO04", + "LO05", + "LO06", + "LO07", + "LO08", + "LO09", + "LO10", + "LO11", + "LO12", + "LO13", + "LO14", + "LO15", + "LO16", + "LO17", + "LO18", + "LO19", + "LO20", + "LO21", + "LO22", + "LO23", + "LO24", + "LO25", + "LO26", + "LO27", + "LO28", + "LO29", + "LO30", + "LO31", + "LO32", + "LO33", + "LO34", + "LO35", + "LO36", + "LO37", + "LO38", + "LO39", + "LO40", + "LO41", + "LO42", + "LO43", + "LO44", + "LO45", + "LO46", + "LO47", + "LO48", + "LO49" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [51.39511, 37.88291], + [48.88821, 38.43925], + [48.79969, 38.45188], + [48.66171, 38.3916], + [48.45866, 38.60661], + [48.31756, 38.60225], + [48.25167, 38.72663], + [48.0419, 38.81495], + [48.01028, 38.90261], + [48.08838, 38.94687], + [48.27559, 38.96844], + [48.33915, 39.03587], + [48.30536, 39.10916], + [48.14289, 39.20574], + [48.16604, 39.30403], + [48.36848, 39.3813], + [48.03155, 39.69159], + [47.79196, 39.64998], + [47.52779, 39.49893], + [47.40099, 39.46393], + [47.21472, 39.31844], + [47.11193, 39.28736], + [47.05281, 39.19274], + [46.94904, 39.13923], + [46.86499, 39.15647], + [46.60268, 38.90776], + [46.52573, 38.88782], + [46.33755, 38.91691], + [46.18465, 38.84042], + [46.06676, 38.88753], + [45.6162, 38.94271], + [45.43817, 39.00495], + [45.45674, 39.04716], + [45.30868, 39.19379], + [45.14699, 39.20535], + [45.14142, 39.28313], + [45.05836, 39.38236], + [44.96543, 39.42246], + [44.86942, 39.61649], + [44.8069, 39.62859], + [44.69746, 39.79062], + [44.58865, 39.8341], + [44.53541, 39.92129], + [44.41655, 40.00288], + [44.27969, 40.04909], + [43.89377, 40.02318], + [43.65648, 40.11158], + [43.71377, 40.16273], + [43.67987, 40.25972], + [43.59094, 40.346], + [43.60793, 40.43522], + [43.544, 40.47719], + [43.65001, 40.53055], + [43.7493, 40.67735], + [43.67726, 40.84719], + [43.67181, 40.9367], + [43.4683, 41.03112], + [43.44872, 41.17597], + [43.37577, 41.20318], + [43.24201, 41.17451], + [43.21317, 41.28956], + [43.03151, 41.37093], + [42.96792, 41.45117], + [42.79652, 41.51618], + [42.83599, 41.58475], + [42.60107, 41.58508], + [42.52007, 41.43636], + [42.17829, 41.51461], + [42.04078, 41.4935], + [41.95484, 41.52328], + [41.82349, 41.43097], + [41.78738, 41.46032], + [41.49877, 41.53332], + [30, 43.5], + [30, 45], + [29.6788, 45.21198], + [29.65546, 45.33751], + [29.56621, 45.40518], + [29.4289, 45.444], + [29.24869, 45.43572], + [28.96203, 45.32961], + [28.92667, 45.27939], + [28.81415, 45.33831], + [28.71898, 45.22146], + [28.33859, 45.32557], + [28.26787, 45.45711], + [28.18637, 45.47152], + [28.10858, 45.83689], + [28.09167, 46.01296], + [28.13996, 46.27976], + [28.2587, 46.43492], + [28.21587, 46.51198], + [28.24557, 46.63226], + [28.11545, 46.82035], + [28.08867, 46.97678], + [27.79976, 47.14406], + [27.72784, 47.29081], + [27.60124, 47.32002], + [27.57077, 47.45903], + [27.48399, 47.48748], + [27.25149, 47.72029], + [27.2152, 47.95022], + [27.14589, 47.96338], + [26.94584, 48.17536], + [26.8031, 48.24522], + [26.63299, 48.25866], + [26.33627, 48.1828], + [26.19686, 47.99761], + [25.77532, 47.94151], + [25.6481, 47.94893], + [25.23436, 47.89106], + [25.11263, 47.75384], + [24.88786, 47.72477], + [24.81769, 47.81866], + [24.66917, 47.86446], + [24.6209, 47.95085], + [24.43545, 47.96642], + [24.23214, 47.90058], + [24.01347, 47.96397], + [23.86705, 47.93204], + [23.81739, 47.98267], + [23.52993, 48.01772], + [23.49609, 47.96832], + [23.33429, 48.01984], + [23.2685, 48.10067], + [23.16974, 48.12279], + [23.0821, 48.00447], + [22.92546, 48.01932], + [22.83024, 48.1103], + [22.59302, 48.1055], + [22.48823, 48.25331], + [22.37403, 48.23895], + [22.32026, 48.35073], + [22.21081, 48.42723], + [22.13285, 48.41294], + [22.17902, 48.6007], + [22.33897, 48.68536], + [22.38035, 48.86043], + [22.57894, 49.09923], + [22.65805, 49.04738], + [22.76628, 49.0538], + [22.8888, 49.00757], + [22.8945, 49.09499], + [22.70518, 49.17531], + [22.74716, 49.35926], + [22.699, 49.49146], + [22.63985, 49.52907], + [23.28355, 50.0978], + [23.57781, 50.26489], + [23.69725, 50.37249], + [23.80072, 50.40538], + [23.995, 50.41362], + [24.09197, 50.56429], + [24.07252, 50.71795], + [23.96713, 50.77008], + [23.99996, 50.83945], + [24.1505, 50.8653], + [24.05221, 50.89611], + [23.92215, 51.0076], + [23.82709, 51.16041], + [23.63506, 51.32394], + [23.69953, 51.40504], + [23.67688, 51.47347], + [23.56268, 51.54299], + [23.5258, 51.73677], + [23.63825, 51.79853], + [23.61486, 51.91848], + [23.68735, 51.9904], + [23.642, 52.0812], + [23.3979, 52.19513], + [23.19327, 52.2367], + [23.17857, 52.28457], + [23.36595, 52.48178], + [23.46714, 52.55046], + [23.78181, 52.62757], + [23.94078, 52.71251], + [23.92873, 53.019], + [23.87522, 53.07985], + [23.91433, 53.14512], + [23.81909, 53.24479], + [23.66246, 53.51491], + [23.54994, 53.76532], + [23.48078, 53.99675], + [23.52886, 54.06416], + [23.48779, 54.14798], + [23.33563, 54.25373], + [23.09038, 54.29791], + [23.01122, 54.38375], + [22.83892, 54.40981], + [22.7902, 54.36392], + [22.31843, 54.33941], + [21.50076, 54.32368], + [20.99953, 54.35362], + [19.64278, 54.45307], + [19.39575, 56.23785], + [20.51806, 58.95105], + [27.58109, 60.29591], + [27.72636, 60.39067], + [27.85211, 60.58287], + [28.5351, 60.96115], + [28.65657, 60.95013], + [28.75426, 61.07212], + [29.23128, 61.25782], + [29.30239, 61.32151], + [29.41552, 61.26117], + [29.55061, 61.24308], + [29.57362, 61.18578], + [30.46556, 61.11219], + [31.37316, 60], + [50, 60], + [50, 44], + [51.39511, 37.88291] + ] + ] + }, + "properties": { "ituzone": "29" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "30": { + "mh": [ + "LM57", + "LM58", + "LM59", + "LM67", + "LM68", + "LM69", + "LM77", + "LM78", + "LM79", + "LM87", + "LM88", + "LM89", + "LM97", + "LM98", + "LM99", + "LN50", + "LN51", + "LN52", + "LN53", + "LN54", + "LN55", + "LN56", + "LN57", + "LN58", + "LN59", + "LN60", + "LN61", + "LN62", + "LN63", + "LN64", + "LN65", + "LN66", + "LN67", + "LN68", + "LN69", + "LN70", + "LN71", + "LN72", + "LN73", + "LN74", + "LN75", + "LN76", + "LN77", + "LN78", + "LN79", + "LN80", + "LN81", + "LN82", + "LN83", + "LN84", + "LN85", + "LN86", + "LN87", + "LN88", + "LN89", + "LN90", + "LN91", + "LN92", + "LN93", + "LN94", + "LN95", + "LN96", + "LN97", + "LN98", + "LN99", + "LO50", + "LO51", + "LO52", + "LO53", + "LO54", + "LO55", + "LO56", + "LO57", + "LO58", + "LO59", + "LO60", + "LO61", + "LO62", + "LO63", + "LO64", + "LO65", + "LO66", + "LO67", + "LO68", + "LO69", + "LO70", + "LO71", + "LO72", + "LO73", + "LO74", + "LO75", + "LO76", + "LO77", + "LO78", + "LO79", + "LO80", + "LO81", + "LO82", + "LO83", + "LO84", + "LO85", + "LO86", + "LO87", + "LO88", + "LO89", + "LO90", + "LO91", + "LO92", + "LO93", + "LO94", + "LO95", + "LO96", + "LO97", + "LO98", + "LO99", + "MM05", + "MM06", + "MM07", + "MM08", + "MM09", + "MM15", + "MM16", + "MM17", + "MM18", + "MM19", + "MM26", + "MM27", + "MM28", + "MM29", + "MM36", + "MM37", + "MM38", + "MM39", + "MM47", + "MM48", + "MM49", + "MM56", + "MM57", + "MM58", + "MM59", + "MM66", + "MM67", + "MM68", + "MM69", + "MM77", + "MM78", + "MN00", + "MN01", + "MN02", + "MN03", + "MN04", + "MN05", + "MN06", + "MN07", + "MN08", + "MN09", + "MN10", + "MN11", + "MN12", + "MN13", + "MN14", + "MN15", + "MN16", + "MN17", + "MN18", + "MN19", + "MN20", + "MN21", + "MN22", + "MN23", + "MN24", + "MN25", + "MN26", + "MN27", + "MN28", + "MN29", + "MN30", + "MN31", + "MN32", + "MN33", + "MN34", + "MN35", + "MN36", + "MN37", + "MN38", + "MN39", + "MN40", + "MN41", + "MN42", + "MN43", + "MN44", + "MN45", + "MN46", + "MN47", + "MN48", + "MN49", + "MN50", + "MN51", + "MN52", + "MN53", + "MN54", + "MN55", + "MN56", + "MN57", + "MN58", + "MN59", + "MN60", + "MN61", + "MN62", + "MN63", + "MN64", + "MN65", + "MN66", + "MN67", + "MN68", + "MN69", + "MN70", + "MN71", + "MN72", + "MN73", + "MN74", + "MN75", + "MN76", + "MN77", + "MN78", + "MN79", + "MO00", + "MO01", + "MO02", + "MO03", + "MO04", + "MO05", + "MO06", + "MO07", + "MO08", + "MO09", + "MO10", + "MO11", + "MO12", + "MO13", + "MO14", + "MO15", + "MO16", + "MO17", + "MO18", + "MO19", + "MO20", + "MO21", + "MO22", + "MO23", + "MO24", + "MO25", + "MO26", + "MO27", + "MO28", + "MO29", + "MO30", + "MO31", + "MO32", + "MO33", + "MO34", + "MO35", + "MO36", + "MO37", + "MO38", + "MO39", + "MO40", + "MO41", + "MO42", + "MO43", + "MO44", + "MO45", + "MO46", + "MO47", + "MO48", + "MO49", + "MO50", + "MO51", + "MO52", + "MO53", + "MO54", + "MO55", + "MO56", + "MO57", + "MO58", + "MO59", + "MO60", + "MO61", + "MO62", + "MO63", + "MO64", + "MO65", + "MO66", + "MO67", + "MO68", + "MO69", + "MO70", + "MO71", + "MO72", + "MO73", + "MO74", + "MO75", + "MO76", + "MO77", + "MO78", + "MO79" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [51.39511, 37.88291], + [50, 44], + [50, 60], + [75, 60], + [75, 40.45765], + [74.98829, 40.45182], + [74.83904, 40.52282], + [74.79974, 40.4312], + [74.91229, 40.34592], + [74.69193, 40.34917], + [74.66217, 40.27372], + [74.59237, 40.2821], + [74.52588, 40.20873], + [74.34289, 40.09123], + [74.25941, 40.13398], + [74.06928, 40.07842], + [74.04243, 40.10065], + [73.84923, 39.83594], + [73.94798, 39.59898], + [73.87443, 39.48294], + [73.64586, 39.47597], + [73.499, 39.38047], + [73.56789, 39.34705], + [73.53776, 39.27749], + [73.61293, 39.24696], + [73.74973, 39.02364], + [73.81204, 39.0423], + [73.85563, 38.9527], + [73.75555, 38.94007], + [73.69872, 38.85159], + [73.79849, 38.61575], + [73.92579, 38.5418], + [74.07844, 38.53092], + [74.07679, 38.60926], + [74.18643, 38.64091], + [74.50959, 38.47187], + [74.69529, 38.42477], + [74.66546, 38.38021], + [74.71055, 38.21287], + [74.80098, 38.20168], + [74.82052, 38.08568], + [74.91648, 38.02438], + [74.9131, 37.85468], + [75.00964, 37.76985], + [74.89606, 37.6629], + [74.93193, 37.56857], + [75.05718, 37.52458], + [75.15307, 37.40895], + [75.09685, 37.31818], + [74.91113, 37.27501], + [74.87855, 37.23569], + [74.82969, 37.32916], + [74.68258, 37.40414], + [74.56222, 37.37947], + [74.23661, 37.41447], + [74.22225, 37.34802], + [73.9635, 37.29216], + [73.75208, 37.22283], + [73.61761, 37.27872], + [73.76658, 37.33858], + [73.75597, 37.435], + [73.51008, 37.47036], + [73.30841, 37.46241], + [73.15605, 37.40783], + [73.0753, 37.31763], + [72.8178, 37.22927], + [72.65916, 37.0193], + [72.31872, 36.97705], + [72.04714, 36.83402], + [71.83022, 36.68705], + [71.66683, 36.67786], + [71.56058, 36.75669], + [71.42719, 37.05511], + [71.499, 37.30819], + [71.52302, 37.47822], + [71.49394, 37.53813], + [71.58908, 37.7965], + [71.57824, 37.92789], + [71.52938, 37.95416], + [71.32683, 37.88513], + [71.26017, 37.93375], + [71.37136, 38.20755], + [71.32744, 38.29452], + [71.04483, 38.39855], + [70.98908, 38.48341], + [70.6781, 38.40716], + [70.60597, 38.34324], + [70.4981, 38.11769], + [70.36536, 38.05177], + [70.27805, 37.94086], + [70.17466, 37.92188], + [70.19674, 37.84252], + [70.28111, 37.81155], + [70.30613, 37.69591], + [70.16789, 37.52888], + [69.95388, 37.56397], + [69.90808, 37.61677], + [69.81819, 37.57383], + [69.52424, 37.58499], + [69.38122, 37.45166], + [69.38461, 37.31916], + [69.45549, 37.23936], + [69.31886, 37.11791], + [69.24883, 37.0973], + [69.12647, 37.17186], + [69.00794, 37.30077], + [68.88616, 37.32372], + [68.68049, 37.27616], + [68.63905, 37.20724], + [68.30291, 37.10558], + [68.28138, 37.01852], + [68.20344, 37.02394], + [68.07819, 36.94263], + [67.99805, 36.93752], + [67.89905, 37.06422], + [67.78653, 37.09394], + [67.79052, 37.18375], + [67.49622, 37.2718], + [67.26396, 37.18849], + [67.09833, 37.33038], + [66.97135, 37.38674], + [66.68336, 37.33722], + [66.56894, 37.36022], + [66.30041, 37.32333], + [66.0985, 37.42944], + [65.87705, 37.47261], + [65.7983, 37.53822], + [65.69758, 37.52836], + [65.63819, 37.33488], + [65.5243, 37.23416], + [65.22805, 37.25016], + [64.98261, 37.21294], + [64.75661, 37.10647], + [64.79544, 36.936], + [64.60519, 36.62655], + [64.60433, 36.4035], + [64.4488, 36.237], + [64.08222, 36.11275], + [64.06522, 36.00172], + [63.97622, 36.04194], + [63.57447, 35.95641], + [63.54719, 35.9133], + [63.30011, 35.86452], + [63.12922, 35.8693], + [63.14055, 35.77563], + [63.24425, 35.68661], + [63.09516, 35.61877], + [63.12722, 35.54972], + [63.09635, 35.42772], + [63.01486, 35.42889], + [62.74783, 35.26519], + [62.61572, 35.21647], + [62.46683, 35.2843], + [62.3098, 35.14294], + [62.24813, 35.3088], + [62.14344, 35.34477], + [62.05738, 35.43747], + [61.96427, 35.45358], + [61.76699, 35.4145], + [61.59986, 35.43647], + [61.38483, 35.56961], + [61.3688, 35.62441], + [61.22288, 35.66036], + [61.25997, 35.81291], + [61.234, 35.9155], + [61.15927, 35.98961], + [61.22922, 36.17239], + [61.17025, 36.34033], + [61.19097, 36.56772], + [61.14002, 36.66202], + [60.63477, 36.62755], + [60.37066, 36.62424], + [60.17675, 36.84241], + [60.08433, 36.97852], + [59.83305, 37.09208], + [59.69955, 37.12819], + [59.55383, 37.12252], + [59.55199, 37.16624], + [59.402, 37.30625], + [59.40311, 37.42602], + [59.34783, 37.51544], + [59.27627, 37.4973], + [59.04761, 37.61275], + [58.82194, 37.692], + [58.74224, 37.62989], + [58.57722, 37.69274], + [58.38711, 37.617], + [58.23733, 37.67347], + [58.21188, 37.76011], + [58.04936, 37.7953], + [57.78719, 37.89308], + [57.52497, 37.91485], + [57.35913, 37.97444], + [57.38058, 38.07294], + [57.29369, 38.15024], + [57.24511, 38.26169], + [57.1605, 38.25652], + [57.08935, 38.18094], + [56.85608, 38.21152], + [56.75466, 38.27258], + [56.60408, 38.22341], + [56.41705, 38.24036], + [56.32722, 38.16489], + [56.33919, 38.07064], + [55.98077, 38.06502], + [55.81336, 38.11152], + [55.48439, 38.08549], + [55.40644, 38.04027], + [55.12933, 37.95097], + [54.82383, 37.72522], + [54.784, 37.63269], + [54.79777, 37.52305], + [54.65325, 37.43072], + [54.57669, 37.45508], + [54.39855, 37.36098], + [54.24427, 37.32038], + [53.90931, 37.34744], + [51.39511, 37.88291] + ] + ] + }, + "properties": { "ituzone": "30" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "31": { + "mh": [ + "MN70", + "MN71", + "MN72", + "MN73", + "MN74", + "MN75", + "MN76", + "MN77", + "MN78", + "MN79", + "MN80", + "MN81", + "MN82", + "MN83", + "MN84", + "MN85", + "MN86", + "MN87", + "MN88", + "MN89", + "MN91", + "MN92", + "MN93", + "MN94", + "MN95", + "MN96", + "MN97", + "MN98", + "MN99", + "MO70", + "MO71", + "MO72", + "MO73", + "MO74", + "MO75", + "MO76", + "MO77", + "MO78", + "MO79", + "MO80", + "MO81", + "MO82", + "MO83", + "MO84", + "MO85", + "MO86", + "MO87", + "MO88", + "MO89", + "MO90", + "MO91", + "MO92", + "MO93", + "MO94", + "MO95", + "MO96", + "MO97", + "MO98", + "MO99", + "NN02", + "NN03", + "NN04", + "NN05", + "NN06", + "NN07", + "NN08", + "NN09", + "NN15", + "NN16", + "NN17", + "NN18", + "NN19", + "NN26", + "NN27", + "NN28", + "NN29", + "NN38", + "NN39", + "NN49", + "NO00", + "NO01", + "NO02", + "NO03", + "NO04", + "NO05", + "NO06", + "NO07", + "NO08", + "NO09", + "NO10", + "NO11", + "NO12", + "NO13", + "NO14", + "NO15", + "NO16", + "NO17", + "NO18", + "NO19", + "NO20", + "NO21", + "NO22", + "NO23", + "NO24", + "NO25", + "NO26", + "NO27", + "NO28", + "NO29", + "NO30", + "NO31", + "NO32", + "NO33", + "NO34", + "NO35", + "NO36", + "NO37", + "NO38", + "NO39", + "NO40", + "NO41", + "NO42", + "NO43", + "NO44", + "NO45", + "NO46", + "NO47", + "NO48", + "NO49" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [87.81646, 49.16982], + [87.49353, 49.13885], + [87.43565, 49.07237], + [87.19976, 49.14344], + [86.89945, 49.13513], + [86.72776, 48.99134], + [86.81691, 48.85576], + [86.77147, 48.72018], + [86.63421, 48.6264], + [86.58937, 48.542], + [86.40766, 48.47906], + [86.29904, 48.49008], + [86.2248, 48.43205], + [85.91386, 48.43603], + [85.7573, 48.40297], + [85.55376, 48.13937], + [85.5469, 48.01041], + [85.6357, 47.58644], + [85.60829, 47.50885], + [85.68275, 47.42962], + [85.6791, 47.21965], + [85.57941, 47.14193], + [85.55871, 47.05037], + [85.21109, 47.04516], + [85.06664, 46.9251], + [84.94353, 46.86219], + [84.75237, 47.00522], + [84.55452, 46.99366], + [84.20195, 47.00187], + [84.12501, 46.96764], + [83.91645, 46.9742], + [83.74731, 47.03327], + [83.55877, 47.06068], + [83.36379, 47.17763], + [83.24414, 47.17703], + [83.15074, 47.23465], + [83.02373, 47.21496], + [82.99216, 47.06328], + [82.93806, 47.01607], + [82.86463, 46.80308], + [82.78831, 46.69359], + [82.73466, 46.50824], + [82.51213, 46.15391], + [82.4562, 45.97682], + [82.3358, 45.9393], + [82.34532, 45.79625], + [82.25786, 45.61594], + [82.27888, 45.53544], + [82.54268, 45.42125], + [82.58786, 45.34449], + [82.58223, 45.22012], + [82.47384, 45.17676], + [82.27526, 45.24126], + [82.10081, 45.20245], + [82.09095, 45.24545], + [81.92203, 45.22889], + [81.76869, 45.37777], + [81.63934, 45.35635], + [81.45043, 45.26218], + [81.20496, 45.2369], + [80.89759, 45.12509], + [80.74346, 45.16015], + [80.51471, 45.10517], + [80.40276, 45.04721], + [80.32561, 45.06945], + [80.19566, 45.02717], + [80.13935, 45.05761], + [79.88196, 44.91106], + [79.96415, 44.8816], + [79.99334, 44.79416], + [80.16684, 44.83913], + [80.19149, 44.75108], + [80.31242, 44.70372], + [80.41182, 44.60881], + [80.34727, 44.48046], + [80.40587, 44.2921], + [80.39477, 44.11157], + [80.44511, 44.07467], + [80.52268, 43.82223], + [80.75277, 43.4655], + [80.68579, 43.33721], + [80.77834, 43.31193], + [80.78151, 43.13762], + [80.65754, 43.14977], + [80.4091, 43.05729], + [80.39274, 42.99647], + [80.60215, 42.89507], + [80.40571, 42.83258], + [80.27554, 42.83807], + [80.16255, 42.62514], + [80.25963, 42.51518], + [80.20679, 42.46871], + [80.29009, 42.26024], + [80.13093, 42.1682], + [80.22753, 42.06329], + [80.13919, 42.03124], + [79.90992, 42.04221], + [79.78365, 41.901], + [79.63725, 41.8935], + [79.5681, 41.84263], + [79.40946, 41.84127], + [79.21695, 41.7262], + [79.12425, 41.72214], + [78.91945, 41.63195], + [78.81606, 41.55874], + [78.71284, 41.55252], + [78.64464, 41.46903], + [78.3208, 41.38078], + [78.14533, 41.36639], + [78.12439, 41.22715], + [77.91116, 41.18549], + [77.80317, 41.12345], + [77.76487, 41.01433], + [77.47854, 40.99562], + [77.35589, 41.04064], + [77.27602, 41.00142], + [76.99301, 41.07204], + [76.75381, 40.95355], + [76.72783, 40.81824], + [76.64463, 40.76568], + [76.65478, 40.6212], + [76.5557, 40.55094], + [76.50513, 40.42729], + [76.33557, 40.33844], + [76.23226, 40.41466], + [76.16835, 40.36778], + [75.97416, 40.38101], + [75.92209, 40.2944], + [75.82561, 40.32749], + [75.69967, 40.27962], + [75.66354, 40.35545], + [75.7242, 40.47364], + [75.64705, 40.50533], + [75.59331, 40.66444], + [75.30753, 40.51059], + [75.23841, 40.4483], + [75, 40.45768], + [75, 60], + [90, 60], + [90, 49.98485], + [89.60002, 49.91434], + [89.72593, 49.75504], + [89.67247, 49.69373], + [89.4588, 49.66598], + [89.35873, 49.58256], + [89.18812, 49.63078], + [89.23494, 49.54515], + [88.97134, 49.46125], + [88.87401, 49.54761], + [88.84379, 49.44178], + [88.59984, 49.50407], + [88.43547, 49.46867], + [88.22519, 49.4778], + [88.11994, 49.39342], + [88.16577, 49.289], + [88.05022, 49.2562], + [87.98984, 49.18054], + [87.81646, 49.16982] + ] + ] + }, + "properties": { "ituzone": "31" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "32": { + "mh": [ + "NN38", + "NN39", + "NN47", + "NN48", + "NN49", + "NN55", + "NN56", + "NN57", + "NN58", + "NN59", + "NN64", + "NN65", + "NN66", + "NN67", + "NN68", + "NN69", + "NN73", + "NN74", + "NN75", + "NN76", + "NN77", + "NN78", + "NN79", + "NN82", + "NN83", + "NN84", + "NN85", + "NN86", + "NN87", + "NN88", + "NN89", + "NN92", + "NN93", + "NN94", + "NN95", + "NN96", + "NN97", + "NN98", + "NN99", + "NO50", + "NO51", + "NO52", + "NO53", + "NO54", + "NO55", + "NO56", + "NO57", + "NO58", + "NO59", + "NO60", + "NO61", + "NO62", + "NO63", + "NO64", + "NO65", + "NO66", + "NO67", + "NO68", + "NO69", + "NO70", + "NO71", + "NO72", + "NO73", + "NO74", + "NO75", + "NO76", + "NO77", + "NO78", + "NO79", + "NO80", + "NO81", + "NO82", + "NO83", + "NO84", + "NO85", + "NO86", + "NO87", + "NO88", + "NO89", + "NO90", + "NO91", + "NO92", + "NO93", + "NO94", + "NO95", + "NO96", + "NO97", + "NO98", + "NO99", + "ON02", + "ON03", + "ON04", + "ON05", + "ON06", + "ON07", + "ON08", + "ON09", + "ON11", + "ON12", + "ON13", + "ON14", + "ON15", + "ON16", + "ON17", + "ON18", + "ON19", + "ON21", + "ON22", + "ON23", + "ON24", + "ON25", + "ON26", + "ON27", + "ON28", + "ON29", + "ON32", + "ON33", + "ON34", + "ON35", + "ON36", + "ON37", + "ON38", + "ON39", + "ON42", + "ON43", + "ON44", + "ON45", + "ON46", + "ON47", + "ON48", + "ON49", + "OO00", + "OO01", + "OO02", + "OO03", + "OO04", + "OO05", + "OO06", + "OO07", + "OO08", + "OO09", + "OO10", + "OO11", + "OO12", + "OO13", + "OO14", + "OO15", + "OO16", + "OO17", + "OO18", + "OO19", + "OO20", + "OO21", + "OO22", + "OO23", + "OO24", + "OO25", + "OO26", + "OO27", + "OO28", + "OO29", + "OO30", + "OO31", + "OO32", + "OO33", + "OO34", + "OO35", + "OO36", + "OO37", + "OO38", + "OO39", + "OO40", + "OO41", + "OO42", + "OO43", + "OO44", + "OO45", + "OO46", + "OO47", + "OO48", + "OO49" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [90, 60], + [110, 60], + [110, 42.63674], + [109.89816, 42.63306], + [109.6796, 42.55965], + [109.53203, 42.46882], + [109.2623, 42.43597], + [109.01485, 42.45717], + [108.8396, 42.39643], + [108.53491, 42.44325], + [108.29468, 42.43942], + [108.24464, 42.46397], + [107.92939, 42.40153], + [107.56565, 42.41147], + [107.45818, 42.4582], + [107.2904, 42.40785], + [107.26025, 42.36046], + [106.78668, 42.28831], + [106.64526, 42.25072], + [106.10285, 42.06056], + [105.71839, 41.93778], + [105.29412, 41.74767], + [105.23167, 41.74591], + [105.00579, 41.58008], + [104.91912, 41.65444], + [104.68322, 41.64484], + [104.51873, 41.66192], + [104.52621, 41.87442], + [104.07733, 41.80345], + [103.85643, 41.79799], + [103.41716, 41.88043], + [102.70874, 42.14764], + [102.44564, 42.14129], + [102.07962, 42.22196], + [101.80481, 42.50359], + [101.55891, 42.52878], + [100.84198, 42.67322], + [100.31997, 42.68622], + [100.26277, 42.63729], + [99.97486, 42.64694], + [99.50065, 42.56523], + [98.56227, 42.63358], + [98.20068, 42.65342], + [97.1733, 42.79391], + [96.96796, 42.75391], + [96.75712, 42.75423], + [96.38763, 42.72362], + [96.3594, 42.89626], + [95.91407, 43.23047], + [95.85876, 43.40849], + [95.73616, 43.59621], + [95.62179, 43.84955], + [95.52391, 44.00389], + [95.32253, 44.02685], + [95.41091, 44.29536], + [94.99614, 44.25089], + [94.93022, 44.29333], + [94.72696, 44.33774], + [94.60129, 44.44883], + [94.47031, 44.50744], + [94.34928, 44.51285], + [94.32907, 44.5826], + [94.2068, 44.67189], + [93.50601, 44.96452], + [93.42759, 44.95505], + [93.14521, 45.01242], + [92.98423, 44.99905], + [92.77671, 45.04846], + [92.48596, 45.00015], + [92.23766, 45.01281], + [92.10134, 45.07552], + [91.80435, 45.08201], + [91.55877, 45.06767], + [91.42952, 45.15564], + [91.37669, 45.10986], + [91.24146, 45.13191], + [91.16346, 45.20017], + [90.86428, 45.19906], + [90.8936, 45.25211], + [90.8129, 45.31939], + [90.76526, 45.43765], + [90.66535, 45.48805], + [90.71273, 45.72864], + [90.84697, 45.88774], + [91.01966, 46.02008], + [91.01052, 46.12705], + [90.89435, 46.30682], + [90.97658, 46.3604], + [91.07074, 46.57508], + [91.0176, 46.57876], + [91.04846, 46.71712], + [90.9348, 46.8202], + [90.95582, 46.87601], + [90.82517, 46.99549], + [90.76458, 46.98801], + [90.48099, 47.31886], + [90.47133, 47.4924], + [90.40125, 47.5378], + [90.32526, 47.68408], + [90.13917, 47.72341], + [90.07134, 47.77904], + [90.05927, 47.8842], + [90.0034, 47.8797], + [89.95556, 47.88758], + [89.95094, 47.83434], + [89.7577, 47.82922], + [89.65324, 47.90314], + [89.5491, 48.03907], + [89.29583, 48.0137], + [89.28174, 47.98636], + [89.05929, 47.98795], + [88.93213, 48.10719], + [88.82806, 48.09975], + [88.633, 48.18215], + [88.56834, 48.27411], + [88.60565, 48.33219], + [88.48568, 48.40774], + [87.95929, 48.59319], + [88.0894, 48.7116], + [87.93457, 48.75323], + [87.74231, 48.86799], + [87.87328, 48.94824], + [87.81646, 49.16982], + [87.98984, 49.18054], + [88.05022, 49.2562], + [88.16577, 49.289], + [88.11994, 49.39342], + [88.22519, 49.4778], + [88.43547, 49.46867], + [88.59984, 49.50407], + [88.84379, 49.44178], + [88.87401, 49.54761], + [88.97134, 49.46125], + [89.23494, 49.54515], + [89.18812, 49.63078], + [89.35873, 49.58256], + [89.4588, 49.66598], + [89.67247, 49.69373], + [89.72593, 49.75504], + [89.60002, 49.91434], + [90, 49.98485], + [90, 60] + ] + ] + }, + "properties": { "ituzone": "32" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "33": { + "mh": [ + "ON52", + "ON53", + "ON54", + "ON55", + "ON56", + "ON57", + "ON58", + "ON59", + "ON64", + "ON65", + "ON66", + "ON67", + "ON68", + "ON69", + "ON74", + "ON75", + "ON76", + "ON77", + "ON78", + "ON79", + "ON84", + "ON85", + "ON86", + "ON87", + "ON88", + "ON89", + "ON94", + "ON95", + "ON96", + "ON97", + "ON98", + "ON99", + "OO50", + "OO51", + "OO52", + "OO53", + "OO54", + "OO55", + "OO56", + "OO57", + "OO58", + "OO59", + "OO60", + "OO61", + "OO62", + "OO63", + "OO64", + "OO65", + "OO66", + "OO67", + "OO68", + "OO69", + "OO70", + "OO71", + "OO72", + "OO73", + "OO74", + "OO75", + "OO76", + "OO77", + "OO78", + "OO79", + "OO80", + "OO81", + "OO82", + "OO83", + "OO84", + "OO85", + "OO86", + "OO87", + "OO88", + "OO89", + "OO90", + "OO91", + "OO92", + "OO93", + "OO94", + "OO95", + "OO96", + "OO97", + "OO98", + "OO99", + "PN04", + "PN05", + "PN06", + "PN07", + "PN08", + "PN09", + "PN14", + "PN15", + "PN16", + "PN17", + "PN18", + "PN19", + "PN24", + "PN25", + "PN26", + "PN27", + "PN28", + "PN29", + "PN34", + "PN35", + "PN36", + "PN37", + "PN38", + "PN39", + "PN44", + "PN45", + "PN46", + "PN47", + "PN48", + "PN49", + "PN54", + "PN55", + "PN56", + "PN57", + "PN58", + "PN59", + "PN65", + "PN66", + "PN67", + "PN68", + "PN69", + "PN77", + "PN78", + "PN79", + "PO00", + "PO01", + "PO02", + "PO03", + "PO04", + "PO05", + "PO06", + "PO07", + "PO08", + "PO09", + "PO10", + "PO11", + "PO12", + "PO13", + "PO14", + "PO15", + "PO16", + "PO17", + "PO18", + "PO19", + "PO20", + "PO21", + "PO22", + "PO23", + "PO24", + "PO25", + "PO26", + "PO27", + "PO28", + "PO29", + "PO30", + "PO31", + "PO32", + "PO33", + "PO34", + "PO35", + "PO36", + "PO37", + "PO38", + "PO39", + "PO40", + "PO41", + "PO42", + "PO43", + "PO44", + "PO45", + "PO46", + "PO47", + "PO48", + "PO49", + "PO50", + "PO51", + "PO52", + "PO53", + "PO54", + "PO55", + "PO56", + "PO57", + "PO58", + "PO59", + "PO60", + "PO61", + "PO62", + "PO63", + "PO64", + "PO65", + "PO66", + "PO67", + "PO68", + "PO69", + "PO70", + "PO71", + "PO72", + "PO73", + "PO74", + "PO75", + "PO76", + "PO77", + "PO78", + "PO79" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [110, 42.63674], + [110, 60], + [135, 60], + [135, 48.5361], + [134.76885, 48.37548], + [134.66501, 48.24082], + [134.66767, 48.14325], + [134.54319, 48.02859], + [134.57118, 47.90976], + [134.78445, 47.72518], + [134.67715, 47.59216], + [134.48189, 47.44023], + [134.31207, 47.43612], + [134.18781, 47.3417], + [134.13997, 47.2587], + [134.21299, 47.19058], + [134.21277, 47.09867], + [134.12306, 47.0861], + [134.01505, 46.81645], + [134.04847, 46.77501], + [134.00368, 46.63752], + [133.9092, 46.59191], + [133.84179, 46.4545], + [133.94766, 46.3931], + [133.87294, 46.36013], + [133.91045, 46.26409], + [133.68503, 46.15081], + [133.73886, 46.066], + [133.67184, 45.94308], + [133.58478, 45.86592], + [133.48069, 45.85933], + [133.43043, 45.69516], + [133.46806, 45.60771], + [133.19726, 45.50587], + [133.14288, 45.42919], + [133.08885, 45.248], + [133.12751, 45.125], + [132.95228, 45.01758], + [132.84875, 45.05972], + [131.98167, 45.25696], + [131.87603, 45.34376], + [131.78687, 45.21414], + [131.68124, 45.22562], + [131.69391, 45.12661], + [131.48263, 44.99658], + [131.34139, 44.98682], + [131.28863, 44.92558], + [131.10149, 44.94017], + [131.07824, 44.88084], + [130.96225, 44.86187], + [131.09539, 44.71396], + [131.10322, 44.7072], + [131.20257, 44.37508], + [131.3026, 44.04524], + [131.27073, 44.02947], + [131.26451, 44.03022], + [131.25966, 44.03245], + [131.25615, 44.0305], + [131.24246, 44.01179], + [131.24335, 44.00639], + [131.24705, 44.00294], + [131.24869, 44], + [111.78081, 44], + [111.95567, 43.8214], + [111.94835, 43.69039], + [111.78584, 43.66857], + [111.56152, 43.48804], + [111.45119, 43.48994], + [111.3527, 43.43667], + [111.06268, 43.35255], + [110.9669, 43.2894], + [110.68371, 43.03869], + [110.62562, 42.93327], + [110.34172, 42.73557], + [110, 42.63674] + ] + ] + }, + "properties": { "ituzone": "33" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "34": { + "mh": [ + "PN52", + "PN53", + "PN54", + "PN55", + "PN62", + "PN63", + "PN64", + "PN65", + "PN66", + "PN72", + "PN73", + "PN74", + "PN75", + "PN76", + "PN77", + "PN78", + "PN79", + "PN82", + "PN83", + "PN84", + "PN85", + "PN86", + "PN87", + "PN88", + "PN89", + "PN93", + "PN94", + "PN95", + "PN96", + "PN97", + "PN98", + "PN99", + "PO70", + "PO71", + "PO72", + "PO73", + "PO74", + "PO75", + "PO76", + "PO77", + "PO78", + "PO79", + "PO80", + "PO81", + "PO82", + "PO83", + "PO84", + "PO85", + "PO86", + "PO87", + "PO88", + "PO89", + "PO90", + "PO91", + "PO92", + "PO93", + "PO94", + "PO95", + "PO96", + "PO97", + "PO98", + "PO99", + "QN05", + "QN06", + "QN07", + "QN08", + "QN09", + "QN15", + "QN16", + "QN17", + "QN18", + "QN19", + "QN25", + "QN26", + "QN27", + "QN28", + "QN29", + "QN35", + "QN36", + "QN37", + "QN38", + "QN39", + "QN48", + "QN49", + "QO00", + "QO01", + "QO02", + "QO03", + "QO04", + "QO05", + "QO06", + "QO07", + "QO08", + "QO09", + "QO10", + "QO11", + "QO12", + "QO13", + "QO14", + "QO15", + "QO16", + "QO17", + "QO18", + "QO19", + "QO20", + "QO21", + "QO22", + "QO23", + "QO24", + "QO25", + "QO26", + "QO27", + "QO28", + "QO29", + "QO30", + "QO31", + "QO32", + "QO33", + "QO34", + "QO35", + "QO36", + "QO37", + "QO38", + "QO39", + "QO40", + "QO41", + "QO42", + "QO43", + "QO44", + "QO45", + "QO46", + "QO47", + "QO48", + "QO49", + "QO50", + "QO51", + "QO52", + "QO53", + "QO54", + "QO55", + "QO56", + "QO57", + "QO58", + "QO59", + "QO63", + "QO64", + "QO65", + "QO66", + "QO67", + "QO68", + "QO69", + "QO75", + "QO76", + "QO77", + "QO78", + "QO79" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [146.49147, 45.73822], + [139.77955, 45.73822], + [136.66227, 42.24603], + [130.77271, 42.24603], + [130.64937, 42.32363], + [130.66846, 42.36636], + [130.55264, 42.51861], + [130.62817, 42.59888], + [130.58362, 42.67108], + [130.39422, 42.72447], + [130.67053, 42.85482], + [130.82667, 42.87989], + [131.04022, 42.8623], + [131.11272, 42.91227], + [131.11739, 43.07175], + [131.21187, 43.14579], + [131.30937, 43.45761], + [131.19312, 43.5256], + [131.22615, 43.58614], + [131.20994, 43.80828], + [131.25773, 43.91012], + [131.23493, 43.98083], + [131.26473, 44.03001], + [131.30002, 44.05154], + [131.11215, 44.7], + [131.09539, 44.71396], + [130.96225, 44.86187], + [131.07824, 44.88084], + [131.10149, 44.94017], + [131.28863, 44.92558], + [131.34139, 44.98682], + [131.48263, 44.99658], + [131.69391, 45.12661], + [131.68124, 45.22562], + [131.78687, 45.21414], + [131.87603, 45.34376], + [131.98167, 45.25696], + [132.84875, 45.05972], + [132.95228, 45.01758], + [133.12751, 45.125], + [133.08885, 45.248], + [133.14288, 45.42919], + [133.19726, 45.50587], + [133.46806, 45.60771], + [133.43043, 45.69516], + [133.48069, 45.85933], + [133.58478, 45.86592], + [133.67184, 45.94308], + [133.73886, 46.066], + [133.68503, 46.15081], + [133.91045, 46.26409], + [133.87294, 46.36013], + [133.94766, 46.3931], + [133.84179, 46.4545], + [133.9092, 46.59191], + [134.00368, 46.63752], + [134.04847, 46.77501], + [134.01505, 46.81645], + [134.12306, 47.0861], + [134.21277, 47.09867], + [134.21299, 47.19058], + [134.13997, 47.2587], + [134.18781, 47.3417], + [134.31207, 47.43612], + [134.48189, 47.44023], + [134.67715, 47.59216], + [134.78445, 47.72518], + [134.57118, 47.90976], + [134.54319, 48.02859], + [134.66767, 48.14325], + [134.66501, 48.24082], + [134.76885, 48.37548], + [135, 48.5361], + [135, 60], + [155, 60], + [155, 57], + [146.49147, 45.73822] + ] + ] + }, + "properties": { "ituzone": "34" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "35": { + "mh": [ + "QN23", + "QN24", + "QN33", + "QN34", + "QN35", + "QN36", + "QN37", + "QN44", + "QN45", + "QN46", + "QN47", + "QN48", + "QN49", + "QN55", + "QN56", + "QN57", + "QN58", + "QN59", + "QN66", + "QN67", + "QN68", + "QN69", + "QN77", + "QN78", + "QN79", + "QN88", + "QN89", + "QN99", + "QO40", + "QO50", + "QO51", + "QO52", + "QO53", + "QO60", + "QO61", + "QO62", + "QO63", + "QO64", + "QO65", + "QO70", + "QO71", + "QO72", + "QO73", + "QO74", + "QO75", + "QO76", + "QO77", + "QO78", + "QO79", + "QO80", + "QO81", + "QO82", + "QO83", + "QO84", + "QO85", + "QO86", + "QO87", + "QO88", + "QO89", + "QO90", + "QO91", + "QO92", + "QO93", + "QO94", + "QO95", + "QO96", + "QO97", + "QO98", + "QO99", + "RO00", + "RO01", + "RO02", + "RO03", + "RO04", + "RO05", + "RO06", + "RO07", + "RO08", + "RO09", + "RO11", + "RO12", + "RO13", + "RO14", + "RO15", + "RO16", + "RO17", + "RO18", + "RO19", + "RO22", + "RO23", + "RO24", + "RO25", + "RO26", + "RO27", + "RO28", + "RO29", + "RO33", + "RO34", + "RO35", + "RO36", + "RO37", + "RO38", + "RO39", + "RO44", + "RO45", + "RO46", + "RO47", + "RO48", + "RO49", + "RO55", + "RO56", + "RO57", + "RO58", + "RO59", + "RO66", + "RO67", + "RO68", + "RO69", + "RO77", + "RO78", + "RO79", + "RO88", + "RO89", + "RO99" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [150, 45.21871], + [146.16455, 43.26843], + [145.54187, 43.542], + [145.22612, 43.82251], + [146.49147, 45.73822], + [155, 57], + [155, 60], + [180, 60], + [160, 50], + [150, 45.21871] + ] + ] + }, + "properties": { "ituzone": "35" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "36": { + "mh": [ + "HL03", + "HL04", + "HL05", + "HL06", + "HL07", + "HL08", + "HL09", + "HL13", + "HL14", + "HL15", + "HL16", + "HL17", + "HL18", + "HL19", + "HL23", + "HL24", + "HL25", + "HL26", + "HL27", + "HL28", + "HL29", + "HL33", + "HL34", + "HL35", + "HL36", + "HL37", + "HL38", + "HL39", + "HL43", + "HL44", + "HL45", + "HL46", + "HL47", + "HL48", + "HL49", + "HL53", + "HL54", + "HL55", + "HL56", + "HL57", + "HL58", + "HL59", + "HL63", + "HL64", + "HL65", + "HL66", + "HL67", + "HL68", + "HL69", + "HL73", + "HL74", + "HL75", + "HL76", + "HL77", + "HL78", + "HL79", + "HL83", + "HL84", + "HL85", + "HL86", + "HL87", + "HL88", + "HL89", + "HL93", + "HL94", + "HL95", + "HL96", + "HL97", + "HL98", + "HL99", + "HM00", + "HM01", + "HM02", + "HM03", + "HM04", + "HM05", + "HM06", + "HM07", + "HM08", + "HM09", + "HM10", + "HM11", + "HM12", + "HM13", + "HM14", + "HM15", + "HM16", + "HM17", + "HM18", + "HM19", + "HM20", + "HM21", + "HM22", + "HM23", + "HM24", + "HM25", + "HM26", + "HM27", + "HM28", + "HM29", + "HM30", + "HM31", + "HM32", + "HM33", + "HM34", + "HM35", + "HM36", + "HM37", + "HM38", + "HM39", + "HM40", + "HM41", + "HM42", + "HM43", + "HM44", + "HM45", + "HM46", + "HM47", + "HM48", + "HM49", + "HM50", + "HM51", + "HM52", + "HM53", + "HM54", + "HM55", + "HM56", + "HM57", + "HM58", + "HM59", + "HM60", + "HM61", + "HM62", + "HM63", + "HM64", + "HM65", + "HM66", + "HM67", + "HM68", + "HM69", + "HM70", + "HM71", + "HM72", + "HM73", + "HM74", + "HM75", + "HM76", + "HM77", + "HM78", + "HM79", + "HM80", + "HM81", + "HM82", + "HM83", + "HM84", + "HM85", + "HM86", + "HM87", + "HM88", + "HM89", + "HM90", + "HM91", + "HM92", + "HM93", + "HM94", + "HM95", + "HM96", + "HM97", + "HM98", + "HM99", + "HN00", + "HN01", + "HN02", + "HN03", + "HN10", + "HN11", + "HN12", + "HN13", + "HN20", + "HN21", + "HN22", + "HN23", + "HN30", + "HN31", + "HN32", + "HN33", + "HN40", + "HN41", + "HN42", + "HN43", + "HN50", + "HN51", + "HN52", + "HN53", + "HN60", + "HN61", + "HN62", + "HN63", + "HN70", + "HN71", + "HN72", + "HN73", + "HN80", + "HN81", + "HN82", + "HN83", + "HN90", + "HN91", + "HN92", + "HN93", + "IL03", + "IL04", + "IL05", + "IL06", + "IL07", + "IL08", + "IL09", + "IL13", + "IL14", + "IL15", + "IL16", + "IL17", + "IL18", + "IL19", + "IL24", + "IL25", + "IL26", + "IL27", + "IL28", + "IL29", + "IL37", + "IL38", + "IL39", + "IM00", + "IM01", + "IM02", + "IM03", + "IM04", + "IM05", + "IM06", + "IM07", + "IM08", + "IM09", + "IM10", + "IM11", + "IM12", + "IM13", + "IM14", + "IM15", + "IM16", + "IM17", + "IM18", + "IM19", + "IM20", + "IM21", + "IM22", + "IM23", + "IM24", + "IM25", + "IM26", + "IM27", + "IM28", + "IM29", + "IM30", + "IM31", + "IM32", + "IM33", + "IM34", + "IM35", + "IM36", + "IM37", + "IM38", + "IM39", + "IN00", + "IN01", + "IN02", + "IN03", + "IN10", + "IN11", + "IN12", + "IN13", + "IN20", + "IN21", + "IN22", + "IN23", + "IN30", + "IN31", + "IN32", + "IN33" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-40, 23], + [-40, 44], + [-13, 44], + [-13, 28.25], + [-17, 23], + [-40, 23] + ] + ] + }, + "properties": { "ituzone": "36" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "37": { + "mh": [ + "IL37", + "IL38", + "IL39", + "IL47", + "IL48", + "IL49", + "IL56", + "IL57", + "IL58", + "IL59", + "IL65", + "IL66", + "IL67", + "IL68", + "IL69", + "IL74", + "IL75", + "IL76", + "IL77", + "IL78", + "IL79", + "IL83", + "IL84", + "IL85", + "IL86", + "IL87", + "IL88", + "IL89", + "IL91", + "IL92", + "IL93", + "IL94", + "IL95", + "IL96", + "IL97", + "IL98", + "IL99", + "IM30", + "IM31", + "IM32", + "IM33", + "IM34", + "IM35", + "IM36", + "IM37", + "IM38", + "IM39", + "IM40", + "IM41", + "IM42", + "IM43", + "IM44", + "IM45", + "IM46", + "IM47", + "IM48", + "IM49", + "IM50", + "IM51", + "IM52", + "IM53", + "IM54", + "IM55", + "IM56", + "IM57", + "IM58", + "IM59", + "IM60", + "IM61", + "IM62", + "IM63", + "IM64", + "IM65", + "IM66", + "IM67", + "IM68", + "IM69", + "IM70", + "IM71", + "IM72", + "IM73", + "IM74", + "IM75", + "IM76", + "IM77", + "IM78", + "IM79", + "IM80", + "IM81", + "IM82", + "IM83", + "IM84", + "IM85", + "IM86", + "IM87", + "IM88", + "IM89", + "IM90", + "IM91", + "IM92", + "IM93", + "IM94", + "IM95", + "IM96", + "IM97", + "IM98", + "IM99", + "IN30", + "IN31", + "IN32", + "IN33", + "IN40", + "IN41", + "IN42", + "IN43", + "IN50", + "IN51", + "IN52", + "IN53", + "IN60", + "IN61", + "IN62", + "IN63", + "IN70", + "IN71", + "IN72", + "IN73", + "IN80", + "IN81", + "IN82", + "IN83", + "IN90", + "IN91", + "IN92", + "IN93", + "JK19", + "JK29", + "JK39", + "JL00", + "JL01", + "JL02", + "JL03", + "JL04", + "JL05", + "JL06", + "JL07", + "JL08", + "JL09", + "JL10", + "JL11", + "JL12", + "JL13", + "JL14", + "JL15", + "JL16", + "JL17", + "JL18", + "JL19", + "JL20", + "JL21", + "JL22", + "JL23", + "JL24", + "JL25", + "JL26", + "JL27", + "JL28", + "JL29", + "JL30", + "JL31", + "JL32", + "JL33", + "JL34", + "JL35", + "JL36", + "JL37", + "JL38", + "JL39", + "JL41", + "JL42", + "JL43", + "JL44", + "JL45", + "JL46", + "JL47", + "JL48", + "JL49", + "JL52", + "JL53", + "JL54", + "JM00", + "JM01", + "JM02", + "JM03", + "JM04", + "JM05", + "JM06", + "JM07", + "JM08", + "JM09", + "JM10", + "JM11", + "JM12", + "JM13", + "JM14", + "JM15", + "JM16", + "JM17", + "JM18", + "JM19", + "JM20", + "JM21", + "JM22", + "JM23", + "JM24", + "JM25", + "JM26", + "JM27", + "JM28", + "JM29", + "JM30", + "JM31", + "JM32", + "JM33", + "JM34", + "JM35", + "JM36", + "JM37", + "JM38", + "JM39", + "JM40", + "JM41", + "JM42", + "JM43", + "JM44", + "JM45", + "JM46", + "JM47", + "JM50", + "JM51", + "JM52", + "JM53", + "JM54", + "JM55", + "JM56", + "JM57", + "JM64", + "JM65", + "JM66", + "JM67", + "JN00", + "JN01", + "JN02", + "JN10", + "JN11", + "JN12", + "JN20", + "JN21", + "JN22", + "JN30", + "JN31", + "JN32" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-13, 44], + [-3, 44], + [-1.77717, 43.41047], + [-1.72886, 43.29722], + [-1.62288, 43.30683], + [-1.37975, 43.25661], + [-1.38184, 43.18915], + [-1.47324, 43.08696], + [-1.35249, 43.0256], + [-1.33073, 43.11144], + [-1.22885, 43.05503], + [-0.93517, 42.95218], + [-0.75055, 42.96568], + [-0.55585, 42.77731], + [-0.50649, 42.8269], + [-0.38783, 42.79657], + [-0.34326, 42.84056], + [-0.16114, 42.79346], + [-0.01058, 42.68374], + [0.18618, 42.73661], + [0.29717, 42.67273], + [0.39025, 42.71627], + [0.67546, 42.69204], + [0.64214, 42.75722], + [0.70742, 42.86028], + [0.92346, 42.79057], + [1.08016, 42.78882], + [1.17197, 42.71045], + [1.35305, 42.71883], + [1.44496, 42.59425], + [1.45129, 42.43763], + [1.54842, 42.43229], + [1.67228, 42.49678], + [1.93906, 42.45392], + [1.97214, 42.37211], + [2.0887, 42.36553], + [2.16063, 42.42484], + [2.31059, 42.42729], + [2.5419, 42.33241], + [2.67494, 42.34413], + [2.65171, 42.38643], + [2.83737, 42.45891], + [3.03911, 42.4765], + [3.0802, 42.42369], + [3.17622, 42.43575], + [7.5, 42.43575], + [7.5, 37.94803], + [9.98889, 37.93682], + [12.36254, 37.03947], + [13.17828, 35.88434], + [11.56604, 33.24828], + [11.49462, 32.92105], + [11.48913, 32.66757], + [11.59625, 32.52464], + [11.5935, 32.44655], + [11.37652, 32.32935], + [11.14169, 32.26614], + [10.88488, 32.1193], + [10.8121, 32.01189], + [10.65348, 31.97193], + [10.63563, 31.86921], + [10.53881, 31.74551], + [10.33007, 31.73043], + [10.12133, 31.48158], + [10.28887, 31.08164], + [10.30673, 30.86757], + [10.18176, 30.66292], + [9.95379, 30.38572], + [9.39624, 30.16537], + [9.42019, 30.03021], + [9.54303, 29.89505], + [9.7887, 29.40556], + [9.88056, 28.98174], + [9.9065, 28.75004], + [9.83204, 28.29156], + [9.96632, 27.88144], + [9.94506, 27.73065], + [9.82854, 27.48432], + [9.78103, 27.26418], + [9.86138, 26.93091], + [9.93075, 26.85787], + [9.9143, 26.6447], + [9.8635, 26.51679], + [9.50524, 26.37698], + [9.39967, 26.19533], + [10.02842, 25.35397], + [10.04076, 24.95565], + [10.21658, 24.64812], + [10.35265, 24.53364], + [10.58695, 24.53964], + [10.72362, 24.57057], + [10.95514, 24.52847], + [11.04608, 24.4262], + [11.13152, 24.39394], + [11.42324, 24.19938], + [11.60295, 24.26581], + [12, 23.49999], + [7.45937, 20.84341], + [5.81301, 19.44323], + [3.35764, 18.96814], + [3.11479, 19.13998], + [3.19798, 19.27649], + [3.17915, 19.3629], + [3.2591, 19.43548], + [3.23007, 19.59995], + [3.25689, 19.83463], + [3.14946, 19.85801], + [2.97443, 19.95002], + [2.73125, 19.99699], + [2.66449, 20.05186], + [2.56171, 20.03337], + [2.51941, 20.0939], + [2.39706, 20.06315], + [2.40564, 20.13198], + [2.20832, 20.31812], + [2.1237, 20.23697], + [2.04457, 20.2692], + [1.91653, 20.22541], + [1.67385, 20.40193], + [1.66322, 20.53259], + [1.59766, 20.59637], + [1.3574, 20.67141], + [1.32282, 20.7395], + [1.15863, 20.74085], + [1.19109, 20.94114], + [1.16658, 21.1163], + [-4.85704, 25.0159], + [-8.66667, 27.29444], + [-8.66588, 27.66646], + [-13.45361, 27.66646], + [-13, 28.25], + [-13, 44] + ] + ] + }, + "properties": { "ituzone": "37" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "38": { + "mh": [ + "JL45", + "JL46", + "JL47", + "JL48", + "JL49", + "JL53", + "JL54", + "JL55", + "JL56", + "JL57", + "JL58", + "JL59", + "JL62", + "JL63", + "JL64", + "JL65", + "JL66", + "JL67", + "JL68", + "JL69", + "JL72", + "JL73", + "JL74", + "JL75", + "JL76", + "JL77", + "JL78", + "JL79", + "JL82", + "JL83", + "JL84", + "JL85", + "JL86", + "JL87", + "JL88", + "JL89", + "JL91", + "JL92", + "JL93", + "JL94", + "JL95", + "JL96", + "JL97", + "JL98", + "JL99", + "JM40", + "JM50", + "JM51", + "JM52", + "JM53", + "JM60", + "JM61", + "JM62", + "JM63", + "JM64", + "JM65", + "JM70", + "JM71", + "JM72", + "JM73", + "JM74", + "JM75", + "JM80", + "JM81", + "JM82", + "JM83", + "JM84", + "JM85", + "JM90", + "JM91", + "JM92", + "JM93", + "JM94", + "JM95", + "KK19", + "KL00", + "KL01", + "KL02", + "KL03", + "KL04", + "KL05", + "KL06", + "KL07", + "KL08", + "KL09", + "KL10", + "KL11", + "KL12", + "KL13", + "KL14", + "KL15", + "KL16", + "KL17", + "KL18", + "KL19", + "KL20", + "KL21", + "KL22", + "KL23", + "KL24", + "KL25", + "KL26", + "KL27", + "KL28", + "KL29", + "KL32", + "KL33", + "KL34", + "KL35", + "KL36", + "KL37", + "KL38", + "KL39", + "KL42", + "KL43", + "KL44", + "KL45", + "KL46", + "KL47", + "KL48", + "KL49", + "KL52", + "KL53", + "KL54", + "KL55", + "KL56", + "KL57", + "KL58", + "KL59", + "KL61", + "KL62", + "KL63", + "KL64", + "KL65", + "KL66", + "KL67", + "KL68", + "KL69", + "KL72", + "KL73", + "KL74", + "KL75", + "KL76", + "KL77", + "KL78", + "KL79", + "KL83", + "KL84", + "KM00", + "KM01", + "KM02", + "KM03", + "KM04", + "KM10", + "KM11", + "KM12", + "KM13", + "KM14", + "KM20", + "KM21", + "KM22", + "KM23", + "KM24", + "KM30", + "KM31", + "KM32", + "KM33", + "KM40", + "KM41", + "KM42", + "KM43", + "KM50", + "KM51", + "KM52", + "KM53", + "KM60", + "KM61", + "KM62", + "KM70", + "KM71" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [36.52087, 23.83941], + [35.62166, 23.14851], + [35.2079, 22.7861], + [34.94687, 22.85971], + [34.68756, 22.29472], + [34.14935, 22.20393], + [34.00321, 21.77032], + [33.55737, 21.72439], + [33.16646, 21.99978], + [30.64489, 22.00045], + [28.0931, 22.01895], + [25.00004, 21.99993], + [25.00003, 20.00042], + [24.00134, 19.9996], + [23.99966, 19.50146], + [22.05295, 20.51722], + [20.07329, 21.51239], + [15.99997, 23.44918], + [14.99767, 23.00427], + [14.1894, 22.64545], + [13.61797, 23.11379], + [13.41288, 23.21085], + [12, 23.49999], + [11.60295, 24.26581], + [11.42324, 24.19938], + [11.13152, 24.39394], + [11.04608, 24.4262], + [10.95514, 24.52847], + [10.72362, 24.57057], + [10.58695, 24.53964], + [10.35265, 24.53364], + [10.21658, 24.64812], + [10.04076, 24.95565], + [10.02842, 25.35397], + [9.39967, 26.19533], + [9.50524, 26.37698], + [9.8635, 26.51679], + [9.9143, 26.6447], + [9.93075, 26.85787], + [9.86138, 26.93091], + [9.78103, 27.26418], + [9.82854, 27.48432], + [9.94506, 27.73065], + [9.96632, 27.88144], + [9.83204, 28.29156], + [9.9065, 28.75004], + [9.88056, 28.98174], + [9.7887, 29.40556], + [9.54303, 29.89505], + [9.42019, 30.03021], + [9.39624, 30.16537], + [9.95379, 30.38572], + [10.18176, 30.66292], + [10.30673, 30.86757], + [10.28887, 31.08164], + [10.12133, 31.48158], + [10.33007, 31.73043], + [10.53881, 31.74551], + [10.63563, 31.86921], + [10.65348, 31.97193], + [10.8121, 32.01189], + [10.88488, 32.1193], + [11.14169, 32.26614], + [11.37652, 32.32935], + [11.5935, 32.44655], + [11.59625, 32.52464], + [11.48913, 32.66757], + [11.49462, 32.92105], + [11.56604, 33.24828], + [13.17828, 35.88434], + [33.12304, 32.49965], + [34.21839, 31.32427], + [34.404, 30.85782], + [34.49783, 30.67867], + [34.54311, 30.41283], + [34.61123, 30.37103], + [34.84851, 29.75849], + [34.90191, 29.48865], + [34.80502, 29.13042], + [34.47917, 28.05488], + [34.85369, 27.92316], + [36.52087, 23.83941] + ] + ] + }, + "properties": { "ituzone": "38" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "39": { + "mh": [ + "KK98", + "KK99", + "KL75", + "KL76", + "KL77", + "KL78", + "KL79", + "KL81", + "KL82", + "KL83", + "KL84", + "KL85", + "KL86", + "KL87", + "KL88", + "KL89", + "KL90", + "KL91", + "KL92", + "KL93", + "KL94", + "KL95", + "KL96", + "KL97", + "KL98", + "KL99", + "KM29", + "KM36", + "KM37", + "KM38", + "KM39", + "KM46", + "KM47", + "KM48", + "KM49", + "KM52", + "KM53", + "KM54", + "KM55", + "KM56", + "KM57", + "KM58", + "KM59", + "KM61", + "KM62", + "KM63", + "KM64", + "KM65", + "KM66", + "KM67", + "KM68", + "KM69", + "KM70", + "KM71", + "KM72", + "KM73", + "KM74", + "KM75", + "KM76", + "KM77", + "KM78", + "KM79", + "KM80", + "KM81", + "KM82", + "KM83", + "KM84", + "KM85", + "KM86", + "KM87", + "KM88", + "KM89", + "KM90", + "KM91", + "KM92", + "KM93", + "KM94", + "KM95", + "KM96", + "KM97", + "KM98", + "KM99", + "KN20", + "KN30", + "KN31", + "KN32", + "KN40", + "KN41", + "KN50", + "KN51", + "KN52", + "KN53", + "KN60", + "KN61", + "KN62", + "KN63", + "KN70", + "KN71", + "KN72", + "KN80", + "KN81", + "KN82", + "KN90", + "KN91", + "KN92", + "LK04", + "LK05", + "LK06", + "LK07", + "LK08", + "LK09", + "LK11", + "LK12", + "LK13", + "LK14", + "LK15", + "LK16", + "LK17", + "LK18", + "LK19", + "LK21", + "LK22", + "LK23", + "LK24", + "LK25", + "LK26", + "LK27", + "LK28", + "LK29", + "LK31", + "LK32", + "LK33", + "LK34", + "LK35", + "LK36", + "LK37", + "LK38", + "LK39", + "LK42", + "LK43", + "LK44", + "LK45", + "LK46", + "LK47", + "LK48", + "LK49", + "LK52", + "LK53", + "LK54", + "LK55", + "LK56", + "LK57", + "LK58", + "LK59", + "LK63", + "LK64", + "LK65", + "LK66", + "LK67", + "LK68", + "LK69", + "LK73", + "LK74", + "LK75", + "LK76", + "LK77", + "LK78", + "LK79", + "LK84", + "LK85", + "LK86", + "LK87", + "LK88", + "LK89", + "LK94", + "LK95", + "LK96", + "LK97", + "LK98", + "LK99", + "LL00", + "LL01", + "LL02", + "LL03", + "LL04", + "LL05", + "LL06", + "LL07", + "LL08", + "LL09", + "LL10", + "LL11", + "LL12", + "LL13", + "LL14", + "LL15", + "LL16", + "LL17", + "LL18", + "LL19", + "LL20", + "LL21", + "LL22", + "LL23", + "LL24", + "LL25", + "LL26", + "LL27", + "LL28", + "LL29", + "LL30", + "LL31", + "LL32", + "LL33", + "LL34", + "LL35", + "LL36", + "LL37", + "LL38", + "LL39", + "LL40", + "LL41", + "LL42", + "LL43", + "LL44", + "LL45", + "LL46", + "LL47", + "LL48", + "LL49", + "LL50", + "LL51", + "LL52", + "LL53", + "LL54", + "LL55", + "LL56", + "LL57", + "LL58", + "LL60", + "LL61", + "LL62", + "LL63", + "LL64", + "LL65", + "LL66", + "LL70", + "LL71", + "LL72", + "LL73", + "LL74", + "LL75", + "LL76", + "LL80", + "LL81", + "LL82", + "LL83", + "LL84", + "LL85", + "LL86", + "LL90", + "LL91", + "LL92", + "LL93", + "LL94", + "LM00", + "LM01", + "LM02", + "LM03", + "LM04", + "LM05", + "LM06", + "LM07", + "LM08", + "LM09", + "LM10", + "LM11", + "LM12", + "LM13", + "LM14", + "LM15", + "LM16", + "LM17", + "LM18", + "LM19", + "LM20", + "LM21", + "LM22", + "LM23", + "LM24", + "LM25", + "LM26", + "LM27", + "LM28", + "LM29", + "LM30", + "LM31", + "LM32", + "LM33", + "LM35", + "LM40", + "LN00", + "LN01", + "LN10", + "LN11" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [44.8069, 39.62859], + [44.61327, 39.78175], + [44.46702, 39.68443], + [44.41566, 39.55484], + [44.42172, 39.41204], + [44.2955, 39.37732], + [44.23801, 39.41373], + [44.03199, 39.37147], + [44.10708, 39.28474], + [44.09718, 39.20497], + [44.17894, 39.16897], + [44.18988, 38.9339], + [44.31465, 38.80776], + [44.26372, 38.71923], + [44.32119, 38.62328], + [44.31473, 38.37537], + [44.44857, 38.38547], + [44.50976, 38.34595], + [44.40224, 38.25158], + [44.24129, 37.96437], + [44.22209, 37.88839], + [44.40337, 37.85119], + [44.44498, 37.77099], + [44.58628, 37.76471], + [44.62628, 37.70742], + [44.56672, 37.6419], + [44.61462, 37.60167], + [44.58773, 37.43957], + [44.81551, 37.27985], + [44.75766, 37.22885], + [44.74969, 37.11229], + [44.8945, 37.02831], + [44.90189, 36.85783], + [44.84434, 36.77858], + [44.93962, 36.78641], + [45.06626, 36.68812], + [45.01275, 36.51926], + [45.08236, 36.42521], + [45.23767, 36.43357], + [45.2656, 36.25328], + [45.33657, 36.20367], + [45.38245, 36.07943], + [45.34244, 35.99713], + [45.54969, 36.00112], + [45.66846, 35.92417], + [45.76437, 35.79935], + [46.09238, 35.85728], + [46.21134, 35.79419], + [46.2887, 35.8345], + [46.33387, 35.76377], + [46.1662, 35.68956], + [46.03582, 35.70519], + [45.9863, 35.49599], + [46.15883, 35.28429], + [46.19133, 35.11262], + [46.05637, 35.03937], + [45.92187, 35.09704], + [45.87469, 35.03376], + [45.86549, 34.89595], + [45.68935, 34.816], + [45.65252, 34.72326], + [45.70223, 34.69457], + [45.74194, 34.53626], + [45.60092, 34.55175], + [45.52998, 34.60164], + [45.52708, 34.49792], + [45.44033, 34.45565], + [45.49742, 34.33621], + [45.5835, 34.30291], + [45.55426, 34.19628], + [45.4316, 33.9468], + [45.5027, 33.95732], + [45.63993, 33.74288], + [45.77136, 33.63843], + [45.7544, 33.5934], + [45.90552, 33.63817], + [45.96133, 33.5612], + [45.86271, 33.49315], + [46.00655, 33.5087], + [46.0805, 33.35259], + [46.1911, 33.2634], + [46.18646, 33.17179], + [46.0411, 33.0954], + [46.15695, 33.07334], + [46.0974, 32.9812], + [46.31245, 32.96897], + [46.48078, 32.91619], + [46.72079, 32.78647], + [46.88718, 32.63203], + [47.1683, 32.4573], + [47.2833, 32.49759], + [47.38143, 32.47421], + [47.4656, 32.39328], + [47.46219, 32.31591], + [47.5947, 32.12479], + [47.69916, 32.02327], + [47.8662, 31.78351], + [47.68322, 31.39389], + [47.68271, 30.99754], + [48.0323, 30.99642], + [48.02565, 30.478], + [48.16616, 30.42434], + [48.19303, 30.33196], + [48.27187, 30.33568], + [48.41855, 30.17937], + [48.37909, 30.12174], + [48.45689, 29.99635], + [48.61398, 29.9301], + [51.08593, 27.41514], + [54.35644, 25.55673], + [56.44213, 26.57008], + [57.35314, 25.2439], + [60, 24], + [60, 15], + [44.32215, 11.48006], + [42.64797, 13.47029], + [36.52087, 23.83941], + [34.85369, 27.92316], + [34.47917, 28.05488], + [34.80502, 29.13042], + [34.90191, 29.48865], + [34.84851, 29.75849], + [34.61123, 30.37103], + [34.54311, 30.41283], + [34.49783, 30.67867], + [34.404, 30.85782], + [34.21839, 31.32427], + [33.12304, 32.49965], + [30, 33.03857], + [30, 36], + [29.67334, 36.12332], + [29.58839, 36.17786], + [29.34707, 36.21821], + [28.51287, 36.5339], + [27.96671, 36.53534], + [27.84627, 36.69365], + [27.53398, 36.61334], + [27.3159, 36.66434], + [27.43454, 36.86791], + [27.22686, 36.95396], + [27.20893, 37.14941], + [26.95995, 37.67625], + [27.09334, 37.70565], + [27.13561, 37.79187], + [26.17643, 38.2822], + [26.32076, 38.44329], + [26.30455, 38.66595], + [26.73355, 38.97176], + [26.49005, 39.40783], + [26.08451, 39.41639], + [25.58284, 40.11726], + [26.03643, 40.72824], + [26.12188, 40.74187], + [26.22527, 40.88622], + [26.367, 41.02023], + [26.31264, 41.07472], + [26.32611, 41.25532], + [26.39841, 41.25035], + [26.63771, 41.37971], + [26.59245, 41.61039], + [26.39275, 41.68964], + [26.32515, 41.74416], + [26.37084, 41.82314], + [26.53944, 41.82431], + [26.6253, 41.97507], + [26.97056, 42.00022], + [27.06433, 42.09145], + [27.20428, 42.06247], + [27.23628, 42.10582], + [27.56975, 41.9025], + [27.58551, 41.93491], + [27.81715, 41.99087], + [28.02544, 41.97996], + [30, 42], + [30, 43.5], + [41.49877, 41.53332], + [41.78738, 41.46032], + [41.82349, 41.43097], + [41.95484, 41.52328], + [42.04078, 41.4935], + [42.17829, 41.51461], + [42.52007, 41.43636], + [42.60107, 41.58508], + [42.83599, 41.58475], + [42.79652, 41.51618], + [42.96792, 41.45117], + [43.03151, 41.37093], + [43.21317, 41.28956], + [43.24201, 41.17451], + [43.37577, 41.20318], + [43.44872, 41.17597], + [43.4683, 41.03112], + [43.67181, 40.9367], + [43.67726, 40.84719], + [43.7493, 40.67735], + [43.65001, 40.53055], + [43.544, 40.47719], + [43.60793, 40.43522], + [43.59094, 40.346], + [43.67987, 40.25972], + [43.71377, 40.16273], + [43.65648, 40.11158], + [43.89377, 40.02318], + [44.27969, 40.04909], + [44.41655, 40.00288], + [44.53541, 39.92129], + [44.58865, 39.8341], + [44.69746, 39.79062], + [44.8069, 39.62859] + ] + ] + }, + "properties": { "ituzone": "39" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "40": { + "mh": [ + "LL48", + "LL49", + "LL57", + "LL58", + "LL59", + "LL65", + "LL66", + "LL67", + "LL68", + "LL69", + "LL75", + "LL76", + "LL77", + "LL78", + "LL79", + "LL85", + "LL86", + "LL87", + "LL88", + "LL89", + "LL94", + "LL95", + "LL96", + "LL97", + "LL98", + "LL99", + "LM23", + "LM24", + "LM25", + "LM26", + "LM27", + "LM28", + "LM29", + "LM31", + "LM32", + "LM33", + "LM34", + "LM35", + "LM36", + "LM37", + "LM38", + "LM39", + "LM40", + "LM41", + "LM42", + "LM43", + "LM44", + "LM45", + "LM46", + "LM47", + "LM48", + "LM49", + "LM50", + "LM51", + "LM52", + "LM53", + "LM54", + "LM55", + "LM56", + "LM57", + "LM58", + "LM60", + "LM61", + "LM62", + "LM63", + "LM64", + "LM65", + "LM66", + "LM67", + "LM70", + "LM71", + "LM72", + "LM73", + "LM74", + "LM75", + "LM76", + "LM77", + "LM78", + "LM80", + "LM81", + "LM82", + "LM83", + "LM84", + "LM85", + "LM86", + "LM87", + "LM88", + "LM90", + "LM91", + "LM92", + "LM93", + "LM94", + "LM95", + "LM96", + "LM97", + "ML04", + "ML05", + "ML06", + "ML07", + "ML08", + "ML09", + "ML16", + "ML17", + "ML18", + "ML19", + "ML29", + "ML39", + "MM00", + "MM01", + "MM02", + "MM03", + "MM04", + "MM05", + "MM06", + "MM07", + "MM10", + "MM11", + "MM12", + "MM13", + "MM14", + "MM15", + "MM16", + "MM20", + "MM21", + "MM22", + "MM23", + "MM24", + "MM25", + "MM26", + "MM27", + "MM30", + "MM31", + "MM32", + "MM33", + "MM34", + "MM35", + "MM36", + "MM37", + "MM41", + "MM42", + "MM43", + "MM44", + "MM45", + "MM46", + "MM47", + "MM53", + "MM54", + "MM55", + "MM56", + "MM57", + "MM58", + "MM66", + "MM67", + "MM76", + "MM77" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [60, 24], + [57.35314, 25.2439], + [56.44213, 26.57008], + [54.35644, 25.55673], + [51.08593, 27.41514], + [48.61398, 29.9301], + [48.45689, 29.99635], + [48.37909, 30.12174], + [48.41855, 30.17937], + [48.27187, 30.33568], + [48.19303, 30.33196], + [48.16616, 30.42434], + [48.02565, 30.478], + [48.0323, 30.99642], + [47.68271, 30.99754], + [47.68322, 31.39389], + [47.8662, 31.78351], + [47.69916, 32.02327], + [47.5947, 32.12479], + [47.46219, 32.31591], + [47.4656, 32.39328], + [47.38143, 32.47421], + [47.2833, 32.49759], + [47.1683, 32.4573], + [46.88718, 32.63203], + [46.72079, 32.78647], + [46.48078, 32.91619], + [46.31245, 32.96897], + [46.0974, 32.9812], + [46.15695, 33.07334], + [46.0411, 33.0954], + [46.18646, 33.17179], + [46.1911, 33.2634], + [46.0805, 33.35259], + [46.00655, 33.5087], + [45.86271, 33.49315], + [45.96133, 33.5612], + [45.90552, 33.63817], + [45.7544, 33.5934], + [45.77136, 33.63843], + [45.63993, 33.74288], + [45.5027, 33.95732], + [45.4316, 33.9468], + [45.55426, 34.19628], + [45.5835, 34.30291], + [45.49742, 34.33621], + [45.44033, 34.45565], + [45.52708, 34.49792], + [45.52998, 34.60164], + [45.60092, 34.55175], + [45.74194, 34.53626], + [45.70223, 34.69457], + [45.65252, 34.72326], + [45.68935, 34.816], + [45.86549, 34.89595], + [45.87469, 35.03376], + [45.92187, 35.09704], + [46.05637, 35.03937], + [46.19133, 35.11262], + [46.15883, 35.28429], + [45.9863, 35.49599], + [46.03582, 35.70519], + [46.1662, 35.68956], + [46.33387, 35.76377], + [46.2887, 35.8345], + [46.21134, 35.79419], + [46.09238, 35.85728], + [45.76437, 35.79935], + [45.66846, 35.92417], + [45.54969, 36.00112], + [45.34244, 35.99713], + [45.38245, 36.07943], + [45.33657, 36.20367], + [45.2656, 36.25328], + [45.23767, 36.43357], + [45.08236, 36.42521], + [45.01275, 36.51926], + [45.06626, 36.68812], + [44.93962, 36.78641], + [44.84434, 36.77858], + [44.90189, 36.85783], + [44.8945, 37.02831], + [44.74969, 37.11229], + [44.75766, 37.22885], + [44.81551, 37.27985], + [44.58773, 37.43957], + [44.61462, 37.60167], + [44.56672, 37.6419], + [44.62628, 37.70742], + [44.58628, 37.76471], + [44.44498, 37.77099], + [44.40337, 37.85119], + [44.22209, 37.88839], + [44.24129, 37.96437], + [44.40224, 38.25158], + [44.50976, 38.34595], + [44.44857, 38.38547], + [44.31473, 38.37537], + [44.32119, 38.62328], + [44.26372, 38.71923], + [44.31465, 38.80776], + [44.18988, 38.9339], + [44.17894, 39.16897], + [44.09718, 39.20497], + [44.10708, 39.28474], + [44.03199, 39.37147], + [44.23801, 39.41373], + [44.2955, 39.37732], + [44.42172, 39.41204], + [44.41566, 39.55484], + [44.46702, 39.68443], + [44.61327, 39.78175], + [44.8069, 39.62859], + [44.86942, 39.61649], + [44.96543, 39.42246], + [45.05836, 39.38236], + [45.14142, 39.28313], + [45.14699, 39.20535], + [45.30868, 39.19379], + [45.45674, 39.04716], + [45.43817, 39.00495], + [45.6162, 38.94271], + [46.06676, 38.88753], + [46.18465, 38.84042], + [46.33755, 38.91691], + [46.52573, 38.88782], + [46.60268, 38.90776], + [46.86499, 39.15647], + [46.94904, 39.13923], + [47.05281, 39.19274], + [47.11193, 39.28736], + [47.21472, 39.31844], + [47.40099, 39.46393], + [47.52779, 39.49893], + [47.79196, 39.64998], + [48.03155, 39.69159], + [48.36848, 39.3813], + [48.16604, 39.30403], + [48.14289, 39.20574], + [48.30536, 39.10916], + [48.33915, 39.03587], + [48.27559, 38.96844], + [48.08838, 38.94687], + [48.01028, 38.90261], + [48.0419, 38.81495], + [48.25167, 38.72663], + [48.31756, 38.60225], + [48.45866, 38.60661], + [48.66171, 38.3916], + [48.79969, 38.45188], + [48.88821, 38.43925], + [51.39511, 37.88291], + [53.90931, 37.34744], + [54.24427, 37.32038], + [54.39855, 37.36098], + [54.57669, 37.45508], + [54.65325, 37.43072], + [54.79777, 37.52305], + [54.784, 37.63269], + [54.82383, 37.72522], + [55.12933, 37.95097], + [55.40644, 38.04027], + [55.48439, 38.08549], + [55.81336, 38.11152], + [55.98077, 38.06502], + [56.33919, 38.07064], + [56.32722, 38.16489], + [56.41705, 38.24036], + [56.60408, 38.22341], + [56.75466, 38.27258], + [56.85608, 38.21152], + [57.08935, 38.18094], + [57.1605, 38.25652], + [57.24511, 38.26169], + [57.29369, 38.15024], + [57.38058, 38.07294], + [57.35913, 37.97444], + [57.52497, 37.91485], + [57.78719, 37.89308], + [58.04936, 37.7953], + [58.21188, 37.76011], + [58.23733, 37.67347], + [58.38711, 37.617], + [58.57722, 37.69274], + [58.74224, 37.62989], + [58.82194, 37.692], + [59.04761, 37.61275], + [59.27627, 37.4973], + [59.34783, 37.51544], + [59.40311, 37.42602], + [59.402, 37.30625], + [59.55199, 37.16624], + [59.55383, 37.12252], + [59.69955, 37.12819], + [59.83305, 37.09208], + [60.08433, 36.97852], + [60.17675, 36.84241], + [60.37066, 36.62424], + [60.63477, 36.62755], + [61.14002, 36.66202], + [61.19097, 36.56772], + [61.17025, 36.34033], + [61.22922, 36.17239], + [61.15927, 35.98961], + [61.234, 35.9155], + [61.25997, 35.81291], + [61.22288, 35.66036], + [61.3688, 35.62441], + [61.38483, 35.56961], + [61.59986, 35.43647], + [61.76699, 35.4145], + [61.96427, 35.45358], + [62.05738, 35.43747], + [62.14344, 35.34477], + [62.24813, 35.3088], + [62.3098, 35.14294], + [62.46683, 35.2843], + [62.61572, 35.21647], + [62.74783, 35.26519], + [63.01486, 35.42889], + [63.09635, 35.42772], + [63.12722, 35.54972], + [63.09516, 35.61877], + [63.24425, 35.68661], + [63.14055, 35.77563], + [63.12922, 35.8693], + [63.30011, 35.86452], + [63.54719, 35.9133], + [63.57447, 35.95641], + [63.97622, 36.04194], + [64.06522, 36.00172], + [64.08222, 36.11275], + [64.4488, 36.237], + [64.60433, 36.4035], + [64.60519, 36.62655], + [64.79544, 36.936], + [64.75661, 37.10647], + [64.98261, 37.21294], + [65.22805, 37.25016], + [65.5243, 37.23416], + [65.63819, 37.33488], + [65.69758, 37.52836], + [65.7983, 37.53822], + [65.87705, 37.47261], + [66.0985, 37.42944], + [66.30041, 37.32333], + [66.56894, 37.36022], + [66.68336, 37.33722], + [66.97135, 37.38674], + [67.09833, 37.33038], + [67.26396, 37.18849], + [67.49622, 37.2718], + [67.79052, 37.18375], + [67.78653, 37.09394], + [67.89905, 37.06422], + [67.99805, 36.93752], + [68.07819, 36.94263], + [68.20344, 37.02394], + [68.28138, 37.01852], + [68.30291, 37.10558], + [68.63905, 37.20724], + [68.68049, 37.27616], + [68.88616, 37.32372], + [69.00794, 37.30077], + [69.12647, 37.17186], + [69.24883, 37.0973], + [69.31886, 37.11791], + [69.45549, 37.23936], + [69.38461, 37.31916], + [69.38122, 37.45166], + [69.52424, 37.58499], + [69.81819, 37.57383], + [69.90808, 37.61677], + [69.95388, 37.56397], + [70.16789, 37.52888], + [70.30613, 37.69591], + [70.28111, 37.81155], + [70.19674, 37.84252], + [70.17466, 37.92188], + [70.27805, 37.94086], + [70.36536, 38.05177], + [70.4981, 38.11769], + [70.60597, 38.34324], + [70.6781, 38.40716], + [70.98908, 38.48341], + [71.04483, 38.39855], + [71.32744, 38.29452], + [71.37136, 38.20755], + [71.26017, 37.93375], + [71.32683, 37.88513], + [71.52938, 37.95416], + [71.57824, 37.92789], + [71.58908, 37.7965], + [71.49394, 37.53813], + [71.52302, 37.47822], + [71.499, 37.30819], + [71.42719, 37.05511], + [71.56058, 36.75669], + [71.66683, 36.67786], + [71.83022, 36.68705], + [72.04714, 36.83402], + [72.31872, 36.97705], + [72.65916, 37.0193], + [72.8178, 37.22927], + [73.0753, 37.31763], + [73.15605, 37.40783], + [73.30841, 37.46241], + [73.51008, 37.47036], + [73.75597, 37.435], + [73.76658, 37.33858], + [73.61761, 37.27872], + [73.75208, 37.22283], + [73.9635, 37.29216], + [74.22225, 37.34802], + [74.23661, 37.41447], + [74.56222, 37.37947], + [74.68258, 37.40414], + [74.82969, 37.32916], + [74.87855, 37.23569], + [74.74725, 37.27541], + [74.65992, 37.23838], + [74.48911, 37.24191], + [74.43311, 37.11574], + [74.57155, 37.02978], + [74.42786, 36.99763], + [74.264, 36.90444], + [74.15203, 36.90986], + [74.12741, 36.84811], + [73.96319, 36.8375], + [73.84658, 36.89861], + [73.70505, 36.91272], + [73.52777, 36.88555], + [73.40313, 36.89913], + [73.07174, 36.88905], + [72.88263, 36.84108], + [72.65616, 36.84983], + [72.49522, 36.77755], + [72.24136, 36.75347], + [72.21447, 36.66422], + [71.83205, 36.50547], + [71.79577, 36.40058], + [71.65619, 36.47822], + [71.56874, 36.32949], + [71.44163, 36.26952], + [71.24544, 36.12277], + [71.20141, 36.03577], + [71.37672, 35.95611], + [71.54666, 35.72022], + [71.49947, 35.62641], + [71.61222, 35.57322], + [71.64894, 35.45247], + [71.5558, 35.31286], + [71.67488, 35.19652], + [71.53005, 35.07236], + [71.49925, 34.96374], + [71.30986, 34.87883], + [71.27944, 34.80502], + [71.09566, 34.67552], + [71.08708, 34.59044], + [70.99555, 34.55477], + [71.0068, 34.46111], + [71.16947, 34.3636], + [71.12608, 34.16241], + [71.07627, 34.0625], + [70.76794, 33.95486], + [70.46772, 33.94333], + [70.23883, 33.97314], + [70.01197, 34.04861], + [69.91349, 34.03794], + [69.86119, 33.93991], + [70.00563, 33.73352], + [70.13697, 33.71505], + [70.19702, 33.6336], + [70.17358, 33.52505], + [70.31539, 33.39555], + [70.32352, 33.33094], + [70.15574, 33.22119], + [70.0673, 33.21355], + [70.02308, 33.14327], + [69.87552, 33.09569], + [69.58005, 33.09755], + [69.50711, 33.02902], + [69.53052, 32.86116], + [69.39522, 32.78158], + [69.45122, 32.66316], + [69.38524, 32.56655], + [69.28522, 32.53297], + [69.24069, 32.46138], + [69.28082, 32.35638], + [69.27283, 32.151], + [69.3235, 31.94416], + [69.1976, 31.84838], + [69.11794, 31.70325], + [68.90064, 31.60125], + [68.80494, 31.60997], + [68.70183, 31.76989], + [68.57013, 31.82797], + [68.43311, 31.76325], + [68.58203, 31.75033], + [68.55561, 31.71436], + [68.28661, 31.757], + [68.16889, 31.83425], + [68.06408, 31.69938], + [67.86869, 31.6288], + [67.69977, 31.51938], + [67.56955, 31.53469], + [67.63378, 31.40069], + [67.74094, 31.41477], + [67.78986, 31.35661], + [67.62041, 31.27638], + [67.2715, 31.20577], + [67.05616, 31.23083], + [66.9691, 31.31261], + [66.73108, 31.2125], + [66.68316, 31.07458], + [66.56255, 30.97761], + [66.38658, 30.93391], + [66.28105, 30.56927], + [66.35411, 30.42727], + [66.31661, 30.24286], + [66.24166, 30.05505], + [66.35874, 29.97444], + [66.24563, 29.85136], + [65.06705, 29.53622], + [64.63191, 29.58108], + [64.2668, 29.52383], + [64.1053, 29.37747], + [64.03236, 29.41769], + [63.59083, 29.49041], + [63.36449, 29.47636], + [62.45577, 29.38897], + [61.65252, 29.62569], + [60.87861, 29.86177], + [61.19258, 29.5025], + [61.37749, 29.3353], + [61.35775, 29.28277], + [61.67621, 28.76576], + [61.80416, 28.64016], + [62.11577, 28.48511], + [62.29627, 28.46344], + [62.43966, 28.40713], + [62.5923, 28.25513], + [62.78694, 28.28119], + [62.76822, 28.03241], + [62.83002, 27.73527], + [62.85538, 27.46513], + [62.78147, 27.25141], + [62.97724, 27.19511], + [63.1952, 27.25975], + [63.2809, 27.21176], + [63.33326, 27.11788], + [63.25111, 27.09028], + [63.2405, 26.84088], + [63.18556, 26.83516], + [63.19577, 26.64556], + [62.77869, 26.65227], + [62.60813, 26.58499], + [62.31505, 26.52886], + [62.25636, 26.44597], + [62.28583, 26.3776], + [62.21253, 26.27143], + [62.02984, 26.33453], + [61.90117, 26.26263], + [61.82375, 25.96218], + [61.89033, 25.88005], + [61.8221, 25.84738], + [61.84078, 25.74529], + [61.73626, 25.73913], + [61.6766, 25.64631], + [61.65355, 25.30557], + [61.5713, 25.01276], + [60, 24] + ] + ] + }, + "properties": { "ituzone": "40" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "41": { + "mh": [ + "MI02", + "MI03", + "MI04", + "MI05", + "MI06", + "MI07", + "MI08", + "MI09", + "MI10", + "MI11", + "MI12", + "MI13", + "MI14", + "MI15", + "MI16", + "MI17", + "MI18", + "MI19", + "MI20", + "MI21", + "MI22", + "MI23", + "MI24", + "MI25", + "MI26", + "MI27", + "MI28", + "MI29", + "MI30", + "MI31", + "MI32", + "MI33", + "MI34", + "MI35", + "MI36", + "MI37", + "MI38", + "MI39", + "MI40", + "MI41", + "MI42", + "MI43", + "MI44", + "MI45", + "MI46", + "MI47", + "MI48", + "MI49", + "MI50", + "MI51", + "MI52", + "MI53", + "MI54", + "MI55", + "MI56", + "MI57", + "MI58", + "MI59", + "MI60", + "MI61", + "MI62", + "MI63", + "MI64", + "MI65", + "MI66", + "MI67", + "MI68", + "MI69", + "MI70", + "MI71", + "MI72", + "MI73", + "MI74", + "MI75", + "MI76", + "MI77", + "MI78", + "MI79", + "MI80", + "MI81", + "MI82", + "MI83", + "MI84", + "MI85", + "MI86", + "MI87", + "MI88", + "MI89", + "MI90", + "MI91", + "MI92", + "MI93", + "MI94", + "MI95", + "MI96", + "MI97", + "MI98", + "MI99", + "MJ00", + "MJ01", + "MJ02", + "MJ03", + "MJ04", + "MJ05", + "MJ06", + "MJ07", + "MJ08", + "MJ09", + "MJ10", + "MJ11", + "MJ12", + "MJ13", + "MJ14", + "MJ15", + "MJ16", + "MJ17", + "MJ18", + "MJ19", + "MJ20", + "MJ21", + "MJ22", + "MJ23", + "MJ24", + "MJ25", + "MJ26", + "MJ27", + "MJ28", + "MJ29", + "MJ30", + "MJ31", + "MJ32", + "MJ33", + "MJ34", + "MJ35", + "MJ36", + "MJ37", + "MJ38", + "MJ39", + "MJ40", + "MJ41", + "MJ42", + "MJ43", + "MJ44", + "MJ45", + "MJ46", + "MJ47", + "MJ48", + "MJ49", + "MJ50", + "MJ51", + "MJ52", + "MJ53", + "MJ54", + "MJ55", + "MJ56", + "MJ57", + "MJ58", + "MJ59", + "MJ60", + "MJ61", + "MJ62", + "MJ63", + "MJ64", + "MJ65", + "MJ66", + "MJ67", + "MJ68", + "MJ69", + "MJ70", + "MJ71", + "MJ72", + "MJ73", + "MJ74", + "MJ75", + "MJ76", + "MJ77", + "MJ78", + "MJ79", + "MJ80", + "MJ81", + "MJ82", + "MJ83", + "MJ84", + "MJ85", + "MJ86", + "MJ87", + "MJ88", + "MJ89", + "MJ90", + "MJ91", + "MJ92", + "MJ93", + "MJ94", + "MJ95", + "MJ96", + "MJ97", + "MJ98", + "MJ99", + "MK00", + "MK01", + "MK02", + "MK03", + "MK04", + "MK05", + "MK06", + "MK07", + "MK08", + "MK09", + "MK10", + "MK11", + "MK12", + "MK13", + "MK14", + "MK15", + "MK16", + "MK17", + "MK18", + "MK19", + "MK20", + "MK21", + "MK22", + "MK23", + "MK24", + "MK25", + "MK26", + "MK27", + "MK28", + "MK29", + "MK30", + "MK31", + "MK32", + "MK33", + "MK34", + "MK35", + "MK36", + "MK37", + "MK38", + "MK39", + "MK40", + "MK41", + "MK42", + "MK43", + "MK44", + "MK45", + "MK46", + "MK47", + "MK48", + "MK49", + "MK50", + "MK51", + "MK52", + "MK53", + "MK54", + "MK55", + "MK56", + "MK57", + "MK58", + "MK59", + "MK60", + "MK61", + "MK62", + "MK63", + "MK64", + "MK65", + "MK66", + "MK67", + "MK68", + "MK69", + "MK70", + "MK71", + "MK72", + "MK73", + "MK74", + "MK75", + "MK76", + "MK77", + "MK78", + "MK79", + "MK80", + "MK81", + "MK82", + "MK83", + "MK84", + "MK85", + "MK86", + "MK87", + "MK88", + "MK89", + "MK90", + "MK91", + "MK92", + "MK93", + "MK94", + "MK95", + "MK96", + "MK97", + "MK98", + "MK99", + "ML00", + "ML01", + "ML02", + "ML03", + "ML04", + "ML05", + "ML06", + "ML08", + "ML09", + "ML10", + "ML11", + "ML12", + "ML13", + "ML14", + "ML15", + "ML16", + "ML17", + "ML18", + "ML19", + "ML20", + "ML21", + "ML22", + "ML23", + "ML24", + "ML25", + "ML26", + "ML27", + "ML28", + "ML29", + "ML30", + "ML31", + "ML32", + "ML33", + "ML34", + "ML35", + "ML36", + "ML37", + "ML38", + "ML39", + "ML40", + "ML41", + "ML42", + "ML43", + "ML44", + "ML45", + "ML46", + "ML47", + "ML48", + "ML49", + "ML50", + "ML51", + "ML52", + "ML53", + "ML54", + "ML55", + "ML56", + "ML57", + "ML58", + "ML59", + "ML60", + "ML61", + "ML62", + "ML63", + "ML64", + "ML65", + "ML66", + "ML67", + "ML68", + "ML69", + "ML70", + "ML71", + "ML72", + "ML73", + "ML74", + "ML75", + "ML76", + "ML77", + "ML78", + "ML79", + "ML80", + "ML81", + "ML82", + "ML83", + "ML84", + "ML85", + "ML86", + "ML87", + "ML88", + "ML89", + "ML90", + "ML91", + "ML92", + "ML93", + "ML94", + "ML95", + "ML96", + "ML97", + "ML98", + "ML99", + "MM30", + "MM31", + "MM40", + "MM41", + "MM42", + "MM43", + "MM44", + "MM50", + "MM51", + "MM52", + "MM53", + "MM54", + "MM55", + "MM56", + "MM60", + "MM61", + "MM62", + "MM63", + "MM64", + "MM65", + "MM66", + "MM70", + "MM71", + "MM72", + "MM73", + "MM74", + "MM75", + "MM76", + "MM80", + "MM81", + "MM82", + "MM83", + "MM84", + "MM85", + "MM90", + "MM91", + "MM92", + "MM93", + "MM94", + "MM95", + "NI00", + "NI01", + "NI02", + "NI03", + "NI04", + "NI05", + "NI06", + "NI07", + "NI08", + "NI09", + "NI10", + "NI11", + "NI12", + "NI13", + "NI14", + "NI15", + "NI16", + "NI17", + "NI18", + "NI19", + "NI20", + "NI21", + "NI22", + "NI23", + "NI24", + "NI25", + "NI26", + "NI27", + "NI28", + "NI29", + "NI30", + "NI31", + "NI32", + "NI33", + "NI34", + "NI35", + "NI36", + "NI37", + "NI38", + "NI39", + "NI40", + "NI41", + "NI42", + "NI43", + "NI44", + "NI45", + "NI46", + "NI47", + "NI48", + "NI49", + "NJ00", + "NJ01", + "NJ02", + "NJ03", + "NJ04", + "NJ05", + "NJ06", + "NJ07", + "NJ08", + "NJ09", + "NJ10", + "NJ11", + "NJ12", + "NJ13", + "NJ14", + "NJ15", + "NJ16", + "NJ17", + "NJ18", + "NJ19", + "NJ20", + "NJ21", + "NJ22", + "NJ23", + "NJ24", + "NJ25", + "NJ26", + "NJ27", + "NJ28", + "NJ29", + "NJ30", + "NJ31", + "NJ32", + "NJ33", + "NJ34", + "NJ35", + "NJ36", + "NJ37", + "NJ38", + "NJ39", + "NJ40", + "NJ41", + "NJ42", + "NJ43", + "NJ44", + "NJ45", + "NJ46", + "NJ47", + "NJ48", + "NJ49", + "NK00", + "NK01", + "NK02", + "NK03", + "NK04", + "NK05", + "NK06", + "NK07", + "NK08", + "NK09", + "NK10", + "NK11", + "NK12", + "NK13", + "NK14", + "NK15", + "NK16", + "NK17", + "NK18", + "NK19", + "NK20", + "NK21", + "NK22", + "NK23", + "NK24", + "NK25", + "NK26", + "NK27", + "NK28", + "NK29", + "NK30", + "NK31", + "NK32", + "NK33", + "NK34", + "NK35", + "NK36", + "NK37", + "NK38", + "NK39", + "NK40", + "NK41", + "NK42", + "NK43", + "NK44", + "NK45", + "NK46", + "NK47", + "NK48", + "NK49", + "NL00", + "NL01", + "NL02", + "NL03", + "NL04", + "NL05", + "NL06", + "NL07", + "NL08", + "NL09", + "NL10", + "NL11", + "NL12", + "NL13", + "NL14", + "NL15", + "NL16", + "NL17", + "NL20", + "NL21", + "NL22", + "NL23", + "NL24", + "NL25", + "NL26", + "NL27", + "NL30", + "NL31", + "NL32", + "NL33", + "NL34", + "NL35", + "NL36", + "NL40", + "NL41", + "NL42", + "NL43", + "NL44", + "NL45", + "NL46", + "NL47", + "NL48", + "NL50", + "NL51", + "NL52", + "NL53", + "NL54", + "NL55", + "NL56", + "NL57", + "NL58", + "NL60", + "NL61", + "NL62", + "NL63", + "NL64", + "NL65", + "NL66", + "NL67", + "NL68", + "NL73", + "NL74", + "NL75", + "NL76", + "NL77", + "NL78", + "NL79", + "NL87", + "NL88", + "NL89", + "NM00" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [90, 28.33293], + [90.34854, 28.305], + [90.61389, 28.22764], + [90.48442, 28.13468], + [90.4552, 28.04746], + [90.58468, 28.02185], + [90.69079, 28.08057], + [90.77996, 28.04123], + [90.92778, 28.04443], + [91.21502, 27.99204], + [91.26308, 28.0718], + [91.46563, 28.00555], + [91.48327, 27.9442], + [91.62529, 27.89181], + [91.55357, 27.84988], + [91.6453, 27.76116], + [91.85005, 27.7607], + [91.91978, 27.71735], + [91.99409, 27.78259], + [92.16385, 27.82839], + [92.24078, 27.88525], + [92.31917, 27.79783], + [92.64587, 27.9118], + [92.73611, 28.03953], + [92.65597, 28.08497], + [92.67744, 28.15103], + [92.91921, 28.2001], + [92.93193, 28.2491], + [93.14799, 28.36661], + [93.1852, 28.49461], + [93.42733, 28.66248], + [93.62336, 28.68766], + [93.70606, 28.66452], + [93.78899, 28.73619], + [93.89683, 28.7571], + [94.17876, 28.93613], + [94.26024, 28.93077], + [94.36641, 29.02601], + [94.27917, 29.08873], + [94.54105, 29.21907], + [94.69373, 29.3181], + [94.75197, 29.23021], + [94.84931, 29.1835], + [95.09681, 29.14198], + [95.13691, 29.0883], + [95.2706, 29.07301], + [95.31182, 29.13879], + [95.5093, 29.12566], + [95.5068, 29.19453], + [95.60352, 29.23463], + [95.70994, 29.20426], + [95.73755, 29.29896], + [95.83876, 29.35207], + [95.87632, 29.31443], + [95.96613, 29.37573], + [96.13749, 29.3456], + [96.26171, 29.24421], + [96.29285, 29.15647], + [96.18353, 29.11073], + [96.21353, 29.02723], + [96.26908, 29.09673], + [96.36843, 29.10952], + [96.37516, 29.03219], + [96.62079, 28.72766], + [96.54409, 28.68758], + [96.41155, 28.51711], + [96.49596, 28.42987], + [96.55138, 28.58295], + [96.65408, 28.60977], + [96.86089, 28.48492], + [96.89023, 28.38449], + [96.97652, 28.32978], + [97.14611, 28.35284], + [97.34503, 28.2141], + [97.30976, 28.141], + [97.39578, 28.01223], + [97.36465, 27.8927], + [97.24859, 27.90726], + [97.07833, 27.74638], + [97.01587, 27.74212], + [96.88923, 27.61766], + [96.90589, 27.45019], + [97.03598, 27.2979], + [97.14618, 27.09589], + [97.06687, 27.09195], + [96.89809, 27.17196], + [96.82395, 27.3197], + [96.6177, 27.36806], + [96.51675, 27.29271], + [96.42714, 27.30603], + [96.19285, 27.2707], + [96.01271, 27.17135], + [95.90616, 27.02648], + [95.80781, 27.0046], + [95.71194, 26.88849], + [95.60471, 26.81909], + [95.503, 26.81016], + [95.45027, 26.71614], + [95.14143, 26.61342], + [95.06746, 26.48287], + [95.06534, 26.32876], + [95.11793, 26.10165], + [95.17938, 26.06485], + [95.02271, 25.93076], + [95.03908, 25.76856], + [94.78962, 25.49666], + [94.68907, 25.46893], + [94.58202, 25.2891], + [94.59916, 25.17847], + [94.72892, 25.13524], + [94.73361, 25.02157], + [94.57582, 24.70925], + [94.38913, 24.47937], + [94.25025, 24.14593], + [94.21633, 23.9999], + [94.12906, 23.84357], + [93.92175, 23.95706], + [93.82824, 23.93552], + [93.75879, 24.00677], + [93.62193, 24.01636], + [93.47606, 23.96671], + [93.3794, 24.0903], + [93.3274, 23.98252], + [93.38357, 23.92332], + [93.43323, 23.67887], + [93.36607, 23.34973], + [93.38474, 23.13471], + [93.29352, 23.00908], + [93.13779, 23.0483], + [93.16158, 22.91927], + [93.11954, 22.87613], + [93.0915, 22.71547], + [93.11739, 22.53433], + [93.18101, 22.44044], + [93.19138, 22.24792], + [93.14106, 22.18346], + [93.04426, 22.20215], + [93.05238, 22.11966], + [92.89126, 21.96315], + [92.85722, 22.05885], + [92.72477, 22.15808], + [92.68516, 22.03953], + [92.60307, 21.98259], + [92.60343, 21.65299], + [92.62992, 21.44864], + [92.68006, 21.28636], + [92.59623, 21.24513], + [92.55685, 21.38491], + [92.43897, 21.36515], + [92.38241, 21.47931], + [92.1985, 21.32738], + [92.21947, 21.23333], + [92.17233, 21.18051], + [92.26459, 21.05988], + [92.27287, 20.94424], + [92.37132, 20.7013], + [90, 20], + [90, -10], + [62.46122, -10], + [60, 0], + [60, 24], + [61.5713, 25.01276], + [61.65355, 25.30557], + [61.6766, 25.64631], + [61.73626, 25.73913], + [61.84078, 25.74529], + [61.8221, 25.84738], + [61.89033, 25.88005], + [61.82375, 25.96218], + [61.90117, 26.26263], + [62.02984, 26.33453], + [62.21253, 26.27143], + [62.28583, 26.3776], + [62.25636, 26.44597], + [62.31505, 26.52886], + [62.60813, 26.58499], + [62.77869, 26.65227], + [63.19577, 26.64556], + [63.18556, 26.83516], + [63.2405, 26.84088], + [63.25111, 27.09028], + [63.33326, 27.11788], + [63.2809, 27.21176], + [63.1952, 27.25975], + [62.97724, 27.19511], + [62.78147, 27.25141], + [62.85538, 27.46513], + [62.83002, 27.73527], + [62.76822, 28.03241], + [62.78694, 28.28119], + [62.5923, 28.25513], + [62.43966, 28.40713], + [62.29627, 28.46344], + [62.11577, 28.48511], + [61.80416, 28.64016], + [61.67621, 28.76576], + [61.35775, 29.28277], + [61.37749, 29.3353], + [61.19258, 29.5025], + [60.87861, 29.86177], + [61.65252, 29.62569], + [62.45577, 29.38897], + [63.36449, 29.47636], + [63.59083, 29.49041], + [64.03236, 29.41769], + [64.1053, 29.37747], + [64.2668, 29.52383], + [64.63191, 29.58108], + [65.06705, 29.53622], + [66.24563, 29.85136], + [66.35874, 29.97444], + [66.24166, 30.05505], + [66.31661, 30.24286], + [66.35411, 30.42727], + [66.28105, 30.56927], + [66.38658, 30.93391], + [66.56255, 30.97761], + [66.68316, 31.07458], + [66.73108, 31.2125], + [66.9691, 31.31261], + [67.05616, 31.23083], + [67.2715, 31.20577], + [67.62041, 31.27638], + [67.78986, 31.35661], + [67.74094, 31.41477], + [67.63378, 31.40069], + [67.56955, 31.53469], + [67.69977, 31.51938], + [67.86869, 31.6288], + [68.06408, 31.69938], + [68.16889, 31.83425], + [68.28661, 31.757], + [68.55561, 31.71436], + [68.58203, 31.75033], + [68.43311, 31.76325], + [68.57013, 31.82797], + [68.70183, 31.76989], + [68.80494, 31.60997], + [68.90064, 31.60125], + [69.11794, 31.70325], + [69.1976, 31.84838], + [69.3235, 31.94416], + [69.27283, 32.151], + [69.28082, 32.35638], + [69.24069, 32.46138], + [69.28522, 32.53297], + [69.38524, 32.56655], + [69.45122, 32.66316], + [69.39522, 32.78158], + [69.53052, 32.86116], + [69.50711, 33.02902], + [69.58005, 33.09755], + [69.87552, 33.09569], + [70.02308, 33.14327], + [70.0673, 33.21355], + [70.15574, 33.22119], + [70.32352, 33.33094], + [70.31539, 33.39555], + [70.17358, 33.52505], + [70.19702, 33.6336], + [70.13697, 33.71505], + [70.00563, 33.73352], + [69.86119, 33.93991], + [69.91349, 34.03794], + [70.01197, 34.04861], + [70.23883, 33.97314], + [70.46772, 33.94333], + [70.76794, 33.95486], + [71.07627, 34.0625], + [71.12608, 34.16241], + [71.16947, 34.3636], + [71.0068, 34.46111], + [70.99555, 34.55477], + [71.08708, 34.59044], + [71.09566, 34.67552], + [71.27944, 34.80502], + [71.30986, 34.87883], + [71.49925, 34.96374], + [71.53005, 35.07236], + [71.67488, 35.19652], + [71.5558, 35.31286], + [71.64894, 35.45247], + [71.61222, 35.57322], + [71.49947, 35.62641], + [71.54666, 35.72022], + [71.37672, 35.95611], + [71.20141, 36.03577], + [71.24544, 36.12277], + [71.44163, 36.26952], + [71.56874, 36.32949], + [71.65619, 36.47822], + [71.79577, 36.40058], + [71.83205, 36.50547], + [72.21447, 36.66422], + [72.24136, 36.75347], + [72.49522, 36.77755], + [72.65616, 36.84983], + [72.88263, 36.84108], + [73.07174, 36.88905], + [73.40313, 36.89913], + [73.52777, 36.88555], + [73.70505, 36.91272], + [73.84658, 36.89861], + [73.96319, 36.8375], + [74.12741, 36.84811], + [74.15203, 36.90986], + [74.264, 36.90444], + [74.42786, 36.99763], + [74.57155, 37.02978], + [74.69939, 37.08359], + [74.73487, 37.02177], + [74.8386, 37.05967], + [74.91636, 36.97816], + [75.13755, 37.02695], + [75.16019, 36.98817], + [75.41012, 36.94615], + [75.4213, 36.77053], + [75.46901, 36.71538], + [75.53384, 36.7717], + [75.72076, 36.75265], + [75.86642, 36.66894], + [76.03569, 36.40771], + [75.98505, 36.34132], + [76.06211, 36.22657], + [75.93241, 36.13589], + [75.95688, 36.0463], + [76.08562, 36.02279], + [76.15921, 35.91828], + [76.14508, 35.83716], + [76.35838, 35.82855], + [76.59923, 35.90082], + [76.56087, 35.8224], + [76.77718, 35.65804], + [76.85233, 35.66869], + [77.19371, 35.52151], + [77.29378, 35.5437], + [77.38145, 35.47325], + [77.50118, 35.48931], + [77.68668, 35.45426], + [77.81328, 35.52223], + [78.10784, 35.4398], + [78.02277, 35.35795], + [78.00319, 35.24335], + [78.14651, 35.07171], + [78.14375, 35.00228], + [78.23648, 34.88107], + [78.18567, 34.79838], + [78.27177, 34.70157], + [78.27289, 34.62913], + [78.43012, 34.59055], + [78.44535, 34.54263], + [78.55146, 34.57165], + [78.73831, 34.45913], + [78.92778, 34.37992], + [79.00718, 34.40677], + [79.0586, 34.30139], + [78.9803, 34.315], + [78.92553, 34.15322], + [78.87375, 34.16454], + [78.65508, 34.03227], + [78.74278, 33.99908], + [78.77718, 33.74647], + [78.71725, 33.62262], + [78.83563, 33.42515], + [79.03894, 33.30809], + [79.15241, 33.18086], + [79.21709, 33.23805], + [79.40998, 33.16847], + [79.32801, 33.0337], + [79.36604, 32.9376], + [79.47276, 32.87877], + [79.55745, 32.75775], + [79.53973, 32.67183], + [79.4134, 32.51965], + [79.27612, 32.55603], + [79.1312, 32.48158], + [79.10462, 32.37442], + [78.96924, 32.33536], + [78.78027, 32.47898], + [78.75071, 32.6886], + [78.51683, 32.61343], + [78.39271, 32.53808], + [78.47109, 32.44294], + [78.47889, 32.3242], + [78.59633, 32.1576], + [78.68299, 32.11354], + [78.77976, 31.99485], + [78.70267, 31.80782], + [78.754, 31.6772], + [78.84737, 31.60836], + [78.73248, 31.53361], + [78.79726, 31.44318], + [78.77921, 31.31173], + [78.90083, 31.29013], + [78.94435, 31.36601], + [79.01807, 31.34856], + [79.01764, 31.42521], + [79.14218, 31.43212], + [79.23573, 31.33464], + [79.31131, 31.14879], + [79.41411, 31.10685], + [79.42745, 31.02257], + [79.50709, 31.0322], + [79.55317, 30.95798], + [79.7511, 30.94679], + [79.82765, 30.85054], + [79.98485, 30.74822], + [80.04217, 30.59822], + [80.1362, 30.5576], + [80.31623, 30.56465], + [80.54276, 30.44873], + [80.60641, 30.47136], + [80.80051, 30.32314], + [81.03151, 30.24629], + [80.92628, 30.18691], + [80.67932, 29.97087], + [80.59338, 29.95041], + [80.54101, 29.84679], + [80.37141, 29.73675], + [80.4089, 29.59899], + [80.2414, 29.43999], + [80.3077, 29.31096], + [80.26002, 29.14886], + [80.14673, 29.10828], + [80.05543, 28.83671], + [80.24391, 28.75162], + [80.35278, 28.63352], + [80.50799, 28.56691], + [80.53963, 28.68529], + [80.66255, 28.63282], + [80.94205, 28.43936], + [81.1896, 28.36927], + [81.31975, 28.13012], + [81.38413, 28.17421], + [81.47801, 28.08117], + [81.91138, 27.85543], + [81.97859, 27.91832], + [82.06998, 27.91302], + [82.43111, 27.67634], + [82.69996, 27.71103], + [82.76522, 27.50211], + [82.92513, 27.49429], + [83.03963, 27.4479], + [83.18443, 27.44679], + [83.27095, 27.34576], + [83.34734, 27.34537], + [83.39473, 27.47839], + [83.60785, 27.46846], + [83.86602, 27.35294], + [83.84709, 27.44094], + [84.04018, 27.44412], + [84.09598, 27.51288], + [84.24262, 27.45483], + [84.29871, 27.38755], + [84.60925, 27.33632], + [84.68693, 27.19795], + [84.64977, 27.04212], + [84.84351, 27.0149], + [84.94833, 26.96205], + [85.04167, 26.84713], + [85.18849, 26.86517], + [85.21065, 26.76763], + [85.33496, 26.7345], + [85.63026, 26.86826], + [85.73231, 26.78577], + [85.73054, 26.66629], + [85.86929, 26.57447], + [86.02907, 26.66312], + [86.14127, 26.60236], + [86.32804, 26.58767], + [86.52681, 26.53224], + [86.72561, 26.42169], + [86.82104, 26.43673], + [87.0499, 26.5867], + [87.15194, 26.39887], + [87.23953, 26.41356], + [87.32939, 26.34772], + [87.4838, 26.43596], + [87.59256, 26.37878], + [87.69596, 26.43017], + [87.76752, 26.40776], + [87.88931, 26.47351], + [88.03085, 26.36516], + [88.09077, 26.4258], + [88.11458, 26.56936], + [88.18807, 26.77255], + [88.13407, 26.98503], + [87.99595, 27.103], + [88.07375, 27.44626], + [88.05932, 27.5391], + [88.14499, 27.66614], + [88.19931, 27.83957], + [88.11752, 27.9168], + [88.14166, 27.96506], + [88.25063, 27.9414], + [88.54642, 28.03358], + [88.63381, 28.12343], + [88.8358, 28.0165], + [88.88137, 27.89142], + [88.84922, 27.66747], + [88.77607, 27.47055], + [88.90567, 27.32894], + [89.00477, 27.32624], + [88.95551, 27.43702], + [89.06112, 27.61405], + [89.12893, 27.61522], + [89.2345, 27.80243], + [89.38956, 27.89141], + [89.46024, 28.0308], + [89.59642, 28.16377], + [89.76545, 28.18309], + [89.86839, 28.31338], + [90, 28.33293] + ] + ] + }, + "properties": { "ituzone": "41" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "42": { + "mh": [ + "MM68", + "MM69", + "MM76", + "MM77", + "MM78", + "MM79", + "MM85", + "MM86", + "MM87", + "MM88", + "MM89", + "MM90", + "MM91", + "MM92", + "MM93", + "MM94", + "MM95", + "MM96", + "MM97", + "MM98", + "MM99", + "MN60", + "MN70", + "MN80", + "MN81", + "MN90", + "MN91", + "MN94", + "NL07", + "NL08", + "NL09", + "NL17", + "NL18", + "NL19", + "NL26", + "NL27", + "NL28", + "NL29", + "NL36", + "NL37", + "NL38", + "NL39", + "NL46", + "NL47", + "NL48", + "NL49", + "NM00", + "NM01", + "NM02", + "NM03", + "NM04", + "NM05", + "NM06", + "NM07", + "NM08", + "NM09", + "NM10", + "NM11", + "NM12", + "NM13", + "NM14", + "NM15", + "NM16", + "NM17", + "NM18", + "NM19", + "NM20", + "NM21", + "NM22", + "NM23", + "NM24", + "NM25", + "NM26", + "NM27", + "NM28", + "NM29", + "NM30", + "NM31", + "NM32", + "NM33", + "NM34", + "NM35", + "NM36", + "NM37", + "NM38", + "NM39", + "NM40", + "NM41", + "NM42", + "NM43", + "NM44", + "NM45", + "NM46", + "NM47", + "NM48", + "NM49", + "NN00", + "NN01", + "NN02", + "NN03", + "NN04", + "NN05", + "NN10", + "NN11", + "NN12", + "NN13", + "NN14", + "NN15", + "NN16", + "NN17", + "NN20", + "NN21", + "NN22", + "NN23", + "NN24", + "NN25", + "NN26", + "NN27", + "NN28", + "NN30", + "NN31", + "NN32", + "NN33", + "NN34", + "NN35", + "NN36", + "NN37", + "NN38", + "NN39", + "NN40", + "NN41", + "NN42", + "NN43", + "NN44", + "NN45", + "NN46", + "NN47", + "NN48" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [90, 28.33293], + [89.86839, 28.31338], + [89.76545, 28.18309], + [89.59642, 28.16377], + [89.46024, 28.0308], + [89.38956, 27.89141], + [89.2345, 27.80243], + [89.12893, 27.61522], + [89.06112, 27.61405], + [88.95551, 27.43702], + [89.00477, 27.32624], + [88.90567, 27.32894], + [88.77607, 27.47055], + [88.84922, 27.66747], + [88.88137, 27.89142], + [88.8358, 28.0165], + [88.63381, 28.12343], + [88.54642, 28.03358], + [88.25063, 27.9414], + [88.14166, 27.96506], + [88.11752, 27.9168], + [88.19931, 27.83957], + [88.14499, 27.66614], + [88.05932, 27.5391], + [88.07375, 27.44626], + [87.99595, 27.103], + [88.13407, 26.98503], + [88.18807, 26.77255], + [88.11458, 26.56936], + [88.09077, 26.4258], + [88.03085, 26.36516], + [87.88931, 26.47351], + [87.76752, 26.40776], + [87.69596, 26.43017], + [87.59256, 26.37878], + [87.4838, 26.43596], + [87.32939, 26.34772], + [87.23953, 26.41356], + [87.15194, 26.39887], + [87.0499, 26.5867], + [86.82104, 26.43673], + [86.72561, 26.42169], + [86.52681, 26.53224], + [86.32804, 26.58767], + [86.14127, 26.60236], + [86.02907, 26.66312], + [85.86929, 26.57447], + [85.73054, 26.66629], + [85.73231, 26.78577], + [85.63026, 26.86826], + [85.33496, 26.7345], + [85.21065, 26.76763], + [85.18849, 26.86517], + [85.04167, 26.84713], + [84.94833, 26.96205], + [84.84351, 27.0149], + [84.64977, 27.04212], + [84.68693, 27.19795], + [84.60925, 27.33632], + [84.29871, 27.38755], + [84.24262, 27.45483], + [84.09598, 27.51288], + [84.04018, 27.44412], + [83.84709, 27.44094], + [83.86602, 27.35294], + [83.60785, 27.46846], + [83.39473, 27.47839], + [83.34734, 27.34537], + [83.27095, 27.34576], + [83.18443, 27.44679], + [83.03963, 27.4479], + [82.92513, 27.49429], + [82.76522, 27.50211], + [82.69996, 27.71103], + [82.43111, 27.67634], + [82.06998, 27.91302], + [81.97859, 27.91832], + [81.91138, 27.85543], + [81.47801, 28.08117], + [81.38413, 28.17421], + [81.31975, 28.13012], + [81.1896, 28.36927], + [80.94205, 28.43936], + [80.66255, 28.63282], + [80.53963, 28.68529], + [80.50799, 28.56691], + [80.35278, 28.63352], + [80.24391, 28.75162], + [80.05543, 28.83671], + [80.14673, 29.10828], + [80.26002, 29.14886], + [80.3077, 29.31096], + [80.2414, 29.43999], + [80.4089, 29.59899], + [80.37141, 29.73675], + [80.54101, 29.84679], + [80.59338, 29.95041], + [80.67932, 29.97087], + [80.92628, 30.18691], + [81.03151, 30.24629], + [80.80051, 30.32314], + [80.60641, 30.47136], + [80.54276, 30.44873], + [80.31623, 30.56465], + [80.1362, 30.5576], + [80.04217, 30.59822], + [79.98485, 30.74822], + [79.82765, 30.85054], + [79.7511, 30.94679], + [79.55317, 30.95798], + [79.50709, 31.0322], + [79.42745, 31.02257], + [79.41411, 31.10685], + [79.31131, 31.14879], + [79.23573, 31.33464], + [79.14218, 31.43212], + [79.01764, 31.42521], + [79.01807, 31.34856], + [78.94435, 31.36601], + [78.90083, 31.29013], + [78.77921, 31.31173], + [78.79726, 31.44318], + [78.73248, 31.53361], + [78.84737, 31.60836], + [78.754, 31.6772], + [78.70267, 31.80782], + [78.77976, 31.99485], + [78.68299, 32.11354], + [78.59633, 32.1576], + [78.47889, 32.3242], + [78.47109, 32.44294], + [78.39271, 32.53808], + [78.51683, 32.61343], + [78.75071, 32.6886], + [78.78027, 32.47898], + [78.96924, 32.33536], + [79.10462, 32.37442], + [79.1312, 32.48158], + [79.27612, 32.55603], + [79.4134, 32.51965], + [79.53973, 32.67183], + [79.55745, 32.75775], + [79.47276, 32.87877], + [79.36604, 32.9376], + [79.32801, 33.0337], + [79.40998, 33.16847], + [79.21709, 33.23805], + [79.15241, 33.18086], + [79.03894, 33.30809], + [78.83563, 33.42515], + [78.71725, 33.62262], + [78.77718, 33.74647], + [78.74278, 33.99908], + [78.65508, 34.03227], + [78.87375, 34.16454], + [78.92553, 34.15322], + [78.9803, 34.315], + [79.0586, 34.30139], + [79.00718, 34.40677], + [78.92778, 34.37992], + [78.73831, 34.45913], + [78.55146, 34.57165], + [78.44535, 34.54263], + [78.43012, 34.59055], + [78.27289, 34.62913], + [78.27177, 34.70157], + [78.18567, 34.79838], + [78.23648, 34.88107], + [78.14375, 35.00228], + [78.14651, 35.07171], + [78.00319, 35.24335], + [78.02277, 35.35795], + [78.10784, 35.4398], + [77.81328, 35.52223], + [77.68668, 35.45426], + [77.50118, 35.48931], + [77.38145, 35.47325], + [77.29378, 35.5437], + [77.19371, 35.52151], + [76.85233, 35.66869], + [76.77718, 35.65804], + [76.56087, 35.8224], + [76.59923, 35.90082], + [76.35838, 35.82855], + [76.14508, 35.83716], + [76.15921, 35.91828], + [76.08562, 36.02279], + [75.95688, 36.0463], + [75.93241, 36.13589], + [76.06211, 36.22657], + [75.98505, 36.34132], + [76.03569, 36.40771], + [75.86642, 36.66894], + [75.72076, 36.75265], + [75.53384, 36.7717], + [75.46901, 36.71538], + [75.4213, 36.77053], + [75.41012, 36.94615], + [75.16019, 36.98817], + [75.13755, 37.02695], + [74.91636, 36.97816], + [74.8386, 37.05967], + [74.73487, 37.02177], + [74.69939, 37.08359], + [74.57155, 37.02978], + [74.43311, 37.11574], + [74.48911, 37.24191], + [74.65992, 37.23838], + [74.74725, 37.27541], + [74.87855, 37.23569], + [74.91113, 37.27501], + [75.09685, 37.31818], + [75.15307, 37.40895], + [75.05718, 37.52458], + [74.93193, 37.56857], + [74.89606, 37.6629], + [75.00964, 37.76985], + [74.9131, 37.85468], + [74.91648, 38.02438], + [74.82052, 38.08568], + [74.80098, 38.20168], + [74.71055, 38.21287], + [74.66546, 38.38021], + [74.69529, 38.42477], + [74.50959, 38.47187], + [74.18643, 38.64091], + [74.07679, 38.60926], + [74.07844, 38.53092], + [73.92579, 38.5418], + [73.79849, 38.61575], + [73.69872, 38.85159], + [73.75555, 38.94007], + [73.85563, 38.9527], + [73.81204, 39.0423], + [73.74973, 39.02364], + [73.61293, 39.24696], + [73.53776, 39.27749], + [73.56789, 39.34705], + [73.499, 39.38047], + [73.64586, 39.47597], + [73.87443, 39.48294], + [73.94798, 39.59898], + [73.84923, 39.83594], + [74.04243, 40.10065], + [74.06928, 40.07842], + [74.25941, 40.13398], + [74.34289, 40.09123], + [74.52588, 40.20873], + [74.59237, 40.2821], + [74.66217, 40.27372], + [74.69193, 40.34917], + [74.91229, 40.34592], + [74.79974, 40.4312], + [74.83904, 40.52282], + [74.98829, 40.45182], + [75, 40.45768], + [75.23841, 40.4483], + [75.30753, 40.51059], + [75.59331, 40.66444], + [75.64705, 40.50533], + [75.7242, 40.47364], + [75.66354, 40.35545], + [75.69967, 40.27962], + [75.82561, 40.32749], + [75.92209, 40.2944], + [75.97416, 40.38101], + [76.16835, 40.36778], + [76.23226, 40.41466], + [76.33557, 40.33844], + [76.50513, 40.42729], + [76.5557, 40.55094], + [76.65478, 40.6212], + [76.64463, 40.76568], + [76.72783, 40.81824], + [76.75381, 40.95355], + [76.99301, 41.07204], + [77.27602, 41.00142], + [77.35589, 41.04064], + [77.47854, 40.99562], + [77.76487, 41.01433], + [77.80317, 41.12345], + [77.91116, 41.18549], + [78.12439, 41.22715], + [78.14533, 41.36639], + [78.3208, 41.38078], + [78.64464, 41.46903], + [78.71284, 41.55252], + [78.81606, 41.55874], + [78.91945, 41.63195], + [79.12425, 41.72214], + [79.21695, 41.7262], + [79.40946, 41.84127], + [79.5681, 41.84263], + [79.63725, 41.8935], + [79.78365, 41.901], + [79.90992, 42.04221], + [80.13919, 42.03124], + [80.22753, 42.06329], + [80.13093, 42.1682], + [80.29009, 42.26024], + [80.20679, 42.46871], + [80.25963, 42.51518], + [80.16255, 42.62514], + [80.27554, 42.83807], + [80.40571, 42.83258], + [80.60215, 42.89507], + [80.39274, 42.99647], + [80.4091, 43.05729], + [80.65754, 43.14977], + [80.78151, 43.13762], + [80.77834, 43.31193], + [80.68579, 43.33721], + [80.75277, 43.4655], + [80.52268, 43.82223], + [80.44511, 44.07467], + [80.39477, 44.11157], + [80.40587, 44.2921], + [80.34727, 44.48046], + [80.41182, 44.60881], + [80.31242, 44.70372], + [80.19149, 44.75108], + [80.16684, 44.83913], + [79.99334, 44.79416], + [79.96415, 44.8816], + [79.88196, 44.91106], + [80.13935, 45.05761], + [80.19566, 45.02717], + [80.32561, 45.06945], + [80.40276, 45.04721], + [80.51471, 45.10517], + [80.74346, 45.16015], + [80.89759, 45.12509], + [81.20496, 45.2369], + [81.45043, 45.26218], + [81.63934, 45.35635], + [81.76869, 45.37777], + [81.92203, 45.22889], + [82.09095, 45.24545], + [82.10081, 45.20245], + [82.27526, 45.24126], + [82.47384, 45.17676], + [82.58223, 45.22012], + [82.58786, 45.34449], + [82.54268, 45.42125], + [82.27888, 45.53544], + [82.25786, 45.61594], + [82.34532, 45.79625], + [82.3358, 45.9393], + [82.4562, 45.97682], + [82.51213, 46.15391], + [82.73466, 46.50824], + [82.78831, 46.69359], + [82.86463, 46.80308], + [82.93806, 47.01607], + [82.99216, 47.06328], + [83.02373, 47.21496], + [83.15074, 47.23465], + [83.24414, 47.17703], + [83.36379, 47.17763], + [83.55877, 47.06068], + [83.74731, 47.03327], + [83.91645, 46.9742], + [84.12501, 46.96764], + [84.20195, 47.00187], + [84.55452, 46.99366], + [84.75237, 47.00522], + [84.94353, 46.86219], + [85.06664, 46.9251], + [85.21109, 47.04516], + [85.55871, 47.05037], + [85.57941, 47.14193], + [85.6791, 47.21965], + [85.68275, 47.42962], + [85.60829, 47.50885], + [85.6357, 47.58644], + [85.5469, 48.01041], + [85.55376, 48.13937], + [85.7573, 48.40297], + [85.91386, 48.43603], + [86.2248, 48.43205], + [86.29904, 48.49008], + [86.40766, 48.47906], + [86.58937, 48.542], + [86.63421, 48.6264], + [86.77147, 48.72018], + [86.81691, 48.85576], + [86.72776, 48.99134], + [86.89945, 49.13513], + [87.19976, 49.14344], + [87.43565, 49.07237], + [87.49353, 49.13885], + [87.81646, 49.16982], + [87.87328, 48.94824], + [87.74231, 48.86799], + [87.93457, 48.75323], + [88.0894, 48.7116], + [87.95929, 48.59319], + [88.48568, 48.40774], + [88.60565, 48.33219], + [88.56834, 48.27411], + [88.633, 48.18215], + [88.82806, 48.09975], + [88.93213, 48.10719], + [89.05929, 47.98795], + [89.28174, 47.98636], + [89.29583, 48.0137], + [89.5491, 48.03907], + [89.65324, 47.90314], + [89.7577, 47.82922], + [89.95094, 47.83434], + [89.95556, 47.88758], + [90, 47.88026], + [90, 28.33293] + ] + ] + }, + "properties": { "ituzone": "42" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "43": { + "mh": [ + "NL57", + "NL58", + "NL59", + "NL67", + "NL68", + "NL69", + "NL78", + "NL79", + "NL83", + "NL84", + "NL85", + "NL88", + "NL89", + "NL91", + "NL92", + "NL93", + "NL94", + "NL95", + "NL96", + "NL97", + "NL98", + "NL99", + "NM50", + "NM51", + "NM52", + "NM53", + "NM54", + "NM55", + "NM56", + "NM57", + "NM58", + "NM59", + "NM60", + "NM61", + "NM62", + "NM63", + "NM64", + "NM65", + "NM66", + "NM67", + "NM68", + "NM69", + "NM70", + "NM71", + "NM72", + "NM73", + "NM74", + "NM75", + "NM76", + "NM77", + "NM78", + "NM79", + "NM80", + "NM81", + "NM82", + "NM83", + "NM84", + "NM85", + "NM86", + "NM87", + "NM88", + "NM89", + "NM90", + "NM91", + "NM92", + "NM93", + "NM94", + "NM95", + "NM96", + "NM97", + "NM98", + "NM99", + "NN50", + "NN51", + "NN52", + "NN53", + "NN54", + "NN55", + "NN56", + "NN57", + "NN60", + "NN61", + "NN62", + "NN63", + "NN64", + "NN65", + "NN70", + "NN71", + "NN72", + "NN73", + "NN74", + "NN80", + "NN81", + "NN82", + "NN83", + "NN90", + "NN91", + "NN92", + "OL01", + "OL02", + "OL03", + "OL04", + "OL05", + "OL06", + "OL07", + "OL08", + "OL09", + "OL12", + "OL13", + "OL14", + "OL15", + "OL16", + "OL17", + "OL18", + "OL19", + "OL22", + "OL23", + "OL24", + "OL25", + "OL26", + "OL27", + "OL28", + "OL29", + "OL31", + "OL32", + "OL33", + "OL34", + "OL35", + "OL36", + "OL37", + "OL38", + "OL39", + "OL40", + "OL41", + "OL42", + "OL43", + "OL44", + "OL45", + "OL46", + "OL47", + "OL48", + "OL49", + "OM00", + "OM01", + "OM02", + "OM03", + "OM04", + "OM05", + "OM06", + "OM07", + "OM08", + "OM09", + "OM10", + "OM11", + "OM12", + "OM13", + "OM14", + "OM15", + "OM16", + "OM17", + "OM18", + "OM19", + "OM20", + "OM21", + "OM22", + "OM23", + "OM24", + "OM25", + "OM26", + "OM27", + "OM28", + "OM29", + "OM30", + "OM31", + "OM32", + "OM33", + "OM34", + "OM35", + "OM36", + "OM37", + "OM38", + "OM39", + "OM40", + "OM41", + "OM42", + "OM43", + "OM44", + "OM45", + "OM46", + "OM47", + "OM48", + "OM49", + "ON00", + "ON01", + "ON02", + "ON10", + "ON11", + "ON12", + "ON20", + "ON21", + "ON30", + "ON31", + "ON32", + "ON40", + "ON41", + "ON42" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [108.33333, 20.04166], + [108.33333, 21.29166], + [108.03905, 21.54502], + [107.9518, 21.5399], + [107.85876, 21.65398], + [107.67243, 21.60611], + [107.48183, 21.59577], + [107.46702, 21.66395], + [107.3567, 21.60575], + [107.30058, 21.74297], + [107.24841, 21.70407], + [107.02515, 21.82336], + [107.05982, 21.91961], + [106.76707, 22.01302], + [106.6928, 21.96409], + [106.7045, 22.22044], + [106.65958, 22.33383], + [106.55953, 22.34917], + [106.55897, 22.46235], + [106.6098, 22.60289], + [106.72735, 22.58641], + [106.76981, 22.73066], + [106.83457, 22.80808], + [106.65289, 22.86363], + [106.60211, 22.92775], + [106.25592, 22.8794], + [106.20371, 22.98244], + [106.00262, 22.99051], + [105.99775, 22.94009], + [105.88174, 22.91891], + [105.833, 22.97924], + [105.64501, 23.08416], + [105.57032, 23.07749], + [105.55855, 23.16906], + [105.40989, 23.28279], + [105.32274, 23.39347], + [105.23315, 23.27637], + [105.07201, 23.26195], + [104.87259, 23.12115], + [104.8129, 23.11886], + [104.86305, 22.94992], + [104.73485, 22.81818], + [104.59842, 22.81615], + [104.58688, 22.85966], + [104.35351, 22.69322], + [104.25528, 22.77762], + [104.27639, 22.83822], + [104.12144, 22.80748], + [104.03951, 22.72216], + [104.01217, 22.52101], + [103.96355, 22.50438], + [103.63986, 22.79636], + [103.5305, 22.59328], + [103.32136, 22.81189], + [103.28378, 22.68313], + [103.19679, 22.65063], + [103.1843, 22.56045], + [103.03146, 22.44177], + [102.92594, 22.48655], + [102.86474, 22.61128], + [102.69, 22.70259], + [102.5696, 22.70339], + [102.4827, 22.77995], + [102.40506, 22.63981], + [102.25025, 22.46078], + [102.26986, 22.42248], + [102.04643, 22.45822], + [101.90741, 22.43637], + [101.89912, 22.38139], + [101.81055, 22.48337], + [101.68313, 22.47165], + [101.62684, 22.28028], + [101.53913, 22.25496], + [101.61662, 21.977], + [101.77801, 21.83556], + [101.74594, 21.72809], + [101.83445, 21.61416], + [101.74932, 21.58773], + [101.77952, 21.51608], + [101.7393, 21.31042], + [101.84102, 21.20721], + [101.71665, 21.14338], + [101.54752, 21.25705], + [101.28037, 21.17794], + [101.21882, 21.31915], + [101.27131, 21.36556], + [101.18058, 21.41838], + [101.22218, 21.50008], + [101.11583, 21.69163], + [101.12178, 21.77652], + [100.88534, 21.6869], + [100.72286, 21.51152], + [100.58687, 21.45314], + [100.47979, 21.45777], + [100.43197, 21.5408], + [100.23358, 21.46993], + [100.12797, 21.50805], + [100.10867, 21.60172], + [100.17485, 21.65613], + [100.12053, 21.70631], + [99.99136, 21.70587], + [99.94403, 21.82404], + [99.99973, 21.97495], + [99.96237, 22.0529], + [99.86659, 22.0282], + [99.65157, 22.10497], + [99.27183, 22.10014], + [99.16906, 22.15035], + [99.27838, 22.36349], + [99.25084, 22.38549], + [99.3809, 22.4952], + [99.38554, 22.57451], + [99.32636, 22.75335], + [99.46204, 22.84819], + [99.44054, 22.94214], + [99.56089, 22.90765], + [99.52486, 23.07398], + [99.32955, 23.13591], + [99.24895, 23.07922], + [99.04661, 23.12333], + [99.05245, 23.16333], + [98.89037, 23.21237], + [98.94512, 23.30931], + [98.92064, 23.41963], + [98.80107, 23.54041], + [98.88053, 23.59229], + [98.78988, 23.78406], + [98.69488, 23.78783], + [98.67839, 23.91284], + [98.89839, 24.10901], + [98.71339, 24.12941], + [98.59418, 24.08305], + [98.54741, 24.13038], + [98.224, 24.11633], + [97.8986, 24.01607], + [97.89188, 23.97567], + [97.6413, 23.85213], + [97.52764, 23.93167], + [97.7287, 24.11448], + [97.7683, 24.26444], + [97.65905, 24.33533], + [97.71467, 24.35706], + [97.67027, 24.45557], + [97.53006, 24.43643], + [97.56988, 24.60207], + [97.5688, 24.77007], + [97.70253, 24.84629], + [97.79845, 24.85351], + [97.73034, 24.91147], + [97.72861, 25.04748], + [97.84097, 25.27249], + [97.94432, 25.21792], + [98.06957, 25.31481], + [98.15638, 25.46007], + [98.12426, 25.50806], + [98.24233, 25.61342], + [98.31334, 25.54781], + [98.40976, 25.61148], + [98.47479, 25.78256], + [98.53303, 25.84767], + [98.64112, 25.80042], + [98.70752, 25.8605], + [98.61544, 25.97388], + [98.57331, 26.12196], + [98.66015, 26.09236], + [98.73654, 26.1886], + [98.67999, 26.25706], + [98.73367, 26.35376], + [98.76188, 26.80198], + [98.70643, 27.18073], + [98.73629, 27.3536], + [98.69829, 27.38303], + [98.70217, 27.56539], + [98.58264, 27.57352], + [98.56254, 27.64371], + [98.44358, 27.66921], + [98.43048, 27.55183], + [98.31621, 27.52283], + [98.2853, 27.65782], + [98.2332, 27.69482], + [98.20588, 27.89158], + [98.1336, 27.98679], + [98.16062, 28.10407], + [97.90822, 28.36919], + [97.79645, 28.3304], + [97.72276, 28.49681], + [97.58043, 28.54722], + [97.50041, 28.49318], + [97.51806, 28.33353], + [97.34503, 28.2141], + [97.14611, 28.35284], + [96.97652, 28.32978], + [96.89023, 28.38449], + [96.86089, 28.48492], + [96.65408, 28.60977], + [96.55138, 28.58295], + [96.49596, 28.42987], + [96.41155, 28.51711], + [96.54409, 28.68758], + [96.62079, 28.72766], + [96.37516, 29.03219], + [96.36843, 29.10952], + [96.26908, 29.09673], + [96.21353, 29.02723], + [96.18353, 29.11073], + [96.29285, 29.15647], + [96.26171, 29.24421], + [96.13749, 29.3456], + [95.96613, 29.37573], + [95.87632, 29.31443], + [95.83876, 29.35207], + [95.73755, 29.29896], + [95.70994, 29.20426], + [95.60352, 29.23463], + [95.5068, 29.19453], + [95.5093, 29.12566], + [95.31182, 29.13879], + [95.2706, 29.07301], + [95.13691, 29.0883], + [95.09681, 29.14198], + [94.84931, 29.1835], + [94.75197, 29.23021], + [94.69373, 29.3181], + [94.54105, 29.21907], + [94.27917, 29.08873], + [94.36641, 29.02601], + [94.26024, 28.93077], + [94.17876, 28.93613], + [93.89683, 28.7571], + [93.78899, 28.73619], + [93.70606, 28.66452], + [93.62336, 28.68766], + [93.42733, 28.66248], + [93.1852, 28.49461], + [93.14799, 28.36661], + [92.93193, 28.2491], + [92.91921, 28.2001], + [92.67744, 28.15103], + [92.65597, 28.08497], + [92.73611, 28.03953], + [92.64587, 27.9118], + [92.31917, 27.79783], + [92.24078, 27.88525], + [92.16385, 27.82839], + [91.99409, 27.78259], + [91.91978, 27.71735], + [91.85005, 27.7607], + [91.6453, 27.76116], + [91.55357, 27.84988], + [91.62529, 27.89181], + [91.48327, 27.9442], + [91.46563, 28.00555], + [91.26308, 28.0718], + [91.21502, 27.99204], + [90.92778, 28.04443], + [90.77996, 28.04123], + [90.69079, 28.08057], + [90.58468, 28.02185], + [90.4552, 28.04746], + [90.48442, 28.13468], + [90.61389, 28.22764], + [90.34854, 28.305], + [90, 28.33293], + [90, 47.88026], + [90.0034, 47.8797], + [90.05927, 47.8842], + [90.07134, 47.77904], + [90.13917, 47.72341], + [90.32526, 47.68408], + [90.40125, 47.5378], + [90.47133, 47.4924], + [90.48099, 47.31886], + [90.76458, 46.98801], + [90.82517, 46.99549], + [90.95582, 46.87601], + [90.9348, 46.8202], + [91.04846, 46.71712], + [91.0176, 46.57876], + [91.07074, 46.57508], + [90.97658, 46.3604], + [90.89435, 46.30682], + [91.01052, 46.12705], + [91.01966, 46.02008], + [90.84697, 45.88774], + [90.71273, 45.72864], + [90.66535, 45.48805], + [90.76526, 45.43765], + [90.8129, 45.31939], + [90.8936, 45.25211], + [90.86428, 45.19906], + [91.16346, 45.20017], + [91.24146, 45.13191], + [91.37669, 45.10986], + [91.42952, 45.15564], + [91.55877, 45.06767], + [91.80435, 45.08201], + [92.10134, 45.07552], + [92.23766, 45.01281], + [92.48596, 45.00015], + [92.77671, 45.04846], + [92.98423, 44.99905], + [93.14521, 45.01242], + [93.42759, 44.95505], + [93.50601, 44.96452], + [94.2068, 44.67189], + [94.32907, 44.5826], + [94.34928, 44.51285], + [94.47031, 44.50744], + [94.60129, 44.44883], + [94.72696, 44.33774], + [94.93022, 44.29333], + [94.99614, 44.25089], + [95.41091, 44.29536], + [95.32253, 44.02685], + [95.52391, 44.00389], + [95.62179, 43.84955], + [95.73616, 43.59621], + [95.85876, 43.40849], + [95.91407, 43.23047], + [96.3594, 42.89626], + [96.38763, 42.72362], + [96.75712, 42.75423], + [96.96796, 42.75391], + [97.1733, 42.79391], + [98.20068, 42.65342], + [98.56227, 42.63358], + [99.50065, 42.56523], + [99.97486, 42.64694], + [100.26277, 42.63729], + [100.31997, 42.68622], + [100.84198, 42.67322], + [101.55891, 42.52878], + [101.80481, 42.50359], + [102.07962, 42.22196], + [102.44564, 42.14129], + [102.70874, 42.14764], + [103.41716, 41.88043], + [103.85643, 41.79799], + [104.07733, 41.80345], + [104.52621, 41.87442], + [104.51873, 41.66192], + [104.68322, 41.64484], + [104.91912, 41.65444], + [105.00579, 41.58008], + [105.23167, 41.74591], + [105.29412, 41.74767], + [105.71839, 41.93778], + [106.10285, 42.06056], + [106.64526, 42.25072], + [106.78668, 42.28831], + [107.26025, 42.36046], + [107.2904, 42.40785], + [107.45818, 42.4582], + [107.56565, 42.41147], + [107.92939, 42.40153], + [108.24464, 42.46397], + [108.29468, 42.43942], + [108.53491, 42.44325], + [108.8396, 42.39643], + [109.01485, 42.45717], + [109.2623, 42.43597], + [109.53203, 42.46882], + [109.6796, 42.55965], + [109.89816, 42.63306], + [110, 42.63674], + [110, 20.04166], + [108.33333, 20.04166] + ] + ] + }, + "properties": { "ituzone": "43" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "44": { + "mh": [ + "OK46", + "OK47", + "OK48", + "OK49", + "OK55", + "OK56", + "OK57", + "OK58", + "OK59", + "OK65", + "OK66", + "OK67", + "OK68", + "OK69", + "OK76", + "OK77", + "OK78", + "OK79", + "OK87", + "OK88", + "OK89", + "OK99", + "OL50", + "OL51", + "OL52", + "OL53", + "OL54", + "OL55", + "OL56", + "OL57", + "OL58", + "OL59", + "OL60", + "OL61", + "OL62", + "OL63", + "OL64", + "OL65", + "OL66", + "OL67", + "OL68", + "OL69", + "OL70", + "OL71", + "OL72", + "OL73", + "OL74", + "OL75", + "OL76", + "OL77", + "OL78", + "OL79", + "OL80", + "OL81", + "OL82", + "OL83", + "OL84", + "OL85", + "OL86", + "OL87", + "OL88", + "OL89", + "OL90", + "OL91", + "OL92", + "OL93", + "OL94", + "OL95", + "OL96", + "OL97", + "OL98", + "OL99", + "OM50", + "OM51", + "OM52", + "OM53", + "OM54", + "OM55", + "OM56", + "OM57", + "OM58", + "OM59", + "OM60", + "OM61", + "OM62", + "OM63", + "OM64", + "OM65", + "OM66", + "OM67", + "OM68", + "OM69", + "OM70", + "OM71", + "OM72", + "OM73", + "OM74", + "OM75", + "OM76", + "OM77", + "OM78", + "OM79", + "OM80", + "OM81", + "OM82", + "OM83", + "OM84", + "OM85", + "OM86", + "OM87", + "OM88", + "OM89", + "OM90", + "OM91", + "OM92", + "OM93", + "OM94", + "OM95", + "OM96", + "OM97", + "OM98", + "OM99", + "ON50", + "ON51", + "ON52", + "ON53", + "ON60", + "ON61", + "ON62", + "ON63", + "ON70", + "ON71", + "ON72", + "ON73", + "ON80", + "ON81", + "ON82", + "ON83", + "ON90", + "ON91", + "ON92", + "ON93", + "PL00", + "PL01", + "PL02", + "PL03", + "PL04", + "PL05", + "PL06", + "PL07", + "PL08", + "PL09", + "PL12", + "PL13", + "PL14", + "PL15", + "PL16", + "PL17", + "PL18", + "PL19", + "PL27", + "PL28", + "PL29", + "PM00", + "PM01", + "PM02", + "PM03", + "PM04", + "PM05", + "PM06", + "PM07", + "PM08", + "PM09", + "PM10", + "PM11", + "PM12", + "PM13", + "PM14", + "PM15", + "PM16", + "PM17", + "PM18", + "PM19", + "PM20", + "PM21", + "PM22", + "PM23", + "PM24", + "PM25", + "PM26", + "PM27", + "PM28", + "PM29", + "PM31", + "PM32", + "PM33", + "PM34", + "PM35", + "PM36", + "PM37", + "PM38", + "PM39", + "PM43", + "PM44", + "PM45", + "PM46", + "PM47", + "PM48", + "PM49", + "PM55", + "PM56", + "PM57", + "PM58", + "PM59", + "PM67", + "PM68", + "PM69", + "PM79", + "PN00", + "PN01", + "PN02", + "PN03", + "PN10", + "PN11", + "PN12", + "PN13", + "PN20", + "PN21", + "PN22", + "PN23", + "PN30", + "PN31", + "PN32", + "PN33", + "PN40", + "PN41", + "PN42", + "PN43", + "PN50", + "PN51", + "PN52", + "PN53", + "PN60", + "PN61", + "PN62", + "PN70", + "PN71", + "PN72", + "PN81", + "PN82" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [121.73667, 22.00146], + [112.19409, 14.97469], + [108.33333, 18], + [108.33333, 20.04166], + [110, 20.04166], + [110, 42.63674], + [110.34172, 42.73557], + [110.62562, 42.93327], + [110.68371, 43.03869], + [110.9669, 43.2894], + [111.06268, 43.35255], + [111.3527, 43.43667], + [111.45119, 43.48994], + [111.56152, 43.48804], + [111.78584, 43.66857], + [111.94835, 43.69039], + [111.95567, 43.8214], + [111.78081, 44], + [131.24869, 44], + [131.23493, 43.98083], + [131.25773, 43.91012], + [131.20994, 43.80828], + [131.22615, 43.58614], + [131.19312, 43.5256], + [131.30937, 43.45761], + [131.21187, 43.14579], + [131.11739, 43.07175], + [131.11272, 42.91227], + [131.04022, 42.8623], + [130.82667, 42.87989], + [130.67053, 42.85482], + [130.39422, 42.72447], + [130.58362, 42.67108], + [130.62817, 42.59888], + [130.55264, 42.51861], + [130.66846, 42.36636], + [130.64937, 42.32363], + [130.77271, 42.24603], + [136.66227, 42.24603], + [131.99573, 37.18814], + [126.52906, 32.47984], + [121.73667, 22.00146] + ] + ] + }, + "properties": { "ituzone": "44" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "45": { + "mh": [ + "PL02", + "PL12", + "PL13", + "PL14", + "PL15", + "PL16", + "PL22", + "PL23", + "PL24", + "PL25", + "PL26", + "PL27", + "PL28", + "PL29", + "PL32", + "PL33", + "PL34", + "PL35", + "PL36", + "PL37", + "PL38", + "PL39", + "PL42", + "PL43", + "PL44", + "PL45", + "PL46", + "PL47", + "PL48", + "PL49", + "PL50", + "PL51", + "PL52", + "PL53", + "PL54", + "PL55", + "PL56", + "PL57", + "PL58", + "PL59", + "PL60", + "PL61", + "PL62", + "PL63", + "PL64", + "PL65", + "PL66", + "PL67", + "PL68", + "PL69", + "PL70", + "PL71", + "PL72", + "PL73", + "PL74", + "PL75", + "PL76", + "PL77", + "PL78", + "PL79", + "PL80", + "PL81", + "PL82", + "PL83", + "PL84", + "PL85", + "PL86", + "PL87", + "PL88", + "PL89", + "PL90", + "PL91", + "PL92", + "PL93", + "PL94", + "PL95", + "PL96", + "PL97", + "PL98", + "PL99", + "PM20", + "PM21", + "PM30", + "PM31", + "PM32", + "PM33", + "PM40", + "PM41", + "PM42", + "PM43", + "PM44", + "PM45", + "PM50", + "PM51", + "PM52", + "PM53", + "PM54", + "PM55", + "PM56", + "PM57", + "PM60", + "PM61", + "PM62", + "PM63", + "PM64", + "PM65", + "PM66", + "PM67", + "PM68", + "PM69", + "PM70", + "PM71", + "PM72", + "PM73", + "PM74", + "PM75", + "PM76", + "PM77", + "PM78", + "PM79", + "PM80", + "PM81", + "PM82", + "PM83", + "PM84", + "PM85", + "PM86", + "PM87", + "PM88", + "PM89", + "PM90", + "PM91", + "PM92", + "PM93", + "PM94", + "PM95", + "PM96", + "PM97", + "PM98", + "PM99", + "PN70", + "PN71", + "PN80", + "PN81", + "PN82", + "PN83", + "PN90", + "PN91", + "PN92", + "PN93", + "PN94", + "PN95", + "QL02", + "QL03", + "QL04", + "QL05", + "QL06", + "QL07", + "QL08", + "QL09", + "QL12", + "QL13", + "QL14", + "QL15", + "QL16", + "QL17", + "QL18", + "QL19", + "QL22", + "QL23", + "QL24", + "QL25", + "QL26", + "QL27", + "QL28", + "QL29", + "QL32", + "QL33", + "QL34", + "QL35", + "QL36", + "QL37", + "QL38", + "QL39", + "QL42", + "QL43", + "QL44", + "QL45", + "QL46", + "QL47", + "QL48", + "QL49", + "QM00", + "QM01", + "QM02", + "QM03", + "QM04", + "QM05", + "QM06", + "QM07", + "QM08", + "QM09", + "QM10", + "QM11", + "QM12", + "QM13", + "QM14", + "QM15", + "QM16", + "QM17", + "QM18", + "QM19", + "QM20", + "QM21", + "QM22", + "QM23", + "QM24", + "QM25", + "QM26", + "QM27", + "QM28", + "QM29", + "QM30", + "QM31", + "QM32", + "QM33", + "QM34", + "QM35", + "QM36", + "QM37", + "QM38", + "QM39", + "QM40", + "QM41", + "QM42", + "QM43", + "QM44", + "QM45", + "QM46", + "QM47", + "QM48", + "QM49", + "QN00", + "QN01", + "QN02", + "QN03", + "QN04", + "QN05", + "QN10", + "QN11", + "QN12", + "QN13", + "QN14", + "QN15", + "QN20", + "QN21", + "QN22", + "QN23", + "QN24", + "QN25", + "QN30", + "QN31", + "QN32", + "QN33", + "QN34", + "QN35", + "QN40", + "QN41", + "QN42", + "QN43", + "QN44", + "QN45" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [150, 45.21871], + [150, 22], + [140, 22], + [140, 20], + [130, 20], + [130, 22.00146], + [121.73667, 22.00146], + [126.52906, 32.47984], + [131.99573, 37.18814], + [136.66227, 42.24603], + [139.77955, 45.73822], + [146.49147, 45.73822], + [145.22612, 43.82251], + [145.54187, 43.542], + [146.16455, 43.26843], + [150, 45.21871] + ] + ] + }, + "properties": { "ituzone": "45" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "46": { + "mh": [ + "HJ49", + "HJ57", + "HJ58", + "HJ59", + "HJ60", + "HJ61", + "HJ62", + "HJ63", + "HJ64", + "HJ65", + "HJ66", + "HJ67", + "HJ68", + "HJ69", + "HJ70", + "HJ71", + "HJ72", + "HJ73", + "HJ74", + "HJ75", + "HJ76", + "HJ77", + "HJ78", + "HJ79", + "HJ80", + "HJ81", + "HJ82", + "HJ83", + "HJ84", + "HJ85", + "HJ86", + "HJ87", + "HJ88", + "HJ89", + "HJ90", + "HJ91", + "HJ92", + "HJ93", + "HJ94", + "HJ95", + "HJ96", + "HJ97", + "HJ98", + "HJ99", + "HK17", + "HK18", + "HK19", + "HK25", + "HK26", + "HK27", + "HK28", + "HK29", + "HK32", + "HK33", + "HK34", + "HK35", + "HK36", + "HK37", + "HK38", + "HK39", + "HK40", + "HK41", + "HK42", + "HK43", + "HK44", + "HK45", + "HK46", + "HK47", + "HK48", + "HK49", + "HK50", + "HK51", + "HK52", + "HK53", + "HK54", + "HK55", + "HK56", + "HK57", + "HK58", + "HK59", + "HK60", + "HK61", + "HK62", + "HK63", + "HK64", + "HK65", + "HK66", + "HK67", + "HK68", + "HK69", + "HK70", + "HK71", + "HK72", + "HK73", + "HK74", + "HK75", + "HK76", + "HK77", + "HK78", + "HK79", + "HK80", + "HK81", + "HK82", + "HK83", + "HK84", + "HK85", + "HK86", + "HK87", + "HK88", + "HK89", + "HK90", + "HK91", + "HK92", + "HK93", + "HK94", + "HK95", + "HK96", + "HK97", + "HK98", + "HK99", + "HL00", + "HL01", + "HL02", + "HL03", + "HL10", + "HL11", + "HL12", + "HL13", + "HL20", + "HL21", + "HL22", + "HL23", + "HL30", + "HL31", + "HL32", + "HL33", + "HL40", + "HL41", + "HL42", + "HL43", + "HL50", + "HL51", + "HL52", + "HL53", + "HL60", + "HL61", + "HL62", + "HL63", + "HL70", + "HL71", + "HL72", + "HL73", + "HL80", + "HL81", + "HL82", + "HL83", + "HL90", + "HL91", + "HL92", + "HL93", + "IJ00", + "IJ01", + "IJ02", + "IJ03", + "IJ04", + "IJ05", + "IJ06", + "IJ07", + "IJ08", + "IJ09", + "IJ10", + "IJ11", + "IJ12", + "IJ13", + "IJ14", + "IJ15", + "IJ16", + "IJ17", + "IJ18", + "IJ19", + "IJ20", + "IJ21", + "IJ22", + "IJ23", + "IJ24", + "IJ25", + "IJ26", + "IJ27", + "IJ28", + "IJ29", + "IJ30", + "IJ31", + "IJ32", + "IJ33", + "IJ34", + "IJ35", + "IJ36", + "IJ37", + "IJ38", + "IJ39", + "IJ40", + "IJ41", + "IJ42", + "IJ43", + "IJ44", + "IJ45", + "IJ46", + "IJ47", + "IJ48", + "IJ49", + "IJ50", + "IJ51", + "IJ52", + "IJ53", + "IJ54", + "IJ55", + "IJ56", + "IJ57", + "IJ58", + "IJ59", + "IJ60", + "IJ61", + "IJ62", + "IJ63", + "IJ64", + "IJ65", + "IJ66", + "IJ67", + "IJ68", + "IJ69", + "IJ70", + "IJ71", + "IJ72", + "IJ73", + "IJ74", + "IJ75", + "IJ76", + "IJ77", + "IJ78", + "IJ79", + "IJ80", + "IJ81", + "IJ82", + "IJ83", + "IJ84", + "IJ85", + "IJ86", + "IJ87", + "IJ88", + "IJ89", + "IJ90", + "IJ91", + "IJ92", + "IJ93", + "IJ94", + "IJ95", + "IJ96", + "IJ97", + "IJ98", + "IJ99", + "IK00", + "IK01", + "IK02", + "IK03", + "IK04", + "IK05", + "IK06", + "IK07", + "IK08", + "IK09", + "IK10", + "IK11", + "IK12", + "IK13", + "IK14", + "IK15", + "IK16", + "IK17", + "IK18", + "IK19", + "IK20", + "IK21", + "IK22", + "IK23", + "IK24", + "IK25", + "IK26", + "IK27", + "IK28", + "IK29", + "IK30", + "IK31", + "IK32", + "IK33", + "IK34", + "IK35", + "IK36", + "IK37", + "IK38", + "IK39", + "IK40", + "IK41", + "IK42", + "IK43", + "IK44", + "IK45", + "IK46", + "IK47", + "IK48", + "IK49", + "IK50", + "IK51", + "IK52", + "IK53", + "IK54", + "IK55", + "IK56", + "IK57", + "IK58", + "IK59", + "IK60", + "IK61", + "IK62", + "IK63", + "IK64", + "IK65", + "IK66", + "IK67", + "IK68", + "IK69", + "IK70", + "IK71", + "IK72", + "IK73", + "IK74", + "IK75", + "IK76", + "IK77", + "IK78", + "IK79", + "IK80", + "IK81", + "IK82", + "IK83", + "IK84", + "IK85", + "IK86", + "IK87", + "IK88", + "IK89", + "IK90", + "IK91", + "IK92", + "IK93", + "IK94", + "IK95", + "IK96", + "IK97", + "IK98", + "IK99", + "IL00", + "IL01", + "IL02", + "IL03", + "IL10", + "IL11", + "IL12", + "IL13", + "IL14", + "IL20", + "IL21", + "IL22", + "IL23", + "IL24", + "IL25", + "IL26", + "IL30", + "IL31", + "IL32", + "IL33", + "IL34", + "IL35", + "IL36", + "IL37", + "IL40", + "IL41", + "IL42", + "IL43", + "IL44", + "IL45", + "IL46", + "IL47", + "IL50", + "IL51", + "IL52", + "IL53", + "IL54", + "IL55", + "IL56", + "IL57", + "IL60", + "IL61", + "IL62", + "IL63", + "IL64", + "IL65", + "IL66", + "IL70", + "IL71", + "IL72", + "IL73", + "IL74", + "IL75", + "IL80", + "IL81", + "IL82", + "IL83", + "IL84", + "IL90", + "IL91", + "IL92", + "IL93", + "JJ00", + "JJ01", + "JJ02", + "JJ03", + "JJ04", + "JJ05", + "JJ06", + "JJ07", + "JJ08", + "JJ09", + "JJ10", + "JJ11", + "JJ12", + "JJ13", + "JJ14", + "JJ15", + "JJ16", + "JJ17", + "JJ18", + "JJ19", + "JJ20", + "JJ21", + "JJ22", + "JJ23", + "JJ24", + "JJ25", + "JJ26", + "JJ27", + "JJ28", + "JJ29", + "JJ34", + "JJ35", + "JJ36", + "JJ37", + "JJ38", + "JJ39", + "JJ44", + "JJ45", + "JJ46", + "JJ47", + "JJ48", + "JJ49", + "JJ56", + "JJ57", + "JJ58", + "JJ59", + "JJ67", + "JJ68", + "JJ69", + "JK00", + "JK01", + "JK02", + "JK03", + "JK04", + "JK05", + "JK06", + "JK07", + "JK08", + "JK09", + "JK10", + "JK11", + "JK12", + "JK13", + "JK14", + "JK15", + "JK16", + "JK17", + "JK18", + "JK19", + "JK20", + "JK21", + "JK22", + "JK23", + "JK24", + "JK25", + "JK26", + "JK27", + "JK28", + "JK29", + "JK30", + "JK31", + "JK32", + "JK33", + "JK34", + "JK35", + "JK36", + "JK37", + "JK38", + "JK39", + "JK40", + "JK41", + "JK42", + "JK43", + "JK44", + "JK45", + "JK46", + "JK47", + "JK48", + "JK49", + "JK50", + "JK51", + "JK52", + "JK53", + "JK54", + "JK55", + "JK56", + "JK57", + "JK58", + "JK59", + "JK60", + "JK61", + "JK62", + "JK63", + "JK64", + "JK65", + "JK66", + "JK67", + "JK68", + "JK69", + "JK71", + "JK72", + "JK73", + "JK75", + "JK76", + "JK77", + "JK78", + "JK79", + "JL00", + "JL01", + "JL10", + "JL30", + "JL31", + "JL40", + "JL41", + "JL42", + "JL50", + "JL51", + "JL52", + "JL53", + "JL60", + "JL61", + "JL62", + "JL63", + "JL70", + "JL71", + "JL72" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [5, 0], + [-28, 0], + [-28, 7], + [-40, 23], + [-17, 23], + [-13.45361, 27.66646], + [-8.66588, 27.66646], + [-8.66667, 27.29444], + [-4.85704, 25.0159], + [1.16658, 21.1163], + [1.19109, 20.94114], + [1.15863, 20.74085], + [1.32282, 20.7395], + [1.3574, 20.67141], + [1.59766, 20.59637], + [1.66322, 20.53259], + [1.67385, 20.40193], + [1.91653, 20.22541], + [2.04457, 20.2692], + [2.1237, 20.23697], + [2.20832, 20.31812], + [2.40564, 20.13198], + [2.39706, 20.06315], + [2.51941, 20.0939], + [2.56171, 20.03337], + [2.66449, 20.05186], + [2.73125, 19.99699], + [2.97443, 19.95002], + [3.14946, 19.85801], + [3.25689, 19.83463], + [3.23007, 19.59995], + [3.2591, 19.43548], + [3.17915, 19.3629], + [3.19798, 19.27649], + [3.11479, 19.13998], + [3.35764, 18.96814], + [5.81301, 19.44323], + [7.45937, 20.84341], + [12, 23.49999], + [13.41288, 23.21085], + [13.61797, 23.11379], + [14.1894, 22.64545], + [14.99767, 23.00427], + [15.19752, 21.99847], + [15.19994, 21.49606], + [15.28202, 21.45203], + [15.48187, 20.99663], + [15.42565, 20.79667], + [15.52296, 20.73115], + [15.62289, 20.53851], + [15.99843, 20.36163], + [15.75588, 19.94567], + [15.59181, 18.79144], + [15.53348, 16.74936], + [14.99431, 16.27434], + [14.64876, 15.99965], + [14.39523, 15.74564], + [14.00001, 15.20149], + [13.87233, 15.05209], + [13.78997, 14.87381], + [13.8106, 14.73139], + [13.67415, 14.64187], + [13.69289, 14.55899], + [13.47015, 14.46395], + [13.4712, 14.41127], + [13.63293, 13.71035], + [14.0835, 13.08413], + [14.20167, 12.53671], + [14.17645, 12.41592], + [14.21404, 12.36763], + [14.46537, 12.35682], + [14.55534, 12.23466], + [14.68177, 12.15968], + [14.62113, 12.03354], + [14.65739, 11.96], + [14.61262, 11.78299], + [14.55137, 11.71889], + [14.64334, 11.65608], + [14.61996, 11.51526], + [14.51556, 11.474], + [14.18442, 11.2381], + [13.97554, 11.31682], + [13.94049, 11.21963], + [13.7955, 11.00888], + [13.73408, 11.00349], + [13.71432, 10.85821], + [13.65068, 10.80933], + [13.56547, 10.61826], + [13.59201, 10.5247], + [13.51336, 10.43518], + [13.54207, 10.37023], + [13.50175, 10.20765], + [13.43018, 10.11783], + [13.30867, 10.10251], + [13.24913, 10.03431], + [13.23481, 9.91764], + [13.30529, 9.82803], + [13.26701, 9.78813], + [13.21074, 9.55277], + [13.02469, 9.50186], + [12.85382, 9.36812], + [12.91238, 9.35626], + [12.86786, 9.01915], + [12.82181, 8.97173], + [12.78328, 8.7473], + [12.71938, 8.76028], + [12.67883, 8.64704], + [12.59982, 8.59353], + [12.50474, 8.64222], + [12.43437, 8.6203], + [12.46223, 8.5376], + [12.24558, 8.38363], + [12.25, 8.16731], + [12.19316, 8.11354], + [12.20773, 7.9673], + [11.9996, 7.67337], + [12.01976, 7.52255], + [11.91632, 7.46432], + [11.92572, 7.38754], + [11.84447, 7.26446], + [11.88248, 7.10549], + [11.62621, 6.98399], + [11.55663, 6.85643], + [11.59583, 6.7993], + [11.51843, 6.61429], + [11.4198, 6.59721], + [11.42304, 6.53169], + [11.09371, 6.52176], + [11.09573, 6.67836], + [10.97718, 6.68584], + [10.82462, 6.82549], + [10.84203, 6.93183], + [10.60502, 7.0665], + [10.56729, 7.14355], + [10.53226, 6.92365], + [10.21638, 6.88641], + [10.15308, 7.04003], + [9.8654, 6.77597], + [9.78043, 6.79245], + [9.70773, 6.51288], + [9.5986, 6.52589], + [9.46785, 6.45191], + [9.43148, 6.31767], + [9.34453, 6.35548], + [9.26583, 6.18036], + [8.84047, 5.82311], + [8.88602, 5.80012], + [8.84277, 5.67855], + [8.919, 5.56791], + [8.8325, 5.43275], + [8.82085, 5.18122], + [8.74654, 5.10221], + [8.651, 4.91401], + [8.63454, 4.82219], + [8.54751, 4.80009], + [8.54511, 4.71346], + [8, 4], + [5, 4], + [5, 0] + ] + ] + }, + "properties": { "ituzone": "46" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "47": { + "mh": [ + "JJ20", + "JJ21", + "JJ22", + "JJ23", + "JJ24", + "JJ30", + "JJ31", + "JJ32", + "JJ33", + "JJ34", + "JJ40", + "JJ41", + "JJ42", + "JJ43", + "JJ44", + "JJ45", + "JJ46", + "JJ51", + "JJ52", + "JJ53", + "JJ54", + "JJ55", + "JJ56", + "JJ57", + "JJ62", + "JJ63", + "JJ64", + "JJ65", + "JJ66", + "JJ67", + "JJ68", + "JJ69", + "JJ71", + "JJ72", + "JJ73", + "JJ74", + "JJ75", + "JJ76", + "JJ77", + "JJ78", + "JJ79", + "JJ81", + "JJ82", + "JJ83", + "JJ84", + "JJ85", + "JJ86", + "JJ87", + "JJ88", + "JJ89", + "JJ93", + "JJ94", + "JJ95", + "JJ96", + "JJ97", + "JJ98", + "JJ99", + "JK60", + "JK61", + "JK63", + "JK64", + "JK65", + "JK70", + "JK71", + "JK72", + "JK73", + "JK74", + "JK75", + "JK76", + "JK77", + "JK78", + "JK79", + "JK80", + "JK81", + "JK82", + "JK83", + "JK84", + "JK85", + "JK86", + "JK87", + "JK88", + "JK89", + "JK90", + "JK91", + "JK92", + "JK93", + "JK94", + "JK95", + "JK96", + "JK97", + "JK98", + "JK99", + "JL70", + "JL71", + "JL72", + "JL73", + "JL80", + "JL81", + "JL82", + "JL83", + "JL90", + "JL91", + "JL92", + "KJ04", + "KJ05", + "KJ06", + "KJ07", + "KJ08", + "KJ09", + "KJ14", + "KJ15", + "KJ16", + "KJ17", + "KJ18", + "KJ19", + "KJ24", + "KJ25", + "KJ26", + "KJ27", + "KJ28", + "KJ29", + "KJ34", + "KJ35", + "KJ36", + "KJ37", + "KJ38", + "KJ39", + "KJ44", + "KJ45", + "KJ46", + "KJ47", + "KJ48", + "KJ49", + "KJ53", + "KJ54", + "KJ55", + "KJ56", + "KJ57", + "KJ58", + "KJ59", + "KK00", + "KK01", + "KK02", + "KK03", + "KK04", + "KK05", + "KK06", + "KK07", + "KK08", + "KK09", + "KK10", + "KK11", + "KK12", + "KK13", + "KK14", + "KK15", + "KK16", + "KK17", + "KK18", + "KK19", + "KK20", + "KK21", + "KK22", + "KK23", + "KK24", + "KK25", + "KK26", + "KK27", + "KK28", + "KK29", + "KK30", + "KK31", + "KK32", + "KK33", + "KK34", + "KK35", + "KK36", + "KK37", + "KK38", + "KK39", + "KK40", + "KK41", + "KK42", + "KK43", + "KK44", + "KK45", + "KK46", + "KK47", + "KK48", + "KK49", + "KK50", + "KK51", + "KK52", + "KK53", + "KK54", + "KK55", + "KK56", + "KK57", + "KK58", + "KK59", + "KL00", + "KL01", + "KL10", + "KL20", + "KL21", + "KL22", + "KL30", + "KL31", + "KL32", + "KL40", + "KL41", + "KL42", + "KL50", + "KL51", + "KL52" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [5, 0], + [5, 4], + [8, 4], + [8.54511, 4.71346], + [8.54751, 4.80009], + [8.63454, 4.82219], + [8.651, 4.91401], + [8.74654, 5.10221], + [8.82085, 5.18122], + [8.8325, 5.43275], + [8.919, 5.56791], + [8.84277, 5.67855], + [8.88602, 5.80012], + [8.84047, 5.82311], + [9.26583, 6.18036], + [9.34453, 6.35548], + [9.43148, 6.31767], + [9.46785, 6.45191], + [9.5986, 6.52589], + [9.70773, 6.51288], + [9.78043, 6.79245], + [9.8654, 6.77597], + [10.15308, 7.04003], + [10.21638, 6.88641], + [10.53226, 6.92365], + [10.56729, 7.14355], + [10.60502, 7.0665], + [10.84203, 6.93183], + [10.82462, 6.82549], + [10.97718, 6.68584], + [11.09573, 6.67836], + [11.09371, 6.52176], + [11.42304, 6.53169], + [11.4198, 6.59721], + [11.51843, 6.61429], + [11.59583, 6.7993], + [11.55663, 6.85643], + [11.62621, 6.98399], + [11.88248, 7.10549], + [11.84447, 7.26446], + [11.92572, 7.38754], + [11.91632, 7.46432], + [12.01976, 7.52255], + [11.9996, 7.67337], + [12.20773, 7.9673], + [12.19316, 8.11354], + [12.25, 8.16731], + [12.24558, 8.38363], + [12.46223, 8.5376], + [12.43437, 8.6203], + [12.50474, 8.64222], + [12.59982, 8.59353], + [12.67883, 8.64704], + [12.71938, 8.76028], + [12.78328, 8.7473], + [12.82181, 8.97173], + [12.86786, 9.01915], + [12.91238, 9.35626], + [12.85382, 9.36812], + [13.02469, 9.50186], + [13.21074, 9.55277], + [13.26701, 9.78813], + [13.30529, 9.82803], + [13.23481, 9.91764], + [13.24913, 10.03431], + [13.30867, 10.10251], + [13.43018, 10.11783], + [13.50175, 10.20765], + [13.54207, 10.37023], + [13.51336, 10.43518], + [13.59201, 10.5247], + [13.56547, 10.61826], + [13.65068, 10.80933], + [13.71432, 10.85821], + [13.73408, 11.00349], + [13.7955, 11.00888], + [13.94049, 11.21963], + [13.97554, 11.31682], + [14.18442, 11.2381], + [14.51556, 11.474], + [14.61996, 11.51526], + [14.64334, 11.65608], + [14.55137, 11.71889], + [14.61262, 11.78299], + [14.65739, 11.96], + [14.62113, 12.03354], + [14.68177, 12.15968], + [14.55534, 12.23466], + [14.46537, 12.35682], + [14.21404, 12.36763], + [14.17645, 12.41592], + [14.20167, 12.53671], + [14.0835, 13.08413], + [13.63293, 13.71035], + [13.4712, 14.41127], + [13.47015, 14.46395], + [13.69289, 14.55899], + [13.67415, 14.64187], + [13.8106, 14.73139], + [13.78997, 14.87381], + [13.87233, 15.05209], + [14.00001, 15.20149], + [14.39523, 15.74564], + [14.64876, 15.99965], + [14.99431, 16.27434], + [15.53348, 16.74936], + [15.59181, 18.79144], + [15.75588, 19.94567], + [15.99843, 20.36163], + [15.62289, 20.53851], + [15.52296, 20.73115], + [15.42565, 20.79667], + [15.48187, 20.99663], + [15.28202, 21.45203], + [15.19994, 21.49606], + [15.19752, 21.99847], + [14.99767, 23.00427], + [15.99997, 23.44918], + [20.07329, 21.51239], + [22.05295, 20.51722], + [23.99966, 19.50146], + [24.00134, 19.9996], + [25.00003, 20.00042], + [25.00004, 21.99993], + [28.0931, 22.01895], + [30.64489, 22.00045], + [31, 22], + [31, 3.70541], + [30.85054, 3.49925], + [30.85991, 3.57722], + [30.7754, 3.6823], + [30.73048, 3.62139], + [30.55824, 3.62292], + [30.58198, 3.72921], + [30.55079, 3.84098], + [30.47428, 3.83354], + [30.2882, 3.95651], + [30.2165, 3.93845], + [30.15903, 4.11422], + [30.06364, 4.12941], + [29.96592, 4.28926], + [29.80218, 4.36944], + [29.82617, 4.5565], + [29.49347, 4.69435], + [29.44805, 4.52157], + [29.34499, 4.3996], + [29.22183, 4.33886], + [29.02655, 4.49301], + [28.81204, 4.49928], + [28.72635, 4.54469], + [28.67499, 4.4395], + [28.51837, 4.37566], + [28.45564, 4.28788], + [28.35874, 4.35504], + [28.20661, 4.35132], + [28.03542, 4.47789], + [28.04259, 4.54401], + [27.89873, 4.5395], + [27.79882, 4.60753], + [27.77611, 4.78303], + [27.69843, 4.79238], + [27.64942, 4.89435], + [27.56118, 4.89346], + [27.44167, 5.01922], + [27.44238, 5.0725], + [27.10608, 5.2116], + [26.94002, 5.14431], + [26.8591, 5.04692], + [26.76337, 5.10867], + [26.48361, 5.05553], + [26.39866, 5.13975], + [26.29724, 5.15011], + [26.14108, 5.27205], + [26.06261, 5.20838], + [25.85018, 5.22373], + [25.5744, 5.37738], + [25.48089, 5.3613], + [25.33141, 5.25975], + [25.34713, 5.11997], + [25.31652, 5.03445], + [25.15061, 5.0293], + [25.06037, 4.92677], + [24.96156, 4.9904], + [24.72515, 4.89475], + [24.65808, 4.9198], + [24.61869, 5.03117], + [24.53467, 5.08701], + [24.38107, 5.11754], + [24.3037, 5.0036], + [24.14411, 4.88974], + [24.11155, 4.91686], + [23.95467, 4.81409], + [23.83075, 4.83721], + [23.77662, 4.78197], + [23.59238, 4.75546], + [23.32727, 4.60903], + [23.16958, 4.74747], + [23.10853, 4.70954], + [22.96783, 4.83858], + [22.88381, 4.79064], + [22.84641, 4.69771], + [22.78542, 4.72381], + [22.70299, 4.47505], + [22.59299, 4.47571], + [22.61407, 4.36931], + [22.54221, 4.30379], + [22.54726, 4.21362], + [22.44111, 4.12683], + [22.2403, 4.11829], + [22.09717, 4.21659], + [21.8829, 4.24394], + [21.65162, 4.31184], + [21.55362, 4.24834], + [21.35213, 4.28296], + [21.28708, 4.33998], + [21.21817, 4.29214], + [21.09658, 4.38417], + [20.84652, 4.44782], + [20.58823, 4.41032], + [20.47436, 4.5129], + [20.46349, 4.61959], + [20.34703, 4.76944], + [20.20955, 4.83081], + [20.18303, 4.89014], + [19.9086, 4.9916], + [19.8259, 5.09891], + [19.54273, 5.15451], + [19.40898, 5.12381], + [19.23855, 5.01063], + [19.20321, 4.9443], + [19.11019, 4.94363], + [19.01409, 4.76716], + [18.83011, 4.58248], + [18.76289, 4.40058], + [18.60504, 4.36929], + [18.53943, 4.31805], + [18.66077, 3.99735], + [18.58211, 3.78059], + [18.60128, 3.47328], + [18.48292, 3.65349], + [18.39175, 3.57874], + [18.27037, 3.59308], + [18.23142, 3.49058], + [18.13852, 3.56467], + [17.97813, 3.54662], + [17.93575, 3.60175], + [17.85491, 3.53626], + [17.82303, 3.62465], + [17.60713, 3.64726], + [17.46371, 3.70891], + [17.32843, 3.6101], + [16.85409, 3.51782], + [16.66472, 3.54903], + [16.58586, 3.4822], + [16.58391, 3.35917], + [16.52781, 3.27213], + [16.49353, 2.98803], + [16.50901, 2.83207], + [16.19261, 2.22073], + [16.08386, 2.19911], + [16.04788, 1.9785], + [16.10688, 1.89119], + [16.13881, 1.68969], + [16.02649, 1.65595], + [16.03311, 1.76094], + [15.88428, 1.79247], + [15.74593, 1.91318], + [15.48571, 1.98165], + [15.3443, 1.91546], + [15.24887, 2.0238], + [15.04221, 1.98103], + [14.92415, 1.99993], + [14.87094, 2.10793], + [14.83473, 2.06861], + [14.65573, 2.14152], + [14.60013, 2.20518], + [14.44773, 2.12665], + [14.41273, 2.18757], + [14.28984, 2.17164], + [13.29863, 2.16645], + [13.28792, 2.24708], + [13.13523, 2.28568], + [13.08112, 2.24915], + [12.7418, 2.2272], + [12.57071, 2.26632], + [12.00105, 2.29143], + [11.75636, 2.27361], + [11.6957, 2.31342], + [11.37686, 2.29286], + [11.33268, 2.17257], + [11.33801, 0.99862], + [9.99203, 0.99717], + [9.94848, 0.91688], + [9.7551, 1.06347], + [9.58786, 1.01923], + [9.36582, 1], + [8, 1], + [8, 0], + [5, 0] + ] + ] + }, + "properties": { "ituzone": "47" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "48": { + "mh": [ + "KI48", + "KI49", + "KI58", + "KI59", + "KI69", + "KI77", + "KI78", + "KI79", + "KI86", + "KI87", + "KI88", + "KI89", + "KI95", + "KI96", + "KI97", + "KI98", + "KI99", + "KJ40", + "KJ50", + "KJ51", + "KJ52", + "KJ53", + "KJ54", + "KJ55", + "KJ56", + "KJ57", + "KJ58", + "KJ59", + "KJ60", + "KJ61", + "KJ62", + "KJ63", + "KJ64", + "KJ65", + "KJ66", + "KJ67", + "KJ68", + "KJ69", + "KJ70", + "KJ71", + "KJ72", + "KJ73", + "KJ74", + "KJ75", + "KJ76", + "KJ77", + "KJ78", + "KJ79", + "KJ80", + "KJ81", + "KJ82", + "KJ83", + "KJ84", + "KJ85", + "KJ86", + "KJ87", + "KJ88", + "KJ89", + "KJ90", + "KJ91", + "KJ92", + "KJ93", + "KJ94", + "KJ95", + "KJ96", + "KJ97", + "KJ98", + "KJ99", + "KK50", + "KK51", + "KK52", + "KK53", + "KK54", + "KK55", + "KK56", + "KK57", + "KK58", + "KK59", + "KK60", + "KK61", + "KK62", + "KK63", + "KK64", + "KK65", + "KK66", + "KK67", + "KK68", + "KK69", + "KK70", + "KK71", + "KK72", + "KK73", + "KK74", + "KK75", + "KK76", + "KK77", + "KK78", + "KK79", + "KK80", + "KK81", + "KK82", + "KK83", + "KK84", + "KK85", + "KK86", + "KK87", + "KK88", + "KK89", + "KK90", + "KK91", + "KK92", + "KK93", + "KK94", + "KK95", + "KK96", + "KK97", + "KK98", + "KK99", + "KL50", + "KL51", + "KL60", + "KL61", + "KL70", + "KL71", + "KL72", + "KL73", + "KL80", + "KL81", + "KL82", + "KL83", + "KL90", + "KL91", + "LI05", + "LI06", + "LI07", + "LI08", + "LI09", + "LI16", + "LI17", + "LI18", + "LI19", + "LI27", + "LI28", + "LI29", + "LI38", + "LI39", + "LI49", + "LJ00", + "LJ01", + "LJ02", + "LJ03", + "LJ04", + "LJ05", + "LJ06", + "LJ07", + "LJ08", + "LJ09", + "LJ10", + "LJ11", + "LJ12", + "LJ13", + "LJ14", + "LJ15", + "LJ16", + "LJ17", + "LJ18", + "LJ19", + "LJ20", + "LJ21", + "LJ22", + "LJ23", + "LJ24", + "LJ25", + "LJ26", + "LJ27", + "LJ28", + "LJ29", + "LJ30", + "LJ31", + "LJ32", + "LJ33", + "LJ34", + "LJ35", + "LJ36", + "LJ37", + "LJ38", + "LJ39", + "LJ40", + "LJ41", + "LJ42", + "LJ43", + "LJ44", + "LJ45", + "LJ46", + "LJ47", + "LJ48", + "LJ49", + "LJ50", + "LJ51", + "LJ52", + "LJ53", + "LJ54", + "LJ55", + "LJ56", + "LJ57", + "LJ58", + "LJ59", + "LJ60", + "LJ61", + "LJ62", + "LJ63", + "LJ64", + "LJ65", + "LJ66", + "LJ67", + "LJ68", + "LJ69", + "LJ70", + "LJ71", + "LJ72", + "LJ73", + "LJ74", + "LJ75", + "LJ76", + "LJ77", + "LJ78", + "LJ79", + "LJ80", + "LJ81", + "LJ82", + "LJ83", + "LJ84", + "LJ85", + "LJ86", + "LJ87", + "LJ88", + "LJ89", + "LJ90", + "LJ91", + "LJ92", + "LJ93", + "LJ94", + "LJ95", + "LJ96", + "LJ97", + "LJ98", + "LJ99", + "LK00", + "LK01", + "LK02", + "LK03", + "LK04", + "LK05", + "LK06", + "LK07", + "LK10", + "LK11", + "LK12", + "LK13", + "LK14", + "LK20", + "LK21", + "LK30", + "LK31", + "LK32", + "LK40", + "LK41", + "LK42", + "LK50", + "LK51", + "LK52", + "LK53", + "LK60", + "LK61", + "LK62", + "LK63", + "LK70", + "LK71", + "LK72", + "LK73", + "LK74", + "LK80", + "LK81", + "LK82", + "LK83", + "LK84", + "LK90", + "LK91", + "LK92", + "LK93", + "LK94" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [36.52087, 23.83941], + [42.64797, 13.47029], + [44.32215, 11.48006], + [60, 15], + [60, 0], + [50, 0], + [39.69966, -4.74546], + [39.21428, -4.67826], + [37.7856, -3.67718], + [37.74524, -3.54528], + [37.58444, -3.44068], + [37.71202, -3.31141], + [37.6733, -3.06109], + [37.51227, -2.95293], + [35.8564, -2.02381], + [34.07969, -1.02155], + [34.01135, -0.99957], + [30.79909, -0.99937], + [30.64947, -1.06688], + [30.49167, -1.06143], + [30.4485, -1.04832], + [30.35429, -1.06574], + [30.34543, -1.12638], + [30.16527, -1.34687], + [29.91511, -1.48268], + [29.88148, -1.35883], + [29.73324, -1.33573], + [29.59115, -1.38568], + [29.57815, -1.19344], + [29.59941, -0.98707], + [29.63572, -0.90071], + [29.62626, -0.70805], + [29.68211, -0.56737], + [29.65282, -0.45965], + [29.74454, -0.02974], + [29.71715, 0.06865], + [29.82435, 0.16704], + [29.87365, 0.38518], + [29.97789, 0.50582], + [29.95418, 0.64424], + [29.97783, 0.82916], + [30.14259, 0.88511], + [30.22635, 0.9904], + [30.2387, 1.13415], + [30.36212, 1.1994], + [30.48038, 1.21567], + [30.71646, 1.50123], + [31.03205, 1.75111], + [31.23005, 1.99715], + [31.31592, 2.14783], + [31.12903, 2.26347], + [30.98917, 2.40862], + [30.93877, 2.33026], + [30.83502, 2.42127], + [30.75156, 2.41602], + [30.75215, 2.58254], + [30.89151, 2.86188], + [30.78199, 3.01754], + [30.84064, 3.26397], + [30.93826, 3.40604], + [30.94276, 3.50754], + [30.85054, 3.49925], + [31, 3.70541], + [31, 22], + [33.16646, 21.99978], + [33.55737, 21.72439], + [34.00321, 21.77032], + [34.14935, 22.20393], + [34.68756, 22.29472], + [34.94687, 22.85971], + [35.2079, 22.7861], + [35.62166, 23.14851], + [36.52087, 23.83941] + ] + ] + }, + "properties": { "ituzone": "48" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "49": { + "mh": [ + "NJ56", + "NJ57", + "NJ58", + "NJ59", + "NJ66", + "NJ67", + "NJ68", + "NJ69", + "NJ76", + "NJ77", + "NJ78", + "NJ79", + "NJ86", + "NJ87", + "NJ88", + "NJ89", + "NJ96", + "NJ97", + "NJ98", + "NJ99", + "NK50", + "NK51", + "NK52", + "NK53", + "NK54", + "NK55", + "NK56", + "NK57", + "NK58", + "NK59", + "NK60", + "NK61", + "NK62", + "NK63", + "NK64", + "NK65", + "NK66", + "NK67", + "NK68", + "NK69", + "NK70", + "NK71", + "NK72", + "NK73", + "NK74", + "NK75", + "NK76", + "NK77", + "NK78", + "NK79", + "NK80", + "NK81", + "NK82", + "NK83", + "NK84", + "NK85", + "NK86", + "NK87", + "NK88", + "NK89", + "NK90", + "NK91", + "NK92", + "NK93", + "NK94", + "NK95", + "NK96", + "NK97", + "NK98", + "NK99", + "NL50", + "NL60", + "NL61", + "NL62", + "NL63", + "NL64", + "NL70", + "NL71", + "NL72", + "NL73", + "NL74", + "NL75", + "NL76", + "NL77", + "NL80", + "NL81", + "NL82", + "NL83", + "NL84", + "NL85", + "NL86", + "NL87", + "NL88", + "NL90", + "NL91", + "NL92", + "NL93", + "NL94", + "NL95", + "NL96", + "NL97", + "NL98", + "OJ05", + "OJ06", + "OJ07", + "OJ08", + "OJ09", + "OJ16", + "OJ17", + "OJ18", + "OJ19", + "OJ26", + "OJ27", + "OJ28", + "OJ29", + "OJ36", + "OJ37", + "OJ38", + "OJ39", + "OJ46", + "OJ47", + "OJ48", + "OJ49", + "OK00", + "OK01", + "OK02", + "OK03", + "OK04", + "OK05", + "OK06", + "OK07", + "OK08", + "OK09", + "OK10", + "OK11", + "OK12", + "OK13", + "OK14", + "OK15", + "OK16", + "OK17", + "OK18", + "OK19", + "OK20", + "OK21", + "OK22", + "OK23", + "OK24", + "OK25", + "OK26", + "OK27", + "OK28", + "OK29", + "OK30", + "OK31", + "OK32", + "OK33", + "OK34", + "OK35", + "OK36", + "OK37", + "OK38", + "OK39", + "OK40", + "OK41", + "OK42", + "OK43", + "OK44", + "OK45", + "OK46", + "OK47", + "OK48", + "OK49", + "OK50", + "OK51", + "OK52", + "OK53", + "OK54", + "OK55", + "OK56", + "OL00", + "OL01", + "OL02", + "OL10", + "OL11", + "OL12", + "OL20", + "OL21", + "OL22", + "OL23", + "OL30", + "OL31", + "OL32", + "OL40", + "OL41" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [97.34503, 28.2141], + [97.51806, 28.33353], + [97.50041, 28.49318], + [97.58043, 28.54722], + [97.72276, 28.49681], + [97.79645, 28.3304], + [97.90822, 28.36919], + [98.16062, 28.10407], + [98.1336, 27.98679], + [98.20588, 27.89158], + [98.2332, 27.69482], + [98.2853, 27.65782], + [98.31621, 27.52283], + [98.43048, 27.55183], + [98.44358, 27.66921], + [98.56254, 27.64371], + [98.58264, 27.57352], + [98.70217, 27.56539], + [98.69829, 27.38303], + [98.73629, 27.3536], + [98.70643, 27.18073], + [98.76188, 26.80198], + [98.73367, 26.35376], + [98.67999, 26.25706], + [98.73654, 26.1886], + [98.66015, 26.09236], + [98.57331, 26.12196], + [98.61544, 25.97388], + [98.70752, 25.8605], + [98.64112, 25.80042], + [98.53303, 25.84767], + [98.47479, 25.78256], + [98.40976, 25.61148], + [98.31334, 25.54781], + [98.24233, 25.61342], + [98.12426, 25.50806], + [98.15638, 25.46007], + [98.06957, 25.31481], + [97.94432, 25.21792], + [97.84097, 25.27249], + [97.72861, 25.04748], + [97.73034, 24.91147], + [97.79845, 24.85351], + [97.70253, 24.84629], + [97.5688, 24.77007], + [97.56988, 24.60207], + [97.53006, 24.43643], + [97.67027, 24.45557], + [97.71467, 24.35706], + [97.65905, 24.33533], + [97.7683, 24.26444], + [97.7287, 24.11448], + [97.52764, 23.93167], + [97.6413, 23.85213], + [97.89188, 23.97567], + [97.8986, 24.01607], + [98.224, 24.11633], + [98.54741, 24.13038], + [98.59418, 24.08305], + [98.71339, 24.12941], + [98.89839, 24.10901], + [98.67839, 23.91284], + [98.69488, 23.78783], + [98.78988, 23.78406], + [98.88053, 23.59229], + [98.80107, 23.54041], + [98.92064, 23.41963], + [98.94512, 23.30931], + [98.89037, 23.21237], + [99.05245, 23.16333], + [99.04661, 23.12333], + [99.24895, 23.07922], + [99.32955, 23.13591], + [99.52486, 23.07398], + [99.56089, 22.90765], + [99.44054, 22.94214], + [99.46204, 22.84819], + [99.32636, 22.75335], + [99.38554, 22.57451], + [99.3809, 22.4952], + [99.25084, 22.38549], + [99.27838, 22.36349], + [99.16906, 22.15035], + [99.27183, 22.10014], + [99.65157, 22.10497], + [99.86659, 22.0282], + [99.96237, 22.0529], + [99.99973, 21.97495], + [99.94403, 21.82404], + [99.99136, 21.70587], + [100.12053, 21.70631], + [100.17485, 21.65613], + [100.10867, 21.60172], + [100.12797, 21.50805], + [100.23358, 21.46993], + [100.43197, 21.5408], + [100.47979, 21.45777], + [100.58687, 21.45314], + [100.72286, 21.51152], + [100.88534, 21.6869], + [101.12178, 21.77652], + [101.11583, 21.69163], + [101.22218, 21.50008], + [101.18058, 21.41838], + [101.27131, 21.36556], + [101.21882, 21.31915], + [101.28037, 21.17794], + [101.54752, 21.25705], + [101.71665, 21.14338], + [101.84102, 21.20721], + [101.7393, 21.31042], + [101.77952, 21.51608], + [101.74932, 21.58773], + [101.83445, 21.61416], + [101.74594, 21.72809], + [101.77801, 21.83556], + [101.61662, 21.977], + [101.53913, 22.25496], + [101.62684, 22.28028], + [101.68313, 22.47165], + [101.81055, 22.48337], + [101.89912, 22.38139], + [101.90741, 22.43637], + [102.04643, 22.45822], + [102.26986, 22.42248], + [102.25025, 22.46078], + [102.40506, 22.63981], + [102.4827, 22.77995], + [102.5696, 22.70339], + [102.69, 22.70259], + [102.86474, 22.61128], + [102.92594, 22.48655], + [103.03146, 22.44177], + [103.1843, 22.56045], + [103.19679, 22.65063], + [103.28378, 22.68313], + [103.32136, 22.81189], + [103.5305, 22.59328], + [103.63986, 22.79636], + [103.96355, 22.50438], + [104.01217, 22.52101], + [104.03951, 22.72216], + [104.12144, 22.80748], + [104.27639, 22.83822], + [104.25528, 22.77762], + [104.35351, 22.69322], + [104.58688, 22.85966], + [104.59842, 22.81615], + [104.73485, 22.81818], + [104.86305, 22.94992], + [104.8129, 23.11886], + [104.87259, 23.12115], + [105.07201, 23.26195], + [105.23315, 23.27637], + [105.32274, 23.39347], + [105.40989, 23.28279], + [105.55855, 23.16906], + [105.57032, 23.07749], + [105.64501, 23.08416], + [105.833, 22.97924], + [105.88174, 22.91891], + [105.99775, 22.94009], + [106.00262, 22.99051], + [106.20371, 22.98244], + [106.25592, 22.8794], + [106.60211, 22.92775], + [106.65289, 22.86363], + [106.83457, 22.80808], + [106.76981, 22.73066], + [106.72735, 22.58641], + [106.6098, 22.60289], + [106.55897, 22.46235], + [106.55953, 22.34917], + [106.65958, 22.33383], + [106.7045, 22.22044], + [106.6928, 21.96409], + [106.76707, 22.01302], + [107.05982, 21.91961], + [107.02515, 21.82336], + [107.24841, 21.70407], + [107.30058, 21.74297], + [107.3567, 21.60575], + [107.46702, 21.66395], + [107.48183, 21.59577], + [107.67243, 21.60611], + [107.85876, 21.65398], + [107.9518, 21.5399], + [108.03905, 21.54502], + [108.33333, 21.29166], + [108.33333, 18], + [112.19409, 14.97469], + [108.53354, 6.87119], + [102.13866, 6.2691], + [102.09315, 6.14486], + [101.94205, 5.98017], + [101.94171, 5.86907], + [101.8372, 5.78818], + [101.70393, 5.75192], + [101.65557, 5.87619], + [101.58195, 5.93332], + [101.48498, 5.8682], + [101.39392, 5.87251], + [101.26769, 5.80759], + [101.26247, 5.71798], + [101.13555, 5.61309], + [101.09913, 5.70234], + [100.98436, 5.80612], + [101.02686, 5.91218], + [101.08447, 5.90623], + [101.1298, 6.10582], + [101.05784, 6.14109], + [101.12403, 6.19252], + [101.09906, 6.26131], + [100.87133, 6.26333], + [100.81345, 6.44209], + [100.73069, 6.49673], + [100.65238, 6.44187], + [100.30227, 6.60863], + [100.29335, 6.7109], + [100.17113, 6.69311], + [100.15948, 6.48345], + [100.11966, 6.42331], + [99.86587, 6.52268], + [99.58333, 6.45833], + [90, 6.45833], + [90, 20], + [92.37132, 20.7013], + [92.27287, 20.94424], + [92.26459, 21.05988], + [92.17233, 21.18051], + [92.21947, 21.23333], + [92.1985, 21.32738], + [92.38241, 21.47931], + [92.43897, 21.36515], + [92.55685, 21.38491], + [92.59623, 21.24513], + [92.68006, 21.28636], + [92.62992, 21.44864], + [92.60343, 21.65299], + [92.60307, 21.98259], + [92.68516, 22.03953], + [92.72477, 22.15808], + [92.85722, 22.05885], + [92.89126, 21.96315], + [93.05238, 22.11966], + [93.04426, 22.20215], + [93.14106, 22.18346], + [93.19138, 22.24792], + [93.18101, 22.44044], + [93.11739, 22.53433], + [93.0915, 22.71547], + [93.11954, 22.87613], + [93.16158, 22.91927], + [93.13779, 23.0483], + [93.29352, 23.00908], + [93.38474, 23.13471], + [93.36607, 23.34973], + [93.43323, 23.67887], + [93.38357, 23.92332], + [93.3274, 23.98252], + [93.3794, 24.0903], + [93.47606, 23.96671], + [93.62193, 24.01636], + [93.75879, 24.00677], + [93.82824, 23.93552], + [93.92175, 23.95706], + [94.12906, 23.84357], + [94.21633, 23.9999], + [94.25025, 24.14593], + [94.38913, 24.47937], + [94.57582, 24.70925], + [94.73361, 25.02157], + [94.72892, 25.13524], + [94.59916, 25.17847], + [94.58202, 25.2891], + [94.68907, 25.46893], + [94.78962, 25.49666], + [95.03908, 25.76856], + [95.02271, 25.93076], + [95.17938, 26.06485], + [95.11793, 26.10165], + [95.06534, 26.32876], + [95.06746, 26.48287], + [95.14143, 26.61342], + [95.45027, 26.71614], + [95.503, 26.81016], + [95.60471, 26.81909], + [95.71194, 26.88849], + [95.80781, 27.0046], + [95.90616, 27.02648], + [96.01271, 27.17135], + [96.19285, 27.2707], + [96.42714, 27.30603], + [96.51675, 27.29271], + [96.6177, 27.36806], + [96.82395, 27.3197], + [96.89809, 27.17196], + [97.06687, 27.09195], + [97.14618, 27.09589], + [97.03598, 27.2979], + [96.90589, 27.45019], + [96.88923, 27.61766], + [97.01587, 27.74212], + [97.07833, 27.74638], + [97.24859, 27.90726], + [97.36465, 27.8927], + [97.39578, 28.01223], + [97.30976, 28.141], + [97.34503, 28.2141] + ] + ] + }, + "properties": { "ituzone": "49" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "50": { + "mh": [ + "OJ46", + "OJ47", + "OJ48", + "OJ49", + "OJ56", + "OJ57", + "OJ58", + "OJ59", + "OJ66", + "OJ67", + "OJ68", + "OJ69", + "OJ75", + "OJ76", + "OJ77", + "OJ78", + "OJ79", + "OJ86", + "OJ87", + "OJ88", + "OJ89", + "OJ94", + "OJ95", + "OJ96", + "OJ97", + "OJ98", + "OJ99", + "OK50", + "OK51", + "OK52", + "OK53", + "OK54", + "OK60", + "OK61", + "OK62", + "OK63", + "OK64", + "OK65", + "OK66", + "OK70", + "OK71", + "OK72", + "OK73", + "OK74", + "OK75", + "OK76", + "OK77", + "OK80", + "OK81", + "OK82", + "OK83", + "OK84", + "OK85", + "OK86", + "OK87", + "OK88", + "OK89", + "OK90", + "OK91", + "OK92", + "OK93", + "OK94", + "OK95", + "OK96", + "OK97", + "OK98", + "OK99", + "OL90", + "PJ04", + "PJ05", + "PJ06", + "PJ07", + "PJ08", + "PJ09", + "PJ14", + "PJ15", + "PJ16", + "PJ17", + "PJ18", + "PJ19", + "PJ25", + "PJ26", + "PJ27", + "PJ28", + "PJ29", + "PJ34", + "PJ35", + "PJ36", + "PJ37", + "PJ38", + "PJ39", + "PJ42", + "PJ43", + "PJ44", + "PJ45", + "PJ46", + "PJ47", + "PJ48", + "PJ49", + "PK00", + "PK01", + "PK02", + "PK03", + "PK04", + "PK05", + "PK06", + "PK07", + "PK08", + "PK09", + "PK10", + "PK11", + "PK12", + "PK13", + "PK14", + "PK15", + "PK16", + "PK17", + "PK18", + "PK19", + "PK20", + "PK21", + "PK22", + "PK23", + "PK24", + "PK25", + "PK26", + "PK27", + "PK28", + "PK29", + "PK30", + "PK31", + "PK32", + "PK33", + "PK34", + "PK35", + "PK36", + "PK37", + "PK38", + "PK39", + "PK40", + "PK41", + "PK42", + "PK43", + "PK44", + "PK45", + "PK46", + "PK47", + "PK48", + "PK49", + "PL00", + "PL01", + "PL10", + "PL11", + "PL20", + "PL21", + "PL30", + "PL31", + "PL40", + "PL41" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [112.19409, 14.97469], + [121.73667, 22.00146], + [130, 22.00146], + [130, 2.5], + [127.00219, 5.5], + [119.1477, 4.19658], + [118.98877, 4.79656], + [119.45312, 5.3708], + [118.13962, 6.04534], + [117.93055, 6.61753], + [117.35361, 7.39417], + [116.78216, 7.66089], + [114.75624, 5.79238], + [108.53354, 6.87119], + [112.19409, 14.97469] + ] + ] + }, + "properties": { "ituzone": "50" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "51": { + "mh": [ + "PI50", + "PI51", + "PI52", + "PI53", + "PI54", + "PI55", + "PI56", + "PI57", + "PI58", + "PI59", + "PI60", + "PI61", + "PI62", + "PI63", + "PI64", + "PI65", + "PI66", + "PI67", + "PI68", + "PI69", + "PI70", + "PI71", + "PI72", + "PI73", + "PI74", + "PI75", + "PI76", + "PI77", + "PI78", + "PI79", + "PI80", + "PI81", + "PI82", + "PI83", + "PI84", + "PI85", + "PI86", + "PI87", + "PI88", + "PI89", + "PI90", + "PI91", + "PI92", + "PI93", + "PI94", + "PI95", + "PI96", + "PI97", + "PI98", + "PI99", + "PJ50", + "PJ51", + "PJ52", + "PJ60", + "PJ61", + "PJ70", + "PJ71", + "PJ80", + "PJ90", + "QH28", + "QH29", + "QH37", + "QH38", + "QH39", + "QH47", + "QH48", + "QH49", + "QH57", + "QH58", + "QH59", + "QH67", + "QH68", + "QH69", + "QH77", + "QH78", + "QH79", + "QH87", + "QH88", + "QH89", + "QH97", + "QH98", + "QH99", + "QI00", + "QI01", + "QI02", + "QI03", + "QI04", + "QI05", + "QI06", + "QI07", + "QI08", + "QI09", + "QI10", + "QI11", + "QI12", + "QI13", + "QI14", + "QI15", + "QI16", + "QI17", + "QI18", + "QI19", + "QI20", + "QI21", + "QI22", + "QI23", + "QI24", + "QI25", + "QI26", + "QI27", + "QI28", + "QI29", + "QI30", + "QI31", + "QI32", + "QI33", + "QI34", + "QI35", + "QI36", + "QI37", + "QI38", + "QI39", + "QI40", + "QI41", + "QI42", + "QI43", + "QI44", + "QI45", + "QI46", + "QI47", + "QI48", + "QI49", + "QI50", + "QI51", + "QI52", + "QI53", + "QI54", + "QI55", + "QI56", + "QI57", + "QI58", + "QI59", + "QI60", + "QI61", + "QI62", + "QI63", + "QI64", + "QI65", + "QI66", + "QI67", + "QI68", + "QI69", + "QI70", + "QI71", + "QI72", + "QI73", + "QI74", + "QI75", + "QI76", + "QI77", + "QI78", + "QI79", + "QI80", + "QI81", + "QI82", + "QI83", + "QI84", + "QI85", + "QI86", + "QI87", + "QI88", + "QI89", + "QI90", + "QI91", + "QI92", + "QI93", + "QI94", + "QI95", + "QI96", + "QI97", + "QI98", + "QI99", + "RH07", + "RH08", + "RH09", + "RH17", + "RH18", + "RH19", + "RH27", + "RH28", + "RH29", + "RH37", + "RH38", + "RH39", + "RH47", + "RH48", + "RH49", + "RH57", + "RH58", + "RH59", + "RH68", + "RI00", + "RI01", + "RI02", + "RI03", + "RI04", + "RI05", + "RI06", + "RI07", + "RI08", + "RI09", + "RI10", + "RI11", + "RI12", + "RI13", + "RI14", + "RI15", + "RI16", + "RI17", + "RI18", + "RI19", + "RI20", + "RI21", + "RI22", + "RI23", + "RI24", + "RI25", + "RI26", + "RI27", + "RI30", + "RI31", + "RI32", + "RI33", + "RI34", + "RI35", + "RI40", + "RI41", + "RI42", + "RI43", + "RI50", + "RI51" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [130, 2.5], + [140, 0], + [162, 0], + [173, -12], + [158.60986, -12.11939], + [144.88891, -12.00696], + [144.32409, -9.26347], + [142.62997, -9.35315], + [142.17979, -9.18656], + [142.06744, -9.24768], + [130, -10], + [130, 2.5] + ] + ] + }, + "properties": { "ituzone": "51" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "52": { + "mh": [ + "JH23", + "JH24", + "JH25", + "JH26", + "JH27", + "JH28", + "JH29", + "JH33", + "JH34", + "JH35", + "JH36", + "JH37", + "JH38", + "JH39", + "JH43", + "JH44", + "JH45", + "JH46", + "JH47", + "JH48", + "JH49", + "JH52", + "JH53", + "JH54", + "JH55", + "JH56", + "JH57", + "JH58", + "JH59", + "JH62", + "JH63", + "JH64", + "JH65", + "JH66", + "JH67", + "JH68", + "JH69", + "JH72", + "JH73", + "JH74", + "JH75", + "JH76", + "JH77", + "JH78", + "JH79", + "JH82", + "JH83", + "JH84", + "JH85", + "JH86", + "JH87", + "JH88", + "JH89", + "JH92", + "JH93", + "JH94", + "JH95", + "JH96", + "JH97", + "JH98", + "JH99", + "JI20", + "JI21", + "JI22", + "JI23", + "JI24", + "JI25", + "JI26", + "JI27", + "JI28", + "JI29", + "JI30", + "JI31", + "JI32", + "JI33", + "JI34", + "JI35", + "JI36", + "JI37", + "JI38", + "JI39", + "JI40", + "JI41", + "JI42", + "JI43", + "JI44", + "JI45", + "JI46", + "JI47", + "JI48", + "JI49", + "JI50", + "JI51", + "JI52", + "JI53", + "JI54", + "JI55", + "JI56", + "JI57", + "JI58", + "JI59", + "JI60", + "JI61", + "JI62", + "JI63", + "JI64", + "JI65", + "JI66", + "JI67", + "JI68", + "JI69", + "JI70", + "JI71", + "JI72", + "JI73", + "JI74", + "JI75", + "JI76", + "JI77", + "JI78", + "JI79", + "JI80", + "JI81", + "JI82", + "JI83", + "JI84", + "JI85", + "JI86", + "JI87", + "JI88", + "JI89", + "JI90", + "JI91", + "JI92", + "JI93", + "JI94", + "JI95", + "JI96", + "JI97", + "JI98", + "JI99", + "JJ40", + "JJ41", + "JJ50", + "JJ51", + "JJ52", + "JJ60", + "JJ61", + "JJ62", + "JJ70", + "JJ71", + "JJ72", + "JJ80", + "JJ81", + "JJ82", + "JJ83", + "JJ90", + "JJ91", + "JJ92", + "JJ93", + "JJ94", + "JJ95", + "KH02", + "KH03", + "KH04", + "KH05", + "KH06", + "KH07", + "KH08", + "KH09", + "KH12", + "KH13", + "KH14", + "KH15", + "KH16", + "KH17", + "KH18", + "KH19", + "KH27", + "KH28", + "KH29", + "KH37", + "KH38", + "KH39", + "KH46", + "KH47", + "KH48", + "KH49", + "KI00", + "KI01", + "KI02", + "KI03", + "KI04", + "KI05", + "KI06", + "KI07", + "KI08", + "KI09", + "KI10", + "KI11", + "KI12", + "KI13", + "KI14", + "KI15", + "KI16", + "KI17", + "KI18", + "KI19", + "KI20", + "KI21", + "KI22", + "KI23", + "KI24", + "KI25", + "KI26", + "KI27", + "KI28", + "KI29", + "KI30", + "KI31", + "KI32", + "KI33", + "KI34", + "KI35", + "KI36", + "KI37", + "KI38", + "KI39", + "KI40", + "KI41", + "KI42", + "KI43", + "KI44", + "KI45", + "KI46", + "KI47", + "KI48", + "KI49", + "KI51", + "KI52", + "KI53", + "KI55", + "KI56", + "KI57", + "KI58", + "KJ00", + "KJ01", + "KJ02", + "KJ03", + "KJ04", + "KJ10", + "KJ11", + "KJ12", + "KJ13", + "KJ14", + "KJ20", + "KJ21", + "KJ22", + "KJ23", + "KJ24", + "KJ25", + "KJ30", + "KJ31", + "KJ32", + "KJ33", + "KJ34", + "KJ35", + "KJ40", + "KJ41", + "KJ42", + "KJ43", + "KJ44", + "KJ50", + "KJ51", + "KJ52", + "KJ53", + "KJ54" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [5, 0], + [8, 0], + [8, 1], + [9.36582, 1], + [9.58786, 1.01923], + [9.7551, 1.06347], + [9.94848, 0.91688], + [9.99203, 0.99717], + [11.33801, 0.99862], + [11.33268, 2.17257], + [11.37686, 2.29286], + [11.6957, 2.31342], + [11.75636, 2.27361], + [12.00105, 2.29143], + [12.57071, 2.26632], + [12.7418, 2.2272], + [13.08112, 2.24915], + [13.13523, 2.28568], + [13.28792, 2.24708], + [13.29863, 2.16645], + [14.28984, 2.17164], + [14.41273, 2.18757], + [14.44773, 2.12665], + [14.60013, 2.20518], + [14.65573, 2.14152], + [14.83473, 2.06861], + [14.87094, 2.10793], + [14.92415, 1.99993], + [15.04221, 1.98103], + [15.24887, 2.0238], + [15.3443, 1.91546], + [15.48571, 1.98165], + [15.74593, 1.91318], + [15.88428, 1.79247], + [16.03311, 1.76094], + [16.02649, 1.65595], + [16.13881, 1.68969], + [16.10688, 1.89119], + [16.04788, 1.9785], + [16.08386, 2.19911], + [16.19261, 2.22073], + [16.50901, 2.83207], + [16.49353, 2.98803], + [16.52781, 3.27213], + [16.58391, 3.35917], + [16.58586, 3.4822], + [16.66472, 3.54903], + [16.85409, 3.51782], + [17.32843, 3.6101], + [17.46371, 3.70891], + [17.60713, 3.64726], + [17.82303, 3.62465], + [17.85491, 3.53626], + [17.93575, 3.60175], + [17.97813, 3.54662], + [18.13852, 3.56467], + [18.23142, 3.49058], + [18.27037, 3.59308], + [18.39175, 3.57874], + [18.48292, 3.65349], + [18.60128, 3.47328], + [18.58211, 3.78059], + [18.66077, 3.99735], + [18.53943, 4.31805], + [18.60504, 4.36929], + [18.76289, 4.40058], + [18.83011, 4.58248], + [19.01409, 4.76716], + [19.11019, 4.94363], + [19.20321, 4.9443], + [19.23855, 5.01063], + [19.40898, 5.12381], + [19.54273, 5.15451], + [19.8259, 5.09891], + [19.9086, 4.9916], + [20.18303, 4.89014], + [20.20955, 4.83081], + [20.34703, 4.76944], + [20.46349, 4.61959], + [20.47436, 4.5129], + [20.58823, 4.41032], + [20.84652, 4.44782], + [21.09658, 4.38417], + [21.21817, 4.29214], + [21.28708, 4.33998], + [21.35213, 4.28296], + [21.55362, 4.24834], + [21.65162, 4.31184], + [21.8829, 4.24394], + [22.09717, 4.21659], + [22.2403, 4.11829], + [22.44111, 4.12683], + [22.54726, 4.21362], + [22.54221, 4.30379], + [22.61407, 4.36931], + [22.59299, 4.47571], + [22.70299, 4.47505], + [22.78542, 4.72381], + [22.84641, 4.69771], + [22.88381, 4.79064], + [22.96783, 4.83858], + [23.10853, 4.70954], + [23.16958, 4.74747], + [23.32727, 4.60903], + [23.59238, 4.75546], + [23.77662, 4.78197], + [23.83075, 4.83721], + [23.95467, 4.81409], + [24.11155, 4.91686], + [24.14411, 4.88974], + [24.3037, 5.0036], + [24.38107, 5.11754], + [24.53467, 5.08701], + [24.61869, 5.03117], + [24.65808, 4.9198], + [24.72515, 4.89475], + [24.96156, 4.9904], + [25.06037, 4.92677], + [25.15061, 5.0293], + [25.31652, 5.03445], + [25.34713, 5.11997], + [25.33141, 5.25975], + [25.48089, 5.3613], + [25.5744, 5.37738], + [25.85018, 5.22373], + [26.06261, 5.20838], + [26.14108, 5.27205], + [26.29724, 5.15011], + [26.39866, 5.13975], + [26.48361, 5.05553], + [26.76337, 5.10867], + [26.8591, 5.04692], + [26.94002, 5.14431], + [27.10608, 5.2116], + [27.44238, 5.0725], + [27.44167, 5.01922], + [27.56118, 4.89346], + [27.64942, 4.89435], + [27.69843, 4.79238], + [27.77611, 4.78303], + [27.79882, 4.60753], + [27.89873, 4.5395], + [28.04259, 4.54401], + [28.03542, 4.47789], + [28.20661, 4.35132], + [28.35874, 4.35504], + [28.45564, 4.28788], + [28.51837, 4.37566], + [28.67499, 4.4395], + [28.72635, 4.54469], + [28.81204, 4.49928], + [29.02655, 4.49301], + [29.22183, 4.33886], + [29.34499, 4.3996], + [29.44805, 4.52157], + [29.49347, 4.69435], + [29.82617, 4.5565], + [29.80218, 4.36944], + [29.96592, 4.28926], + [30.06364, 4.12941], + [30.15903, 4.11422], + [30.2165, 3.93845], + [30.2882, 3.95651], + [30.47428, 3.83354], + [30.55079, 3.84098], + [30.58198, 3.72921], + [30.55824, 3.62292], + [30.73048, 3.62139], + [30.7754, 3.6823], + [30.85991, 3.57722], + [30.85054, 3.49925], + [30.94276, 3.50754], + [30.93826, 3.40604], + [30.84064, 3.26397], + [30.78199, 3.01754], + [30.89151, 2.86188], + [30.75215, 2.58254], + [30.75156, 2.41602], + [30.83502, 2.42127], + [30.93877, 2.33026], + [30.98917, 2.40862], + [31.12903, 2.26347], + [31.31592, 2.14783], + [31.23005, 1.99715], + [31.03205, 1.75111], + [30.71646, 1.50123], + [30.48038, 1.21567], + [30.36212, 1.1994], + [30.2387, 1.13415], + [30.22635, 0.9904], + [30.14259, 0.88511], + [29.97783, 0.82916], + [29.95418, 0.64424], + [29.97789, 0.50582], + [29.87365, 0.38518], + [29.82435, 0.16704], + [29.71715, 0.06865], + [29.74454, -0.02974], + [29.65282, -0.45965], + [29.68211, -0.56737], + [29.62626, -0.70805], + [29.63572, -0.90071], + [29.59941, -0.98707], + [29.57815, -1.19344], + [29.59115, -1.38568], + [29.73324, -1.33573], + [29.88148, -1.35883], + [29.91511, -1.48268], + [30.16527, -1.34687], + [30.34543, -1.12638], + [30.35429, -1.06574], + [30.4485, -1.04832], + [30.47386, -1.05762], + [30.4736, -1.15718], + [30.57264, -1.34033], + [30.73883, -1.45043], + [30.74358, -1.51759], + [30.83897, -1.65066], + [30.80727, -1.93737], + [30.89716, -2.07387], + [30.84872, -2.20387], + [30.85609, -2.31279], + [30.77419, -2.39015], + [30.54027, -2.41436], + [30.42102, -2.65886], + [30.5307, -2.67185], + [30.43883, -2.75176], + [30.41081, -2.86185], + [30.50365, -2.95411], + [30.57357, -2.89375], + [30.67095, -2.99248], + [30.85062, -2.97736], + [30.7982, -3.06376], + [30.84191, -3.1008], + [30.8387, -3.25715], + [30.6632, -3.32463], + [30.63474, -3.45638], + [30.49127, -3.52249], + [30.38855, -3.71881], + [30.25796, -3.89123], + [30.19054, -4.08177], + [30.07601, -4.1741], + [30.04113, -4.2719], + [29.86837, -4.37984], + [29.82309, -4.36133], + [29.75605, -4.46725], + [29.41996, -4.44996], + [29.43242, -4.54033], + [29.34489, -4.7737], + [29.38271, -5.0543], + [29.46135, -5.19188], + [29.53285, -5.45344], + [29.60019, -5.58013], + [29.63524, -5.74597], + [29.51272, -5.92255], + [29.49747, -6.04868], + [29.55414, -6.31485], + [29.65664, -6.45339], + [29.71056, -6.60242], + [29.89683, -6.7615], + [30.04189, -6.82511], + [30.17996, -6.94863], + [30.30394, -7.12756], + [30.39477, -7.31785], + [30.45549, -7.58419], + [30.70298, -7.9784], + [30.77203, -8.20381], + [28.89206, -8.47755], + [28.9529, -8.59025], + [28.95331, -8.69209], + [28.85347, -8.8523], + [28.67948, -9.05866], + [28.379, -9.2491], + [28.52347, -9.35605], + [28.5188, -9.44211], + [28.59612, -9.55291], + [28.62094, -9.72277], + [28.6952, -9.81141], + [28.62939, -9.93531], + [28.62669, -10.14873], + [28.57316, -10.21489], + [28.624, -10.36214], + [28.68566, -10.6541], + [28.57715, -10.79933], + [28.48174, -11.09779], + [28.49692, -11.16348], + [28.39473, -11.50664], + [28.42857, -11.7421], + [28.49739, -11.87932], + [28.71149, -11.98039], + [29.01763, -12.29524], + [29.04851, -12.38171], + [29.16729, -12.40378], + [29.27015, -12.36535], + [29.47539, -12.47489], + [29.52857, -12.40089], + [29.44024, -12.33409], + [29.57164, -12.20288], + [29.66459, -12.24345], + [29.81521, -12.15247], + [29.81414, -13.44083], + [29.71494, -13.45441], + [29.60475, -13.40923], + [29.67551, -13.22798], + [29.58632, -13.2076], + [29.18273, -13.4501], + [29.13344, -13.36657], + [29.01274, -13.41663], + [28.78508, -12.95753], + [28.64927, -12.83506], + [28.56489, -12.90237], + [28.46777, -12.72177], + [28.53544, -12.6376], + [28.31876, -12.42002], + [28.05135, -12.39015], + [27.88282, -12.2315], + [27.63364, -12.27915], + [27.5063, -12.15801], + [27.45587, -11.95095], + [27.38671, -11.86085], + [27.21867, -11.77074], + [27.2012, -11.57977], + [27.05828, -11.6033], + [26.99781, -11.85709], + [26.86043, -11.9926], + [26.37684, -11.97541], + [25.94799, -11.87646], + [25.321, -11.6138], + [25.30375, -11.37243], + [25.35242, -11.19568], + [24.82491, -11.29948], + [24.48416, -11.46792], + [24.30272, -11.37777], + [24.40426, -11.23575], + [24.38362, -11.09469], + [24.28507, -11.03247], + [24.16456, -11.03494], + [24.12095, -10.9053], + [24.01141, -10.90509], + [24.02094, -11.24321], + [24.06343, -11.4089], + [23.9946, -11.62187], + [23.97778, -12.17722], + [24.06825, -12.34221], + [23.939, -12.57158], + [23.88115, -12.79556], + [24.02106, -12.99812], + [22.00241, -13.00087], + [21.99975, -16.17237], + [22.12555, -16.34364], + [22.13159, -16.48001], + [22.47656, -16.77131], + [22.74233, -17.05381], + [23.07847, -17.34723], + [23.20586, -17.48332], + [23.43529, -17.6073], + [23.43401, -17.63702], + [21.42353, -18.02662], + [21.21055, -17.92899], + [20.96461, -17.96723], + [20.83615, -18.03859], + [20.65307, -17.98106], + [20.54246, -17.98189], + [20.45448, -17.91095], + [20.31869, -17.86542], + [20.13717, -17.91449], + [19.85871, -17.86001], + [19.75243, -17.90596], + [19.62419, -17.86826], + [19.13992, -17.81325], + [19.09848, -17.8375], + [18.87278, -17.81281], + [18.61639, -17.63008], + [18.42042, -17.38975], + [14.21877, -17.3923], + [14.10208, -17.43948], + [13.95655, -17.43381], + [13.91725, -17.37804], + [13.51104, -17.1354], + [13.46366, -17.0109], + [13.3512, -16.97417], + [13.24699, -17.00012], + [13.16938, -16.96341], + [12.98363, -16.98211], + [12.80511, -17.11593], + [12.44714, -17.26342], + [12.39642, -17.20771], + [12.25362, -17.24069], + [12.08179, -17.14229], + [11.93213, -17.19051], + [11.79396, -17.27467], + [11.5, -17], + [5, -17], + [5, 0] + ] + ] + }, + "properties": { "ituzone": "52" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "53": { + "mh": [ + "KG38", + "KG39", + "KG47", + "KG48", + "KG49", + "KG54", + "KG55", + "KG56", + "KG57", + "KG58", + "KG59", + "KG63", + "KG64", + "KG65", + "KG66", + "KG67", + "KG68", + "KG69", + "KG73", + "KG74", + "KG75", + "KG76", + "KG77", + "KG78", + "KG79", + "KG83", + "KG84", + "KG85", + "KG86", + "KG87", + "KG88", + "KG89", + "KG93", + "KG94", + "KG95", + "KG96", + "KG97", + "KG98", + "KG99", + "KH12", + "KH13", + "KH14", + "KH15", + "KH16", + "KH17", + "KH18", + "KH20", + "KH21", + "KH22", + "KH23", + "KH24", + "KH25", + "KH26", + "KH27", + "KH28", + "KH29", + "KH30", + "KH31", + "KH32", + "KH33", + "KH34", + "KH35", + "KH36", + "KH37", + "KH38", + "KH40", + "KH41", + "KH42", + "KH43", + "KH44", + "KH45", + "KH46", + "KH47", + "KH48", + "KH49", + "KH50", + "KH51", + "KH52", + "KH53", + "KH54", + "KH55", + "KH56", + "KH57", + "KH58", + "KH59", + "KH60", + "KH61", + "KH62", + "KH63", + "KH64", + "KH65", + "KH66", + "KH67", + "KH68", + "KH69", + "KH70", + "KH71", + "KH72", + "KH73", + "KH74", + "KH75", + "KH76", + "KH77", + "KH78", + "KH79", + "KH80", + "KH81", + "KH82", + "KH83", + "KH84", + "KH85", + "KH86", + "KH87", + "KH88", + "KH89", + "KH90", + "KH91", + "KH92", + "KH93", + "KH94", + "KH95", + "KH96", + "KH97", + "KH98", + "KH99", + "KI40", + "KI41", + "KI43", + "KI44", + "KI45", + "KI50", + "KI51", + "KI52", + "KI53", + "KI54", + "KI55", + "KI56", + "KI57", + "KI58", + "KI59", + "KI60", + "KI61", + "KI62", + "KI63", + "KI64", + "KI65", + "KI66", + "KI67", + "KI68", + "KI69", + "KI70", + "KI71", + "KI72", + "KI73", + "KI74", + "KI75", + "KI76", + "KI77", + "KI78", + "KI80", + "KI81", + "KI82", + "KI83", + "KI84", + "KI85", + "KI86", + "KI87", + "KI90", + "KI91", + "KI92", + "KI93", + "KI94", + "KI95", + "KI96", + "LG03", + "LG04", + "LG05", + "LG06", + "LG07", + "LG08", + "LG09", + "LG13", + "LG14", + "LG15", + "LG16", + "LG17", + "LG18", + "LG19", + "LG23", + "LG24", + "LG25", + "LG26", + "LG27", + "LG28", + "LG29", + "LG33", + "LG34", + "LG35", + "LG36", + "LG37", + "LG38", + "LG39", + "LG43", + "LG44", + "LG45", + "LG46", + "LG47", + "LG48", + "LG49", + "LG53", + "LG54", + "LG55", + "LG56", + "LG57", + "LG58", + "LG59", + "LG63", + "LG64", + "LG65", + "LG66", + "LG67", + "LG68", + "LG69", + "LG73", + "LG74", + "LG75", + "LG76", + "LG77", + "LG78", + "LG79", + "LG83", + "LG84", + "LG85", + "LG86", + "LG87", + "LG88", + "LG89", + "LG93", + "LG94", + "LG95", + "LG96", + "LG97", + "LG98", + "LG99", + "LH00", + "LH01", + "LH02", + "LH03", + "LH04", + "LH05", + "LH06", + "LH07", + "LH08", + "LH09", + "LH10", + "LH11", + "LH12", + "LH13", + "LH14", + "LH15", + "LH16", + "LH17", + "LH18", + "LH19", + "LH20", + "LH21", + "LH22", + "LH23", + "LH24", + "LH25", + "LH26", + "LH27", + "LH28", + "LH29", + "LH30", + "LH31", + "LH32", + "LH33", + "LH34", + "LH35", + "LH36", + "LH37", + "LH38", + "LH39", + "LH40", + "LH41", + "LH42", + "LH43", + "LH44", + "LH45", + "LH46", + "LH47", + "LH48", + "LH49", + "LH50", + "LH51", + "LH52", + "LH53", + "LH54", + "LH55", + "LH56", + "LH57", + "LH58", + "LH59", + "LH60", + "LH61", + "LH62", + "LH63", + "LH64", + "LH65", + "LH66", + "LH67", + "LH68", + "LH69", + "LH70", + "LH71", + "LH72", + "LH73", + "LH74", + "LH75", + "LH76", + "LH77", + "LH78", + "LH79", + "LH80", + "LH81", + "LH82", + "LH83", + "LH84", + "LH85", + "LH86", + "LH87", + "LH88", + "LH89", + "LH90", + "LH91", + "LH92", + "LH93", + "LH94", + "LH95", + "LH96", + "LH97", + "LH98", + "LH99", + "LI00", + "LI01", + "LI02", + "LI03", + "LI04", + "LI05", + "LI06", + "LI10", + "LI11", + "LI12", + "LI13", + "LI14", + "LI15", + "LI16", + "LI17", + "LI20", + "LI21", + "LI22", + "LI23", + "LI24", + "LI25", + "LI26", + "LI27", + "LI28", + "LI30", + "LI31", + "LI32", + "LI33", + "LI34", + "LI35", + "LI36", + "LI37", + "LI38", + "LI39", + "LI40", + "LI41", + "LI42", + "LI43", + "LI44", + "LI45", + "LI46", + "LI47", + "LI48", + "LI49", + "LI50", + "LI51", + "LI52", + "LI53", + "LI54", + "LI55", + "LI56", + "LI57", + "LI58", + "LI59", + "LI60", + "LI61", + "LI62", + "LI63", + "LI64", + "LI65", + "LI66", + "LI67", + "LI68", + "LI69", + "LI70", + "LI71", + "LI72", + "LI73", + "LI74", + "LI75", + "LI76", + "LI77", + "LI78", + "LI79", + "LI80", + "LI81", + "LI82", + "LI83", + "LI84", + "LI85", + "LI86", + "LI87", + "LI88", + "LI89", + "LI90", + "LI91", + "LI92", + "LI93", + "LI94", + "LI95", + "LI96", + "LI97", + "LI98", + "LI99", + "MG03", + "MG04", + "MG05", + "MG06", + "MG07", + "MG08", + "MG09", + "MG15", + "MG16", + "MG17", + "MG18", + "MG19", + "MG28", + "MG29", + "MH00", + "MH01", + "MH02", + "MH03", + "MH04", + "MH05", + "MH06", + "MH07", + "MH08", + "MH09", + "MH10", + "MH11", + "MH12", + "MH13", + "MH14", + "MH15", + "MH16", + "MH17", + "MH18", + "MH19", + "MH20", + "MH21", + "MH22", + "MH23", + "MI00", + "MI01", + "MI02", + "MI03", + "MI04", + "MI05", + "MI06", + "MI07", + "MI08", + "MI09", + "MI10", + "MI11" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [23.43401, -17.63702], + [23.43529, -17.6073], + [23.20586, -17.48332], + [23.07847, -17.34723], + [22.74233, -17.05381], + [22.47656, -16.77131], + [22.13159, -16.48001], + [22.12555, -16.34364], + [21.99975, -16.17237], + [22.00241, -13.00087], + [24.02106, -12.99812], + [23.88115, -12.79556], + [23.939, -12.57158], + [24.06825, -12.34221], + [23.97778, -12.17722], + [23.9946, -11.62187], + [24.06343, -11.4089], + [24.02094, -11.24321], + [24.01141, -10.90509], + [24.12095, -10.9053], + [24.16456, -11.03494], + [24.28507, -11.03247], + [24.38362, -11.09469], + [24.40426, -11.23575], + [24.30272, -11.37777], + [24.48416, -11.46792], + [24.82491, -11.29948], + [25.35242, -11.19568], + [25.30375, -11.37243], + [25.321, -11.6138], + [25.94799, -11.87646], + [26.37684, -11.97541], + [26.86043, -11.9926], + [26.99781, -11.85709], + [27.05828, -11.6033], + [27.2012, -11.57977], + [27.21867, -11.77074], + [27.38671, -11.86085], + [27.45587, -11.95095], + [27.5063, -12.15801], + [27.63364, -12.27915], + [27.88282, -12.2315], + [28.05135, -12.39015], + [28.31876, -12.42002], + [28.53544, -12.6376], + [28.46777, -12.72177], + [28.56489, -12.90237], + [28.64927, -12.83506], + [28.78508, -12.95753], + [29.01274, -13.41663], + [29.13344, -13.36657], + [29.18273, -13.4501], + [29.58632, -13.2076], + [29.67551, -13.22798], + [29.60475, -13.40923], + [29.71494, -13.45441], + [29.81414, -13.44083], + [29.81521, -12.15247], + [29.66459, -12.24345], + [29.57164, -12.20288], + [29.44024, -12.33409], + [29.52857, -12.40089], + [29.47539, -12.47489], + [29.27015, -12.36535], + [29.16729, -12.40378], + [29.04851, -12.38171], + [29.01763, -12.29524], + [28.71149, -11.98039], + [28.49739, -11.87932], + [28.42857, -11.7421], + [28.39473, -11.50664], + [28.49692, -11.16348], + [28.48174, -11.09779], + [28.57715, -10.79933], + [28.68566, -10.6541], + [28.624, -10.36214], + [28.57316, -10.21489], + [28.62669, -10.14873], + [28.62939, -9.93531], + [28.6952, -9.81141], + [28.62094, -9.72277], + [28.59612, -9.55291], + [28.5188, -9.44211], + [28.52347, -9.35605], + [28.379, -9.2491], + [28.67948, -9.05866], + [28.85347, -8.8523], + [28.95331, -8.69209], + [28.9529, -8.59025], + [28.89206, -8.47755], + [30.77203, -8.20381], + [30.70298, -7.9784], + [30.45549, -7.58419], + [30.39477, -7.31785], + [30.30394, -7.12756], + [30.17996, -6.94863], + [30.04189, -6.82511], + [29.89683, -6.7615], + [29.71056, -6.60242], + [29.65664, -6.45339], + [29.55414, -6.31485], + [29.49747, -6.04868], + [29.51272, -5.92255], + [29.63524, -5.74597], + [29.60019, -5.58013], + [29.53285, -5.45344], + [29.46135, -5.19188], + [29.38271, -5.0543], + [29.34489, -4.7737], + [29.43242, -4.54033], + [29.41996, -4.44996], + [29.75605, -4.46725], + [29.82309, -4.36133], + [29.86837, -4.37984], + [30.04113, -4.2719], + [30.07601, -4.1741], + [30.19054, -4.08177], + [30.25796, -3.89123], + [30.38855, -3.71881], + [30.49127, -3.52249], + [30.63474, -3.45638], + [30.6632, -3.32463], + [30.8387, -3.25715], + [30.84191, -3.1008], + [30.7982, -3.06376], + [30.85062, -2.97736], + [30.67095, -2.99248], + [30.57357, -2.89375], + [30.50365, -2.95411], + [30.41081, -2.86185], + [30.43883, -2.75176], + [30.5307, -2.67185], + [30.42102, -2.65886], + [30.54027, -2.41436], + [30.77419, -2.39015], + [30.85609, -2.31279], + [30.84872, -2.20387], + [30.89716, -2.07387], + [30.80727, -1.93737], + [30.83897, -1.65066], + [30.74358, -1.51759], + [30.73883, -1.45043], + [30.57264, -1.34033], + [30.4736, -1.15718], + [30.47386, -1.05762], + [30.49167, -1.06143], + [30.64947, -1.06688], + [30.79909, -0.99937], + [34.01135, -0.99957], + [34.07969, -1.02155], + [35.8564, -2.02381], + [37.51227, -2.95293], + [37.6733, -3.06109], + [37.71202, -3.31141], + [37.58444, -3.44068], + [37.74524, -3.54528], + [37.7856, -3.67718], + [39.21428, -4.67826], + [39.69966, -4.74546], + [50, 0], + [60, 0], + [65, -20], + [60, -27], + [33, -27], + [32.89373, -26.857], + [32.33186, -26.864], + [32.13443, -26.83975], + [32.13492, -26.5272], + [32.07766, -26.40524], + [32.10314, -26.17102], + [32.08761, -26.00873], + [32.00311, -25.99699], + [31.93065, -25.8403], + [32.00587, -25.64505], + [31.97897, -25.45803], + [32.01453, -25.38638], + [32.03629, -25.13251], + [31.99736, -24.69592], + [32.01061, -24.46112], + [31.98542, -24.30632], + [31.90735, -24.1803], + [31.88421, -23.9553], + [31.76758, -23.88479], + [31.68961, -23.62814], + [31.56131, -23.48194], + [31.56368, -23.1869], + [31.30724, -22.42436], + [31.15739, -22.32796], + [31.08682, -22.34859], + [30.83977, -22.29141], + [30.63221, -22.3361], + [30.4878, -22.31567], + [30.28876, -22.35735], + [30.22506, -22.2952], + [30.1271, -22.31361], + [30.01978, -22.22931], + [29.77444, -22.14099], + [29.58034, -22.13843], + [29.37425, -22.19618], + [29.24676, -22.06094], + [29.1288, -22.07019], + [29.05355, -22.02224], + [29.01936, -21.92613], + [29.06394, -21.80198], + [28.8614, -21.75627], + [28.57328, -21.6295], + [28.50678, -21.66997], + [28.36278, -21.60175], + [28.02038, -21.57608], + [27.92094, -21.32889], + [27.80409, -21.18017], + [27.69611, -21.09092], + [27.69096, -20.87114], + [27.72935, -20.79645], + [27.7036, -20.66329], + [27.7298, -20.51873], + [27.36165, -20.46764], + [27.28783, -20.49894], + [27.30432, -20.33052], + [27.20613, -20.08086], + [27.04374, -20.00789], + [26.97139, -20.01476], + [26.6225, -19.88385], + [26.57958, -19.79504], + [26.4299, -19.74501], + [26.35711, -19.61389], + [26.16788, -19.54423], + [26.04403, -19.21184], + [25.96149, -19.10078], + [25.99637, -19.03062], + [25.95389, -18.91645], + [25.82434, -18.83334], + [25.78401, -18.62506], + [25.69102, -18.57078], + [25.51464, -18.37641], + [25.3911, -18.11752], + [25.32167, -18.0777], + [25.23812, -17.91286], + [25.26375, -17.79176], + [24.97329, -17.55226], + [24.72724, -17.50007], + [24.60769, -17.53609], + [24.39033, -17.46954], + [24.24949, -17.47446], + [23.43401, -17.63702] + ] + ] + }, + "properties": { "ituzone": "53" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "54": { + "mh": [ + "NH57", + "NH58", + "NH59", + "NH67", + "NH68", + "NH69", + "NH77", + "NH78", + "NH79", + "NH87", + "NH88", + "NH89", + "NH97", + "NH98", + "NH99", + "NI50", + "NI51", + "NI52", + "NI53", + "NI54", + "NI55", + "NI56", + "NI57", + "NI58", + "NI59", + "NI60", + "NI61", + "NI62", + "NI63", + "NI64", + "NI65", + "NI66", + "NI67", + "NI68", + "NI69", + "NI70", + "NI71", + "NI72", + "NI73", + "NI74", + "NI75", + "NI76", + "NI77", + "NI78", + "NI79", + "NI80", + "NI81", + "NI82", + "NI83", + "NI84", + "NI85", + "NI86", + "NI87", + "NI88", + "NI89", + "NI90", + "NI91", + "NI92", + "NI93", + "NI94", + "NI95", + "NI96", + "NI97", + "NI98", + "NI99", + "NJ50", + "NJ51", + "NJ52", + "NJ53", + "NJ54", + "NJ55", + "NJ56", + "NJ60", + "NJ61", + "NJ62", + "NJ63", + "NJ64", + "NJ65", + "NJ66", + "NJ70", + "NJ71", + "NJ72", + "NJ73", + "NJ74", + "NJ75", + "NJ76", + "NJ80", + "NJ81", + "NJ82", + "NJ83", + "NJ84", + "NJ85", + "NJ86", + "NJ90", + "NJ91", + "NJ92", + "NJ93", + "NJ94", + "NJ95", + "NJ96", + "OH07", + "OH08", + "OH09", + "OH17", + "OH18", + "OH19", + "OH27", + "OH28", + "OH29", + "OH37", + "OH38", + "OH39", + "OH47", + "OH48", + "OH49", + "OH57", + "OH58", + "OH59", + "OH67", + "OH68", + "OH69", + "OH77", + "OH78", + "OH79", + "OH87", + "OH88", + "OH89", + "OH97", + "OH98", + "OH99", + "OI00", + "OI01", + "OI02", + "OI03", + "OI04", + "OI05", + "OI06", + "OI07", + "OI08", + "OI09", + "OI10", + "OI11", + "OI12", + "OI13", + "OI14", + "OI15", + "OI16", + "OI17", + "OI18", + "OI19", + "OI20", + "OI21", + "OI22", + "OI23", + "OI24", + "OI25", + "OI26", + "OI27", + "OI28", + "OI29", + "OI30", + "OI31", + "OI32", + "OI33", + "OI34", + "OI35", + "OI36", + "OI37", + "OI38", + "OI39", + "OI40", + "OI41", + "OI42", + "OI43", + "OI44", + "OI45", + "OI46", + "OI47", + "OI48", + "OI49", + "OI50", + "OI51", + "OI52", + "OI53", + "OI54", + "OI55", + "OI56", + "OI57", + "OI58", + "OI59", + "OI60", + "OI61", + "OI62", + "OI63", + "OI64", + "OI65", + "OI66", + "OI67", + "OI68", + "OI69", + "OI70", + "OI71", + "OI72", + "OI73", + "OI74", + "OI75", + "OI76", + "OI77", + "OI78", + "OI79", + "OI80", + "OI81", + "OI82", + "OI83", + "OI84", + "OI85", + "OI86", + "OI87", + "OI88", + "OI89", + "OI90", + "OI91", + "OI92", + "OI93", + "OI94", + "OI95", + "OI96", + "OI97", + "OI98", + "OI99", + "OJ00", + "OJ01", + "OJ02", + "OJ03", + "OJ04", + "OJ05", + "OJ06", + "OJ10", + "OJ11", + "OJ12", + "OJ13", + "OJ14", + "OJ15", + "OJ16", + "OJ20", + "OJ21", + "OJ22", + "OJ23", + "OJ24", + "OJ25", + "OJ26", + "OJ30", + "OJ31", + "OJ32", + "OJ33", + "OJ34", + "OJ35", + "OJ36", + "OJ40", + "OJ41", + "OJ42", + "OJ43", + "OJ44", + "OJ45", + "OJ46", + "OJ50", + "OJ51", + "OJ52", + "OJ53", + "OJ54", + "OJ55", + "OJ56", + "OJ60", + "OJ61", + "OJ62", + "OJ63", + "OJ64", + "OJ65", + "OJ66", + "OJ70", + "OJ71", + "OJ72", + "OJ73", + "OJ74", + "OJ75", + "OJ76", + "OJ80", + "OJ81", + "OJ82", + "OJ83", + "OJ84", + "OJ85", + "OJ86", + "OJ87", + "OJ90", + "OJ91", + "OJ92", + "OJ93", + "OJ94", + "OJ95", + "OJ96", + "PH08", + "PH09", + "PH18", + "PH19", + "PH28", + "PH29", + "PH39", + "PH49", + "PI00", + "PI01", + "PI02", + "PI03", + "PI04", + "PI05", + "PI06", + "PI07", + "PI08", + "PI09", + "PI10", + "PI11", + "PI12", + "PI13", + "PI14", + "PI15", + "PI16", + "PI17", + "PI18", + "PI19", + "PI20", + "PI21", + "PI22", + "PI23", + "PI24", + "PI25", + "PI26", + "PI27", + "PI28", + "PI29", + "PI30", + "PI31", + "PI32", + "PI33", + "PI34", + "PI35", + "PI36", + "PI37", + "PI38", + "PI39", + "PI40", + "PI41", + "PI42", + "PI43", + "PI44", + "PI45", + "PI46", + "PI47", + "PI48", + "PI49", + "PJ00", + "PJ01", + "PJ02", + "PJ03", + "PJ04", + "PJ10", + "PJ11", + "PJ12", + "PJ13", + "PJ14", + "PJ20", + "PJ21", + "PJ22", + "PJ23", + "PJ24", + "PJ25", + "PJ30", + "PJ31", + "PJ32", + "PJ33", + "PJ34", + "PJ35", + "PJ40", + "PJ41", + "PJ42", + "PJ43", + "PJ44" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [90, -13], + [90, 6.45833], + [99.58333, 6.45833], + [99.86587, 6.52268], + [100.11966, 6.42331], + [100.15948, 6.48345], + [100.17113, 6.69311], + [100.29335, 6.7109], + [100.30227, 6.60863], + [100.65238, 6.44187], + [100.73069, 6.49673], + [100.81345, 6.44209], + [100.87133, 6.26333], + [101.09906, 6.26131], + [101.12403, 6.19252], + [101.05784, 6.14109], + [101.1298, 6.10582], + [101.08447, 5.90623], + [101.02686, 5.91218], + [100.98436, 5.80612], + [101.09913, 5.70234], + [101.13555, 5.61309], + [101.26247, 5.71798], + [101.26769, 5.80759], + [101.39392, 5.87251], + [101.48498, 5.8682], + [101.58195, 5.93332], + [101.65557, 5.87619], + [101.70393, 5.75192], + [101.8372, 5.78818], + [101.94171, 5.86907], + [101.94205, 5.98017], + [102.09315, 6.14486], + [102.13866, 6.2691], + [108.53354, 6.87119], + [114.75624, 5.79238], + [116.78216, 7.66089], + [117.35361, 7.39417], + [117.93055, 6.61753], + [118.13962, 6.04534], + [119.45312, 5.3708], + [118.98877, 4.79656], + [119.1477, 4.19658], + [127.00219, 5.5], + [130, 2.5], + [130, -10], + [129, -10], + [115, -13], + [90, -13] + ] + ] + }, + "properties": { "ituzone": "54" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "55": { + "mh": [ + "PG44", + "PG45", + "PG46", + "PG47", + "PG48", + "PG49", + "PG54", + "PG55", + "PG56", + "PG57", + "PG58", + "PG59", + "PG64", + "PG65", + "PG66", + "PG67", + "PG68", + "PG69", + "PG74", + "PG75", + "PG76", + "PG77", + "PG78", + "PG79", + "PG84", + "PG85", + "PG86", + "PG87", + "PG88", + "PG89", + "PG94", + "PG95", + "PG96", + "PG97", + "PG98", + "PG99", + "PH40", + "PH41", + "PH42", + "PH43", + "PH44", + "PH45", + "PH46", + "PH47", + "PH48", + "PH49", + "PH50", + "PH51", + "PH52", + "PH53", + "PH54", + "PH55", + "PH56", + "PH57", + "PH58", + "PH59", + "PH60", + "PH61", + "PH62", + "PH63", + "PH64", + "PH65", + "PH66", + "PH67", + "PH68", + "PH69", + "PH70", + "PH71", + "PH72", + "PH73", + "PH74", + "PH75", + "PH76", + "PH77", + "PH78", + "PH79", + "PH80", + "PH81", + "PH82", + "PH83", + "PH84", + "PH85", + "PH86", + "PH87", + "PH88", + "PH89", + "PH90", + "PH91", + "PH92", + "PH93", + "PH94", + "PH95", + "PH96", + "PH97", + "PH98", + "PH99", + "PI50", + "PI60", + "PI70", + "PI80", + "PI90", + "QG01", + "QG02", + "QG03", + "QG04", + "QG05", + "QG06", + "QG07", + "QG08", + "QG09", + "QG11", + "QG12", + "QG13", + "QG14", + "QG15", + "QG16", + "QG17", + "QG18", + "QG19", + "QG21", + "QG22", + "QG23", + "QG24", + "QG25", + "QG26", + "QG27", + "QG28", + "QG29", + "QG31", + "QG32", + "QG33", + "QG34", + "QG35", + "QG36", + "QG37", + "QG38", + "QG39", + "QG41", + "QG42", + "QG43", + "QG44", + "QG45", + "QG46", + "QG47", + "QG48", + "QG49", + "QG50", + "QG51", + "QG52", + "QG53", + "QG54", + "QG55", + "QG56", + "QG57", + "QG58", + "QG59", + "QG61", + "QG62", + "QG63", + "QG64", + "QG65", + "QG66", + "QG67", + "QG68", + "QG69", + "QH00", + "QH01", + "QH02", + "QH03", + "QH04", + "QH05", + "QH06", + "QH07", + "QH08", + "QH09", + "QH10", + "QH11", + "QH12", + "QH13", + "QH14", + "QH15", + "QH16", + "QH17", + "QH18", + "QH19", + "QH20", + "QH21", + "QH22", + "QH23", + "QH24", + "QH25", + "QH26", + "QH27", + "QH28", + "QH29", + "QH30", + "QH31", + "QH32", + "QH33", + "QH34", + "QH35", + "QH36", + "QH37", + "QH40", + "QH41", + "QH42", + "QH43", + "QH44", + "QH45", + "QH46", + "QH47", + "QH50", + "QH51", + "QH52", + "QH53", + "QH54", + "QH55", + "QH56", + "QH57", + "QH60", + "QH61", + "QH62", + "QH63", + "QH64", + "QH65", + "QH66", + "QH67", + "QI00", + "QI10", + "QI20" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [130, -10], + [142.06744, -9.24768], + [142.17979, -9.18656], + [142.62997, -9.35315], + [144.32409, -9.26347], + [144.88891, -12.00696], + [154, -12.08162], + [154, -28], + [153.55168, -28.16473], + [153.48005, -28.15544], + [153.36349, -28.25173], + [153.17924, -28.25022], + [153.10463, -28.35852], + [152.86499, -28.30943], + [152.80125, -28.35726], + [152.613, -28.27242], + [152.57844, -28.34022], + [152.50222, -28.24616], + [152.22013, -28.45059], + [152.17407, -28.42539], + [152.0194, -28.52123], + [151.96023, -28.51431], + [152.00693, -28.66492], + [152.0582, -28.66995], + [152.04012, -28.85752], + [152.00602, -28.9031], + [151.8537, -28.90555], + [151.77554, -28.95608], + [151.72759, -28.87438], + [151.5478, -28.95137], + [151.49997, -29.07519], + [151.34502, -29.18461], + [151.27258, -29.09323], + [151.28117, -28.943], + [151.09709, -28.83648], + [151.01636, -28.75342], + [150.74051, -28.63548], + [150.6322, -28.67641], + [150.4262, -28.65733], + [150.32103, -28.54012], + [150.1613, -28.55603], + [149.97927, -28.60953], + [149.70897, -28.61688], + [149.59252, -28.57553], + [149.45679, -28.59243], + [149.38463, -28.69499], + [149.298, -28.71096], + [149.09618, -28.83251], + [149.03535, -28.9528], + [148.95372, -29.0002], + [140.97958, -28.99379], + [140.97138, -26], + [129, -26], + [129, -10], + [130, -10] + ] + ] + }, + "properties": { "ituzone": "55" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "56": { + "mh": [ + "AG08", + "AG09", + "AG18", + "AG19", + "AH00", + "AH01", + "AH02", + "AH03", + "AH04", + "AH05", + "AH06", + "AH07", + "AH10", + "AH11", + "AH12", + "AH13", + "AH14", + "AH15", + "QG62", + "QG63", + "QG64", + "QG65", + "QG66", + "QG67", + "QG68", + "QG69", + "QG72", + "QG73", + "QG74", + "QG75", + "QG76", + "QG77", + "QG78", + "QG79", + "QG82", + "QG83", + "QG84", + "QG85", + "QG86", + "QG87", + "QG88", + "QG89", + "QG92", + "QG93", + "QG94", + "QG95", + "QG96", + "QG97", + "QG98", + "QG99", + "QH60", + "QH61", + "QH62", + "QH63", + "QH64", + "QH65", + "QH66", + "QH67", + "QH70", + "QH71", + "QH72", + "QH73", + "QH74", + "QH75", + "QH76", + "QH77", + "QH80", + "QH81", + "QH82", + "QH83", + "QH84", + "QH85", + "QH86", + "QH87", + "QH90", + "QH91", + "QH92", + "QH93", + "QH94", + "QH95", + "QH96", + "QH97", + "RG02", + "RG03", + "RG04", + "RG05", + "RG06", + "RG07", + "RG08", + "RG09", + "RG12", + "RG13", + "RG14", + "RG15", + "RG16", + "RG17", + "RG18", + "RG19", + "RG22", + "RG23", + "RG24", + "RG25", + "RG26", + "RG27", + "RG28", + "RG29", + "RG32", + "RG33", + "RG34", + "RG35", + "RG36", + "RG37", + "RG38", + "RG39", + "RG42", + "RG43", + "RG44", + "RG45", + "RG46", + "RG47", + "RG48", + "RG49", + "RG52", + "RG53", + "RG54", + "RG55", + "RG56", + "RG57", + "RG58", + "RG59", + "RG62", + "RG63", + "RG64", + "RG65", + "RG66", + "RG67", + "RG68", + "RG69", + "RG72", + "RG73", + "RG74", + "RG75", + "RG76", + "RG77", + "RG78", + "RG79", + "RG82", + "RG83", + "RG84", + "RG85", + "RG86", + "RG87", + "RG88", + "RG89", + "RG92", + "RG93", + "RG94", + "RG95", + "RG96", + "RG97", + "RG98", + "RG99", + "RH00", + "RH01", + "RH02", + "RH03", + "RH04", + "RH05", + "RH06", + "RH07", + "RH10", + "RH11", + "RH12", + "RH13", + "RH14", + "RH15", + "RH16", + "RH17", + "RH20", + "RH21", + "RH22", + "RH23", + "RH24", + "RH25", + "RH26", + "RH27", + "RH30", + "RH31", + "RH32", + "RH33", + "RH34", + "RH35", + "RH36", + "RH37", + "RH40", + "RH41", + "RH42", + "RH43", + "RH44", + "RH45", + "RH46", + "RH47", + "RH50", + "RH51", + "RH52", + "RH53", + "RH54", + "RH55", + "RH56", + "RH57", + "RH60", + "RH61", + "RH62", + "RH63", + "RH64", + "RH65", + "RH66", + "RH67", + "RH70", + "RH71", + "RH72", + "RH73", + "RH74", + "RH75", + "RH76", + "RH77", + "RH80", + "RH81", + "RH82", + "RH83", + "RH84", + "RH85", + "RH86", + "RH87", + "RH90", + "RH91", + "RH92", + "RH93", + "RH94", + "RH95", + "RH96", + "RH97" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-179, -12], + [-177, -16], + [-177, -22], + [-180, -22], + [-180, -28], + [-206, -28], + [-206, -12], + [-179, -12] + ] + ] + }, + "properties": { "ituzone": "56" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "57": { + "mh": [ + "JE76", + "JE77", + "JE78", + "JE79", + "JE83", + "JE84", + "JE85", + "JE86", + "JE87", + "JE88", + "JE89", + "JE90", + "JE91", + "JE92", + "JE93", + "JE94", + "JE95", + "JE96", + "JE97", + "JE98", + "JE99", + "JF48", + "JF49", + "JF54", + "JF55", + "JF56", + "JF57", + "JF58", + "JF59", + "JF60", + "JF61", + "JF62", + "JF63", + "JF64", + "JF65", + "JF66", + "JF67", + "JF68", + "JF69", + "JF70", + "JF71", + "JF72", + "JF73", + "JF74", + "JF75", + "JF76", + "JF77", + "JF78", + "JF79", + "JF80", + "JF81", + "JF82", + "JF83", + "JF84", + "JF85", + "JF86", + "JF87", + "JF88", + "JF89", + "JF90", + "JF91", + "JF92", + "JF93", + "JF94", + "JF95", + "JF96", + "JF97", + "JF98", + "JF99", + "JG28", + "JG29", + "JG33", + "JG34", + "JG35", + "JG36", + "JG37", + "JG38", + "JG39", + "JG40", + "JG41", + "JG42", + "JG43", + "JG44", + "JG45", + "JG46", + "JG47", + "JG48", + "JG49", + "JG50", + "JG51", + "JG52", + "JG53", + "JG54", + "JG55", + "JG56", + "JG57", + "JG58", + "JG59", + "JG60", + "JG61", + "JG62", + "JG63", + "JG64", + "JG65", + "JG66", + "JG67", + "JG68", + "JG69", + "JG70", + "JG71", + "JG72", + "JG73", + "JG74", + "JG75", + "JG76", + "JG77", + "JG78", + "JG79", + "JG80", + "JG81", + "JG82", + "JG83", + "JG84", + "JG85", + "JG86", + "JG87", + "JG88", + "JG89", + "JG90", + "JG91", + "JG92", + "JG93", + "JG94", + "JG95", + "JG96", + "JG97", + "JG98", + "JG99", + "JH20", + "JH21", + "JH22", + "JH30", + "JH31", + "JH32", + "JH40", + "JH41", + "JH42", + "JH50", + "JH51", + "JH52", + "JH60", + "JH61", + "JH62", + "JH70", + "JH71", + "JH72", + "JH80", + "JH81", + "JH82", + "JH90", + "JH91", + "JH92", + "KE00", + "KE01", + "KE02", + "KE03", + "KE04", + "KE05", + "KE06", + "KE07", + "KE08", + "KE09", + "KE10", + "KE11", + "KE12", + "KE13", + "KE14", + "KE15", + "KE16", + "KE17", + "KE18", + "KE19", + "KE20", + "KE21", + "KE22", + "KE23", + "KE24", + "KE25", + "KE26", + "KE27", + "KE28", + "KE29", + "KE30", + "KE31", + "KE32", + "KE33", + "KE34", + "KE35", + "KE36", + "KE37", + "KE38", + "KE39", + "KE40", + "KE41", + "KE42", + "KE43", + "KE44", + "KE45", + "KE46", + "KE47", + "KE48", + "KE49", + "KE50", + "KE51", + "KE52", + "KE53", + "KE54", + "KE55", + "KE56", + "KE57", + "KE58", + "KE59", + "KE60", + "KE61", + "KE62", + "KE63", + "KE64", + "KE65", + "KE66", + "KE67", + "KE68", + "KE69", + "KE70", + "KE71", + "KE72", + "KE73", + "KE74", + "KE75", + "KE76", + "KE77", + "KE78", + "KE79", + "KE80", + "KE81", + "KE82", + "KE83", + "KE84", + "KE85", + "KE86", + "KE87", + "KE88", + "KE89", + "KE90", + "KE91", + "KE92", + "KE93", + "KE94", + "KE95", + "KE96", + "KE97", + "KE98", + "KE99", + "KF00", + "KF01", + "KF02", + "KF03", + "KF04", + "KF05", + "KF06", + "KF07", + "KF08", + "KF09", + "KF10", + "KF11", + "KF12", + "KF13", + "KF14", + "KF15", + "KF16", + "KF17", + "KF18", + "KF19", + "KF20", + "KF21", + "KF22", + "KF23", + "KF24", + "KF25", + "KF26", + "KF27", + "KF28", + "KF29", + "KF30", + "KF31", + "KF32", + "KF33", + "KF34", + "KF35", + "KF36", + "KF37", + "KF38", + "KF39", + "KF40", + "KF41", + "KF42", + "KF43", + "KF44", + "KF45", + "KF46", + "KF47", + "KF48", + "KF49", + "KF50", + "KF51", + "KF52", + "KF53", + "KF54", + "KF55", + "KF56", + "KF57", + "KF58", + "KF59", + "KF60", + "KF61", + "KF62", + "KF63", + "KF64", + "KF65", + "KF66", + "KF67", + "KF68", + "KF69", + "KF70", + "KF71", + "KF72", + "KF73", + "KF74", + "KF75", + "KF76", + "KF77", + "KF78", + "KF79", + "KF80", + "KF81", + "KF82", + "KF83", + "KF84", + "KF85", + "KF86", + "KF87", + "KF88", + "KF89", + "KF90", + "KF91", + "KF92", + "KF93", + "KF94", + "KF95", + "KF96", + "KF97", + "KF98", + "KF99", + "KG00", + "KG01", + "KG02", + "KG03", + "KG04", + "KG05", + "KG06", + "KG07", + "KG08", + "KG09", + "KG10", + "KG11", + "KG12", + "KG13", + "KG14", + "KG15", + "KG16", + "KG17", + "KG18", + "KG19", + "KG20", + "KG21", + "KG22", + "KG23", + "KG24", + "KG25", + "KG26", + "KG27", + "KG28", + "KG29", + "KG30", + "KG31", + "KG32", + "KG33", + "KG34", + "KG35", + "KG36", + "KG37", + "KG38", + "KG39", + "KG40", + "KG41", + "KG42", + "KG43", + "KG44", + "KG45", + "KG46", + "KG47", + "KG48", + "KG50", + "KG51", + "KG52", + "KG53", + "KG54", + "KG55", + "KG56", + "KG57", + "KG60", + "KG61", + "KG62", + "KG63", + "KG64", + "KG65", + "KG70", + "KG71", + "KG72", + "KG73", + "KG80", + "KG81", + "KG82", + "KG83", + "KG90", + "KG91", + "KG92", + "KG93", + "KH00", + "KH01", + "KH02", + "KH10", + "KH11", + "KH12", + "KH20", + "KH21", + "KH22", + "KH30" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [5, -17], + [11.5, -17], + [11.79396, -17.27467], + [11.93213, -17.19051], + [12.08179, -17.14229], + [12.25362, -17.24069], + [12.39642, -17.20771], + [12.44714, -17.26342], + [12.80511, -17.11593], + [12.98363, -16.98211], + [13.16938, -16.96341], + [13.24699, -17.00012], + [13.3512, -16.97417], + [13.46366, -17.0109], + [13.51104, -17.1354], + [13.91725, -17.37804], + [13.95655, -17.43381], + [14.10208, -17.43948], + [14.21877, -17.3923], + [18.42042, -17.38975], + [18.61639, -17.63008], + [18.87278, -17.81281], + [19.09848, -17.8375], + [19.13992, -17.81325], + [19.62419, -17.86826], + [19.75243, -17.90596], + [19.85871, -17.86001], + [20.13717, -17.91449], + [20.31869, -17.86542], + [20.45448, -17.91095], + [20.54246, -17.98189], + [20.65307, -17.98106], + [20.83615, -18.03859], + [20.96461, -17.96723], + [21.21055, -17.92899], + [21.42353, -18.02662], + [24.24949, -17.47446], + [24.39033, -17.46954], + [24.60769, -17.53609], + [24.72724, -17.50007], + [24.97329, -17.55226], + [25.26375, -17.79176], + [25.23812, -17.91286], + [25.32167, -18.0777], + [25.3911, -18.11752], + [25.51464, -18.37641], + [25.69102, -18.57078], + [25.78401, -18.62506], + [25.82434, -18.83334], + [25.95389, -18.91645], + [25.99637, -19.03062], + [25.96149, -19.10078], + [26.04403, -19.21184], + [26.16788, -19.54423], + [26.35711, -19.61389], + [26.4299, -19.74501], + [26.57958, -19.79504], + [26.6225, -19.88385], + [26.97139, -20.01476], + [27.04374, -20.00789], + [27.20613, -20.08086], + [27.30432, -20.33052], + [27.28783, -20.49894], + [27.36165, -20.46764], + [27.7298, -20.51873], + [27.7036, -20.66329], + [27.72935, -20.79645], + [27.69096, -20.87114], + [27.69611, -21.09092], + [27.80409, -21.18017], + [27.92094, -21.32889], + [28.02038, -21.57608], + [28.36278, -21.60175], + [28.50678, -21.66997], + [28.57328, -21.6295], + [28.8614, -21.75627], + [29.06394, -21.80198], + [29.01936, -21.92613], + [29.05355, -22.02224], + [29.1288, -22.07019], + [29.24676, -22.06094], + [29.37425, -22.19618], + [29.58034, -22.13843], + [29.77444, -22.14099], + [30.01978, -22.22931], + [30.1271, -22.31361], + [30.22506, -22.2952], + [30.28876, -22.35735], + [30.4878, -22.31567], + [30.63221, -22.3361], + [30.83977, -22.29141], + [31.08682, -22.34859], + [31.15739, -22.32796], + [31.30724, -22.42436], + [31.56368, -23.1869], + [31.56131, -23.48194], + [31.68961, -23.62814], + [31.76758, -23.88479], + [31.88421, -23.9553], + [31.90735, -24.1803], + [31.98542, -24.30632], + [32.01061, -24.46112], + [31.99736, -24.69592], + [32.03629, -25.13251], + [32.01453, -25.38638], + [31.97897, -25.45803], + [32.00587, -25.64505], + [31.93065, -25.8403], + [32.00311, -25.99699], + [32.08761, -26.00873], + [32.10314, -26.17102], + [32.07766, -26.40524], + [32.13492, -26.5272], + [32.13443, -26.83975], + [32.33186, -26.864], + [32.89373, -26.857], + [33, -27], + [40, -27], + [40, -50], + [20, -50], + [5, -20], + [5, -17] + ] + ] + }, + "properties": { "ituzone": "57" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "58": { + "mh": [ + "OF50", + "OF51", + "OF52", + "OF53", + "OF54", + "OF55", + "OF56", + "OF57", + "OF58", + "OF59", + "OF60", + "OF61", + "OF62", + "OF63", + "OF64", + "OF65", + "OF66", + "OF67", + "OF68", + "OF69", + "OF70", + "OF71", + "OF72", + "OF73", + "OF74", + "OF75", + "OF76", + "OF77", + "OF78", + "OF79", + "OF80", + "OF81", + "OF82", + "OF83", + "OF84", + "OF85", + "OF86", + "OF87", + "OF88", + "OF89", + "OF90", + "OF91", + "OF92", + "OF93", + "OF94", + "OF95", + "OF96", + "OF97", + "OF98", + "OF99", + "OG50", + "OG51", + "OG52", + "OG53", + "OG54", + "OG55", + "OG56", + "OG57", + "OG58", + "OG59", + "OG60", + "OG61", + "OG62", + "OG63", + "OG64", + "OG65", + "OG66", + "OG67", + "OG68", + "OG69", + "OG70", + "OG71", + "OG72", + "OG73", + "OG74", + "OG75", + "OG76", + "OG77", + "OG78", + "OG79", + "OG80", + "OG81", + "OG82", + "OG83", + "OG84", + "OG85", + "OG86", + "OG87", + "OG88", + "OG89", + "OG90", + "OG91", + "OG92", + "OG93", + "OG94", + "OG95", + "OG96", + "OG97", + "OG98", + "OG99", + "OH50", + "OH51", + "OH52", + "OH53", + "OH54", + "OH55", + "OH56", + "OH57", + "OH60", + "OH61", + "OH62", + "OH63", + "OH64", + "OH65", + "OH66", + "OH67", + "OH70", + "OH71", + "OH72", + "OH73", + "OH74", + "OH75", + "OH76", + "OH77", + "OH80", + "OH81", + "OH82", + "OH83", + "OH84", + "OH85", + "OH86", + "OH87", + "OH90", + "OH91", + "OH92", + "OH93", + "OH94", + "OH95", + "OH96", + "OH97", + "OH98", + "PF00", + "PF01", + "PF02", + "PF03", + "PF04", + "PF05", + "PF06", + "PF07", + "PF08", + "PF09", + "PF10", + "PF11", + "PF12", + "PF13", + "PF14", + "PF15", + "PF16", + "PF17", + "PF18", + "PF19", + "PF20", + "PF21", + "PF22", + "PF23", + "PF24", + "PF25", + "PF26", + "PF27", + "PF28", + "PF29", + "PF30", + "PF31", + "PF32", + "PF33", + "PF34", + "PF35", + "PF36", + "PF37", + "PF38", + "PF39", + "PF40", + "PF41", + "PF42", + "PF43", + "PF44", + "PF45", + "PF46", + "PF47", + "PF48", + "PF49", + "PG00", + "PG01", + "PG02", + "PG03", + "PG04", + "PG05", + "PG06", + "PG07", + "PG08", + "PG09", + "PG10", + "PG11", + "PG12", + "PG13", + "PG14", + "PG15", + "PG16", + "PG17", + "PG18", + "PG19", + "PG20", + "PG21", + "PG22", + "PG23", + "PG24", + "PG25", + "PG26", + "PG27", + "PG28", + "PG29", + "PG30", + "PG31", + "PG32", + "PG33", + "PG34", + "PG35", + "PG36", + "PG37", + "PG38", + "PG39", + "PG40", + "PG41", + "PG42", + "PG43", + "PG44", + "PG45", + "PG46", + "PG47", + "PG48", + "PG49", + "PH00", + "PH01", + "PH02", + "PH03", + "PH04", + "PH05", + "PH06", + "PH07", + "PH08", + "PH10", + "PH11", + "PH12", + "PH13", + "PH14", + "PH15", + "PH16", + "PH17", + "PH18", + "PH20", + "PH21", + "PH22", + "PH23", + "PH24", + "PH25", + "PH26", + "PH27", + "PH28", + "PH29", + "PH30", + "PH31", + "PH32", + "PH33", + "PH34", + "PH35", + "PH36", + "PH37", + "PH38", + "PH39", + "PH40", + "PH41", + "PH42", + "PH43", + "PH44", + "PH45", + "PH46", + "PH47", + "PH48", + "PH49" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [129, -10], + [129, -40], + [110, -40], + [110, -13], + [115, -13], + [129, -10] + ] + ] + }, + "properties": { "ituzone": "58" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "59": { + "mh": [ + "PE49", + "PE57", + "PE58", + "PE59", + "PE65", + "PE66", + "PE67", + "PE68", + "PE69", + "PE73", + "PE74", + "PE75", + "PE76", + "PE77", + "PE78", + "PE79", + "PE81", + "PE82", + "PE83", + "PE84", + "PE85", + "PE86", + "PE87", + "PE88", + "PE89", + "PE90", + "PE91", + "PE92", + "PE93", + "PE94", + "PE95", + "PE96", + "PE97", + "PE98", + "PE99", + "PF40", + "PF41", + "PF42", + "PF43", + "PF44", + "PF45", + "PF46", + "PF47", + "PF48", + "PF49", + "PF50", + "PF51", + "PF52", + "PF53", + "PF54", + "PF55", + "PF56", + "PF57", + "PF58", + "PF59", + "PF60", + "PF61", + "PF62", + "PF63", + "PF64", + "PF65", + "PF66", + "PF67", + "PF68", + "PF69", + "PF70", + "PF71", + "PF72", + "PF73", + "PF74", + "PF75", + "PF76", + "PF77", + "PF78", + "PF79", + "PF80", + "PF81", + "PF82", + "PF83", + "PF84", + "PF85", + "PF86", + "PF87", + "PF88", + "PF89", + "PF90", + "PF91", + "PF92", + "PF93", + "PF94", + "PF95", + "PF96", + "PF97", + "PF98", + "PF99", + "PG40", + "PG41", + "PG42", + "PG43", + "PG50", + "PG51", + "PG52", + "PG53", + "PG60", + "PG61", + "PG62", + "PG63", + "PG70", + "PG71", + "PG72", + "PG73", + "PG80", + "PG81", + "PG82", + "PG83", + "PG90", + "PG91", + "PG92", + "PG93", + "QE00", + "QE01", + "QE02", + "QE03", + "QE04", + "QE05", + "QE06", + "QE07", + "QE08", + "QE09", + "QE10", + "QE11", + "QE12", + "QE13", + "QE14", + "QE15", + "QE16", + "QE17", + "QE18", + "QE19", + "QE20", + "QE21", + "QE22", + "QE23", + "QE24", + "QE25", + "QE26", + "QE27", + "QE28", + "QE29", + "QE30", + "QE31", + "QE32", + "QE33", + "QE34", + "QE35", + "QE36", + "QE37", + "QE38", + "QE39", + "QE40", + "QE41", + "QE42", + "QE43", + "QE44", + "QE45", + "QE46", + "QE47", + "QE48", + "QE49", + "QE50", + "QE51", + "QE52", + "QE53", + "QE54", + "QE55", + "QE56", + "QE57", + "QE58", + "QE59", + "QE60", + "QE61", + "QE62", + "QE63", + "QE64", + "QE65", + "QE66", + "QE67", + "QE68", + "QE69", + "QF00", + "QF01", + "QF02", + "QF03", + "QF04", + "QF05", + "QF06", + "QF07", + "QF08", + "QF09", + "QF10", + "QF11", + "QF12", + "QF13", + "QF14", + "QF15", + "QF16", + "QF17", + "QF18", + "QF19", + "QF20", + "QF21", + "QF22", + "QF23", + "QF24", + "QF25", + "QF26", + "QF27", + "QF28", + "QF29", + "QF30", + "QF31", + "QF32", + "QF33", + "QF34", + "QF35", + "QF36", + "QF37", + "QF38", + "QF39", + "QF40", + "QF41", + "QF42", + "QF43", + "QF44", + "QF45", + "QF46", + "QF47", + "QF48", + "QF49", + "QF50", + "QF51", + "QF52", + "QF53", + "QF54", + "QF55", + "QF56", + "QF57", + "QF58", + "QF59", + "QF60", + "QF61", + "QF62", + "QF63", + "QF64", + "QF65", + "QF66", + "QF67", + "QF68", + "QF69", + "QG00", + "QG01", + "QG02", + "QG03", + "QG10", + "QG11", + "QG20", + "QG21", + "QG30", + "QG31", + "QG40", + "QG41", + "QG50", + "QG51", + "QG60", + "QG61" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [129, -26], + [140.97138, -26], + [140.97958, -28.99379], + [148.95372, -29.0002], + [149.03535, -28.9528], + [149.09618, -28.83251], + [149.298, -28.71096], + [149.38463, -28.69499], + [149.45679, -28.59243], + [149.59252, -28.57553], + [149.70897, -28.61688], + [149.97927, -28.60953], + [150.1613, -28.55603], + [150.32103, -28.54012], + [150.4262, -28.65733], + [150.6322, -28.67641], + [150.74051, -28.63548], + [151.01636, -28.75342], + [151.09709, -28.83648], + [151.28117, -28.943], + [151.27258, -29.09323], + [151.34502, -29.18461], + [151.49997, -29.07519], + [151.5478, -28.95137], + [151.72759, -28.87438], + [151.77554, -28.95608], + [151.8537, -28.90555], + [152.00602, -28.9031], + [152.04012, -28.85752], + [152.0582, -28.66995], + [152.00693, -28.66492], + [151.96023, -28.51431], + [152.0194, -28.52123], + [152.17407, -28.42539], + [152.22013, -28.45059], + [152.50222, -28.24616], + [152.57844, -28.34022], + [152.613, -28.27242], + [152.80125, -28.35726], + [152.86499, -28.30943], + [153.10463, -28.35852], + [153.17924, -28.25022], + [153.36349, -28.25173], + [153.48005, -28.15544], + [153.55168, -28.16473], + [154, -28], + [154, -50], + [140, -50], + [129, -40], + [129, -26] + ] + ] + }, + "properties": { "ituzone": "59" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "60": { + "mh": [ + "AD05", + "AD06", + "AD07", + "AD08", + "AD09", + "AD15", + "AD16", + "AD17", + "AD18", + "AD19", + "AD25", + "AD26", + "AD27", + "AD28", + "AD29", + "AE00", + "AE01", + "AE02", + "AE03", + "AE04", + "AE05", + "AE06", + "AE07", + "AE08", + "AE09", + "AE10", + "AE11", + "AE12", + "AE13", + "AE14", + "AE15", + "AE16", + "AE17", + "AE18", + "AE19", + "AE20", + "AE21", + "AE22", + "AE23", + "AE24", + "AE25", + "AE26", + "AE27", + "AE28", + "AE29", + "AF00", + "AF01", + "AF02", + "AF03", + "AF04", + "AF05", + "AF06", + "AF07", + "AF08", + "AF09", + "AF10", + "AF11", + "AF12", + "AF13", + "AF14", + "AF15", + "AF16", + "AF17", + "AF18", + "AF19", + "AF20", + "AF21", + "AF22", + "AF23", + "AF24", + "AF25", + "AF26", + "AF27", + "AF28", + "AF29", + "AG00", + "AG01", + "AG10", + "AG11", + "AG20", + "AG21", + "QD65", + "QD66", + "QD67", + "QD68", + "QD69", + "QD75", + "QD76", + "QD77", + "QD78", + "QD79", + "QD85", + "QD86", + "QD87", + "QD88", + "QD89", + "QD95", + "QD96", + "QD97", + "QD98", + "QD99", + "QE60", + "QE61", + "QE62", + "QE63", + "QE64", + "QE65", + "QE66", + "QE67", + "QE68", + "QE69", + "QE70", + "QE71", + "QE72", + "QE73", + "QE74", + "QE75", + "QE76", + "QE77", + "QE78", + "QE79", + "QE80", + "QE81", + "QE82", + "QE83", + "QE84", + "QE85", + "QE86", + "QE87", + "QE88", + "QE89", + "QE90", + "QE91", + "QE92", + "QE93", + "QE94", + "QE95", + "QE96", + "QE97", + "QE98", + "QE99", + "QF60", + "QF61", + "QF62", + "QF63", + "QF64", + "QF65", + "QF66", + "QF67", + "QF68", + "QF69", + "QF70", + "QF71", + "QF72", + "QF73", + "QF74", + "QF75", + "QF76", + "QF77", + "QF78", + "QF79", + "QF80", + "QF81", + "QF82", + "QF83", + "QF84", + "QF85", + "QF86", + "QF87", + "QF88", + "QF89", + "QF90", + "QF91", + "QF92", + "QF93", + "QF94", + "QF95", + "QF96", + "QF97", + "QF98", + "QF99", + "QG60", + "QG61", + "QG70", + "QG71", + "QG80", + "QG81", + "QG90", + "QG91", + "RD05", + "RD06", + "RD07", + "RD08", + "RD09", + "RD15", + "RD16", + "RD17", + "RD18", + "RD19", + "RD25", + "RD26", + "RD27", + "RD28", + "RD29", + "RD35", + "RD36", + "RD37", + "RD38", + "RD39", + "RD45", + "RD46", + "RD47", + "RD48", + "RD49", + "RD55", + "RD56", + "RD57", + "RD58", + "RD59", + "RD65", + "RD66", + "RD67", + "RD68", + "RD69", + "RD75", + "RD76", + "RD77", + "RD78", + "RD79", + "RD85", + "RD86", + "RD87", + "RD88", + "RD89", + "RD95", + "RD96", + "RD97", + "RD98", + "RD99", + "RE00", + "RE01", + "RE02", + "RE03", + "RE04", + "RE05", + "RE06", + "RE07", + "RE08", + "RE09", + "RE10", + "RE11", + "RE12", + "RE13", + "RE14", + "RE15", + "RE16", + "RE17", + "RE18", + "RE19", + "RE20", + "RE21", + "RE22", + "RE23", + "RE24", + "RE25", + "RE26", + "RE27", + "RE28", + "RE29", + "RE30", + "RE31", + "RE32", + "RE33", + "RE34", + "RE35", + "RE36", + "RE37", + "RE38", + "RE39", + "RE40", + "RE41", + "RE42", + "RE43", + "RE44", + "RE45", + "RE46", + "RE47", + "RE48", + "RE49", + "RE50", + "RE51", + "RE52", + "RE53", + "RE54", + "RE55", + "RE56", + "RE57", + "RE58", + "RE59", + "RE60", + "RE61", + "RE62", + "RE63", + "RE64", + "RE65", + "RE66", + "RE67", + "RE68", + "RE69", + "RE70", + "RE71", + "RE72", + "RE73", + "RE74", + "RE75", + "RE76", + "RE77", + "RE78", + "RE79", + "RE80", + "RE81", + "RE82", + "RE83", + "RE84", + "RE85", + "RE86", + "RE87", + "RE88", + "RE89", + "RE90", + "RE91", + "RE92", + "RE93", + "RE94", + "RE95", + "RE96", + "RE97", + "RE98", + "RE99", + "RF00", + "RF01", + "RF02", + "RF03", + "RF04", + "RF05", + "RF06", + "RF07", + "RF08", + "RF09", + "RF10", + "RF11", + "RF12", + "RF13", + "RF14", + "RF15", + "RF16", + "RF17", + "RF18", + "RF19", + "RF20", + "RF21", + "RF22", + "RF23", + "RF24", + "RF25", + "RF26", + "RF27", + "RF28", + "RF29", + "RF30", + "RF31", + "RF32", + "RF33", + "RF34", + "RF35", + "RF36", + "RF37", + "RF38", + "RF39", + "RF40", + "RF41", + "RF42", + "RF43", + "RF44", + "RF45", + "RF46", + "RF47", + "RF48", + "RF49", + "RF50", + "RF51", + "RF52", + "RF53", + "RF54", + "RF55", + "RF56", + "RF57", + "RF58", + "RF59", + "RF60", + "RF61", + "RF62", + "RF63", + "RF64", + "RF65", + "RF66", + "RF67", + "RF68", + "RF69", + "RF70", + "RF71", + "RF72", + "RF73", + "RF74", + "RF75", + "RF76", + "RF77", + "RF78", + "RF79", + "RF80", + "RF81", + "RF82", + "RF83", + "RF84", + "RF85", + "RF86", + "RF87", + "RF88", + "RF89", + "RF90", + "RF91", + "RF92", + "RF93", + "RF94", + "RF95", + "RF96", + "RF97", + "RF98", + "RF99", + "RG00", + "RG01", + "RG10", + "RG11", + "RG20", + "RG21", + "RG30", + "RG31", + "RG40", + "RG41", + "RG50", + "RG51", + "RG60", + "RG61", + "RG70", + "RG71", + "RG80", + "RG81", + "RG90", + "RG91" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [154, -28], + [185, -28], + [185, -55], + [154, -55], + [154, -28] + ] + ] + }, + "properties": { "ituzone": "60" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "61": { + "mh": [ + "AJ00", + "AJ01", + "AJ02", + "AJ03", + "AJ04", + "AJ05", + "AJ06", + "AJ07", + "AJ08", + "AJ09", + "AJ10", + "AJ11", + "AJ12", + "AJ13", + "AJ14", + "AJ15", + "AJ16", + "AJ17", + "AJ18", + "AJ19", + "AJ20", + "AJ21", + "AJ22", + "AJ23", + "AJ24", + "AJ25", + "AJ26", + "AJ27", + "AJ28", + "AJ29", + "AJ30", + "AJ31", + "AJ32", + "AJ33", + "AJ34", + "AJ35", + "AJ36", + "AJ37", + "AJ38", + "AJ39", + "AJ40", + "AJ41", + "AJ42", + "AJ43", + "AJ44", + "AJ45", + "AJ46", + "AJ47", + "AJ48", + "AJ49", + "AJ50", + "AJ51", + "AJ52", + "AJ53", + "AJ54", + "AJ55", + "AJ56", + "AJ57", + "AJ58", + "AJ59", + "AJ60", + "AJ61", + "AJ62", + "AJ63", + "AJ64", + "AJ65", + "AJ66", + "AJ67", + "AJ68", + "AJ69", + "AJ70", + "AJ71", + "AJ72", + "AJ73", + "AJ74", + "AJ75", + "AJ76", + "AJ77", + "AJ78", + "AJ79", + "AJ80", + "AJ81", + "AJ82", + "AJ83", + "AJ84", + "AJ85", + "AJ86", + "AJ87", + "AJ88", + "AJ89", + "AJ90", + "AJ91", + "AJ92", + "AJ93", + "AJ94", + "AJ95", + "AJ96", + "AJ97", + "AJ98", + "AJ99", + "AK00", + "AK01", + "AK02", + "AK03", + "AK04", + "AK05", + "AK06", + "AK07", + "AK08", + "AK09", + "AK10", + "AK11", + "AK12", + "AK13", + "AK14", + "AK15", + "AK16", + "AK17", + "AK18", + "AK19", + "AK20", + "AK21", + "AK22", + "AK23", + "AK24", + "AK25", + "AK26", + "AK27", + "AK28", + "AK29", + "AK30", + "AK31", + "AK32", + "AK33", + "AK34", + "AK35", + "AK36", + "AK37", + "AK38", + "AK39", + "AK40", + "AK41", + "AK42", + "AK43", + "AK44", + "AK45", + "AK46", + "AK47", + "AK48", + "AK49", + "AK50", + "AK51", + "AK52", + "AK53", + "AK54", + "AK55", + "AK56", + "AK57", + "AK58", + "AK59", + "AK60", + "AK61", + "AK62", + "AK63", + "AK64", + "AK65", + "AK66", + "AK67", + "AK68", + "AK69", + "AK70", + "AK71", + "AK72", + "AK73", + "AK74", + "AK75", + "AK76", + "AK77", + "AK78", + "AK79", + "AK80", + "AK81", + "AK82", + "AK83", + "AK84", + "AK85", + "AK86", + "AK87", + "AK88", + "AK89", + "AK90", + "AK91", + "AK92", + "AK93", + "AK94", + "AK95", + "AK96", + "AK97", + "AK98", + "AK99", + "AL00", + "AL01", + "AL02", + "AL03", + "AL04", + "AL05", + "AL06", + "AL07", + "AL08", + "AL09", + "AL10", + "AL11", + "AL12", + "AL13", + "AL14", + "AL15", + "AL16", + "AL17", + "AL18", + "AL19", + "AL20", + "AL21", + "AL22", + "AL23", + "AL24", + "AL25", + "AL26", + "AL27", + "AL28", + "AL29", + "AL30", + "AL31", + "AL32", + "AL33", + "AL34", + "AL35", + "AL36", + "AL37", + "AL38", + "AL39", + "AL40", + "AL41", + "AL42", + "AL43", + "AL44", + "AL45", + "AL46", + "AL47", + "AL48", + "AL49", + "AL50", + "AL51", + "AL52", + "AL53", + "AL54", + "AL55", + "AL56", + "AL57", + "AL58", + "AL59", + "AL60", + "AL61", + "AL62", + "AL63", + "AL64", + "AL65", + "AL66", + "AL67", + "AL68", + "AL69", + "AL70", + "AL71", + "AL72", + "AL73", + "AL74", + "AL75", + "AL76", + "AL77", + "AL78", + "AL79", + "AL80", + "AL81", + "AL82", + "AL83", + "AL84", + "AL85", + "AL86", + "AL87", + "AL88", + "AL89", + "AL90", + "AL91", + "AL92", + "AL93", + "AL94", + "AL95", + "AL96", + "AL97", + "AL98", + "AL99", + "BJ00", + "BJ01", + "BJ02", + "BJ03", + "BJ04", + "BJ05", + "BJ06", + "BJ07", + "BJ08", + "BJ09", + "BJ10", + "BJ11", + "BJ12", + "BJ13", + "BJ14", + "BJ15", + "BJ16", + "BJ17", + "BJ18", + "BJ19", + "BJ20", + "BJ21", + "BJ22", + "BJ23", + "BJ24", + "BJ25", + "BJ26", + "BJ27", + "BJ28", + "BJ29", + "BJ30", + "BJ31", + "BJ32", + "BJ33", + "BJ34", + "BJ35", + "BJ36", + "BJ37", + "BJ38", + "BJ39", + "BJ40", + "BJ41", + "BJ42", + "BJ43", + "BJ44", + "BJ45", + "BJ46", + "BJ47", + "BJ48", + "BJ49", + "BK00", + "BK01", + "BK02", + "BK03", + "BK04", + "BK05", + "BK06", + "BK07", + "BK08", + "BK09", + "BK10", + "BK11", + "BK12", + "BK13", + "BK14", + "BK15", + "BK16", + "BK17", + "BK18", + "BK19", + "BK20", + "BK21", + "BK22", + "BK23", + "BK24", + "BK25", + "BK26", + "BK27", + "BK28", + "BK29", + "BK30", + "BK31", + "BK32", + "BK33", + "BK34", + "BK35", + "BK36", + "BK37", + "BK38", + "BK39", + "BK40", + "BK41", + "BK42", + "BK43", + "BK44", + "BK45", + "BK46", + "BK47", + "BK48", + "BK49", + "BL00", + "BL01", + "BL02", + "BL03", + "BL04", + "BL05", + "BL06", + "BL07", + "BL08", + "BL09", + "BL10", + "BL11", + "BL12", + "BL13", + "BL14", + "BL15", + "BL16", + "BL17", + "BL18", + "BL19", + "BL20", + "BL21", + "BL22", + "BL23", + "BL24", + "BL25", + "BL26", + "BL27", + "BL28", + "BL29", + "BL30", + "BL31", + "BL32", + "BL33", + "BL34", + "BL35", + "BL36", + "BL37", + "BL38", + "BL39", + "BL40", + "BL41", + "BL42", + "BL43", + "BL44", + "BL45", + "BL46", + "BL47", + "BL48", + "BL49", + "RJ70", + "RJ71", + "RJ72", + "RJ73", + "RJ74", + "RJ75", + "RJ76", + "RJ77", + "RJ78", + "RJ79", + "RJ80", + "RJ81", + "RJ82", + "RJ83", + "RJ84", + "RJ85", + "RJ86", + "RJ87", + "RJ88", + "RJ89", + "RJ90", + "RJ91", + "RJ92", + "RJ93", + "RJ94", + "RJ95", + "RJ96", + "RJ97", + "RJ98", + "RJ99", + "RK44", + "RK45", + "RK46", + "RK47", + "RK48", + "RK49", + "RK54", + "RK55", + "RK56", + "RK57", + "RK58", + "RK59", + "RK64", + "RK65", + "RK66", + "RK67", + "RK68", + "RK69", + "RK70", + "RK71", + "RK72", + "RK73", + "RK74", + "RK75", + "RK76", + "RK77", + "RK78", + "RK79", + "RK80", + "RK81", + "RK82", + "RK83", + "RK84", + "RK85", + "RK86", + "RK87", + "RK88", + "RK89", + "RK90", + "RK91", + "RK92", + "RK93", + "RK94", + "RK95", + "RK96", + "RK97", + "RK98", + "RK99", + "RL40", + "RL41", + "RL42", + "RL43", + "RL44", + "RL45", + "RL46", + "RL47", + "RL48", + "RL49", + "RL50", + "RL51", + "RL52", + "RL53", + "RL54", + "RL55", + "RL56", + "RL57", + "RL58", + "RL59", + "RL60", + "RL61", + "RL62", + "RL63", + "RL64", + "RL65", + "RL66", + "RL67", + "RL68", + "RL69", + "RL70", + "RL71", + "RL72", + "RL73", + "RL74", + "RL75", + "RL76", + "RL77", + "RL78", + "RL79", + "RL80", + "RL81", + "RL82", + "RL83", + "RL84", + "RL85", + "RL86", + "RL87", + "RL88", + "RL89", + "RL90", + "RL91", + "RL92", + "RL93", + "RL94", + "RL95", + "RL96", + "RL97", + "RL98", + "RL99" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [170, 30], + [210, 30], + [210, 0], + [175, 0], + [175, 15], + [170, 15], + [170, 30] + ] + ] + }, + "properties": { "ituzone": "61" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "62": { + "mh": [ + "AG02", + "AG03", + "AG04", + "AG05", + "AG06", + "AG07", + "AG08", + "AG12", + "AG13", + "AG14", + "AG15", + "AG16", + "AG17", + "AG18", + "AG19", + "AG22", + "AG23", + "AG24", + "AG25", + "AG26", + "AG27", + "AG28", + "AG29", + "AG32", + "AG33", + "AG34", + "AG35", + "AG36", + "AG37", + "AG38", + "AG39", + "AG42", + "AG43", + "AG44", + "AG45", + "AG46", + "AG47", + "AG48", + "AG49", + "AG52", + "AG53", + "AG54", + "AG55", + "AG56", + "AG57", + "AG58", + "AG59", + "AG62", + "AG63", + "AG64", + "AG65", + "AG66", + "AG67", + "AG68", + "AG69", + "AG72", + "AG73", + "AG74", + "AG75", + "AG76", + "AG77", + "AG78", + "AG79", + "AG82", + "AG83", + "AG84", + "AG85", + "AG86", + "AG87", + "AG88", + "AG89", + "AH06", + "AH07", + "AH08", + "AH09", + "AH10", + "AH11", + "AH12", + "AH13", + "AH14", + "AH15", + "AH16", + "AH17", + "AH18", + "AH19", + "AH20", + "AH21", + "AH22", + "AH23", + "AH24", + "AH25", + "AH26", + "AH27", + "AH28", + "AH29", + "AH30", + "AH31", + "AH32", + "AH33", + "AH34", + "AH35", + "AH36", + "AH37", + "AH38", + "AH39", + "AH40", + "AH41", + "AH42", + "AH43", + "AH44", + "AH45", + "AH46", + "AH47", + "AH48", + "AH49", + "AH50", + "AH51", + "AH52", + "AH53", + "AH54", + "AH55", + "AH56", + "AH57", + "AH58", + "AH59", + "AH60", + "AH61", + "AH62", + "AH63", + "AH64", + "AH65", + "AH66", + "AH67", + "AH68", + "AH69", + "AH70", + "AH71", + "AH72", + "AH73", + "AH74", + "AH75", + "AH76", + "AH77", + "AH78", + "AH79", + "AH80", + "AH81", + "AH82", + "AH83", + "AH84", + "AH85", + "AH86", + "AH87", + "AH88", + "AH89", + "AH97", + "AH98", + "AH99", + "AI00", + "AI01", + "AI02", + "AI03", + "AI04", + "AI05", + "AI06", + "AI07", + "AI08", + "AI09", + "AI10", + "AI11", + "AI12", + "AI13", + "AI14", + "AI15", + "AI16", + "AI17", + "AI18", + "AI19", + "AI20", + "AI21", + "AI22", + "AI23", + "AI24", + "AI25", + "AI26", + "AI27", + "AI28", + "AI29", + "AI30", + "AI31", + "AI32", + "AI33", + "AI34", + "AI35", + "AI36", + "AI37", + "AI38", + "AI39", + "AI40", + "AI41", + "AI42", + "AI43", + "AI44", + "AI45", + "AI46", + "AI47", + "AI48", + "AI49", + "AI50", + "AI51", + "AI52", + "AI53", + "AI54", + "AI55", + "AI56", + "AI57", + "AI58", + "AI59", + "AI60", + "AI61", + "AI62", + "AI63", + "AI64", + "AI65", + "AI66", + "AI67", + "AI68", + "AI69", + "AI70", + "AI71", + "AI72", + "AI73", + "AI74", + "AI75", + "AI76", + "AI77", + "AI78", + "AI79", + "AI80", + "AI81", + "AI82", + "AI83", + "AI84", + "AI85", + "AI86", + "AI87", + "AI88", + "AI89", + "AI90", + "AI91", + "AI92", + "AI93", + "AI94", + "AI95", + "AI96", + "AI97", + "AI98", + "AI99", + "BH08", + "BH09", + "BH19", + "BI00", + "BI01", + "BI02", + "BI03", + "BI04", + "BI05", + "BI06", + "BI07", + "BI08", + "BI09", + "BI10", + "BI11", + "BI12", + "BI13", + "BI14", + "BI15", + "BI16" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-159, 0], + [-156, -10], + [-163.5, -13], + [-163, -28], + [-180, -28], + [-180, -22], + [-177, -22], + [-177, -16], + [-179, -12], + [-178, -12], + [-178, 0], + [-159, 0] + ] + ] + }, + "properties": { "ituzone": "62" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "63": { + "mh": [ + "AG82", + "AG83", + "AG84", + "AG85", + "AG86", + "AG87", + "AG88", + "AG89", + "AG92", + "AG93", + "AG94", + "AG95", + "AG96", + "AG97", + "AG98", + "AG99", + "AH80", + "AH81", + "AH82", + "AH83", + "AH84", + "AH85", + "AH86", + "AH87", + "AH90", + "AH91", + "AH92", + "AH93", + "AH94", + "AH95", + "AH96", + "AH97", + "AH98", + "BG02", + "BG03", + "BG04", + "BG05", + "BG06", + "BG07", + "BG08", + "BG09", + "BG12", + "BG13", + "BG14", + "BG15", + "BG16", + "BG17", + "BG18", + "BG19", + "BG22", + "BG23", + "BG24", + "BG25", + "BG26", + "BG27", + "BG28", + "BG29", + "BG32", + "BG33", + "BG34", + "BG35", + "BG36", + "BG37", + "BG38", + "BG39", + "BG42", + "BG43", + "BG44", + "BG45", + "BG46", + "BG47", + "BG48", + "BG49", + "BG52", + "BG53", + "BG54", + "BG55", + "BG56", + "BG57", + "BG58", + "BG59", + "BG62", + "BG63", + "BG64", + "BG65", + "BG66", + "BG67", + "BG68", + "BG69", + "BG72", + "BG73", + "BG74", + "BG75", + "BG76", + "BG77", + "BG78", + "BG79", + "BG82", + "BG83", + "BG84", + "BG85", + "BG86", + "BG87", + "BG88", + "BG89", + "BG92", + "BG93", + "BG94", + "BG95", + "BG96", + "BG97", + "BG98", + "BG99", + "BH00", + "BH01", + "BH02", + "BH03", + "BH04", + "BH05", + "BH06", + "BH07", + "BH08", + "BH09", + "BH10", + "BH11", + "BH12", + "BH13", + "BH14", + "BH15", + "BH16", + "BH17", + "BH18", + "BH19", + "BH20", + "BH21", + "BH22", + "BH23", + "BH24", + "BH25", + "BH26", + "BH27", + "BH28", + "BH29", + "BH30", + "BH31", + "BH32", + "BH33", + "BH34", + "BH35", + "BH36", + "BH37", + "BH38", + "BH39", + "BH40", + "BH41", + "BH42", + "BH43", + "BH44", + "BH45", + "BH46", + "BH47", + "BH48", + "BH49", + "BH50", + "BH51", + "BH52", + "BH53", + "BH54", + "BH55", + "BH56", + "BH57", + "BH58", + "BH59", + "BH60", + "BH61", + "BH62", + "BH63", + "BH64", + "BH65", + "BH66", + "BH67", + "BH68", + "BH69", + "BH70", + "BH71", + "BH72", + "BH73", + "BH74", + "BH75", + "BH76", + "BH77", + "BH78", + "BH79", + "BH80", + "BH81", + "BH82", + "BH83", + "BH84", + "BH85", + "BH86", + "BH87", + "BH88", + "BH89", + "BH90", + "BH91", + "BH92", + "BH93", + "BH94", + "BH95", + "BH96", + "BH97", + "BH98", + "BH99", + "BI06", + "BI07", + "BI08", + "BI09", + "BI10", + "BI11", + "BI12", + "BI13", + "BI14", + "BI15", + "BI16", + "BI17", + "BI18", + "BI19", + "BI20", + "BI21", + "BI22", + "BI23", + "BI24", + "BI25", + "BI26", + "BI27", + "BI28", + "BI29", + "BI30", + "BI31", + "BI32", + "BI33", + "BI34", + "BI35", + "BI36", + "BI37", + "BI38", + "BI39", + "BI40", + "BI41", + "BI42", + "BI43", + "BI44", + "BI45", + "BI46", + "BI47", + "BI48", + "BI49", + "BI50", + "BI51", + "BI52", + "BI53", + "BI54", + "BI55", + "BI56", + "BI57", + "BI58", + "BI59", + "BI60", + "BI61", + "BI62", + "BI63", + "BI64", + "BI65", + "BI66", + "BI67", + "BI68", + "BI69", + "BI70", + "BI71", + "BI72", + "BI73", + "BI74", + "BI75", + "BI76", + "BI77", + "BI78", + "BI79", + "BI80", + "BI81", + "BI82", + "BI83", + "BI84", + "BI85", + "BI86", + "BI87", + "BI88", + "BI89", + "BI90", + "BI91", + "BI92", + "BI93", + "BI94", + "BI95", + "BI96", + "BI97", + "BI98", + "BI99", + "CG02", + "CG03", + "CG04", + "CG05", + "CG06", + "CG07", + "CG08", + "CG09", + "CG12", + "CG13", + "CG14", + "CG15", + "CG16", + "CG17", + "CG18", + "CG19", + "CG22", + "CG23", + "CG24", + "CG25", + "CG26", + "CG27", + "CG28", + "CG29", + "CG32", + "CG33", + "CG34", + "CG35", + "CG36", + "CG37", + "CG38", + "CG39", + "CG42", + "CG43", + "CG44", + "CG45", + "CG46", + "CG47", + "CG48", + "CG49", + "CG52", + "CG53", + "CG54", + "CG55", + "CG56", + "CG57", + "CG58", + "CG59", + "CG62", + "CG63", + "CG64", + "CG65", + "CG66", + "CG67", + "CG68", + "CG69", + "CG72", + "CG73", + "CG74", + "CG75", + "CG76", + "CG77", + "CG78", + "CG79", + "CG82", + "CG83", + "CG84", + "CG85", + "CG86", + "CG87", + "CG88", + "CG89", + "CG92", + "CG93", + "CG94", + "CG95", + "CG96", + "CG97", + "CG98", + "CG99", + "CH00", + "CH01", + "CH02", + "CH03", + "CH04", + "CH05", + "CH06", + "CH07", + "CH08", + "CH09", + "CH10", + "CH11", + "CH12", + "CH13", + "CH14", + "CH15", + "CH16", + "CH17", + "CH18", + "CH19", + "CH20", + "CH21", + "CH22", + "CH23", + "CH24", + "CH25", + "CH26", + "CH27", + "CH28", + "CH29", + "CH30", + "CH31", + "CH32", + "CH33", + "CH34", + "CH35", + "CH36", + "CH37", + "CH38", + "CH39", + "CH40", + "CH41", + "CH42", + "CH43", + "CH44", + "CH45", + "CH46", + "CH47", + "CH48", + "CH49", + "CH50", + "CH51", + "CH52", + "CH53", + "CH54", + "CH55", + "CH56", + "CH57", + "CH58", + "CH59", + "CH60", + "CH61", + "CH62", + "CH63", + "CH64", + "CH65", + "CH66", + "CH67", + "CH68", + "CH69", + "CH70", + "CH71", + "CH72", + "CH73", + "CH74", + "CH75", + "CH76", + "CH77", + "CH78", + "CH79", + "CH80", + "CH81", + "CH82", + "CH83", + "CH84", + "CH85", + "CH86", + "CH87", + "CH88", + "CH89", + "CH90", + "CH91", + "CH92", + "CH93", + "CH94", + "CH95", + "CH96", + "CH97", + "CH98", + "CH99", + "CI00", + "CI01", + "CI02", + "CI03", + "CI04", + "CI05", + "CI06", + "CI07", + "CI08", + "CI09", + "CI10", + "CI11", + "CI12", + "CI13", + "CI14", + "CI15", + "CI16", + "CI17", + "CI18", + "CI19", + "CI20", + "CI21", + "CI22", + "CI23", + "CI24", + "CI25", + "CI26", + "CI27", + "CI28", + "CI29", + "CI30", + "CI31", + "CI32", + "CI33", + "CI34", + "CI35", + "CI36", + "CI37", + "CI38", + "CI39", + "CI40", + "CI41", + "CI42", + "CI43", + "CI44", + "CI45", + "CI46", + "CI47", + "CI48", + "CI49", + "CI50", + "CI51", + "CI52", + "CI53", + "CI54", + "CI55", + "CI56", + "CI57", + "CI58", + "CI59", + "CI60", + "CI61", + "CI62", + "CI63", + "CI64", + "CI65", + "CI66", + "CI67", + "CI68", + "CI69", + "CI70", + "CI71", + "CI72", + "CI73", + "CI74", + "CI75", + "CI76", + "CI77", + "CI78", + "CI79", + "CI80", + "CI81", + "CI82", + "CI83", + "CI84", + "CI85", + "CI86", + "CI87", + "CI88", + "CI89", + "CI90", + "CI91", + "CI92", + "CI93", + "CI94", + "CI95", + "CI96", + "CI97", + "CI98", + "CI99", + "DG02", + "DG03", + "DG04", + "DG05", + "DG06", + "DG07", + "DG08", + "DG09", + "DG12", + "DG13", + "DG14", + "DG15", + "DG16", + "DG17", + "DG18", + "DG19", + "DG22", + "DG23", + "DG24", + "DG25", + "DG26", + "DG27", + "DG28", + "DG29", + "DG32", + "DG33", + "DG34", + "DG35", + "DG36", + "DG37", + "DG38", + "DG39", + "DG42", + "DG43", + "DG44", + "DG45", + "DG46", + "DG47", + "DG48", + "DG49", + "DG52", + "DG53", + "DG54", + "DG55", + "DG56", + "DG57", + "DG58", + "DG59", + "DG62", + "DG63", + "DG64", + "DG65", + "DG66", + "DG67", + "DG68", + "DG69", + "DH00", + "DH01", + "DH02", + "DH03", + "DH04", + "DH05", + "DH06", + "DH07", + "DH08", + "DH09", + "DH10", + "DH11", + "DH12", + "DH13", + "DH14", + "DH15", + "DH16", + "DH17", + "DH18", + "DH19", + "DH20", + "DH21", + "DH22", + "DH23", + "DH24", + "DH25", + "DH26", + "DH27", + "DH28", + "DH29", + "DH30", + "DH31", + "DH32", + "DH33", + "DH34", + "DH35", + "DH36", + "DH37", + "DH38", + "DH39", + "DH40", + "DH41", + "DH42", + "DH43", + "DH44", + "DH45", + "DH46", + "DH47", + "DH50", + "DH51", + "DH52", + "DH53", + "DH54", + "DH60", + "DH61", + "DI00", + "DI01", + "DI02", + "DI03", + "DI04", + "DI05", + "DI06", + "DI07", + "DI08", + "DI09", + "DI10", + "DI11", + "DI12", + "DI13", + "DI14", + "DI15", + "DI16", + "DI20", + "DI21", + "DI22", + "DI23", + "DI30" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-159, 0], + [-120, 0], + [-107, -20], + [-107, -28], + [-163, -28], + [-163.5, -13], + [-156, -10], + [-159, 0] + ] + ] + }, + "properties": { "ituzone": "63" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "64": { + "mh": [ + "PJ52", + "PJ53", + "PJ54", + "PJ55", + "PJ56", + "PJ57", + "PJ58", + "PJ59", + "PJ61", + "PJ62", + "PJ63", + "PJ64", + "PJ65", + "PJ66", + "PJ67", + "PJ68", + "PJ69", + "PJ71", + "PJ72", + "PJ73", + "PJ74", + "PJ75", + "PJ76", + "PJ77", + "PJ78", + "PJ79", + "PJ80", + "PJ81", + "PJ82", + "PJ83", + "PJ84", + "PJ85", + "PJ86", + "PJ87", + "PJ88", + "PJ89", + "PJ90", + "PJ91", + "PJ92", + "PJ93", + "PJ94", + "PJ95", + "PJ96", + "PJ97", + "PJ98", + "PJ99", + "PK50", + "PK51", + "PK52", + "PK53", + "PK54", + "PK55", + "PK56", + "PK57", + "PK58", + "PK59", + "PK60", + "PK61", + "PK62", + "PK63", + "PK64", + "PK65", + "PK66", + "PK67", + "PK68", + "PK69", + "PK70", + "PK71", + "PK72", + "PK73", + "PK74", + "PK75", + "PK76", + "PK77", + "PK78", + "PK79", + "PK80", + "PK81", + "PK82", + "PK83", + "PK84", + "PK85", + "PK86", + "PK87", + "PK88", + "PK89", + "PK90", + "PK91", + "PK92", + "PK93", + "PK94", + "PK95", + "PK96", + "PK97", + "PK98", + "PK99", + "PL50", + "PL60", + "PL70", + "PL80", + "PL90", + "PL91", + "QJ00", + "QJ01", + "QJ02", + "QJ03", + "QJ04", + "QJ05", + "QJ06", + "QJ07", + "QJ08", + "QJ09", + "QJ10", + "QJ11", + "QJ12", + "QJ13", + "QJ14", + "QJ15", + "QJ16", + "QJ17", + "QJ18", + "QJ19", + "QJ20", + "QJ21", + "QJ22", + "QJ23", + "QJ24", + "QJ25", + "QJ26", + "QJ27", + "QJ28", + "QJ29", + "QJ30", + "QJ31", + "QJ32", + "QJ33", + "QJ34", + "QJ35", + "QJ36", + "QJ37", + "QJ38", + "QJ39", + "QJ40", + "QJ41", + "QJ42", + "QJ43", + "QJ44", + "QJ45", + "QJ46", + "QJ47", + "QJ48", + "QJ49", + "QK00", + "QK01", + "QK02", + "QK03", + "QK04", + "QK05", + "QK06", + "QK07", + "QK08", + "QK09", + "QK10", + "QK11", + "QK12", + "QK13", + "QK14", + "QK15", + "QK16", + "QK17", + "QK18", + "QK19", + "QK20", + "QK21", + "QK22", + "QK23", + "QK24", + "QK25", + "QK26", + "QK27", + "QK28", + "QK29", + "QK30", + "QK31", + "QK32", + "QK33", + "QK34", + "QK35", + "QK36", + "QK37", + "QK38", + "QK39", + "QK40", + "QK41", + "QK42", + "QK43", + "QK44", + "QK45", + "QK46", + "QK47", + "QK48", + "QK49", + "QL00", + "QL01", + "QL10", + "QL11", + "QL20", + "QL21", + "QL30", + "QL31", + "QL40", + "QL41" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [150, 22], + [150, 0], + [140, 0], + [130, 2.5], + [130, 20], + [140, 20], + [140, 22], + [150, 22] + ] + ] + }, + "properties": { "ituzone": "64" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "65": { + "mh": [ + "AH08", + "AH09", + "AI00", + "AI01", + "AI02", + "AI03", + "AI04", + "AI05", + "AI06", + "AI07", + "AI08", + "AI09", + "QI49", + "QI59", + "QI69", + "QI79", + "QI89", + "QI99", + "QJ40", + "QJ41", + "QJ42", + "QJ43", + "QJ44", + "QJ45", + "QJ46", + "QJ47", + "QJ48", + "QJ49", + "QJ50", + "QJ51", + "QJ52", + "QJ53", + "QJ54", + "QJ55", + "QJ56", + "QJ57", + "QJ58", + "QJ59", + "QJ60", + "QJ61", + "QJ62", + "QJ63", + "QJ64", + "QJ65", + "QJ66", + "QJ67", + "QJ68", + "QJ69", + "QJ70", + "QJ71", + "QJ72", + "QJ73", + "QJ74", + "QJ75", + "QJ76", + "QJ77", + "QJ78", + "QJ79", + "QJ80", + "QJ81", + "QJ82", + "QJ83", + "QJ84", + "QJ85", + "QJ86", + "QJ87", + "QJ88", + "QJ89", + "QJ90", + "QJ91", + "QJ92", + "QJ93", + "QJ94", + "QJ95", + "QJ96", + "QJ97", + "QJ98", + "QJ99", + "QK40", + "QK41", + "QK42", + "QK43", + "QK44", + "QK45", + "QK46", + "QK47", + "QK48", + "QK49", + "QK50", + "QK51", + "QK52", + "QK53", + "QK54", + "QK55", + "QK56", + "QK57", + "QK58", + "QK59", + "QK60", + "QK61", + "QK62", + "QK63", + "QK64", + "QK65", + "QK66", + "QK67", + "QK68", + "QK69", + "QK70", + "QK71", + "QK72", + "QK73", + "QK74", + "QK75", + "QK76", + "QK77", + "QK78", + "QK79", + "QK80", + "QK81", + "QK82", + "QK83", + "QK84", + "QK85", + "QK86", + "QK87", + "QK88", + "QK89", + "QK90", + "QK91", + "QK92", + "QK93", + "QK94", + "QK95", + "QK96", + "QK97", + "QK98", + "QK99", + "QL40", + "QL41", + "QL50", + "QL51", + "QL60", + "QL61", + "QL70", + "QL71", + "QL80", + "QL81", + "QL90", + "QL91", + "RH59", + "RH68", + "RH69", + "RH78", + "RH79", + "RH88", + "RH89", + "RH98", + "RH99", + "RI09", + "RI17", + "RI18", + "RI19", + "RI25", + "RI26", + "RI27", + "RI28", + "RI29", + "RI33", + "RI34", + "RI35", + "RI36", + "RI37", + "RI38", + "RI39", + "RI41", + "RI42", + "RI43", + "RI44", + "RI45", + "RI46", + "RI47", + "RI48", + "RI49", + "RI50", + "RI51", + "RI52", + "RI53", + "RI54", + "RI55", + "RI56", + "RI57", + "RI58", + "RI59", + "RI60", + "RI61", + "RI62", + "RI63", + "RI64", + "RI65", + "RI66", + "RI67", + "RI68", + "RI69", + "RI70", + "RI71", + "RI72", + "RI73", + "RI74", + "RI75", + "RI76", + "RI77", + "RI78", + "RI79", + "RI80", + "RI81", + "RI82", + "RI83", + "RI84", + "RI85", + "RI86", + "RI87", + "RI88", + "RI89", + "RI90", + "RI91", + "RI92", + "RI93", + "RI94", + "RI95", + "RI96", + "RI97", + "RI98", + "RI99", + "RJ00", + "RJ01", + "RJ02", + "RJ03", + "RJ04", + "RJ05", + "RJ06", + "RJ07", + "RJ08", + "RJ09", + "RJ10", + "RJ11", + "RJ12", + "RJ13", + "RJ14", + "RJ15", + "RJ16", + "RJ17", + "RJ18", + "RJ19", + "RJ20", + "RJ21", + "RJ22", + "RJ23", + "RJ24", + "RJ25", + "RJ26", + "RJ27", + "RJ28", + "RJ29", + "RJ30", + "RJ31", + "RJ32", + "RJ33", + "RJ34", + "RJ35", + "RJ36", + "RJ37", + "RJ38", + "RJ39", + "RJ40", + "RJ41", + "RJ42", + "RJ43", + "RJ44", + "RJ45", + "RJ46", + "RJ47", + "RJ48", + "RJ49", + "RJ50", + "RJ51", + "RJ52", + "RJ53", + "RJ54", + "RJ55", + "RJ56", + "RJ57", + "RJ58", + "RJ59", + "RJ60", + "RJ61", + "RJ62", + "RJ63", + "RJ64", + "RJ65", + "RJ66", + "RJ67", + "RJ68", + "RJ69", + "RJ70", + "RJ71", + "RJ72", + "RJ73", + "RJ74", + "RJ75", + "RJ76", + "RJ77", + "RJ78", + "RJ79", + "RK00", + "RK01", + "RK02", + "RK03", + "RK04", + "RK05", + "RK06", + "RK07", + "RK08", + "RK09", + "RK10", + "RK11", + "RK12", + "RK13", + "RK14", + "RK15", + "RK16", + "RK17", + "RK18", + "RK19", + "RK20", + "RK21", + "RK22", + "RK23", + "RK24", + "RK25", + "RK26", + "RK27", + "RK28", + "RK29", + "RK30", + "RK31", + "RK32", + "RK33", + "RK34", + "RK35", + "RK36", + "RK37", + "RK38", + "RK39", + "RK40", + "RK41", + "RK42", + "RK43", + "RK44", + "RK45", + "RK46", + "RK47", + "RK48", + "RK49", + "RK50", + "RK51", + "RK52", + "RK53", + "RK54", + "RK60", + "RK61", + "RK62", + "RK63", + "RK64", + "RK70", + "RK71", + "RK72", + "RK73", + "RK74", + "RL00", + "RL01", + "RL10", + "RL11", + "RL20", + "RL21", + "RL30", + "RL31", + "RL40", + "RL41" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [150, 22], + [170, 22], + [170, 15], + [175, 15], + [175, 0], + [182, 0], + [182, -12], + [173, -12], + [162, 0], + [150, 0], + [150, 22] + ] + ] + }, + "properties": { "ituzone": "65" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "66": { + "mh": [ + "HE65", + "HE66", + "HE67", + "HE68", + "HE69", + "HE75", + "HE76", + "HE77", + "HE78", + "HE79", + "HE85", + "HE86", + "HE87", + "HE88", + "HE89", + "HE95", + "HE96", + "HE97", + "HE98", + "HE99", + "HF60", + "HF61", + "HF62", + "HF63", + "HF64", + "HF65", + "HF66", + "HF67", + "HF68", + "HF69", + "HF70", + "HF71", + "HF72", + "HF73", + "HF74", + "HF75", + "HF76", + "HF77", + "HF78", + "HF79", + "HF80", + "HF81", + "HF82", + "HF83", + "HF84", + "HF85", + "HF86", + "HF87", + "HF88", + "HF89", + "HF90", + "HF91", + "HF92", + "HF93", + "HF94", + "HF95", + "HF96", + "HF97", + "HF98", + "HF99", + "HG60", + "HG61", + "HG62", + "HG63", + "HG64", + "HG65", + "HG66", + "HG67", + "HG68", + "HG69", + "HG70", + "HG71", + "HG72", + "HG73", + "HG74", + "HG75", + "HG76", + "HG77", + "HG78", + "HG79", + "HG80", + "HG81", + "HG82", + "HG83", + "HG84", + "HG85", + "HG86", + "HG87", + "HG88", + "HG89", + "HG90", + "HG91", + "HG92", + "HG93", + "HG94", + "HG95", + "HG96", + "HG97", + "HG98", + "HG99", + "HH60", + "HH61", + "HH62", + "HH63", + "HH64", + "HH65", + "HH66", + "HH67", + "HH68", + "HH69", + "HH70", + "HH71", + "HH72", + "HH73", + "HH74", + "HH75", + "HH76", + "HH77", + "HH78", + "HH79", + "HH80", + "HH81", + "HH82", + "HH83", + "HH84", + "HH85", + "HH86", + "HH87", + "HH88", + "HH89", + "HH90", + "HH91", + "HH92", + "HH93", + "HH94", + "HH95", + "HH96", + "HH97", + "HH98", + "HH99", + "HI60", + "HI61", + "HI62", + "HI63", + "HI64", + "HI65", + "HI66", + "HI67", + "HI68", + "HI69", + "HI70", + "HI71", + "HI72", + "HI73", + "HI74", + "HI75", + "HI76", + "HI77", + "HI78", + "HI79", + "HI80", + "HI81", + "HI82", + "HI83", + "HI84", + "HI85", + "HI86", + "HI87", + "HI88", + "HI89", + "HI90", + "HI91", + "HI92", + "HI93", + "HI94", + "HI95", + "HI96", + "HI97", + "HI98", + "HI99", + "IE05", + "IE06", + "IE07", + "IE08", + "IE09", + "IE15", + "IE16", + "IE17", + "IE18", + "IE19", + "IE25", + "IE26", + "IE27", + "IE28", + "IE29", + "IE35", + "IE36", + "IE37", + "IE38", + "IE39", + "IE45", + "IE46", + "IE47", + "IE48", + "IE49", + "IE55", + "IE56", + "IE57", + "IE58", + "IE59", + "IE65", + "IE66", + "IE67", + "IE68", + "IE69", + "IE75", + "IE76", + "IE77", + "IE78", + "IE79", + "IE85", + "IE86", + "IE87", + "IE88", + "IE89", + "IE95", + "IE96", + "IE97", + "IE98", + "IE99", + "IF00", + "IF01", + "IF02", + "IF03", + "IF04", + "IF05", + "IF06", + "IF07", + "IF08", + "IF09", + "IF10", + "IF11", + "IF12", + "IF13", + "IF14", + "IF15", + "IF16", + "IF17", + "IF18", + "IF19", + "IF20", + "IF21", + "IF22", + "IF23", + "IF24", + "IF25", + "IF26", + "IF27", + "IF28", + "IF29", + "IF30", + "IF31", + "IF32", + "IF33", + "IF34", + "IF35", + "IF36", + "IF37", + "IF38", + "IF39", + "IF40", + "IF41", + "IF42", + "IF43", + "IF44", + "IF45", + "IF46", + "IF47", + "IF48", + "IF49", + "IF50", + "IF51", + "IF52", + "IF53", + "IF54", + "IF55", + "IF56", + "IF57", + "IF58", + "IF59", + "IF60", + "IF61", + "IF62", + "IF63", + "IF64", + "IF65", + "IF66", + "IF67", + "IF68", + "IF69", + "IF70", + "IF71", + "IF72", + "IF73", + "IF74", + "IF75", + "IF76", + "IF77", + "IF78", + "IF79", + "IF80", + "IF81", + "IF82", + "IF83", + "IF84", + "IF85", + "IF86", + "IF87", + "IF88", + "IF89", + "IF90", + "IF91", + "IF92", + "IF93", + "IF94", + "IF95", + "IF96", + "IF97", + "IF98", + "IF99", + "IG00", + "IG01", + "IG02", + "IG03", + "IG04", + "IG05", + "IG06", + "IG07", + "IG08", + "IG09", + "IG10", + "IG11", + "IG12", + "IG13", + "IG14", + "IG15", + "IG16", + "IG17", + "IG18", + "IG19", + "IG20", + "IG21", + "IG22", + "IG23", + "IG24", + "IG25", + "IG26", + "IG27", + "IG28", + "IG29", + "IG30", + "IG31", + "IG32", + "IG33", + "IG34", + "IG35", + "IG36", + "IG37", + "IG38", + "IG39", + "IG40", + "IG41", + "IG42", + "IG43", + "IG44", + "IG45", + "IG46", + "IG47", + "IG48", + "IG49", + "IG50", + "IG51", + "IG52", + "IG53", + "IG54", + "IG55", + "IG56", + "IG57", + "IG58", + "IG59", + "IG60", + "IG61", + "IG62", + "IG63", + "IG64", + "IG65", + "IG66", + "IG67", + "IG68", + "IG69", + "IG70", + "IG71", + "IG72", + "IG73", + "IG74", + "IG75", + "IG76", + "IG77", + "IG78", + "IG79", + "IG80", + "IG81", + "IG82", + "IG83", + "IG84", + "IG85", + "IG86", + "IG87", + "IG88", + "IG89", + "IG90", + "IG91", + "IG92", + "IG93", + "IG94", + "IG95", + "IG96", + "IG97", + "IG98", + "IG99", + "IH00", + "IH01", + "IH02", + "IH03", + "IH04", + "IH05", + "IH06", + "IH07", + "IH08", + "IH09", + "IH10", + "IH11", + "IH12", + "IH13", + "IH14", + "IH15", + "IH16", + "IH17", + "IH18", + "IH19", + "IH20", + "IH21", + "IH22", + "IH23", + "IH24", + "IH25", + "IH26", + "IH27", + "IH28", + "IH29", + "IH30", + "IH31", + "IH32", + "IH33", + "IH34", + "IH35", + "IH36", + "IH37", + "IH38", + "IH39", + "IH40", + "IH41", + "IH42", + "IH43", + "IH44", + "IH45", + "IH46", + "IH47", + "IH48", + "IH49", + "IH50", + "IH51", + "IH52", + "IH53", + "IH54", + "IH55", + "IH56", + "IH57", + "IH58", + "IH59", + "IH60", + "IH61", + "IH62", + "IH63", + "IH64", + "IH65", + "IH66", + "IH67", + "IH68", + "IH69", + "IH70", + "IH71", + "IH72", + "IH73", + "IH74", + "IH75", + "IH76", + "IH77", + "IH78", + "IH79", + "IH80", + "IH81", + "IH82", + "IH83", + "IH84", + "IH85", + "IH86", + "IH87", + "IH88", + "IH89", + "IH90", + "IH91", + "IH92", + "IH93", + "IH94", + "IH95", + "IH96", + "IH97", + "IH98", + "IH99", + "II00", + "II01", + "II02", + "II03", + "II04", + "II05", + "II06", + "II07", + "II08", + "II09", + "II10", + "II11", + "II12", + "II13", + "II14", + "II15", + "II16", + "II17", + "II18", + "II19", + "II20", + "II21", + "II22", + "II23", + "II24", + "II25", + "II26", + "II27", + "II28", + "II29", + "II30", + "II31", + "II32", + "II33", + "II34", + "II35", + "II36", + "II37", + "II38", + "II39", + "II40", + "II41", + "II42", + "II43", + "II44", + "II45", + "II46", + "II47", + "II48", + "II49", + "II50", + "II51", + "II52", + "II53", + "II54", + "II55", + "II56", + "II57", + "II58", + "II59", + "II60", + "II61", + "II62", + "II63", + "II64", + "II65", + "II66", + "II67", + "II68", + "II69", + "II70", + "II71", + "II72", + "II73", + "II74", + "II75", + "II76", + "II77", + "II78", + "II79", + "II80", + "II81", + "II82", + "II83", + "II84", + "II85", + "II86", + "II87", + "II88", + "II89", + "II90", + "II91", + "II92", + "II93", + "II94", + "II95", + "II96", + "II97", + "II98", + "II99", + "JE05", + "JE06", + "JE07", + "JE08", + "JE09", + "JE15", + "JE16", + "JE17", + "JE18", + "JE19", + "JE25", + "JE26", + "JE27", + "JE28", + "JE29", + "JF00", + "JF01", + "JF02", + "JF03", + "JF04", + "JF05", + "JF06", + "JF07", + "JF08", + "JF09", + "JF10", + "JF11", + "JF12", + "JF13", + "JF14", + "JF15", + "JF16", + "JF17", + "JF18", + "JF19", + "JF20", + "JF21", + "JF22", + "JF23", + "JF24", + "JF25", + "JF26", + "JF27", + "JF28", + "JF29", + "JG00", + "JG01", + "JG02", + "JG03", + "JG04", + "JG05", + "JG06", + "JG07", + "JG08", + "JG09", + "JG10", + "JG11", + "JG12", + "JG13", + "JG14", + "JG15", + "JG16", + "JG17", + "JG18", + "JG19", + "JG20", + "JG21", + "JG22", + "JG23", + "JG24", + "JG25", + "JG26", + "JG27", + "JG28", + "JG29", + "JH00", + "JH01", + "JH02", + "JH03", + "JH04", + "JH05", + "JH06", + "JH07", + "JH08", + "JH09", + "JH10", + "JH11", + "JH12", + "JH13", + "JH14", + "JH15", + "JH16", + "JH17", + "JH18", + "JH19", + "JH20", + "JH21", + "JH22", + "JH23", + "JH24", + "JH25", + "JH26", + "JH27", + "JH28", + "JH29", + "JI00", + "JI01", + "JI02", + "JI03", + "JI04", + "JI05", + "JI06", + "JI07", + "JI08", + "JI09", + "JI10", + "JI11", + "JI12", + "JI13", + "JI14", + "JI15", + "JI16", + "JI17", + "JI18", + "JI19", + "JI20", + "JI21", + "JI22", + "JI23", + "JI24", + "JI25", + "JI26", + "JI27", + "JI28", + "JI29" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-28, 0], + [5, 0], + [5, -45], + [-28, -45], + [-28, 0] + ] + ] + }, + "properties": { "ituzone": "66" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "67": { + "mh": [ + "IB00", + "IB01", + "IB02", + "IB03", + "IB04", + "IB05", + "IB06", + "IB07", + "IB08", + "IB09", + "IB10", + "IB11", + "IB12", + "IB13", + "IB14", + "IB15", + "IB16", + "IB17", + "IB18", + "IB19", + "IB20", + "IB21", + "IB22", + "IB23", + "IB24", + "IB25", + "IB26", + "IB27", + "IB28", + "IB29", + "IB30", + "IB31", + "IB32", + "IB33", + "IB34", + "IB35", + "IB36", + "IB37", + "IB38", + "IB39", + "IB40", + "IB41", + "IB42", + "IB43", + "IB44", + "IB45", + "IB46", + "IB47", + "IB48", + "IB49", + "IB50", + "IB51", + "IB52", + "IB53", + "IB54", + "IB55", + "IB56", + "IB57", + "IB58", + "IB59", + "IB60", + "IB61", + "IB62", + "IB63", + "IB64", + "IB65", + "IB66", + "IB67", + "IB68", + "IB69", + "IB70", + "IB71", + "IB72", + "IB73", + "IB74", + "IB75", + "IB76", + "IB77", + "IB78", + "IB79", + "IB80", + "IB81", + "IB82", + "IB83", + "IB84", + "IB85", + "IB86", + "IB87", + "IB88", + "IB89", + "IB90", + "IB91", + "IB92", + "IB93", + "IB94", + "IB95", + "IB96", + "IB97", + "IB98", + "IB99", + "IC00", + "IC01", + "IC02", + "IC03", + "IC04", + "IC05", + "IC06", + "IC07", + "IC08", + "IC09", + "IC10", + "IC11", + "IC12", + "IC13", + "IC14", + "IC15", + "IC16", + "IC17", + "IC18", + "IC19", + "IC20", + "IC21", + "IC22", + "IC23", + "IC24", + "IC25", + "IC26", + "IC27", + "IC28", + "IC29", + "IC30", + "IC31", + "IC32", + "IC33", + "IC34", + "IC35", + "IC36", + "IC37", + "IC38", + "IC39", + "IC40", + "IC41", + "IC42", + "IC43", + "IC44", + "IC45", + "IC46", + "IC47", + "IC48", + "IC49", + "IC50", + "IC51", + "IC52", + "IC53", + "IC54", + "IC55", + "IC56", + "IC57", + "IC58", + "IC59", + "IC60", + "IC61", + "IC62", + "IC63", + "IC64", + "IC65", + "IC66", + "IC67", + "IC68", + "IC69", + "IC70", + "IC71", + "IC72", + "IC73", + "IC74", + "IC75", + "IC76", + "IC77", + "IC78", + "IC79", + "IC80", + "IC81", + "IC82", + "IC83", + "IC84", + "IC85", + "IC86", + "IC87", + "IC88", + "IC89", + "IC90", + "IC91", + "IC92", + "IC93", + "IC94", + "IC95", + "IC96", + "IC97", + "IC98", + "IC99", + "ID00", + "ID01", + "ID02", + "ID03", + "ID04", + "ID05", + "ID06", + "ID07", + "ID08", + "ID09", + "ID10", + "ID11", + "ID12", + "ID13", + "ID14", + "ID15", + "ID16", + "ID17", + "ID18", + "ID19", + "ID20", + "ID21", + "ID22", + "ID23", + "ID24", + "ID25", + "ID26", + "ID27", + "ID28", + "ID29", + "ID30", + "ID31", + "ID32", + "ID33", + "ID34", + "ID35", + "ID36", + "ID37", + "ID38", + "ID39", + "ID40", + "ID41", + "ID42", + "ID43", + "ID44", + "ID45", + "ID46", + "ID47", + "ID48", + "ID49", + "ID50", + "ID51", + "ID52", + "ID53", + "ID54", + "ID55", + "ID56", + "ID57", + "ID58", + "ID59", + "ID60", + "ID61", + "ID62", + "ID63", + "ID64", + "ID65", + "ID66", + "ID67", + "ID68", + "ID69", + "ID70", + "ID71", + "ID72", + "ID73", + "ID74", + "ID75", + "ID76", + "ID77", + "ID78", + "ID79", + "ID80", + "ID81", + "ID82", + "ID83", + "ID84", + "ID85", + "ID86", + "ID87", + "ID88", + "ID89", + "ID90", + "ID91", + "ID92", + "ID93", + "ID94", + "ID95", + "ID96", + "ID97", + "ID98", + "ID99", + "JB00", + "JB01", + "JB02", + "JB03", + "JB04", + "JB05", + "JB06", + "JB07", + "JB08", + "JB09", + "JB10", + "JB11", + "JB12", + "JB13", + "JB14", + "JB15", + "JB16", + "JB17", + "JB18", + "JB19", + "JB20", + "JB21", + "JB22", + "JB23", + "JB24", + "JB25", + "JB26", + "JB27", + "JB28", + "JB29", + "JB30", + "JB31", + "JB32", + "JB33", + "JB34", + "JB35", + "JB36", + "JB37", + "JB38", + "JB39", + "JB40", + "JB41", + "JB42", + "JB43", + "JB44", + "JB45", + "JB46", + "JB47", + "JB48", + "JB49", + "JB50", + "JB51", + "JB52", + "JB53", + "JB54", + "JB55", + "JB56", + "JB57", + "JB58", + "JB59", + "JB60", + "JB61", + "JB62", + "JB63", + "JB64", + "JB65", + "JB66", + "JB67", + "JB68", + "JB69", + "JB70", + "JB71", + "JB72", + "JB73", + "JB74", + "JB75", + "JB76", + "JB77", + "JB78", + "JB79", + "JB80", + "JB81", + "JB82", + "JB83", + "JB84", + "JB85", + "JB86", + "JB87", + "JB88", + "JB89", + "JB90", + "JB91", + "JB92", + "JB93", + "JB94", + "JB95", + "JB96", + "JB97", + "JB98", + "JB99", + "JC00", + "JC01", + "JC02", + "JC03", + "JC04", + "JC05", + "JC06", + "JC07", + "JC08", + "JC09", + "JC10", + "JC11", + "JC12", + "JC13", + "JC14", + "JC15", + "JC16", + "JC17", + "JC18", + "JC19", + "JC20", + "JC21", + "JC22", + "JC23", + "JC24", + "JC25", + "JC26", + "JC27", + "JC28", + "JC29", + "JC30", + "JC31", + "JC32", + "JC33", + "JC34", + "JC35", + "JC36", + "JC37", + "JC38", + "JC39", + "JC40", + "JC41", + "JC42", + "JC43", + "JC44", + "JC45", + "JC46", + "JC47", + "JC48", + "JC49", + "JC50", + "JC51", + "JC52", + "JC53", + "JC54", + "JC55", + "JC56", + "JC57", + "JC58", + "JC59", + "JC60", + "JC61", + "JC62", + "JC63", + "JC64", + "JC65", + "JC66", + "JC67", + "JC68", + "JC69", + "JC70", + "JC71", + "JC72", + "JC73", + "JC74", + "JC75", + "JC76", + "JC77", + "JC78", + "JC79", + "JC80", + "JC81", + "JC82", + "JC83", + "JC84", + "JC85", + "JC86", + "JC87", + "JC88", + "JC89", + "JC90", + "JC91", + "JC92", + "JC93", + "JC94", + "JC95", + "JC96", + "JC97", + "JC98", + "JC99", + "JD00", + "JD01", + "JD02", + "JD03", + "JD04", + "JD05", + "JD06", + "JD07", + "JD08", + "JD09", + "JD10", + "JD11", + "JD12", + "JD13", + "JD14", + "JD15", + "JD16", + "JD17", + "JD18", + "JD19", + "JD20", + "JD21", + "JD22", + "JD23", + "JD24", + "JD25", + "JD26", + "JD27", + "JD28", + "JD29", + "JD30", + "JD31", + "JD32", + "JD33", + "JD34", + "JD35", + "JD36", + "JD37", + "JD38", + "JD39", + "JD40", + "JD41", + "JD42", + "JD43", + "JD44", + "JD45", + "JD46", + "JD47", + "JD48", + "JD49", + "JD50", + "JD51", + "JD52", + "JD53", + "JD54", + "JD55", + "JD56", + "JD57", + "JD58", + "JD59", + "JD60", + "JD61", + "JD62", + "JD63", + "JD64", + "JD65", + "JD66", + "JD67", + "JD68", + "JD69", + "JD70", + "JD71", + "JD72", + "JD73", + "JD74", + "JD75", + "JD76", + "JD77", + "JD78", + "JD79", + "JD80", + "JD81", + "JD82", + "JD83", + "JD84", + "JD85", + "JD86", + "JD87", + "JD88", + "JD89", + "JD90", + "JD91", + "JD92", + "JD93", + "JD94", + "JD95", + "JD96", + "JD97", + "JD98", + "JD99", + "KB00", + "KB01", + "KB02", + "KB03", + "KB04", + "KB05", + "KB06", + "KB07", + "KB08", + "KB09", + "KB10", + "KB11", + "KB12", + "KB13", + "KB14", + "KB15", + "KB16", + "KB17", + "KB18", + "KB19", + "KB20", + "KB21", + "KB22", + "KB23", + "KB24", + "KB25", + "KB26", + "KB27", + "KB28", + "KB29", + "KB30", + "KB31", + "KB32", + "KB33", + "KB34", + "KB35", + "KB36", + "KB37", + "KB38", + "KB39", + "KB40", + "KB41", + "KB42", + "KB43", + "KB44", + "KB45", + "KB46", + "KB47", + "KB48", + "KB49", + "KB50", + "KB51", + "KB52", + "KB53", + "KB54", + "KB55", + "KB56", + "KB57", + "KB58", + "KB59", + "KB60", + "KB61", + "KB62", + "KB63", + "KB64", + "KB65", + "KB66", + "KB67", + "KB68", + "KB69", + "KB70", + "KB71", + "KB72", + "KB73", + "KB74", + "KB75", + "KB76", + "KB77", + "KB78", + "KB79", + "KB80", + "KB81", + "KB82", + "KB83", + "KB84", + "KB85", + "KB86", + "KB87", + "KB88", + "KB89", + "KB90", + "KB91", + "KB92", + "KB93", + "KB94", + "KB95", + "KB96", + "KB97", + "KB98", + "KB99", + "KC00", + "KC01", + "KC02", + "KC03", + "KC04", + "KC05", + "KC06", + "KC07", + "KC08", + "KC09", + "KC10", + "KC11", + "KC12", + "KC13", + "KC14", + "KC15", + "KC16", + "KC17", + "KC18", + "KC19", + "KC20", + "KC21", + "KC22", + "KC23", + "KC24", + "KC25", + "KC26", + "KC27", + "KC28", + "KC29", + "KC30", + "KC31", + "KC32", + "KC33", + "KC34", + "KC35", + "KC36", + "KC37", + "KC38", + "KC39", + "KC40", + "KC41", + "KC42", + "KC43", + "KC44", + "KC45", + "KC46", + "KC47", + "KC48", + "KC49", + "KC50", + "KC51", + "KC52", + "KC53", + "KC54", + "KC55", + "KC56", + "KC57", + "KC58", + "KC59", + "KC60", + "KC61", + "KC62", + "KC63", + "KC64", + "KC65", + "KC66", + "KC67", + "KC68", + "KC69", + "KC70", + "KC71", + "KC72", + "KC73", + "KC74", + "KC75", + "KC76", + "KC77", + "KC78", + "KC79", + "KC80", + "KC81", + "KC82", + "KC83", + "KC84", + "KC85", + "KC86", + "KC87", + "KC88", + "KC89", + "KC90", + "KC91", + "KC92", + "KC93", + "KC94", + "KC95", + "KC96", + "KC97", + "KC98", + "KC99", + "KD00", + "KD01", + "KD02", + "KD03", + "KD04", + "KD05", + "KD06", + "KD07", + "KD08", + "KD09", + "KD10", + "KD11", + "KD12", + "KD13", + "KD14", + "KD15", + "KD16", + "KD17", + "KD18", + "KD19", + "KD20", + "KD21", + "KD22", + "KD23", + "KD24", + "KD25", + "KD26", + "KD27", + "KD28", + "KD29", + "KD30", + "KD31", + "KD32", + "KD33", + "KD34", + "KD35", + "KD36", + "KD37", + "KD38", + "KD39", + "KD40", + "KD41", + "KD42", + "KD43", + "KD44", + "KD45", + "KD46", + "KD47", + "KD48", + "KD49", + "KD50", + "KD51", + "KD52", + "KD53", + "KD54", + "KD55", + "KD56", + "KD57", + "KD58", + "KD59", + "KD60", + "KD61", + "KD62", + "KD63", + "KD64", + "KD65", + "KD66", + "KD67", + "KD68", + "KD69", + "KD70", + "KD71", + "KD72", + "KD73", + "KD74", + "KD75", + "KD76", + "KD77", + "KD78", + "KD79", + "KD80", + "KD81", + "KD82", + "KD83", + "KD84", + "KD85", + "KD86", + "KD87", + "KD88", + "KD89", + "KD90", + "KD91", + "KD92", + "KD93", + "KD94", + "KD95", + "KD96", + "KD97", + "KD98", + "KD99" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-20, -50], + [40, -50], + [40, -80], + [-20, -80], + [-20, -50] + ] + ] + }, + "properties": { "ituzone": "67" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "68": { + "mh": [ + "LD00", + "LD01", + "LD02", + "LD03", + "LD04", + "LD05", + "LD06", + "LD07", + "LD08", + "LD09", + "LD10", + "LD11", + "LD12", + "LD13", + "LD14", + "LD15", + "LD16", + "LD17", + "LD18", + "LD19", + "LD20", + "LD21", + "LD22", + "LD23", + "LD24", + "LD25", + "LD26", + "LD27", + "LD28", + "LD29", + "LD30", + "LD31", + "LD32", + "LD33", + "LD34", + "LD35", + "LD36", + "LD37", + "LD38", + "LD39", + "LD40", + "LD41", + "LD42", + "LD43", + "LD44", + "LD45", + "LD46", + "LD47", + "LD48", + "LD49", + "LD50", + "LD51", + "LD52", + "LD53", + "LD54", + "LD55", + "LD56", + "LD57", + "LD58", + "LD59", + "LD60", + "LD61", + "LD62", + "LD63", + "LD64", + "LD65", + "LD66", + "LD67", + "LD68", + "LD69", + "LD70", + "LD71", + "LD72", + "LD73", + "LD74", + "LD75", + "LD76", + "LD77", + "LD78", + "LD79", + "LD80", + "LD81", + "LD82", + "LD83", + "LD84", + "LD85", + "LD86", + "LD87", + "LD88", + "LD89", + "LD90", + "LD91", + "LD92", + "LD93", + "LD94", + "LD95", + "LD96", + "LD97", + "LD98", + "LD99", + "LE00", + "LE01", + "LE02", + "LE03", + "LE04", + "LE05", + "LE06", + "LE07", + "LE08", + "LE09", + "LE10", + "LE11", + "LE12", + "LE13", + "LE14", + "LE15", + "LE16", + "LE17", + "LE18", + "LE19", + "LE20", + "LE21", + "LE22", + "LE23", + "LE24", + "LE25", + "LE26", + "LE27", + "LE28", + "LE29", + "LE30", + "LE31", + "LE32", + "LE33", + "LE34", + "LE35", + "LE36", + "LE37", + "LE38", + "LE39", + "LE40", + "LE41", + "LE42", + "LE43", + "LE44", + "LE45", + "LE46", + "LE47", + "LE48", + "LE49", + "LE50", + "LE51", + "LE52", + "LE53", + "LE54", + "LE55", + "LE56", + "LE57", + "LE58", + "LE59", + "LE60", + "LE61", + "LE62", + "LE63", + "LE64", + "LE65", + "LE66", + "LE67", + "LE68", + "LE69", + "LE70", + "LE71", + "LE72", + "LE73", + "LE74", + "LE75", + "LE76", + "LE77", + "LE78", + "LE79", + "LE80", + "LE81", + "LE82", + "LE83", + "LE84", + "LE85", + "LE86", + "LE87", + "LE88", + "LE89", + "LE90", + "LE91", + "LE92", + "LE93", + "LE94", + "LE95", + "LE96", + "LE97", + "LE98", + "LE99", + "LF00", + "LF01", + "LF02", + "LF03", + "LF04", + "LF10", + "LF11", + "LF12", + "LF13", + "LF14", + "LF20", + "LF21", + "LF22", + "LF23", + "LF24", + "LF30", + "LF31", + "LF32", + "LF33", + "LF34", + "LF40", + "LF41", + "LF42", + "LF43", + "LF44", + "LF50", + "LF51", + "LF52", + "LF53", + "LF54", + "LF60", + "LF61", + "LF62", + "LF63", + "LF64", + "LF70", + "LF71", + "LF72", + "LF73", + "LF74", + "LF80", + "LF81", + "LF82", + "LF83", + "LF84", + "LF90", + "LF91", + "LF92", + "LF93", + "LF94", + "MD00", + "MD01", + "MD02", + "MD03", + "MD04", + "MD05", + "MD06", + "MD07", + "MD08", + "MD09", + "MD10", + "MD11", + "MD12", + "MD13", + "MD14", + "MD15", + "MD16", + "MD17", + "MD18", + "MD19", + "MD20", + "MD21", + "MD22", + "MD23", + "MD24", + "MD25", + "MD26", + "MD27", + "MD28", + "MD29", + "MD30", + "MD31", + "MD32", + "MD33", + "MD34", + "MD35", + "MD36", + "MD37", + "MD38", + "MD39", + "MD40", + "MD41", + "MD42", + "MD43", + "MD44", + "MD45", + "MD46", + "MD47", + "MD48", + "MD49", + "MD50", + "MD51", + "MD52", + "MD53", + "MD54", + "MD55", + "MD56", + "MD57", + "MD58", + "MD59", + "MD60", + "MD61", + "MD62", + "MD63", + "MD64", + "MD65", + "MD66", + "MD67", + "MD68", + "MD69", + "MD70", + "MD71", + "MD72", + "MD73", + "MD74", + "MD75", + "MD76", + "MD77", + "MD78", + "MD79", + "MD80", + "MD81", + "MD82", + "MD83", + "MD84", + "MD85", + "MD86", + "MD87", + "MD88", + "MD89", + "MD90", + "MD91", + "MD92", + "MD93", + "MD94", + "MD95", + "MD96", + "MD97", + "MD98", + "MD99", + "ME00", + "ME01", + "ME02", + "ME03", + "ME04", + "ME05", + "ME06", + "ME07", + "ME08", + "ME09", + "ME10", + "ME11", + "ME12", + "ME13", + "ME14", + "ME15", + "ME16", + "ME17", + "ME18", + "ME19", + "ME20", + "ME21", + "ME22", + "ME23", + "ME24", + "ME25", + "ME26", + "ME27", + "ME28", + "ME29", + "ME30", + "ME31", + "ME32", + "ME33", + "ME34", + "ME35", + "ME36", + "ME37", + "ME38", + "ME39", + "ME40", + "ME41", + "ME42", + "ME43", + "ME44", + "ME45", + "ME46", + "ME47", + "ME48", + "ME49", + "ME50", + "ME51", + "ME52", + "ME53", + "ME54", + "ME55", + "ME56", + "ME57", + "ME58", + "ME59", + "ME60", + "ME61", + "ME62", + "ME63", + "ME64", + "ME65", + "ME66", + "ME67", + "ME68", + "ME69", + "ME70", + "ME71", + "ME72", + "ME73", + "ME74", + "ME75", + "ME76", + "ME77", + "ME78", + "ME79", + "ME80", + "ME81", + "ME82", + "ME83", + "ME84", + "ME85", + "ME86", + "ME87", + "ME88", + "ME89", + "ME90", + "ME91", + "ME92", + "ME93", + "ME94", + "ME95", + "ME96", + "ME97", + "ME98", + "ME99", + "MF00", + "MF01", + "MF02", + "MF03", + "MF04", + "MF10", + "MF11", + "MF12", + "MF13", + "MF14", + "MF20", + "MF21", + "MF22", + "MF23", + "MF24", + "MF30", + "MF31", + "MF32", + "MF33", + "MF34", + "MF40", + "MF41", + "MF42", + "MF43", + "MF44", + "MF50", + "MF51", + "MF52", + "MF53", + "MF54", + "MF60", + "MF61", + "MF62", + "MF63", + "MF64", + "MF70", + "MF71", + "MF72", + "MF73", + "MF74", + "MF80", + "MF81", + "MF82", + "MF83", + "MF84", + "MF90", + "MF91", + "MF92", + "MF93", + "MF94" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [40, -60], + [40, -35], + [80, -35], + [80, -60], + [40, -60] + ] + ] + }, + "properties": { "ituzone": "68" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "69": { + "mh": [ + "LB00", + "LB01", + "LB02", + "LB03", + "LB04", + "LB05", + "LB06", + "LB07", + "LB08", + "LB09", + "LB10", + "LB11", + "LB12", + "LB13", + "LB14", + "LB15", + "LB16", + "LB17", + "LB18", + "LB19", + "LB20", + "LB21", + "LB22", + "LB23", + "LB24", + "LB25", + "LB26", + "LB27", + "LB28", + "LB29", + "LB30", + "LB31", + "LB32", + "LB33", + "LB34", + "LB35", + "LB36", + "LB37", + "LB38", + "LB39", + "LB40", + "LB41", + "LB42", + "LB43", + "LB44", + "LB45", + "LB46", + "LB47", + "LB48", + "LB49", + "LB50", + "LB51", + "LB52", + "LB53", + "LB54", + "LB55", + "LB56", + "LB57", + "LB58", + "LB59", + "LB60", + "LB61", + "LB62", + "LB63", + "LB64", + "LB65", + "LB66", + "LB67", + "LB68", + "LB69", + "LB70", + "LB71", + "LB72", + "LB73", + "LB74", + "LB75", + "LB76", + "LB77", + "LB78", + "LB79", + "LB80", + "LB81", + "LB82", + "LB83", + "LB84", + "LB85", + "LB86", + "LB87", + "LB88", + "LB89", + "LB90", + "LB91", + "LB92", + "LB93", + "LB94", + "LB95", + "LB96", + "LB97", + "LB98", + "LB99", + "LC00", + "LC01", + "LC02", + "LC03", + "LC04", + "LC05", + "LC06", + "LC07", + "LC08", + "LC09", + "LC10", + "LC11", + "LC12", + "LC13", + "LC14", + "LC15", + "LC16", + "LC17", + "LC18", + "LC19", + "LC20", + "LC21", + "LC22", + "LC23", + "LC24", + "LC25", + "LC26", + "LC27", + "LC28", + "LC29", + "LC30", + "LC31", + "LC32", + "LC33", + "LC34", + "LC35", + "LC36", + "LC37", + "LC38", + "LC39", + "LC40", + "LC41", + "LC42", + "LC43", + "LC44", + "LC45", + "LC46", + "LC47", + "LC48", + "LC49", + "LC50", + "LC51", + "LC52", + "LC53", + "LC54", + "LC55", + "LC56", + "LC57", + "LC58", + "LC59", + "LC60", + "LC61", + "LC62", + "LC63", + "LC64", + "LC65", + "LC66", + "LC67", + "LC68", + "LC69", + "LC70", + "LC71", + "LC72", + "LC73", + "LC74", + "LC75", + "LC76", + "LC77", + "LC78", + "LC79", + "LC80", + "LC81", + "LC82", + "LC83", + "LC84", + "LC85", + "LC86", + "LC87", + "LC88", + "LC89", + "LC90", + "LC91", + "LC92", + "LC93", + "LC94", + "LC95", + "LC96", + "LC97", + "LC98", + "LC99", + "MB00", + "MB01", + "MB02", + "MB03", + "MB04", + "MB05", + "MB06", + "MB07", + "MB08", + "MB09", + "MB10", + "MB11", + "MB12", + "MB13", + "MB14", + "MB15", + "MB16", + "MB17", + "MB18", + "MB19", + "MB20", + "MB21", + "MB22", + "MB23", + "MB24", + "MB25", + "MB26", + "MB27", + "MB28", + "MB29", + "MB30", + "MB31", + "MB32", + "MB33", + "MB34", + "MB35", + "MB36", + "MB37", + "MB38", + "MB39", + "MB40", + "MB41", + "MB42", + "MB43", + "MB44", + "MB45", + "MB46", + "MB47", + "MB48", + "MB49", + "MB50", + "MB51", + "MB52", + "MB53", + "MB54", + "MB55", + "MB56", + "MB57", + "MB58", + "MB59", + "MB60", + "MB61", + "MB62", + "MB63", + "MB64", + "MB65", + "MB66", + "MB67", + "MB68", + "MB69", + "MB70", + "MB71", + "MB72", + "MB73", + "MB74", + "MB75", + "MB76", + "MB77", + "MB78", + "MB79", + "MB80", + "MB81", + "MB82", + "MB83", + "MB84", + "MB85", + "MB86", + "MB87", + "MB88", + "MB89", + "MB90", + "MB91", + "MB92", + "MB93", + "MB94", + "MB95", + "MB96", + "MB97", + "MB98", + "MB99", + "MC00", + "MC01", + "MC02", + "MC03", + "MC04", + "MC05", + "MC06", + "MC07", + "MC08", + "MC09", + "MC10", + "MC11", + "MC12", + "MC13", + "MC14", + "MC15", + "MC16", + "MC17", + "MC18", + "MC19", + "MC20", + "MC21", + "MC22", + "MC23", + "MC24", + "MC25", + "MC26", + "MC27", + "MC28", + "MC29", + "MC30", + "MC31", + "MC32", + "MC33", + "MC34", + "MC35", + "MC36", + "MC37", + "MC38", + "MC39", + "MC40", + "MC41", + "MC42", + "MC43", + "MC44", + "MC45", + "MC46", + "MC47", + "MC48", + "MC49", + "MC50", + "MC51", + "MC52", + "MC53", + "MC54", + "MC55", + "MC56", + "MC57", + "MC58", + "MC59", + "MC60", + "MC61", + "MC62", + "MC63", + "MC64", + "MC65", + "MC66", + "MC67", + "MC68", + "MC69", + "MC70", + "MC71", + "MC72", + "MC73", + "MC74", + "MC75", + "MC76", + "MC77", + "MC78", + "MC79", + "MC80", + "MC81", + "MC82", + "MC83", + "MC84", + "MC85", + "MC86", + "MC87", + "MC88", + "MC89", + "MC90", + "MC91", + "MC92", + "MC93", + "MC94", + "MC95", + "MC96", + "MC97", + "MC98", + "MC99", + "NB00", + "NB01", + "NB02", + "NB03", + "NB04", + "NB05", + "NB06", + "NB07", + "NB08", + "NB09", + "NB10", + "NB11", + "NB12", + "NB13", + "NB14", + "NB15", + "NB16", + "NB17", + "NB18", + "NB19", + "NB20", + "NB21", + "NB22", + "NB23", + "NB24", + "NB25", + "NB26", + "NB27", + "NB28", + "NB29", + "NB30", + "NB31", + "NB32", + "NB33", + "NB34", + "NB35", + "NB36", + "NB37", + "NB38", + "NB39", + "NB40", + "NB41", + "NB42", + "NB43", + "NB44", + "NB45", + "NB46", + "NB47", + "NB48", + "NB49", + "NB50", + "NB51", + "NB52", + "NB53", + "NB54", + "NB55", + "NB56", + "NB57", + "NB58", + "NB59", + "NB60", + "NB61", + "NB62", + "NB63", + "NB64", + "NB65", + "NB66", + "NB67", + "NB68", + "NB69", + "NB70", + "NB71", + "NB72", + "NB73", + "NB74", + "NB75", + "NB76", + "NB77", + "NB78", + "NB79", + "NB80", + "NB81", + "NB82", + "NB83", + "NB84", + "NB85", + "NB86", + "NB87", + "NB88", + "NB89", + "NB90", + "NB91", + "NB92", + "NB93", + "NB94", + "NB95", + "NB96", + "NB97", + "NB98", + "NB99", + "NC00", + "NC01", + "NC02", + "NC03", + "NC04", + "NC05", + "NC06", + "NC07", + "NC08", + "NC09", + "NC10", + "NC11", + "NC12", + "NC13", + "NC14", + "NC15", + "NC16", + "NC17", + "NC18", + "NC19", + "NC20", + "NC21", + "NC22", + "NC23", + "NC24", + "NC25", + "NC26", + "NC27", + "NC28", + "NC29", + "NC30", + "NC31", + "NC32", + "NC33", + "NC34", + "NC35", + "NC36", + "NC37", + "NC38", + "NC39", + "NC40", + "NC41", + "NC42", + "NC43", + "NC44", + "NC45", + "NC46", + "NC47", + "NC48", + "NC49", + "NC50", + "NC51", + "NC52", + "NC53", + "NC54", + "NC55", + "NC56", + "NC57", + "NC58", + "NC59", + "NC60", + "NC61", + "NC62", + "NC63", + "NC64", + "NC65", + "NC66", + "NC67", + "NC68", + "NC69", + "NC70", + "NC71", + "NC72", + "NC73", + "NC74", + "NC75", + "NC76", + "NC77", + "NC78", + "NC79", + "NC80", + "NC81", + "NC82", + "NC83", + "NC84", + "NC85", + "NC86", + "NC87", + "NC88", + "NC89", + "NC90", + "NC91", + "NC92", + "NC93", + "NC94", + "NC95", + "NC96", + "NC97", + "NC98", + "NC99" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [40, -60], + [100, -60], + [100, -80], + [40, -80], + [40, -60] + ] + ] + }, + "properties": { "ituzone": "69" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "70": { + "mh": [ + "OB00", + "OB01", + "OB02", + "OB03", + "OB04", + "OB05", + "OB06", + "OB07", + "OB08", + "OB09", + "OB10", + "OB11", + "OB12", + "OB13", + "OB14", + "OB15", + "OB16", + "OB17", + "OB18", + "OB19", + "OB20", + "OB21", + "OB22", + "OB23", + "OB24", + "OB25", + "OB26", + "OB27", + "OB28", + "OB29", + "OB30", + "OB31", + "OB32", + "OB33", + "OB34", + "OB35", + "OB36", + "OB37", + "OB38", + "OB39", + "OB40", + "OB41", + "OB42", + "OB43", + "OB44", + "OB45", + "OB46", + "OB47", + "OB48", + "OB49", + "OB50", + "OB51", + "OB52", + "OB53", + "OB54", + "OB55", + "OB56", + "OB57", + "OB58", + "OB59", + "OB60", + "OB61", + "OB62", + "OB63", + "OB64", + "OB65", + "OB66", + "OB67", + "OB68", + "OB69", + "OB70", + "OB71", + "OB72", + "OB73", + "OB74", + "OB75", + "OB76", + "OB77", + "OB78", + "OB79", + "OB80", + "OB81", + "OB82", + "OB83", + "OB84", + "OB85", + "OB86", + "OB87", + "OB88", + "OB89", + "OB90", + "OB91", + "OB92", + "OB93", + "OB94", + "OB95", + "OB96", + "OB97", + "OB98", + "OB99", + "OC00", + "OC01", + "OC02", + "OC03", + "OC04", + "OC05", + "OC06", + "OC07", + "OC08", + "OC09", + "OC10", + "OC11", + "OC12", + "OC13", + "OC14", + "OC15", + "OC16", + "OC17", + "OC18", + "OC19", + "OC20", + "OC21", + "OC22", + "OC23", + "OC24", + "OC25", + "OC26", + "OC27", + "OC28", + "OC29", + "OC30", + "OC31", + "OC32", + "OC33", + "OC34", + "OC35", + "OC36", + "OC37", + "OC38", + "OC39", + "OC40", + "OC41", + "OC42", + "OC43", + "OC44", + "OC45", + "OC46", + "OC47", + "OC48", + "OC49", + "OC50", + "OC51", + "OC52", + "OC53", + "OC54", + "OC55", + "OC56", + "OC57", + "OC58", + "OC59", + "OC60", + "OC61", + "OC62", + "OC63", + "OC64", + "OC65", + "OC66", + "OC67", + "OC68", + "OC69", + "OC70", + "OC71", + "OC72", + "OC73", + "OC74", + "OC75", + "OC76", + "OC77", + "OC78", + "OC79", + "OC80", + "OC81", + "OC82", + "OC83", + "OC84", + "OC85", + "OC86", + "OC87", + "OC88", + "OC89", + "OC90", + "OC91", + "OC92", + "OC93", + "OC94", + "OC95", + "OC96", + "OC97", + "OC98", + "OC99", + "PB00", + "PB01", + "PB02", + "PB03", + "PB04", + "PB05", + "PB06", + "PB07", + "PB08", + "PB09", + "PB10", + "PB11", + "PB12", + "PB13", + "PB14", + "PB15", + "PB16", + "PB17", + "PB18", + "PB19", + "PB20", + "PB21", + "PB22", + "PB23", + "PB24", + "PB25", + "PB26", + "PB27", + "PB28", + "PB29", + "PB30", + "PB31", + "PB32", + "PB33", + "PB34", + "PB35", + "PB36", + "PB37", + "PB38", + "PB39", + "PB40", + "PB41", + "PB42", + "PB43", + "PB44", + "PB45", + "PB46", + "PB47", + "PB48", + "PB49", + "PB50", + "PB51", + "PB52", + "PB53", + "PB54", + "PB55", + "PB56", + "PB57", + "PB58", + "PB59", + "PB60", + "PB61", + "PB62", + "PB63", + "PB64", + "PB65", + "PB66", + "PB67", + "PB68", + "PB69", + "PB70", + "PB71", + "PB72", + "PB73", + "PB74", + "PB75", + "PB76", + "PB77", + "PB78", + "PB79", + "PB80", + "PB81", + "PB82", + "PB83", + "PB84", + "PB85", + "PB86", + "PB87", + "PB88", + "PB89", + "PB90", + "PB91", + "PB92", + "PB93", + "PB94", + "PB95", + "PB96", + "PB97", + "PB98", + "PB99", + "PC00", + "PC01", + "PC02", + "PC03", + "PC04", + "PC05", + "PC06", + "PC07", + "PC08", + "PC09", + "PC10", + "PC11", + "PC12", + "PC13", + "PC14", + "PC15", + "PC16", + "PC17", + "PC18", + "PC19", + "PC20", + "PC21", + "PC22", + "PC23", + "PC24", + "PC25", + "PC26", + "PC27", + "PC28", + "PC29", + "PC30", + "PC31", + "PC32", + "PC33", + "PC34", + "PC35", + "PC36", + "PC37", + "PC38", + "PC39", + "PC40", + "PC41", + "PC42", + "PC43", + "PC44", + "PC45", + "PC46", + "PC47", + "PC48", + "PC49", + "PC50", + "PC51", + "PC52", + "PC53", + "PC54", + "PC55", + "PC56", + "PC57", + "PC58", + "PC59", + "PC60", + "PC61", + "PC62", + "PC63", + "PC64", + "PC65", + "PC66", + "PC67", + "PC68", + "PC69", + "PC70", + "PC71", + "PC72", + "PC73", + "PC74", + "PC75", + "PC76", + "PC77", + "PC78", + "PC79", + "PC80", + "PC81", + "PC82", + "PC83", + "PC84", + "PC85", + "PC86", + "PC87", + "PC88", + "PC89", + "PC90", + "PC91", + "PC92", + "PC93", + "PC94", + "PC95", + "PC96", + "PC97", + "PC98", + "PC99", + "QB00", + "QB01", + "QB02", + "QB03", + "QB04", + "QB05", + "QB06", + "QB07", + "QB08", + "QB09", + "QB10", + "QB11", + "QB12", + "QB13", + "QB14", + "QB15", + "QB16", + "QB17", + "QB18", + "QB19", + "QB20", + "QB21", + "QB22", + "QB23", + "QB24", + "QB25", + "QB26", + "QB27", + "QB28", + "QB29", + "QB30", + "QB31", + "QB32", + "QB33", + "QB34", + "QB35", + "QB36", + "QB37", + "QB38", + "QB39", + "QB40", + "QB41", + "QB42", + "QB43", + "QB44", + "QB45", + "QB46", + "QB47", + "QB48", + "QB49", + "QB50", + "QB51", + "QB52", + "QB53", + "QB54", + "QB55", + "QB56", + "QB57", + "QB58", + "QB59", + "QB60", + "QB61", + "QB62", + "QB63", + "QB64", + "QB65", + "QB66", + "QB67", + "QB68", + "QB69", + "QB70", + "QB71", + "QB72", + "QB73", + "QB74", + "QB75", + "QB76", + "QB77", + "QB78", + "QB79", + "QB80", + "QB81", + "QB82", + "QB83", + "QB84", + "QB85", + "QB86", + "QB87", + "QB88", + "QB89", + "QB90", + "QB91", + "QB92", + "QB93", + "QB94", + "QB95", + "QB96", + "QB97", + "QB98", + "QB99", + "QC00", + "QC01", + "QC02", + "QC03", + "QC04", + "QC05", + "QC06", + "QC07", + "QC08", + "QC09", + "QC10", + "QC11", + "QC12", + "QC13", + "QC14", + "QC15", + "QC16", + "QC17", + "QC18", + "QC19", + "QC20", + "QC21", + "QC22", + "QC23", + "QC24", + "QC25", + "QC26", + "QC27", + "QC28", + "QC29", + "QC30", + "QC31", + "QC32", + "QC33", + "QC34", + "QC35", + "QC36", + "QC37", + "QC38", + "QC39", + "QC40", + "QC41", + "QC42", + "QC43", + "QC44", + "QC45", + "QC46", + "QC47", + "QC48", + "QC49", + "QC50", + "QC51", + "QC52", + "QC53", + "QC54", + "QC55", + "QC56", + "QC57", + "QC58", + "QC59", + "QC60", + "QC61", + "QC62", + "QC63", + "QC64", + "QC65", + "QC66", + "QC67", + "QC68", + "QC69", + "QC70", + "QC71", + "QC72", + "QC73", + "QC74", + "QC75", + "QC76", + "QC77", + "QC78", + "QC79", + "QC80", + "QC81", + "QC82", + "QC83", + "QC84", + "QC85", + "QC86", + "QC87", + "QC88", + "QC89", + "QC90", + "QC91", + "QC92", + "QC93", + "QC94", + "QC95", + "QC96", + "QC97", + "QC98", + "QC99" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [100, -60], + [160, -60], + [160, -80], + [100, -80], + [100, -60] + ] + ] + }, + "properties": { "ituzone": "70" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "71": { + "mh": [ + "AB00", + "AB01", + "AB02", + "AB03", + "AB04", + "AB05", + "AB06", + "AB07", + "AB08", + "AB09", + "AB10", + "AB11", + "AB12", + "AB13", + "AB14", + "AB15", + "AB16", + "AB17", + "AB18", + "AB19", + "AB20", + "AB21", + "AB22", + "AB23", + "AB24", + "AB25", + "AB26", + "AB27", + "AB28", + "AB29", + "AB30", + "AB31", + "AB32", + "AB33", + "AB34", + "AB35", + "AB36", + "AB37", + "AB38", + "AB39", + "AB40", + "AB41", + "AB42", + "AB43", + "AB44", + "AB45", + "AB46", + "AB47", + "AB48", + "AB49", + "AB50", + "AB51", + "AB52", + "AB53", + "AB54", + "AB55", + "AB56", + "AB57", + "AB58", + "AB59", + "AB60", + "AB61", + "AB62", + "AB63", + "AB64", + "AB65", + "AB66", + "AB67", + "AB68", + "AB69", + "AB70", + "AB71", + "AB72", + "AB73", + "AB74", + "AB75", + "AB76", + "AB77", + "AB78", + "AB79", + "AB80", + "AB81", + "AB82", + "AB83", + "AB84", + "AB85", + "AB86", + "AB87", + "AB88", + "AB89", + "AB90", + "AB91", + "AB92", + "AB93", + "AB94", + "AB95", + "AB96", + "AB97", + "AB98", + "AB99", + "AC00", + "AC01", + "AC02", + "AC03", + "AC04", + "AC05", + "AC06", + "AC07", + "AC08", + "AC09", + "AC10", + "AC11", + "AC12", + "AC13", + "AC14", + "AC15", + "AC16", + "AC17", + "AC18", + "AC19", + "AC20", + "AC21", + "AC22", + "AC23", + "AC24", + "AC25", + "AC26", + "AC27", + "AC28", + "AC29", + "AC30", + "AC31", + "AC32", + "AC33", + "AC34", + "AC35", + "AC36", + "AC37", + "AC38", + "AC39", + "AC40", + "AC41", + "AC42", + "AC43", + "AC44", + "AC45", + "AC46", + "AC47", + "AC48", + "AC49", + "AC50", + "AC51", + "AC52", + "AC53", + "AC54", + "AC55", + "AC56", + "AC57", + "AC58", + "AC59", + "AC60", + "AC61", + "AC62", + "AC63", + "AC64", + "AC65", + "AC66", + "AC67", + "AC68", + "AC69", + "AC70", + "AC71", + "AC72", + "AC73", + "AC74", + "AC75", + "AC76", + "AC77", + "AC78", + "AC79", + "AC80", + "AC81", + "AC82", + "AC83", + "AC84", + "AC85", + "AC86", + "AC87", + "AC88", + "AC89", + "AC90", + "AC91", + "AC92", + "AC93", + "AC94", + "AC95", + "AC96", + "AC97", + "AC98", + "AC99", + "BB00", + "BB01", + "BB02", + "BB03", + "BB04", + "BB05", + "BB06", + "BB07", + "BB08", + "BB09", + "BB10", + "BB11", + "BB12", + "BB13", + "BB14", + "BB15", + "BB16", + "BB17", + "BB18", + "BB19", + "BB20", + "BB21", + "BB22", + "BB23", + "BB24", + "BB25", + "BB26", + "BB27", + "BB28", + "BB29", + "BB30", + "BB31", + "BB32", + "BB33", + "BB34", + "BB35", + "BB36", + "BB37", + "BB38", + "BB39", + "BB40", + "BB41", + "BB42", + "BB43", + "BB44", + "BB45", + "BB46", + "BB47", + "BB48", + "BB49", + "BB50", + "BB51", + "BB52", + "BB53", + "BB54", + "BB55", + "BB56", + "BB57", + "BB58", + "BB59", + "BB60", + "BB61", + "BB62", + "BB63", + "BB64", + "BB65", + "BB66", + "BB67", + "BB68", + "BB69", + "BB70", + "BB71", + "BB72", + "BB73", + "BB74", + "BB75", + "BB76", + "BB77", + "BB78", + "BB79", + "BB80", + "BB81", + "BB82", + "BB83", + "BB84", + "BB85", + "BB86", + "BB87", + "BB88", + "BB89", + "BB90", + "BB91", + "BB92", + "BB93", + "BB94", + "BB95", + "BB96", + "BB97", + "BB98", + "BB99", + "BC00", + "BC01", + "BC02", + "BC03", + "BC04", + "BC05", + "BC06", + "BC07", + "BC08", + "BC09", + "BC10", + "BC11", + "BC12", + "BC13", + "BC14", + "BC15", + "BC16", + "BC17", + "BC18", + "BC19", + "BC20", + "BC21", + "BC22", + "BC23", + "BC24", + "BC25", + "BC26", + "BC27", + "BC28", + "BC29", + "BC30", + "BC31", + "BC32", + "BC33", + "BC34", + "BC35", + "BC36", + "BC37", + "BC38", + "BC39", + "BC40", + "BC41", + "BC42", + "BC43", + "BC44", + "BC45", + "BC46", + "BC47", + "BC48", + "BC49", + "BC50", + "BC51", + "BC52", + "BC53", + "BC54", + "BC55", + "BC56", + "BC57", + "BC58", + "BC59", + "BC60", + "BC61", + "BC62", + "BC63", + "BC64", + "BC65", + "BC66", + "BC67", + "BC68", + "BC69", + "BC70", + "BC71", + "BC72", + "BC73", + "BC74", + "BC75", + "BC76", + "BC77", + "BC78", + "BC79", + "BC80", + "BC81", + "BC82", + "BC83", + "BC84", + "BC85", + "BC86", + "BC87", + "BC88", + "BC89", + "BC90", + "BC91", + "BC92", + "BC93", + "BC94", + "BC95", + "BC96", + "BC97", + "BC98", + "BC99", + "QB90", + "QB91", + "QB92", + "QB93", + "QB94", + "QB95", + "QB96", + "QB97", + "QB98", + "QB99", + "QC90", + "QC91", + "QC92", + "QC93", + "QC94", + "QC95", + "QC96", + "QC97", + "QC98", + "QC99", + "RB00", + "RB01", + "RB02", + "RB03", + "RB04", + "RB05", + "RB06", + "RB07", + "RB08", + "RB09", + "RB10", + "RB11", + "RB12", + "RB13", + "RB14", + "RB15", + "RB16", + "RB17", + "RB18", + "RB19", + "RB20", + "RB21", + "RB22", + "RB23", + "RB24", + "RB25", + "RB26", + "RB27", + "RB28", + "RB29", + "RB30", + "RB31", + "RB32", + "RB33", + "RB34", + "RB35", + "RB36", + "RB37", + "RB38", + "RB39", + "RB40", + "RB41", + "RB42", + "RB43", + "RB44", + "RB45", + "RB46", + "RB47", + "RB48", + "RB49", + "RB50", + "RB51", + "RB52", + "RB53", + "RB54", + "RB55", + "RB56", + "RB57", + "RB58", + "RB59", + "RB60", + "RB61", + "RB62", + "RB63", + "RB64", + "RB65", + "RB66", + "RB67", + "RB68", + "RB69", + "RB70", + "RB71", + "RB72", + "RB73", + "RB74", + "RB75", + "RB76", + "RB77", + "RB78", + "RB79", + "RB80", + "RB81", + "RB82", + "RB83", + "RB84", + "RB85", + "RB86", + "RB87", + "RB88", + "RB89", + "RB90", + "RB91", + "RB92", + "RB93", + "RB94", + "RB95", + "RB96", + "RB97", + "RB98", + "RB99", + "RC00", + "RC01", + "RC02", + "RC03", + "RC04", + "RC05", + "RC06", + "RC07", + "RC08", + "RC09", + "RC10", + "RC11", + "RC12", + "RC13", + "RC14", + "RC15", + "RC16", + "RC17", + "RC18", + "RC19", + "RC20", + "RC21", + "RC22", + "RC23", + "RC24", + "RC25", + "RC26", + "RC27", + "RC28", + "RC29", + "RC30", + "RC31", + "RC32", + "RC33", + "RC34", + "RC35", + "RC36", + "RC37", + "RC38", + "RC39", + "RC40", + "RC41", + "RC42", + "RC43", + "RC44", + "RC45", + "RC46", + "RC47", + "RC48", + "RC49", + "RC50", + "RC51", + "RC52", + "RC53", + "RC54", + "RC55", + "RC56", + "RC57", + "RC58", + "RC59", + "RC60", + "RC61", + "RC62", + "RC63", + "RC64", + "RC65", + "RC66", + "RC67", + "RC68", + "RC69", + "RC70", + "RC71", + "RC72", + "RC73", + "RC74", + "RC75", + "RC76", + "RC77", + "RC78", + "RC79", + "RC80", + "RC81", + "RC82", + "RC83", + "RC84", + "RC85", + "RC86", + "RC87", + "RC88", + "RC89", + "RC90", + "RC91", + "RC92", + "RC93", + "RC94", + "RC95", + "RC96", + "RC97", + "RC98", + "RC99" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [160, -60], + [220, -60], + [220, -80], + [160, -80], + [160, -60] + ] + ] + }, + "properties": { "ituzone": "71" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "72": { + "mh": [ + "CB00", + "CB01", + "CB02", + "CB03", + "CB04", + "CB05", + "CB06", + "CB07", + "CB08", + "CB09", + "CB10", + "CB11", + "CB12", + "CB13", + "CB14", + "CB15", + "CB16", + "CB17", + "CB18", + "CB19", + "CB20", + "CB21", + "CB22", + "CB23", + "CB24", + "CB25", + "CB26", + "CB27", + "CB28", + "CB29", + "CB30", + "CB31", + "CB32", + "CB33", + "CB34", + "CB35", + "CB36", + "CB37", + "CB38", + "CB39", + "CB40", + "CB41", + "CB42", + "CB43", + "CB44", + "CB45", + "CB46", + "CB47", + "CB48", + "CB49", + "CB50", + "CB51", + "CB52", + "CB53", + "CB54", + "CB55", + "CB56", + "CB57", + "CB58", + "CB59", + "CB60", + "CB61", + "CB62", + "CB63", + "CB64", + "CB65", + "CB66", + "CB67", + "CB68", + "CB69", + "CB70", + "CB71", + "CB72", + "CB73", + "CB74", + "CB75", + "CB76", + "CB77", + "CB78", + "CB79", + "CB80", + "CB81", + "CB82", + "CB83", + "CB84", + "CB85", + "CB86", + "CB87", + "CB88", + "CB89", + "CB90", + "CB91", + "CB92", + "CB93", + "CB94", + "CB95", + "CB96", + "CB97", + "CB98", + "CB99", + "CC00", + "CC01", + "CC02", + "CC03", + "CC04", + "CC05", + "CC06", + "CC07", + "CC08", + "CC09", + "CC10", + "CC11", + "CC12", + "CC13", + "CC14", + "CC15", + "CC16", + "CC17", + "CC18", + "CC19", + "CC20", + "CC21", + "CC22", + "CC23", + "CC24", + "CC25", + "CC26", + "CC27", + "CC28", + "CC29", + "CC30", + "CC31", + "CC32", + "CC33", + "CC34", + "CC35", + "CC36", + "CC37", + "CC38", + "CC39", + "CC40", + "CC41", + "CC42", + "CC43", + "CC44", + "CC45", + "CC46", + "CC47", + "CC48", + "CC49", + "CC50", + "CC51", + "CC52", + "CC53", + "CC54", + "CC55", + "CC56", + "CC57", + "CC58", + "CC59", + "CC60", + "CC61", + "CC62", + "CC63", + "CC64", + "CC65", + "CC66", + "CC67", + "CC68", + "CC69", + "CC70", + "CC71", + "CC72", + "CC73", + "CC74", + "CC75", + "CC76", + "CC77", + "CC78", + "CC79", + "CC80", + "CC81", + "CC82", + "CC83", + "CC84", + "CC85", + "CC86", + "CC87", + "CC88", + "CC89", + "CC90", + "CC91", + "CC92", + "CC93", + "CC94", + "CC95", + "CC96", + "CC97", + "CC98", + "CC99", + "DB00", + "DB01", + "DB02", + "DB03", + "DB04", + "DB05", + "DB06", + "DB07", + "DB08", + "DB09", + "DB10", + "DB11", + "DB12", + "DB13", + "DB14", + "DB15", + "DB16", + "DB17", + "DB18", + "DB19", + "DB20", + "DB21", + "DB22", + "DB23", + "DB24", + "DB25", + "DB26", + "DB27", + "DB28", + "DB29", + "DB30", + "DB31", + "DB32", + "DB33", + "DB34", + "DB35", + "DB36", + "DB37", + "DB38", + "DB39", + "DB40", + "DB41", + "DB42", + "DB43", + "DB44", + "DB45", + "DB46", + "DB47", + "DB48", + "DB49", + "DB50", + "DB51", + "DB52", + "DB53", + "DB54", + "DB55", + "DB56", + "DB57", + "DB58", + "DB59", + "DB60", + "DB61", + "DB62", + "DB63", + "DB64", + "DB65", + "DB66", + "DB67", + "DB68", + "DB69", + "DB70", + "DB71", + "DB72", + "DB73", + "DB74", + "DB75", + "DB76", + "DB77", + "DB78", + "DB79", + "DB80", + "DB81", + "DB82", + "DB83", + "DB84", + "DB85", + "DB86", + "DB87", + "DB88", + "DB89", + "DB90", + "DB91", + "DB92", + "DB93", + "DB94", + "DB95", + "DB96", + "DB97", + "DB98", + "DB99", + "DC00", + "DC01", + "DC02", + "DC03", + "DC04", + "DC05", + "DC06", + "DC07", + "DC08", + "DC09", + "DC10", + "DC11", + "DC12", + "DC13", + "DC14", + "DC15", + "DC16", + "DC17", + "DC18", + "DC19", + "DC20", + "DC21", + "DC22", + "DC23", + "DC24", + "DC25", + "DC26", + "DC27", + "DC28", + "DC29", + "DC30", + "DC31", + "DC32", + "DC33", + "DC34", + "DC35", + "DC36", + "DC37", + "DC38", + "DC39", + "DC40", + "DC41", + "DC42", + "DC43", + "DC44", + "DC45", + "DC46", + "DC47", + "DC48", + "DC49", + "DC50", + "DC51", + "DC52", + "DC53", + "DC54", + "DC55", + "DC56", + "DC57", + "DC58", + "DC59", + "DC60", + "DC61", + "DC62", + "DC63", + "DC64", + "DC65", + "DC66", + "DC67", + "DC68", + "DC69", + "DC70", + "DC71", + "DC72", + "DC73", + "DC74", + "DC75", + "DC76", + "DC77", + "DC78", + "DC79", + "DC80", + "DC81", + "DC82", + "DC83", + "DC84", + "DC85", + "DC86", + "DC87", + "DC88", + "DC89", + "DC90", + "DC91", + "DC92", + "DC93", + "DC94", + "DC95", + "DC96", + "DC97", + "DC98", + "DC99", + "EB00", + "EB01", + "EB02", + "EB03", + "EB04", + "EB05", + "EB06", + "EB07", + "EB08", + "EB09", + "EB10", + "EB11", + "EB12", + "EB13", + "EB14", + "EB15", + "EB16", + "EB17", + "EB18", + "EB19", + "EB20", + "EB21", + "EB22", + "EB23", + "EB24", + "EB25", + "EB26", + "EB27", + "EB28", + "EB29", + "EB30", + "EB31", + "EB32", + "EB33", + "EB34", + "EB35", + "EB36", + "EB37", + "EB38", + "EB39", + "EB40", + "EB41", + "EB42", + "EB43", + "EB44", + "EB45", + "EB46", + "EB47", + "EB48", + "EB49", + "EB50", + "EB51", + "EB52", + "EB53", + "EB54", + "EB55", + "EB56", + "EB57", + "EB58", + "EB59", + "EB60", + "EB61", + "EB62", + "EB63", + "EB64", + "EB65", + "EB66", + "EB67", + "EB68", + "EB69", + "EB70", + "EB71", + "EB72", + "EB73", + "EB74", + "EB75", + "EB76", + "EB77", + "EB78", + "EB79", + "EB80", + "EB81", + "EB82", + "EB83", + "EB84", + "EB85", + "EB86", + "EB87", + "EB88", + "EB89", + "EB90", + "EB91", + "EB92", + "EB93", + "EB94", + "EB95", + "EB96", + "EB97", + "EB98", + "EB99", + "EC00", + "EC01", + "EC02", + "EC03", + "EC04", + "EC05", + "EC06", + "EC07", + "EC08", + "EC09", + "EC10", + "EC11", + "EC12", + "EC13", + "EC14", + "EC15", + "EC16", + "EC17", + "EC18", + "EC19", + "EC20", + "EC21", + "EC22", + "EC23", + "EC24", + "EC25", + "EC26", + "EC27", + "EC28", + "EC29", + "EC30", + "EC31", + "EC32", + "EC33", + "EC34", + "EC35", + "EC36", + "EC37", + "EC38", + "EC39", + "EC40", + "EC41", + "EC42", + "EC43", + "EC44", + "EC45", + "EC46", + "EC47", + "EC48", + "EC49", + "EC50", + "EC51", + "EC52", + "EC53", + "EC54", + "EC55", + "EC56", + "EC57", + "EC58", + "EC59", + "EC60", + "EC61", + "EC62", + "EC63", + "EC64", + "EC65", + "EC66", + "EC67", + "EC68", + "EC69", + "EC70", + "EC71", + "EC72", + "EC73", + "EC74", + "EC75", + "EC76", + "EC77", + "EC78", + "EC79", + "EC80", + "EC81", + "EC82", + "EC83", + "EC84", + "EC85", + "EC86", + "EC87", + "EC88", + "EC89", + "EC90", + "EC91", + "EC92", + "EC93", + "EC94", + "EC95", + "EC96", + "EC97", + "EC98", + "EC99" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-140, -60], + [-80, -60], + [-80, -80], + [-140, -80], + [-140, -60] + ] + ] + }, + "properties": { "ituzone": "72" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "73": { + "mh": [ + "FB00", + "FB01", + "FB02", + "FB03", + "FB04", + "FB05", + "FB06", + "FB07", + "FB08", + "FB09", + "FB10", + "FB11", + "FB12", + "FB13", + "FB14", + "FB15", + "FB16", + "FB17", + "FB18", + "FB19", + "FB20", + "FB21", + "FB22", + "FB23", + "FB24", + "FB25", + "FB26", + "FB27", + "FB28", + "FB29", + "FB30", + "FB31", + "FB32", + "FB33", + "FB34", + "FB35", + "FB36", + "FB37", + "FB38", + "FB39", + "FB40", + "FB41", + "FB42", + "FB43", + "FB44", + "FB45", + "FB46", + "FB47", + "FB48", + "FB49", + "FB50", + "FB51", + "FB52", + "FB53", + "FB54", + "FB55", + "FB56", + "FB57", + "FB58", + "FB59", + "FB60", + "FB61", + "FB62", + "FB63", + "FB64", + "FB65", + "FB66", + "FB67", + "FB68", + "FB69", + "FB70", + "FB71", + "FB72", + "FB73", + "FB74", + "FB75", + "FB76", + "FB77", + "FB78", + "FB79", + "FB80", + "FB81", + "FB82", + "FB83", + "FB84", + "FB85", + "FB86", + "FB87", + "FB88", + "FB89", + "FB90", + "FB91", + "FB92", + "FB93", + "FB94", + "FB95", + "FB96", + "FB97", + "FB98", + "FB99", + "FC00", + "FC01", + "FC02", + "FC03", + "FC04", + "FC05", + "FC06", + "FC07", + "FC08", + "FC09", + "FC10", + "FC11", + "FC12", + "FC13", + "FC14", + "FC15", + "FC16", + "FC17", + "FC18", + "FC19", + "FC20", + "FC21", + "FC22", + "FC23", + "FC24", + "FC25", + "FC26", + "FC27", + "FC28", + "FC29", + "FC30", + "FC31", + "FC32", + "FC33", + "FC34", + "FC35", + "FC36", + "FC37", + "FC38", + "FC39", + "FC40", + "FC41", + "FC42", + "FC43", + "FC44", + "FC45", + "FC46", + "FC47", + "FC48", + "FC49", + "FC50", + "FC51", + "FC52", + "FC53", + "FC54", + "FC55", + "FC56", + "FC57", + "FC58", + "FC59", + "FC60", + "FC61", + "FC62", + "FC63", + "FC64", + "FC65", + "FC66", + "FC67", + "FC68", + "FC69", + "FC70", + "FC71", + "FC72", + "FC73", + "FC74", + "FC75", + "FC76", + "FC77", + "FC78", + "FC79", + "FC80", + "FC81", + "FC82", + "FC83", + "FC84", + "FC85", + "FC86", + "FC87", + "FC88", + "FC89", + "FC90", + "FC91", + "FC92", + "FC93", + "FC94", + "FC95", + "FC96", + "FC97", + "FC98", + "FC99", + "GB00", + "GB01", + "GB02", + "GB03", + "GB04", + "GB05", + "GB06", + "GB07", + "GB08", + "GB09", + "GB10", + "GB11", + "GB12", + "GB13", + "GB14", + "GB15", + "GB16", + "GB17", + "GB18", + "GB19", + "GB20", + "GB21", + "GB22", + "GB23", + "GB24", + "GB25", + "GB26", + "GB27", + "GB28", + "GB29", + "GB30", + "GB31", + "GB32", + "GB33", + "GB34", + "GB35", + "GB36", + "GB37", + "GB38", + "GB39", + "GB40", + "GB41", + "GB42", + "GB43", + "GB44", + "GB45", + "GB46", + "GB47", + "GB48", + "GB49", + "GB50", + "GB51", + "GB52", + "GB53", + "GB54", + "GB55", + "GB56", + "GB57", + "GB58", + "GB59", + "GB60", + "GB61", + "GB62", + "GB63", + "GB64", + "GB65", + "GB66", + "GB67", + "GB68", + "GB69", + "GB70", + "GB71", + "GB72", + "GB73", + "GB74", + "GB75", + "GB76", + "GB77", + "GB78", + "GB79", + "GB80", + "GB81", + "GB82", + "GB83", + "GB84", + "GB85", + "GB86", + "GB87", + "GB88", + "GB89", + "GB90", + "GB91", + "GB92", + "GB93", + "GB94", + "GB95", + "GB96", + "GB97", + "GB98", + "GB99", + "GC00", + "GC01", + "GC02", + "GC03", + "GC04", + "GC05", + "GC06", + "GC07", + "GC08", + "GC09", + "GC10", + "GC11", + "GC12", + "GC13", + "GC14", + "GC15", + "GC16", + "GC17", + "GC18", + "GC19", + "GC20", + "GC21", + "GC22", + "GC23", + "GC24", + "GC25", + "GC26", + "GC27", + "GC28", + "GC29", + "GC30", + "GC31", + "GC32", + "GC33", + "GC34", + "GC35", + "GC36", + "GC37", + "GC38", + "GC39", + "GC40", + "GC41", + "GC42", + "GC43", + "GC44", + "GC45", + "GC46", + "GC47", + "GC48", + "GC49", + "GC50", + "GC51", + "GC52", + "GC53", + "GC54", + "GC55", + "GC56", + "GC57", + "GC58", + "GC59", + "GC60", + "GC61", + "GC62", + "GC63", + "GC64", + "GC65", + "GC66", + "GC67", + "GC68", + "GC69", + "GC70", + "GC71", + "GC72", + "GC73", + "GC74", + "GC75", + "GC76", + "GC77", + "GC78", + "GC79", + "GC80", + "GC81", + "GC82", + "GC83", + "GC84", + "GC85", + "GC86", + "GC87", + "GC88", + "GC89", + "GC90", + "GC91", + "GC92", + "GC93", + "GC94", + "GC95", + "GC96", + "GC97", + "GC98", + "GC99", + "GD20", + "GD21", + "GD22", + "GD23", + "GD24", + "GD25", + "GD26", + "GD27", + "GD28", + "GD29", + "GD30", + "GD31", + "GD32", + "GD33", + "GD34", + "GD35", + "GD36", + "GD37", + "GD38", + "GD39", + "GD40", + "GD41", + "GD42", + "GD43", + "GD44", + "GD45", + "GD46", + "GD47", + "GD48", + "GD49", + "GD50", + "GD51", + "GD52", + "GD53", + "GD54", + "GD55", + "GD56", + "GD57", + "GD58", + "GD59", + "GD60", + "GD61", + "GD62", + "GD63", + "GD64", + "GD65", + "GD66", + "GD67", + "GD68", + "GD69", + "GD70", + "GD71", + "GD72", + "GD73", + "GD74", + "GD75", + "GD76", + "GD77", + "GD78", + "GD79", + "GD80", + "GD81", + "GD82", + "GD83", + "GD84", + "GD85", + "GD86", + "GD87", + "GD88", + "GD89", + "GD90", + "GD91", + "GD92", + "GD93", + "GD94", + "GD95", + "GD96", + "GD97", + "GD98", + "GD99", + "HB00", + "HB01", + "HB02", + "HB03", + "HB04", + "HB05", + "HB06", + "HB07", + "HB08", + "HB09", + "HB10", + "HB11", + "HB12", + "HB13", + "HB14", + "HB15", + "HB16", + "HB17", + "HB18", + "HB19", + "HB20", + "HB21", + "HB22", + "HB23", + "HB24", + "HB25", + "HB26", + "HB27", + "HB28", + "HB29", + "HB30", + "HB31", + "HB32", + "HB33", + "HB34", + "HB35", + "HB36", + "HB37", + "HB38", + "HB39", + "HB40", + "HB41", + "HB42", + "HB43", + "HB44", + "HB45", + "HB46", + "HB47", + "HB48", + "HB49", + "HB50", + "HB51", + "HB52", + "HB53", + "HB54", + "HB55", + "HB56", + "HB57", + "HB58", + "HB59", + "HB60", + "HB61", + "HB62", + "HB63", + "HB64", + "HB65", + "HB66", + "HB67", + "HB68", + "HB69", + "HB70", + "HB71", + "HB72", + "HB73", + "HB74", + "HB75", + "HB76", + "HB77", + "HB78", + "HB79", + "HB80", + "HB81", + "HB82", + "HB83", + "HB84", + "HB85", + "HB86", + "HB87", + "HB88", + "HB89", + "HB90", + "HB91", + "HB92", + "HB93", + "HB94", + "HB95", + "HB96", + "HB97", + "HB98", + "HB99", + "HC00", + "HC01", + "HC02", + "HC03", + "HC04", + "HC05", + "HC06", + "HC07", + "HC08", + "HC09", + "HC10", + "HC11", + "HC12", + "HC13", + "HC14", + "HC15", + "HC16", + "HC17", + "HC18", + "HC19", + "HC20", + "HC21", + "HC22", + "HC23", + "HC24", + "HC25", + "HC26", + "HC27", + "HC28", + "HC29", + "HC30", + "HC31", + "HC32", + "HC33", + "HC34", + "HC35", + "HC36", + "HC37", + "HC38", + "HC39", + "HC40", + "HC41", + "HC42", + "HC43", + "HC44", + "HC45", + "HC46", + "HC47", + "HC48", + "HC49", + "HC50", + "HC51", + "HC52", + "HC53", + "HC54", + "HC55", + "HC56", + "HC57", + "HC58", + "HC59", + "HC60", + "HC61", + "HC62", + "HC63", + "HC64", + "HC65", + "HC66", + "HC67", + "HC68", + "HC69", + "HC70", + "HC71", + "HC72", + "HC73", + "HC74", + "HC75", + "HC76", + "HC77", + "HC78", + "HC79", + "HC80", + "HC81", + "HC82", + "HC83", + "HC84", + "HC85", + "HC86", + "HC87", + "HC88", + "HC89", + "HC90", + "HC91", + "HC92", + "HC93", + "HC94", + "HC95", + "HC96", + "HC97", + "HC98", + "HC99", + "HD00", + "HD01", + "HD02", + "HD03", + "HD04", + "HD05", + "HD06", + "HD07", + "HD08", + "HD09", + "HD10", + "HD11", + "HD12", + "HD13", + "HD14", + "HD15", + "HD16", + "HD17", + "HD18", + "HD19", + "HD20", + "HD21", + "HD22", + "HD23", + "HD24", + "HD25", + "HD26", + "HD27", + "HD28", + "HD29", + "HD30", + "HD31", + "HD32", + "HD33", + "HD34", + "HD35", + "HD36", + "HD37", + "HD38", + "HD39", + "HD40", + "HD41", + "HD42", + "HD43", + "HD44", + "HD45", + "HD46", + "HD47", + "HD48", + "HD49", + "HD50", + "HD51", + "HD52", + "HD53", + "HD54", + "HD55", + "HD56", + "HD57", + "HD58", + "HD59", + "HD60", + "HD61", + "HD62", + "HD63", + "HD64", + "HD65", + "HD66", + "HD67", + "HD68", + "HD69", + "HD70", + "HD71", + "HD72", + "HD73", + "HD74", + "HD75", + "HD76", + "HD77", + "HD78", + "HD79", + "HD80", + "HD81", + "HD82", + "HD83", + "HD84", + "HD85", + "HD86", + "HD87", + "HD88", + "HD89", + "HD90", + "HD91", + "HD92", + "HD93", + "HD94", + "HD95", + "HD96", + "HD97", + "HD98", + "HD99" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-80, -60], + [-55, -60], + [-55, -50], + [-20, -50], + [-20, -80], + [-80, -80], + [-80, -60] + ] + ] + }, + "properties": { "ituzone": "73" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "74": { + "mh": [ + "AA05", + "AA06", + "AA07", + "AA08", + "AA09", + "AA15", + "AA16", + "AA17", + "AA18", + "AA19", + "AA25", + "AA26", + "AA27", + "AA28", + "AA29", + "AA35", + "AA36", + "AA37", + "AA38", + "AA39", + "AA45", + "AA46", + "AA47", + "AA48", + "AA49", + "AA55", + "AA56", + "AA57", + "AA58", + "AA59", + "AA65", + "AA66", + "AA67", + "AA68", + "AA69", + "AA75", + "AA76", + "AA77", + "AA78", + "AA79", + "AA85", + "AA86", + "AA87", + "AA88", + "AA89", + "AA95", + "AA96", + "AA97", + "AA98", + "AA99", + "BA05", + "BA06", + "BA07", + "BA08", + "BA09", + "BA15", + "BA16", + "BA17", + "BA18", + "BA19", + "BA25", + "BA26", + "BA27", + "BA28", + "BA29", + "BA35", + "BA36", + "BA37", + "BA38", + "BA39", + "BA45", + "BA46", + "BA47", + "BA48", + "BA49", + "BA55", + "BA56", + "BA57", + "BA58", + "BA59", + "BA65", + "BA66", + "BA67", + "BA68", + "BA69", + "BA75", + "BA76", + "BA77", + "BA78", + "BA79", + "BA85", + "BA86", + "BA87", + "BA88", + "BA89", + "BA95", + "BA96", + "BA97", + "BA98", + "BA99", + "CA05", + "CA06", + "CA07", + "CA08", + "CA09", + "CA15", + "CA16", + "CA17", + "CA18", + "CA19", + "CA25", + "CA26", + "CA27", + "CA28", + "CA29", + "CA35", + "CA36", + "CA37", + "CA38", + "CA39", + "CA45", + "CA46", + "CA47", + "CA48", + "CA49", + "CA55", + "CA56", + "CA57", + "CA58", + "CA59", + "CA65", + "CA66", + "CA67", + "CA68", + "CA69", + "CA75", + "CA76", + "CA77", + "CA78", + "CA79", + "CA85", + "CA86", + "CA87", + "CA88", + "CA89", + "CA95", + "CA96", + "CA97", + "CA98", + "CA99", + "DA05", + "DA06", + "DA07", + "DA08", + "DA09", + "DA15", + "DA16", + "DA17", + "DA18", + "DA19", + "DA25", + "DA26", + "DA27", + "DA28", + "DA29", + "DA35", + "DA36", + "DA37", + "DA38", + "DA39", + "DA45", + "DA46", + "DA47", + "DA48", + "DA49", + "DA55", + "DA56", + "DA57", + "DA58", + "DA59", + "DA65", + "DA66", + "DA67", + "DA68", + "DA69", + "DA75", + "DA76", + "DA77", + "DA78", + "DA79", + "DA85", + "DA86", + "DA87", + "DA88", + "DA89", + "DA95", + "DA96", + "DA97", + "DA98", + "DA99", + "EA05", + "EA06", + "EA07", + "EA08", + "EA09", + "EA15", + "EA16", + "EA17", + "EA18", + "EA19", + "EA25", + "EA26", + "EA27", + "EA28", + "EA29", + "EA35", + "EA36", + "EA37", + "EA38", + "EA39", + "EA45", + "EA46", + "EA47", + "EA48", + "EA49", + "EA55", + "EA56", + "EA57", + "EA58", + "EA59", + "EA65", + "EA66", + "EA67", + "EA68", + "EA69", + "EA75", + "EA76", + "EA77", + "EA78", + "EA79", + "EA85", + "EA86", + "EA87", + "EA88", + "EA89", + "EA95", + "EA96", + "EA97", + "EA98", + "EA99", + "FA05", + "FA06", + "FA07", + "FA08", + "FA09", + "FA15", + "FA16", + "FA17", + "FA18", + "FA19", + "FA25", + "FA26", + "FA27", + "FA28", + "FA29", + "FA35", + "FA36", + "FA37", + "FA38", + "FA39", + "FA45", + "FA46", + "FA47", + "FA48", + "FA49", + "FA55", + "FA56", + "FA57", + "FA58", + "FA59", + "FA65", + "FA66", + "FA67", + "FA68", + "FA69", + "FA75", + "FA76", + "FA77", + "FA78", + "FA79", + "FA85", + "FA86", + "FA87", + "FA88", + "FA89", + "FA95", + "FA96", + "FA97", + "FA98", + "FA99", + "GA05", + "GA06", + "GA07", + "GA08", + "GA09", + "GA15", + "GA16", + "GA17", + "GA18", + "GA19", + "GA25", + "GA26", + "GA27", + "GA28", + "GA29", + "GA35", + "GA36", + "GA37", + "GA38", + "GA39", + "GA45", + "GA46", + "GA47", + "GA48", + "GA49", + "GA55", + "GA56", + "GA57", + "GA58", + "GA59", + "GA65", + "GA66", + "GA67", + "GA68", + "GA69", + "GA75", + "GA76", + "GA77", + "GA78", + "GA79", + "GA85", + "GA86", + "GA87", + "GA88", + "GA89", + "GA95", + "GA96", + "GA97", + "GA98", + "GA99", + "HA05", + "HA06", + "HA07", + "HA08", + "HA09", + "HA15", + "HA16", + "HA17", + "HA18", + "HA19", + "HA25", + "HA26", + "HA27", + "HA28", + "HA29", + "HA35", + "HA36", + "HA37", + "HA38", + "HA39", + "HA45", + "HA46", + "HA47", + "HA48", + "HA49", + "HA55", + "HA56", + "HA57", + "HA58", + "HA59", + "HA65", + "HA66", + "HA67", + "HA68", + "HA69", + "HA75", + "HA76", + "HA77", + "HA78", + "HA79", + "HA85", + "HA86", + "HA87", + "HA88", + "HA89", + "HA95", + "HA96", + "HA97", + "HA98", + "HA99", + "IA05", + "IA06", + "IA07", + "IA08", + "IA09", + "IA15", + "IA16", + "IA17", + "IA18", + "IA19", + "IA25", + "IA26", + "IA27", + "IA28", + "IA29", + "IA35", + "IA36", + "IA37", + "IA38", + "IA39", + "IA45", + "IA46", + "IA47", + "IA48", + "IA49", + "IA55", + "IA56", + "IA57", + "IA58", + "IA59", + "IA65", + "IA66", + "IA67", + "IA68", + "IA69", + "IA75", + "IA76", + "IA77", + "IA78", + "IA79", + "IA85", + "IA86", + "IA87", + "IA88", + "IA89", + "IA95", + "IA96", + "IA97", + "IA98", + "IA99", + "JA05", + "JA06", + "JA07", + "JA08", + "JA09", + "JA15", + "JA16", + "JA17", + "JA18", + "JA19", + "JA25", + "JA26", + "JA27", + "JA28", + "JA29", + "JA35", + "JA36", + "JA37", + "JA38", + "JA39", + "JA45", + "JA46", + "JA47", + "JA48", + "JA49", + "JA55", + "JA56", + "JA57", + "JA58", + "JA59", + "JA65", + "JA66", + "JA67", + "JA68", + "JA69", + "JA75", + "JA76", + "JA77", + "JA78", + "JA79", + "JA85", + "JA86", + "JA87", + "JA88", + "JA89", + "JA95", + "JA96", + "JA97", + "JA98", + "JA99", + "KA05", + "KA06", + "KA07", + "KA08", + "KA09", + "KA15", + "KA16", + "KA17", + "KA18", + "KA19", + "KA25", + "KA26", + "KA27", + "KA28", + "KA29", + "KA35", + "KA36", + "KA37", + "KA38", + "KA39", + "KA45", + "KA46", + "KA47", + "KA48", + "KA49", + "KA55", + "KA56", + "KA57", + "KA58", + "KA59", + "KA65", + "KA66", + "KA67", + "KA68", + "KA69", + "KA75", + "KA76", + "KA77", + "KA78", + "KA79", + "KA85", + "KA86", + "KA87", + "KA88", + "KA89", + "KA95", + "KA96", + "KA97", + "KA98", + "KA99", + "LA05", + "LA06", + "LA07", + "LA08", + "LA09", + "LA15", + "LA16", + "LA17", + "LA18", + "LA19", + "LA25", + "LA26", + "LA27", + "LA28", + "LA29", + "LA35", + "LA36", + "LA37", + "LA38", + "LA39", + "LA45", + "LA46", + "LA47", + "LA48", + "LA49", + "LA55", + "LA56", + "LA57", + "LA58", + "LA59", + "LA65", + "LA66", + "LA67", + "LA68", + "LA69", + "LA75", + "LA76", + "LA77", + "LA78", + "LA79", + "LA85", + "LA86", + "LA87", + "LA88", + "LA89", + "LA95", + "LA96", + "LA97", + "LA98", + "LA99", + "MA05", + "MA06", + "MA07", + "MA08", + "MA09", + "MA15", + "MA16", + "MA17", + "MA18", + "MA19", + "MA25", + "MA26", + "MA27", + "MA28", + "MA29", + "MA35", + "MA36", + "MA37", + "MA38", + "MA39", + "MA45", + "MA46", + "MA47", + "MA48", + "MA49", + "MA55", + "MA56", + "MA57", + "MA58", + "MA59", + "MA65", + "MA66", + "MA67", + "MA68", + "MA69", + "MA75", + "MA76", + "MA77", + "MA78", + "MA79", + "MA85", + "MA86", + "MA87", + "MA88", + "MA89", + "MA95", + "MA96", + "MA97", + "MA98", + "MA99", + "NA05", + "NA06", + "NA07", + "NA08", + "NA09", + "NA15", + "NA16", + "NA17", + "NA18", + "NA19", + "NA25", + "NA26", + "NA27", + "NA28", + "NA29", + "NA35", + "NA36", + "NA37", + "NA38", + "NA39", + "NA45", + "NA46", + "NA47", + "NA48", + "NA49", + "NA55", + "NA56", + "NA57", + "NA58", + "NA59", + "NA65", + "NA66", + "NA67", + "NA68", + "NA69", + "NA75", + "NA76", + "NA77", + "NA78", + "NA79", + "NA85", + "NA86", + "NA87", + "NA88", + "NA89", + "NA95", + "NA96", + "NA97", + "NA98", + "NA99", + "OA05", + "OA06", + "OA07", + "OA08", + "OA09", + "OA15", + "OA16", + "OA17", + "OA18", + "OA19", + "OA25", + "OA26", + "OA27", + "OA28", + "OA29", + "OA35", + "OA36", + "OA37", + "OA38", + "OA39", + "OA45", + "OA46", + "OA47", + "OA48", + "OA49", + "OA55", + "OA56", + "OA57", + "OA58", + "OA59", + "OA65", + "OA66", + "OA67", + "OA68", + "OA69", + "OA75", + "OA76", + "OA77", + "OA78", + "OA79", + "OA85", + "OA86", + "OA87", + "OA88", + "OA89", + "OA95", + "OA96", + "OA97", + "OA98", + "OA99", + "PA05", + "PA06", + "PA07", + "PA08", + "PA09", + "PA15", + "PA16", + "PA17", + "PA18", + "PA19", + "PA25", + "PA26", + "PA27", + "PA28", + "PA29", + "PA35", + "PA36", + "PA37", + "PA38", + "PA39", + "PA45", + "PA46", + "PA47", + "PA48", + "PA49", + "PA55", + "PA56", + "PA57", + "PA58", + "PA59", + "PA65", + "PA66", + "PA67", + "PA68", + "PA69", + "PA75", + "PA76", + "PA77", + "PA78", + "PA79", + "PA85", + "PA86", + "PA87", + "PA88", + "PA89", + "PA95", + "PA96", + "PA97", + "PA98", + "PA99", + "QA05", + "QA06", + "QA07", + "QA08", + "QA09", + "QA15", + "QA16", + "QA17", + "QA18", + "QA19", + "QA25", + "QA26", + "QA27", + "QA28", + "QA29", + "QA35", + "QA36", + "QA37", + "QA38", + "QA39", + "QA45", + "QA46", + "QA47", + "QA48", + "QA49", + "QA55", + "QA56", + "QA57", + "QA58", + "QA59", + "QA65", + "QA66", + "QA67", + "QA68", + "QA69", + "QA75", + "QA76", + "QA77", + "QA78", + "QA79", + "QA85", + "QA86", + "QA87", + "QA88", + "QA89", + "QA95", + "QA96", + "QA97", + "QA98", + "QA99", + "RA05", + "RA06", + "RA07", + "RA08", + "RA09", + "RA15", + "RA16", + "RA17", + "RA18", + "RA19", + "RA25", + "RA26", + "RA27", + "RA28", + "RA29", + "RA35", + "RA36", + "RA37", + "RA38", + "RA39", + "RA45", + "RA46", + "RA47", + "RA48", + "RA49", + "RA55", + "RA56", + "RA57", + "RA58", + "RA59", + "RA65", + "RA66", + "RA67", + "RA68", + "RA69", + "RA75", + "RA76", + "RA77", + "RA78", + "RA79", + "RA85", + "RA86", + "RA87", + "RA88", + "RA89", + "RA95", + "RA96", + "RA97", + "RA98", + "RA99" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-180, -80], + [180, -80], + [180, -90], + [-180, -90], + [-180, -80] + ] + ] + }, + "properties": { "ituzone": "74" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "75": { + "mh": [ + "AR00", + "AR01", + "AR02", + "AR03", + "AR04", + "AR10", + "AR11", + "AR12", + "AR13", + "AR14", + "AR20", + "AR21", + "AR22", + "AR23", + "AR24", + "AR30", + "AR31", + "AR32", + "AR33", + "AR34", + "AR40", + "AR41", + "AR42", + "AR43", + "AR44", + "AR50", + "AR51", + "AR52", + "AR53", + "AR54", + "AR60", + "AR61", + "AR62", + "AR63", + "AR64", + "AR70", + "AR71", + "AR72", + "AR73", + "AR74", + "AR80", + "AR81", + "AR82", + "AR83", + "AR84", + "AR90", + "AR91", + "AR92", + "AR93", + "AR94", + "BR00", + "BR01", + "BR02", + "BR03", + "BR04", + "BR10", + "BR11", + "BR12", + "BR13", + "BR14", + "BR20", + "BR21", + "BR22", + "BR23", + "BR24", + "BR30", + "BR31", + "BR32", + "BR33", + "BR34", + "BR40", + "BR41", + "BR42", + "BR43", + "BR44", + "BR50", + "BR51", + "BR52", + "BR53", + "BR54", + "BR60", + "BR61", + "BR62", + "BR63", + "BR64", + "BR70", + "BR71", + "BR72", + "BR73", + "BR74", + "BR80", + "BR81", + "BR82", + "BR83", + "BR84", + "BR90", + "BR91", + "BR92", + "BR93", + "BR94", + "CR00", + "CR01", + "CR02", + "CR03", + "CR04", + "CR10", + "CR11", + "CR12", + "CR13", + "CR14", + "CR20", + "CR21", + "CR22", + "CR23", + "CR24", + "CR30", + "CR31", + "CR32", + "CR33", + "CR34", + "CR40", + "CR41", + "CR42", + "CR43", + "CR44", + "CR50", + "CR51", + "CR52", + "CR53", + "CR54", + "CR60", + "CR61", + "CR62", + "CR63", + "CR64", + "CR70", + "CR71", + "CR72", + "CR73", + "CR74", + "CR80", + "CR81", + "CR82", + "CR83", + "CR84", + "CR90", + "CR91", + "CR92", + "CR93", + "CR94", + "DR00", + "DR01", + "DR02", + "DR03", + "DR04", + "DR10", + "DR11", + "DR12", + "DR13", + "DR14", + "DR20", + "DR21", + "DR22", + "DR23", + "DR24", + "DR30", + "DR31", + "DR32", + "DR33", + "DR34", + "DR40", + "DR41", + "DR42", + "DR43", + "DR44", + "DR50", + "DR51", + "DR52", + "DR53", + "DR54", + "DR60", + "DR61", + "DR62", + "DR63", + "DR64", + "DR70", + "DR71", + "DR72", + "DR73", + "DR74", + "DR80", + "DR81", + "DR82", + "DR83", + "DR84", + "DR90", + "DR91", + "DR92", + "DR93", + "DR94", + "ER00", + "ER01", + "ER02", + "ER03", + "ER04", + "ER10", + "ER11", + "ER12", + "ER13", + "ER14", + "ER20", + "ER21", + "ER22", + "ER23", + "ER24", + "ER30", + "ER31", + "ER32", + "ER33", + "ER34", + "ER40", + "ER41", + "ER42", + "ER43", + "ER44", + "ER50", + "ER51", + "ER52", + "ER53", + "ER54", + "ER60", + "ER61", + "ER62", + "ER63", + "ER64", + "ER70", + "ER71", + "ER72", + "ER73", + "ER74", + "ER80", + "ER81", + "ER82", + "ER83", + "ER84", + "ER90", + "ER91", + "ER92", + "ER93", + "ER94", + "FR00", + "FR01", + "FR02", + "FR03", + "FR04", + "FR10", + "FR11", + "FR12", + "FR13", + "FR14", + "FR20", + "FR21", + "FR22", + "FR23", + "FR24", + "FR30", + "FR31", + "FR32", + "FR33", + "FR34", + "FR40", + "FR41", + "FR42", + "FR43", + "FR44", + "FR50", + "FR51", + "FR52", + "FR53", + "FR54", + "FR60", + "FR61", + "FR62", + "FR63", + "FR64", + "FR70", + "FR71", + "FR72", + "FR73", + "FR74", + "FR80", + "FR81", + "FR82", + "FR83", + "FR84", + "FR90", + "FR91", + "FR92", + "FR93", + "FR94", + "GR00", + "GR01", + "GR02", + "GR03", + "GR04", + "GR10", + "GR11", + "GR12", + "GR13", + "GR14", + "GR20", + "GR21", + "GR22", + "GR23", + "GR24", + "GR30", + "GR31", + "GR32", + "GR33", + "GR34", + "GR40", + "GR41", + "GR42", + "GR43", + "GR44", + "GR50", + "GR51", + "GR52", + "GR53", + "GR54", + "GR60", + "GR61", + "GR62", + "GR63", + "GR64", + "GR70", + "GR71", + "GR72", + "GR73", + "GR74", + "GR80", + "GR81", + "GR82", + "GR83", + "GR84", + "GR90", + "GR91", + "GR92", + "GR93", + "GR94", + "HR00", + "HR01", + "HR02", + "HR03", + "HR04", + "HR10", + "HR11", + "HR12", + "HR13", + "HR14", + "HR20", + "HR21", + "HR22", + "HR23", + "HR24", + "HR30", + "HR31", + "HR32", + "HR33", + "HR34", + "HR40", + "HR41", + "HR42", + "HR43", + "HR44", + "HR50", + "HR51", + "HR52", + "HR53", + "HR54", + "HR60", + "HR61", + "HR62", + "HR63", + "HR64", + "HR70", + "HR71", + "HR72", + "HR73", + "HR74", + "HR80", + "HR81", + "HR82", + "HR83", + "HR84", + "HR90", + "HR91", + "HR92", + "HR93", + "HR94", + "IR00", + "IR01", + "IR02", + "IR03", + "IR04", + "IR10", + "IR11", + "IR12", + "IR13", + "IR14", + "IR20", + "IR21", + "IR22", + "IR23", + "IR24", + "IR30", + "IR31", + "IR32", + "IR33", + "IR34", + "IR40", + "IR41", + "IR42", + "IR43", + "IR44", + "IR50", + "IR51", + "IR52", + "IR53", + "IR54", + "IR60", + "IR61", + "IR62", + "IR63", + "IR64", + "IR70", + "IR71", + "IR72", + "IR73", + "IR74", + "IR80", + "IR81", + "IR82", + "IR83", + "IR84", + "IR90", + "IR91", + "IR92", + "IR93", + "IR94", + "JR00", + "JR01", + "JR02", + "JR03", + "JR04", + "JR10", + "JR11", + "JR12", + "JR13", + "JR14", + "JR20", + "JR21", + "JR22", + "JR23", + "JR24", + "JR30", + "JR31", + "JR32", + "JR33", + "JR34", + "JR40", + "JR41", + "JR42", + "JR43", + "JR44", + "JR50", + "JR51", + "JR52", + "JR53", + "JR54", + "JR60", + "JR61", + "JR62", + "JR63", + "JR64", + "JR70", + "JR71", + "JR72", + "JR73", + "JR74", + "JR80", + "JR81", + "JR82", + "JR83", + "JR84", + "JR90", + "JR91", + "JR92", + "JR93", + "JR94", + "KR00", + "KR01", + "KR02", + "KR03", + "KR04", + "KR10", + "KR11", + "KR12", + "KR13", + "KR14", + "KR20", + "KR21", + "KR22", + "KR23", + "KR24", + "KR30", + "KR31", + "KR32", + "KR33", + "KR34", + "KR40", + "KR41", + "KR42", + "KR43", + "KR44", + "KR50", + "KR51", + "KR52", + "KR53", + "KR54", + "KR60", + "KR61", + "KR62", + "KR63", + "KR64", + "KR70", + "KR71", + "KR72", + "KR73", + "KR74", + "KR80", + "KR81", + "KR82", + "KR83", + "KR84", + "KR90", + "KR91", + "KR92", + "KR93", + "KR94", + "LR00", + "LR01", + "LR02", + "LR03", + "LR04", + "LR10", + "LR11", + "LR12", + "LR13", + "LR14", + "LR20", + "LR21", + "LR22", + "LR23", + "LR24", + "LR30", + "LR31", + "LR32", + "LR33", + "LR34", + "LR40", + "LR41", + "LR42", + "LR43", + "LR44", + "LR50", + "LR51", + "LR52", + "LR53", + "LR54", + "LR60", + "LR61", + "LR62", + "LR63", + "LR64", + "LR70", + "LR71", + "LR72", + "LR73", + "LR74", + "LR80", + "LR81", + "LR82", + "LR83", + "LR84", + "LR90", + "LR91", + "LR92", + "LR93", + "LR94", + "MR00", + "MR01", + "MR02", + "MR03", + "MR04", + "MR10", + "MR11", + "MR12", + "MR13", + "MR14", + "MR20", + "MR21", + "MR22", + "MR23", + "MR24", + "MR30", + "MR31", + "MR32", + "MR33", + "MR34", + "MR40", + "MR41", + "MR42", + "MR43", + "MR44", + "MR50", + "MR51", + "MR52", + "MR53", + "MR54", + "MR60", + "MR61", + "MR62", + "MR63", + "MR64", + "MR70", + "MR71", + "MR72", + "MR73", + "MR74", + "MR80", + "MR81", + "MR82", + "MR83", + "MR84", + "MR90", + "MR91", + "MR92", + "MR93", + "MR94", + "NR00", + "NR01", + "NR02", + "NR03", + "NR04", + "NR10", + "NR11", + "NR12", + "NR13", + "NR14", + "NR20", + "NR21", + "NR22", + "NR23", + "NR24", + "NR30", + "NR31", + "NR32", + "NR33", + "NR34", + "NR40", + "NR41", + "NR42", + "NR43", + "NR44", + "NR50", + "NR51", + "NR52", + "NR53", + "NR54", + "NR60", + "NR61", + "NR62", + "NR63", + "NR64", + "NR70", + "NR71", + "NR72", + "NR73", + "NR74", + "NR80", + "NR81", + "NR82", + "NR83", + "NR84", + "NR90", + "NR91", + "NR92", + "NR93", + "NR94", + "OR00", + "OR01", + "OR02", + "OR03", + "OR04", + "OR10", + "OR11", + "OR12", + "OR13", + "OR14", + "OR20", + "OR21", + "OR22", + "OR23", + "OR24", + "OR30", + "OR31", + "OR32", + "OR33", + "OR34", + "OR40", + "OR41", + "OR42", + "OR43", + "OR44", + "OR50", + "OR51", + "OR52", + "OR53", + "OR54", + "OR60", + "OR61", + "OR62", + "OR63", + "OR64", + "OR70", + "OR71", + "OR72", + "OR73", + "OR74", + "OR80", + "OR81", + "OR82", + "OR83", + "OR84", + "OR90", + "OR91", + "OR92", + "OR93", + "OR94", + "PR00", + "PR01", + "PR02", + "PR03", + "PR04", + "PR10", + "PR11", + "PR12", + "PR13", + "PR14", + "PR20", + "PR21", + "PR22", + "PR23", + "PR24", + "PR30", + "PR31", + "PR32", + "PR33", + "PR34", + "PR40", + "PR41", + "PR42", + "PR43", + "PR44", + "PR50", + "PR51", + "PR52", + "PR53", + "PR54", + "PR60", + "PR61", + "PR62", + "PR63", + "PR64", + "PR70", + "PR71", + "PR72", + "PR73", + "PR74", + "PR80", + "PR81", + "PR82", + "PR83", + "PR84", + "PR90", + "PR91", + "PR92", + "PR93", + "PR94", + "QR00", + "QR01", + "QR02", + "QR03", + "QR04", + "QR10", + "QR11", + "QR12", + "QR13", + "QR14", + "QR20", + "QR21", + "QR22", + "QR23", + "QR24", + "QR30", + "QR31", + "QR32", + "QR33", + "QR34", + "QR40", + "QR41", + "QR42", + "QR43", + "QR44", + "QR50", + "QR51", + "QR52", + "QR53", + "QR54", + "QR60", + "QR61", + "QR62", + "QR63", + "QR64", + "QR70", + "QR71", + "QR72", + "QR73", + "QR74", + "QR80", + "QR81", + "QR82", + "QR83", + "QR84", + "QR90", + "QR91", + "QR92", + "QR93", + "QR94", + "RR00", + "RR01", + "RR02", + "RR03", + "RR04", + "RR10", + "RR11", + "RR12", + "RR13", + "RR14", + "RR20", + "RR21", + "RR22", + "RR23", + "RR24", + "RR30", + "RR31", + "RR32", + "RR33", + "RR34", + "RR40", + "RR41", + "RR42", + "RR43", + "RR44", + "RR50", + "RR51", + "RR52", + "RR53", + "RR54", + "RR60", + "RR61", + "RR62", + "RR63", + "RR64", + "RR70", + "RR71", + "RR72", + "RR73", + "RR74", + "RR80", + "RR81", + "RR82", + "RR83", + "RR84", + "RR90", + "RR91", + "RR92", + "RR93", + "RR94" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-180, 90], + [180, 90], + [180, 80], + [-180, 80], + [-180, 90] + ] + ] + }, + "properties": { "ituzone": "75" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "76": { + "mh": [ + "AM20", + "AM21", + "AM22", + "AM23", + "AM24", + "AM25", + "AM26", + "AM27", + "AM28", + "AM29", + "AM30", + "AM31", + "AM32", + "AM33", + "AM34", + "AM35", + "AM36", + "AM37", + "AM38", + "AM39", + "AM40", + "AM41", + "AM42", + "AM43", + "AM44", + "AM45", + "AM46", + "AM47", + "AM48", + "AM49", + "AM50", + "AM51", + "AM52", + "AM53", + "AM54", + "AM55", + "AM56", + "AM57", + "AM58", + "AM59", + "AM60", + "AM61", + "AM62", + "AM63", + "AM64", + "AM65", + "AM66", + "AM67", + "AM68", + "AM69", + "AM70", + "AM71", + "AM72", + "AM73", + "AM74", + "AM75", + "AM76", + "AM77", + "AM78", + "AM79", + "AM80", + "AM81", + "AM82", + "AM83", + "AM84", + "AM85", + "AM86", + "AM87", + "AM88", + "AM89", + "AM90", + "AM91", + "AM92", + "AM93", + "AM94", + "AM95", + "AM96", + "AM97", + "AM98", + "AM99", + "AN20", + "AN21", + "AN22", + "AN23", + "AN24", + "AN25", + "AN26", + "AN27", + "AN28", + "AN29", + "AN30", + "AN31", + "AN32", + "AN33", + "AN34", + "AN35", + "AN36", + "AN37", + "AN38", + "AN39", + "AN40", + "AN41", + "AN42", + "AN43", + "AN44", + "AN45", + "AN46", + "AN47", + "AN48", + "AN49", + "AN50", + "AN51", + "AN52", + "AN53", + "AN54", + "AN55", + "AN56", + "AN57", + "AN58", + "AN59", + "AN60", + "AN61", + "AN62", + "AN63", + "AN64", + "AN65", + "AN66", + "AN67", + "AN68", + "AN69", + "AN70", + "AN71", + "AN72", + "AN73", + "AN74", + "AN75", + "AN76", + "AN77", + "AN78", + "AN79", + "AN80", + "AN81", + "AN82", + "AN83", + "AN84", + "AN85", + "AN86", + "AN87", + "AN88", + "AN89", + "AN90", + "AN91", + "AN92", + "AN93", + "AN94", + "AN95", + "AN96", + "AN97", + "AN98", + "AN99", + "AO20", + "AO30", + "AO40", + "AO50", + "AO60", + "AO61", + "AO70", + "AO71", + "AO80", + "AO81", + "AO82", + "AO90", + "AO91", + "AO92", + "BM00", + "BM01", + "BM02", + "BM03", + "BM04", + "BM05", + "BM06", + "BM07", + "BM08", + "BM09", + "BM10", + "BM11", + "BM12", + "BM13", + "BM14", + "BM15", + "BM16", + "BM17", + "BM18", + "BM19", + "BM20", + "BM21", + "BM22", + "BM23", + "BM24", + "BM25", + "BM26", + "BM27", + "BM28", + "BM29", + "BM30", + "BM31", + "BM32", + "BM33", + "BM34", + "BM35", + "BM36", + "BM37", + "BM38", + "BM39", + "BM40", + "BM41", + "BM42", + "BM43", + "BM44", + "BM45", + "BM46", + "BM47", + "BM48", + "BM49", + "BM50", + "BM51", + "BM52", + "BM53", + "BM54", + "BM55", + "BM56", + "BM57", + "BM58", + "BM59", + "BM60", + "BM61", + "BM62", + "BM63", + "BM64", + "BM65", + "BM66", + "BM67", + "BM68", + "BM69", + "BM70", + "BM71", + "BM72", + "BM73", + "BM74", + "BM75", + "BM76", + "BM77", + "BM78", + "BM79", + "BM80", + "BM81", + "BM82", + "BM83", + "BM84", + "BM85", + "BM86", + "BM87", + "BM88", + "BM89", + "BM90", + "BM91", + "BM92", + "BM93", + "BM94", + "BM95", + "BM96", + "BM97", + "BM98", + "BM99", + "BN00", + "BN01", + "BN02", + "BN03", + "BN04", + "BN05", + "BN06", + "BN07", + "BN08", + "BN09", + "BN10", + "BN11", + "BN12", + "BN13", + "BN14", + "BN15", + "BN16", + "BN17", + "BN18", + "BN19", + "BN20", + "BN21", + "BN22", + "BN23", + "BN24", + "BN25", + "BN26", + "BN27", + "BN28", + "BN29", + "BN30", + "BN31", + "BN32", + "BN33", + "BN34", + "BN35", + "BN36", + "BN37", + "BN38", + "BN39", + "BN40", + "BN41", + "BN42", + "BN43", + "BN44", + "BN45", + "BN46", + "BN47", + "BN48", + "BN49", + "BN50", + "BN51", + "BN52", + "BN53", + "BN54", + "BN55", + "BN56", + "BN57", + "BN58", + "BN59", + "BN60", + "BN61", + "BN62", + "BN63", + "BN64", + "BN65", + "BN66", + "BN67", + "BN68", + "BN69", + "BN70", + "BN71", + "BN72", + "BN73", + "BN74", + "BN75", + "BN76", + "BN77", + "BN78", + "BN79", + "BN80", + "BN81", + "BN82", + "BN83", + "BN84", + "BN85", + "BN86", + "BN87", + "BN88", + "BN89", + "BN90", + "BN91", + "BN92", + "BN93", + "BN94", + "BN95", + "BN96", + "BN97", + "BN98", + "BN99", + "BO00", + "BO01", + "BO02", + "BO03", + "BO10", + "BO11", + "BO12", + "BO13", + "BO14", + "BO20", + "BO21", + "BO22", + "BO23", + "BO24", + "BO30", + "BO31", + "BO32", + "BO33", + "BO34", + "BO35", + "BO40", + "BO41", + "BO42", + "BO43", + "BO44", + "BO45", + "BO50", + "BO51", + "BO52", + "BO53", + "BO54", + "BO55", + "BO56", + "BO60", + "BO61", + "BO62", + "BO63", + "BO64", + "BO65", + "BO66", + "BO70", + "BO71", + "BO72", + "BO73", + "BO74", + "BO75", + "BO76", + "BO77", + "BO80", + "BO81", + "BO82", + "BO83", + "BO84", + "BO85", + "BO86", + "BO87", + "BO90", + "BO91", + "BO92", + "BO93", + "BO94", + "BO95", + "BO96", + "BO97", + "CM00", + "CM01", + "CM02", + "CM03", + "CM04", + "CM05", + "CM06", + "CM07", + "CM08", + "CM09", + "CM10", + "CM11", + "CM12", + "CM13", + "CM14", + "CM15", + "CM16", + "CM17", + "CM18", + "CM19", + "CM20", + "CM21", + "CM22", + "CM23", + "CM24", + "CM25", + "CM26", + "CM27", + "CM28", + "CM29", + "CM30", + "CM31", + "CM32", + "CM33", + "CM34", + "CM35", + "CM36", + "CM37", + "CM38", + "CM39", + "CM40", + "CM41", + "CM42", + "CM43", + "CM44", + "CM45", + "CM46", + "CM47", + "CM48", + "CM49", + "CM50", + "CM51", + "CM52", + "CM53", + "CM54", + "CM55", + "CM56", + "CM57", + "CM58", + "CM59", + "CM60", + "CM61", + "CM62", + "CM63", + "CM64", + "CM65", + "CM66", + "CM67", + "CM68", + "CM69", + "CM70", + "CM71", + "CM72", + "CM73", + "CM74", + "CM75", + "CM76", + "CM80", + "CM81", + "CN00", + "CN01", + "CN02", + "CN03", + "CN04", + "CN05", + "CN06", + "CN07", + "CN08", + "CN09", + "CN10", + "CN11", + "CN12", + "CN13", + "CN14", + "CN15", + "CN16", + "CN17", + "CN18", + "CN19", + "CN20", + "CN21", + "CN22", + "CN23", + "CN24", + "CN25", + "CN26", + "CN27", + "CN28", + "CN29", + "CN30", + "CN31", + "CN32", + "CN33", + "CN34", + "CN35", + "CN36", + "CN37", + "CN38", + "CN39", + "CN40", + "CN41", + "CN42", + "CN43", + "CN44", + "CN45", + "CN46", + "CN47", + "CN48", + "CN49", + "CN50", + "CN51", + "CN52", + "CN53", + "CN54", + "CN55", + "CN56", + "CN60", + "CN61", + "CO00", + "CO01", + "CO02", + "CO03", + "CO04", + "CO05", + "CO06", + "CO07", + "CO10", + "CO11", + "CO12", + "CO13", + "CO14", + "CO15", + "CO20", + "CO21", + "CO22", + "CO23", + "CO30", + "CO31" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-170, 50], + [-141, 58], + [-130.784, 48.57479], + [-124.63097, 32.46386], + [-123.1156, 30], + [-175, 30], + [-175, 50], + [-170, 50] + ] + ] + }, + "properties": { "ituzone": "76" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "77": { + "mh": [ + "BJ50", + "BJ51", + "BJ52", + "BJ53", + "BJ54", + "BJ55", + "BJ56", + "BJ57", + "BJ58", + "BJ59", + "BJ60", + "BJ61", + "BJ62", + "BJ63", + "BJ64", + "BJ65", + "BJ66", + "BJ67", + "BJ68", + "BJ69", + "BJ70", + "BJ71", + "BJ72", + "BJ73", + "BJ74", + "BJ75", + "BJ76", + "BJ77", + "BJ78", + "BJ79", + "BJ80", + "BJ81", + "BJ82", + "BJ83", + "BJ84", + "BJ85", + "BJ86", + "BJ87", + "BJ88", + "BJ89", + "BJ90", + "BJ91", + "BJ92", + "BJ93", + "BJ94", + "BJ95", + "BJ96", + "BJ97", + "BJ98", + "BJ99", + "BK50", + "BK51", + "BK52", + "BK53", + "BK54", + "BK55", + "BK56", + "BK57", + "BK58", + "BK59", + "BK60", + "BK61", + "BK62", + "BK63", + "BK64", + "BK65", + "BK66", + "BK67", + "BK68", + "BK69", + "BK70", + "BK71", + "BK72", + "BK73", + "BK74", + "BK75", + "BK76", + "BK77", + "BK78", + "BK79", + "BK80", + "BK81", + "BK82", + "BK83", + "BK84", + "BK85", + "BK86", + "BK87", + "BK88", + "BK89", + "BK90", + "BK91", + "BK92", + "BK93", + "BK94", + "BK95", + "BK96", + "BK97", + "BK98", + "BK99", + "BL50", + "BL51", + "BL52", + "BL53", + "BL54", + "BL55", + "BL56", + "BL57", + "BL58", + "BL59", + "BL60", + "BL61", + "BL62", + "BL63", + "BL64", + "BL65", + "BL66", + "BL67", + "BL68", + "BL69", + "BL70", + "BL71", + "BL72", + "BL73", + "BL74", + "BL75", + "BL76", + "BL77", + "BL78", + "BL79", + "BL80", + "BL81", + "BL82", + "BL83", + "BL84", + "BL85", + "BL86", + "BL87", + "BL88", + "BL89", + "BL90", + "BL91", + "BL92", + "BL93", + "BL94", + "BL95", + "BL96", + "BL97", + "BL98", + "BL99", + "CJ00", + "CJ01", + "CJ02", + "CJ03", + "CJ04", + "CJ05", + "CJ06", + "CJ07", + "CJ08", + "CJ09", + "CJ10", + "CJ11", + "CJ12", + "CJ13", + "CJ14", + "CJ15", + "CJ16", + "CJ17", + "CJ18", + "CJ19", + "CJ20", + "CJ21", + "CJ22", + "CJ23", + "CJ24", + "CJ25", + "CJ26", + "CJ27", + "CJ28", + "CJ29", + "CJ30", + "CJ31", + "CJ32", + "CJ33", + "CJ34", + "CJ35", + "CJ36", + "CJ37", + "CJ38", + "CJ39", + "CJ40", + "CJ41", + "CJ42", + "CJ43", + "CJ44", + "CJ45", + "CJ46", + "CJ47", + "CJ48", + "CJ49", + "CJ50", + "CJ51", + "CJ52", + "CJ53", + "CJ54", + "CJ55", + "CJ56", + "CJ57", + "CJ58", + "CJ59", + "CJ60", + "CJ61", + "CJ62", + "CJ63", + "CJ64", + "CJ65", + "CJ66", + "CJ67", + "CJ68", + "CJ69", + "CJ70", + "CJ71", + "CJ72", + "CJ73", + "CJ74", + "CJ75", + "CJ76", + "CJ77", + "CJ78", + "CJ79", + "CJ80", + "CJ81", + "CJ82", + "CJ83", + "CJ84", + "CJ85", + "CJ86", + "CJ87", + "CJ88", + "CJ89", + "CJ90", + "CJ91", + "CJ92", + "CJ93", + "CJ94", + "CJ95", + "CJ96", + "CJ97", + "CJ98", + "CJ99", + "CK00", + "CK01", + "CK02", + "CK03", + "CK04", + "CK05", + "CK06", + "CK07", + "CK08", + "CK09", + "CK10", + "CK11", + "CK12", + "CK13", + "CK14", + "CK15", + "CK16", + "CK17", + "CK18", + "CK19", + "CK20", + "CK21", + "CK22", + "CK23", + "CK24", + "CK25", + "CK26", + "CK27", + "CK28", + "CK29", + "CK30", + "CK31", + "CK32", + "CK33", + "CK34", + "CK35", + "CK36", + "CK37", + "CK38", + "CK39", + "CK40", + "CK41", + "CK42", + "CK43", + "CK44", + "CK45", + "CK46", + "CK47", + "CK48", + "CK49", + "CK50", + "CK51", + "CK52", + "CK53", + "CK54", + "CK55", + "CK56", + "CK57", + "CK58", + "CK59", + "CK60", + "CK61", + "CK62", + "CK63", + "CK64", + "CK65", + "CK66", + "CK67", + "CK68", + "CK69", + "CK70", + "CK71", + "CK72", + "CK73", + "CK74", + "CK75", + "CK76", + "CK77", + "CK78", + "CK79", + "CK80", + "CK81", + "CK82", + "CK83", + "CK84", + "CK85", + "CK86", + "CK87", + "CK88", + "CK89", + "CK90", + "CK91", + "CK92", + "CK93", + "CK94", + "CK95", + "CK96", + "CK97", + "CK98", + "CK99", + "CL00", + "CL01", + "CL02", + "CL03", + "CL04", + "CL05", + "CL06", + "CL07", + "CL08", + "CL09", + "CL10", + "CL11", + "CL12", + "CL13", + "CL14", + "CL15", + "CL16", + "CL17", + "CL18", + "CL19", + "CL20", + "CL21", + "CL22", + "CL23", + "CL24", + "CL25", + "CL26", + "CL27", + "CL28", + "CL29", + "CL30", + "CL31", + "CL32", + "CL33", + "CL34", + "CL35", + "CL36", + "CL37", + "CL38", + "CL39", + "CL40", + "CL41", + "CL42", + "CL43", + "CL44", + "CL45", + "CL46", + "CL47", + "CL48", + "CL49", + "CL50", + "CL51", + "CL52", + "CL53", + "CL54", + "CL55", + "CL56", + "CL57", + "CL58", + "CL59", + "CL60", + "CL61", + "CL62", + "CL63", + "CL64", + "CL65", + "CL66", + "CL67", + "CL68", + "CL69", + "CL70", + "CL71", + "CL72", + "CL73", + "CL74", + "CL75", + "CL76", + "CL77", + "CL78", + "CL79", + "CL80", + "CL81", + "CL82", + "CL83", + "CL84", + "CL85", + "CL86", + "CL87", + "CL88", + "CL89", + "CL90", + "CL91", + "CL92", + "CL93", + "CL94", + "CL95", + "CL96", + "CL97", + "DJ00", + "DJ01", + "DJ02", + "DJ03", + "DJ04", + "DJ05", + "DJ06", + "DJ07", + "DJ08", + "DJ09", + "DJ11", + "DJ12", + "DJ13", + "DJ14", + "DJ15", + "DJ16", + "DJ17", + "DJ18", + "DJ19", + "DJ22", + "DJ23", + "DJ24", + "DJ25", + "DJ26", + "DJ27", + "DJ28", + "DJ29", + "DJ33", + "DJ34", + "DJ35", + "DJ36", + "DJ37", + "DJ38", + "DJ39", + "DJ45", + "DJ46", + "DJ47", + "DJ48", + "DJ49", + "DK00", + "DK01", + "DK02", + "DK03", + "DK04", + "DK05", + "DK06", + "DK07", + "DK08", + "DK09", + "DK10", + "DK11", + "DK12", + "DK13", + "DK14", + "DK15", + "DK16", + "DK17", + "DK18", + "DK19", + "DK20", + "DK21", + "DK22", + "DK23", + "DK24", + "DK25", + "DK26", + "DK27", + "DK30", + "DK31", + "DK32", + "DK33", + "DL00", + "DL01", + "DL02", + "DL03", + "DL04", + "DL10", + "DL11" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-123.1156, 30], + [-109.89813, 6.32386], + [-120, 0], + [-150, 0], + [-150, 30], + [-123.1156, 30] + ] + ] + }, + "properties": { "ituzone": "77" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "78": { + "mh": [ + "DG62", + "DG63", + "DG64", + "DG65", + "DG66", + "DG67", + "DG68", + "DG69", + "DG71", + "DG72", + "DG73", + "DG74", + "DG75", + "DG76", + "DG77", + "DG78", + "DG79", + "DG81", + "DG82", + "DG83", + "DG84", + "DG85", + "DG86", + "DG87", + "DG88", + "DG89", + "DG91", + "DG92", + "DG93", + "DG94", + "DG95", + "DG96", + "DG97", + "DG98", + "DG99", + "DH37", + "DH38", + "DH39", + "DH44", + "DH45", + "DH46", + "DH47", + "DH48", + "DH49", + "DH51", + "DH52", + "DH53", + "DH54", + "DH55", + "DH56", + "DH57", + "DH58", + "DH59", + "DH60", + "DH61", + "DH62", + "DH63", + "DH64", + "DH65", + "DH66", + "DH67", + "DH68", + "DH69", + "DH70", + "DH71", + "DH72", + "DH73", + "DH74", + "DH75", + "DH76", + "DH77", + "DH78", + "DH79", + "DH80", + "DH81", + "DH82", + "DH83", + "DH84", + "DH85", + "DH86", + "DH87", + "DH88", + "DH89", + "DH90", + "DH91", + "DH92", + "DH93", + "DH94", + "DH95", + "DH96", + "DH97", + "DH98", + "DH99", + "DI06", + "DI07", + "DI08", + "DI09", + "DI13", + "DI14", + "DI15", + "DI16", + "DI17", + "DI18", + "DI19", + "DI20", + "DI21", + "DI22", + "DI23", + "DI24", + "DI25", + "DI26", + "DI27", + "DI28", + "DI29", + "DI30", + "DI31", + "DI32", + "DI33", + "DI34", + "DI35", + "DI36", + "DI37", + "DI38", + "DI39", + "DI40", + "DI41", + "DI42", + "DI43", + "DI44", + "DI45", + "DI46", + "DI47", + "DI48", + "DI49", + "DI50", + "DI51", + "DI52", + "DI53", + "DI54", + "DI55", + "DI56", + "DI57", + "DI58", + "DI59", + "DI60", + "DI61", + "DI62", + "DI63", + "DI64", + "DI65", + "DI66", + "DI67", + "DI68", + "DI69", + "DI70", + "DI71", + "DI72", + "DI73", + "DI74", + "DI75", + "DI76", + "DI77", + "DI78", + "DI79", + "DI80", + "DI81", + "DI82", + "DI83", + "DI84", + "DI85", + "DI86", + "DI87", + "DI88", + "DI89", + "DI90", + "DI91", + "DI92", + "DI93", + "DI94", + "DI95", + "DI96", + "DI97", + "DI98", + "DI99", + "DJ00", + "DJ01", + "DJ10", + "DJ11", + "DJ12", + "DJ20", + "DJ21", + "DJ22", + "DJ23", + "DJ30", + "DJ31", + "DJ32", + "DJ33", + "DJ34", + "DJ40", + "DJ41", + "DJ42", + "DJ43", + "DJ44", + "DJ45", + "DJ46", + "DJ50", + "DJ51", + "DJ52", + "DJ53", + "DJ54", + "DJ55", + "DJ56", + "DJ60", + "DJ61", + "DJ62", + "DJ63", + "DJ64", + "DJ65", + "DJ66", + "DJ70", + "DJ71", + "DJ72", + "DJ73", + "DJ74", + "DJ75", + "DJ76", + "DJ80", + "DJ81", + "DJ82", + "DJ83", + "DJ84", + "DJ85", + "DJ86", + "DJ90", + "DJ91", + "DJ92", + "DJ93", + "DJ94", + "DJ95", + "DJ96", + "EG01", + "EG02", + "EG03", + "EG04", + "EG05", + "EG06", + "EG07", + "EG08", + "EG09", + "EG11", + "EG12", + "EG13", + "EG14", + "EG15", + "EG16", + "EG17", + "EG18", + "EG19", + "EG21", + "EG22", + "EG23", + "EG24", + "EG25", + "EG26", + "EG27", + "EG28", + "EG29", + "EG31", + "EG32", + "EG33", + "EG34", + "EG35", + "EG36", + "EG37", + "EG38", + "EG39", + "EG41", + "EG42", + "EG43", + "EG44", + "EG45", + "EG46", + "EG47", + "EG48", + "EG49", + "EG51", + "EG52", + "EG53", + "EG54", + "EG55", + "EG56", + "EG57", + "EG58", + "EG59", + "EG61", + "EG62", + "EG63", + "EG64", + "EG65", + "EG66", + "EG67", + "EG68", + "EG69", + "EG71", + "EG72", + "EG73", + "EG74", + "EG75", + "EG76", + "EG77", + "EG78", + "EG79", + "EG81", + "EG82", + "EG83", + "EG84", + "EG85", + "EG86", + "EG87", + "EG88", + "EG89", + "EG91", + "EG92", + "EG93", + "EG94", + "EG95", + "EG96", + "EG97", + "EG98", + "EG99", + "EH00", + "EH01", + "EH02", + "EH03", + "EH04", + "EH05", + "EH06", + "EH07", + "EH08", + "EH09", + "EH10", + "EH11", + "EH12", + "EH13", + "EH14", + "EH15", + "EH16", + "EH17", + "EH18", + "EH19", + "EH20", + "EH21", + "EH22", + "EH23", + "EH24", + "EH25", + "EH26", + "EH27", + "EH28", + "EH29", + "EH30", + "EH31", + "EH32", + "EH33", + "EH34", + "EH35", + "EH36", + "EH37", + "EH38", + "EH39", + "EH40", + "EH41", + "EH42", + "EH43", + "EH44", + "EH45", + "EH46", + "EH47", + "EH48", + "EH49", + "EH50", + "EH51", + "EH52", + "EH53", + "EH54", + "EH55", + "EH56", + "EH57", + "EH58", + "EH59", + "EH60", + "EH61", + "EH62", + "EH63", + "EH64", + "EH65", + "EH66", + "EH67", + "EH68", + "EH69", + "EH70", + "EH71", + "EH72", + "EH73", + "EH74", + "EH75", + "EH76", + "EH77", + "EH78", + "EH80", + "EH81", + "EH82", + "EH83", + "EH84", + "EH85", + "EH86", + "EH87", + "EH90", + "EH91", + "EH92", + "EH93", + "EH94", + "EH95", + "EI00", + "EI01", + "EI02", + "EI03", + "EI04", + "EI05", + "EI06", + "EI07", + "EI08", + "EI09", + "EI10", + "EI11", + "EI12", + "EI13", + "EI14", + "EI15", + "EI16", + "EI17", + "EI18", + "EI19", + "EI20", + "EI21", + "EI22", + "EI23", + "EI24", + "EI25", + "EI26", + "EI27", + "EI28", + "EI29", + "EI30", + "EI31", + "EI32", + "EI33", + "EI34", + "EI35", + "EI36", + "EI37", + "EI38", + "EI39", + "EI40", + "EI41", + "EI42", + "EI43", + "EI50", + "EI51", + "EI52", + "EI60", + "EJ00", + "EJ01", + "EJ02", + "EJ03", + "EJ04", + "EJ05", + "EJ06", + "EJ10", + "EJ11", + "EJ12", + "EJ13", + "EJ14", + "EJ15", + "EJ16", + "EJ20", + "EJ21", + "EJ22", + "EJ23", + "EJ24", + "EJ25", + "EJ26", + "EJ30", + "EJ31", + "EJ32", + "EJ33", + "EJ34", + "EJ35", + "FG05", + "FG06", + "FG07", + "FG08", + "FG09", + "FH00", + "FH01", + "FH02", + "FH03", + "FH10", + "FH11", + "FH12" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-107, -28], + [-107, -20], + [-120, 0], + [-109.89813, 6.32386], + [-92.18997, 6.011], + [-92.02149, -5.96576], + [-77.10206, -18.33367], + [-82.24915, -28.94332], + [-107, -28] + ] + ] + }, + "properties": { "ituzone": "78" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "79": { + "mh": [ + "AD00", + "AD01", + "AD02", + "AD03", + "AD04", + "AD05", + "AD10", + "AD11", + "AD12", + "AD13", + "AD14", + "AD15", + "AD20", + "AD21", + "AD22", + "AD23", + "AD24", + "AD25", + "AD26", + "AD27", + "AD28", + "AD29", + "AD30", + "AD31", + "AD32", + "AD33", + "AD34", + "AD35", + "AD36", + "AD37", + "AD38", + "AD39", + "AD40", + "AD41", + "AD42", + "AD43", + "AD44", + "AD45", + "AD46", + "AD47", + "AD48", + "AD49", + "AD50", + "AD51", + "AD52", + "AD53", + "AD54", + "AD55", + "AD56", + "AD57", + "AD58", + "AD59", + "AD60", + "AD61", + "AD62", + "AD63", + "AD64", + "AD65", + "AD66", + "AD67", + "AD68", + "AD69", + "AD70", + "AD71", + "AD72", + "AD73", + "AD74", + "AD75", + "AD76", + "AD77", + "AD78", + "AD79", + "AD80", + "AD81", + "AD82", + "AD83", + "AD84", + "AD85", + "AD86", + "AD87", + "AD88", + "AD89", + "AD90", + "AD91", + "AD92", + "AD93", + "AD94", + "AD95", + "AD96", + "AD97", + "AD98", + "AD99", + "AE20", + "AE21", + "AE22", + "AE23", + "AE24", + "AE25", + "AE26", + "AE27", + "AE28", + "AE29", + "AE30", + "AE31", + "AE32", + "AE33", + "AE34", + "AE35", + "AE36", + "AE37", + "AE38", + "AE39", + "AE40", + "AE41", + "AE42", + "AE43", + "AE44", + "AE45", + "AE46", + "AE47", + "AE48", + "AE49", + "AE50", + "AE51", + "AE52", + "AE53", + "AE54", + "AE55", + "AE56", + "AE57", + "AE58", + "AE59", + "AE60", + "AE61", + "AE62", + "AE63", + "AE64", + "AE65", + "AE66", + "AE67", + "AE68", + "AE69", + "AE70", + "AE71", + "AE72", + "AE73", + "AE74", + "AE75", + "AE76", + "AE77", + "AE78", + "AE79", + "AE80", + "AE81", + "AE82", + "AE83", + "AE84", + "AE85", + "AE86", + "AE87", + "AE88", + "AE89", + "AE90", + "AE91", + "AE92", + "AE93", + "AE94", + "AE95", + "AE96", + "AE97", + "AE98", + "AE99", + "AF20", + "AF21", + "AF22", + "AF23", + "AF24", + "AF25", + "AF26", + "AF27", + "AF28", + "AF29", + "AF30", + "AF31", + "AF32", + "AF33", + "AF34", + "AF35", + "AF36", + "AF37", + "AF38", + "AF39", + "AF40", + "AF41", + "AF42", + "AF43", + "AF44", + "AF45", + "AF46", + "AF47", + "AF48", + "AF49", + "AF50", + "AF51", + "AF52", + "AF53", + "AF54", + "AF55", + "AF56", + "AF57", + "AF58", + "AF59", + "AF60", + "AF61", + "AF62", + "AF63", + "AF64", + "AF65", + "AF66", + "AF67", + "AF68", + "AF69", + "AF70", + "AF71", + "AF72", + "AF73", + "AF74", + "AF75", + "AF76", + "AF77", + "AF78", + "AF79", + "AF80", + "AF81", + "AF82", + "AF83", + "AF84", + "AF85", + "AF86", + "AF87", + "AF88", + "AF89", + "AF90", + "AF91", + "AF92", + "AF93", + "AF94", + "AF95", + "AF96", + "AF97", + "AF98", + "AF99", + "AG20", + "AG21", + "AG30", + "AG31", + "AG40", + "AG41", + "AG50", + "AG51", + "AG60", + "AG61", + "AG70", + "AG71", + "AG80", + "AG81", + "AG90", + "AG91", + "BD00", + "BD01", + "BD02", + "BD03", + "BD04", + "BD05", + "BD06", + "BD07", + "BD08", + "BD09", + "BD10", + "BD11", + "BD12", + "BD13", + "BD14", + "BD15", + "BD16", + "BD17", + "BD18", + "BD19", + "BD20", + "BD21", + "BD22", + "BD23", + "BD24", + "BD25", + "BD26", + "BD27", + "BD28", + "BD29", + "BD30", + "BD31", + "BD32", + "BD33", + "BD34", + "BD35", + "BD36", + "BD37", + "BD38", + "BD39", + "BD40", + "BD41", + "BD42", + "BD43", + "BD44", + "BD45", + "BD46", + "BD47", + "BD48", + "BD49", + "BD50", + "BD51", + "BD52", + "BD53", + "BD54", + "BD55", + "BD56", + "BD57", + "BD58", + "BD59", + "BD60", + "BD61", + "BD62", + "BD63", + "BD64", + "BD65", + "BD66", + "BD67", + "BD68", + "BD69", + "BD70", + "BD71", + "BD72", + "BD73", + "BD74", + "BD75", + "BD76", + "BD77", + "BD78", + "BD79", + "BD80", + "BD81", + "BD82", + "BD83", + "BD84", + "BD85", + "BD86", + "BD87", + "BD88", + "BD89", + "BD90", + "BD91", + "BD92", + "BD93", + "BD94", + "BD95", + "BD96", + "BD97", + "BD98", + "BD99", + "BE00", + "BE01", + "BE02", + "BE03", + "BE04", + "BE05", + "BE06", + "BE07", + "BE08", + "BE09", + "BE10", + "BE11", + "BE12", + "BE13", + "BE14", + "BE15", + "BE16", + "BE17", + "BE18", + "BE19", + "BE20", + "BE21", + "BE22", + "BE23", + "BE24", + "BE25", + "BE26", + "BE27", + "BE28", + "BE29", + "BE30", + "BE31", + "BE32", + "BE33", + "BE34", + "BE35", + "BE36", + "BE37", + "BE38", + "BE39", + "BE40", + "BE41", + "BE42", + "BE43", + "BE44", + "BE45", + "BE46", + "BE47", + "BE48", + "BE49", + "BE50", + "BE51", + "BE52", + "BE53", + "BE54", + "BE55", + "BE56", + "BE57", + "BE58", + "BE59", + "BE60", + "BE61", + "BE62", + "BE63", + "BE64", + "BE65", + "BE66", + "BE67", + "BE68", + "BE69", + "BE70", + "BE71", + "BE72", + "BE73", + "BE74", + "BE75", + "BE76", + "BE77", + "BE78", + "BE79", + "BE80", + "BE81", + "BE82", + "BE83", + "BE84", + "BE85", + "BE86", + "BE87", + "BE88", + "BE89", + "BE90", + "BE91", + "BE92", + "BE93", + "BE94", + "BE95", + "BE96", + "BE97", + "BE98", + "BE99", + "BF00", + "BF01", + "BF02", + "BF03", + "BF04", + "BF05", + "BF06", + "BF07", + "BF08", + "BF09", + "BF10", + "BF11", + "BF12", + "BF13", + "BF14", + "BF15", + "BF16", + "BF17", + "BF18", + "BF19", + "BF20", + "BF21", + "BF22", + "BF23", + "BF24", + "BF25", + "BF26", + "BF27", + "BF28", + "BF29", + "BF30", + "BF31", + "BF32", + "BF33", + "BF34", + "BF35", + "BF36", + "BF37", + "BF38", + "BF39", + "BF40", + "BF41", + "BF42", + "BF43", + "BF44", + "BF45", + "BF46", + "BF47", + "BF48", + "BF49", + "BF50", + "BF51", + "BF52", + "BF53", + "BF54", + "BF55", + "BF56", + "BF57", + "BF58", + "BF59", + "BF60", + "BF61", + "BF62", + "BF63", + "BF64", + "BF65", + "BF66", + "BF67", + "BF68", + "BF69", + "BF70", + "BF71", + "BF72", + "BF73", + "BF74", + "BF75", + "BF76", + "BF77", + "BF78", + "BF79", + "BF80", + "BF81", + "BF82", + "BF83", + "BF84", + "BF85", + "BF86", + "BF87", + "BF88", + "BF89", + "BF90", + "BF91", + "BF92", + "BF93", + "BF94", + "BF95", + "BF96", + "BF97", + "BF98", + "BF99", + "BG00", + "BG01", + "BG10", + "BG11", + "BG20", + "BG21", + "BG30", + "BG31", + "BG40", + "BG41", + "BG50", + "BG51", + "BG60", + "BG61", + "BG70", + "BG71", + "BG80", + "BG81", + "BG90", + "BG91" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-140, -28], + [-140, -60], + [-180, -60], + [-180, -55], + [-175, -55], + [-175, -28], + [-140, -28] + ] + ] + }, + "properties": { "ituzone": "79" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "80": { + "mh": [ + "CD00", + "CD01", + "CD02", + "CD03", + "CD04", + "CD05", + "CD06", + "CD07", + "CD08", + "CD09", + "CD10", + "CD11", + "CD12", + "CD13", + "CD14", + "CD15", + "CD16", + "CD17", + "CD18", + "CD19", + "CD20", + "CD21", + "CD22", + "CD23", + "CD24", + "CD25", + "CD26", + "CD27", + "CD28", + "CD29", + "CD30", + "CD31", + "CD32", + "CD33", + "CD34", + "CD35", + "CD36", + "CD37", + "CD38", + "CD39", + "CD40", + "CD41", + "CD42", + "CD43", + "CD44", + "CD45", + "CD46", + "CD47", + "CD48", + "CD49", + "CD50", + "CD51", + "CD52", + "CD53", + "CD54", + "CD55", + "CD56", + "CD57", + "CD58", + "CD59", + "CD60", + "CD61", + "CD62", + "CD63", + "CD64", + "CD65", + "CD66", + "CD67", + "CD68", + "CD69", + "CD70", + "CD71", + "CD72", + "CD73", + "CD74", + "CD75", + "CD76", + "CD77", + "CD78", + "CD79", + "CD80", + "CD81", + "CD82", + "CD83", + "CD84", + "CD85", + "CD86", + "CD87", + "CD88", + "CD89", + "CD90", + "CD91", + "CD92", + "CD93", + "CD94", + "CD95", + "CD96", + "CD97", + "CD98", + "CD99", + "CE00", + "CE01", + "CE02", + "CE03", + "CE04", + "CE05", + "CE06", + "CE07", + "CE08", + "CE09", + "CE10", + "CE11", + "CE12", + "CE13", + "CE14", + "CE15", + "CE16", + "CE17", + "CE18", + "CE19", + "CE20", + "CE21", + "CE22", + "CE23", + "CE24", + "CE25", + "CE26", + "CE27", + "CE28", + "CE29", + "CE30", + "CE31", + "CE32", + "CE33", + "CE34", + "CE35", + "CE36", + "CE37", + "CE38", + "CE39", + "CE40", + "CE41", + "CE42", + "CE43", + "CE44", + "CE45", + "CE46", + "CE47", + "CE48", + "CE49", + "CE50", + "CE51", + "CE52", + "CE53", + "CE54", + "CE55", + "CE56", + "CE57", + "CE58", + "CE59", + "CE60", + "CE61", + "CE62", + "CE63", + "CE64", + "CE65", + "CE66", + "CE67", + "CE68", + "CE69", + "CE70", + "CE71", + "CE72", + "CE73", + "CE74", + "CE75", + "CE76", + "CE77", + "CE78", + "CE79", + "CE80", + "CE81", + "CE82", + "CE83", + "CE84", + "CE85", + "CE86", + "CE87", + "CE88", + "CE89", + "CE90", + "CE91", + "CE92", + "CE93", + "CE94", + "CE95", + "CE96", + "CE97", + "CE98", + "CE99", + "CF00", + "CF01", + "CF02", + "CF03", + "CF04", + "CF05", + "CF06", + "CF07", + "CF08", + "CF09", + "CF10", + "CF11", + "CF12", + "CF13", + "CF14", + "CF15", + "CF16", + "CF17", + "CF18", + "CF19", + "CF20", + "CF21", + "CF22", + "CF23", + "CF24", + "CF25", + "CF26", + "CF27", + "CF28", + "CF29", + "CF30", + "CF31", + "CF32", + "CF33", + "CF34", + "CF35", + "CF36", + "CF37", + "CF38", + "CF39", + "CF40", + "CF41", + "CF42", + "CF43", + "CF44", + "CF45", + "CF46", + "CF47", + "CF48", + "CF49", + "CF50", + "CF51", + "CF52", + "CF53", + "CF54", + "CF55", + "CF56", + "CF57", + "CF58", + "CF59", + "CF60", + "CF61", + "CF62", + "CF63", + "CF64", + "CF65", + "CF66", + "CF67", + "CF68", + "CF69", + "CF70", + "CF71", + "CF72", + "CF73", + "CF74", + "CF75", + "CF76", + "CF77", + "CF78", + "CF79", + "CF80", + "CF81", + "CF82", + "CF83", + "CF84", + "CF85", + "CF86", + "CF87", + "CF88", + "CF89", + "CF90", + "CF91", + "CF92", + "CF93", + "CF94", + "CF95", + "CF96", + "CF97", + "CF98", + "CF99", + "CG00", + "CG01", + "CG10", + "CG11", + "CG20", + "CG21", + "CG30", + "CG31", + "CG40", + "CG41", + "CG50", + "CG51", + "CG60", + "CG61", + "CG70", + "CG71", + "CG80", + "CG81", + "CG90", + "CG91", + "DD00", + "DD01", + "DD02", + "DD03", + "DD04", + "DD05", + "DD06", + "DD07", + "DD08", + "DD09", + "DD10", + "DD11", + "DD12", + "DD13", + "DD14", + "DD15", + "DD16", + "DD17", + "DD18", + "DD19", + "DD20", + "DD21", + "DD22", + "DD23", + "DD24", + "DD25", + "DD26", + "DD27", + "DD28", + "DD29", + "DD30", + "DD31", + "DD32", + "DD33", + "DD34", + "DD35", + "DD36", + "DD37", + "DD38", + "DD39", + "DD40", + "DD41", + "DD42", + "DD43", + "DD44", + "DD45", + "DD46", + "DD47", + "DD48", + "DD49", + "DD50", + "DD51", + "DD52", + "DD53", + "DD54", + "DD55", + "DD56", + "DD57", + "DD58", + "DD59", + "DD60", + "DD61", + "DD62", + "DD63", + "DD64", + "DD65", + "DD66", + "DD67", + "DD68", + "DD69", + "DE00", + "DE01", + "DE02", + "DE03", + "DE04", + "DE05", + "DE06", + "DE07", + "DE08", + "DE09", + "DE10", + "DE11", + "DE12", + "DE13", + "DE14", + "DE15", + "DE16", + "DE17", + "DE18", + "DE19", + "DE20", + "DE21", + "DE22", + "DE23", + "DE24", + "DE25", + "DE26", + "DE27", + "DE28", + "DE29", + "DE30", + "DE31", + "DE32", + "DE33", + "DE34", + "DE35", + "DE36", + "DE37", + "DE38", + "DE39", + "DE40", + "DE41", + "DE42", + "DE43", + "DE44", + "DE45", + "DE46", + "DE47", + "DE48", + "DE49", + "DE50", + "DE51", + "DE52", + "DE53", + "DE54", + "DE55", + "DE56", + "DE57", + "DE58", + "DE59", + "DE60", + "DE61", + "DE62", + "DE63", + "DE64", + "DE65", + "DE66", + "DE67", + "DE68", + "DE69", + "DF00", + "DF01", + "DF02", + "DF03", + "DF04", + "DF05", + "DF06", + "DF07", + "DF08", + "DF09", + "DF10", + "DF11", + "DF12", + "DF13", + "DF14", + "DF15", + "DF16", + "DF17", + "DF18", + "DF19", + "DF20", + "DF21", + "DF22", + "DF23", + "DF24", + "DF25", + "DF26", + "DF27", + "DF28", + "DF29", + "DF30", + "DF31", + "DF32", + "DF33", + "DF34", + "DF35", + "DF36", + "DF37", + "DF38", + "DF39", + "DF40", + "DF41", + "DF42", + "DF43", + "DF44", + "DF45", + "DF46", + "DF47", + "DF48", + "DF49", + "DF50", + "DF51", + "DF52", + "DF53", + "DF54", + "DF55", + "DF56", + "DF57", + "DF58", + "DF59", + "DF60", + "DF61", + "DF62", + "DF63", + "DF64", + "DF65", + "DF66", + "DF67", + "DF68", + "DF69", + "DG00", + "DG01", + "DG10", + "DG11", + "DG20", + "DG21", + "DG30", + "DG31", + "DG40", + "DG41", + "DG50", + "DG51", + "DG60", + "DG61" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-140, -28], + [-107, -28], + [-107, -60], + [-140, -60], + [-140, -28] + ] + ] + }, + "properties": { "ituzone": "80" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "81": { + "mh": [ + "DD60", + "DD61", + "DD62", + "DD63", + "DD64", + "DD65", + "DD66", + "DD67", + "DD68", + "DD69", + "DD70", + "DD71", + "DD72", + "DD73", + "DD74", + "DD75", + "DD76", + "DD77", + "DD78", + "DD79", + "DD80", + "DD81", + "DD82", + "DD83", + "DD84", + "DD85", + "DD86", + "DD87", + "DD88", + "DD89", + "DD90", + "DD91", + "DD92", + "DD93", + "DD94", + "DD95", + "DD96", + "DD97", + "DD98", + "DD99", + "DE60", + "DE61", + "DE62", + "DE63", + "DE64", + "DE65", + "DE66", + "DE67", + "DE68", + "DE69", + "DE70", + "DE71", + "DE72", + "DE73", + "DE74", + "DE75", + "DE76", + "DE77", + "DE78", + "DE79", + "DE80", + "DE81", + "DE82", + "DE83", + "DE84", + "DE85", + "DE86", + "DE87", + "DE88", + "DE89", + "DE90", + "DE91", + "DE92", + "DE93", + "DE94", + "DE95", + "DE96", + "DE97", + "DE98", + "DE99", + "DF60", + "DF61", + "DF62", + "DF63", + "DF64", + "DF65", + "DF66", + "DF67", + "DF68", + "DF69", + "DF70", + "DF71", + "DF72", + "DF73", + "DF74", + "DF75", + "DF76", + "DF77", + "DF78", + "DF79", + "DF80", + "DF81", + "DF82", + "DF83", + "DF84", + "DF85", + "DF86", + "DF87", + "DF88", + "DF89", + "DF90", + "DF91", + "DF92", + "DF93", + "DF94", + "DF95", + "DF96", + "DF97", + "DF98", + "DF99", + "DG60", + "DG61", + "DG70", + "DG71", + "DG80", + "DG81", + "DG90", + "DG91", + "ED00", + "ED01", + "ED02", + "ED03", + "ED04", + "ED05", + "ED06", + "ED07", + "ED08", + "ED09", + "ED10", + "ED11", + "ED12", + "ED13", + "ED14", + "ED15", + "ED16", + "ED17", + "ED18", + "ED19", + "ED20", + "ED21", + "ED22", + "ED23", + "ED24", + "ED25", + "ED26", + "ED27", + "ED28", + "ED29", + "ED30", + "ED31", + "ED32", + "ED33", + "ED34", + "ED35", + "ED36", + "ED37", + "ED38", + "ED39", + "ED40", + "ED41", + "ED42", + "ED43", + "ED44", + "ED45", + "ED46", + "ED47", + "ED48", + "ED49", + "ED50", + "ED51", + "ED52", + "ED53", + "ED54", + "ED55", + "ED56", + "ED57", + "ED58", + "ED59", + "ED60", + "ED61", + "ED62", + "ED63", + "ED64", + "ED65", + "ED66", + "ED67", + "ED68", + "ED69", + "ED70", + "ED71", + "ED72", + "ED73", + "ED74", + "ED75", + "ED76", + "ED77", + "ED78", + "ED79", + "ED80", + "ED81", + "ED82", + "ED83", + "ED84", + "ED85", + "ED86", + "ED87", + "ED88", + "ED89", + "ED90", + "ED91", + "ED92", + "ED93", + "ED94", + "ED95", + "ED96", + "ED97", + "ED98", + "ED99", + "EE00", + "EE01", + "EE02", + "EE03", + "EE04", + "EE05", + "EE06", + "EE07", + "EE08", + "EE09", + "EE10", + "EE11", + "EE12", + "EE13", + "EE14", + "EE15", + "EE16", + "EE17", + "EE18", + "EE19", + "EE20", + "EE21", + "EE22", + "EE23", + "EE24", + "EE25", + "EE26", + "EE27", + "EE28", + "EE29", + "EE30", + "EE31", + "EE32", + "EE33", + "EE34", + "EE35", + "EE36", + "EE37", + "EE38", + "EE39", + "EE40", + "EE41", + "EE42", + "EE43", + "EE44", + "EE45", + "EE46", + "EE47", + "EE48", + "EE49", + "EE50", + "EE51", + "EE52", + "EE53", + "EE54", + "EE55", + "EE56", + "EE57", + "EE58", + "EE59", + "EE60", + "EE61", + "EE62", + "EE63", + "EE64", + "EE65", + "EE66", + "EE67", + "EE68", + "EE69", + "EE70", + "EE71", + "EE72", + "EE73", + "EE74", + "EE75", + "EE76", + "EE77", + "EE78", + "EE79", + "EE80", + "EE81", + "EE82", + "EE83", + "EE84", + "EE85", + "EE86", + "EE87", + "EE88", + "EE89", + "EE90", + "EE91", + "EE92", + "EE93", + "EE94", + "EE95", + "EE96", + "EE97", + "EE98", + "EE99", + "EF00", + "EF01", + "EF02", + "EF03", + "EF04", + "EF05", + "EF06", + "EF07", + "EF08", + "EF09", + "EF10", + "EF11", + "EF12", + "EF13", + "EF14", + "EF15", + "EF16", + "EF17", + "EF18", + "EF19", + "EF20", + "EF21", + "EF22", + "EF23", + "EF24", + "EF25", + "EF26", + "EF27", + "EF28", + "EF29", + "EF30", + "EF31", + "EF32", + "EF33", + "EF34", + "EF35", + "EF36", + "EF37", + "EF38", + "EF39", + "EF40", + "EF41", + "EF42", + "EF43", + "EF44", + "EF45", + "EF46", + "EF47", + "EF48", + "EF49", + "EF50", + "EF51", + "EF52", + "EF53", + "EF54", + "EF55", + "EF56", + "EF57", + "EF58", + "EF59", + "EF60", + "EF61", + "EF62", + "EF63", + "EF64", + "EF65", + "EF66", + "EF67", + "EF68", + "EF69", + "EF70", + "EF71", + "EF72", + "EF73", + "EF74", + "EF75", + "EF76", + "EF77", + "EF78", + "EF79", + "EF80", + "EF81", + "EF82", + "EF83", + "EF84", + "EF85", + "EF86", + "EF87", + "EF88", + "EF89", + "EF90", + "EF91", + "EF92", + "EF93", + "EF94", + "EF95", + "EF96", + "EF97", + "EF98", + "EF99", + "EG00", + "EG01", + "EG10", + "EG11", + "EG20", + "EG21", + "EG30", + "EG31", + "EG40", + "EG41", + "EG50", + "EG51", + "EG60", + "EG61", + "EG70", + "EG71", + "EG80", + "EG81", + "FD00", + "FD01", + "FD02", + "FD03", + "FD04", + "FD05", + "FD06", + "FD07", + "FD08", + "FD09", + "FE00", + "FE01", + "FE02", + "FE03", + "FE04", + "FE05", + "FE06", + "FE07", + "FE08", + "FE09", + "FF00", + "FF01", + "FF02" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-107, -28], + [-82.24915, -28.94332], + [-79.31855, -40], + [-78, -40], + [-78, -60], + [-107, -60], + [-107, -28] + ] + ] + }, + "properties": { "ituzone": "81" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "82": { + "mh": [ + "GN53", + "GN54", + "GN55", + "GN56", + "GN57", + "GN58", + "GN59", + "GN63", + "GN64", + "GN65", + "GN66", + "GN67", + "GN68", + "GN69", + "GN73", + "GN74", + "GN75", + "GN76", + "GN77", + "GN78", + "GN79", + "GN83", + "GN84", + "GN85", + "GN86", + "GN87", + "GN88", + "GN89", + "GN93", + "GN94", + "GN95", + "GN96", + "GN97", + "GN98", + "GN99", + "GO50", + "GO51", + "GO52", + "GO53", + "GO54", + "GO60", + "GO61", + "GO62", + "GO63", + "GO64", + "GO70", + "GO71", + "GO72", + "GO73", + "GO74", + "GO75", + "GO80", + "GO81", + "GO82", + "GO83", + "GO84", + "GO85", + "GO90", + "GO91", + "GO92", + "GO93", + "GO94", + "GO95", + "HN03", + "HN04", + "HN05", + "HN06", + "HN07", + "HN08", + "HN09", + "HN14", + "HN15", + "HN16", + "HN17", + "HN18", + "HN19", + "HN24", + "HN25", + "HN26", + "HN27", + "HN28", + "HN29", + "HN34", + "HN35", + "HN36", + "HN37", + "HN38", + "HN39", + "HN44", + "HN45", + "HN46", + "HN47", + "HN48", + "HN49", + "HN54", + "HN55", + "HN56", + "HN57", + "HN58", + "HN59", + "HN64", + "HN65", + "HN66", + "HN67", + "HN68", + "HN69", + "HN74", + "HN75", + "HN76", + "HN77", + "HN78", + "HN79", + "HN84", + "HN85", + "HN86", + "HN87", + "HN88", + "HN89", + "HN94", + "HN95", + "HN96", + "HN97", + "HN98", + "HN99", + "HO00", + "HO01", + "HO02", + "HO03", + "HO04", + "HO05", + "HO06", + "HO10", + "HO11", + "HO12", + "HO13", + "HO14", + "HO15", + "HO16", + "HO20", + "HO21", + "HO22", + "HO23", + "HO24", + "HO25", + "HO26", + "HO30", + "HO31", + "HO32", + "HO33", + "HO34", + "HO35", + "HO36", + "HO37", + "HO40", + "HO41", + "HO42", + "HO43", + "HO44", + "HO45", + "HO46", + "HO47", + "HO50", + "HO51", + "HO52", + "HO53", + "HO54", + "HO55", + "HO56", + "HO57", + "HO60", + "HO61", + "HO62", + "HO63", + "HO64", + "HO65", + "HO66", + "HO67", + "HO68", + "HO70", + "HO71", + "HO72", + "HO73", + "HO74", + "HO75", + "HO76", + "HO77", + "HO78", + "HO80", + "HO81", + "HO82", + "HO83", + "HO84", + "HO85", + "HO86", + "HO87", + "HO88", + "HO89", + "HO90", + "HO91", + "HO92", + "HO93", + "HO94", + "HO95", + "HO96", + "HO97", + "HO98", + "HO99", + "IN04", + "IN05", + "IN06", + "IN07", + "IN08", + "IN09", + "IN14", + "IN15", + "IN16", + "IN17", + "IN18", + "IN19", + "IN24", + "IN25", + "IN26", + "IN27", + "IN28", + "IN29", + "IN34", + "IN35", + "IN36", + "IN37", + "IN38", + "IN39", + "IO00", + "IO01", + "IO02", + "IO03", + "IO04", + "IO05", + "IO06", + "IO07", + "IO08", + "IO09", + "IO10", + "IO11", + "IO12", + "IO13", + "IO14", + "IO15", + "IO16", + "IO17", + "IO18", + "IO19", + "IO20", + "IO21", + "IO22", + "IO23", + "IO24", + "IO25", + "IO26", + "IO27", + "IO28", + "IO29", + "IO30", + "IO31", + "IO32", + "IO33", + "IO34", + "IO35", + "IO36", + "IO37", + "IO38", + "IO39", + "IP10", + "IP20", + "IP30" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-14, 60.35968], + [-13, 44], + [-40, 44], + [-40, 43], + [-50, 43], + [-50, 54], + [-14, 60.35968] + ] + ] + }, + "properties": { "ituzone": "82" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "83": { + "mh": [ + "GJ09", + "GJ18", + "GJ19", + "GJ27", + "GJ28", + "GJ29", + "GJ37", + "GJ38", + "GJ39", + "GJ47", + "GJ48", + "GJ49", + "GJ57", + "GJ58", + "GJ59", + "GJ67", + "GJ68", + "GJ69", + "GJ77", + "GJ78", + "GJ79", + "GJ87", + "GJ88", + "GJ89", + "GJ97", + "GJ98", + "GJ99", + "GK10", + "GK11", + "GK12", + "GK13", + "GK14", + "GK15", + "GK16", + "GK17", + "GK18", + "GK19", + "GK20", + "GK21", + "GK22", + "GK23", + "GK24", + "GK25", + "GK26", + "GK27", + "GK28", + "GK29", + "GK30", + "GK31", + "GK32", + "GK33", + "GK34", + "GK35", + "GK36", + "GK37", + "GK38", + "GK39", + "GK40", + "GK41", + "GK42", + "GK43", + "GK44", + "GK45", + "GK46", + "GK47", + "GK48", + "GK49", + "GK50", + "GK51", + "GK52", + "GK53", + "GK54", + "GK55", + "GK56", + "GK57", + "GK58", + "GK59", + "GK60", + "GK61", + "GK62", + "GK63", + "GK64", + "GK65", + "GK66", + "GK67", + "GK68", + "GK69", + "GK70", + "GK71", + "GK72", + "GK73", + "GK74", + "GK75", + "GK76", + "GK77", + "GK78", + "GK79", + "GK80", + "GK81", + "GK82", + "GK83", + "GK84", + "GK85", + "GK86", + "GK87", + "GK88", + "GK89", + "GK90", + "GK91", + "GK92", + "GK93", + "GK94", + "GK95", + "GK96", + "GK97", + "GK98", + "GK99", + "GL10", + "GL11", + "GL12", + "GL13", + "GL14", + "GL15", + "GL16", + "GL17", + "GL18", + "GL19", + "GL20", + "GL21", + "GL22", + "GL23", + "GL24", + "GL25", + "GL26", + "GL27", + "GL28", + "GL29", + "GL30", + "GL31", + "GL32", + "GL33", + "GL34", + "GL35", + "GL36", + "GL37", + "GL38", + "GL39", + "GL40", + "GL41", + "GL42", + "GL43", + "GL44", + "GL45", + "GL46", + "GL47", + "GL48", + "GL49", + "GL50", + "GL51", + "GL52", + "GL53", + "GL54", + "GL55", + "GL56", + "GL57", + "GL58", + "GL59", + "GL60", + "GL61", + "GL62", + "GL63", + "GL64", + "GL65", + "GL66", + "GL67", + "GL68", + "GL69", + "GL70", + "GL71", + "GL72", + "GL73", + "GL74", + "GL75", + "GL76", + "GL77", + "GL78", + "GL79", + "GL80", + "GL81", + "GL82", + "GL83", + "GL84", + "GL85", + "GL86", + "GL87", + "GL88", + "GL89", + "GL90", + "GL91", + "GL92", + "GL93", + "GL94", + "GL95", + "GL96", + "GL97", + "GL98", + "GL99", + "GM10", + "GM11", + "GM12", + "GM13", + "GM14", + "GM15", + "GM16", + "GM17", + "GM18", + "GM19", + "GM20", + "GM21", + "GM22", + "GM23", + "GM24", + "GM25", + "GM26", + "GM27", + "GM28", + "GM29", + "GM30", + "GM31", + "GM32", + "GM33", + "GM34", + "GM35", + "GM36", + "GM37", + "GM38", + "GM39", + "GM40", + "GM41", + "GM42", + "GM43", + "GM44", + "GM45", + "GM46", + "GM47", + "GM48", + "GM49", + "GM50", + "GM51", + "GM52", + "GM53", + "GM54", + "GM55", + "GM56", + "GM57", + "GM58", + "GM59", + "GM60", + "GM61", + "GM62", + "GM63", + "GM64", + "GM65", + "GM66", + "GM67", + "GM68", + "GM69", + "GM70", + "GM71", + "GM72", + "GM73", + "GM74", + "GM75", + "GM76", + "GM77", + "GM78", + "GM79", + "GM80", + "GM81", + "GM82", + "GM83", + "GM84", + "GM85", + "GM86", + "GM87", + "GM88", + "GM89", + "GM90", + "GM91", + "GM92", + "GM93", + "GM94", + "GM95", + "GM96", + "GM97", + "GM98", + "GM99", + "GN10", + "GN11", + "GN12", + "GN20", + "GN21", + "GN22", + "GN30", + "GN31", + "GN32", + "GN40", + "GN41", + "GN42", + "GN50", + "GN51", + "GN52", + "GN60", + "GN61", + "GN62", + "GN70", + "GN71", + "GN72", + "GN80", + "GN81", + "GN82", + "GN90", + "GN91", + "GN92", + "HJ07", + "HJ08", + "HJ09", + "HJ17", + "HJ18", + "HJ19", + "HJ27", + "HJ28", + "HJ29", + "HJ37", + "HJ38", + "HJ39", + "HJ47", + "HJ48", + "HJ49", + "HJ57", + "HJ58", + "HJ59", + "HK00", + "HK01", + "HK02", + "HK03", + "HK04", + "HK05", + "HK06", + "HK07", + "HK08", + "HK09", + "HK10", + "HK11", + "HK12", + "HK13", + "HK14", + "HK15", + "HK16", + "HK17", + "HK18", + "HK19", + "HK20", + "HK21", + "HK22", + "HK23", + "HK24", + "HK25", + "HK26", + "HK27", + "HK30", + "HK31", + "HK32", + "HK33", + "HK34", + "HK35", + "HK40", + "HK41", + "HK42", + "HL00", + "HL01", + "HL02", + "HL03", + "HL04", + "HL05", + "HL06", + "HL07", + "HL08", + "HL09", + "HL10", + "HM00", + "HM01", + "HM02", + "HM03", + "HM04", + "HM05", + "HM06", + "HM07", + "HM08", + "HM09", + "HN00", + "HN01", + "HN02" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-57, 43], + [-40, 43], + [-40, 23], + [-28, 7], + [-51.62045, 7], + [-60, 10], + [-57, 10], + [-57, 43] + ] + ] + }, + "properties": { "ituzone": "83" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "84": { + "mh": [ + "GE20", + "GE21", + "GE22", + "GE23", + "GE24", + "GE25", + "GE26", + "GE27", + "GE28", + "GE29", + "GE30", + "GE31", + "GE32", + "GE33", + "GE34", + "GE35", + "GE36", + "GE37", + "GE38", + "GE39", + "GE40", + "GE41", + "GE42", + "GE43", + "GE44", + "GE45", + "GE46", + "GE47", + "GE48", + "GE49", + "GE50", + "GE51", + "GE52", + "GE53", + "GE54", + "GE55", + "GE56", + "GE57", + "GE58", + "GE59", + "GE60", + "GE61", + "GE62", + "GE63", + "GE64", + "GE65", + "GE66", + "GE67", + "GE68", + "GE69", + "GE70", + "GE71", + "GE72", + "GE73", + "GE74", + "GE75", + "GE76", + "GE77", + "GE78", + "GE79", + "GE80", + "GE81", + "GE82", + "GE83", + "GE84", + "GE85", + "GE86", + "GE87", + "GE88", + "GE89", + "GE90", + "GE91", + "GE92", + "GE93", + "GE94", + "GE95", + "GE96", + "GE97", + "GE98", + "GE99", + "HE00", + "HE01", + "HE02", + "HE03", + "HE04", + "HE05", + "HE06", + "HE07", + "HE08", + "HE09", + "HE10", + "HE11", + "HE12", + "HE13", + "HE14", + "HE15", + "HE16", + "HE17", + "HE18", + "HE19", + "HE20", + "HE21", + "HE22", + "HE23", + "HE24", + "HE25", + "HE26", + "HE27", + "HE28", + "HE29", + "HE30", + "HE31", + "HE32", + "HE33", + "HE34", + "HE35", + "HE36", + "HE37", + "HE38", + "HE39", + "HE40", + "HE41", + "HE42", + "HE43", + "HE44", + "HE45", + "HE46", + "HE47", + "HE48", + "HE49", + "HE50", + "HE51", + "HE52", + "HE53", + "HE54", + "HE55", + "HE56", + "HE57", + "HE58", + "HE59", + "HE60", + "HE61", + "HE62", + "HE63", + "HE64", + "HE65", + "HE66", + "HE67", + "HE68", + "HE69", + "HE70", + "HE71", + "HE72", + "HE73", + "HE74", + "HE75", + "HE80", + "HE81", + "HE82", + "HE83", + "HE84", + "HE85", + "HE90", + "HE91", + "HE92", + "HE93", + "HE94", + "HE95" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-55, -40], + [-28, -40], + [-28, -45], + [-20, -45], + [-20, -50], + [-55, -50], + [-55, -40] + ] + ] + }, + "properties": { "ituzone": "84" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "85": { + "mh": [ + "IE00", + "IE01", + "IE02", + "IE03", + "IE04", + "IE05", + "IE10", + "IE11", + "IE12", + "IE13", + "IE14", + "IE15", + "IE20", + "IE21", + "IE22", + "IE23", + "IE24", + "IE25", + "IE30", + "IE31", + "IE32", + "IE33", + "IE34", + "IE35", + "IE40", + "IE41", + "IE42", + "IE43", + "IE44", + "IE45", + "IE50", + "IE51", + "IE52", + "IE53", + "IE54", + "IE55", + "IE60", + "IE61", + "IE62", + "IE63", + "IE64", + "IE65", + "IE70", + "IE71", + "IE72", + "IE73", + "IE74", + "IE75", + "IE80", + "IE81", + "IE82", + "IE83", + "IE84", + "IE85", + "IE90", + "IE91", + "IE92", + "IE93", + "IE94", + "IE95", + "JE00", + "JE01", + "JE02", + "JE03", + "JE04", + "JE05", + "JE10", + "JE11", + "JE12", + "JE13", + "JE14", + "JE15", + "JE20", + "JE21", + "JE22", + "JE23", + "JE24", + "JE25", + "JE26", + "JE27", + "JE28", + "JE29", + "JE30", + "JE31", + "JE32", + "JE33", + "JE34", + "JE35", + "JE36", + "JE37", + "JE38", + "JE39", + "JE40", + "JE41", + "JE42", + "JE43", + "JE44", + "JE45", + "JE46", + "JE47", + "JE48", + "JE49", + "JE50", + "JE51", + "JE52", + "JE53", + "JE54", + "JE55", + "JE56", + "JE57", + "JE58", + "JE59", + "JE60", + "JE61", + "JE62", + "JE63", + "JE64", + "JE65", + "JE66", + "JE67", + "JE68", + "JE69", + "JE70", + "JE71", + "JE72", + "JE73", + "JE74", + "JE75", + "JE76", + "JE77", + "JE78", + "JE79", + "JE80", + "JE81", + "JE82", + "JE83", + "JE84", + "JE85", + "JE86", + "JE90", + "JE91", + "JE92", + "JE93", + "JF20", + "JF21", + "JF22", + "JF23", + "JF24", + "JF25", + "JF26", + "JF27", + "JF28", + "JF29", + "JF30", + "JF31", + "JF32", + "JF33", + "JF34", + "JF35", + "JF36", + "JF37", + "JF38", + "JF39", + "JF40", + "JF41", + "JF42", + "JF43", + "JF44", + "JF45", + "JF46", + "JF47", + "JF48", + "JF49", + "JF50", + "JF51", + "JF52", + "JF53", + "JF54", + "JF55", + "JF56", + "JF57", + "JF58", + "JF60", + "JF61", + "JF62", + "JF63", + "JF64", + "JF70", + "JG20", + "JG21", + "JG22", + "JG23", + "JG24", + "JG25", + "JG26", + "JG27", + "JG28", + "JG29", + "JG30", + "JG31", + "JG32", + "JG33", + "JG34", + "JG35", + "JG36", + "JG37", + "JG40", + "JG41", + "JG42", + "JG43" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-20, -45], + [5, -45], + [5, -20], + [20, -50], + [-20, -50], + [-20, -45] + ] + ] + }, + "properties": { "ituzone": "85" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "86": { + "mh": [ + "LF05", + "LF06", + "LF07", + "LF08", + "LF09", + "LF15", + "LF16", + "LF17", + "LF18", + "LF19", + "LF25", + "LF26", + "LF27", + "LF28", + "LF29", + "LF35", + "LF36", + "LF37", + "LF38", + "LF39", + "LF45", + "LF46", + "LF47", + "LF48", + "LF49", + "LF55", + "LF56", + "LF57", + "LF58", + "LF59", + "LF65", + "LF66", + "LF67", + "LF68", + "LF69", + "LF75", + "LF76", + "LF77", + "LF78", + "LF79", + "LF85", + "LF86", + "LF87", + "LF88", + "LF89", + "LF95", + "LF96", + "LF97", + "LF98", + "LF99", + "LG00", + "LG01", + "LG02", + "LG03", + "LG10", + "LG11", + "LG12", + "LG13", + "LG20", + "LG21", + "LG22", + "LG23", + "LG30", + "LG31", + "LG32", + "LG33", + "LG40", + "LG41", + "LG42", + "LG43", + "LG50", + "LG51", + "LG52", + "LG53", + "LG60", + "LG61", + "LG62", + "LG63", + "LG70", + "LG71", + "LG72", + "LG73", + "LG80", + "LG81", + "LG82", + "LG83", + "LG90", + "LG91", + "LG92", + "LG93", + "MF05", + "MF06", + "MF07", + "MF08", + "MF09", + "MF15", + "MF16", + "MF17", + "MF18", + "MF19", + "MF25", + "MF26", + "MF27", + "MF28", + "MF29", + "MF35", + "MF36", + "MF37", + "MF38", + "MF39", + "MF45", + "MF46", + "MF47", + "MF48", + "MF49", + "MF55", + "MF56", + "MF57", + "MF58", + "MF59", + "MF65", + "MF66", + "MF67", + "MF68", + "MF69", + "MF75", + "MF76", + "MF77", + "MF78", + "MF79", + "MF85", + "MF86", + "MF87", + "MF88", + "MF89", + "MF95", + "MF96", + "MF97", + "MF98", + "MF99", + "MG00", + "MG01", + "MG02", + "MG03", + "MG04", + "MG05", + "MG10", + "MG11", + "MG12", + "MG13", + "MG14", + "MG15", + "MG16", + "MG17", + "MG18", + "MG20", + "MG21", + "MG22", + "MG23", + "MG24", + "MG25", + "MG26", + "MG27", + "MG28", + "MG29", + "MG30", + "MG31", + "MG32", + "MG33", + "MG34", + "MG35", + "MG36", + "MG37", + "MG38", + "MG39", + "MG40", + "MG41", + "MG42", + "MG43", + "MG44", + "MG45", + "MG46", + "MG47", + "MG48", + "MG49", + "MG50", + "MG51", + "MG52", + "MG53", + "MG54", + "MG55", + "MG56", + "MG57", + "MG58", + "MG59", + "MG60", + "MG61", + "MG62", + "MG63", + "MG64", + "MG65", + "MG66", + "MG67", + "MG68", + "MG69", + "MG70", + "MG71", + "MG72", + "MG73", + "MG74", + "MG75", + "MG76", + "MG77", + "MG78", + "MG79", + "MG80", + "MG81", + "MG82", + "MG83", + "MG84", + "MG85", + "MG86", + "MG87", + "MG88", + "MG89", + "MG90", + "MG91", + "MG92", + "MG93", + "MG94", + "MG95", + "MG96", + "MG97", + "MG98", + "MG99", + "MH14", + "MH15", + "MH16", + "MH17", + "MH18", + "MH19", + "MH20", + "MH21", + "MH22", + "MH23", + "MH24", + "MH25", + "MH26", + "MH27", + "MH28", + "MH29", + "MH30", + "MH31", + "MH32", + "MH33", + "MH34", + "MH35", + "MH36", + "MH37", + "MH38", + "MH39", + "MH40", + "MH41", + "MH42", + "MH43", + "MH44", + "MH45", + "MH46", + "MH47", + "MH48", + "MH49", + "MH50", + "MH51", + "MH52", + "MH53", + "MH54", + "MH55", + "MH56", + "MH57", + "MH58", + "MH59", + "MH60", + "MH61", + "MH62", + "MH63", + "MH64", + "MH65", + "MH66", + "MH67", + "MH68", + "MH69", + "MH70", + "MH71", + "MH72", + "MH73", + "MH74", + "MH75", + "MH76", + "MH77", + "MH78", + "MH79", + "MH80", + "MH81", + "MH82", + "MH83", + "MH84", + "MH85", + "MH86", + "MH87", + "MH88", + "MH89", + "MH90", + "MH91", + "MH92", + "MH93", + "MH94", + "MH95", + "MH96", + "MH97", + "MH98", + "MH99" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [40, -35], + [40, -27], + [60, -27], + [65, -20], + [62.46122, -10], + [80, -10], + [80, -35], + [40, -35] + ] + ] + }, + "properties": { "ituzone": "86" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "87": { + "mh": [ + "NF00", + "NF01", + "NF02", + "NF03", + "NF04", + "NF05", + "NF06", + "NF07", + "NF08", + "NF09", + "NF10", + "NF11", + "NF12", + "NF13", + "NF14", + "NF15", + "NF16", + "NF17", + "NF18", + "NF19", + "NF20", + "NF21", + "NF22", + "NF23", + "NF24", + "NF25", + "NF26", + "NF27", + "NF28", + "NF29", + "NF30", + "NF31", + "NF32", + "NF33", + "NF34", + "NF35", + "NF36", + "NF37", + "NF38", + "NF39", + "NF40", + "NF41", + "NF42", + "NF43", + "NF44", + "NF45", + "NF46", + "NF47", + "NF48", + "NF49", + "NF50", + "NF51", + "NF52", + "NF53", + "NF54", + "NF55", + "NF56", + "NF57", + "NF58", + "NF59", + "NF60", + "NF61", + "NF62", + "NF63", + "NF64", + "NF65", + "NF66", + "NF67", + "NF68", + "NF69", + "NF70", + "NF71", + "NF72", + "NF73", + "NF74", + "NF75", + "NF76", + "NF77", + "NF78", + "NF79", + "NF80", + "NF81", + "NF82", + "NF83", + "NF84", + "NF85", + "NF86", + "NF87", + "NF88", + "NF89", + "NF90", + "NF91", + "NF92", + "NF93", + "NF94", + "NF95", + "NF96", + "NF97", + "NF98", + "NF99", + "NG00", + "NG01", + "NG02", + "NG03", + "NG04", + "NG05", + "NG06", + "NG07", + "NG08", + "NG09", + "NG10", + "NG11", + "NG12", + "NG13", + "NG14", + "NG15", + "NG16", + "NG17", + "NG18", + "NG19", + "NG20", + "NG21", + "NG22", + "NG23", + "NG24", + "NG25", + "NG26", + "NG27", + "NG28", + "NG29", + "NG30", + "NG31", + "NG32", + "NG33", + "NG34", + "NG35", + "NG36", + "NG37", + "NG38", + "NG39", + "NG40", + "NG41", + "NG42", + "NG43", + "NG44", + "NG45", + "NG46", + "NG47", + "NG48", + "NG49", + "NG50", + "NG51", + "NG52", + "NG53", + "NG54", + "NG55", + "NG56", + "NG57", + "NG58", + "NG59", + "NG60", + "NG61", + "NG62", + "NG63", + "NG64", + "NG65", + "NG66", + "NG67", + "NG68", + "NG69", + "NG70", + "NG71", + "NG72", + "NG73", + "NG74", + "NG75", + "NG76", + "NG77", + "NG78", + "NG79", + "NG80", + "NG81", + "NG82", + "NG83", + "NG84", + "NG85", + "NG86", + "NG87", + "NG88", + "NG89", + "NG90", + "NG91", + "NG92", + "NG93", + "NG94", + "NG95", + "NG96", + "NG97", + "NG98", + "NG99", + "NH00", + "NH01", + "NH02", + "NH03", + "NH04", + "NH05", + "NH06", + "NH07", + "NH08", + "NH09", + "NH10", + "NH11", + "NH12", + "NH13", + "NH14", + "NH15", + "NH16", + "NH17", + "NH18", + "NH19", + "NH20", + "NH21", + "NH22", + "NH23", + "NH24", + "NH25", + "NH26", + "NH27", + "NH28", + "NH29", + "NH30", + "NH31", + "NH32", + "NH33", + "NH34", + "NH35", + "NH36", + "NH37", + "NH38", + "NH39", + "NH40", + "NH41", + "NH42", + "NH43", + "NH44", + "NH45", + "NH46", + "NH47", + "NH48", + "NH49", + "NH50", + "NH51", + "NH52", + "NH53", + "NH54", + "NH55", + "NH56", + "NH57", + "NH60", + "NH61", + "NH62", + "NH63", + "NH64", + "NH65", + "NH66", + "NH67", + "NH70", + "NH71", + "NH72", + "NH73", + "NH74", + "NH75", + "NH76", + "NH77", + "NH80", + "NH81", + "NH82", + "NH83", + "NH84", + "NH85", + "NH86", + "NH87", + "NH90", + "NH91", + "NH92", + "NH93", + "NH94", + "NH95", + "NH96", + "NH97", + "OF00", + "OF01", + "OF02", + "OF03", + "OF04", + "OF05", + "OF06", + "OF07", + "OF08", + "OF09", + "OF10", + "OF11", + "OF12", + "OF13", + "OF14", + "OF15", + "OF16", + "OF17", + "OF18", + "OF19", + "OF20", + "OF21", + "OF22", + "OF23", + "OF24", + "OF25", + "OF26", + "OF27", + "OF28", + "OF29", + "OF30", + "OF31", + "OF32", + "OF33", + "OF34", + "OF35", + "OF36", + "OF37", + "OF38", + "OF39", + "OF40", + "OF41", + "OF42", + "OF43", + "OF44", + "OF45", + "OF46", + "OF47", + "OF48", + "OF49", + "OG00", + "OG01", + "OG02", + "OG03", + "OG04", + "OG05", + "OG06", + "OG07", + "OG08", + "OG09", + "OG10", + "OG11", + "OG12", + "OG13", + "OG14", + "OG15", + "OG16", + "OG17", + "OG18", + "OG19", + "OG20", + "OG21", + "OG22", + "OG23", + "OG24", + "OG25", + "OG26", + "OG27", + "OG28", + "OG29", + "OG30", + "OG31", + "OG32", + "OG33", + "OG34", + "OG35", + "OG36", + "OG37", + "OG38", + "OG39", + "OG40", + "OG41", + "OG42", + "OG43", + "OG44", + "OG45", + "OG46", + "OG47", + "OG48", + "OG49", + "OH00", + "OH01", + "OH02", + "OH03", + "OH04", + "OH05", + "OH06", + "OH07", + "OH10", + "OH11", + "OH12", + "OH13", + "OH14", + "OH15", + "OH16", + "OH17", + "OH20", + "OH21", + "OH22", + "OH23", + "OH24", + "OH25", + "OH26", + "OH27", + "OH30", + "OH31", + "OH32", + "OH33", + "OH34", + "OH35", + "OH36", + "OH37", + "OH40", + "OH41", + "OH42", + "OH43", + "OH44", + "OH45", + "OH46", + "OH47" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [80, -40], + [80, -10], + [90, -10], + [90, -13], + [110, -13], + [110, -40], + [80, -40] + ] + ] + }, + "properties": { "ituzone": "87" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "88": { + "mh": [ + "ND00", + "ND01", + "ND02", + "ND03", + "ND04", + "ND05", + "ND06", + "ND07", + "ND08", + "ND09", + "ND10", + "ND11", + "ND12", + "ND13", + "ND14", + "ND15", + "ND16", + "ND17", + "ND18", + "ND19", + "ND20", + "ND21", + "ND22", + "ND23", + "ND24", + "ND25", + "ND26", + "ND27", + "ND28", + "ND29", + "ND30", + "ND31", + "ND32", + "ND33", + "ND34", + "ND35", + "ND36", + "ND37", + "ND38", + "ND39", + "ND40", + "ND41", + "ND42", + "ND43", + "ND44", + "ND45", + "ND46", + "ND47", + "ND48", + "ND49", + "ND50", + "ND51", + "ND52", + "ND53", + "ND54", + "ND55", + "ND56", + "ND57", + "ND58", + "ND59", + "ND60", + "ND61", + "ND62", + "ND63", + "ND64", + "ND65", + "ND66", + "ND67", + "ND68", + "ND69", + "ND70", + "ND71", + "ND72", + "ND73", + "ND74", + "ND75", + "ND76", + "ND77", + "ND78", + "ND79", + "ND80", + "ND81", + "ND82", + "ND83", + "ND84", + "ND85", + "ND86", + "ND87", + "ND88", + "ND89", + "ND90", + "ND91", + "ND92", + "ND93", + "ND94", + "ND95", + "ND96", + "ND97", + "ND98", + "ND99", + "NE00", + "NE01", + "NE02", + "NE03", + "NE04", + "NE05", + "NE06", + "NE07", + "NE08", + "NE09", + "NE10", + "NE11", + "NE12", + "NE13", + "NE14", + "NE15", + "NE16", + "NE17", + "NE18", + "NE19", + "NE20", + "NE21", + "NE22", + "NE23", + "NE24", + "NE25", + "NE26", + "NE27", + "NE28", + "NE29", + "NE30", + "NE31", + "NE32", + "NE33", + "NE34", + "NE35", + "NE36", + "NE37", + "NE38", + "NE39", + "NE40", + "NE41", + "NE42", + "NE43", + "NE44", + "NE45", + "NE46", + "NE47", + "NE48", + "NE49", + "NE50", + "NE51", + "NE52", + "NE53", + "NE54", + "NE55", + "NE56", + "NE57", + "NE58", + "NE59", + "NE60", + "NE61", + "NE62", + "NE63", + "NE64", + "NE65", + "NE66", + "NE67", + "NE68", + "NE69", + "NE70", + "NE71", + "NE72", + "NE73", + "NE74", + "NE75", + "NE76", + "NE77", + "NE78", + "NE79", + "NE80", + "NE81", + "NE82", + "NE83", + "NE84", + "NE85", + "NE86", + "NE87", + "NE88", + "NE89", + "NE90", + "NE91", + "NE92", + "NE93", + "NE94", + "NE95", + "NE96", + "NE97", + "NE98", + "NE99", + "OD00", + "OD01", + "OD02", + "OD03", + "OD04", + "OD05", + "OD06", + "OD07", + "OD08", + "OD09", + "OD10", + "OD11", + "OD12", + "OD13", + "OD14", + "OD15", + "OD16", + "OD17", + "OD18", + "OD19", + "OD20", + "OD21", + "OD22", + "OD23", + "OD24", + "OD25", + "OD26", + "OD27", + "OD28", + "OD29", + "OD30", + "OD31", + "OD32", + "OD33", + "OD34", + "OD35", + "OD36", + "OD37", + "OD38", + "OD39", + "OD40", + "OD41", + "OD42", + "OD43", + "OD44", + "OD45", + "OD46", + "OD47", + "OD48", + "OD49", + "OE00", + "OE01", + "OE02", + "OE03", + "OE04", + "OE05", + "OE06", + "OE07", + "OE08", + "OE09", + "OE10", + "OE11", + "OE12", + "OE13", + "OE14", + "OE15", + "OE16", + "OE17", + "OE18", + "OE19", + "OE20", + "OE21", + "OE22", + "OE23", + "OE24", + "OE25", + "OE26", + "OE27", + "OE28", + "OE29", + "OE30", + "OE31", + "OE32", + "OE33", + "OE34", + "OE35", + "OE36", + "OE37", + "OE38", + "OE39", + "OE40", + "OE41", + "OE42", + "OE43", + "OE44", + "OE45", + "OE46", + "OE47", + "OE48", + "OE49" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [80, -60], + [80, -40], + [110, -40], + [110, -60], + [80, -60] + ] + ] + }, + "properties": { "ituzone": "88" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "89": { + "mh": [ + "OD50", + "OD51", + "OD52", + "OD53", + "OD54", + "OD55", + "OD56", + "OD57", + "OD58", + "OD59", + "OD60", + "OD61", + "OD62", + "OD63", + "OD64", + "OD65", + "OD66", + "OD67", + "OD68", + "OD69", + "OD70", + "OD71", + "OD72", + "OD73", + "OD74", + "OD75", + "OD76", + "OD77", + "OD78", + "OD79", + "OD80", + "OD81", + "OD82", + "OD83", + "OD84", + "OD85", + "OD86", + "OD87", + "OD88", + "OD89", + "OD90", + "OD91", + "OD92", + "OD93", + "OD94", + "OD95", + "OD96", + "OD97", + "OD98", + "OD99", + "OE50", + "OE51", + "OE52", + "OE53", + "OE54", + "OE55", + "OE56", + "OE57", + "OE58", + "OE59", + "OE60", + "OE61", + "OE62", + "OE63", + "OE64", + "OE65", + "OE66", + "OE67", + "OE68", + "OE69", + "OE70", + "OE71", + "OE72", + "OE73", + "OE74", + "OE75", + "OE76", + "OE77", + "OE78", + "OE79", + "OE80", + "OE81", + "OE82", + "OE83", + "OE84", + "OE85", + "OE86", + "OE87", + "OE88", + "OE89", + "OE90", + "OE91", + "OE92", + "OE93", + "OE94", + "OE95", + "OE96", + "OE97", + "OE98", + "OE99", + "PD00", + "PD01", + "PD02", + "PD03", + "PD04", + "PD05", + "PD06", + "PD07", + "PD08", + "PD09", + "PD10", + "PD11", + "PD12", + "PD13", + "PD14", + "PD15", + "PD16", + "PD17", + "PD18", + "PD19", + "PD20", + "PD21", + "PD22", + "PD23", + "PD24", + "PD25", + "PD26", + "PD27", + "PD28", + "PD29", + "PD30", + "PD31", + "PD32", + "PD33", + "PD34", + "PD35", + "PD36", + "PD37", + "PD38", + "PD39", + "PD40", + "PD41", + "PD42", + "PD43", + "PD44", + "PD45", + "PD46", + "PD47", + "PD48", + "PD49", + "PD50", + "PD51", + "PD52", + "PD53", + "PD54", + "PD55", + "PD56", + "PD57", + "PD58", + "PD59", + "PD60", + "PD61", + "PD62", + "PD63", + "PD64", + "PD65", + "PD66", + "PD67", + "PD68", + "PD69", + "PD70", + "PD71", + "PD72", + "PD73", + "PD74", + "PD75", + "PD76", + "PD77", + "PD78", + "PD79", + "PD80", + "PD81", + "PD82", + "PD83", + "PD84", + "PD85", + "PD86", + "PD87", + "PD88", + "PD89", + "PD90", + "PD91", + "PD92", + "PD93", + "PD94", + "PD95", + "PD96", + "PD97", + "PD98", + "PD99", + "PE00", + "PE01", + "PE02", + "PE03", + "PE04", + "PE05", + "PE06", + "PE07", + "PE08", + "PE09", + "PE10", + "PE11", + "PE12", + "PE13", + "PE14", + "PE15", + "PE16", + "PE17", + "PE18", + "PE19", + "PE20", + "PE21", + "PE22", + "PE23", + "PE24", + "PE25", + "PE26", + "PE27", + "PE28", + "PE29", + "PE30", + "PE31", + "PE32", + "PE33", + "PE34", + "PE35", + "PE36", + "PE37", + "PE38", + "PE39", + "PE40", + "PE41", + "PE42", + "PE43", + "PE44", + "PE45", + "PE46", + "PE47", + "PE48", + "PE49", + "PE50", + "PE51", + "PE52", + "PE53", + "PE54", + "PE55", + "PE56", + "PE57", + "PE58", + "PE60", + "PE61", + "PE62", + "PE63", + "PE64", + "PE65", + "PE66", + "PE67", + "PE70", + "PE71", + "PE72", + "PE73", + "PE74", + "PE75", + "PE80", + "PE81", + "PE82", + "PE83", + "PE90", + "PE91", + "QD00", + "QD01", + "QD02", + "QD03", + "QD04", + "QD05", + "QD06", + "QD07", + "QD08", + "QD09", + "QD10", + "QD11", + "QD12", + "QD13", + "QD14", + "QD15", + "QD16", + "QD17", + "QD18", + "QD19", + "QD20", + "QD21", + "QD22", + "QD23", + "QD24", + "QD25", + "QD26", + "QD27", + "QD28", + "QD29", + "QD30", + "QD31", + "QD32", + "QD33", + "QD34", + "QD35", + "QD36", + "QD37", + "QD38", + "QD39", + "QD40", + "QD41", + "QD42", + "QD43", + "QD44", + "QD45", + "QD46", + "QD47", + "QD48", + "QD49", + "QD50", + "QD51", + "QD52", + "QD53", + "QD54", + "QD55", + "QD56", + "QD57", + "QD58", + "QD59", + "QD60", + "QD61", + "QD62", + "QD63", + "QD64", + "QD65", + "QD66", + "QD67", + "QD68", + "QD69", + "QD70", + "QD71", + "QD72", + "QD73", + "QD74", + "QD75", + "QD80", + "QD81", + "QD82", + "QD83", + "QD84", + "QD85", + "QD90", + "QD91", + "QD92", + "QD93", + "QD94", + "QD95", + "QE00", + "QE10", + "QE20", + "QE30", + "QE40", + "QE50", + "QE60", + "RD00", + "RD01", + "RD02", + "RD03", + "RD04", + "RD05", + "RD10", + "RD11", + "RD12", + "RD13", + "RD14", + "RD15", + "RD20", + "RD21", + "RD22", + "RD23", + "RD24", + "RD25", + "RD30", + "RD31", + "RD32", + "RD33", + "RD34", + "RD35", + "RD40", + "RD41", + "RD42", + "RD43", + "RD44", + "RD45", + "RD50", + "RD51", + "RD52", + "RD53", + "RD54", + "RD55", + "RD60", + "RD61", + "RD62", + "RD63", + "RD64", + "RD65", + "RD70", + "RD71", + "RD72", + "RD73", + "RD74", + "RD75", + "RD80", + "RD81", + "RD82", + "RD83", + "RD84", + "RD85", + "RD90", + "RD91", + "RD92", + "RD93", + "RD94", + "RD95" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [110, -60], + [110, -40], + [129, -40], + [140, -50], + [154, -50], + [154, -55], + [180, -55], + [180, -60], + [110, -60] + ] + ] + }, + "properties": { "ituzone": "89" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "90": { + "mh": [ + "AM00", + "AM01", + "AM02", + "AM03", + "AM04", + "AM05", + "AM06", + "AM07", + "AM08", + "AM09", + "AM10", + "AM11", + "AM12", + "AM13", + "AM14", + "AM15", + "AM16", + "AM17", + "AM18", + "AM19", + "AM20", + "AM21", + "AM22", + "AM23", + "AM24", + "AM25", + "AM26", + "AM27", + "AM28", + "AM29", + "AN00", + "AN01", + "AN02", + "AN03", + "AN04", + "AN05", + "AN06", + "AN07", + "AN08", + "AN09", + "AN10", + "AN11", + "AN12", + "AN13", + "AN14", + "AN15", + "AN16", + "AN17", + "AN18", + "AN19", + "AN20", + "AN21", + "AN22", + "AN23", + "AN24", + "AN25", + "AN26", + "AN27", + "AN28", + "AN29", + "QL42", + "QL43", + "QL44", + "QL45", + "QL46", + "QL47", + "QL48", + "QL49", + "QL52", + "QL53", + "QL54", + "QL55", + "QL56", + "QL57", + "QL58", + "QL59", + "QL62", + "QL63", + "QL64", + "QL65", + "QL66", + "QL67", + "QL68", + "QL69", + "QL72", + "QL73", + "QL74", + "QL75", + "QL76", + "QL77", + "QL78", + "QL79", + "QL82", + "QL83", + "QL84", + "QL85", + "QL86", + "QL87", + "QL88", + "QL89", + "QL92", + "QL93", + "QL94", + "QL95", + "QL96", + "QL97", + "QL98", + "QL99", + "QM40", + "QM41", + "QM42", + "QM43", + "QM44", + "QM45", + "QM46", + "QM47", + "QM48", + "QM49", + "QM50", + "QM51", + "QM52", + "QM53", + "QM54", + "QM55", + "QM56", + "QM57", + "QM58", + "QM59", + "QM60", + "QM61", + "QM62", + "QM63", + "QM64", + "QM65", + "QM66", + "QM67", + "QM68", + "QM69", + "QM70", + "QM71", + "QM72", + "QM73", + "QM74", + "QM75", + "QM76", + "QM77", + "QM78", + "QM79", + "QM80", + "QM81", + "QM82", + "QM83", + "QM84", + "QM85", + "QM86", + "QM87", + "QM88", + "QM89", + "QM90", + "QM91", + "QM92", + "QM93", + "QM94", + "QM95", + "QM96", + "QM97", + "QM98", + "QM99", + "QN40", + "QN41", + "QN42", + "QN43", + "QN44", + "QN45", + "QN50", + "QN51", + "QN52", + "QN53", + "QN54", + "QN55", + "QN56", + "QN60", + "QN61", + "QN62", + "QN63", + "QN64", + "QN65", + "QN66", + "QN67", + "QN70", + "QN71", + "QN72", + "QN73", + "QN74", + "QN75", + "QN76", + "QN77", + "QN78", + "QN80", + "QN81", + "QN82", + "QN83", + "QN84", + "QN85", + "QN86", + "QN87", + "QN88", + "QN89", + "QN90", + "QN91", + "QN92", + "QN93", + "QN94", + "QN95", + "QN96", + "QN97", + "QN98", + "QN99", + "RL02", + "RL03", + "RL04", + "RL05", + "RL06", + "RL07", + "RL08", + "RL09", + "RL12", + "RL13", + "RL14", + "RL15", + "RL16", + "RL17", + "RL18", + "RL19", + "RL22", + "RL23", + "RL24", + "RL25", + "RL26", + "RL27", + "RL28", + "RL29", + "RL32", + "RL33", + "RL34", + "RL35", + "RL36", + "RL37", + "RL38", + "RL39", + "RL42", + "RL43", + "RL44", + "RL45", + "RL46", + "RL47", + "RL48", + "RL49", + "RM00", + "RM01", + "RM02", + "RM03", + "RM04", + "RM05", + "RM06", + "RM07", + "RM08", + "RM09", + "RM10", + "RM11", + "RM12", + "RM13", + "RM14", + "RM15", + "RM16", + "RM17", + "RM18", + "RM19", + "RM20", + "RM21", + "RM22", + "RM23", + "RM24", + "RM25", + "RM26", + "RM27", + "RM28", + "RM29", + "RM30", + "RM31", + "RM32", + "RM33", + "RM34", + "RM35", + "RM36", + "RM37", + "RM38", + "RM39", + "RM40", + "RM41", + "RM42", + "RM43", + "RM44", + "RM45", + "RM46", + "RM47", + "RM48", + "RM49", + "RM50", + "RM51", + "RM52", + "RM53", + "RM54", + "RM55", + "RM56", + "RM57", + "RM58", + "RM59", + "RM60", + "RM61", + "RM62", + "RM63", + "RM64", + "RM65", + "RM66", + "RM67", + "RM68", + "RM69", + "RM70", + "RM71", + "RM72", + "RM73", + "RM74", + "RM75", + "RM76", + "RM77", + "RM78", + "RM79", + "RM80", + "RM81", + "RM82", + "RM83", + "RM84", + "RM85", + "RM86", + "RM87", + "RM88", + "RM89", + "RM90", + "RM91", + "RM92", + "RM93", + "RM94", + "RM95", + "RM96", + "RM97", + "RM98", + "RM99", + "RN00", + "RN01", + "RN02", + "RN03", + "RN04", + "RN05", + "RN06", + "RN07", + "RN08", + "RN09", + "RN10", + "RN11", + "RN12", + "RN13", + "RN14", + "RN15", + "RN16", + "RN17", + "RN18", + "RN19", + "RN20", + "RN21", + "RN22", + "RN23", + "RN24", + "RN25", + "RN26", + "RN27", + "RN28", + "RN29", + "RN30", + "RN31", + "RN32", + "RN33", + "RN34", + "RN35", + "RN36", + "RN37", + "RN38", + "RN39", + "RN40", + "RN41", + "RN42", + "RN43", + "RN44", + "RN45", + "RN46", + "RN47", + "RN48", + "RN49", + "RN50", + "RN51", + "RN52", + "RN53", + "RN54", + "RN55", + "RN56", + "RN57", + "RN58", + "RN59", + "RN60", + "RN61", + "RN62", + "RN63", + "RN64", + "RN65", + "RN66", + "RN67", + "RN68", + "RN69", + "RN70", + "RN71", + "RN72", + "RN73", + "RN74", + "RN75", + "RN76", + "RN77", + "RN78", + "RN79", + "RN80", + "RN81", + "RN82", + "RN83", + "RN84", + "RN85", + "RN86", + "RN87", + "RN88", + "RN89", + "RN90", + "RN91", + "RN92", + "RN93", + "RN94", + "RN95", + "RN96", + "RN97", + "RN98", + "RN99" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [160, 50], + [185, 50], + [185, 30], + [170, 30], + [170, 22], + [150, 22], + [150, 45.21871], + [160, 50] + ] + ] + }, + "properties": { "ituzone": "90" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "01": { + "mh": [ + "AO00", + "AO01", + "AO02", + "AO03", + "AO04", + "AO05", + "AO06", + "AO07", + "AO08", + "AO09", + "AO10", + "AO11", + "AO12", + "AO13", + "AO14", + "AO15", + "AO16", + "AO17", + "AO18", + "AO19", + "AO20", + "AO21", + "AO22", + "AO23", + "AO24", + "AO25", + "AO26", + "AO27", + "AO28", + "AO29", + "AO30", + "AO31", + "AO32", + "AO33", + "AO34", + "AO35", + "AO36", + "AO37", + "AO38", + "AO39", + "AO40", + "AO41", + "AO42", + "AO43", + "AO44", + "AO45", + "AO46", + "AO47", + "AO48", + "AO49", + "AO50", + "AO51", + "AO52", + "AO53", + "AO54", + "AO55", + "AO56", + "AO57", + "AO58", + "AO59", + "AO60", + "AO61", + "AO62", + "AO63", + "AO64", + "AO65", + "AO66", + "AO67", + "AO68", + "AO69", + "AO71", + "AO72", + "AO73", + "AO74", + "AO75", + "AO76", + "AO77", + "AO78", + "AO79", + "AO81", + "AO82", + "AO83", + "AO84", + "AO85", + "AO86", + "AO87", + "AO88", + "AO89", + "AO92", + "AO93", + "AO94", + "AO95", + "AO96", + "AO97", + "AO98", + "AO99", + "AP00", + "AP01", + "AP10", + "AP11", + "AP12", + "AP20", + "AP21", + "AP22", + "AP23", + "AP30", + "AP31", + "AP32", + "AP33", + "AP34", + "AP40", + "AP41", + "AP42", + "AP43", + "AP44", + "AP45", + "AP50", + "AP51", + "AP52", + "AP53", + "AP54", + "AP55", + "AP56", + "AP57", + "AP58", + "AP59", + "AP60", + "AP61", + "AP62", + "AP63", + "AP64", + "AP65", + "AP66", + "AP67", + "AP68", + "AP69", + "AP70", + "AP71", + "AP72", + "AP73", + "AP74", + "AP75", + "AP76", + "AP77", + "AP78", + "AP79", + "AP80", + "AP81", + "AP82", + "AP83", + "AP84", + "AP85", + "AP86", + "AP87", + "AP88", + "AP89", + "AP90", + "AP91", + "AP92", + "AP93", + "AP94", + "AP95", + "AP96", + "AP97", + "AP98", + "AP99", + "AQ50", + "AQ51", + "AQ52", + "AQ53", + "AQ54", + "AQ55", + "AQ56", + "AQ57", + "AQ58", + "AQ59", + "AQ60", + "AQ61", + "AQ62", + "AQ63", + "AQ64", + "AQ65", + "AQ66", + "AQ67", + "AQ68", + "AQ69", + "AQ70", + "AQ71", + "AQ72", + "AQ73", + "AQ74", + "AQ75", + "AQ76", + "AQ77", + "AQ78", + "AQ79", + "AQ80", + "AQ81", + "AQ82", + "AQ83", + "AQ84", + "AQ85", + "AQ86", + "AQ87", + "AQ88", + "AQ89", + "AQ90", + "AQ91", + "AQ92", + "AQ93", + "AQ94", + "AQ95", + "AQ96", + "AQ97", + "AQ98", + "AQ99", + "BO03", + "BO04", + "BO05", + "BO06", + "BO07", + "BO08", + "BO09", + "BO13", + "BO14", + "BO15", + "BO16", + "BO17", + "BO18", + "BO19", + "BO24", + "BO25", + "BO26", + "BO27", + "BO28", + "BO29", + "BO34", + "BO35", + "BO36", + "BO37", + "BO38", + "BO39", + "BO45", + "BO46", + "BO47", + "BO48", + "BO49", + "BO55", + "BO56", + "BO57", + "BO58", + "BO59", + "BO66", + "BO67", + "BO68", + "BO69", + "BO76", + "BO77", + "BO78", + "BO79", + "BO87", + "BO88", + "BO89", + "BO97", + "BO98", + "BO99", + "BP00", + "BP01", + "BP02", + "BP03", + "BP04", + "BP05", + "BP06", + "BP07", + "BP08", + "BP09", + "BP10", + "BP11", + "BP12", + "BP13", + "BP14", + "BP15", + "BP16", + "BP17", + "BP18", + "BP19", + "BP20", + "BP21", + "BP22", + "BP23", + "BP24", + "BP25", + "BP26", + "BP27", + "BP28", + "BP29", + "BP30", + "BP31", + "BP32", + "BP33", + "BP34", + "BP35", + "BP36", + "BP37", + "BP38", + "BP39", + "BP40", + "BP41", + "BP42", + "BP43", + "BP44", + "BP45", + "BP46", + "BP47", + "BP48", + "BP49", + "BP50", + "BP51", + "BP52", + "BP53", + "BP54", + "BP55", + "BP56", + "BP57", + "BP58", + "BP59", + "BP60", + "BP61", + "BP62", + "BP63", + "BP64", + "BP65", + "BP66", + "BP67", + "BP68", + "BP69", + "BP70", + "BP71", + "BP72", + "BP73", + "BP74", + "BP75", + "BP76", + "BP77", + "BP78", + "BP79", + "BP80", + "BP81", + "BP82", + "BP83", + "BP84", + "BP85", + "BP86", + "BP87", + "BP88", + "BP89", + "BP90", + "BP91", + "BP92", + "BP93", + "BP94", + "BP95", + "BP96", + "BP97", + "BP98", + "BP99", + "BQ00", + "BQ01", + "BQ02", + "BQ03", + "BQ04", + "BQ05", + "BQ06", + "BQ07", + "BQ08", + "BQ09", + "BQ10", + "BQ11", + "BQ12", + "BQ13", + "BQ14", + "BQ15", + "BQ16", + "BQ17", + "BQ18", + "BQ19", + "BQ20", + "BQ21", + "BQ22", + "BQ23", + "BQ24", + "BQ25", + "BQ26", + "BQ27", + "BQ28", + "BQ29", + "BQ30", + "BQ31", + "BQ32", + "BQ33", + "BQ34", + "BQ35", + "BQ36", + "BQ37", + "BQ38", + "BQ39", + "BQ40", + "BQ41", + "BQ42", + "BQ43", + "BQ44", + "BQ45", + "BQ46", + "BQ47", + "BQ48", + "BQ49", + "BQ50", + "BQ51", + "BQ52", + "BQ53", + "BQ54", + "BQ55", + "BQ56", + "BQ57", + "BQ58", + "BQ59", + "BQ60", + "BQ61", + "BQ62", + "BQ63", + "BQ64", + "BQ65", + "BQ66", + "BQ67", + "BQ68", + "BQ69", + "BQ70", + "BQ71", + "BQ72", + "BQ73", + "BQ74", + "BQ75", + "BQ76", + "BQ77", + "BQ78", + "BQ79", + "BQ80", + "BQ81", + "BQ82", + "BQ83", + "BQ84", + "BQ85", + "BQ86", + "BQ87", + "BQ88", + "BQ89", + "BQ90", + "BQ91", + "BQ92", + "BQ93", + "BQ94", + "BQ95", + "BQ96", + "BQ97", + "BQ98", + "BQ99", + "RO00", + "RO01", + "RO10", + "RO11", + "RO12", + "RO20", + "RO21", + "RO22", + "RO23", + "RO30", + "RO31", + "RO32", + "RO33", + "RO34", + "RO40", + "RO41", + "RO42", + "RO43", + "RO44", + "RO45", + "RO50", + "RO51", + "RO52", + "RO53", + "RO54", + "RO55", + "RO56", + "RO60", + "RO61", + "RO62", + "RO63", + "RO64", + "RO65", + "RO66", + "RO67", + "RO70", + "RO71", + "RO72", + "RO73", + "RO74", + "RO75", + "RO76", + "RO77", + "RO78", + "RO80", + "RO81", + "RO82", + "RO83", + "RO84", + "RO85", + "RO86", + "RO87", + "RO88", + "RO89", + "RO90", + "RO91", + "RO92", + "RO93", + "RO94", + "RO95", + "RO96", + "RO97", + "RO98", + "RO99" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-141, 58], + [-170, 50], + [-200, 50], + [-180, 60], + [-168.96149, 65.74529], + [-170, 80], + [-141, 80], + [-141, 58] + ] + ] + }, + "properties": { "ituzone": "01" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "02": { + "mh": [ + "BO97", + "BO98", + "BO99", + "BP90", + "BP91", + "BP92", + "BP93", + "BP94", + "BP95", + "BP96", + "BP97", + "BP98", + "BP99", + "BQ90", + "BQ91", + "BQ92", + "BQ93", + "BQ94", + "BQ95", + "BQ96", + "BQ97", + "BQ98", + "BQ99", + "CN39", + "CN48", + "CN49", + "CN58", + "CN59", + "CN68", + "CN69", + "CN78", + "CN79", + "CN88", + "CN89", + "CN99", + "CO05", + "CO06", + "CO07", + "CO08", + "CO09", + "CO13", + "CO14", + "CO15", + "CO16", + "CO17", + "CO18", + "CO19", + "CO21", + "CO22", + "CO23", + "CO24", + "CO25", + "CO26", + "CO27", + "CO28", + "CO29", + "CO30", + "CO31", + "CO32", + "CO33", + "CO34", + "CO35", + "CO36", + "CO37", + "CO38", + "CO39", + "CO40", + "CO41", + "CO42", + "CO43", + "CO44", + "CO45", + "CO46", + "CO47", + "CO48", + "CO49", + "CO50", + "CO51", + "CO52", + "CO53", + "CO54", + "CO55", + "CO56", + "CO57", + "CO58", + "CO59", + "CO60", + "CO61", + "CO62", + "CO63", + "CO64", + "CO65", + "CO66", + "CO67", + "CO68", + "CO69", + "CO70", + "CO71", + "CO72", + "CO73", + "CO74", + "CO75", + "CO76", + "CO77", + "CO78", + "CO79", + "CO80", + "CO81", + "CO82", + "CO83", + "CO84", + "CO85", + "CO86", + "CO87", + "CO88", + "CO89", + "CO90", + "CO91", + "CO92", + "CO93", + "CO94", + "CO95", + "CO96", + "CO97", + "CO98", + "CO99", + "CP00", + "CP01", + "CP02", + "CP03", + "CP04", + "CP05", + "CP06", + "CP07", + "CP08", + "CP09", + "CP10", + "CP11", + "CP12", + "CP13", + "CP14", + "CP15", + "CP16", + "CP17", + "CP18", + "CP19", + "CP20", + "CP21", + "CP22", + "CP23", + "CP24", + "CP25", + "CP26", + "CP27", + "CP28", + "CP29", + "CP30", + "CP31", + "CP32", + "CP33", + "CP34", + "CP35", + "CP36", + "CP37", + "CP38", + "CP39", + "CP40", + "CP41", + "CP42", + "CP43", + "CP44", + "CP45", + "CP46", + "CP47", + "CP48", + "CP49", + "CP50", + "CP51", + "CP52", + "CP53", + "CP54", + "CP55", + "CP56", + "CP57", + "CP58", + "CP59", + "CP60", + "CP61", + "CP62", + "CP63", + "CP64", + "CP65", + "CP66", + "CP67", + "CP68", + "CP69", + "CP70", + "CP71", + "CP72", + "CP73", + "CP74", + "CP75", + "CP76", + "CP77", + "CP78", + "CP79", + "CP80", + "CP81", + "CP82", + "CP83", + "CP84", + "CP85", + "CP86", + "CP87", + "CP88", + "CP89", + "CP90", + "CP91", + "CP92", + "CP93", + "CP94", + "CP95", + "CP96", + "CP97", + "CP98", + "CP99", + "CQ00", + "CQ01", + "CQ02", + "CQ03", + "CQ04", + "CQ05", + "CQ06", + "CQ07", + "CQ08", + "CQ09", + "CQ10", + "CQ11", + "CQ12", + "CQ13", + "CQ14", + "CQ15", + "CQ16", + "CQ17", + "CQ18", + "CQ19", + "CQ20", + "CQ21", + "CQ22", + "CQ23", + "CQ24", + "CQ25", + "CQ26", + "CQ27", + "CQ28", + "CQ29", + "CQ30", + "CQ31", + "CQ32", + "CQ33", + "CQ34", + "CQ35", + "CQ36", + "CQ37", + "CQ38", + "CQ39", + "CQ40", + "CQ41", + "CQ42", + "CQ43", + "CQ44", + "CQ45", + "CQ46", + "CQ47", + "CQ48", + "CQ49", + "CQ50", + "CQ51", + "CQ52", + "CQ53", + "CQ54", + "CQ55", + "CQ56", + "CQ57", + "CQ58", + "CQ59", + "CQ60", + "CQ61", + "CQ62", + "CQ63", + "CQ64", + "CQ65", + "CQ66", + "CQ67", + "CQ68", + "CQ69", + "CQ70", + "CQ71", + "CQ72", + "CQ73", + "CQ74", + "CQ75", + "CQ76", + "CQ77", + "CQ78", + "CQ79", + "CQ80", + "CQ81", + "CQ82", + "CQ83", + "CQ84", + "CQ85", + "CQ86", + "CQ87", + "CQ88", + "CQ89", + "CQ90", + "CQ91", + "CQ92", + "CQ93", + "CQ94", + "CQ95", + "CQ96", + "CQ97", + "CQ98", + "CQ99", + "DN09", + "DN19", + "DN29", + "DN39", + "DN49", + "DO00", + "DO01", + "DO02", + "DO03", + "DO04", + "DO05", + "DO06", + "DO07", + "DO08", + "DO09", + "DO10", + "DO11", + "DO12", + "DO13", + "DO14", + "DO15", + "DO16", + "DO17", + "DO18", + "DO19", + "DO20", + "DO21", + "DO22", + "DO23", + "DO24", + "DO25", + "DO26", + "DO27", + "DO28", + "DO29", + "DO30", + "DO31", + "DO32", + "DO33", + "DO34", + "DO35", + "DO36", + "DO37", + "DO38", + "DO39", + "DO40", + "DO41", + "DO42", + "DO43", + "DO44", + "DO45", + "DO46", + "DO47", + "DO48", + "DO49", + "DP00", + "DP01", + "DP02", + "DP03", + "DP04", + "DP05", + "DP06", + "DP07", + "DP08", + "DP09", + "DP10", + "DP11", + "DP12", + "DP13", + "DP14", + "DP15", + "DP16", + "DP17", + "DP18", + "DP19", + "DP20", + "DP21", + "DP22", + "DP23", + "DP24", + "DP25", + "DP26", + "DP27", + "DP28", + "DP29", + "DP30", + "DP31", + "DP32", + "DP33", + "DP34", + "DP35", + "DP36", + "DP37", + "DP38", + "DP39", + "DP40", + "DP41", + "DP42", + "DP43", + "DP44", + "DP45", + "DP46", + "DP47", + "DP48", + "DP49", + "DQ00", + "DQ01", + "DQ02", + "DQ03", + "DQ04", + "DQ05", + "DQ06", + "DQ07", + "DQ08", + "DQ09", + "DQ10", + "DQ11", + "DQ12", + "DQ13", + "DQ14", + "DQ15", + "DQ16", + "DQ17", + "DQ18", + "DQ19", + "DQ20", + "DQ21", + "DQ22", + "DQ23", + "DQ24", + "DQ25", + "DQ26", + "DQ27", + "DQ28", + "DQ29", + "DQ30", + "DQ31", + "DQ32", + "DQ33", + "DQ34", + "DQ35", + "DQ36", + "DQ37", + "DQ38", + "DQ39", + "DQ40", + "DQ41", + "DQ42", + "DQ43", + "DQ44", + "DQ45", + "DQ46", + "DQ47", + "DQ48", + "DQ49" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-123.32154, 49.00544], + [-123.00843, 48.83023], + [-123.00293, 48.77067], + [-123.25837, 48.68881], + [-123.22129, 48.54989], + [-123.11829, 48.41097], + [-123.26661, 48.26856], + [-123.57422, 48.22467], + [-124.80469, 48.50204], + [-130.78125, 48.57479], + [-140.99854, 58.00809], + [-141.00403, 80.00002], + [-141.00403, 79.99907], + [-110.01709, 80.00098], + [-110.00062, 48.99824], + [-122.96448, 49.00184], + [-123.32154, 49.00544] + ] + ] + }, + "properties": { "ituzone": "02" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "03": { + "mh": [ + "DN59", + "DN69", + "DN79", + "DN89", + "DN99", + "DO50", + "DO51", + "DO52", + "DO53", + "DO54", + "DO55", + "DO56", + "DO57", + "DO58", + "DO59", + "DO60", + "DO61", + "DO62", + "DO63", + "DO64", + "DO65", + "DO66", + "DO67", + "DO68", + "DO69", + "DO70", + "DO71", + "DO72", + "DO73", + "DO74", + "DO75", + "DO76", + "DO77", + "DO78", + "DO79", + "DO80", + "DO81", + "DO82", + "DO83", + "DO84", + "DO85", + "DO86", + "DO87", + "DO88", + "DO89", + "DO90", + "DO91", + "DO92", + "DO93", + "DO94", + "DO95", + "DO96", + "DO97", + "DO98", + "DO99", + "DP50", + "DP51", + "DP52", + "DP53", + "DP54", + "DP55", + "DP56", + "DP57", + "DP58", + "DP59", + "DP60", + "DP61", + "DP62", + "DP63", + "DP64", + "DP65", + "DP66", + "DP67", + "DP68", + "DP69", + "DP70", + "DP71", + "DP72", + "DP73", + "DP74", + "DP75", + "DP76", + "DP77", + "DP78", + "DP79", + "DP80", + "DP81", + "DP82", + "DP83", + "DP84", + "DP85", + "DP86", + "DP87", + "DP88", + "DP89", + "DP90", + "DP91", + "DP92", + "DP93", + "DP94", + "DP95", + "DP96", + "DP97", + "DP98", + "DP99", + "DQ50", + "DQ51", + "DQ52", + "DQ53", + "DQ54", + "DQ55", + "DQ56", + "DQ57", + "DQ58", + "DQ59", + "DQ60", + "DQ61", + "DQ62", + "DQ63", + "DQ64", + "DQ65", + "DQ66", + "DQ67", + "DQ68", + "DQ69", + "DQ70", + "DQ71", + "DQ72", + "DQ73", + "DQ74", + "DQ75", + "DQ76", + "DQ77", + "DQ78", + "DQ79", + "DQ80", + "DQ81", + "DQ82", + "DQ83", + "DQ84", + "DQ85", + "DQ86", + "DQ87", + "DQ88", + "DQ89", + "DQ90", + "DQ91", + "DQ92", + "DQ93", + "DQ94", + "DQ95", + "DQ96", + "DQ97", + "DQ98", + "DQ99", + "EN09", + "EN19", + "EN28", + "EN29", + "EN38", + "EN39", + "EN48", + "EN49", + "EO00", + "EO01", + "EO02", + "EO03", + "EO04", + "EO05", + "EO06", + "EO07", + "EO08", + "EO09", + "EO10", + "EO11", + "EO12", + "EO13", + "EO14", + "EO15", + "EO16", + "EO17", + "EO18", + "EO19", + "EO20", + "EO21", + "EO22", + "EO23", + "EO24", + "EO25", + "EO26", + "EO27", + "EO28", + "EO29", + "EO30", + "EO31", + "EO32", + "EO33", + "EO34", + "EO35", + "EO36", + "EO37", + "EO38", + "EO39", + "EO40", + "EO41", + "EO42", + "EO43", + "EO44", + "EO45", + "EO46", + "EO47", + "EO48", + "EO49", + "EP00", + "EP01", + "EP02", + "EP03", + "EP04", + "EP05", + "EP06", + "EP07", + "EP08", + "EP09", + "EP10", + "EP11", + "EP12", + "EP13", + "EP14", + "EP15", + "EP16", + "EP17", + "EP18", + "EP19", + "EP20", + "EP21", + "EP22", + "EP23", + "EP24", + "EP25", + "EP26", + "EP27", + "EP28", + "EP29", + "EP30", + "EP31", + "EP32", + "EP33", + "EP34", + "EP35", + "EP36", + "EP37", + "EP38", + "EP39", + "EP40", + "EP41", + "EP42", + "EP43", + "EP44", + "EP45", + "EP46", + "EP47", + "EP48", + "EP49", + "EQ00", + "EQ01", + "EQ02", + "EQ03", + "EQ04", + "EQ05", + "EQ06", + "EQ07", + "EQ08", + "EQ09", + "EQ10", + "EQ11", + "EQ12", + "EQ13", + "EQ14", + "EQ15", + "EQ16", + "EQ17", + "EQ18", + "EQ19", + "EQ20", + "EQ21", + "EQ22", + "EQ23", + "EQ24", + "EQ25", + "EQ26", + "EQ27", + "EQ28", + "EQ29", + "EQ30", + "EQ31", + "EQ32", + "EQ33", + "EQ34", + "EQ35", + "EQ36", + "EQ37", + "EQ38", + "EQ39", + "EQ40", + "EQ41", + "EQ42", + "EQ43", + "EQ44", + "EQ45", + "EQ46", + "EQ47", + "EQ48", + "EQ49" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-90.00859, 48.06878], + [-90.02318, 48.08484], + [-90.02936, 48.08754], + [-90.03931, 48.09012], + [-90.04137, 48.08954], + [-90.04871, 48.09192], + [-90.05745, 48.09626], + [-90.06652, 48.09854], + [-90.07412, 48.10144], + [-90.09176, 48.10479], + [-90.11399, 48.10433], + [-90.1163, 48.10416], + [-90.13253, 48.11167], + [-90.16416, 48.10975], + [-90.17682, 48.11247], + [-90.18857, 48.10811], + [-90.21325, 48.10657], + [-90.22428, 48.10829], + [-90.29269, 48.099], + [-90.3102, 48.10571], + [-90.51722, 48.0994], + [-90.5797, 48.12404], + [-90.76716, 48.11064], + [-90.78364, 48.13275], + [-90.88561, 48.24582], + [-91.32437, 48.07291], + [-91.32935, 48.07005], + [-91.56744, 48.04366], + [-91.57586, 48.10685], + [-91.64692, 48.10364], + [-91.68091, 48.10846], + [-91.70701, 48.15062], + [-91.76434, 48.20065], + [-91.95832, 48.23313], + [-92.0002, 48.3211], + [-92.05531, 48.35944], + [-92.20688, 48.34586], + [-92.26267, 48.3551], + [-92.28877, 48.34301], + [-92.29392, 48.32783], + [-92.26988, 48.24845], + [-92.37013, 48.22021], + [-92.4697, 48.35168], + [-92.47639, 48.3721], + [-92.45631, 48.40117], + [-92.45665, 48.41404], + [-92.47536, 48.4186], + [-92.48103, 48.42544], + [-92.48085, 48.42658], + [-92.48188, 48.42828], + [-92.48429, 48.4292], + [-92.48927, 48.43034], + [-92.50763, 48.44799], + [-92.51502, 48.44833], + [-92.53716, 48.44765], + [-92.57647, 48.44081], + [-92.65612, 48.4366], + [-92.71277, 48.46324], + [-92.63466, 48.54252], + [-92.72805, 48.53934], + [-92.89422, 48.59477], + [-92.91001, 48.59659], + [-92.92992, 48.60703], + [-92.94983, 48.61021], + [-92.95121, 48.63018], + [-92.95533, 48.632], + [-92.98485, 48.62428], + [-93.17917, 48.62337], + [-93.20801, 48.64289], + [-93.25539, 48.64334], + [-93.3474, 48.62564], + [-93.35221, 48.61293], + [-93.37281, 48.60567], + [-93.38242, 48.60522], + [-93.39821, 48.60522], + [-93.40508, 48.60976], + [-93.43667, 48.59477], + [-93.45795, 48.55479], + [-93.46688, 48.54661], + [-93.517, 48.53524], + [-93.64403, 48.51887], + [-93.69072, 48.51569], + [-93.70995, 48.51933], + [-93.73879, 48.51796], + [-93.75321, 48.51478], + [-93.7587, 48.51887], + [-93.79303, 48.51751], + [-93.80402, 48.56524], + [-93.80539, 48.57842], + [-93.81295, 48.5875], + [-93.82119, 48.6093], + [-93.83011, 48.61883], + [-93.83973, 48.62791], + [-93.84934, 48.63109], + [-93.95371, 48.63381], + [-94.00521, 48.64334], + [-94.03748, 48.64198], + [-94.06769, 48.64606], + [-94.07799, 48.64379], + [-94.09241, 48.64334], + [-94.10202, 48.64652], + [-94.11988, 48.64425], + [-94.13773, 48.64515], + [-94.16039, 48.64652], + [-94.19816, 48.65151], + [-94.22493, 48.65015], + [-94.24485, 48.65287], + [-94.24828, 48.6565], + [-94.25652, 48.6633], + [-94.2524, 48.6837], + [-94.26545, 48.69911], + [-94.2833, 48.70636], + [-94.30871, 48.7109], + [-94.32656, 48.70501], + [-94.34441, 48.7041], + [-94.36638, 48.70591], + [-94.38424, 48.71271], + [-94.40758, 48.71044], + [-94.41925, 48.71044], + [-94.43848, 48.69458], + [-94.45153, 48.69232], + [-94.47281, 48.6973], + [-94.53942, 48.70365], + [-94.55178, 48.71543], + [-94.59092, 48.71996], + [-94.62113, 48.73898], + [-94.64447, 48.74351], + [-94.69254, 48.777], + [-94.7049, 48.82494], + [-94.70078, 48.83489], + [-94.6843, 48.84122], + [-94.69254, 48.85658], + [-94.69391, 48.86923], + [-94.68567, 48.87194], + [-94.68293, 48.88548], + [-94.75022, 49.10084], + [-94.77494, 49.12062], + [-94.82712, 49.29468], + [-94.85596, 49.32512], + [-94.87931, 49.33317], + [-94.90677, 49.35107], + [-94.95759, 49.37074], + [-94.99192, 49.36985], + [-95.01664, 49.35643], + [-95.05921, 49.35286], + [-95.15259, 49.38326], + [-95.15259, 48.99824], + [-110.00611, 49.00184], + [-110.00611, 79.99907], + [-89.99434, 79.99918], + [-89.99863, 48.05889], + [-90.00464, 48.06511], + [-90.00636, 48.0658], + [-90.00859, 48.06878] + ] + ] + }, + "properties": { "ituzone": "03" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "04": { + "mh": [ + "EN58", + "EN59", + "EN67", + "EN68", + "EN69", + "EN76", + "EN77", + "EN78", + "EN79", + "EN81", + "EN82", + "EN83", + "EN84", + "EN85", + "EN86", + "EN87", + "EN88", + "EN89", + "EN91", + "EN92", + "EN93", + "EN94", + "EN95", + "EN96", + "EN97", + "EN98", + "EN99", + "EO50", + "EO51", + "EO52", + "EO53", + "EO54", + "EO55", + "EO56", + "EO57", + "EO58", + "EO59", + "EO60", + "EO61", + "EO62", + "EO63", + "EO64", + "EO65", + "EO66", + "EO67", + "EO68", + "EO69", + "EO70", + "EO71", + "EO72", + "EO73", + "EO74", + "EO75", + "EO76", + "EO77", + "EO78", + "EO79", + "EO80", + "EO81", + "EO82", + "EO83", + "EO84", + "EO85", + "EO86", + "EO87", + "EO88", + "EO89", + "EO90", + "EO91", + "EO92", + "EO93", + "EO94", + "EO95", + "EO96", + "EO97", + "EO98", + "EO99", + "EP50", + "EP51", + "EP52", + "EP53", + "EP54", + "EP55", + "EP56", + "EP57", + "EP58", + "EP59", + "EP60", + "EP61", + "EP62", + "EP63", + "EP64", + "EP65", + "EP66", + "EP67", + "EP68", + "EP69", + "EP70", + "EP71", + "EP72", + "EP73", + "EP74", + "EP75", + "EP76", + "EP77", + "EP78", + "EP79", + "EP80", + "EP81", + "EP82", + "EP83", + "EP84", + "EP85", + "EP86", + "EP87", + "EP88", + "EP89", + "EP90", + "EP91", + "EP92", + "EP93", + "EP94", + "EP95", + "EP96", + "EP97", + "EP98", + "EP99", + "EQ50", + "EQ51", + "EQ52", + "EQ53", + "EQ54", + "EQ55", + "EQ56", + "EQ57", + "EQ58", + "EQ59", + "EQ60", + "EQ61", + "EQ62", + "EQ63", + "EQ64", + "EQ65", + "EQ66", + "EQ67", + "EQ68", + "EQ69", + "EQ70", + "EQ71", + "EQ72", + "EQ73", + "EQ74", + "EQ75", + "EQ76", + "EQ77", + "EQ78", + "EQ79", + "EQ80", + "EQ81", + "EQ82", + "EQ83", + "EQ84", + "EQ85", + "EQ86", + "EQ87", + "EQ88", + "EQ89", + "EQ90", + "EQ91", + "EQ92", + "EQ93", + "EQ94", + "EQ95", + "EQ96", + "EQ97", + "EQ98", + "EQ99", + "FN02", + "FN03", + "FN04", + "FN05", + "FN06", + "FN07", + "FN08", + "FN09", + "FN13", + "FN14", + "FN15", + "FN16", + "FN17", + "FN18", + "FN19", + "FN24", + "FN25", + "FN26", + "FN27", + "FN28", + "FN29", + "FN35", + "FN36", + "FN37", + "FN38", + "FN39", + "FN45", + "FN46", + "FN47", + "FN48", + "FN49", + "FO00", + "FO01", + "FO02", + "FO03", + "FO04", + "FO05", + "FO06", + "FO07", + "FO08", + "FO09", + "FO10", + "FO11", + "FO12", + "FO13", + "FO14", + "FO15", + "FO16", + "FO17", + "FO18", + "FO19", + "FO20", + "FO21", + "FO22", + "FO23", + "FO24", + "FO25", + "FO26", + "FO27", + "FO28", + "FO29", + "FO30", + "FO31", + "FO32", + "FO33", + "FO34", + "FO35", + "FO36", + "FO37", + "FO38", + "FO39", + "FO40", + "FO41", + "FO42", + "FO43", + "FO44", + "FO45", + "FO46", + "FO47", + "FO48", + "FO49", + "FP00", + "FP01", + "FP02", + "FP03", + "FP04", + "FP05", + "FP06", + "FP07", + "FP08", + "FP09", + "FP10", + "FP11", + "FP12", + "FP13", + "FP14", + "FP15", + "FP16", + "FP17", + "FP18", + "FP19", + "FP20", + "FP21", + "FP22", + "FP23", + "FP24", + "FP25", + "FP26", + "FP27", + "FP28", + "FP29", + "FP30", + "FP31", + "FP32", + "FP33", + "FP34", + "FP35", + "FP36", + "FP37", + "FP38", + "FP39", + "FP40", + "FP41", + "FP42", + "FP43", + "FP44", + "FP45", + "FP46", + "FP47", + "FP48", + "FP49", + "FP51", + "FP52", + "FP53", + "FP54", + "FP55", + "FP56", + "FP57", + "FP58", + "FP59", + "FP61", + "FP62", + "FP63", + "FP64", + "FP65", + "FP66", + "FP67", + "FP68", + "FP69", + "FP71", + "FP72", + "FP73", + "FP74", + "FP75", + "FP76", + "FP77", + "FP78", + "FP79", + "FP81", + "FP82", + "FP83", + "FP84", + "FP85", + "FP86", + "FP87", + "FP88", + "FP89", + "FP91", + "FP92", + "FP93", + "FP94", + "FP95", + "FP96", + "FP97", + "FP98", + "FP99", + "FQ00", + "FQ01", + "FQ02", + "FQ03", + "FQ04", + "FQ05", + "FQ06", + "FQ07", + "FQ08", + "FQ09", + "FQ10", + "FQ11", + "FQ12", + "FQ13", + "FQ14", + "FQ15", + "FQ16", + "FQ17", + "FQ18", + "FQ19", + "FQ20", + "FQ21", + "FQ22", + "FQ23", + "FQ24", + "FQ25", + "FQ26", + "FQ27", + "FQ28", + "FQ29", + "FQ30", + "FQ31", + "FQ32", + "FQ33", + "FQ34", + "FQ35", + "FQ36", + "FQ38", + "FQ39", + "FQ40", + "FQ41", + "FQ42", + "FQ43", + "FQ44", + "FQ45", + "FQ46", + "FQ49", + "FQ50", + "FQ51", + "FQ52", + "FQ53", + "FQ54", + "FQ55", + "FQ59", + "FQ60", + "FQ61", + "FQ62", + "FQ63", + "FQ64", + "FQ70", + "FQ71", + "FQ72", + "FQ73", + "FQ80", + "FQ81", + "FQ90", + "GP01", + "GP02", + "GP03", + "GP04", + "GP05", + "GP06", + "GP07", + "GP08", + "GP11", + "GP12", + "GP13", + "GP14", + "GP15", + "GP21", + "GP22", + "GP23" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-69, 80], + [-72.64049, 79.00866], + [-75.22116, 77.47455], + [-67.02313, 74.40973], + [-54.14269, 61.24388], + [-69.9939, 61.24646], + [-69.99802, 46.6945], + [-70.05982, 46.41892], + [-70.20401, 46.33163], + [-70.28504, 46.18743], + [-70.24109, 46.13797], + [-70.31113, 46.05792], + [-70.31336, 45.96664], + [-70.24109, 45.94589], + [-70.27817, 45.87662], + [-70.41138, 45.79817], + [-70.37842, 45.72535], + [-70.56931, 45.65811], + [-70.72998, 45.51789], + [-70.62561, 45.41002], + [-70.65308, 45.3753], + [-70.78629, 45.43122], + [-70.80552, 45.32216], + [-70.88585, 45.2345], + [-70.94696, 45.33573], + [-71.09047, 45.30433], + [-71.13099, 45.25168], + [-71.29029, 45.30193], + [-71.43448, 45.23331], + [-71.39569, 45.20494], + [-71.50212, 45.06786], + [-71.49903, 45.0153], + [-72.31751, 45.00365], + [-73.22113, 45.01336], + [-74.12476, 44.99199], + [-74.83338, 45.01918], + [-75.3772, 44.78573], + [-75.81665, 44.49258], + [-75.81665, 44.4377], + [-75.96497, 44.35135], + [-76.31104, 44.19795], + [-76.43189, 44.09942], + [-76.79993, 43.63209], + [-78.68409, 43.64402], + [-79.20044, 43.4569], + [-79.0741, 43.2572], + [-78.93677, 42.95642], + [-78.94227, 42.82763], + [-80.08484, 42.391], + [-81.2494, 42.21224], + [-82.39197, 41.68522], + [-82.67212, 41.6688], + [-83.06214, 41.86137], + [-83.14904, 42.01642], + [-83.12607, 42.28569], + [-82.81647, 42.37632], + [-82.67383, 42.54463], + [-82.55317, 42.56716], + [-82.48214, 42.73738], + [-82.406, 43.00485], + [-82.12339, 43.58463], + [-82.51644, 45.33729], + [-83.59064, 45.82049], + [-83.42787, 45.99956], + [-83.60568, 46.12135], + [-83.82946, 46.10571], + [-83.95292, 46.04385], + [-84.08944, 46.22198], + [-84.14328, 46.39895], + [-84.10816, 46.5332], + [-84.2499, 46.49354], + [-84.3367, 46.51436], + [-84.55426, 46.46151], + [-84.75867, 46.63186], + [-84.8512, 46.88257], + [-88.37008, 48.30565], + [-88.67727, 48.24498], + [-89.33877, 47.97374], + [-89.48988, 48.01393], + [-89.73859, 48.02279], + [-89.81901, 48.01488], + [-89.8252, 48.00715], + [-89.83276, 47.99896], + [-89.87195, 47.9856], + [-89.99242, 48.02712], + [-89.99741, 48.03763], + [-89.99415, 48.04996], + [-90.00001, 48.05995], + [-90, 48.05992], + [-90, 80], + [-69, 80] + ] + ] + }, + "properties": { "ituzone": "04" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "05": { + "mh": [ + "FP98", + "FP99", + "FQ27", + "FQ28", + "FQ36", + "FQ37", + "FQ38", + "FQ39", + "FQ45", + "FQ46", + "FQ47", + "FQ48", + "FQ49", + "FQ54", + "FQ55", + "FQ56", + "FQ57", + "FQ58", + "FQ59", + "FQ63", + "FQ64", + "FQ65", + "FQ66", + "FQ67", + "FQ68", + "FQ69", + "FQ71", + "FQ72", + "FQ73", + "FQ74", + "FQ75", + "FQ76", + "FQ77", + "FQ78", + "FQ79", + "FQ80", + "FQ81", + "FQ82", + "FQ83", + "FQ84", + "FQ85", + "FQ86", + "FQ87", + "FQ88", + "FQ89", + "FQ90", + "FQ91", + "FQ92", + "FQ93", + "FQ94", + "FQ95", + "FQ96", + "FQ97", + "FQ98", + "FQ99", + "GO37", + "GO38", + "GO39", + "GO44", + "GO45", + "GO46", + "GO47", + "GO48", + "GO49", + "GO54", + "GO55", + "GO56", + "GO57", + "GO58", + "GO59", + "GO65", + "GO66", + "GO67", + "GO68", + "GO69", + "GO76", + "GO77", + "GO78", + "GO79", + "GO87", + "GO88", + "GO89", + "GO99", + "GP06", + "GP07", + "GP08", + "GP09", + "GP13", + "GP14", + "GP15", + "GP16", + "GP17", + "GP18", + "GP19", + "GP21", + "GP22", + "GP23", + "GP24", + "GP25", + "GP26", + "GP27", + "GP28", + "GP29", + "GP30", + "GP31", + "GP32", + "GP33", + "GP34", + "GP35", + "GP36", + "GP37", + "GP38", + "GP39", + "GP40", + "GP41", + "GP42", + "GP43", + "GP44", + "GP45", + "GP46", + "GP47", + "GP48", + "GP49", + "GP50", + "GP51", + "GP52", + "GP53", + "GP54", + "GP55", + "GP56", + "GP57", + "GP58", + "GP59", + "GP60", + "GP61", + "GP62", + "GP63", + "GP64", + "GP65", + "GP66", + "GP67", + "GP68", + "GP69", + "GP70", + "GP71", + "GP72", + "GP73", + "GP74", + "GP75", + "GP76", + "GP77", + "GP78", + "GP79", + "GP80", + "GP81", + "GP82", + "GP83", + "GP84", + "GP85", + "GP86", + "GP87", + "GP88", + "GP89", + "GP90", + "GP91", + "GP92", + "GP93", + "GP94", + "GP95", + "GP96", + "GP97", + "GP98", + "GP99", + "GQ00", + "GQ01", + "GQ02", + "GQ03", + "GQ04", + "GQ05", + "GQ06", + "GQ07", + "GQ08", + "GQ09", + "GQ10", + "GQ11", + "GQ12", + "GQ13", + "GQ14", + "GQ15", + "GQ16", + "GQ17", + "GQ18", + "GQ19", + "GQ20", + "GQ21", + "GQ22", + "GQ23", + "GQ24", + "GQ25", + "GQ26", + "GQ27", + "GQ28", + "GQ29", + "GQ30", + "GQ31", + "GQ32", + "GQ33", + "GQ34", + "GQ35", + "GQ36", + "GQ37", + "GQ38", + "GQ39", + "GQ40", + "GQ41", + "GQ42", + "GQ43", + "GQ44", + "GQ45", + "GQ46", + "GQ47", + "GQ48", + "GQ49", + "GQ50", + "GQ51", + "GQ52", + "GQ53", + "GQ54", + "GQ55", + "GQ56", + "GQ57", + "GQ58", + "GQ59", + "GQ60", + "GQ61", + "GQ62", + "GQ63", + "GQ64", + "GQ65", + "GQ66", + "GQ67", + "GQ68", + "GQ69", + "GQ70", + "GQ71", + "GQ72", + "GQ73", + "GQ74", + "GQ75", + "GQ76", + "GQ77", + "GQ78", + "GQ79", + "GQ80", + "GQ81", + "GQ82", + "GQ83", + "GQ84", + "GQ85", + "GQ86", + "GQ87", + "GQ88", + "GQ89", + "GQ90", + "GQ91", + "GQ92", + "GQ93", + "GQ94", + "GQ95", + "GQ96", + "GQ97", + "GQ98", + "GQ99", + "HP00", + "HP01", + "HP02", + "HP03", + "HP04", + "HP05", + "HP06", + "HP07", + "HP08", + "HP09", + "HP11", + "HP12", + "HP13", + "HP14", + "HP15", + "HP16", + "HP17", + "HP18", + "HP19", + "HP22", + "HP23", + "HP24", + "HP25", + "HP26", + "HP27", + "HP28", + "HP29", + "HP33", + "HP34", + "HP35", + "HP36", + "HP37", + "HP38", + "HP39", + "HP44", + "HP45", + "HP46", + "HP47", + "HP48", + "HP49", + "HP55", + "HP56", + "HP57", + "HP58", + "HP59", + "HP66", + "HP67", + "HP68", + "HP69", + "HP76", + "HP77", + "HP78", + "HP79", + "HP87", + "HP88", + "HP89", + "HP98", + "HP99", + "HQ00", + "HQ01", + "HQ02", + "HQ03", + "HQ04", + "HQ05", + "HQ06", + "HQ07", + "HQ08", + "HQ09", + "HQ10", + "HQ11", + "HQ12", + "HQ13", + "HQ14", + "HQ15", + "HQ16", + "HQ17", + "HQ18", + "HQ19", + "HQ20", + "HQ21", + "HQ22", + "HQ23", + "HQ24", + "HQ25", + "HQ26", + "HQ27", + "HQ28", + "HQ29", + "HQ30", + "HQ31", + "HQ32", + "HQ33", + "HQ34", + "HQ35", + "HQ36", + "HQ37", + "HQ38", + "HQ39", + "HQ40", + "HQ41", + "HQ42", + "HQ43", + "HQ44", + "HQ45", + "HQ46", + "HQ47", + "HQ48", + "HQ49", + "HQ50", + "HQ51", + "HQ52", + "HQ53", + "HQ54", + "HQ55", + "HQ56", + "HQ57", + "HQ58", + "HQ59", + "HQ60", + "HQ61", + "HQ62", + "HQ63", + "HQ64", + "HQ65", + "HQ66", + "HQ67", + "HQ68", + "HQ69", + "HQ70", + "HQ71", + "HQ72", + "HQ73", + "HQ74", + "HQ75", + "HQ76", + "HQ77", + "HQ78", + "HQ79", + "HQ80", + "HQ81", + "HQ82", + "HQ83", + "HQ84", + "HQ85", + "HQ86", + "HQ87", + "HQ88", + "HQ89", + "HQ90", + "HQ91", + "HQ92", + "HQ93", + "HQ94", + "HQ95", + "HQ96", + "HQ97", + "HQ98", + "HQ99", + "IP09", + "IQ00", + "IQ01", + "IQ02", + "IQ03", + "IQ04", + "IQ05", + "IQ06", + "IQ07", + "IQ08", + "IQ09", + "IQ10", + "IQ11", + "IQ12", + "IQ13", + "IQ14", + "IQ15", + "IQ16", + "IQ17", + "IQ18", + "IQ19", + "IQ20", + "IQ21", + "IQ22", + "IQ23", + "IQ24", + "IQ25", + "IQ26", + "IQ27", + "IQ28", + "IQ29", + "IQ31", + "IQ32", + "IQ33", + "IQ34", + "IQ35", + "IQ36", + "IQ37", + "IQ38", + "IQ39", + "IQ42", + "IQ43", + "IQ44", + "IQ45", + "IQ46", + "IQ47", + "IQ48", + "IQ49" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-10, 73], + [-50, 54], + [-54.14269, 61.24388], + [-67.02313, 74.40973], + [-75.22116, 77.47455], + [-72.64049, 79.00866], + [-69, 80], + [-10, 80], + [-10, 73] + ] + ] + }, + "properties": { "ituzone": "05" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "06": { + "mh": [ + "CM66", + "CM67", + "CM68", + "CM69", + "CM72", + "CM73", + "CM74", + "CM75", + "CM76", + "CM77", + "CM78", + "CM79", + "CM82", + "CM83", + "CM84", + "CM85", + "CM86", + "CM87", + "CM88", + "CM89", + "CM92", + "CM93", + "CM94", + "CM95", + "CM96", + "CM97", + "CM98", + "CM99", + "CN47", + "CN48", + "CN52", + "CN53", + "CN54", + "CN55", + "CN56", + "CN57", + "CN58", + "CN60", + "CN61", + "CN62", + "CN63", + "CN64", + "CN65", + "CN66", + "CN67", + "CN68", + "CN70", + "CN71", + "CN72", + "CN73", + "CN74", + "CN75", + "CN76", + "CN77", + "CN78", + "CN80", + "CN81", + "CN82", + "CN83", + "CN84", + "CN85", + "CN86", + "CN87", + "CN88", + "CN90", + "CN91", + "CN92", + "CN93", + "CN94", + "CN95", + "CN96", + "CN97", + "CN98", + "DM02", + "DM03", + "DM04", + "DM05", + "DM06", + "DM07", + "DM08", + "DM09", + "DM12", + "DM13", + "DM14", + "DM15", + "DM16", + "DM17", + "DM18", + "DM19", + "DM22", + "DM23", + "DM24", + "DM25", + "DM26", + "DM27", + "DM28", + "DM29", + "DM31", + "DM32", + "DM33", + "DM34", + "DM35", + "DM36", + "DM37", + "DM38", + "DM39", + "DM41", + "DM42", + "DM43", + "DM44", + "DM45", + "DM46", + "DM47", + "DM48", + "DM49", + "DN00", + "DN01", + "DN02", + "DN03", + "DN04", + "DN05", + "DN06", + "DN07", + "DN08", + "DN10", + "DN11", + "DN12", + "DN13", + "DN14", + "DN15", + "DN16", + "DN17", + "DN18", + "DN20", + "DN21", + "DN22", + "DN23", + "DN24", + "DN25", + "DN26", + "DN27", + "DN28", + "DN30", + "DN31", + "DN32", + "DN33", + "DN34", + "DN35", + "DN36", + "DN37", + "DN38", + "DN40", + "DN41", + "DN42", + "DN43", + "DN44", + "DN45", + "DN46", + "DN47", + "DN48" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-110.00473, 49.00004], + [-110.00061, 45.00365], + [-110.6955, 44.99199], + [-111.0553, 45.00073], + [-111.04706, 40.99855], + [-110.00061, 40.99752], + [-110.00061, 31.33369], + [-111.07453, 31.33252], + [-114.81366, 32.49441], + [-114.81297, 32.5002], + [-114.81675, 32.50744], + [-114.81396, 32.50925], + [-114.80636, 32.50845], + [-114.80113, 32.51323], + [-114.80314, 32.51555], + [-114.80962, 32.51786], + [-114.81009, 32.52134], + [-114.81366, 32.52481], + [-114.80585, 32.5306], + [-114.80216, 32.53812], + [-114.80683, 32.54652], + [-114.79572, 32.55086], + [-114.79239, 32.55607], + [-114.7925, 32.5688], + [-114.80576, 32.55954], + [-114.80988, 32.55838], + [-114.81434, 32.56272], + [-114.814, 32.56851], + [-114.80147, 32.57401], + [-114.80404, 32.5824], + [-114.79941, 32.59455], + [-114.80919, 32.61768], + [-114.71933, 32.7189], + [-114.78619, 32.71451], + [-117.12525, 32.53523], + [-124.62891, 32.47269], + [-130.784, 48.57479], + [-124.8016, 48.50373], + [-123.57354, 48.22467], + [-123.26712, 48.26823], + [-123.11863, 48.41093], + [-123.22129, 48.54965], + [-123.25974, 48.68824], + [-123.00225, 48.77112], + [-123.0098, 48.83127], + [-123.32154, 49.00544], + [-121.38005, 49.00679], + [-117.04354, 49.00094], + [-110.00473, 49.00004] + ] + ] + }, + "properties": { "ituzone": "06" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "07": { + "mh": [ + "DL79", + "DL89", + "DL98", + "DL99", + "DM51", + "DM52", + "DM53", + "DM54", + "DM55", + "DM56", + "DM57", + "DM58", + "DM59", + "DM61", + "DM62", + "DM63", + "DM64", + "DM65", + "DM66", + "DM67", + "DM68", + "DM69", + "DM70", + "DM71", + "DM72", + "DM73", + "DM74", + "DM75", + "DM76", + "DM77", + "DM78", + "DM79", + "DM80", + "DM81", + "DM82", + "DM83", + "DM84", + "DM85", + "DM86", + "DM87", + "DM88", + "DM89", + "DM90", + "DM91", + "DM92", + "DM93", + "DM94", + "DM95", + "DM96", + "DM97", + "DM98", + "DM99", + "DN41", + "DN42", + "DN43", + "DN44", + "DN50", + "DN51", + "DN52", + "DN53", + "DN54", + "DN55", + "DN56", + "DN57", + "DN58", + "DN60", + "DN61", + "DN62", + "DN63", + "DN64", + "DN65", + "DN66", + "DN67", + "DN68", + "DN70", + "DN71", + "DN72", + "DN73", + "DN74", + "DN75", + "DN76", + "DN77", + "DN78", + "DN80", + "DN81", + "DN82", + "DN83", + "DN84", + "DN85", + "DN86", + "DN87", + "DN88", + "DN90", + "DN91", + "DN92", + "DN93", + "DN94", + "DN95", + "DN96", + "DN97", + "DN98", + "EL06", + "EL07", + "EL08", + "EL09", + "EL15", + "EL16", + "EL17", + "EL18", + "EL19", + "EL25", + "EL26", + "EL27", + "EL28", + "EL29", + "EL35", + "EL36", + "EL37", + "EL38", + "EL39", + "EL45", + "EL46", + "EL47", + "EL48", + "EL49", + "EM00", + "EM01", + "EM02", + "EM03", + "EM04", + "EM05", + "EM06", + "EM07", + "EM08", + "EM09", + "EM10", + "EM11", + "EM12", + "EM13", + "EM14", + "EM15", + "EM16", + "EM17", + "EM18", + "EM19", + "EM20", + "EM21", + "EM22", + "EM23", + "EM24", + "EM25", + "EM26", + "EM27", + "EM28", + "EM29", + "EM30", + "EM31", + "EM32", + "EM33", + "EM34", + "EM35", + "EM36", + "EM37", + "EM38", + "EM39", + "EM40", + "EM41", + "EM42", + "EM43", + "EM44", + "EM45", + "EM46", + "EM47", + "EM48", + "EM49", + "EN00", + "EN01", + "EN02", + "EN03", + "EN04", + "EN05", + "EN06", + "EN07", + "EN08", + "EN10", + "EN11", + "EN12", + "EN13", + "EN14", + "EN15", + "EN16", + "EN17", + "EN18", + "EN20", + "EN21", + "EN22", + "EN23", + "EN24", + "EN25", + "EN26", + "EN27", + "EN28", + "EN29", + "EN30", + "EN31", + "EN32", + "EN33", + "EN34", + "EN35", + "EN36", + "EN37", + "EN38", + "EN40", + "EN41", + "EN42", + "EN43", + "EN44", + "EN45", + "EN46", + "EN47", + "EN48" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-110.00473, 49.00004], + [-95.15328, 48.99914], + [-95.15397, 49.38371], + [-95.05921, 49.3533], + [-95.01458, 49.35643], + [-94.9569, 49.3703], + [-94.90883, 49.34973], + [-94.87999, 49.33407], + [-94.8539, 49.32467], + [-94.82644, 49.29468], + [-94.77219, 49.12107], + [-94.7509, 49.09949], + [-94.68293, 48.88323], + [-94.68567, 48.87329], + [-94.69254, 48.86923], + [-94.69048, 48.86245], + [-94.69323, 48.85387], + [-94.68567, 48.83941], + [-94.70078, 48.83534], + [-94.7049, 48.82585], + [-94.69666, 48.80822], + [-94.68705, 48.7761], + [-94.64447, 48.74894], + [-94.6431, 48.7426], + [-94.6177, 48.73672], + [-94.5916, 48.71905], + [-94.53736, 48.70183], + [-94.44191, 48.69413], + [-94.41788, 48.71135], + [-94.38218, 48.71361], + [-94.35265, 48.7041], + [-94.3293, 48.7041], + [-94.31008, 48.70954], + [-94.28811, 48.70682], + [-94.27437, 48.69957], + [-94.2627, 48.69866], + [-94.25171, 48.68325], + [-94.25309, 48.65695], + [-94.22356, 48.64924], + [-94.19953, 48.6506], + [-94.15696, 48.64606], + [-94.10202, 48.64561], + [-94.03405, 48.64153], + [-94.00727, 48.64379], + [-93.9544, 48.63427], + [-93.9132, 48.63653], + [-93.84728, 48.63109], + [-93.83492, 48.627], + [-93.80814, 48.58342], + [-93.80402, 48.57115], + [-93.81157, 48.55161], + [-93.8102, 48.54343], + [-93.81707, 48.52979], + [-93.79372, 48.5166], + [-93.75252, 48.51615], + [-93.73742, 48.51796], + [-93.71064, 48.51887], + [-93.69004, 48.51615], + [-93.64335, 48.51978], + [-93.4655, 48.54843], + [-93.45795, 48.55797], + [-93.4655, 48.59295], + [-93.43667, 48.59477], + [-93.40508, 48.60976], + [-93.39959, 48.60385], + [-93.37143, 48.60658], + [-93.35221, 48.61384], + [-93.34809, 48.62655], + [-93.25676, 48.64334], + [-93.20664, 48.64289], + [-93.17849, 48.62428], + [-92.98485, 48.62474], + [-92.95464, 48.6329], + [-92.94983, 48.63064], + [-92.95052, 48.60885], + [-92.72942, 48.53934], + [-92.6587, 48.54661], + [-92.63466, 48.54252], + [-92.71225, 48.46336], + [-92.50901, 48.44833], + [-92.48909, 48.42965], + [-92.48429, 48.42965], + [-92.47536, 48.41872], + [-92.45682, 48.41507], + [-92.45751, 48.40185], + [-92.47673, 48.37221], + [-92.46918, 48.35168], + [-92.41562, 48.29415], + [-92.36824, 48.22284], + [-92.27005, 48.24845], + [-92.30576, 48.31699], + [-92.28928, 48.34301], + [-92.2625, 48.35488], + [-92.20688, 48.34575], + [-92.05531, 48.35938], + [-92.0002, 48.3211], + [-91.95832, 48.23313], + [-91.76434, 48.20065], + [-91.70701, 48.15062], + [-91.68091, 48.10846], + [-91.64692, 48.10364], + [-91.57586, 48.10685], + [-91.5671, 48.04389], + [-91.32935, 48.07005], + [-91.32437, 48.07291], + [-90.88715, 48.24616], + [-90.83771, 48.2361], + [-90.78364, 48.13275], + [-90.76716, 48.11064], + [-90.5797, 48.12404], + [-90.51722, 48.0994], + [-90.3102, 48.10571], + [-90.29286, 48.0994], + [-90.22419, 48.10834], + [-90.21321, 48.10651], + [-90.18849, 48.10811], + [-90.17613, 48.11247], + [-90.1442, 48.11339], + [-90.13253, 48.11178], + [-90.11613, 48.10422], + [-90.09167, 48.10468], + [-90.07408, 48.10129], + [-90.06661, 48.09854], + [-90.05751, 48.09648], + [-90.04996, 48.09247], + [-90.04155, 48.08954], + [-90.03794, 48.08954], + [-90.02936, 48.08771], + [-90.02335, 48.08496], + [-90.01889, 48.07234], + [-90.01494, 48.06741], + [-90.00859, 48.06878], + [-90.00653, 48.06569], + [-90.00464, 48.06465], + [-89.99863, 48.05903], + [-90, 25.04828], + [-97.1473, 25.95681], + [-97.34848, 25.93149], + [-97.37183, 25.84253], + [-97.52015, 25.88579], + [-97.66091, 26.02963], + [-97.8003, 26.06048], + [-98.03994, 26.04136], + [-98.24387, 26.07282], + [-98.46085, 26.22691], + [-98.65929, 26.23615], + [-98.82409, 26.37034], + [-99.08432, 26.39802], + [-99.09256, 26.47733], + [-99.17016, 26.54062], + [-99.20861, 26.72598], + [-99.32671, 26.91839], + [-99.44756, 27.02487], + [-99.43932, 27.24669], + [-99.52858, 27.30528], + [-99.47983, 27.48817], + [-99.59725, 27.64095], + [-99.65355, 27.63061], + [-99.87877, 27.80203], + [-99.93096, 27.98045], + [-99.99276, 27.99561], + [-100.08683, 28.14526], + [-100.20562, 28.19066], + [-100.29419, 28.28382], + [-100.39856, 28.58391], + [-100.50019, 28.66287], + [-100.53315, 28.80376], + [-100.65056, 28.94266], + [-100.66636, 29.07717], + [-100.77485, 29.17614], + [-100.79613, 29.24626], + [-101.00899, 29.36781], + [-101.06049, 29.45813], + [-101.26168, 29.53881], + [-101.3118, 29.65822], + [-101.35918, 29.64867], + [-101.456, 29.78762], + [-101.70937, 29.76258], + [-101.84739, 29.80728], + [-102.05132, 29.78642], + [-102.32186, 29.88054], + [-102.38778, 29.76199], + [-102.51549, 29.78642], + [-102.67548, 29.7447], + [-102.80869, 29.52507], + [-102.8135, 29.40132], + [-102.87804, 29.35524], + [-102.91169, 29.2205], + [-103.10051, 29.06157], + [-103.11356, 28.98652], + [-103.2399, 28.98171], + [-103.4253, 29.04356], + [-103.55301, 29.15575], + [-103.71781, 29.18154], + [-103.78647, 29.26663], + [-103.96775, 29.30017], + [-104.16275, 29.39114], + [-104.263, 29.51372], + [-104.33716, 29.51969], + [-104.50539, 29.63315], + [-104.65714, 29.90375], + [-104.69559, 30.03581], + [-104.70589, 30.23474], + [-104.85901, 30.39123], + [-104.87343, 30.51258], + [-105.00733, 30.68575], + [-105.21744, 30.80555], + [-105.40215, 30.85566], + [-105.55665, 30.98835], + [-105.64797, 31.11556], + [-105.77328, 31.16727], + [-105.95456, 31.36565], + [-106.2045, 31.46469], + [-106.38062, 31.73196], + [-106.531, 31.7845], + [-108.2071, 31.78421], + [-108.20847, 31.33252], + [-110.00061, 31.33369], + [-110.00061, 40.99752], + [-111.04706, 40.99855], + [-111.0553, 45.00073], + [-110.6955, 44.99199], + [-110.00061, 45.00365], + [-110.00473, 49.00004] + ] + ] + }, + "properties": { "ituzone": "07" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "08": { + "mh": [ + "EL54", + "EL55", + "EL56", + "EL57", + "EL58", + "EL59", + "EL64", + "EL65", + "EL66", + "EL67", + "EL68", + "EL69", + "EL74", + "EL75", + "EL76", + "EL77", + "EL78", + "EL79", + "EL84", + "EL85", + "EL86", + "EL87", + "EL88", + "EL89", + "EL94", + "EL95", + "EL96", + "EL97", + "EL98", + "EL99", + "EM50", + "EM51", + "EM52", + "EM53", + "EM54", + "EM55", + "EM56", + "EM57", + "EM58", + "EM59", + "EM60", + "EM61", + "EM62", + "EM63", + "EM64", + "EM65", + "EM66", + "EM67", + "EM68", + "EM69", + "EM70", + "EM71", + "EM72", + "EM73", + "EM74", + "EM75", + "EM76", + "EM77", + "EM78", + "EM79", + "EM80", + "EM81", + "EM82", + "EM83", + "EM84", + "EM85", + "EM86", + "EM87", + "EM88", + "EM89", + "EM90", + "EM91", + "EM92", + "EM93", + "EM94", + "EM95", + "EM96", + "EM97", + "EM98", + "EM99", + "EN50", + "EN51", + "EN52", + "EN53", + "EN54", + "EN55", + "EN56", + "EN57", + "EN58", + "EN60", + "EN61", + "EN62", + "EN63", + "EN64", + "EN65", + "EN66", + "EN67", + "EN68", + "EN70", + "EN71", + "EN72", + "EN73", + "EN74", + "EN75", + "EN76", + "EN77", + "EN80", + "EN81", + "EN82", + "EN83", + "EN84", + "EN85", + "EN86", + "EN90", + "EN91", + "EN92", + "FL04", + "FL05", + "FL06", + "FL07", + "FL08", + "FL09", + "FM00", + "FM01", + "FM02", + "FM03", + "FM04", + "FM05", + "FM06", + "FM07", + "FM08", + "FM09", + "FM11", + "FM12", + "FM13", + "FM14", + "FM15", + "FM16", + "FM17", + "FM18", + "FM19", + "FM23", + "FM24", + "FM25", + "FM26", + "FM27", + "FM28", + "FM29", + "FM35", + "FM36", + "FM37", + "FM38", + "FM39", + "FM48", + "FM49", + "FN00", + "FN01", + "FN02", + "FN03", + "FN10", + "FN11", + "FN12", + "FN13", + "FN14", + "FN20", + "FN21", + "FN22", + "FN23", + "FN24", + "FN30", + "FN31", + "FN32", + "FN33", + "FN34", + "FN40", + "FN41", + "FN42", + "FN43", + "FN44", + "FN45", + "FN46", + "FN50", + "FN51", + "FN52", + "FN53", + "FN54", + "FN55", + "FN56", + "FN57", + "FN62", + "FN63", + "FN64", + "FN65", + "FN66", + "FN67" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-84.55426, 46.46151], + [-84.3367, 46.51436], + [-84.2499, 46.49354], + [-84.10816, 46.5332], + [-84.14328, 46.39895], + [-84.08944, 46.22198], + [-83.95292, 46.04385], + [-83.82946, 46.10571], + [-83.60568, 46.12135], + [-83.42787, 45.99956], + [-83.57965, 45.83198], + [-82.51644, 45.33729], + [-82.12339, 43.58463], + [-82.406, 43.00485], + [-82.48214, 42.73738], + [-82.55317, 42.56716], + [-82.67383, 42.54463], + [-82.81647, 42.37632], + [-83.12607, 42.28569], + [-83.14904, 42.01642], + [-83.06214, 41.86137], + [-82.67212, 41.6688], + [-82.39197, 41.68522], + [-81.2494, 42.21224], + [-80.08484, 42.391], + [-78.94227, 42.82763], + [-78.93677, 42.95642], + [-79.0741, 43.2572], + [-79.20044, 43.4569], + [-78.68409, 43.64402], + [-76.79993, 43.63209], + [-76.43189, 44.09942], + [-76.31104, 44.19795], + [-75.96497, 44.35135], + [-75.81665, 44.4377], + [-75.81665, 44.49258], + [-75.3772, 44.78573], + [-74.83338, 45.01918], + [-74.12476, 44.99199], + [-73.22113, 45.01336], + [-72.31751, 45.00365], + [-71.49903, 45.0153], + [-71.50212, 45.06786], + [-71.39569, 45.20494], + [-71.43448, 45.23331], + [-71.29029, 45.30193], + [-71.13099, 45.25168], + [-71.09047, 45.30433], + [-70.94696, 45.33573], + [-70.88585, 45.2345], + [-70.80552, 45.32216], + [-70.78629, 45.43122], + [-70.65308, 45.3753], + [-70.62561, 45.41002], + [-70.72998, 45.51789], + [-70.56931, 45.65811], + [-70.37842, 45.72535], + [-70.41138, 45.79817], + [-70.27817, 45.87662], + [-70.24109, 45.94589], + [-70.31336, 45.96664], + [-70.31113, 46.05792], + [-70.24109, 46.13797], + [-70.28504, 46.18743], + [-70.20401, 46.33163], + [-70.05982, 46.41892], + [-69.99802, 46.6945], + [-69.22623, 47.45873], + [-69.03397, 47.40764], + [-69.05182, 47.26059], + [-68.90076, 47.17944], + [-68.61649, 47.24567], + [-68.58353, 47.28854], + [-68.37754, 47.28761], + [-68.35007, 47.35743], + [-68.23334, 47.35371], + [-67.95594, 47.19997], + [-67.8859, 47.10845], + [-67.78977, 47.06731], + [-67.80762, 45.6985], + [-67.45606, 45.5756], + [-67.40113, 45.53713], + [-67.50412, 45.48902], + [-67.41898, 45.37337], + [-67.48764, 45.28165], + [-67.34345, 45.12296], + [-67.28302, 45.18978], + [-67.15943, 45.1617], + [-66.96579, 44.82909], + [-66.88614, 44.79499], + [-67, 44.6955], + [-67, 43], + [-78.12207, 31.46898], + [-79.30627, 30.20248], + [-79.41498, 25.25532], + [-80.00708, 24.3994], + [-80.97272, 24.43788], + [-82.55359, 24.47636], + [-85.93506, 24.55327], + [-89.99726, 25.04828], + [-89.99863, 48.03401], + [-89.36486, 47.95903], + [-88.37145, 48.29788], + [-84.78528, 46.86755], + [-84.71472, 46.56769], + [-84.55426, 46.46151] + ] + ] + }, + "properties": { "ituzone": "08" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + }, + "09": { + "mh": [ + "FN56", + "FN57", + "FN58", + "FN59", + "FN63", + "FN64", + "FN65", + "FN66", + "FN67", + "FN68", + "FN69", + "FN73", + "FN74", + "FN75", + "FN76", + "FN77", + "FN78", + "FN79", + "FN83", + "FN84", + "FN85", + "FN86", + "FN87", + "FN88", + "FN89", + "FN93", + "FN94", + "FN95", + "FN96", + "FN97", + "FN98", + "FN99", + "FO50", + "FO51", + "FO52", + "FO53", + "FO54", + "FO55", + "FO56", + "FO57", + "FO58", + "FO59", + "FO60", + "FO61", + "FO62", + "FO63", + "FO64", + "FO65", + "FO66", + "FO67", + "FO68", + "FO69", + "FO70", + "FO71", + "FO72", + "FO73", + "FO74", + "FO75", + "FO76", + "FO77", + "FO78", + "FO79", + "FO80", + "FO81", + "FO82", + "FO83", + "FO84", + "FO85", + "FO86", + "FO87", + "FO88", + "FO89", + "FO90", + "FO91", + "FO92", + "FO93", + "FO94", + "FO95", + "FO96", + "FO97", + "FO98", + "FO99", + "FP50", + "FP51", + "FP60", + "FP61", + "FP70", + "FP71", + "FP80", + "FP81", + "FP90", + "FP91", + "GN03", + "GN04", + "GN05", + "GN06", + "GN07", + "GN08", + "GN09", + "GN13", + "GN14", + "GN15", + "GN16", + "GN17", + "GN18", + "GN19", + "GN23", + "GN24", + "GN25", + "GN26", + "GN27", + "GN28", + "GN29", + "GN33", + "GN34", + "GN35", + "GN36", + "GN37", + "GN38", + "GN39", + "GN43", + "GN44", + "GN45", + "GN46", + "GN47", + "GN48", + "GN49", + "GO00", + "GO01", + "GO02", + "GO03", + "GO04", + "GO05", + "GO06", + "GO07", + "GO08", + "GO09", + "GO10", + "GO11", + "GO12", + "GO13", + "GO14", + "GO15", + "GO16", + "GO17", + "GO18", + "GO19", + "GO20", + "GO21", + "GO22", + "GO23", + "GO24", + "GO25", + "GO26", + "GO27", + "GO28", + "GO29", + "GO30", + "GO31", + "GO32", + "GO33", + "GO34", + "GO35", + "GO36", + "GO37", + "GO38", + "GO39", + "GO40", + "GO41", + "GO42", + "GO43", + "GO44", + "GO45", + "GO46", + "GO47", + "GP00", + "GP01", + "GP10", + "GP11", + "GP20", + "GP21", + "GP30", + "GP31" + ], + "worked": false, + "confirmed": false, + "geo": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-69.9939, 61.24646], + [-54.14269, 61.24388], + [-50, 54], + [-50, 43], + [-67, 43], + [-67, 44.6955], + [-66.88614, 44.79499], + [-66.96579, 44.82909], + [-67.15943, 45.1617], + [-67.28302, 45.18978], + [-67.34345, 45.12296], + [-67.48764, 45.28165], + [-67.41898, 45.37337], + [-67.50412, 45.48902], + [-67.40113, 45.53713], + [-67.45606, 45.5756], + [-67.80762, 45.6985], + [-67.78977, 47.06731], + [-67.8859, 47.10845], + [-67.95594, 47.19997], + [-68.23334, 47.35371], + [-68.35007, 47.35743], + [-68.37754, 47.28761], + [-68.58353, 47.28854], + [-68.61649, 47.24567], + [-68.90076, 47.17944], + [-69.05182, 47.26059], + [-69.03397, 47.40764], + [-69.22623, 47.45873], + [-69.99802, 46.69655], + [-69.9939, 61.24646] + ] + ] + }, + "properties": { "ituzone": "09" } + }, + "worked_bands": {}, + "confirmed_bands": {}, + "worked_modes": {}, + "confirmed_modes": {} + } +} diff --git a/feature/ft8/src/main/assets/launch_supervision_en.txt b/feature/ft8/src/main/assets/launch_supervision_en.txt new file mode 100644 index 00000000..b8034d82 --- /dev/null +++ b/feature/ft8/src/main/assets/launch_supervision_en.txt @@ -0,0 +1,6 @@ +About Tx Watchdog + +Within a 1-minute QSO with protocols such as JT65, users have about 10 seconds to decide whether to proceed with the next stage of action. The shorter sequences of FT8 and FT4 require faster responses and the software needs a moderate amount of built-in automation in actual use. This is why the automation program is used in FT8CN. +The FT8CN endorses the Joel Taylor philosophy and opposes the use of robots for FT8 operations, with limited use of automated programs. +Therefore, FT8CN should supervise the automatic program. +When no one intervenes after the launch regulatory time limit is exceeded,the launch procedure will automatically stop. \ No newline at end of file diff --git a/feature/ft8/src/main/assets/launch_supervision_help.txt b/feature/ft8/src/main/assets/launch_supervision_help.txt new file mode 100644 index 00000000..aebd6320 --- /dev/null +++ b/feature/ft8/src/main/assets/launch_supervision_help.txt @@ -0,0 +1,3 @@ +关于发射监管 + 与JT65等协议的1分钟通联时序,用户可以有大约10秒钟的时间来决定是否继续下一阶段的动作,而FT8和FT4的较短序列需要更快的响应,在实际使用中需要软件内置适量的自动化,这就是FT8CN中使用自动程序的原因。 + FT8CN赞同乔尔·泰勒理念,反对使用机器人用于FT8操作,只能有限度地使用自动化程序,所以FT8CN要对自动程序进行监管,当无人干预超过发射监管时间限制后,发射程序将自动停止。 \ No newline at end of file diff --git a/feature/ft8/src/main/assets/maidenhead.txt b/feature/ft8/src/main/assets/maidenhead.txt new file mode 100644 index 00000000..815b6a7a --- /dev/null +++ b/feature/ft8/src/main/assets/maidenhead.txt @@ -0,0 +1,3 @@ +请输入您梅登海德网格信息,至少4位,如果是6位,在FT8呼叫时会自动忽略后两位。 +如果您给本APP授权定位的权限,点击输入框旁边的定位按钮,APP会自动计算出您当前所在的网格。 +通过您的网格数据,APP会自动计算发起呼叫的电台与您的距离。 \ No newline at end of file diff --git a/feature/ft8/src/main/assets/maidenhead_en.txt b/feature/ft8/src/main/assets/maidenhead_en.txt new file mode 100644 index 00000000..3e3f0699 --- /dev/null +++ b/feature/ft8/src/main/assets/maidenhead_en.txt @@ -0,0 +1,3 @@ +Please enter Maidenhead grid (at least 4 characters). If it is 6 characters, the last two bits are automatically ignored while FT8 calling. + +If you grant the APP the permission to locate, please click the positioning button next to the input box. The APP will automatically calculate the grid you are currently in. \ No newline at end of file diff --git a/feature/ft8/src/main/assets/messageMode.txt b/feature/ft8/src/main/assets/messageMode.txt new file mode 100644 index 00000000..260c3670 --- /dev/null +++ b/feature/ft8/src/main/assets/messageMode.txt @@ -0,0 +1,3 @@ +消息模式,是指显示消息列表的方式。 + 标准列表模式,就是FT8CN传统的FT8消息显示模式,包含FT8消息的要素外,还包括双方呼号归属地、距离、未通联的分区标志、消息类型等。 + 精简列表模式,就是简化的FT8消息显示模式,只包含必要的FT8消息。 \ No newline at end of file diff --git a/feature/ft8/src/main/assets/messageMode_en.txt b/feature/ft8/src/main/assets/messageMode_en.txt new file mode 100644 index 00000000..fd6ccccd --- /dev/null +++ b/feature/ft8/src/main/assets/messageMode_en.txt @@ -0,0 +1,5 @@ +"Message sytle" refers to how messages are displayed. + +Standard list mode is the default FT8 display mode. In addition to FT8 messages, it includes callsign, location, distance, worked zone indicator, message type, etc. + +Simple list mode is a simplified FT8 message display mode that contains only essential FT8 messages. \ No newline at end of file diff --git a/feature/ft8/src/main/assets/nightUSGS4Layer.sqlite b/feature/ft8/src/main/assets/nightUSGS4Layer.sqlite new file mode 100644 index 00000000..98e12578 Binary files /dev/null and b/feature/ft8/src/main/assets/nightUSGS4Layer.sqlite differ diff --git a/feature/ft8/src/main/assets/no_response_help.txt b/feature/ft8/src/main/assets/no_response_help.txt new file mode 100644 index 00000000..11a2ed3b --- /dev/null +++ b/feature/ft8/src/main/assets/no_response_help.txt @@ -0,0 +1,2 @@ +关于无回应次数则中断呼叫 + 在与对方通联时,基于各种原因,对方没有回应您的呼叫,FT8CN会以当前阶段的消息内容重复呼叫,直到对方回应才进入下一阶段的呼叫。当设置无回应的次数时,当达到重复呼叫的次数达到设定值时,自动程序会停止对该目标的通联,转入下一个目标 \ No newline at end of file diff --git a/feature/ft8/src/main/assets/no_response_help_en.txt b/feature/ft8/src/main/assets/no_response_help_en.txt new file mode 100644 index 00000000..cf6231ed --- /dev/null +++ b/feature/ft8/src/main/assets/no_response_help_en.txt @@ -0,0 +1,3 @@ +About call interruption due to no response + +When communicating with the other side and it does not respond to your call for various reasons, FT8CN will repeat the call with the message content of the current stage. A call will not proceed to the next stage until the other side responds. After setting no reply counter, when the number of repeated calls reaches the set value, automatic program will stop communicating to the target and move on to the next target. \ No newline at end of file diff --git a/feature/ft8/src/main/assets/operationBand.txt b/feature/ft8/src/main/assets/operationBand.txt new file mode 100644 index 00000000..cd3dd29b --- /dev/null +++ b/feature/ft8/src/main/assets/operationBand.txt @@ -0,0 +1,3 @@ +载波频段,是指电台在发射时所使用的载波频段。载波频段,会记录到每一个通联的日志中。 +在CAT模式下,APP会自动设置电台的载波频段。 +在VOX模式下,只用于保存日志。 \ No newline at end of file diff --git a/feature/ft8/src/main/assets/operationBand_en.txt b/feature/ft8/src/main/assets/operationBand_en.txt new file mode 100644 index 00000000..25702670 --- /dev/null +++ b/feature/ft8/src/main/assets/operationBand_en.txt @@ -0,0 +1,4 @@ +Band refers to the carrier frequency band used by the RIG while transmitting. Carrier bands are recorded in the log of each connection. + +In CAT mode, the APP sets the carrier band of the RIG automatically. +In VOX mode, it is only used to save logs. \ No newline at end of file diff --git a/feature/ft8/src/main/assets/pttdelay.txt b/feature/ft8/src/main/assets/pttdelay.txt new file mode 100644 index 00000000..66d78274 --- /dev/null +++ b/feature/ft8/src/main/assets/pttdelay.txt @@ -0,0 +1,2 @@ +PTT延迟,是指本电台接收到PTT按下的指令后的响应时间。 +当FT8CN发送PTT按下的指令后,往往电台会稍有滞后的响应,设定此时间,是为了电台真正处于发射状态后,FT8CN才发送声音,防止因PTT滞后造成声音无法完全发送。 \ No newline at end of file diff --git a/feature/ft8/src/main/assets/pttdelay_en.txt b/feature/ft8/src/main/assets/pttdelay_en.txt new file mode 100644 index 00000000..02814b59 --- /dev/null +++ b/feature/ft8/src/main/assets/pttdelay_en.txt @@ -0,0 +1 @@ +PTT delay refers to the response time after the RIG receives the instructions of PTT. FT8CN sends a PTT pressed command, the response of the RIG tends to lag slightly. The time is set to ensure that the FT8CN sends the sound after the RIG is in the transmitted state, preventing the sound from being unable to send completely due to PTT lag. diff --git a/feature/ft8/src/main/assets/qrz.txt b/feature/ft8/src/main/assets/qrz.txt new file mode 100644 index 00000000..f820a7a9 --- /dev/null +++ b/feature/ft8/src/main/assets/qrz.txt @@ -0,0 +1,5 @@ +关于QRZ同步功能 + +该功能帮助您在完成通联后即时上传本次QSO到QRZ.com。 + +您需要在qrz的日志本中获取API KEY,并填写至软件中。 \ No newline at end of file diff --git a/feature/ft8/src/main/assets/qrz_en.txt b/feature/ft8/src/main/assets/qrz_en.txt new file mode 100644 index 00000000..1b0e39f9 --- /dev/null +++ b/feature/ft8/src/main/assets/qrz_en.txt @@ -0,0 +1,5 @@ +About QRZ + +This feature allows you to upload the QSO record to QRZ immediately after QSO is completed. + +You need to obtain the API KEY in the logbook of the QRZ and enter it into the software. \ No newline at end of file diff --git a/feature/ft8/src/main/assets/readme.txt b/feature/ft8/src/main/assets/readme.txt new file mode 100644 index 00000000..8c5190e9 --- /dev/null +++ b/feature/ft8/src/main/assets/readme.txt @@ -0,0 +1,333 @@ +免责声明: + FT8CN旨在研究的目的,学习如何对FT8信号进行解码、发射等操作,不对使用者操作本APP所产生的后果负责。 + 在中华人民共和国境内,使用FT8CN请遵守《中华人民共和国无线电管理条例》等相关规定。 + 考虑到手机的性能和续航的限制,对信号的处理采用轻量化的运算,未做深度解码等处理。 + 如有好的建议或问题可以提交到到”有问题要吐槽“。 + +Disclaimer +FT8CN aims to learn how to decode, transmit FT8 signal for research purposes, which is not responsible for the consequences caused by the user's operation. +Please comply with local laws and regulations when using FT8CN. +Considering the performance and endurance limitations of the mobile phone, the processing of the signal adopts lightweight operations instead of deep decoding and other processing. +Please click "FAQ" if you have good suggestions or questions . + + +BG7YOZ +2022-07-01 + + 2025-01-04(0.93) + 1.修正发射监管时间计算错误。 + 2.修正下载日志数据缺少第一条数据的问题。 + 3.增加日志数据分享功能。 + 4.增加自动向QRZ、CloudLog上传日志的功能(由SydneyOwl贡献代码)。 + 5.增加SWR,ALC告警开关。 + + 2024-01-22(0.92) + 1.增加瀑布图中消息的已通联标识。 + 2.新增支持的电台型号。 + 3.增加串口参数设置。 + 4.新增解码的消息类型,支持全部FT8消息类型。 + 5.修正串口错误提示只有中文的问题。 + 6.完善SWL QSO日志记录。 + 7.完善消息中带有/P或/R后缀呼号的通联程序。 + + + 2023-09-14(0.91 patch 1) + 1.修正Yaesu FT-891/991 选择USB-DATA模式错误。 + + 2023-09-11(0.91) + 1.修正发射非标准消息(i3=4)RR73被误发成73的问题。 + 2.修正因多重解码模式下,无法及时回复上一周期解码的消息以及漏发73的问题。 + 3.修正生成双方都是复合呼号的消息时,发送方的呼号可能不正确的问题。 + 4.优化自动程序。 + + 5.增加(tr)uSDX Audio over cat功能,由DS1UFX贡献代码。 + 6.增加支持XieGu(协谷)X6100的Wifi模式(固件版本 1.1.7,发射音频还未解决)。 + 7.增加支持Kenwood TS-570D。 + 8.增加Yaesu FT-891/991 USB-DATA模式。 + 9.增加对消息列表上的呼号QSO日志一键查询。 + 10.增加消息列表精简显示模式。 + + 2023-08-13(0.90) + 1.增加日志导入时Web界面交互模式。 + 2.修正当日志数据量过大时,地图崩溃的问题。 + 3.优化数据库结构,提升日志数据导入、更新速度(更新此版本前,建议备份日志以防不测)。 + 4.修正部分单词拼写错误。 + 5.增加电台UA3REO Wolf SDR。 + 6.增加电台GUOHE(国赫) PMR-171。 + + 2023-07-08(0.89) + 1.增加多重解码功能,在多重解码模式下,提高解码深度,尝试解码叠加的信号。 + 2.解决导入ADI后通联过的分区没有及时更新的问题。 + 3.解决iCom电台在网络模式下,发射音频会出现破音的情况。 + 4.解决在某些情况下RR73卡死的问题。 + 5.提高解码稳定性。 + 6.改正解码消息的comment字段有时不正确显示的问题。 + 7.修改导出日志的提示。 + + + 2023-05-02(0.88 Patch 2) + 1.增加音频输出设置(位深、采样率)。 + 2.增加日志可以按条件查询并导出。 + 3.修改日志查询以时间为降序显示。 + 4.修正SWL QSO记录重复的问题。 + 5.针对各主流浏览器优化后台UI。 + patch 2 + 6.修正“通联记录”定位闪退问题。 + + 2023-03-24(0.87) + 1.增加查询的通联日志结果在地图中定位显示功能。 + 2.增加FlexRadio仪表显示和参数设置(目前暂不支持发射)。 + 3.增加时间自动同步功能(服务器是Microsoft NTP)。 + 4.增加SWL模式,对解码消息以及QSO有保存和导出的功能(SWL的QSO认定标准:至少要有双方的报告,以及结束语73、RR73、RRR)。 + 5.丰富后台数据的查询功能。 + 6.修正后台查询“呼号与网格映射表”中距离计算的错误。 + 7.针对协谷G90S未来的新固件,调整电台型号选项。 + 8.解决解码消息较多时界面会卡顿的问题。 + 9.优化日志查询性能。 + + 2023-02-06(0.86) + 1.提高日志导入的健壮性,反馈格式错误的日志信息。 + 2.修正在推算SNR时,偶尔会出现数组下标越界造成闪退的问题。 + 3.修正导入日志后数量计算不准确的问题。 + + 2023-01-28(0.85) + 1.增加排除的呼号前缀功能(排除的呼号前缀的动作具有最高优先级,为自动程序排除掉不需要的呼叫)。 + 2.增加GridTracker中地图的日落日出灰线。 + 3.增加清空关注呼号列表功能。 + 4.增加清空缓存的通联QSO消息功能。 + 5.增加呼叫修饰符功能。例如 CQ POTA xxxxxx xxxx、或CQ DX xxxxxx xxxx。修饰符范围是000-999,A-Z,AA-ZZ,AAA-ZZZ,AAAA-ZZZZ。 + 2023-01-08(0.84) + 1.优化地图的色彩模式。 + 2.修补因线程不同步,导致提示消息操作闪退的问题。 + 3.解决部分日志字段表述不标准,造成导入日志失败的问题。 + 4.优化呼号的哈希表处理。 + 2023-01-07(0.83) + 1.增加自由文本发射功能。 + 2.修改因Execute-only memory violation错误造成的闪退问题。 + 3.修改某型号电台设置错误的问题。 + 4.修改日志导入导出操作,增加导出日志中确认字段,通过导入日志自动更新确认项。 + 5.排除多个内存泄漏点。 + 6.解决部分日志QSO中对方网格不准确的问题。 + 7.解决长期在网格追踪的界面下,会息屏的问题。 + 2022-12-31(0.8.1) + 再见,2022!愿明天更好! + 注意!此版本数据库结构有更新,升级前,请导出日志备份,升级后,将无法回退到旧的版本。 + 注意!此版本开始支持ICOM的网络控制功能,建议使用电台的WIFI连接手机的AP(优先选项),或手机连接电台的AP。 + 注意!不建议使用路由器来连接,如果路由器的性能不够,会造成发射音频是丢包!!! + 1.增加ICom系列电台的网络(Wifi)支持。 + 2.增加ICom系列电台驻波比、ALC值过高警告功能。 + 3.增加建伍TS系列电台驻波比、ALC值过高警告功能。 + 4.增加YAESU各系列电台驻波比、ALC值过高警告功能。 + 5.增加Elecraft系列电台驻波比、ALC值过高警告功能。 + 6.增加ICom部分电台在不同的连接方式下,自动切换Connectors的Data mode。 + 7.增加调整信号强度功能,用于调节ALC。 + 8.增加支持3位呼号的呼叫能力。 + 9.增加支持的电台。 + 10.增加获取最新版本的入口。https://github.com/N0BOY/FT8CN/releases + 11.增加呼号与网格的映射表(升级数据库)。 + 12.增加地图可视化展示功能(类似于GridTracker)。 + 13.增加在地图中呼叫的能力。 + 14.解决部分设备在处理音频数据时,因内存抖动造成程序崩溃的问题。 + 15.解决部分消息的QTH不准确的问题。 + 16.修正了在一些情况下,发射条目上有分区图标显示的问题。 + 17.修正了发射含有3位呼号消息时闪退的问题。 + 18.优化频谱图,解决低辨率下文字信息显示不正常的问题, + 19.更新部分地区的坐标 + 20.优化消息列表处理策略,减少内存抖动。 + 21.修正当达到无回应阈值,切换目标呼号后,提示消息没有随之变化的问题。 + 22.解决部分非标准呼号地理位置无法解析的问题。 + 23.修正因高版本安卓及高版本ARM64的内存访问机制造成异常崩溃的问题。 +2022-11-08(0.79) + 1.协谷X6100的操作模式改为U-DIG模式。 + 2.把音频数据格式从16位整型改为32位浮点模式。 + 3.修正FFT过程存在内存泄漏的问题。 + 4.增加Flex-6000系列网络连接模式支持,目前仅支持接收,不支持发射。 + 5.增加禁止锁屏休眠。 + 6.控制历史消息数量(暂时设置在3000条以内)。 + 7.增加全屏模式。 + 8.增加快速切换频率。 + 9.修正部分电台(iCOM、协谷)因数据传输质量不好造成闪退的问题。 + 10.修正对小于6位的非标准呼号识别错误的问题。 + 存在的问题: + 1.连接Flex电台,只能在同一网段内,暂时没有增加输入IP直接连接的方式。 +2022-11-18(0.79 Patch 4) + 1.解决部分设备解码按钮失效的问题。 + 2.增加连接Flex电台,可以用输入IP的方式直接连接,解决跨网段连接的问题。 +2022-10-06(0.78) + 1.继续优化自动程序逻辑,修正自动呼叫打开时,目标不专一的问题。 + 2.对日志删除动作,弹出删除确认对话框。 +2022-10-01(0.77) + 1.修改统计按波段统计大小写被区分的问题。 + 2.对曾经通联过的呼号,不在当前波段的,以蓝色字体颜色显示。 + 3.新增电台型号。 +2022-09-24(0.76) + 1.调整历史通联呼号规则,以波段(波长)区分。 + 2.修改发射监管会自减的错误。 + 3.继续解决日志信号报告不准确的问题。 + 4.继续优化自动程序策略。 +2022-09-17(0.75) + 1.继续修改通联日志的信号报告问题(信号报告反了、数值不准确)。 + 2.增加针对安卓12,申请蓝牙连接权限。 + 3.针对某型号电台,USB线连接后指令反应不及时的问题,启用延时发送指令。 + 4.YAESU FT450D的操作模式改为USER-U模式。 + 5.继续优化自动程序,调整自动程序的运行机制,自动记录日志提前。 + 6.退出应用时,如果处于发射状态,自动关闭PTT。 + 7.解决带哈希呼号的消息因过采样造成重复的问题。 + 8.增加日文、希腊、西班牙UI。 + 9.修正关注的消息不在同一频段内自动呼叫的错误。 +2022-09-09(0.74) + 1.增加英文版帮助。 + 2.呼号查询结果以时间降序显示。 + 3.ICOM电台,操作模式改为USB-D模式。 + 4.增加对呼号的QRZ查询功能。 + 5.修正了日志中信号报告值不严谨的问题。 +2022-09-03(0.73) + 1.修正某些日志起始时间不准确的问题。 + 2.优化对为通联过的分区标注。 + 3.基于消息的历史,把没有网格报告的消息也标注出距离。 +2022-08-28(0.72) + 1.解决自动程序中自己呼叫自己的问题。 + 2.对通联成功的呼号以通联成功的频率做出区分。 + 3.丰富了一下后台”跟踪运行信息“内容。 + 4.重新增加通联记录中呼号查询列表,并调整了显示的内容。 + 5.解决因数组下标溢出导致闪退的问题。 + 6.减少权限申请,取消存储权限,保留麦克风、位置权限(可以拒绝)。 + 7.解决没有麦克风权限造成闪退的问题。 +2022-08-27(0.71) + 1.优化发射周期PTT打开的时长,确保接收消息周期的完整。 + 2.解决Q900蓝牙发送、接收音频适配的问题,真正实现蓝牙控制、音频收发能力。 + 3.美化在消息的分区标注。 + 4.新增电台支持。 + 5.解决有时新增消息后,消息列表不自动上移的问题。 +2022-08-22(0.7) + 1.加入DXCC分区数据统计。 + 2.加入ITU分区数据统计。 + 3.加入CQ分区数据统计。 + 4.对各频段的距离做统计。 + 5.对未通联过的DXCC、ITU、CQ分区呼号做标注。 + 6.解决前缀1位字母2位数字呼号计算不准确的问题。 +2022-08-13(0.63) + 1.修正了对非标准呼号的认定,解决对部分非标准呼号计算错误的问题。 + 2.继续优化了一些布局(尤其是横屏)。 + 3.增加了繁体位置信息。 +2022-08-11(0.62) + 1.把FT-817/818系列的工作模式由USB改为DIGI模式。 + 2.把发射消息回显到呼叫栏中。 + 3.解决部分设备在手动中断发射时,闪退的问题。 + 4.解决我的呼号为空时,发射闪退的问题。 + 5.解决某型号电台控制问题。 + 6.增加英文语言包。 + 7.优化了布局。 +2022-08-06(0.6) + 1.重构与电台有关的底层架构,适应多型号电台。 + 2.完成国赫,YAESU,KENWOOD部分型号电台的指令集。 + 3.完成通过蓝牙串口(SPP模式)进行控制功能。 + 4.实现对蓝牙音频的采集。 + 5.修改了规则,不能自己呼叫自己。 + 6.增加了对非标准呼号、复合呼号的支持。 + 7.增加了发射时,如果采集不到声音,会把发射的消息提交到呼叫列表。 +2022-07-17(0.51) + 1.在BA2BI的帮助下,解决频段波长不正确的问题。 + 2.修复设置页面载波频段列表内容重复的问题。 + 3.解决DTR不能发射的问题。 + 4.增加电台频率变化后,保存电台的频率值,如果通联成功,以电台频率为准。 + 5.增加对WSPR-2频率的保护功能,当电台选择的频率在WSPR-2的范围内,禁止发射。 + 6.解决0.5版日志中对方呼号没有网格信息的问题。 + 7.解决0.5版对自动关注的CQ目标不自动呼叫的问题。 + 8.解决了后台无法删除关注的呼号问题。 + 9.添加发射、监听的进度条。 + 10.增加日志导入导出的同步功能,并自动LoTW确认。 + 11.增加手工确认。 + 12.增加电台PTT响应延迟设定。 + 13.增加在消息列表中向左滑动开始快速呼叫(本周期前2.5秒内起作用)。 + 14.对日志导出中,增加了”今天的日志“。 + 15.解决无法删除带斜线的呼号问题。 + 16.通联记录查询添加简单的过滤功能。 +2022-07-10(0.5) + 此版本属重大更新。完善了自动程序,增加日志查询,导出功能。到此,基本完成一个可以具备通联能力的APP。 + 此外,还有如下变化: + 1.修复瀑布图文字重叠问题。 + 2.增加电台支持,以及波特率。 + 3.修复当没有定位权限,启动崩溃问题。 + 4.增加DTR支持。 + 5.修复一些随时发现的小错误。 + 6.增加自动发射的监管。 + 7.增加自动关注CQ开关。 + 8.增加自动呼叫关注的呼号开关。 + 9.增加对消息偏移时间过长做标注。 + 存在的问题: + 1.如果对方是从第2个消息开始呼号我,保存的日志中就没有对方的网格,其实在消息上下文中存在对方的网格信息。 + 2.如果自动关注CQ消息,并打开自动回复关注开关,当有CQ的消息时并不回复。 + 以上问题将在下一个版本中解决。 +2022-07-02(0.44) + 1.增加问题收集反馈的入口。 + 2.修正在设置页面会闪退的BUG。 + 3.把x5105加到设备列表中。 +2022-07-01(0.43) + 1.在BG7IKK的帮助下,解决部分电台使用RTS控制PTT的问题。 + 2.BI1NIZ注册了一个项目问题收集反馈和FAQ的账号。 + 3.在频谱的标尺上加了发射频率的红色标记。 +2022-06-30(0.42) + 1.BH7ACO帮助解决了协谷X6100的驱动。(未解决的问题,协谷6100有时会莫名断开,解决办法:设置SSB模式的指令延迟1秒发送,解决得不够理想) +2022-06-29(0.41) + 1.反馈705、7100、7300控制测试成功。 + 2.BH2RSJ帮助建立了一个APP测试群,群成员在陆续反馈使用的情况,提出了一些修改意见。 + 3.修改了一下启动方式,确保配置参数能按时读入。 + 4.修改了对电台修改频率,会把filter变为FIL2的错误。 +2022-06-27 + 1.增加了电台CAT控制功能,目前支持部分ICOM系列电台。目前只对IC-705做测试成功,因为手中没有ICOM的其他型号,不清楚串口的驱动能否识别并使用。 + 2.查找到可以支持CI-V指令控制的ICOM电台列表,以及各型号电台的默认地址。 +2022-06-20 + 1.增加了帮助功能 + 2.增加了瀑布图的标记功能 + 3.对android 10版本以上的深色模式做了一些适配 + 4.更换了图标(BG7YOY设计) + + + +致敬: + Steve Franke(K9AN)、Bill Somerville(G4WJS)、Joe Taylor(K1JT),提出FT8和FT4协议(FT是Franke和Taylor的首字母),并在论文《The FT4 and FT8 Communication Protocols》详细介绍了FT4和FT8的设计初衷和在WSJT-X中的具体实现细节,成为完成本APP的根本指南。 + Karlis Goba(YL3JG)在代码的具体实现上提供了参考。 +鸣谢: + BG7YOY,在FT8CN开发阶段为我在无线电基本理论上作出指导,并为FT8CN设计了图标。 + BG4IGX,在我刚刚入门业余无线电时为我在具体实践上作出指导。抖音上您可以搜到很多他的教学视频。 + BD7MXN,帮助我对部分电台的连接控制做了一些测试,并提出改进建议。 + BH2RSJ,帮助我建立了一个FT8CN测试群,为测试和后续改进提出了很多宝贵意见。 + BH7ACO,帮助解决了某电台的驱动和相关的配置参数。 + BG7IKK,帮助解决了只支持通过RTS控制PTT发射的电台的测试。 + BI1NIZ,帮助注册账号,用于收集问题反馈和FAQ的功能。 + BD3OOX以及石家庄业余无线电俱乐部,FT8CN的呼号地区归属数据提取至JTDX石家庄版,使呼号定位可以精确到中国的省级。 + VR2UPU(BD7MJO),在FT8的开发和使用经验上提供指导,并在多语言方面给予帮助。 + BA2BI,在业余无线电的基础知识和通联的日志处理方面上给予帮助和指导。 + BI3QXJ,在对某品牌系列电台的指令集上给予专业性的指导。 + BG6TQD,在对某型号电台的指令集测试上给予帮助。 + BG5CSS,提供某型号电台用于测试。 + BG7YXN,提供某型号电台用于测试。 + BG7YRB,对呼号规则运算提供帮助。 + BG8KAH,提供设备用于测试。 + BA7LVG,完成日文的翻译校对工作。 + JE6WUD,完成日文的翻译校对工作。 + BG6RI,帮助解决日志的信号报告问题。 + SV1EEX,完成希腊文、西班牙文UI的翻译工作。 + VR2VRC,帮助修正历史呼号读取规则。 + BA7NQ,提供设备用于测试。 + BD7MYM,对某型号的电台测试给予指导。 + NØBOY,帮助提供Github源,以及翻译工作。 + BG5JNT,帮助修正非标准呼号的识别问题。 + BH3NEK,协助对某型号电台进行测试。 + BG2ALB,协助对某型号电台进行测试。 + BG6DRU,协助对某型号电台进行测试。 + BG7NQF,提供某型号电台的隐藏指令,对一些设备做兼容性测试。 + BH2VSQ,协助对某型号电台进行测试。 + BG7YBW,协助对部分功能进行测试。 + BH1RNN,协助对部分功能进行测试。 + BG7BSM,协助对一些BUG进行调试。 + BH4FTI,发现并协助对一些BUG进行调试。 + BG8BXM(M哥),为FT8CN的使用做推广,抖音和B站上有很多他的教学视频。 + BG7MFQ,为FT8CN的使用做推广,帮助测试。 + BG2EFX,提供大数据量的日志用于测试。 + DS1UFX,贡献(tr)uSDX audio over cat代码。 + BG8HT,提供某型号电台进行测试。 + UB6LUM,帮助解决某型号电台的操作模式设置。 + SydneyOwl,提供向QRZ、Cloudlog上传日志的代码。 + diff --git a/feature/ft8/src/main/assets/rig_model_help.txt b/feature/ft8/src/main/assets/rig_model_help.txt new file mode 100644 index 00000000..0a19a4ed --- /dev/null +++ b/feature/ft8/src/main/assets/rig_model_help.txt @@ -0,0 +1,2 @@ +关于电台型号:根据选择的电台型号,FT8CN有针对性的使用可以控制该电台的指令集,不同的品牌的电台指令集并不相同,请在列表中选择您正在使用的电台。 +对于ICOM系列电台,本列表中所列的是已知默认CI-V地址和最大支持波特率的各电台型号,可以通过选择本列表中的电台,自动设置CI-V地址和波特率。如果您使用的电台型号不在本列表中,需要您自行设置合适的CI-V地址和波特率。 \ No newline at end of file diff --git a/feature/ft8/src/main/assets/rig_model_help_en.txt b/feature/ft8/src/main/assets/rig_model_help_en.txt new file mode 100644 index 00000000..0cfb8368 --- /dev/null +++ b/feature/ft8/src/main/assets/rig_model_help_en.txt @@ -0,0 +1,4 @@ +About Rig Model + +Depending on the selected RIG model, the targeted use of FT8CN can control the instruction set of the RIG and the instruction set of different brands of RIGs is not the same. Please select the RIG you are using from the list. +For ICOM series RIGs, this list contains the known default CI-V address and the maximum support for each RIG model. You can select the RIG in this list and the CI-V address and baud rate will be set automatically. If the RIG model you are using is not in this list, you need to set the appropriate CI-V address and baud rate yourself. diff --git a/feature/ft8/src/main/assets/rigaddress.txt b/feature/ft8/src/main/assets/rigaddress.txt new file mode 100644 index 00000000..28f4a268 --- /dev/null +++ b/feature/ft8/src/main/assets/rigaddress.txt @@ -0,0 +1,72 @@ +ICOM IC-7000,70,19200,0 +ICOM IC-705,A4,115200,0 +ICOM IC-7100,88,19200,0 +ICOM IC-7200,76,19200,0 +ICOM IC-7300,94,115200,0 +ICOM IC-7400,66,19200,0 +ICOM IC-7410,80,19200,0 +ICOM IC-746,56,19200,22 +ICOM IC-746PRO,66,19200,22 +ICOM IC-756PRO,5C,19200,22 +ICOM IC-756PRO2,64,19200,22 +ICOM IC-756PRO3,6E,19200,22 +ICOM IC-7600,7A,19200,0 +ICOM IC-7610,98,115200,0 +ICOM IC-7700,74,19200,0 +ICOM IC-7800,6A,19200,0 +ICOM IC-7850,8E,115200,0 +ICOM IC-7851,8E,115200,0 +ICOM IC-9100,7C,19200,0 +ICOM IC-9700,A2,115200,0 +ICOM IC-R8600,96,115200,0 +ICOM ID-52A,A6,115200,0 +ICOM IC-706MKIIG,58,19200,0 +ICOM IC-706MKII,4E,19200,0 +ICOM IC-703,68,19200,0 +ICOM IC-707(725A),3E,19200,0 +ICOM IC-718,5E,19200,0 +ICOM IC-725,28,19200,0 +ICOM IC-746PRO,66,19200,0 +ICOM IC-756PRO3,6E,19200,0 +ICOM IC-775,46,19200,0 +ICOM IC-910H,60,19200,0 +ICOM IC-78,62,19200,0 +#XIEGU(协谷) X6100(FT8CNS),A4,19200,20 +XIEGU(协谷) X6100(U-DIG),A4,19200,13 +XIEGU(协谷) X6200(U-DIG),A4,19200,13 +XIEGU(协谷) G90S(U-DIG),70,19200,13 +XIEGU(协谷) G90S(USB),70,19200,9 +XIEGU(协谷) G106C(U-DIG),70,19200,13 +XIEGU(协谷) G106C(USB),70,19200,9 +XIEGU(协谷) X5105,70,19200,9 +XIEGU(协谷) X108,70,19200,9 +GUOHE(国赫) Q900,00,19200,8 +GUOHE(国赫) PMR-171,00,19200,8 +YAESU FT-450(D),00,4800,4 +YAESU FT-817,00,4800,1 +YAESU FT-818,00,4800,1 +YAESU FT-847,00,4800,21 +YAESU FT-857,00,4800,1 +YAESU FT-891/991(USB),00,4800,2 +YAESU FT-891/991(DATA-USB),00,4800,19 +YAESU FT-897(D),00,4800,1 +YAESU FT-950,00,4800,3 +YAESU FT-2000(D),00,4800,3 +YAESU FT-DX10,00,38400,6 +YAESU FT-DX101,00,38400,6 +YAESU FT-DX Other series,00,4800,3 +KENWOOD(建伍) TK-90,00,9600,5 +KENWOOD(建伍) TS-480,00,9600,7 +KENWOOD(建伍) TS-570,00,4800,18 +KENWOOD(建伍) TS-590,00,9600,7 +KENWOOD(建伍) TS-2000,00,9600,14 +KN990,00,38400,1 +Elecraft K3S\K3\KX3\KX2,00,38400,10 +mcHF-QRP sdr,00,4800,1 +FlexRadio 6000 series,00,00,12 +FX-4CR,00,115200,7 +Qrp Labs QDX,00,9600,7 +UA3REO Wolf SDR(DIGU),00,4800,15 +UA3REO Wolf SDR(USB),00,4800,16 +(tr)uSDX (audio over cat),00,115200,17 +(tr)uSDX (TS-480),00,9600,7 \ No newline at end of file diff --git a/feature/ft8/src/main/assets/serial_help.txt b/feature/ft8/src/main/assets/serial_help.txt new file mode 100644 index 00000000..5ad25396 --- /dev/null +++ b/feature/ft8/src/main/assets/serial_help.txt @@ -0,0 +1,5 @@ +关于串口设置 +数据位:一般可以是6位、7位或8位,多数是8位。 +停止位:一般可以是1位、1.5位或2位,多数是1位。 +校验位:校验位一般用来判断接收的数据位有无错误,一般采用奇偶校验或无校验。 +注:FT8CN默认的串口设置是数据位8、停止位1、无校验。不同的电台的串口设置可能不尽相同,具体设置请与电台的参数一致。 \ No newline at end of file diff --git a/feature/ft8/src/main/assets/serial_help_en.txt b/feature/ft8/src/main/assets/serial_help_en.txt new file mode 100644 index 00000000..0d223cf7 --- /dev/null +++ b/feature/ft8/src/main/assets/serial_help_en.txt @@ -0,0 +1,7 @@ +About Serial Connection Settings: +Data bits: can be 6 bits, 7 bits, or 8 bits (8 bits is most common) +Stop bits: can be 1 bit, 1.5 bits, or 2 bits (1 bit is most common) +Parity bit: Parity bit is used to check for errors in received data and can be odd, even, or no parity. + +Note: The default serial port settings for FT8CN are 8 data bits, 1 stop bit, and no parity. +The serial connection settings may vary for different radios. Please ensure it matches the settings in your radio. \ No newline at end of file diff --git a/feature/ft8/src/main/assets/swlMode.txt b/feature/ft8/src/main/assets/swlMode.txt new file mode 100644 index 00000000..9f44a071 --- /dev/null +++ b/feature/ft8/src/main/assets/swlMode.txt @@ -0,0 +1,7 @@ +SWL是英文Shortwave Listener的简称,即短波收听爱好者。 +SWL模式是仅仅收听其他业余无线电爱好者的通联,而不进行无线电发射的模式。 +针对SWL,FT8CN增加了“保存解码消息”和“保存SWL记录”功能。 +保存解码消息:就是把FT8CN所有解码的消息都保存下来。 +保存SWL记录:就是把守听到的其他业余无线电台通联的QSO日志保存下来。在FT8CN中,认定成功的SWL QSO标准是:有结束语(73、RR73、RRR)且有双方的信号报告,双方的网格报告不是必须项。 +保存的“解码消息”和“SWL记录”可以在后台(需要在同网段的局域网,用浏览器访问)做查询以及导出操作。 +保存的“解码消息”和“SWL记录”的删除操作在”设置界面“的”清空缓存“中操作。 \ No newline at end of file diff --git a/feature/ft8/src/main/assets/swlMode_en.txt b/feature/ft8/src/main/assets/swlMode_en.txt new file mode 100644 index 00000000..1a008811 --- /dev/null +++ b/feature/ft8/src/main/assets/swlMode_en.txt @@ -0,0 +1,7 @@ +SWL stands for Shortwave Listener, whom may not hold an amateur radio licence to transmit but listen and report amateur radio QSOs. FT8CN supports "Save decoded messages" and "Save SWL QSO" for SWL. + +Save decoded messages: FT8CN will save all decoded messages. +Save SWL QSO: FT8CN can save QSO log as SWL when both stations provide signal report and 73/RR73/RRR (Gridsqure is optional). + +You can look up and export saved decoded messages or SWL QSO log via Web UI (under the same LAN). +You can delete them using "Clear Cache Data" in settings. \ No newline at end of file diff --git a/feature/ft8/src/main/assets/timeoffset.txt b/feature/ft8/src/main/assets/timeoffset.txt new file mode 100644 index 00000000..54c2275e --- /dev/null +++ b/feature/ft8/src/main/assets/timeoffset.txt @@ -0,0 +1,3 @@ +时间偏移,是指本APP在每个周期相对于系统时钟的偏移值。 +FT8的时钟周期是15秒,所有电台的时钟都是以UTC时间为基准,以每分钟的第0秒、15秒、30秒、45秒为周期的起始时间。 +如果可以访问网络,FT8CN会自动同步时间,如果不能访问网络,可以手动设定偏移值。 \ No newline at end of file diff --git a/feature/ft8/src/main/assets/timeoffset_en.txt b/feature/ft8/src/main/assets/timeoffset_en.txt new file mode 100644 index 00000000..042ed1d2 --- /dev/null +++ b/feature/ft8/src/main/assets/timeoffset_en.txt @@ -0,0 +1,3 @@ +Local clock offset: +In FT8, all stations start TX/RX at each 0/15/45/60 seconds, which require accurate time synchronization. +FT8CN will automatically sync time via internet. When internet is not available, you can adjust the local clock by changing this local clock offset. diff --git a/feature/ft8/src/main/assets/transDelay.txt b/feature/ft8/src/main/assets/transDelay.txt new file mode 100644 index 00000000..1dc448b0 --- /dev/null +++ b/feature/ft8/src/main/assets/transDelay.txt @@ -0,0 +1,7 @@ +设置发射延迟(以毫秒为单位)是为了在上一个监听周期结束后,给解码运算一个时间。 +设定一个延迟可以在发射前获知上一个周期对方的反馈情况,并在本周期内做出反应。 +延迟时间的设定取决于本设备的运算能力,延迟时间不能小于解码运算的时间长度。 +如果延迟时间过短,可能无法对上一周期的信号做出反应。 +如果延迟时间过长,其它电台可能无法正常解析出您的信号。 +在实际应用中,由于在给电台发送PTT指令后,电台会有一个响应时间(FT8CN暂定为100毫秒),所以实际声音信号的发射时间是发射延迟+100毫秒,如:设定发射延迟500毫秒,实际信号的发射是500+100=600毫秒。 +FT8的信号实际周期长度为12.64秒,建议最大延迟时间不要超过1.08秒。 \ No newline at end of file diff --git a/feature/ft8/src/main/assets/transDelay_en.txt b/feature/ft8/src/main/assets/transDelay_en.txt new file mode 100644 index 00000000..8a41a1dc --- /dev/null +++ b/feature/ft8/src/main/assets/transDelay_en.txt @@ -0,0 +1,7 @@ +Tx delay time (MS) is set to allow time for decoding operations at the end of the last listening cycle. +Setting a delay allows the user to get feedback from the previous cycle before launch and react during this cycle. +The setting of delay time depends on the operation ability of the device, and the delay time can not be less than the length of decoding operation time. +If the delay time is too short, the device may not be able to respond to signals from the previous period. +If the delay time is too long, other RIGs may not be able to parse your signal properly. +In practice, since the RIG will have a response time (FT8CN is tentatively set at 100 milliseconds) after sending PTT instruction to the RIG, the actual transmission time of the sound signal is the transmission delay plus 100 ms. For example, if the transmission delay is set to 500 ms, the actual signal transmission time is 500 plus 100, which equals 600 ms. +The actual signal cycle length of FT8 is 12.64 seconds. It is recommended that the maximum delay time should not exceed 1.08 seconds. \ No newline at end of file diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/FAQActivity.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/FAQActivity.java new file mode 100644 index 00000000..442a3872 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/FAQActivity.java @@ -0,0 +1,46 @@ +package com.bg7yoz.ft8cn; +/** + * 问题收集的WebView。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.annotation.SuppressLint; +import android.os.Bundle; +import android.webkit.WebView; +import android.webkit.WebViewClient; + +import androidx.appcompat.app.AppCompatActivity; + +public class FAQActivity extends AppCompatActivity { + + @SuppressLint("SetJavaScriptEnabled") + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_faqactivity); + + + WebView webView = (WebView) findViewById(R.id.faqWebView); + webView.getSettings().setJavaScriptEnabled(true); + webView.getSettings().setDomStorageEnabled(true); // 这个要加上 + + /* 获得 webview url,请注意url单词是product而不是products,products是旧版本的参数,用错地址将不能成功提交 */ + //String url = "https://www.qrz.com/db/BG7YOZ"; + String url = "https://support.qq.com/product/415890"; + + /* WebView 内嵌 Client 可以在APP内打开网页而不是跳出到浏览器 */ + WebViewClient webViewClient = new WebViewClient() { + @Override + public boolean shouldOverrideUrlLoading(WebView view, String url) { + super.shouldOverrideUrlLoading(view, url); + view.loadUrl(url); + return true; + } + }; + webView.setWebViewClient(webViewClient); + + webView.loadUrl(url); + } + +} \ No newline at end of file diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/FT8Common.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/FT8Common.java new file mode 100644 index 00000000..67e23129 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/FT8Common.java @@ -0,0 +1,25 @@ +package com.bg7yoz.ft8cn; + +/** + * FT8有关的常量。 + * @author BGY70Z + * @date 2023-03-20 + */ +public final class FT8Common { + public static final int FT8_MODE=0; + public static final int FT4_MODE=1; + public static final int SAMPLE_RATE=12000; + public static final int FT8_SLOT_TIME=15; + public static final int FT8_SLOT_TIME_MILLISECOND=15000;//一个周期的毫秒数 + public static final int FT4_SLOT_TIME_MILLISECOND=7500; + public static final int FT8_5_SYMBOLS_MILLISECOND=800;//5个符号所需的 + + + public static final float FT4_SLOT_TIME=7.5f; + public static final int FT8_SLOT_TIME_M=150;//15秒 + public static final int FT8_5_SYMBOLS_TIME_M =8;//5个符号的时间长度0.8秒 + public static final int FT4_SLOT_TIME_M=75;//7.5秒 + public static final int FT8_TRANSMIT_DELAY=500;//默认发射延迟时长,毫秒 + public static final long DEEP_DECODE_TIMEOUT=7*1000;//深度解码的最长时间范围 + public static final int DECODE_MAX_ITERATIONS=1;//迭代次数 +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/Ft8Message.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/Ft8Message.java new file mode 100644 index 00000000..eaf1ba80 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/Ft8Message.java @@ -0,0 +1,562 @@ +package com.bg7yoz.ft8cn; +/** + * Ft8Message类是用于展现FT8信号的解析结果。 + * 包括UTC时间、信噪比、时间偏移、频率、得分、消息的文本、消息的哈希值 + * ----2022.5.6----- + * time_sec可能是时间偏移,目前还不能完全确定,待后续解决。 + * 1.为方便在列表中显示,各要素通过Get方法,返回String类型的结果。 + * -----2022.5.13--- + * 2.增加i3,n3消息类型内容 + * @author BG7YOZ + * @date 2022.5.6 + */ + +import android.annotation.SuppressLint; +import android.util.Log; + +import androidx.annotation.NonNull; + +import com.bg7yoz.ft8cn.database.DatabaseOpr; +import com.bg7yoz.ft8cn.ft8signal.FT8Package; +import com.bg7yoz.ft8cn.ft8transmit.GenerateFT8; +import com.bg7yoz.ft8cn.ft8transmit.TransmitCallsign; +import com.bg7yoz.ft8cn.maidenhead.MaidenheadGrid; +import com.bg7yoz.ft8cn.rigs.BaseRigOperation; +import com.bg7yoz.ft8cn.timer.UtcTimer; +import com.google.android.gms.maps.model.LatLng; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; + +public class Ft8Message { + private static String TAG = "Ft8Message"; + public int i3 = 0; + public int n3 = 0; + public int signalFormat = FT8Common.FT8_MODE;//是不是FT8格式的消息 + public long utcTime;//UTC时间 + public boolean isValid;//是否是有效信息 + public int snr = 0;//信噪比 + public float time_sec = 0;//时间偏移(秒) + public float freq_hz = 0;//频率 + public int score = 0;//得分 + public int messageHash;//消息的哈希 + + public String callsignFrom = null;//发起呼叫的呼号 + public String callsignTo = null;//接收呼叫的呼号 + + public String modifier = null;//目标呼号的修饰符 如CQ POTA BG7YOZ OL50中的POTA + + public String extraInfo = null; + public String maidenGrid = null; + + public String rtty_state =null;//RTTY RU(i3=3类型)的地区名,两位字母如:CA、AL + public int r_flag=0;//RTTY RU,EU VHF(i3=3,i3=5类型)的R标志 + public int rtty_tu;//RTTY RU(i3=3类型)的TU;标志 + public int eu_serial;//EU VHF i3=5中的序列号 + public String arrl_rac;//Field day 消息,Arrl rac + public String arrl_class;//Field day 发射级别 + public String dx_call_to2;//DXpediton 消息中第二个接收的呼号 + + public int report = -100;//当-100时,意味着没有信号报告 + public long callFromHash10 = 0;//12位长度的哈希码 + public long callFromHash12 = 0;//12位长度的哈希码 + public long callFromHash22 = 0;//12位长度的哈希码 + public long callToHash10 = 0;//12位长度的哈希码 + public long callToHash12 = 0;//12位长度的哈希码 + public long callToHash22 = 0;//12位长度的哈希码 + //private boolean isCallMe = false;//是不是CALL我的消息 + public long band;//载波频率 + + public String fromWhere = null;//用于显示地址 + public String toWhere = null;//用于显示地址 + + public boolean isQSL_Callsign = false;//是不是通联过的呼号 + + public static MessageHashMap hashList = new MessageHashMap(); + + + public boolean fromDxcc = false; + public boolean fromItu = false; + public boolean fromCq = false; + public boolean toDxcc = false; + public boolean toItu = false; + public boolean toCq = false; + + public LatLng fromLatLng = null; + public LatLng toLatLng = null; + + public boolean isWeakSignal=false; + + + + + + @NonNull + @SuppressLint({"SimpleDateFormat", "DefaultLocale"}) + @Override + public String toString() { + return String.format("%s %d %+4.2f %4.0f ~ %s Hash : %#06X", + new SimpleDateFormat("HHmmss").format(utcTime), + snr, time_sec, freq_hz, getMessageText(), messageHash); + } + + /** + * 创建一个解码消息对象,要确定信号的格式。 + * + * @param signalFormat + */ + public Ft8Message(int signalFormat) { + this.signalFormat = signalFormat; + } + + public Ft8Message(String callTo, String callFrom, String extraInfo) { + //如果是自由文本,callTo=CQ,callFrom=MyCall,extraInfo=freeText + this.callsignTo = callTo.toUpperCase(); + this.callsignFrom = callFrom.toUpperCase(); + this.extraInfo = extraInfo.toUpperCase(); + } + + public Ft8Message(int i3, int n3, String callTo, String callFrom, String extraInfo) { + this.callsignTo = callTo; + this.callsignFrom = callFrom; + this.extraInfo = extraInfo; + this.i3 = i3; + this.n3 = n3; + this.utcTime = UtcTimer.getSystemTime();//用于显示TX + } + + /** + * 创建一个解码消息对象 + * + * @param message 如果message不为null,则创建一个与message内容一样的解码消息对象 + */ + public Ft8Message(Ft8Message message) { + if (message != null) { + + signalFormat = message.signalFormat; + utcTime = message.utcTime; + isValid = message.isValid; + snr = message.snr; + time_sec = message.time_sec; + freq_hz = message.freq_hz; + score = message.score; + band = message.band; + + messageHash = message.messageHash; + + if (message.callsignFrom.equals("<...>")) {//到哈希列表中查一下 + callsignFrom = hashList.getCallsign(new long[]{message.callFromHash10, message.callFromHash12, message.callFromHash22}); + } else { + callsignFrom = message.callsignFrom; + } + + if (message.callsignTo.equals("<...>")) {//到哈希列表中查一下 + callsignTo = hashList.getCallsign(new long[]{message.callToHash10, message.callToHash12, message.callToHash22}); + } else { + callsignTo = message.callsignTo; + } + if (message.i3 == 4) { + hashList.addHash(FT8Package.getHash22(message.callsignFrom), message.callsignFrom); + hashList.addHash(FT8Package.getHash12(message.callsignFrom), message.callsignFrom); + hashList.addHash(FT8Package.getHash10(message.callsignFrom), message.callsignFrom); + } + + extraInfo = message.extraInfo; + maidenGrid = message.maidenGrid; + report = message.report; + callToHash10 = message.callToHash10; + callToHash12 = message.callToHash12; + callToHash22 = message.callToHash22; + callFromHash10 = message.callFromHash10; + callFromHash12 = message.callFromHash12; + callFromHash22 = message.callFromHash22; + + + i3 = message.i3; + n3 = message.n3; + + //把哈希和呼号对应关系保存到列表里 + hashList.addHash(callToHash10, callsignTo); + hashList.addHash(callToHash12, callsignTo); + hashList.addHash(callToHash22, callsignTo); + hashList.addHash(callFromHash10, callsignFrom); + hashList.addHash(callFromHash12, callsignFrom); + hashList.addHash(callFromHash22, callsignFrom); + + //rtty ru(i3=3)消息新增的 + rtty_tu = message.rtty_tu; + rtty_state = message.rtty_state; + r_flag =message.r_flag; + eu_serial =message.eu_serial; + //field day 增加的 + arrl_class = message.arrl_class; + arrl_rac = message.arrl_rac; + dx_call_to2 = message.dx_call_to2; + + + //Log.d(TAG, String.format("i3:%d,n3:%d,From:%s,To:%s", i3, n3, getCallsignFrom(), getCallsignTo())); + } + } + + /** + * 返回解码消息的所使用的频率 + * + * @return String 为方便显示,返回值是字符串 + */ + @SuppressLint("DefaultLocale") + public String getFreq_hz() { + return String.format("%04.0f", freq_hz); + } + + public String getMessageText(boolean showWeekSignal){ + if (isWeakSignal && showWeekSignal){ + return "*"+getMessageText(); + }else { + return getMessageText(); + } + } + + /** + * 返回解码消息的文本内容 + * + * @return String + */ + @SuppressLint("DefaultLocale") + public String getMessageText() { + + if (i3 == 0 && n3 == 0) {//说明是自由文本 + if (extraInfo.length() < 13) { + return String.format("%-13s", extraInfo.toUpperCase()); + } else { + return extraInfo.toUpperCase().substring(0, 13); + } + } + if (i3 == 0 && (n3 == 3 || n3 == 4)) {//说明是野外日 + return String.format("%s %s %s%d%s %s" + ,callsignTo + ,callsignFrom + ,r_flag==0?"":"R " + ,eu_serial + ,arrl_class + ,arrl_rac + ); + } + + if (i3 == 0 && (n3 == 1)) {//说明是DXpedition + + return String.format("%s RR73; %s %s %s%d" + ,callsignTo + ,dx_call_to2 + ,hashList.getCallsign(new long[]{callFromHash10}) + ,report > 0 ? "+" : "-" + ,report + ); + } + + if (i3 == 3){//说明是RTTY RU消息 + return String.format("%s%s %s %s%d %s" + ,rtty_tu==0?"":"TU; " + ,callsignTo + ,callsignFrom + ,r_flag==0?"":"R " + ,report + ,rtty_state); + } + + if (i3 == 5){//说明是EU VHF R 570007 JO22DB + return String.format("%s %s %s%d%04d %s" + , callsignTo + , callsignFrom + , r_flag == 0?"":"R " + , report + , eu_serial + , maidenGrid + ).trim(); + } + + if (modifier != null && checkIsCQ()) {//修饰符 + if (modifier.matches("[0-9]{3}|[A-Z]{1,4}")) { + return String.format("%s %s %s %s", callsignTo, modifier, callsignFrom, extraInfo).trim(); + } + } + return String.format("%s %s %s", callsignTo, callsignFrom, extraInfo).trim(); + } + + + /** + * 返回消息的延迟时间。可能不一定对,待研究清楚解码算法后在确定 + * + * @return String 为方便显示,返回值是字符串。 + */ + @SuppressLint("DefaultLocale") + public String getDt() { + return String.format("%.1f", time_sec); + } + + /** + * 返回解码消息的信噪比dB值,该计算方法还为搞定,暂时用000代替 + * + * @return String 为方便显示,返回值是字符串 + */ + public String getdB() { + return String.valueOf(snr); + } + + /** + * 检查消息处于奇数还是偶数序列。 + * + * @return boolean 处于偶数序列true,第0,30秒为true + */ + public boolean isEvenSequence() { + if (signalFormat == FT8Common.FT8_MODE) { + return (utcTime / 1000) % 15 == 0; + } else { + return (utcTime / 100) % 75 == 0; + } + } + + /** + * 显示当前消息处于哪一个时间序列的。 + * + * @return String 以时间周期取模为结果。 + */ + @SuppressLint("DefaultLocale") + public int getSequence() { + if (signalFormat == FT8Common.FT8_MODE) { + return (int) ((((utcTime + 750) / 1000) / 15) % 2); + } else { + return (int) (((utcTime + 370) / 100) / 75) % 2; + } + } + + @SuppressLint("DefaultLocale") + public int getSequence4() { + if (signalFormat == FT8Common.FT8_MODE) { + return (int) ((((utcTime + 750) / 1000) / 15) % 4); + } else { + return (int) (((utcTime + 370) / 100) / 75) % 4; + } + } + + /** + * 消息中含有mycall呼号的 + * + * @return boolean + */ + public boolean inMyCall() { + //判断是不是自己,有时候,我的呼号带/P或/R,对方可能会丢掉这个后缀 +// if (GeneralVariables.myCallsign.length() == 0) return false; + + return GeneralVariables.checkIsMyCallsign(this.callsignFrom) + ||GeneralVariables.checkIsMyCallsign(this.callsignTo); +// return this.callsignFrom.contains(GeneralVariables.myCallsign) +// || this.callsignTo.contains(GeneralVariables.myCallsign); + } +/* +i3.n3类型 基本目的 消息范例 位字段标签 +0.0 自由文本(Free Text) TNX BOB 73 GL f71 +0.1 远征(DXpedition) K1ABC RR73; W9XYZ -08 c28 c28 h10 r5 +0.3 野外日(Field Day) K1ABC W9XYZ 6A WI c28 c28 R1 n4 k3 S7 +0.4 野外日(Field Day) W9XYZ K1ABC R 17B EMA c28 c28 R1 n4 k3 S7 +0.5 遥测(Telemetry) 123456789ABCDEF012 t71 +1. 标准消息(Std Msg) K1ABC/R W9XYZ/R R EN37 c28 r1 c28 r1 R1 g15 +2. 欧盟甚高频(EU VHF) G4ABC/P PA9XYZ JO22 c28 p1 c28 p1 R1 g15 +3. 电传(RTTY RU) K1ABC W9XYZ 579 WI t1 c28 c28 R1 r3 s13 +4. 非标准呼叫(NonStd Call) PJ4/K1ABC RRR h12 c58 h1 r2 c1 +5. 欧盟甚高频(EU VHF) R 570007 JO22DB h12 h22 R1 r3 s11 g25 +*/ +/* +标签 传达的信息 +c1 第一个呼号是CQ;h12被忽略 +c28 标准呼号、CQ、DE、QRZ或22位哈希 +c58 非标准呼号,最多11个字符 +f71 自由文本,最多13个字符 +g15 4字符网格、报告、RRR、RR73、73或空白 +g25 6字符网格 +h1 哈希呼号是第二个呼号 +h10 哈希呼号,10位 +h12 哈希呼号,12位 +h22 哈希呼号,22位 +k3 野外日级别(Class):A、B、…F +n4 发射器数量:1-16、17-32 +p1 呼号后缀 /P +r1 呼号后缀/R +r2 RRR、RR73、73、或空白 +r3 报告:2-9,显示为529-599或52-59 +R1 R +r5 报告:-30到+30,仅偶数 +s11 序列号(0-2047) +s13 序列号(0-7999)或州/省 +S7 ARRL/RAC部分 +t1 TU; +t71 遥感数据,最多18位十六进制数字 + +*/ + + + /** + * 获取发送者的呼号,fromTo的最终解决办法要在decode.c中解决---TO DO---- + * 可获取发送者呼号的消息类型为i1,i2,i3,i4,i5,i0.1,i0.3,i0.4 + * + * @return String 返回呼号 + */ + public String getCallsignFrom() { + if (callsignFrom == null) { + return ""; + } + return callsignFrom.replace("<", "").replace(">", ""); + } + + /** + * 获取通联信息中的接收呼号 + * + * @return + */ + public String getCallsignTo() { + if (callsignTo == null) { + return ""; + } + if (callsignTo.length() < 2) { + return ""; + } + if (callsignTo.substring(0, 2).equals("CQ") || callsignTo.substring(0, 2).equals("DE") + || callsignTo.substring(0, 3).equals("QRZ")) { + return ""; + } + return callsignTo.replace("<", "").replace(">", ""); + } + + /** + * 从消息中获取梅登海德网格信息 + * + * @return String,梅登海德网格,如果没有返回""。 + */ + public String getMaidenheadGrid(DatabaseOpr db) { + if (i3 != 1 && i3 != 2) {//一般只有i3=1或i3=2,标准消息,甚高频消息才有网格 + return GeneralVariables.getGridByCallsign(callsignFrom, db);//到对应表中找一下网格 + } else { + String[] msg = getMessageText().split(" "); + if (msg.length < 1) { + return GeneralVariables.getGridByCallsign(callsignFrom, db);//到对应表中找一下网格 + } + String s = msg[msg.length - 1]; + if (MaidenheadGrid.checkMaidenhead(s)) { + return s; + } else {//不是网格信息,就可能是信号报告 + return GeneralVariables.getGridByCallsign(callsignFrom, db);//到对应表中找一下网格 + } + } + } + + public String getToMaidenheadGrid(DatabaseOpr db) { + if (checkIsCQ()) return ""; + return GeneralVariables.getGridByCallsign(callsignTo, db); + } + + /** + * 查看消息是不是CQ + * + * @return boolean 是CQ返回true + */ + public boolean checkIsCQ() { + String s = callsignTo.trim().split(" ")[0]; + if (s == null) { + return false; + } else { + return (s.equals("CQ") || s.equals("DE") || s.equals("QRZ")); + } + } + + /** + * 查消息的类型。i3.n3。 + * + * @return 消息类型 + */ + + public String getCommandInfo() { + return getCommandInfoByI3N3(i3, n3); + } + + /** + * 查消息的类型。i3.n3。 + * + * @param i i3 + * @param n n3 + * @return 消息类型 + */ + @SuppressLint("DefaultLocale") + public static String getCommandInfoByI3N3(int i, int n) { + String format = "%d.%d:%s"; + switch (i) { + case 1: + case 2: + return String.format(format, i, 0, GeneralVariables.getStringFromResource(R.string.std_msg)); + case 5: + return String.format(format, i, 0, "EU VHF"); + case 3: + return String.format(format, i, 0, GeneralVariables.getStringFromResource(R.string.rtty_ru_msg)); + case 4: + return String.format(format, i, 0, GeneralVariables.getStringFromResource(R.string.none_std_msg)); + case 0: + switch (n) { + case 0: + return String.format(format, i, n, GeneralVariables.getStringFromResource(R.string.free_text)); + case 1: + return String.format(format, i, n, GeneralVariables.getStringFromResource(R.string.dXpedition)); + case 3: + case 4: + return String.format(format, i, n, GeneralVariables.getStringFromResource(R.string.field_day)); + case 5: + return String.format(format, i, n, GeneralVariables.getStringFromResource(R.string.telemetry)); + } + } + return ""; + } + + //获取发送者的传输对象 + public TransmitCallsign getFromCallTransmitCallsign() { + return new TransmitCallsign(this.i3, this.n3, this.callsignFrom, freq_hz + , this.getSequence() + , snr); + } + + //获取发送者的传输对象,注意!!!与发送者的时序是相反的!!! + public TransmitCallsign getToCallTransmitCallsign() { + if (report == -100) {//如果消息中没有信号报告,就用发送方的SNR代替 + return new TransmitCallsign(this.i3, this.n3, this.callsignTo, freq_hz, (this.getSequence() + 1) % 2, snr); + } else { + return new TransmitCallsign(this.i3, this.n3, this.callsignTo, freq_hz, (this.getSequence() + 1) % 2, report); + } + } + + @SuppressLint("DefaultLocale") + public String toHtml() { + StringBuilder result = new StringBuilder(); + + result.append(""); + result.append(UtcTimer.getDatetimeStr(utcTime)); + result.append("\n"); + + result.append(""); + result.append(getdB()); + result.append("\n"); + + result.append(""); + result.append(String.format("%.1f", time_sec)); + result.append("\n"); + + result.append(""); + result.append(String.format("%.0f", freq_hz)); + result.append("\n"); + + result.append(""); + result.append(getMessageText()); + result.append("\n"); + + result.append(""); + result.append(BaseRigOperation.getFrequencyStr(band)); + result.append("\n"); + + return result.toString(); + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/GeneralVariables.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/GeneralVariables.java new file mode 100644 index 00000000..31646526 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/GeneralVariables.java @@ -0,0 +1,777 @@ +package com.bg7yoz.ft8cn; +/** + * 常用变量。关于mainContext有内存泄漏的风险,以后解决。 + * mainContext + */ + +import android.annotation.SuppressLint; +import android.content.Context; +import android.util.Log; + +import androidx.lifecycle.MutableLiveData; + +import com.bg7yoz.ft8cn.callsign.CallsignDatabase; +import com.bg7yoz.ft8cn.connector.ConnectMode; +import com.bg7yoz.ft8cn.database.ControlMode; +import com.bg7yoz.ft8cn.database.DatabaseOpr; +import com.bg7yoz.ft8cn.ft8transmit.QslRecordList; +import com.bg7yoz.ft8cn.html.HtmlContext; +import com.bg7yoz.ft8cn.rigs.BaseRigOperation; +import com.bg7yoz.ft8cn.timer.UtcTimer; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + + +public class GeneralVariables { + private static final String TAG = "GeneralVariables"; + public static String VERSION = BuildConfig.VERSION_NAME;//版本号"0.62(Beta 4)"; + public static String BUILD_DATE = BuildConfig.apkBuildTime;//编译的时间 + public static int MESSAGE_COUNT = 3000;//消息的最大缓存数量 + public static boolean saveSWLMessage = false;//保存解码消息开关 + public static boolean saveSWL_QSO = false;//保存解码消息消息中的QSO开关 + public static boolean enableCloudlog = false;//是否启用Cloudlog自动同步 + public static boolean enableQRZ = false;//是否启用qrz自动同步 + + public static boolean deepDecodeMode = false;//是否开启深度解码 + + public static boolean audioOutput32Bit = true;//音频输出类型true=float,false=int16 + public static int audioSampleRate = 12000;//发射音频的采样率 + + public static MutableLiveData mutableVolumePercent = new MutableLiveData<>(); + public static float volumePercent = 0.5f;//播放音频的音量,是百分比 + + public static int flexMaxRfPower = 10;//flex电台的最大发射功率 + public static int flexMaxTunePower = 10;//flex电台的最大调谐功率 + + private Context mainContext; + public static CallsignDatabase callsignDatabase = null; + + public void setMainContext(Context context) { + mainContext = context; + } + + public static boolean isChina = true;//语言是不是中国 + public static boolean isTraditionalChinese = true;//语言是不是繁体中文 + //public static double maxDist = 0;//最远距离 + + //各已经通联的分区列表 + public static final Map dxccMap = new HashMap<>(); + public static final Map cqMap = new HashMap<>(); + public static final Map ituMap = new HashMap<>(); + + private static final Map excludedCallsigns = new HashMap<>(); + + /** + * 添加排除的字头 + * + * @param callsigns 呼号 + */ + public static synchronized void addExcludedCallsigns(String callsigns) { + excludedCallsigns.clear(); + String[] s = callsigns.toUpperCase().replace(" ", ",") + .replace("|", ",") + .replace(",", ",").split(","); + for (int i = 0; i < s.length; i++) { + if (s[i].length() > 0) { + excludedCallsigns.put(s[i], 0); + } + } + } + + /** + * 查找是否含有排除的字头 + * + * @param callsign 呼号 + * @return 是否 + */ + public static synchronized boolean checkIsExcludeCallsign(String callsign) { + Iterator iterator = excludedCallsigns.keySet().iterator(); + while (iterator.hasNext()) { + String key = iterator.next(); + if (callsign.toUpperCase().indexOf(key) == 0) { + return true; + } + } + return false; + } + + /** + * 获取排除呼号前缀的列表 + * + * @return 列表 + */ + public static synchronized String getExcludeCallsigns() { + StringBuilder calls = new StringBuilder(); + Iterator iterator = excludedCallsigns.keySet().iterator(); + int i = 0; + while (iterator.hasNext()) { + String key = iterator.next(); + if (i == 0) { + calls.append(key); + } else { + calls.append(",").append(key); + } + i++; + } + return calls.toString(); + } + + + //通联记录列表,包括成功与不成功的 + public static QslRecordList qslRecordList = new QslRecordList(); + + //此处有内存泄露警告,但Application Context不应该会内存泄露,所以注释掉 + @SuppressLint("StaticFieldLeak") + private static GeneralVariables generalVariables = null; + + public static GeneralVariables getInstance() { + if (generalVariables == null) { + generalVariables = new GeneralVariables(); + } + return generalVariables; + } + + public static Context getMainContext() { + return GeneralVariables.getInstance().mainContext; + } + + + public static MutableLiveData mutableDebugMessage = new MutableLiveData<>(); + public static int QUERY_FREQ_TIMEOUT = 2000;//轮询频率变化的时间间隔。2秒 + public static int START_QUERY_FREQ_DELAY = 2000;//开始轮询频率的时间延迟 + + public static final int DEFAULT_LAUNCH_SUPERVISION = 10 * 60 * 1000;//发射监管默认值,10分钟 + private static String myMaidenheadGrid = ""; + public static MutableLiveData mutableMyMaidenheadGrid = new MutableLiveData<>(); + + public static int connectMode = ConnectMode.USB_CABLE;//连接方式USB==0,BLUE_TOOTH==1 + + //public static String bluetoothDeviceAddress=null;//可以用于连接的蓝牙设备地址 + + + //用于记录呼号于网格的对应关系 todo---应当把此处列表也放到后台追踪信息里 + //public static ArrayList callsignMaidenheadGrids=new ArrayList<>(); + public static final Map callsignAndGrids = new ConcurrentHashMap<>(); + //private static final Map callsignAndGrids=new HashMap<>(); + + public static String myCallsign = "";//我的呼号 + public static String toModifier = "";//呼叫的修饰符 + private static float baseFrequency = 1000;//声音频率 + + public static boolean simpleCallItemMode = false;//紧凑型消息 + + public static boolean swr_switch_on = true;//swr告警开关 + public static boolean alc_switch_on = true;//alc告警开关 + + public static MutableLiveData mutableBaseFrequency = new MutableLiveData<>(); + public static String cloudlogServerAddress = "";//cloudlog的服务器地址 + public static String cloudlogApiKey = "";//cloudlog的APIKEY + public static String cloudlogStationID = "";//cloudlog的站点ID + public static String qrzApiKey = ""; //qrz的key + public static boolean synFrequency = false;//同频发射 + public static int transmitDelay = 500;//发射延迟时间,这个时间也是给上一个周期的解码时间 + public static int pttDelay = 100;//PTT的响应时间,在给电台PTT指令后,一般电台会有一个响应时间,此处默认是100毫秒 + public static int civAddress = 0xa4;//civ地址 + public static int baudRate = 19200;//波特率 + public static long band = 14074000;//载波频段 + public static int serialDataBits = 8;//默认是8 + public static int serialParity = 0;//UsbSerialPort.PARITY_NONE默认是0,即:无 + public static int serialStopBits = 1;//停止位的对应关系:1=1,2=3,3=1.5 + public static int instructionSet = 0;//指令集,0:icom,1:yaesu 2 代,2:yaesu 3代。 + public static int bandListIndex = -1;//电台波段的索引值 + public static MutableLiveData mutableBandChange = new MutableLiveData<>();//波段索引值变化 + public static int controlMode = ControlMode.VOX; + public static int modelNo = 0; + public static int launchSupervision = DEFAULT_LAUNCH_SUPERVISION;//发射监管 + public static long launchSupervisionStart = UtcTimer.getSystemTime();//自动发射的起始时间 + public static int noReplyLimit = 0;//呼叫无回应次数0==忽略 + + public static int noReplyCount = 0;//没有回应的次数 + + //下面4个参数是ICOM网络方式连接的参数 + public static String icomIp = "255.255.255.255"; + public static int icomUdpPort = 50001; + public static String icomUserName = "ic705"; + public static String icomPassword = ""; + + + public static boolean autoFollowCQ = true;//自动关注CQ + public static boolean autoCallFollow = true;//自动呼叫关注的呼号 + public static ArrayList QSL_Callsign_list = new ArrayList<>();//QSL成功的呼号 + public static ArrayList QSL_Callsign_list_other_band = new ArrayList<>();//在其它波段QSL成功的呼号 + + + public static final ArrayList followCallsign = new ArrayList<>();//关注的呼号 + + public static ArrayList transmitMessages = new ArrayList<>();//放在呼叫界面,关注的列表 + + public static void setMyMaidenheadGrid(String grid) { + myMaidenheadGrid = grid; + mutableMyMaidenheadGrid.postValue(grid); + } + + public static String getMyMaidenheadGrid() { + return myMaidenheadGrid; + } + + public static float getBaseFrequency() { + return baseFrequency; + } + + public static void setBaseFrequency(float baseFrequency) { + mutableBaseFrequency.postValue(baseFrequency); + GeneralVariables.baseFrequency = baseFrequency; + } + + public static String getCloudlogServerAddress() { + return cloudlogServerAddress; + } + + public static String getCloudlogStationID() { + return cloudlogStationID; + } + + public static String getCloudlogServerApiKey() { + return cloudlogApiKey; + } + + public static String getQrzApiKey() { + return qrzApiKey; + } + + + @SuppressLint("DefaultLocale") + public static String getBaseFrequencyStr() { + return String.format("%.0f", baseFrequency); + } + + public static String getCivAddressStr() { + return String.format("%2X", civAddress); + } + + public static String getTransmitDelayStr() { + return String.valueOf(transmitDelay); + } + + public static String getBandString() { + return BaseRigOperation.getFrequencyAllInfo(band); + } + + /** + * 查有没有通联成功的呼号 + * + * @param callsign 呼号 + * @return 是否存在 + */ + public static boolean checkQSLCallsign(String callsign) { + return QSL_Callsign_list.contains(callsign); + } + + /** + * 查别的波段有没有通联成功的呼号 + * + * @param callsign 呼号 + * @return 是否存在 + */ + public static boolean checkQSLCallsign_OtherBand(String callsign) { + return QSL_Callsign_list_other_band.contains(callsign); + } + + /** + * 检查呼号中是不是含有我的呼号 + * + * @param callsign 呼号 + * @return boolean + */ + static public boolean checkIsMyCallsign(String callsign) { + if (GeneralVariables.myCallsign.length() == 0) return false; + String temp = getShortCallsign(GeneralVariables.myCallsign); + return callsign.contains(temp); + } + + /** + * 对于复合呼号,获取去掉前缀或后缀的呼号 + * + * @return 呼号 + */ + static public String getShortCallsign(String callsign) { + if (callsign.contains("/")) { + String[] temp = callsign.split("/"); + int max = 0; + int max_index = 0; + for (int i = 0; i < temp.length; i++) { + if (temp[i].length() > max) { + max = temp[i].length(); + max_index = i; + } + } + return temp[max_index]; + } else { + return callsign; + } + } + + /** + * 查该呼号是不是在关注的呼号列表中 + * + * @param callsign 呼号 + * @return 是否存在 + */ + public static boolean callsignInFollow(String callsign) { + return followCallsign.contains(callsign); + } + + /** + * 向通联成功的呼号列表添加 + * + * @param callsign 呼号 + */ + public static void addQSLCallsign(String callsign) { + if (!checkQSLCallsign(callsign)) { + QSL_Callsign_list.add(callsign); + } + } + + public static String getMyMaidenhead4Grid() { + if (myMaidenheadGrid.length() > 4) { + return myMaidenheadGrid.substring(0, 4); + } + return myMaidenheadGrid; + } + + /** + * 自动程序运行起始时间 + */ + public static void resetLaunchSupervision() { + launchSupervisionStart = UtcTimer.getSystemTime(); + } + + /** + * 或取自动程序的运行时长 + * + * @return 毫秒 + */ + public static int launchSupervisionCount() { + return (int) (UtcTimer.getSystemTime() - launchSupervisionStart); + } + + public static boolean isLaunchSupervisionTimeout() { + if (launchSupervision == 0) return false;//0是不监管 + return launchSupervisionCount() > launchSupervision; + } + + /** + * 从extraInfo中查消息顺序 + * + * @param extraInfo 消息中的扩展内容 + * @return 返回消息序号 + */ + public static int checkFunOrderByExtraInfo(String extraInfo) { + if (checkFun5(extraInfo)) return 5; + if (checkFun4(extraInfo)) return 4; + if (checkFun3(extraInfo)) return 3; + if (checkFun2(extraInfo)) return 2; + if (checkFun1(extraInfo)) return 1; + return -1; + } + + /** + * 检查消息的序号,如果解析不出来,就-1 + * + * @param message 消息 + * @return 消息序号 + */ + public static int checkFunOrder(Ft8Message message) { + if (message.checkIsCQ()) return 6; + return checkFunOrderByExtraInfo(message.extraInfo); + + } + + + //是不是网格报告 + public static boolean checkFun1(String extraInfo) { + //网格报告必须是4位,或没有网格 + return (extraInfo.trim().matches("[A-Z][A-Z][0-9][0-9]") && !extraInfo.equals("RR73")) + || (extraInfo.trim().length() == 0); + + } + + //是不是信号报告,如-10 + public static boolean checkFun2(String extraInfo) { + if (extraInfo.trim().length() < 2) { + return false; + }//信号报告必须至少2位 + try { + return Integer.parseInt(extraInfo.trim()) != 73;//如果是73,说明是消息6,不是消息2 + //return true; + } catch (Exception e) { + return false; + } + } + + //是不是带R的信号报告,如R-10 + public static boolean checkFun3(String extraInfo) { + if (extraInfo.trim().length() < 3) { + return false; + }//带R信号报告必须至少3位 + //第一位如果不是R,或者第二位是R,说明不是消息3 + if ((extraInfo.trim().charAt(0) != 'R') || (extraInfo.trim().charAt(1) == 'R')) { + return false; + } + + try { + Integer.parseInt(extraInfo.trim().substring(1)); + return true; + } catch (Exception e) { + return false; + } + } + + //是不是RRR或RR73值 + public static boolean checkFun4(String extraInfo) { + return extraInfo.trim().equals("RR73") || extraInfo.trim().equals("RRR"); + } + + //是不是73值 + public static boolean checkFun5(String extraInfo) { + return extraInfo.trim().equals("73"); + } + + + /** + * 判断是不是信号报告,如果是,把值赋给 report + * + * @param extraInfo 消息扩展 + * @return 信号报告值, 没找到是-100 + */ + public static int checkFun2_3(String extraInfo) { + if (extraInfo.equals("73")) return -100; + if (extraInfo.matches("[R]?[+-]?[0-9]{1,2}")) { + try { + return Integer.parseInt(extraInfo.replace("R", "")); + } catch (Exception e) { + return -100; + } + } + return -100; + } + + /** + * 判断是不是网格报告,如果是,把值赋给 report + * + * @param extraInfo 消息扩展 + * @return 信号报告 + */ + public static boolean checkFun1_6(String extraInfo) { + return extraInfo.trim().matches("[A-Z][A-Z][0-9][0-9]") + && !extraInfo.trim().equals("RR73"); + } + + /** + * 检查是否是通联结束:RRR、RR73、73 + * + * @param extraInfo 消息后缀 + * @return 是否 + */ + public static boolean checkFun4_5(String extraInfo) { + return extraInfo.trim().equals("RR73") + || extraInfo.trim().equals("RRR") + || extraInfo.trim().equals("73"); + } + + /** + * 从String.xml中提取字符串 + * + * @param id id + * @return 字符串 + */ + public static String getStringFromResource(int id) { + if (getMainContext() != null) { + return getMainContext().getString(id); + } else { + return ""; + } + } + + + /** + * 把已经通联的DXCC分区添加到集合中 + * + * @param dxccPrefix DXCC前缀 + */ + public static void addDxcc(String dxccPrefix) { + dxccMap.put(dxccPrefix, dxccPrefix); + } + + /** + * 查看是不是已经通联的DXCC分区 + * + * @param dxccPrefix DXCC前缀 + * @return 是否 + */ + public static boolean getDxccByPrefix(String dxccPrefix) { + return dxccMap.containsKey(dxccPrefix); + } + + /** + * 把CQ分区加到列表里 + * + * @param cqZone cq分区编号 + */ + public static void addCqZone(int cqZone) { + cqMap.put(cqZone, cqZone); + } + + /** + * 查是否存在已经通联的CQ分区 + * + * @param cq cq分区编号 + * @return 是否存在 + */ + public static boolean getCqZoneById(int cq) { + return cqMap.containsKey(cq); + } + + /** + * 把itu分区添加到已通联的ITU列表中 + * + * @param itu itu编号 + */ + public static void addItuZone(int itu) { + ituMap.put(itu, itu); + } + + /** + * 查Itu分区在不在已通联的列表中 + * + * @param itu itu编号 + * @return 是否存在 + */ + public static boolean getItuZoneById(int itu) { + return ituMap.containsKey(itu); + } + + //用于触发新的网格 + public static MutableLiveData mutableNewGrid = new MutableLiveData<>(); + + /** + * 把呼号与网格的对应关系添加到呼号--网格对应表, + * + * @param callsign 呼号 + * @param grid 网格 + */ + public static void addCallsignAndGrid(String callsign, String grid) { + if (grid.length() >= 4) { + callsignAndGrids.put(callsign, grid); + mutableNewGrid.postValue(grid); + } + } + + /** + * 呼号--网格对应表。以呼号查网格 + * 如果内存中没有,应当到数据库中查一下。 + * + * @param callsign 呼号 + * @return 是否有对应的网格 + */ + public static boolean getCallsignHasGrid(String callsign) { + return callsignAndGrids.containsKey(callsign); + } + + /** + * 呼号--网格对应表。以呼号查网格,条件是呼号和网格都对应的上。 + * 此函数的目的是,为了更新对应表的数据库 + * + * @param callsign 呼号 + * @param grid 网格 + * @return 是否有对应的网格 + */ + public static boolean getCallsignHasGrid(String callsign, String grid) { + if (!callsignAndGrids.containsKey(callsign)) return false;//说明根本没有这个呼号 + String s = callsignAndGrids.get(callsign); + if (s == null) return false; + return s.equals(grid); + } + + public static String getGridByCallsign(String callsign, DatabaseOpr db) { + String s = callsign.replace("<", "").replace(">", ""); + if (getCallsignHasGrid(s)) { + return callsignAndGrids.get(s); + } else { + db.getCallsignQTH(callsign); + return ""; + } + } + + /** + * 遍历呼号--网格对应表,生成HTML + * + * @return HTML + */ + public static String getCallsignAndGridToHTML() { + StringBuilder result = new StringBuilder(); + int order = 0; + for (String key : callsignAndGrids.keySet()) { + order++; + HtmlContext.tableKeyRow(result, order % 2 != 0, key, callsignAndGrids.get(key)); + } + return result.toString(); + } + + public static synchronized void deleteArrayListMore(ArrayList list) { + if (list.size() > GeneralVariables.MESSAGE_COUNT) { + while (list.size() > GeneralVariables.MESSAGE_COUNT) { + list.remove(0); + } + } + } + + /** + * 判断是否为整数 + * + * @param str 传入的字符串 + * @return 是整数返回true, 否则返回false + */ + + public static boolean isInteger(String str) { + if (str != null && !"".equals(str.trim())) + return str.matches("^[0-9]*$"); + else + return false; + } + + /** + * 输出音频的数据类型,网络模式不可用 + */ + public enum AudioOutputBitMode { + Float32, + Int16 + } + + /** + * 创建一个临时文件。 + * + * @param context Context + * @param prefix 前缀 + * @param suffix 扩展名 + * @return File结构的文件 + */ + public static File getTempFile(Context context, String prefix, String suffix) { + File tempDir = context.getExternalCacheDir(); + if (tempDir == null) { + // 处理错误情况,无法获取临时目录 + Log.e(TAG, "创建临时文件出错!无法获取临时目录"); + return null; + } + + try { + //tempFile.deleteOnExit(); // 文件会在虚拟机退出时删除 + return File.createTempFile(prefix, suffix, tempDir); + } catch (IOException e) { + Log.e(TAG, "创建临时文件出错!" + e.getMessage()); + return null; + } + } + + /** + * 把文本数据写入到文件 + * + * @param file File + * @param data 文本数据 + */ + public static void writeToFile(File file, String data) { + FileOutputStream fileOutputStream = null; + try { + fileOutputStream = new FileOutputStream(file, true); + fileOutputStream.write(data.getBytes()); + Log.e(TAG, "文件数据写入完成!"); + } catch (IOException e) { + Log.e(TAG, String.format("写文件出错:%s", e.getMessage())); + } finally { + try { + if (fileOutputStream != null) { + fileOutputStream.close(); + } + } catch (IOException e) { + Log.e(TAG, String.format("关闭写文件出错:%s", e.getMessage())); + } + } + } + + + /** + * 保存数据包缓存文件 + * + * @param context 上下文 + * @param prefix 前缀 + * @param suffix 扩展名 + * @param data 数据 + * @return 文件对象 + */ + public static File writeToTempFile(Context context, String prefix, String suffix, String data) { + File file = getTempFile(context, prefix, suffix); + writeToFile(file, data); + if (file != null) { + file.deleteOnExit(); // 文件会在虚拟机退出时删除 + } + return file; + } + +// /** +// * 分享文件 +// * +// * @param context Context +// * @param file 文件对象 +// * @param title 标题 +// */ +// public static void shareFile(Context context, File file, String title) { +// Intent sharingIntent = new Intent(Intent.ACTION_SEND); +// Uri fileUri = FileProvider.getUriForFile(context.getApplicationContext() +// , "com.bg7yoz.ft8cn.fileprovider", file); +// //sharingIntent.setType("application/octet-stream"); +// sharingIntent.setType("text/plain"); +// sharingIntent.putExtra(Intent.EXTRA_STREAM, fileUri); +// sharingIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); +// context.startActivity(Intent.createChooser(sharingIntent, title)); +// +// } + + /** + * 删除文件夹 + * + * @param dir 文件夹 + * @return 是否成功删除 + */ + public static boolean deleteDir(File dir) { + if (dir == null) return false; + if (dir.isDirectory()) { + String[] children = dir.list(); + if (children != null) { + for (String child : children) { + boolean success = deleteDir(new File(dir, child)); + if (!success) { + return false; + } + } + } + } + return dir.delete(); + } + + public static void clearCache(Context context) { + try { + File dir = context.getExternalCacheDir(); + deleteDir(dir); + } catch (Exception e) { + // Handle exception + } + } + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/MainActivity.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/MainActivity.java new file mode 100644 index 00000000..b363811e --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/MainActivity.java @@ -0,0 +1,763 @@ +package com.bg7yoz.ft8cn; +/** + * FT8CN程序的主Activity。本APP采用Fragment框架实现,每个Fragment实现不同的功能。 + * ----2022.5.6----- + * 主要完成以下功能: + * 1.生成MainViewModel实例。MainViewModel是用于整个生存周期,用于录音、解析等功能。 + * 2.录音、存储的权限申请。 + * 3.实现Fragment的导航管理。 + * 4.USB串口连接后的提示 + * + * @author BG7YOZ + * @date 2022.5.6 + */ + + +import android.Manifest; +import android.animation.Animator; +import android.animation.AnimatorSet; +import android.animation.ObjectAnimator; +import android.app.AlertDialog; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.PackageManager; +import android.media.AudioManager; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.WindowManager; +import android.view.animation.AnimationUtils; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; +import androidx.lifecycle.Observer; +import androidx.navigation.NavController; +import androidx.navigation.fragment.NavHostFragment; +import androidx.navigation.ui.NavigationUI; + +import com.bg7yoz.ft8cn.bluetooth.BluetoothStateBroadcastReceive; +import com.bg7yoz.ft8cn.callsign.CallsignDatabase; +import com.bg7yoz.ft8cn.connector.CableSerialPort; +import com.bg7yoz.ft8cn.database.DatabaseOpr; +import com.bg7yoz.ft8cn.database.OnAfterQueryConfig; +import com.bg7yoz.ft8cn.database.OperationBand; +import com.bg7yoz.ft8cn.databinding.MainActivityBinding; +import com.bg7yoz.ft8cn.floatview.FloatView; +import com.bg7yoz.ft8cn.floatview.FloatViewButton; +import com.bg7yoz.ft8cn.grid_tracker.GridTrackerMainActivity; +import com.bg7yoz.ft8cn.log.ImportSharedLogs; +import com.bg7yoz.ft8cn.log.OnShareLogEvents; +import com.bg7yoz.ft8cn.maidenhead.MaidenheadGrid; +import com.bg7yoz.ft8cn.timer.UtcTimer; +import com.bg7yoz.ft8cn.ui.FreqDialog; +import com.bg7yoz.ft8cn.ui.SetVolumeDialog; +import com.bg7yoz.ft8cn.ui.ShareLogsProgressDialog; +import com.bg7yoz.ft8cn.ui.ToastMessage; +import com.google.android.material.bottomnavigation.BottomNavigationView; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + + +public class MainActivity extends AppCompatActivity { + private BluetoothStateBroadcastReceive mReceive; + private static final String TAG = "MainActivity"; + private MainViewModel mainViewModel; + private NavController navController; + private static boolean animatorRunned = false; + //private boolean animationEnd = false; + + private MainActivityBinding binding; + private FloatView floatView; + + private ShareLogsProgressDialog dialog = null;//生成共享log的对话框 + + + String[] permissions = new String[]{Manifest.permission.RECORD_AUDIO + , Manifest.permission.ACCESS_COARSE_LOCATION + , Manifest.permission.ACCESS_WIFI_STATE + , Manifest.permission.BLUETOOTH + , Manifest.permission.BLUETOOTH_ADMIN + , Manifest.permission.MODIFY_AUDIO_SETTINGS + , Manifest.permission.WAKE_LOCK + , Manifest.permission.ACCESS_FINE_LOCATION}; + List mPermissionList = new ArrayList<>(); + + private static final int PERMISSION_REQUEST = 1; + + @Override + protected void onCreate(Bundle savedInstanceState) { + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + permissions = new String[]{Manifest.permission.RECORD_AUDIO + , Manifest.permission.ACCESS_COARSE_LOCATION + , Manifest.permission.ACCESS_WIFI_STATE + , Manifest.permission.BLUETOOTH + , Manifest.permission.BLUETOOTH_ADMIN + , Manifest.permission.BLUETOOTH_CONNECT + , Manifest.permission.MODIFY_AUDIO_SETTINGS + , Manifest.permission.WAKE_LOCK + , Manifest.permission.ACCESS_FINE_LOCATION}; + } + + checkPermission(); + //全屏 + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN + , WindowManager.LayoutParams.FLAG_FULLSCREEN); + + //禁止休眠 + getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON + , WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + super.onCreate(savedInstanceState); + GeneralVariables.getInstance().setMainContext(getApplicationContext()); + + //判断是不是简体中文 + GeneralVariables.isTraditionalChinese = + getResources().getConfiguration().locale.getDisplayCountry().equals("中國"); + + //确定是不是中国、香港、澳门、台湾 + GeneralVariables.isChina = (getResources().getConfiguration().locale + .getLanguage().toUpperCase().startsWith("ZH")); + + mainViewModel = MainViewModel.getInstance(this); + binding = MainActivityBinding.inflate(getLayoutInflater()); + binding.initDataLayout.setVisibility(View.VISIBLE);//显示LOG页面 + setContentView(binding.getRoot()); + + + ToastMessage.getInstance(); + registerBluetoothReceiver();//注册蓝牙动作改变的广播 + if (mainViewModel.isBTConnected()) { + mainViewModel.setBlueToothOn(); + } + + + //观察DEBUG信息 + GeneralVariables.mutableDebugMessage.observe(this, new Observer() { + @Override + public void onChanged(String s) { + if (s.length() > 1) { + binding.debugLayout.setVisibility(View.VISIBLE); + } else { + binding.debugLayout.setVisibility(View.GONE); + } + binding.debugMessageTextView.setText(s); + } + }); + binding.debugLayout.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + binding.debugLayout.setVisibility(View.GONE); + } + }); + + + mainViewModel.mutableIsRecording.observe(this, new Observer() { + @Override + public void onChanged(Boolean aBoolean) { + if (aBoolean) { + binding.utcProgressBar.setVisibility(View.VISIBLE); + } else { + binding.utcProgressBar.setVisibility(View.GONE); + } + } + }); + //观察时钟的变化,显示进度条 + mainViewModel.timerSec.observe(this, new Observer() { + @Override + public void onChanged(Long aLong) { + if (mainViewModel.ft8TransmitSignal.sequential == UtcTimer.getNowSequential() + && mainViewModel.ft8TransmitSignal.isActivated()) { + binding.utcProgressBar.setBackgroundColor(getColor(R.color.calling_list_isMyCall_color)); + } else { + binding.utcProgressBar.setBackgroundColor(getColor(R.color.progresss_bar_back_color)); + } + binding.utcProgressBar.setProgress((int) ((aLong / 1000) % 15)); + } + }); + + //添加点击发射消息提示窗口点击关闭动作 + binding.transmittingLayout.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + binding.transmittingLayout.setVisibility(View.GONE); + } + }); + //清空缓存中的文件 + //deleteFolderFile(this.getCacheDir().getPath()); + + //Log.e(TAG, this.getCacheDir().getPath()); + + //用于Fragment的导航。 + NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.fragmentContainerView); + assert navHostFragment != null;//断言不为空 + navController = navHostFragment.getNavController(); + + NavigationUI.setupWithNavController(binding.navView, navController); + //此处增加回调是因为当APP主动navigation后,无法回到解码的界面 + binding.navView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { + @Override + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + //Log.e(TAG, "onNavigationItemSelected: "+item.toString() ); + navController.navigate(item.getItemId()); + //binding.navView.setLabelFor(item.getItemId()); + return true; + } + }); + + //FT8CN Ver %s\nBG7YOZ\n%s + binding.welcomTextView.setText(String.format(getString(R.string.version_info) + , GeneralVariables.VERSION, GeneralVariables.BUILD_DATE)); + + floatView = new FloatView(this, 32); + if (!animatorRunned) { + animationImage(); + animatorRunned = true; + } else { + binding.initDataLayout.setVisibility(View.GONE); + + InitFloatView(); + } + //初始化数据 + InitData(); + + + //观察是不是flex radio + mainViewModel.mutableIsFlexRadio.observe(this, new Observer() { + @Override + public void onChanged(Boolean aBoolean) { + if (aBoolean) { + //添加flex配置按钮 + floatView.addButton(R.id.flex_radio, "flex_radio", R.drawable.flex_icon + , new View.OnClickListener() { + @Override + public void onClick(View view) { + navController.navigate(R.id.flexRadioInfoFragment); + } + }); + } else {//删除flex配置按钮 + floatView.deleteButtonByName("flex_radio"); + } + } + }); + + //观察是不是xiegu radio + mainViewModel.mutableIsXieguRadio.observe(this, new Observer() { + @Override + public void onChanged(Boolean aBoolean) { + if (aBoolean) { + //添加xiegu配置按钮 + floatView.addButton(R.id.xiegu_radio, "xiegu_radio", R.drawable.xiegulogo32 + , new View.OnClickListener() { + @Override + public void onClick(View view) { + navController.navigate(R.id.xieguInfoFragment); + } + }); + } else {//删除xiegu配置按钮 + floatView.deleteButtonByName("xiegu_radio"); + } + } + }); + + //关闭串口设备列表按钮 + binding.closeSelectSerialPortImageView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + binding.selectSerialPortLayout.setVisibility(View.GONE); + } + }); + + //观察串口设备列表的变化 + mainViewModel.mutableSerialPorts.observe(this, new Observer>() { + @Override + public void onChanged(ArrayList serialPorts) { + setSelectUsbDevice(); + } + }); + + //列USB设备列表 + mainViewModel.getUsbDevice(); + + + //设置发射消息框的动画 + binding.transmittingMessageTextView.setAnimation(AnimationUtils.loadAnimation(this + , R.anim.view_blink)); + //观察发射的状态 + mainViewModel.ft8TransmitSignal.mutableIsTransmitting.observe(this, + new Observer() { + @Override + public void onChanged(Boolean aBoolean) { + if (aBoolean) { + binding.transmittingLayout.setVisibility(View.VISIBLE); + } else { + binding.transmittingLayout.setVisibility(View.GONE); + } + } + }); + + //观察发射内容的变化 + mainViewModel.ft8TransmitSignal.mutableTransmittingMessage.observe(this, + new Observer() { + @Override + public void onChanged(String s) { + binding.transmittingMessageTextView.setText(s); + } + }); + + //判断导入共享log文件的工作线程还在,如果在,就显示对话框 + if (Boolean.TRUE.equals(mainViewModel.mutableImportShareRunning.getValue())) { + showShareDialog(); + }else { + //读取共享的文件 + doReceiveShareFile(getIntent()); + } + + } + + + /** + * 接收共享文件 + * @param intent intent + */ + private void doReceiveShareFile(Intent intent) { + Uri uri = (Uri) intent.getData(); + + if (uri != null) { + ImportSharedLogs importSharedLogs = null; + //先显示导入log的对话框 + showShareDialog(); + try { + + importSharedLogs = new ImportSharedLogs(mainViewModel); + Log.e(TAG,"开始导入。。。"); + mainViewModel.mutableImportShareRunning.setValue(true); + importSharedLogs.doImport(getBaseContext().getContentResolver().openInputStream(uri) + ,new OnShareLogEvents() { + @Override + public void onPreparing(String info) { + mainViewModel.mutableShareInfo.postValue(info); + } + + @Override + public void onShareStart(int count, String info) { + mainViewModel.mutableSharePosition.postValue(0); + mainViewModel.mutableShareInfo.postValue(info); + mainViewModel.mutableImportShareRunning.postValue(true); + mainViewModel.mutableShareCount.postValue(count); + } + + @Override + public boolean onShareProgress(int count, int position, String info) { + mainViewModel.mutableSharePosition.postValue(position); + mainViewModel.mutableShareInfo.postValue(info); + mainViewModel.mutableShareCount.postValue(count); + return Boolean.TRUE.equals(mainViewModel.mutableImportShareRunning.getValue()); + } + + @Override + public void afterGet(int count, String info) { + mainViewModel.mutableShareInfo.postValue(info); + mainViewModel.mutableImportShareRunning.postValue(false); + } + + @Override + public void onShareFailed(String info) { + mainViewModel.mutableShareInfo.postValue(info); + } + }); + } catch (IOException e) { + mainViewModel.mutableImportShareRunning.postValue(false); + Log.e(TAG,String.format("错误:%s",e.getMessage())); + ToastMessage.show(e.getMessage()); + } + } else { + Log.e(TAG, "读文件类型时,文件没有找到。"); + } + } + + + /** + * 添加浮动按钮 + */ + + private void InitFloatView() { + //floatView = new FloatView(this, 32); + + binding.container.addView(floatView); + floatView.setButtonMargin(0); + floatView.setFloatBoard(FloatView.FLOAT_BOARD.RIGHT); + + floatView.setButtonBackgroundResourceId(R.drawable.float_button_style); + //动态添加按钮,建议使用静态的ID,静态ID在VALUES/FLOAT_BUTTON_IDS.XML中设置 + floatView.addButton(R.id.float_nav, "float_nav", R.drawable.ic_baseline_fullscreen_24 + , new View.OnClickListener() { + @Override + public void onClick(View view) { + FloatViewButton button = floatView.getButtonByName("float_nav"); + if (binding.navView.getVisibility() == View.VISIBLE) { + binding.navView.setVisibility(View.GONE); + if (button != null) { + button.setImageResource(R.drawable.ic_baseline_fullscreen_exit_24); + } + } else { + binding.navView.setVisibility(View.VISIBLE); + if (button != null) { + button.setImageResource(R.drawable.ic_baseline_fullscreen_24); + } + } + } + }); + floatView.addButton(R.id.float_freq, "float_freq", R.drawable.ic_baseline_freq_24 + , new View.OnClickListener() { + @Override + public void onClick(View view) { + new FreqDialog(binding.container.getContext(), mainViewModel).show(); + } + }); + + floatView.addButton(R.id.set_volume, "set_volume", R.drawable.ic_baseline_volume_up_24 + , new View.OnClickListener() { + @Override + public void onClick(View view) { + new SetVolumeDialog(binding.container.getContext(), mainViewModel).show(); + } + }); + //打开网格追踪 + floatView.addButton(R.id.grid_tracker, "grid_tracker", R.drawable.ic_baseline_grid_tracker_24 + , new View.OnClickListener() { + @Override + public void onClick(View view) { + Intent intent = new Intent(getApplicationContext(), GridTrackerMainActivity.class); + startActivity(intent); + } + }); + + +// floatView.addButton(R.id.flex_radio, "flex_radio", R.drawable.flex_icon +// , new View.OnClickListener() { +// @Override +// public void onClick(View view) { +// navController.navigate(R.id.flexRadioInfoFragment); +// } +// }); + + floatView.initLocation(); + } + + /** + * 初始化一些数据 + */ + private void InitData() { + if (mainViewModel.configIsLoaded) return;//如果数据已经读取一遍了,就不用再读取了。 + + //读取波段数据 + if (mainViewModel.operationBand == null) { + mainViewModel.operationBand = OperationBand.getInstance(getBaseContext()); + } + + mainViewModel.databaseOpr.getQslDxccToMap(); + + //获取所有的配置参数 + mainViewModel.databaseOpr.getAllConfigParameter(new OnAfterQueryConfig() { + @Override + public void doOnBeforeQueryConfig(String KeyName) { + + } + + @Override + public void doOnAfterQueryConfig(String KeyName, String Value) { + mainViewModel.configIsLoaded = true; + //此处梅登海德已经通过数据库得到了,但是如果GPS能获取到,还是用GPS的 + String grid = MaidenheadGrid.getMyMaidenheadGrid(getApplicationContext()); + if (!grid.equals("")) {//说明获取到了GPS数据 + GeneralVariables.setMyMaidenheadGrid(grid); + //写到数据库中 + mainViewModel.databaseOpr.writeConfig("grid", grid, null); + } + + mainViewModel.ft8TransmitSignal.setTimer_sec(GeneralVariables.transmitDelay); + //如果呼号、网格为空,就进入设置界面 + if (GeneralVariables.getMyMaidenheadGrid().equals("") + || GeneralVariables.myCallsign.equals("")) { + runOnUiThread(new Runnable() { + @Override + public void run() {//导航到设置页面 + navController.navigate(R.id.menu_nav_config); + } + }); + } + } + }); + + //把历史中通联成功的呼号与网格的对应关系 + new DatabaseOpr.GetCallsignMapGrid(mainViewModel.databaseOpr.getDb()).execute(); + + mainViewModel.getFollowCallsignsFromDataBase(); + //打开呼号位置信息的数据库,目前是以内存数据库方式。 + if (GeneralVariables.callsignDatabase == null) { + GeneralVariables.callsignDatabase = CallsignDatabase.getInstance(getBaseContext(), null, 1); + } + } + + + /** + * 显示生成log的对话框 + */ + private void showShareDialog() { + dialog = new ShareLogsProgressDialog( + binding.getRoot().getContext() + , mainViewModel,true); + + dialog.show(); + mainViewModel.mutableSharePosition.postValue(0); + mainViewModel.mutableShareInfo.postValue(""); + mainViewModel.mutableShareCount.postValue(0); + } + + + /** + * 检查权限 + */ + private void checkPermission() { + mPermissionList.clear(); + + //判断哪些权限未授予 + for (String permission : permissions) { + if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) { + mPermissionList.add(permission); + } + } + + //判断是否为空 + if (!mPermissionList.isEmpty()) {//请求权限方法 + String[] permissions = mPermissionList.toArray(new String[mPermissionList.size()]);//将List转为数组 + ActivityCompat.requestPermissions(MainActivity.this, permissions, PERMISSION_REQUEST); + } + } + + + /** + * 响应授权 + * 这里不管用户是否拒绝,都进入首页,不再重复申请权限 + */ + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + if (requestCode != PERMISSION_REQUEST) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + } + } + + + /** + * 显示串口设备列表 + */ + public void setSelectUsbDevice() { + ArrayList ports = mainViewModel.mutableSerialPorts.getValue(); + binding.selectSerialPortLinearLayout.removeAllViews(); + for (int i = 0; i < ports.size(); i++) {//动态添加串口设备列表 + View layout = LayoutInflater.from(getApplicationContext()) + .inflate(R.layout.select_serial_port_list_view_item, null); + layout.setId(i); + TextView textView = layout.findViewById(R.id.selectSerialPortListViewItemTextView); + textView.setText(ports.get(i).information()); + binding.selectSerialPortLinearLayout.addView(layout); + layout.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + //连接电台并做电台的频率设置等操作 + mainViewModel.connectCableRig(getApplicationContext(), ports.get(view.getId())); + binding.selectSerialPortLayout.setVisibility(View.GONE); + } + }); + } + + //选择串口设备弹框 + if ((ports.size() >= 1) && (!mainViewModel.isRigConnected())) { + binding.selectSerialPortLayout.setVisibility(View.VISIBLE); + } else {//说明没有可以识别的驱动,不显示设备弹框 + binding.selectSerialPortLayout.setVisibility(View.GONE); + } + } + +// /** +// * 删除指定文件夹中的所有文件 +// * +// * @param filePath 指定的文件夹 +// */ +// public static void deleteFolderFile(String filePath) { +// try { +// File file = new File(filePath);//获取SD卡指定路径 +// File[] files = file.listFiles();//获取SD卡指定路径下的文件或者文件夹 +// for (int i = 0; i < files.length; i++) { +// if (files[i].isFile()) {//如果是文件直接删除 +// File tempFile = new File(files[i].getPath()); +// tempFile.delete(); +// } +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } + + private void animationImage() { + + ObjectAnimator navigationAnimator = ObjectAnimator.ofFloat(binding.navView, "translationY", 200); + navigationAnimator.setDuration(3000); + navigationAnimator.setFloatValues(200, 200, 200, 0); + + + ObjectAnimator hideLogoAnimator = ObjectAnimator.ofFloat(binding.initDataLayout, "alpha", 1f, 1f, 1f, 0); + hideLogoAnimator.setDuration(3000); + + AnimatorSet animatorSet = new AnimatorSet(); + animatorSet.playTogether(navigationAnimator, hideLogoAnimator); + //animatorSet.playTogether(initPositionStrAnimator, logoAnimator, navigationAnimator, hideLogoAnimator); + animatorSet.addListener(new Animator.AnimatorListener() { + @Override + public void onAnimationStart(Animator animator) { + + } + + @Override + public void onAnimationEnd(Animator animator) { + //animationEnd = true; + binding.initDataLayout.setVisibility(View.GONE); + binding.utcProgressBar.setVisibility(View.VISIBLE); + InitFloatView();//显示浮窗 + //binding.floatView.setVisibility(View.VISIBLE); + } + + @Override + public void onAnimationCancel(Animator animator) { + + } + + @Override + public void onAnimationRepeat(Animator animator) { + + } + }); + + animatorSet.start(); + } + + + //此方法只有在android:launchMode="singleTask"模式下起作用 + @Override + protected void onNewIntent(Intent intent) { + if ("android.hardware.usb.action.USB_DEVICE_ATTACHED".equals(intent.getAction())) { + mainViewModel.getUsbDevice(); + }else { + setIntent(intent);//因为处于单例模式,所以要更新一下intent + doReceiveShareFile(getIntent()); + } + super.onNewIntent(intent); + } + + + @Override + public void onBackPressed() { + if (navController.getGraph().getStartDestination() == navController.getCurrentDestination().getId()) {//说明是到最后一个页面了 + AlertDialog.Builder builder = new AlertDialog.Builder(this) + .setMessage(getString(R.string.exit_confirmation)) + .setPositiveButton(getString(R.string.exit) + , new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + if (mainViewModel.ft8TransmitSignal.isActivated()) { + mainViewModel.ft8TransmitSignal.setActivated(false); + } + closeThisApp();//退出APP + } + }).setNegativeButton(getString(R.string.cancel) + , new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + dialogInterface.dismiss(); + } + }); + builder.create().show(); + + } else {//退出activity堆栈 + navController.navigateUp(); + //setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR); + } + } + + private void closeThisApp() { + mainViewModel.ft8TransmitSignal.setActivated(false); + if (mainViewModel.baseRig != null) { + if (mainViewModel.baseRig.getConnector() != null) { + mainViewModel.baseRig.getConnector().disconnect(); + } + } + + mainViewModel.ft8SignalListener.stopListen(); + mainViewModel = null; + System.exit(0); + } + + + /** + * 注册蓝牙动作广播 + */ + private void registerBluetoothReceiver() { + if (mReceive == null) { + mReceive = new BluetoothStateBroadcastReceive(getApplicationContext(), mainViewModel); + } + IntentFilter intentFilter = new IntentFilter(); + intentFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); + intentFilter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED); + intentFilter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED); + intentFilter.addAction(AudioManager.ACTION_SCO_AUDIO_STATE_UPDATED); + intentFilter.addAction(AudioManager.EXTRA_SCO_AUDIO_PREVIOUS_STATE); + intentFilter.addAction(AudioManager.ACTION_AUDIO_BECOMING_NOISY); + intentFilter.addAction(AudioManager.EXTRA_SCO_AUDIO_STATE); + intentFilter.addAction(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED); + intentFilter.addAction(BluetoothAdapter.EXTRA_CONNECTION_STATE); + intentFilter.addAction(BluetoothAdapter.EXTRA_STATE); + intentFilter.addAction("android.bluetooth.BluetoothAdapter.STATE_OFF"); + intentFilter.addAction("android.bluetooth.BluetoothAdapter.STATE_ON"); + registerReceiver(mReceive, intentFilter); + } + + /** + * 注销蓝牙动作广播 + */ + private void unregisterBluetoothReceiver() { + if (mReceive != null) { + unregisterReceiver(mReceive); + mReceive = null; + } + } + + @Override + protected void onDestroy() { + unregisterBluetoothReceiver(); + //保证屏幕方向切换后,不会因为对话框导致闪退 + if (Boolean.TRUE.equals(mainViewModel.mutableImportShareRunning.getValue())) { + if (dialog != null) { + dialog.dismiss(); + dialog = null; + } + } + + super.onDestroy(); + } + + +} \ No newline at end of file diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/MainViewModel.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/MainViewModel.java new file mode 100644 index 00000000..e5db1ca2 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/MainViewModel.java @@ -0,0 +1,1094 @@ +package com.bg7yoz.ft8cn; +/** + * -----2022.5.6----- + * MainViewModel类,用于解码FT8信号以及保存与解码有关的变量数据。生存于APP的整个生命周期。 + * 1.解码的总条数。decoded_counter和mutable_Decoded_Counter。 + * 2.解码消息的列表。消息以Ft8Message展示,列表用ArrayList泛型实现。ft8Messages,mutableFt8MessageList。 + * 3.解码和录音都需要时间同步,也就是以UTC时间的每15秒为一个周期。同步事件的触发由UtcTimer类来实现。 + * 4.当前的UTC时间。timerSec,更新频率(心跳频率)由UtcTimer确定,暂定100毫秒。 + * 5.通过类方法getInstance获取当前的MainViewModel的实例,确保有唯一的实例。 + * 6.用HamAudioRecorder类实现录音,目前只实现录音成文件,然后读取文件的数据给解码模块,后面要改成直接给数组的方式----TO DO--- + * 7.解码采用JNI接口调用原生C语言。调用接口名时ft8cn,由cpp文件夹下的CMakeLists.txt维护。各函数的调用接口在decode_ft8.cpp中。 + * -----2022.5.9----- + * 如果系统没有发射信号,触发器会在每一个周期触发录音动作,因录音开始和结束要浪费一些时间,如果不干预上一个录音的动作,将出现 + * 连续的周期内录音动作重叠,造成第二个录音动作失败。所以,第二个周期的录音开始前,要停止前一个周期的录音,造成的结果就是每一次录音 + * 的开始时间要晚于周期开始300毫秒(模拟器的结果),实际录音的长度一般在14.77秒左右 + *

+ * + * 2023-08-16 由DS1UFX提交修改(基于0.9版),增加(tr)uSDX audio over cat的支持。 + * + * @author BG7YOZ + * @date 2022.8.22 + */ + +import static com.bg7yoz.ft8cn.GeneralVariables.getStringFromResource; + +import android.annotation.SuppressLint; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.media.AudioManager; +import android.os.Handler; +import android.util.Log; + +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.ViewModel; +import androidx.lifecycle.ViewModelProvider; +import androidx.lifecycle.ViewModelStoreOwner; + +import com.bg7yoz.ft8cn.callsign.CallsignDatabase; +import com.bg7yoz.ft8cn.callsign.CallsignInfo; +import com.bg7yoz.ft8cn.callsign.OnAfterQueryCallsignLocation; +import com.bg7yoz.ft8cn.connector.BluetoothRigConnector; +import com.bg7yoz.ft8cn.connector.CableConnector; +import com.bg7yoz.ft8cn.connector.CableSerialPort; +import com.bg7yoz.ft8cn.connector.ConnectMode; +import com.bg7yoz.ft8cn.connector.FlexConnector; +import com.bg7yoz.ft8cn.connector.IComWifiConnector; +import com.bg7yoz.ft8cn.connector.X6100Connector; +import com.bg7yoz.ft8cn.database.ControlMode; +import com.bg7yoz.ft8cn.database.DatabaseOpr; +import com.bg7yoz.ft8cn.database.OnAfterQueryFollowCallsigns; +import com.bg7yoz.ft8cn.database.OperationBand; +import com.bg7yoz.ft8cn.flex.FlexRadio; +import com.bg7yoz.ft8cn.flex.RadioTcpClient; +import com.bg7yoz.ft8cn.ft8listener.FT8SignalListener; +import com.bg7yoz.ft8cn.ft8listener.OnFt8Listen; +import com.bg7yoz.ft8cn.ft8transmit.FT8TransmitSignal; +import com.bg7yoz.ft8cn.ft8transmit.OnDoTransmitted; +import com.bg7yoz.ft8cn.ft8transmit.OnTransmitSuccess; +import com.bg7yoz.ft8cn.html.LogHttpServer; +import com.bg7yoz.ft8cn.icom.WifiRig; +import com.bg7yoz.ft8cn.log.QSLCallsignRecord; +import com.bg7yoz.ft8cn.log.QSLRecord; +import com.bg7yoz.ft8cn.log.SWLQsoList; +import com.bg7yoz.ft8cn.log.ThirdPartyService; +import com.bg7yoz.ft8cn.rigs.BaseRig; +import com.bg7yoz.ft8cn.rigs.BaseRigOperation; +import com.bg7yoz.ft8cn.rigs.ElecraftRig; +import com.bg7yoz.ft8cn.rigs.Flex6000Rig; +import com.bg7yoz.ft8cn.rigs.FlexNetworkRig; +import com.bg7yoz.ft8cn.rigs.GuoHeQ900Rig; +import com.bg7yoz.ft8cn.rigs.IcomRig; +import com.bg7yoz.ft8cn.rigs.InstructionSet; +import com.bg7yoz.ft8cn.rigs.KenwoodKT90Rig; +import com.bg7yoz.ft8cn.rigs.KenwoodTS2000Rig; +import com.bg7yoz.ft8cn.rigs.KenwoodTS570Rig; +import com.bg7yoz.ft8cn.rigs.KenwoodTS590Rig; +import com.bg7yoz.ft8cn.rigs.OnRigStateChanged; +import com.bg7yoz.ft8cn.rigs.TrUSDXRig; +import com.bg7yoz.ft8cn.rigs.Wolf_sdr_450Rig; +import com.bg7yoz.ft8cn.rigs.XieGu6100NetRig; +import com.bg7yoz.ft8cn.rigs.XieGu6100Rig; +import com.bg7yoz.ft8cn.rigs.XieGuRig; +import com.bg7yoz.ft8cn.rigs.Yaesu2Rig; +import com.bg7yoz.ft8cn.rigs.Yaesu2_847Rig; +import com.bg7yoz.ft8cn.rigs.Yaesu38Rig; +import com.bg7yoz.ft8cn.rigs.Yaesu38_450Rig; +import com.bg7yoz.ft8cn.rigs.Yaesu39Rig; +import com.bg7yoz.ft8cn.rigs.YaesuDX10Rig; +import com.bg7yoz.ft8cn.spectrum.SpectrumListener; +import com.bg7yoz.ft8cn.timer.OnUtcTimer; +import com.bg7yoz.ft8cn.timer.UtcTimer; +import com.bg7yoz.ft8cn.ui.ToastMessage; +import com.bg7yoz.ft8cn.wave.HamRecorder; +import com.bg7yoz.ft8cn.wave.OnGetVoiceDataDone; +import com.bg7yoz.ft8cn.x6100.X6100Radio; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Objects; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + + +public class MainViewModel extends ViewModel { + String TAG = "ft8cn MainViewModel"; + public boolean configIsLoaded = false; + + private static MainViewModel viewModel = null;//当前存在的实例。 + //public static Application application; + + + //public int decoded_counter = 0;//解码的总条数 + public final ArrayList ft8Messages = new ArrayList<>();//消息列表 + public UtcTimer utcTimer;//同步触发动作的计时器。 + + + //public CallsignDatabase callsignDatabase = null;//呼号信息的数据库 + public DatabaseOpr databaseOpr;//配置信息,和相关数据的数据库 + + + public MutableLiveData mutable_Decoded_Counter = new MutableLiveData<>();//解码的总条数 + public int currentDecodeCount = 0;//本次解码的条数 + public MutableLiveData> mutableFt8MessageList = new MutableLiveData<>();//消息列表 + public MutableLiveData timerSec = new MutableLiveData<>();//当前UTC时间。更新频率由UtcTimer确定,未触发时约100毫秒。 + public MutableLiveData mutableIsRecording = new MutableLiveData<>();//是否处于录音状态 + public MutableLiveData mutableHamRecordIsRunning = new MutableLiveData<>();//HamRecord是否运转 + public MutableLiveData mutableTimerOffset = new MutableLiveData<>();//本周期的时间延迟 + public MutableLiveData mutableIsDecoding = new MutableLiveData<>();//会触发频谱图中的标记动作 + public ArrayList currentMessages = null;//本周期解码的消息(用于画到频谱上) + + public MutableLiveData mutableIsFlexRadio = new MutableLiveData<>();//是不是flex电台 + public MutableLiveData mutableIsXieguRadio = new MutableLiveData<>();//是不是flex电台 + + private final ExecutorService getQTHThreadPool = Executors.newCachedThreadPool(); + private final ExecutorService sendWaveDataThreadPool = Executors.newCachedThreadPool(); + private final GetQTHRunnable getQTHRunnable = new GetQTHRunnable(this); + private final SendWaveDataRunnable sendWaveDataRunnable = new SendWaveDataRunnable(); + + + //用于显示生成共享日志过程的变量 + public MutableLiveData mutableShareInfo=new MutableLiveData<>("");//分享数据的状态 + public MutableLiveData mutableSharePosition=new MutableLiveData<>(0);//分享数据当前的位置 + public MutableLiveData mutableShareRunning=new MutableLiveData<>(false);//是否正在生成分享数据 + public MutableLiveData mutableShareCount=new MutableLiveData<>(0);//共享的总数 + public MutableLiveData mutableImportShareRunning=new MutableLiveData<>(false);//是否正在导入分享数据 + + + + public HamRecorder hamRecorder;//用于录音的对象 + public FT8SignalListener ft8SignalListener;//用于监听FT8信号并解码的对象 + public FT8TransmitSignal ft8TransmitSignal;//用于发射信号用的对象 + public SpectrumListener spectrumListener;//用于画频谱的对象 + public boolean markMessage = true;//是否标记消息开关 + + //控制电台的方式 + public OperationBand operationBand = null; + + private SWLQsoList swlQsoList = new SWLQsoList();//用于记录SWL的QSO对象,对SWL QSO做判断,防止重复。 + + + public MutableLiveData> mutableSerialPorts = new MutableLiveData<>(); + private ArrayList serialPorts;//串口列表 + public BaseRig baseRig;//电台 + private final OnRigStateChanged onRigStateChanged = new OnRigStateChanged() { + @Override + public void onDisconnected() { + //与电台连接中断 + ToastMessage.show(getStringFromResource(R.string.disconnect_rig)); + } + + @Override + public void onConnected() { + //与电台建立连接 + ToastMessage.show(getStringFromResource(R.string.connected_rig)); + } + + @Override + public void onPttChanged(boolean isOn) { + + } + + @Override + public void onFreqChanged(long freq) { + //当前频率:%s + ToastMessage.show(String.format(getStringFromResource(R.string.current_frequency) + , BaseRigOperation.getFrequencyAllInfo(freq))); + //把频率的变化写回到全局变量中 + GeneralVariables.band = freq; + GeneralVariables.bandListIndex = OperationBand.getIndexByFreq(freq); + GeneralVariables.mutableBandChange.postValue(GeneralVariables.bandListIndex); + + databaseOpr.getAllQSLCallsigns();//通联成功的呼号读出来 + + } + + @Override + public void onRunError(String message) { + //与电台通讯出现错误, + ToastMessage.show(String.format(getStringFromResource(R.string.radio_communication_error) + , message)); + } + }; + + //发射信号用的消息列表 + //public ArrayList transmitMessages = new ArrayList<>(); + //public MutableLiveData> mutableTransmitMessages = new MutableLiveData<>(); + public MutableLiveData mutableTransmitMessagesCount = new MutableLiveData<>(); + + + public boolean deNoise = false;//在频谱中抑制噪声 + + //*********日志查询需要的变量******************** + public boolean logListShowCallsign = false;//在日志查询列表的表现形式 + public String queryKey = "";//查询的关键字 + public int queryFilter = 0;//过滤,0全部,1,确认,2,未确认 + public MutableLiveData mutableQueryFilter = new MutableLiveData<>(); + public ArrayList callsignRecords = new ArrayList<>(); + //public ArrayList qslRecords=new ArrayList<>(); + //******************************************** + //关注呼号的列表 + //public ArrayList followCallsign = new ArrayList<>(); + + + //日志管理HTTP SERVER + private final LogHttpServer httpServer; + + /** + * 获取MainViewModel的实例,确保存在唯一的MainViewModel实例,该实例在APP的全部生存周期中。 + * + * @param owner ViewModelStoreOwner 所有者,一般为Activity或Fragment。 + * @return MainViewModel 返回一个MainViewModel实例 + */ + public static MainViewModel getInstance(ViewModelStoreOwner owner) { + if (viewModel == null) { + viewModel = new ViewModelProvider(owner).get(MainViewModel.class); + } + return viewModel; + } + + /** + * 获取消息列表中指定的消息 + * + * @param position 在Mutable类型的列表中的位置 + * @return 返回一个Ft8Message类型的解码后的信息 + */ + public Ft8Message getFt8Message(int position) { + return Objects.requireNonNull(ft8Messages.get(position)); + } + + /** + * MainViewModel的构造函数主要完成一下事情: + * 1.创建与UTC同步的时钟,时钟是UtcTimer类,内核是用Timer和TimerTask实现的。回调函数是多线程的,要考虑线程安全的问题。 + * 2.创建Mutable型的解码消息列表。 + */ + //@RequiresApi(api = Build.VERSION_CODES.N) + public MainViewModel() { + + //获取配置信息。 + databaseOpr = DatabaseOpr.getInstance(GeneralVariables.getMainContext() + , "data.db"); + mutableIsDecoding.postValue(false);//解码状态 + //创录音对象 + hamRecorder = new HamRecorder(null); + hamRecorder.startRecord(); + + mutableIsFlexRadio.setValue(false); + mutableIsXieguRadio.setValue(false); + + //创建用于显示时间的计时器 + utcTimer = new UtcTimer(10, false, new OnUtcTimer() { + @Override + public void doHeartBeatTimer(long utc) {//不触发时的时钟信息 + + } + + @Override + public void doOnSecTimer(long utc) {//当指定间隔时触发时 + timerSec.postValue(utc);//发送当前UTC时间 + mutableIsRecording.postValue(hamRecorder.isRunning()); + mutableHamRecordIsRunning.postValue(hamRecorder.isRunning());//发送当前计时器状态 + } + }); + utcTimer.start();//启动计时器 + + //同步一下时间。microsoft的NTP服务器 + UtcTimer.syncTime(null); + + mutableFt8MessageList.setValue(ft8Messages); + + //创建监听对象,回调中的动作用于处理解码、发射、关注的呼号列表添加等操作 + ft8SignalListener = new FT8SignalListener(databaseOpr, new OnFt8Listen() { + @Override + public void beforeListen(long utc) { + mutableIsDecoding.postValue(true); + } + + @Override + public void afterDecode(long utc, float time_sec, int sequential + , ArrayList messages, boolean isDeep) { + if (messages.size() == 0) return;//没有解码出消息,不触发动作 + + synchronized (ft8Messages) { + ft8Messages.addAll(messages);//添加消息到列表 + } + GeneralVariables.deleteArrayListMore(ft8Messages);//删除多余的消息,FT8CN限定的可展示消息的总数量 + + mutableFt8MessageList.postValue(ft8Messages);//触发添加消息的动作,让界面能观察到 + mutableTimerOffset.postValue(time_sec);//本次时间偏移量 + + + findIncludedCallsigns(messages);//查找符合条件的消息,放到呼叫列表中 + + //检查发射程序。从消息列表中解析发射的程序 + //超出周期2秒钟,就不应该解析了 + if (!ft8TransmitSignal.isTransmitting() + && !isDeep//屏蔽掉深度解码激活自动程序 + //深度解码的列表应该加到没有深度解码的新消息列表中 + && (ft8SignalListener.timeSec + + GeneralVariables.pttDelay + + GeneralVariables.transmitDelay <= 2000)) {//考虑网络模式,发射时长是13秒 + ft8TransmitSignal.parseMessageToFunction(messages);//解析消息,并处理 + } + + currentMessages = messages; + + if (isDeep) { + currentDecodeCount += messages.size(); + } else { + currentDecodeCount = messages.size(); + } + + mutableIsDecoding.postValue(false);//解码的状态,会触发频谱图中的标记动作 + + + getQTHRunnable.messages = messages; + getQTHThreadPool.execute(getQTHRunnable);//用线程池的方式查询归属地 + + //此变量也是告诉消息列表变化的 + mutable_Decoded_Counter.postValue( + currentDecodeCount);//告知界面消息的总数量 + + if (GeneralVariables.saveSWLMessage) { + databaseOpr.writeMessage(messages);//把SWL消息写到数据库 + } + //检查QSO of SWL,并保存到SWLQSOTable中的通联列表qsoList中 + if (GeneralVariables.saveSWL_QSO) { + swlQsoList.findSwlQso(messages, ft8Messages, new SWLQsoList.OnFoundSwlQso() { + @Override + public void doFound(QSLRecord record) { + databaseOpr.addSWL_QSO(record);//把SWL QSO保存到数据库 + ToastMessage.show(record.swlQSOInfo()); + } + }); + } + //从列表中查找呼号和网格对应关系,并添加到表中 + getCallsignAndGrid(messages); + } + }); + + ft8SignalListener.setOnWaveDataListener(new FT8SignalListener.OnWaveDataListener() { + @Override + public void getVoiceData(int duration, boolean afterDoneRemove, OnGetVoiceDataDone getVoiceDataDone) { + hamRecorder.getVoiceData(duration, afterDoneRemove, getVoiceDataDone); + } + }); + + + ft8SignalListener.startListen(); + + //频谱监听对象 + spectrumListener = new SpectrumListener(hamRecorder); + + + //创建发射对象,回调:发射前,发射后、QSL成功后。 + ft8TransmitSignal = new FT8TransmitSignal(databaseOpr, new OnDoTransmitted() { + private boolean needControlSco() {//根据控制模式,确定是不是需要开启SCO + if (GeneralVariables.connectMode == ConnectMode.NETWORK) { + return false; + } + if (GeneralVariables.controlMode != ControlMode.CAT) { + return true; + } + return baseRig != null && !baseRig.supportWaveOverCAT(); + } + + @Override + public void onBeforeTransmit(Ft8Message message, int functionOder) { + if (GeneralVariables.controlMode == ControlMode.CAT + || GeneralVariables.controlMode == ControlMode.RTS + || GeneralVariables.controlMode == ControlMode.DTR) { + if (baseRig != null) { + //if (GeneralVariables.connectMode != ConnectMode.NETWORK) stopSco(); + if (needControlSco()) stopSco(); + baseRig.setPTT(true); + } + } + if (ft8TransmitSignal.isActivated()) { + GeneralVariables.transmitMessages.add(message); + //mutableTransmitMessages.postValue(GeneralVariables.transmitMessages); + mutableTransmitMessagesCount.postValue(1); + } + } + + @Override + public void onAfterTransmit(Ft8Message message, int functionOder) { + if (GeneralVariables.controlMode == ControlMode.CAT + || GeneralVariables.controlMode == ControlMode.RTS + || GeneralVariables.controlMode == ControlMode.DTR) { + if (baseRig != null) { + baseRig.setPTT(false); + //if (GeneralVariables.connectMode != ConnectMode.NETWORK) startSco(); + if (needControlSco()) startSco(); + } + } + } + + @Override + public void onTransmitByWifi(Ft8Message msg) { + if (GeneralVariables.connectMode == ConnectMode.NETWORK) { + if (baseRig != null) { + if (baseRig.isConnected()) { + sendWaveDataRunnable.baseRig = baseRig; + sendWaveDataRunnable.message = msg; + //以线程池的方式执行网络数据包发送 + sendWaveDataThreadPool.execute(sendWaveDataRunnable); + } + } + } + } + + //2023-08-16 由DS1UFX提交修改(基于0.9版),用于(tr)uSDX audio over cat的支持。 + @Override + public boolean supportTransmitOverCAT() { + if (GeneralVariables.controlMode != ControlMode.CAT) { + return false; + } + if (baseRig == null) { + return false; + } + if (!baseRig.isConnected() || !baseRig.supportWaveOverCAT()) { + return false; + } + return true; + } + + @Override + public void onTransmitOverCAT(Ft8Message msg) {//通过CAT发送音频消息 + if (!supportTransmitOverCAT()) { + return; + } + sendWaveDataRunnable.baseRig = baseRig; + sendWaveDataRunnable.message = msg; + sendWaveDataThreadPool.execute(sendWaveDataRunnable); + } + + }, new OnTransmitSuccess() {//当通联成功时 + @Override + public void doAfterTransmit(QSLRecord qslRecord) { + databaseOpr.addQSL_Callsign(qslRecord);//两个操作,把呼号和QSL记录下来 + + // 记录到第三方服务,耗时可能较长 + new Thread(new Runnable() { + @Override + public void run() { + if (GeneralVariables.enableCloudlog){ + ThirdPartyService.UploadToCloudLog(qslRecord); + } + if (GeneralVariables.enableQRZ){ + ThirdPartyService.UploadToQRZ(qslRecord); + } + } + }).start(); + + if (qslRecord.getToCallsign() != null) {//把通联成功的分区加入到分区列表 + GeneralVariables.callsignDatabase.getCallsignInformation(qslRecord.getToCallsign() + , new OnAfterQueryCallsignLocation() { + @Override + public void doOnAfterQueryCallsignLocation(CallsignInfo callsignInfo) { + GeneralVariables.addDxcc(callsignInfo.DXCC); + GeneralVariables.addItuZone(callsignInfo.ITUZone); + GeneralVariables.addCqZone(callsignInfo.CQZone); + } + }); + } + } + }); + + + //打开HTTP SERVER + httpServer = new LogHttpServer(this, LogHttpServer.DEFAULT_PORT); + try { + httpServer.start(); + } catch (IOException e) { + Log.e(TAG, "http server error:" + e.getMessage()); + } + } + + public void setTransmitIsFreeText(boolean isFreeText) { + if (ft8TransmitSignal != null) { + ft8TransmitSignal.setTransmitFreeText(isFreeText); + } + } + + public boolean getTransitIsFreeText() { + if (ft8TransmitSignal != null) { + return ft8TransmitSignal.isTransmitFreeText(); + } + return false; + } + + + /** + * 查找符合条件的消息,放到呼叫列表中 + * + * @param messages 消息 + */ + private synchronized void findIncludedCallsigns(ArrayList messages) { + Log.d(TAG, "findIncludedCallsigns: 查找关注的呼号"); + if (ft8TransmitSignal.isActivated() && ft8TransmitSignal.sequential != UtcTimer.getNowSequential()) { + return; + } + int count = 0; + for (Ft8Message msg : messages) { + //与我的呼号有关,与关注的呼号有关 + //if (msg.getCallsignFrom().equals(GeneralVariables.myCallsign) + if (GeneralVariables.checkIsMyCallsign(msg.getCallsignFrom()) + //|| msg.getCallsignTo().equals(GeneralVariables.myCallsign) + || GeneralVariables.checkIsMyCallsign(msg.getCallsignTo()) + || GeneralVariables.callsignInFollow(msg.getCallsignFrom()) + || (GeneralVariables.callsignInFollow(msg.getCallsignTo()) && (msg.getCallsignTo() != null)) + || (GeneralVariables.autoFollowCQ && msg.checkIsCQ())) {//是CQ,并且允许关注CQ + //看不是通联成功的呼号的消息 + msg.isQSL_Callsign = GeneralVariables.checkQSLCallsign(msg.getCallsignFrom()); + if (!GeneralVariables.checkIsExcludeCallsign(msg.callsignFrom)) {//不在排除呼号前缀的,才加入列表 + count++; + GeneralVariables.transmitMessages.add(msg); + } + } + } + GeneralVariables.deleteArrayListMore(GeneralVariables.transmitMessages);//删除多余的消息 + //mutableTransmitMessages.postValue(GeneralVariables.transmitMessages); + mutableTransmitMessagesCount.postValue(count); + } + + /** + * 清除传输消息列表 + */ + public void clearTransmittingMessage() { + GeneralVariables.transmitMessages.clear(); + mutableTransmitMessagesCount.postValue(0); + } + + + /** + * 从消息列表中查找呼号和网格的对应关系 + * + * @param messages 消息列表 + */ + private void getCallsignAndGrid(ArrayList messages) { + for (Ft8Message msg : messages) { + if (GeneralVariables.checkFun1(msg.extraInfo)) {//检查是不是网格 + //如果内存表中没有,或不一致,就写入数据库中 + if (!GeneralVariables.getCallsignHasGrid(msg.getCallsignFrom(), msg.maidenGrid)) { + databaseOpr.addCallsignQTH(msg.getCallsignFrom(), msg.maidenGrid);//写数据库 + } + GeneralVariables.addCallsignAndGrid(msg.getCallsignFrom(), msg.maidenGrid); + } + } + } + + /** + * 清除消息列表 + */ + public void clearFt8MessageList() { + ft8Messages.clear(); + mutable_Decoded_Counter.postValue(ft8Messages.size()); + mutableFt8MessageList.postValue(ft8Messages); + } + + + /** + * 删除单个文件 + * + * @param fileName 要删除的文件的文件名 + */ + public static void deleteFile(String fileName) { + File file = new File(fileName); + // 如果文件路径所对应的文件存在,并且是一个文件,则直接删除 + if (file.exists() && file.isFile()) { + file.delete(); + } + } + + /** + * 向关注的呼号列表添加呼号 + * + * @param callsign 呼号 + */ + public void addFollowCallsign(String callsign) { + if (!GeneralVariables.followCallsign.contains(callsign)) { + GeneralVariables.followCallsign.add(callsign); + databaseOpr.addFollowCallsign(callsign); + } + } + + + /** + * 从数据库中获取关注的呼号列表 + */ + public void getFollowCallsignsFromDataBase() { + databaseOpr.getFollowCallsigns(new OnAfterQueryFollowCallsigns() { + @Override + public void doOnAfterQueryFollowCallsigns(ArrayList callsigns) { + for (String s : callsigns) { + if (!GeneralVariables.followCallsign.contains(s)) { + GeneralVariables.followCallsign.add(s); + } + } + } + }); + } + + + /** + * 设置操作载波频率。如果电台没有连接,就有操作 + */ + public void setOperationBand() { + if (!isRigConnected()) { + return; + } + + //先设置上边带,再设置频率 + baseRig.setUsbModeToRig();//设置上边带 + + //此处延迟1秒发送第二个指令,是防止协谷X6100断开连接的问题 + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + baseRig.setFreq(GeneralVariables.band);//设置频率 + baseRig.setFreqToRig(); + } + }, 800); + } + + public void setCivAddress() { + if (baseRig != null) { + baseRig.setCivAddress(GeneralVariables.civAddress); + } + } + + public void setControlMode() { + if (baseRig != null) { + baseRig.setControlMode(GeneralVariables.controlMode); + } + } + + + /** + * 通过USB连接电台 + * + * @param context context + * @param port 串口 + */ + public void connectCableRig(Context context, CableSerialPort.SerialPort port) { + if (GeneralVariables.controlMode == ControlMode.VOX) {//如果当前是VOX,就改成CAT模式 + GeneralVariables.controlMode = ControlMode.CAT; + } + connectRig(); + + if (baseRig == null) { + return; + } + baseRig.setControlMode(GeneralVariables.controlMode); + CableConnector connector = new CableConnector(context, port, GeneralVariables.baudRate + //, GeneralVariables.controlMode); + , GeneralVariables.controlMode,baseRig); + + //2023-08-16 由DS1UFX提交修改(基于0.9版),用于(tr)uSDX audio over cat的支持。 + connector.setOnCableDataReceived(new CableConnector.OnCableDataReceived() { + @Override + public void OnWaveReceived(int bufferLen, float[] buffer) { + Log.i(TAG, "call hamRecorder.doOnWaveDataReceived"); + hamRecorder.doOnWaveDataReceived(bufferLen, buffer); + } + }); + + baseRig.setOnRigStateChanged(onRigStateChanged); + baseRig.setConnector(connector); + connector.connect(); + + //晚1秒钟设置模式,防止有的电台反应不过来 + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + setOperationBand();//设置载波频率 + } + }, 1000); + + } + + public void connectBluetoothRig(Context context, BluetoothDevice device) { + GeneralVariables.controlMode = ControlMode.CAT;//蓝牙控制模式,只能是CAT控制 + connectRig(); + if (baseRig == null) { + return; + } + baseRig.setControlMode(GeneralVariables.controlMode); + BluetoothRigConnector connector = BluetoothRigConnector.getInstance(context, device.getAddress() + , GeneralVariables.controlMode); + baseRig.setOnRigStateChanged(onRigStateChanged); + baseRig.setConnector(connector); + + new Handler().postDelayed(new Runnable() {//蓝牙连接是需要时间的,等2秒再设置频率 + @Override + public void run() { + setOperationBand();//设置载波频率 + } + }, 5000); + } + + /** + * 以网络方式连接到ICOM、协谷X6100系列电台 + * @param wifiRig ICom,XieGu Wifi模式的电台 + */ + public void connectWifiRig(WifiRig wifiRig) { + if (GeneralVariables.connectMode == ConnectMode.NETWORK) { + if (baseRig != null) { + if (baseRig.getConnector() != null) { + baseRig.getConnector().disconnect(); + } + } + } + + GeneralVariables.controlMode = ControlMode.CAT;//网络控制模式 + //目前Icom与协谷x6100共用同一种连接器 + IComWifiConnector iComWifiConnector = new IComWifiConnector(GeneralVariables.controlMode + ,wifiRig); + iComWifiConnector.setOnWifiDataReceived(new IComWifiConnector.OnWifiDataReceived() { + @Override + public void OnWaveReceived(int bufferLen, float[] buffer) { + hamRecorder.doOnWaveDataReceived(bufferLen, buffer); + } + + @Override + public void OnCivReceived(byte[] data) { + + } + }); + + iComWifiConnector.connect(); + connectRig();//给baseRig赋值 + + baseRig.setControlMode(GeneralVariables.controlMode); + baseRig.setOnRigStateChanged(onRigStateChanged); + baseRig.setConnector(iComWifiConnector); + + new Handler().postDelayed(new Runnable() {//蓝牙连接是需要时间的,等2秒再设置频率 + @Override + public void run() { + setOperationBand();//设置载波频率 + } + }, 1000); + } + + /** + * 连接到flexRadio + * + * @param context context + * @param flexRadio flexRadio对象 + */ + public void connectFlexRadioRig(Context context, FlexRadio flexRadio) { + if (GeneralVariables.connectMode == ConnectMode.NETWORK) { + if (baseRig != null) { + if (baseRig.getConnector() != null) { + baseRig.getConnector().disconnect(); + } + } + } + GeneralVariables.controlMode = ControlMode.CAT;//网络控制模式 + FlexConnector flexConnector = new FlexConnector(context, flexRadio, GeneralVariables.controlMode); + flexConnector.setOnWaveDataReceived(new FlexConnector.OnWaveDataReceived() { + @Override + public void OnDataReceived(int bufferLen, float[] buffer) { + hamRecorder.doOnWaveDataReceived(bufferLen, buffer); + } + }); + flexConnector.connect(); + connectRig(); + + baseRig.setOnRigStateChanged(onRigStateChanged); + baseRig.setConnector(flexConnector); +// + new Handler().postDelayed(new Runnable() {//连接是需要时间的,等2秒再设置频率 + @Override + public void run() { + setOperationBand();//设置载波频率 + } + }, 3000); + } + + /** + * 连接到协谷Radio + * + * @param context context + * @param xieguRadio X6100Radio对象 + */ + public void connectXieguRadioRig(Context context, X6100Radio xieguRadio) { + if (GeneralVariables.connectMode == ConnectMode.NETWORK) { + if (baseRig != null) { + if (baseRig.getConnector() != null) { + baseRig.getConnector().disconnect(); + } + } + } + GeneralVariables.controlMode = ControlMode.CAT;//网络控制模式 + X6100Connector xieguConnector = new X6100Connector(context, xieguRadio, GeneralVariables.controlMode); + xieguConnector.setOnWaveDataReceived(new X6100Connector.OnWaveDataReceived() { + @Override + public void OnDataReceived(int bufferLen, float[] buffer) { + //Log.e(TAG,String.format("data len:%d",bufferLen)); + hamRecorder.doOnWaveDataReceived(bufferLen, buffer); + } + }); + + + xieguConnector.connect(); + connectRig(); + xieguConnector.setBaseRig(baseRig); + //接收电台发回的数据 + xieguRadio.setOnReceiveDataListener(new X6100Radio.OnReceiveDataListener() { + @Override + public void onDataReceive(byte[] data) { + baseRig.onReceiveData(data); + } + }); + + + baseRig.setOnRigStateChanged(onRigStateChanged); + baseRig.setConnector(xieguConnector); + + new Handler().postDelayed(new Runnable() {//连接是需要时间的,等2秒再设置频率 + @Override + public void run() { + setOperationBand();//设置载波频率 + } + }, 3000); + } + + + /** + * 根据指令集创建不同型号的电台 + */ + private void connectRig() { + + baseRig = null; + //此处判断是用什么类型的电台,ICOM,YAESU 2,YAESU 3 + switch (GeneralVariables.instructionSet) { + case InstructionSet.ICOM: + baseRig = new IcomRig(GeneralVariables.civAddress,true); + break; + case InstructionSet.ICOM_756: + baseRig = new IcomRig(GeneralVariables.civAddress,false); + break; + case InstructionSet.YAESU_2: + baseRig = new Yaesu2Rig(); + break; + case InstructionSet.YAESU_847: + baseRig = new Yaesu2_847Rig(); + break; + case InstructionSet.YAESU_3_9: + baseRig = new Yaesu39Rig(false);//yaesu3代指令,9位频率,usb模式 + break; + case InstructionSet.YAESU_3_9_U_DIG: + baseRig = new Yaesu39Rig(true);//yaesu3代指令,9位频率,data-usb模式 + break; + case InstructionSet.YAESU_3_8: + baseRig = new Yaesu38Rig();//yaesu3代指令,8位频率 + break; + case InstructionSet.YAESU_3_450: + baseRig = new Yaesu38_450Rig();//yaesu3代指令,8位频率 + break; + case InstructionSet.KENWOOD_TK90: + baseRig = new KenwoodKT90Rig();//建伍TK90 + break; + case InstructionSet.YAESU_DX10: + baseRig = new YaesuDX10Rig();//YAESU DX10 DX101 + break; + case InstructionSet.KENWOOD_TS590: + baseRig = new KenwoodTS590Rig();//KENWOOD TS590 + break; + case InstructionSet.GUOHE_Q900: + baseRig = new GuoHeQ900Rig();//国赫Q900 + break; + case InstructionSet.XIEGUG90S://协谷,USB模式 + baseRig = new XieGuRig(GeneralVariables.civAddress);//协谷G90S + break; + case InstructionSet.ELECRAFT: + baseRig = new ElecraftRig();//ELECRAFT + break; + case InstructionSet.FLEX_CABLE: + baseRig = new Flex6000Rig();//FLEX6000 + break; + case InstructionSet.FLEX_NETWORK: + baseRig = new FlexNetworkRig(); + break; + case InstructionSet.XIEGU_6100_FT8CNS: + if (GeneralVariables.connectMode == ConnectMode.NETWORK) {//只在网络模式下工作 + baseRig = new XieGu6100NetRig(GeneralVariables.civAddress);//协谷6100ft8cns模式 + }else{//否则使用传统的模式 + baseRig = new XieGu6100Rig(GeneralVariables.civAddress);//协谷6100 + } + break; + case InstructionSet.XIEGU_6100: + baseRig = new XieGu6100Rig(GeneralVariables.civAddress);//协谷6100 + break; + case InstructionSet.KENWOOD_TS2000: + baseRig = new KenwoodTS2000Rig();//建伍TS2000 + break; + case InstructionSet.WOLF_SDR_DIGU: + baseRig = new Wolf_sdr_450Rig(false); + break; + case InstructionSet.WOLF_SDR_USB: + baseRig = new Wolf_sdr_450Rig(true); + break; + case InstructionSet.TRUSDX: + baseRig = new TrUSDXRig();//(tr)uSDX + break; + case InstructionSet.KENWOOD_TS570: + baseRig = new KenwoodTS570Rig();//KENWOOD TS-570D + break; + } + + if ((GeneralVariables.instructionSet == InstructionSet.FLEX_NETWORK) + || ((GeneralVariables.instructionSet == InstructionSet.ICOM + || GeneralVariables.instructionSet==InstructionSet.XIEGU_6100 + || GeneralVariables.instructionSet==InstructionSet.XIEGU_6100_FT8CNS) + && GeneralVariables.connectMode == ConnectMode.NETWORK)) { + hamRecorder.setDataFromLan(); + } else { + if (GeneralVariables.controlMode != ControlMode.CAT || baseRig == null + || !baseRig.supportWaveOverCAT()) { + hamRecorder.setDataFromMic(); + } else { + hamRecorder.setDataFromLan(); + } + } + + mutableIsFlexRadio.postValue(GeneralVariables.instructionSet == InstructionSet.FLEX_NETWORK); + mutableIsXieguRadio.postValue(GeneralVariables.instructionSet == InstructionSet.XIEGU_6100_FT8CNS); + + } + + + /** + * 检察电台是否处于连接状态,两种情况:rigBaseClass没建立,串口没连接成功 + * + * @return 是否连接 + */ + public boolean isRigConnected() { + if (baseRig == null) { + return false; + } else { + return baseRig.isConnected(); + } + } + + /** + * 获取串口设备列表 + */ + public void getUsbDevice() { + serialPorts = + CableSerialPort.listSerialPorts(GeneralVariables.getMainContext()); + mutableSerialPorts.postValue(serialPorts); + } + + + public void startSco() { + AudioManager audioManager = (AudioManager) GeneralVariables.getMainContext() + .getSystemService(Context.AUDIO_SERVICE); + if (audioManager == null) return; + if (!audioManager.isBluetoothScoAvailableOffCall()) { + //蓝牙设备不支持录音 + ToastMessage.show(getStringFromResource(R.string.does_not_support_recording)); + return; + } + audioManager.setBluetoothScoOn(true); + audioManager.startBluetoothSco();//71毫秒 + audioManager.setSpeakerphoneOn(false);//进入耳机模式 + } + + public void stopSco() { + AudioManager audioManager = (AudioManager) GeneralVariables.getMainContext() + .getSystemService(Context.AUDIO_SERVICE); + if (audioManager == null) return; + if (audioManager.isBluetoothScoOn()) { + audioManager.setBluetoothScoOn(false); + audioManager.stopBluetoothSco(); + audioManager.setSpeakerphoneOn(true);//退出耳机模式 + } + + } + + + public void setBlueToothOn() { + AudioManager audioManager = (AudioManager) GeneralVariables.getMainContext() + .getSystemService(Context.AUDIO_SERVICE); + if (audioManager == null) return; + if (!audioManager.isBluetoothScoAvailableOffCall()) { + //蓝牙设备不支持录音 + ToastMessage.show(getStringFromResource(R.string.does_not_support_recording)); + } + + /* + 播放音乐的对应的就是MODE_NORMAL, 如果使用外放播则调用audioManager.setSpeakerphoneOn(true)即可. + 若使用耳机和听筒,则需要先设置模式为MODE_IN_CALL(3.0以前)或MODE_IN_COMMUNICATION(3.0以后). + */ + audioManager.setMode(AudioManager.MODE_NORMAL);//178毫秒 + audioManager.setBluetoothScoOn(true); + audioManager.stopBluetoothSco(); + audioManager.startBluetoothSco();//71毫秒 + audioManager.setSpeakerphoneOn(false);//进入耳机模式 + + //进入到蓝牙耳机模式 + ToastMessage.show(getStringFromResource(R.string.bluetooth_headset_mode)); + + } + + public void setBlueToothOff() { + + AudioManager audioManager = (AudioManager) GeneralVariables.getMainContext() + .getSystemService(Context.AUDIO_SERVICE); + if (audioManager == null) return; + if (audioManager.isBluetoothScoOn()) { + audioManager.setMode(AudioManager.MODE_NORMAL); + audioManager.setBluetoothScoOn(false); + audioManager.stopBluetoothSco(); + audioManager.setSpeakerphoneOn(true);//退出耳机模式 + } + //离开蓝牙耳机模式 + ToastMessage.show(getStringFromResource(R.string.bluetooth_Headset_mode_cancelled)); + + } + + + /** + * 查询蓝牙是否连接 + * + * @return 是否 + */ + @SuppressLint("MissingPermission") + public boolean isBTConnected() { + BluetoothAdapter blueAdapter = BluetoothAdapter.getDefaultAdapter(); + if (blueAdapter == null) return false; + + //蓝牙头戴式耳机,支持语音输入输出 + int headset = blueAdapter.getProfileConnectionState(BluetoothProfile.HEADSET); + int a2dp = blueAdapter.getProfileConnectionState(BluetoothProfile.A2DP); + return headset == BluetoothAdapter.STATE_CONNECTED || a2dp == BluetoothAdapter.STATE_CONNECTED; + } + + private static class GetQTHRunnable implements Runnable { + MainViewModel mainViewModel; + ArrayList messages; + + public GetQTHRunnable(MainViewModel mainViewModel) { + this.mainViewModel = mainViewModel; + } + + + @Override + public void run() { + CallsignDatabase.getMessagesLocation( + GeneralVariables.callsignDatabase.getDb(), messages); + mainViewModel.mutableFt8MessageList.postValue(mainViewModel.ft8Messages); + } + } + + private static class SendWaveDataRunnable implements Runnable { + BaseRig baseRig; + //float[] data; + Ft8Message message; + + @Override + public void run() { + if (baseRig != null && message != null) { + baseRig.sendWaveData(message);//实际生成的数据是12.64+0.04,0.04是生成的0数据 + } + } + } + +} \ No newline at end of file diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/MessageHashMap.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/MessageHashMap.java new file mode 100644 index 00000000..e556f620 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/MessageHashMap.java @@ -0,0 +1,55 @@ +package com.bg7yoz.ft8cn; +/** + * 呼号的哈希码列表。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.util.Log; + +import java.util.HashMap; + +public class MessageHashMap extends HashMap { + private static final String TAG = "MessageHashMap"; + + /** + * 添加呼号和哈希码到列表 + * + * @param hashCode 哈希码 + * @param callsign 呼号 + * @return false说明已经存在了 + */ + public synchronized void addHash(long hashCode, String callsign) { + //if (callsign.length()<2){return;} + //if (){return;} + if (callsign.equals("CQ")||callsign.equals("QRZ")||callsign.equals("DE")){ + return; + } + if (hashCode == 0 || checkHash(hashCode)|| callsign.charAt(0) == '<') { + return; + } + Log.d(TAG, String.format("addHash: callsign:%s ,hash:%x",callsign,hashCode )); + put(hashCode,callsign); + } + + //检查是否存在这个hash码 + public boolean checkHash(long hashCode) { + return get(hashCode)!=null; +// for (HashStruct hash : this) { +// if (hash.hashCode == hashCode) { +// return true; +// } +// } +// return false; + } + + //通过哈希码查呼号 + public synchronized String getCallsign(long[] hashCode) { + for (long l : hashCode) { + if (checkHash(l)) { + return String.format("<%s>", get(l)); + } + } + return "<...>"; + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/bluetooth/BluetoothConstants.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/bluetooth/BluetoothConstants.java new file mode 100644 index 00000000..bfc10bde --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/bluetooth/BluetoothConstants.java @@ -0,0 +1,63 @@ +package com.bg7yoz.ft8cn.bluetooth; + +import android.annotation.SuppressLint; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.os.ParcelUuid; + +import com.bg7yoz.ft8cn.BuildConfig; + +/** + * 与蓝牙有关的常量 + */ + +public class BluetoothConstants { + + // values have to be globally unique + static final String INTENT_ACTION_DISCONNECT = BuildConfig.APPLICATION_ID + ".Disconnect"; + static final String NOTIFICATION_CHANNEL = BuildConfig.APPLICATION_ID + ".Channel"; + static final String INTENT_CLASS_MAIN_ACTIVITY = BuildConfig.APPLICATION_ID + ".MainActivity"; + + // values have to be unique within each app + static final int NOTIFY_MANAGER_START_FOREGROUND_SERVICE = 1001; + + + public static boolean checkBluetoothIsOpen(){ + BluetoothAdapter adapter=BluetoothAdapter.getDefaultAdapter(); + if (adapter==null){ + return false; + }else { + return adapter.isEnabled(); + } + } + + public static boolean checkIsSpp(BluetoothDevice device) { + @SuppressLint("MissingPermission") ParcelUuid[] parcelUuids = device.getUuids(); + + if (parcelUuids != null) { + for (int i = 0; i < parcelUuids.length; i++) {//只保留UUID是串口的 + if (parcelUuids[i].getUuid().toString().toUpperCase().equals("00001101-0000-1000-8000-00805F9B34FB")) { + return true; + } + } + } + return false; + } + + public static boolean checkIsHeadSet(BluetoothDevice device){ + @SuppressLint("MissingPermission") ParcelUuid[] parcelUuids = device.getUuids(); + boolean audioSinkService=false; + boolean handsFreeService=false; + if (parcelUuids != null) { + for (int i = 0; i < parcelUuids.length; i++) {//只保留UUID是串口的 + if (parcelUuids[i].getUuid().toString().toLowerCase().equals("0000111e-0000-1000-8000-00805f9b34fb")) { + handsFreeService=true; + } + if (parcelUuids[i].getUuid().toString().toLowerCase().equals("0000110b-0000-1000-8000-00805f9b34fb")) { + audioSinkService=true; + } + } + } + return audioSinkService&&handsFreeService; + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/bluetooth/BluetoothSerialListener.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/bluetooth/BluetoothSerialListener.java new file mode 100644 index 00000000..55ad4c2c --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/bluetooth/BluetoothSerialListener.java @@ -0,0 +1,13 @@ +package com.bg7yoz.ft8cn.bluetooth; + +/** + * 蓝牙串口的回调接口 + * BG7YOZ + * 2023-03 + */ +public interface BluetoothSerialListener { + void onSerialConnect (); + void onSerialConnectError (Exception e); + void onSerialRead (byte[] data); + void onSerialIoError (Exception e); +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/bluetooth/BluetoothSerialService.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/bluetooth/BluetoothSerialService.java new file mode 100644 index 00000000..6d70f422 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/bluetooth/BluetoothSerialService.java @@ -0,0 +1,213 @@ +package com.bg7yoz.ft8cn.bluetooth; + +import android.app.Service; +import android.content.Intent; +import android.os.Binder; +import android.os.Handler; +import android.os.IBinder; +import android.os.Looper; + +import androidx.annotation.Nullable; + +import java.io.IOException; +import java.util.LinkedList; +import java.util.Queue; + +/** + * 蓝牙串口有关的服务 + * BG7YOZ + * 2023-03 + */ +public class BluetoothSerialService extends Service implements BluetoothSerialListener { + + public class SerialBinder extends Binder { + public BluetoothSerialService getService() { return BluetoothSerialService.this; } + } + + private enum QueueType {Connect, ConnectError, Read, IoError} + + private static class QueueItem { + QueueType type; + byte[] data; + Exception e; + + QueueItem(QueueType type, byte[] data, Exception e) { this.type=type; this.data=data; this.e=e; } + } + + private final Handler mainLooper; + private final IBinder binder; + private final Queue queue1, queue2; + + private BluetoothSerialSocket socket; + private BluetoothSerialListener listener; + private boolean connected; + + /** + * Lifecylce + */ + public BluetoothSerialService() { + mainLooper = new Handler(Looper.getMainLooper()); + binder = new SerialBinder(); + queue1 = new LinkedList<>(); + queue2 = new LinkedList<>(); + } + + @Override + public void onDestroy() { + //cancelNotification(); + disconnect(); + super.onDestroy(); + } + + @Nullable + @Override + public IBinder onBind(Intent intent) { + return binder; + } + + /** + * Api + */ + public void connect(BluetoothSerialSocket socket) throws IOException { + socket.connect(this); + this.socket = socket; + connected = true; + } + + public void disconnect() { + connected = false; // ignore data,errors while disconnecting + //cancelNotification(); + if(socket != null) { + socket.disconnect(); + socket = null; + } + } + + public void write(byte[] data) throws IOException { + if(!connected) + throw new IOException("not connected"); + socket.write(data); + } + + public void attach(BluetoothSerialListener listener) { + if(Looper.getMainLooper().getThread() != Thread.currentThread()) + throw new IllegalArgumentException("not in main thread"); + //cancelNotification(); + // use synchronized() to prevent new items in queue2 + // new items will not be added to queue1 because mainLooper.post and attach() run in main thread + synchronized (this) { + this.listener = listener; + } + for(QueueItem item : queue1) { + switch(item.type) { + case Connect: listener.onSerialConnect (); break; + case ConnectError: listener.onSerialConnectError (item.e); break; + case Read: listener.onSerialRead (item.data); break; + case IoError: listener.onSerialIoError (item.e); break; + } + } + for(QueueItem item : queue2) { + switch(item.type) { + case Connect: listener.onSerialConnect (); break; + case ConnectError: listener.onSerialConnectError (item.e); break; + case Read: listener.onSerialRead (item.data); break; + case IoError: listener.onSerialIoError (item.e); break; + } + } + queue1.clear(); + queue2.clear(); + } + + public void detach() { + if (connected){ + disconnect(); + } + listener = null; + } + + + + /** + * SerialListener + */ + public void onSerialConnect() { + if(connected) { + synchronized (this) { + if (listener != null) { + mainLooper.post(() -> { + if (listener != null) { + listener.onSerialConnect(); + } else { + queue1.add(new QueueItem(QueueType.Connect, null, null)); + } + }); + } else { + queue2.add(new QueueItem(QueueType.Connect, null, null)); + } + } + } + } + + public void onSerialConnectError(Exception e) { + if(connected) { + synchronized (this) { + if (listener != null) { + mainLooper.post(() -> { + if (listener != null) { + listener.onSerialConnectError(e); + } else { + queue1.add(new QueueItem(QueueType.ConnectError, null, e)); + //cancelNotification(); + disconnect(); + } + }); + } else { + queue2.add(new QueueItem(QueueType.ConnectError, null, e)); + //cancelNotification(); + disconnect(); + } + } + } + } + + public void onSerialRead(byte[] data) { + if(connected) { + synchronized (this) { + if (listener != null) { + mainLooper.post(() -> { + if (listener != null) { + listener.onSerialRead(data); + } else { + queue1.add(new QueueItem(QueueType.Read, data, null)); + } + }); + } else { + queue2.add(new QueueItem(QueueType.Read, data, null)); + } + } + } + } + + public void onSerialIoError(Exception e) { + if(connected) { + synchronized (this) { + if (listener != null) { + mainLooper.post(() -> { + if (listener != null) { + listener.onSerialIoError(e); + } else { + queue1.add(new QueueItem(QueueType.IoError, null, e)); + //cancelNotification(); + disconnect(); + } + }); + } else { + queue2.add(new QueueItem(QueueType.IoError, null, e)); + //cancelNotification(); + disconnect(); + } + } + } + } + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/bluetooth/BluetoothSerialSocket.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/bluetooth/BluetoothSerialSocket.java new file mode 100644 index 00000000..626db39b --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/bluetooth/BluetoothSerialSocket.java @@ -0,0 +1,127 @@ +package com.bg7yoz.ft8cn.bluetooth; +/** + * 蓝牙串口的SOCKET + * BG7YOZ + * 2023-03 + */ + +import android.annotation.SuppressLint; +import android.app.Activity; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothSocket; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; + +import java.io.IOException; +import java.security.InvalidParameterException; +import java.util.Arrays; +import java.util.UUID; +import java.util.concurrent.Executors; + +public class BluetoothSerialSocket implements Runnable { + + private static final UUID BLUETOOTH_SPP = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); + + private final BroadcastReceiver disconnectBroadcastReceiver; + + private final Context context; + private BluetoothSerialListener listener; + private final BluetoothDevice device; + private BluetoothSocket socket; + private boolean connected; + + public BluetoothSerialSocket(Context context, BluetoothDevice device) { + if(context instanceof Activity) + throw new InvalidParameterException("expected non UI context"); + this.context = context; + this.device = device; + disconnectBroadcastReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if(listener != null) + listener.onSerialIoError(new IOException("background disconnect")); + disconnect(); // disconnect now, else would be queued until UI re-attached + } + }; + } + + @SuppressLint("MissingPermission") + String getName() { + return device.getName() != null ? device.getName() : device.getAddress(); + } + + /** + * connect-success and most connect-errors are returned asynchronously to listener + */ + void connect(BluetoothSerialListener listener) throws IOException { + this.listener = listener; + context.registerReceiver(disconnectBroadcastReceiver, new IntentFilter(BluetoothConstants.INTENT_ACTION_DISCONNECT)); + Executors.newCachedThreadPool().submit(this); + } + + void disconnect() { + listener = null; // ignore remaining data and errors + // connected = false; // run loop will reset connected + if(socket != null) { + try { + socket.close(); + } catch (Exception ignored) { + } + socket = null; + } + try { + context.unregisterReceiver(disconnectBroadcastReceiver); + } catch (Exception ignored) { + } + } + + void write(byte[] data) throws IOException { + if (!connected) + throw new IOException("not connected"); + socket.getOutputStream().write(data); + } + + @SuppressLint("MissingPermission") + @Override + public void run() { // connect & read + try { + socket = device.createRfcommSocketToServiceRecord(BLUETOOTH_SPP); + socket.connect(); + if(listener != null) + listener.onSerialConnect(); + } catch (Exception e) { + if(listener != null) + listener.onSerialConnectError(e); + try { + socket.close(); + } catch (Exception ignored) { + } + socket = null; + return; + } + connected = true; + try { + byte[] buffer = new byte[1024]; + int len; + //noinspection InfiniteLoopStatement + while (true) { + len = socket.getInputStream().read(buffer); + byte[] data = Arrays.copyOf(buffer, len); + if(listener != null) + listener.onSerialRead(data); + } + } catch (Exception e) { + connected = false; + if (listener != null) + listener.onSerialIoError(e); + try { + socket.close(); + } catch (Exception ignored) { + } + socket = null; + } + } + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/bluetooth/BluetoothStateBroadcastReceive.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/bluetooth/BluetoothStateBroadcastReceive.java new file mode 100644 index 00000000..96187129 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/bluetooth/BluetoothStateBroadcastReceive.java @@ -0,0 +1,109 @@ +package com.bg7yoz.ft8cn.bluetooth; +/** + * 蓝牙状态广播类。连接、断开、变化 + * @writer bg7yoz + * @date 2022-07-22 + */ + +import android.annotation.SuppressLint; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothProfile; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.media.AudioManager; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.MainViewModel; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.ui.ToastMessage; + +public class BluetoothStateBroadcastReceive extends BroadcastReceiver { + private static final String TAG="BluetoothStateBroadcastReceive"; + private Context context; + private MainViewModel mainViewModel; + + public BluetoothStateBroadcastReceive(Context context, MainViewModel mainViewModel) { + this.context = context; + this.mainViewModel = mainViewModel; + } + + @SuppressLint("MissingPermission") + @Override + public void onReceive(Context context, Intent intent) { + this.context=context; + String action = intent.getAction(); + + BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); + BluetoothAdapter blueAdapter = BluetoothAdapter.getDefaultAdapter(); + int headset=-1; + int a2dp=-1; + if (blueAdapter!=null) { + headset = blueAdapter.getProfileConnectionState(BluetoothProfile.HEADSET); + a2dp = blueAdapter.getProfileConnectionState(BluetoothProfile.A2DP); + } + switch (action) { + case BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED: + case BluetoothAdapter.EXTRA_CONNECTION_STATE: + case BluetoothAdapter.EXTRA_STATE: + if(headset == BluetoothProfile.STATE_CONNECTED ||a2dp==BluetoothProfile.STATE_CONNECTED){ + //if(headset == BluetoothProfile.STATE_CONNECTED){ + //if(a2dp==BluetoothProfile.STATE_CONNECTED){ + mainViewModel.setBlueToothOn(); + }else { + mainViewModel.setBlueToothOff(); + } + break; + + case BluetoothDevice.ACTION_ACL_CONNECTED: + if (device!=null) { + ToastMessage.show(String.format( + GeneralVariables.getStringFromResource(R.string.bluetooth_is_connected) + ,device.getName())); + } + break; + + case BluetoothDevice.ACTION_ACL_DISCONNECTED: + if (device!=null) { + ToastMessage.show(String.format( + GeneralVariables.getStringFromResource(R.string.bluetooth_is_diconnected) + ,device.getName())); + } + break; + + case AudioManager.ACTION_AUDIO_BECOMING_NOISY: + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.sound_source_switched)); + break; + + + case BluetoothAdapter.ACTION_STATE_CHANGED: + int blueState = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0); + switch (blueState) { + case BluetoothAdapter.STATE_OFF: + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.bluetooth_turn_off)); + break; + case BluetoothAdapter.STATE_ON: + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.bluetooth_turn_on)); + break; + } + break; + + } + } + +// static final int PROFILE_HEADSET = 0; +// static final int PROFILE_A2DP = 1; +// static final int PROFILE_OPP = 2; +// static final int PROFILE_HID = 3; +// static final int PROFILE_PANU = 4; +// static final int PROFILE_NAP = 5; +// static final int PROFILE_A2DP_SINK = 6; +// +// private boolean checkBluetoothClass(BluetoothClass bluetoothClass,int proFile){ +// if (proFile==PROFILE_A2DP){ +// bluetoothClass.hasService(BluetoothClass.Service.RENDER); +// return true; +// } +// } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/callsign/CallsignDatabase.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/callsign/CallsignDatabase.java new file mode 100644 index 00000000..b5db3a0c --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/callsign/CallsignDatabase.java @@ -0,0 +1,280 @@ +package com.bg7yoz.ft8cn.callsign; +/** + * 用于呼号归属地查询的数据库操作,数据库采用内存方式。来源是CTY.DAT + * @author BG7YOZ + * 2023-03-20 + */ + +import android.annotation.SuppressLint; +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; +import android.os.AsyncTask; +import android.util.Log; + +import androidx.annotation.Nullable; + +import com.bg7yoz.ft8cn.Ft8Message; +import com.bg7yoz.ft8cn.GeneralVariables; +import com.google.android.gms.maps.model.LatLng; + +import java.util.ArrayList; +import java.util.Set; + +public class CallsignDatabase extends SQLiteOpenHelper { + private static final String TAG = "CallsignDatabase"; + @SuppressLint("StaticFieldLeak") + private static CallsignDatabase instance; + private final Context context; + private SQLiteDatabase db; + + public static CallsignDatabase getInstance(@Nullable Context context, @Nullable String databaseName, int version) { + if (instance == null) { + instance = new CallsignDatabase(context, databaseName, null, version); + } + return instance; + } + + + public CallsignDatabase(@Nullable Context context, @Nullable String name + , @Nullable SQLiteDatabase.CursorFactory factory, int version) { + super(context, name, factory, version); + this.context = context; + + //链接数据库,如果实体库不存在,就会调用onCreate方法,在onCreate方法中初始化数据库 + db = this.getWritableDatabase(); + } + + public SQLiteDatabase getDb() { + return db; + } + + /** + * 当实体数据库不存在时,会调用该方法。可在这个地方创建数据,并添加文件 + * + * @param sqLiteDatabase 需要连接的数据库 + */ + @Override + public void onCreate(SQLiteDatabase sqLiteDatabase) { + Log.d(TAG, "Create database."); + db = sqLiteDatabase;//把数据库链接保存下来 + createTables();//创建数据表 + new InitDatabase(context, db).execute();//导入数据 + } + + @Override + public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) { + + } + + + private void createTables() { + try { + db.execSQL("CREATE TABLE countries (\n" + + "id INTEGER NOT NULL PRIMARY KEY,\n" + + "CountryNameEn TEXT,\n" + + "CountryNameCN TEXT,\n" + + "CQZone INTEGER,\n" + + "ITUZone INTEGER,\n" + + "Continent TEXT,\n" + + "Latitude REAL,\n" + + "Longitude REAL,\n" + + "GMT_offset REAL,\n" + + "DXCC TEXT)"); + db.execSQL("CREATE INDEX countries_id_IDX ON countries (id)"); + + db.execSQL("CREATE TABLE callsigns (countryId INTEGER NOT NULL,callsign TEXT)"); + db.execSQL("CREATE INDEX callsigns_callsign_IDX ON callsigns (callsign)"); + + db.execSQL("CREATE INDEX countries_id_IDX_MORE ON countries (id,CountryNameEn,CountryNameCN,CQZone,ITUZone,DXCC)"); + db.execSQL("CREATE INDEX callsigns_countryId_IDX ON callsigns (countryId)"); + } catch (Exception e) { + Log.e(TAG, e.getMessage()); + + } + } + + //查呼号的归属地 + public void getCallsignInformation(String callsign, OnAfterQueryCallsignLocation afterQueryCallsignLocation) { + new QueryCallsignInformation(db, callsign, afterQueryCallsignLocation).execute(); + } + + public CallsignInfo getCallInfo(String callsign) { + return getCallsignInfo(db, callsign); + } + + /** + * 更新消息中的位置及经纬度信息 + * + * @param ft8Messages 消息列表 + */ + public static synchronized void getMessagesLocation(SQLiteDatabase db, ArrayList ft8Messages ) { + if (ft8Messages==null) return; + ArrayList messages = new ArrayList<>(ft8Messages);//防止线程访问冲突 + + for (Ft8Message msg : messages) { + if (msg.i3==0&&msg.n3==0) continue;//如果是自由文本,就不查了 + CallsignInfo fromCallsignInfo = getCallsignInfo(db, + msg.callsignFrom.replace("<","").replace(">","")); + if (fromCallsignInfo != null) { + msg.fromDxcc = !GeneralVariables.getDxccByPrefix(fromCallsignInfo.DXCC); + msg.fromItu = !GeneralVariables.getItuZoneById(fromCallsignInfo.ITUZone); + msg.fromCq = !GeneralVariables.getCqZoneById(fromCallsignInfo.CQZone); + if (GeneralVariables.isChina) { + msg.fromWhere = fromCallsignInfo.CountryNameCN; + } else { + msg.fromWhere = fromCallsignInfo.CountryNameEn; + } + msg.fromLatLng = new LatLng(fromCallsignInfo.Latitude, fromCallsignInfo.Longitude * -1); + } + + if (msg.checkIsCQ() || msg.getCallsignTo().contains("...")) {//CQ就不查了 + continue; + } + + CallsignInfo toCallsignInfo = getCallsignInfo(db, + msg.callsignTo.replace("<","").replace(">","")); + if (toCallsignInfo != null) { + msg.toDxcc = !GeneralVariables.getDxccByPrefix(toCallsignInfo.DXCC); + msg.toItu = !GeneralVariables.getItuZoneById(toCallsignInfo.ITUZone); + msg.toCq = !GeneralVariables.getCqZoneById(toCallsignInfo.CQZone); + + if (GeneralVariables.isChina) { + msg.toWhere = toCallsignInfo.CountryNameCN; + } else { + msg.toWhere = toCallsignInfo.CountryNameEn; + } + msg.toLatLng = new LatLng(toCallsignInfo.Latitude, toCallsignInfo.Longitude*-1); + } + } + } + + @SuppressLint("Range") + private static CallsignInfo getCallsignInfo(SQLiteDatabase db, String callsign) { + CallsignInfo callsignInfo = null; + + String querySQL = "select a.*,b.* from callsigns as a left join countries as b on a.countryId =b.id \n" + + "WHERE (SUBSTR(?,1,LENGTH(callsign))=callsign) OR (callsign=\"=\"||?)\n" + + "order by LENGTH(callsign) desc\n" + + "LIMIT 1"; + + Cursor cursor = db.rawQuery(querySQL, new String[]{callsign.toUpperCase(), callsign.toUpperCase()}); + if (cursor.moveToFirst()) { + callsignInfo = new CallsignInfo(callsign.toUpperCase() + , cursor.getString(cursor.getColumnIndex("CountryNameEn")) + , cursor.getString(cursor.getColumnIndex("CountryNameCN")) + , cursor.getInt(cursor.getColumnIndex("CQZone")) + , cursor.getInt(cursor.getColumnIndex("ITUZone")) + , cursor.getString(cursor.getColumnIndex("Continent")) + , cursor.getFloat(cursor.getColumnIndex("Latitude")) + , cursor.getFloat(cursor.getColumnIndex("Longitude")) + , cursor.getFloat(cursor.getColumnIndex("GMT_offset")) + , cursor.getString(cursor.getColumnIndex("DXCC"))); + } + cursor.close(); + return callsignInfo; + } + + + static class QueryCallsignInformation extends AsyncTask { + private final SQLiteDatabase db; + private final String sqlParameter; + private final OnAfterQueryCallsignLocation afterQueryCallsignLocation; + + public QueryCallsignInformation(SQLiteDatabase db, String sqlParameter, OnAfterQueryCallsignLocation afterQueryCallsignLocation) { + this.db = db; + this.sqlParameter = sqlParameter; + this.afterQueryCallsignLocation = afterQueryCallsignLocation; + } + + @SuppressLint("Range") + @Override + protected Void doInBackground(Void... voids) { +// String querySQL = "select a.*,b.* from callsigns as a left join countries as b on a.countryId =b.id \n" + +// "WHERE (SUBSTR(?,1,LENGTH(callsign))=callsign) OR (callsign=\"=\"||?)\n" + +// "order by LENGTH(callsign) desc\n" + +// "LIMIT 1"; +// +// Cursor cursor = db.rawQuery(querySQL, new String[]{sqlParameter.toUpperCase(), sqlParameter.toUpperCase()}); +// if (cursor.moveToFirst()) { +// CallsignInfo callsignInfo = new CallsignInfo(); +// callsignInfo.CallSign = sqlParameter.toUpperCase(); +// callsignInfo.CountryNameEn = cursor.getString(cursor.getColumnIndex("CountryNameEn")); +// callsignInfo.CountryNameCN = cursor.getString(cursor.getColumnIndex("CountryNameCN")); +// callsignInfo.CQZone = cursor.getInt(cursor.getColumnIndex("CQZone")); +// callsignInfo.ITUZone = cursor.getInt(cursor.getColumnIndex("ITUZone")); +// callsignInfo.Continent = cursor.getString(cursor.getColumnIndex("Continent")); +// callsignInfo.Latitude = cursor.getFloat(cursor.getColumnIndex("Latitude")); +// callsignInfo.Longitude = cursor.getFloat(cursor.getColumnIndex("Longitude")); +// callsignInfo.GMT_offset = cursor.getFloat(cursor.getColumnIndex("GMT_offset")); +// callsignInfo.DXCC = cursor.getString(cursor.getColumnIndex("DXCC")); +// if (afterQueryCallsignLocation!=null){ +// afterQueryCallsignLocation.doOnAfterQueryCallsignLocation(callsignInfo); +// } +// } +// cursor.close(); + CallsignInfo callsignInfo = getCallsignInfo(db, sqlParameter); + if (callsignInfo != null && afterQueryCallsignLocation != null) { + afterQueryCallsignLocation.doOnAfterQueryCallsignLocation(callsignInfo); + } + return null; + } + } + + + static class InitDatabase extends AsyncTask { + @SuppressLint("StaticFieldLeak") + private final Context context; + private final SQLiteDatabase db; + + public InitDatabase(Context context, SQLiteDatabase db) { + this.context = context; + this.db = db; + } + + @Override + protected Void doInBackground(Void... voids) { + Log.d(TAG, "开始导入呼号位置数据..."); + String insertCountriesSQL = "INSERT INTO countries (id,CountryNameEn,CountryNameCN,CQZone" + + ",ITUZone,Continent,Latitude,Longitude,GMT_offset,DXCC)\n" + + "VALUES(?,?,?,?,?,?,?,?,?,?)"; + + ArrayList callsignInfos = + CallsignFileOperation.getCallSingInfoFromFile(context); + ContentValues values = new ContentValues(); + for (int i = 0; i < callsignInfos.size(); i++) { + try { + //把国家和地区数据写进表中,id用于关联呼号 + db.execSQL(insertCountriesSQL, new Object[]{ + i,//id号 + callsignInfos.get(i).CountryNameEn, + callsignInfos.get(i).CountryNameCN, + callsignInfos.get(i).CQZone, + callsignInfos.get(i).ITUZone, + callsignInfos.get(i).Continent, + callsignInfos.get(i).Latitude, + callsignInfos.get(i).Longitude, + callsignInfos.get(i).GMT_offset, + callsignInfos.get(i).DXCC}); + Set calls = CallsignFileOperation.getCallsigns(callsignInfos.get(i).CallSign); + + for (String s : calls + ) { + values.put("countryId", i); + values.put("callsign", s); + db.insert("callsigns", null, values); + values.clear(); + } + + } catch (Exception e) { + Log.e(TAG, "错误:" + e.getMessage()); + } + } + Log.d(TAG, "呼号位置数据导入完毕!"); + return null; + } + } + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/callsign/CallsignFileOperation.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/callsign/CallsignFileOperation.java new file mode 100644 index 00000000..461f2195 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/callsign/CallsignFileOperation.java @@ -0,0 +1,140 @@ +package com.bg7yoz.ft8cn.callsign; +/** + * 预处理呼号数据库的文件操作,呼号的来源是CTY.DAT + * @author BG7YOZ + * @date 2023-03-20 + */ + +import android.content.Context; +import android.content.res.AssetManager; + +import com.bg7yoz.ft8cn.GeneralVariables; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Set; + +public class CallsignFileOperation { + public static String TAG="CallsignFileOperation"; + public static String[][] countries; + + /** + * 从assets目录中的cty.dat中读出呼号分配国家和地区的列表。呼号字符串中包括多个字符串,以逗号分割, + * @param context 用于调用getAssets()方法。 + * @return ArrayList 返回CallsignInfo数组列表 + */ + public static ArrayList getCallSingInfoFromFile(Context context){ + ArrayList callsignInfos=new ArrayList<>(); + + //读出国家和地区的中英文对应翻译表。保存到countries二维数组中。 + countries=getCountryNameToCN(context); + + AssetManager assetManager = context.getAssets(); + try { + InputStream inputStream= assetManager.open("cty.dat"); + String[] st=getLinesFromInputStream(inputStream,";"); + for (int i = 0; i getCallsigns(String s){ + String[] ls=s.replace("\n","").split(","); + Set callsigns=new HashSet<>(); + for (int i = 0; i < ls.length ; i++) { + if (ls[i].contains(")")) { + //Log.d(TAG,ls[i]); + ls[i] = ls[i].substring(0, ls[i].indexOf("(")); + //Log.d(TAG,ls[i]+" ((("); + } + if (ls[i].contains("[")) { + //Log.d(TAG,ls[i]); + ls[i] = ls[i].substring(0, ls[i].indexOf("[")); + //Log.d(TAG,ls[i]+" 【【【"); + } + callsigns.add(ls[i].trim()); + } + + return callsigns; + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/callsign/CallsignInfo.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/callsign/CallsignInfo.java new file mode 100644 index 00000000..bd5dce8b --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/callsign/CallsignInfo.java @@ -0,0 +1,79 @@ +package com.bg7yoz.ft8cn.callsign; +/** + * 呼号信息类,用于归属地查询 + * + * @author BG7YOZ + * @date 2023-03-20 + */ + +import android.annotation.SuppressLint; +import android.util.Log; + +import androidx.annotation.NonNull; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; + +public class CallsignInfo { + public static String TAG="CallsignInfo"; + public String CallSign;//呼号 + public String CountryNameEn;//国家 + public String CountryNameCN;//国家中文名 + public int CQZone;//CQ分区 + public int ITUZone;//ITU分区 + public String Continent;//大陆缩写 + public float Latitude;//以度为单位的纬度,+ 表示北 + public float Longitude;//以度为单位的经度,+ 表示西 + public float GMT_offset;//与 GMT 的本地时间偏移 + public String DXCC;//DXCC前缀 + + @SuppressLint("DefaultLocale") + @NonNull + @Override + public String toString() { + String country; + if (GeneralVariables.isChina) { + country=CountryNameCN; + }else { + country=CountryNameEn; + } + //return String.format("呼号:%s\n位置:%s\nCQ分区:%d\nITU分区:%d\n大陆:%s\n经纬度:%.2f,%.2f\n时区:%.0f\nDXCC前缀:%s" + return String.format(GeneralVariables.getStringFromResource(R.string.callsign_info) + , CallSign, country, CQZone, ITUZone, Continent, Longitude, Latitude, GMT_offset, DXCC); + } + + + public CallsignInfo(String callSign, String countryNameEn, + String countryNameCN, int CQZone, int ITUZone, + String continent, float latitude, float longitude, + float GMT_offset, String DXCC) { + CallSign = callSign; + CountryNameEn = countryNameEn; + CountryNameCN = countryNameCN; + this.CQZone = CQZone; + this.ITUZone = ITUZone; + Continent = continent; + Latitude = latitude; + Longitude = longitude; + this.GMT_offset = GMT_offset; + this.DXCC = DXCC; + } + + public CallsignInfo(String s) { + String[] info = s.split(":"); + if (info.length<9){ + Log.e(TAG,"呼号数据格式错误!"+s); + return; + } + CountryNameEn = info[0].replace("\n", "").trim(); + CQZone = Integer.parseInt(info[1].replace("\n", "").replace(" ", "")); + ITUZone = Integer.parseInt(info[2].replace("\n", "").replace(" ", "")); + Continent = info[3].replace("\n", "").replace(" ", ""); + Latitude = Float.parseFloat(info[4].replace("\n", "").replace(" ", "")); + Longitude = Float.parseFloat(info[5].replace("\n", "").replace(" ", "")); + GMT_offset = Float.parseFloat(info[6].replace("\n", "").replace(" ", "")); + DXCC = info[7].replace("\n", "").replace(" ", ""); + CallSign= info[8].replace("\n", "").replace(" ", ""); + } +} + diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/callsign/OnAfterQueryCallsignLocation.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/callsign/OnAfterQueryCallsignLocation.java new file mode 100644 index 00000000..1693ff4f --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/callsign/OnAfterQueryCallsignLocation.java @@ -0,0 +1,12 @@ +package com.bg7yoz.ft8cn.callsign; + +/** + * 用于查询呼号归属地的回调接口,因为数据库操作采用异步方式 + * + * @author BG7YOZ + * @date 2023-03-20 + * + */ +public interface OnAfterQueryCallsignLocation { + void doOnAfterQueryCallsignLocation(CallsignInfo callsignInfo); +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/connector/BaseRigConnector.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/connector/BaseRigConnector.java new file mode 100644 index 00000000..7249fea6 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/connector/BaseRigConnector.java @@ -0,0 +1,155 @@ +package com.bg7yoz.ft8cn.connector; +/** + * 用于连接电台的基础类,蓝牙、USB线、FLEX网络、ICOM网络都是继承于此 + * + * @author BG7YOZ + * @date 2023-03-20 + */ + +import com.bg7yoz.ft8cn.rigs.OnConnectReceiveData; +import com.bg7yoz.ft8cn.rigs.OnRigStateChanged; + + +public class BaseRigConnector { + private boolean connected;//是否处于连接状态 + private OnConnectReceiveData onConnectReceiveData;//当接收到数据后的动作 + private int controlMode;//控制模式 + private OnRigStateChanged onRigStateChanged; + private final OnConnectorStateChanged onConnectorStateChanged=new OnConnectorStateChanged() { + @Override + public void onDisconnected() { + if (onRigStateChanged!=null){ + onRigStateChanged.onDisconnected(); + } + connected=false; + } + + @Override + public void onConnected() { + if (onRigStateChanged!=null){ + onRigStateChanged.onConnected(); + } + connected=true; + } + + @Override + public void onRunError(String message) { + if (onRigStateChanged!=null){ + onRigStateChanged.onRunError(message); + } + connected=false; + } + }; + public BaseRigConnector(int controlMode) { + this.controlMode=controlMode; + } + + /** + * 发送数据 + * @param data 数据 + */ + public synchronized void sendData(byte[] data){}; + + /** + * 设置PTT状态,ON OFF,如果是RTS和DTR,这个是在有线方式才有的,在CableConnector中会重载此方法 + * @param on 是否ON + */ + public void setPttOn(boolean on){}; + + /** + * 使用发送数据的方式设置PTT状态 + * @param command 指令数据 + */ + public void setPttOn(byte[] command){}; + + public void setControlMode(int mode){ + controlMode=mode; + } + + public int getControlMode() { + return controlMode; + } + + public void setOnConnectReceiveData(OnConnectReceiveData receiveData){ + onConnectReceiveData=receiveData; + } + + + /** + * 2023-08-16 由DS1UFX提交修改(基于0.9版),用于(tr)uSDX audio over cat的支持。 + * 发送音频数据流,把16位int格式转为32位float格式 + * @param data byte格式,实际上是16位的int + */ + public void sendWaveData(byte[] data){ + float[] waveFloat=new float[data.length/2]; + for (int i = 0; i 0) { + //Log.d(TAG, "onSerialRead: " + BaseRig.byteToStr(data)); + if (getOnConnectReceiveData()!=null){ + getOnConnectReceiveData().onData(data); + } + } + } + + @Override + public void onSerialIoError(Exception e) { + Log.e(TAG, "onSerialIoError: " + e.getMessage()); + getOnConnectorStateChanged().onRunError(e.getMessage()); + socketDisconnect(); + } + + public void socketDisconnect() { + connected = Connected.False; + getOnConnectorStateChanged().onDisconnected(); + service.disconnect(); + } + + /* + * Serial + UI + */ + public void socketConnect() { + try { + ToastMessage.show(String.format( + GeneralVariables.getStringFromResource(R.string.connect_bluetooth_spp) + ,deviceAddress)); + BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); + BluetoothDevice device = bluetoothAdapter.getRemoteDevice(deviceAddress); + Log.d(TAG, "connecting..."); + connected = Connected.Pending; + BluetoothSerialSocket socket = new BluetoothSerialSocket(context, device); + service.connect(socket); + } catch (Exception e) { + onSerialConnectError(e); + } + } + + public void sendCommand(byte[] data) { + //Log.d(TAG, "sendCommand: "+BaseRig.byteToStr(data) ); + if (connected != Connected.True) { + Log.e(TAG, "sendCommand: 蓝牙没连接"); + socketConnect(); + return; + } + + try { + service.write(data); + } catch (IOException e) { + getOnConnectorStateChanged().onRunError(e.getMessage()); + } + } + + @Override + public synchronized void sendData(byte[] data) { + sendCommand(data); + } + + @Override + public void setPttOn(byte[] command) { + sendData(command);//以CAT指令发送PTT + } + + @Override + public void connect() { + super.connect(); + socketConnect(); + } + @Override + public void disconnect() { + super.disconnect(); + socketDisconnect(); + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/connector/CableConnector.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/connector/CableConnector.java new file mode 100644 index 00000000..c0ac18e6 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/connector/CableConnector.java @@ -0,0 +1,118 @@ +package com.bg7yoz.ft8cn.connector; + +import android.content.Context; +import android.util.Log; + +import com.bg7yoz.ft8cn.database.ControlMode; +import com.bg7yoz.ft8cn.rigs.BaseRig; +import com.bg7yoz.ft8cn.serialport.util.SerialInputOutputManager; + +/** + * 有线连接方式的Connector,这里是指USB方式的,继承于BaseRigConnector + * + * @author BG7YOZ + * @date 2023-03-20 + */ +public class CableConnector extends BaseRigConnector { + private static final String TAG = "CableConnector"; + + //2023-08-16 由DS1UFX提交修改(基于0.9版),用于(tr)uSDX audio over cat的支持。 + public interface OnCableDataReceived { + void OnWaveReceived(int bufferLen, float[] buffer); + } + + private final CableSerialPort cableSerialPort; + + private final BaseRig cableConnectedRig; + private OnCableDataReceived onCableDataReceived; + + public CableConnector(Context context, CableSerialPort.SerialPort serialPort, int baudRate + //, int controlMode) { + , int controlMode, BaseRig cableConnectedRig) { + super(controlMode); + this.cableConnectedRig = cableConnectedRig; + cableSerialPort = new CableSerialPort(context, serialPort, baudRate, getOnConnectorStateChanged()); + cableSerialPort.ioListener = new SerialInputOutputManager.Listener() { + @Override + public void onNewData(byte[] data) { + if (getOnConnectReceiveData() != null) { + getOnConnectReceiveData().onData(data); + } + } + + @Override + public void onRunError(Exception e) { + Log.e(TAG, "CableConnector error: " + e.getMessage()); + getOnConnectorStateChanged().onRunError("与串口失去连接:" + e.getMessage()); + } + }; + //connect(); + } + + @Override + public synchronized void sendData(byte[] data) { + cableSerialPort.sendData(data); + } + + + @Override + public void setPttOn(boolean on) { + //只处理RTS和DTR + switch (getControlMode()) { + case ControlMode.DTR: + cableSerialPort.setDTR_On(on);//打开和关闭DTR + break; + case ControlMode.RTS: + cableSerialPort.setRTS_On(on);//打开和关闭RTS + break; + } + } + + @Override + public void setPttOn(byte[] command) { + cableSerialPort.sendData(command);//以CAT指令发送PTT + } + + + //以下是(tr)uSDX与wave有关的代码,是2023-08-16 由DS1UFX提交修改(基于0.9版),用于(tr)uSDX audio over cat的支持。 + @Override + public void sendWaveData(byte[] data) { + sendData(data); + } + +// @Override +// public void sendWaveData(float[] data) { +// // TODO float to byte +// byte[] wave = new byte[data.length * 4]; +// +// sendWaveData(wave); +// } + + @Override + public void receiveWaveData(float[] data) { + Log.i(TAG, "received wave data"); + + if (onCableDataReceived != null) { + Log.i(TAG, "call onCableDataReceived.OnWaveReceived"); + onCableDataReceived.OnWaveReceived(data.length, data); + } + } + + public void setOnCableDataReceived(OnCableDataReceived onCableDataReceived) { + this.onCableDataReceived = onCableDataReceived; + } + + + @Override + public void connect() { + super.connect(); + cableSerialPort.connect(); + } + + @Override + public void disconnect() { + cableConnectedRig.onDisconnecting(); + super.disconnect(); + cableSerialPort.disconnect(); + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/connector/CableSerialPort.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/connector/CableSerialPort.java new file mode 100644 index 00000000..595d7577 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/connector/CableSerialPort.java @@ -0,0 +1,383 @@ +package com.bg7yoz.ft8cn.connector; +/** + * 用于USB串口操作的类。USB串口驱动在serialport目录中,主要是CDC、CH34x、CP21xx、FTDI等。 + * + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.annotation.SuppressLint; +import android.app.Activity; +import android.app.PendingIntent; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.hardware.usb.UsbDevice; +import android.hardware.usb.UsbDeviceConnection; +import android.hardware.usb.UsbManager; +import android.os.Build; +import android.util.Log; + +import com.bg7yoz.ft8cn.BuildConfig; +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.serialport.CdcAcmSerialDriver; +import com.bg7yoz.ft8cn.serialport.UsbSerialDriver; +import com.bg7yoz.ft8cn.serialport.UsbSerialPort; +import com.bg7yoz.ft8cn.serialport.UsbSerialProber; +import com.bg7yoz.ft8cn.serialport.util.SerialInputOutputManager; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.EnumSet; + + +public class CableSerialPort { + private static final String TAG = "CableSerialPort"; + private OnConnectorStateChanged onStateChanged; + public static final int SEND_TIMEOUT = 2000; + + private static final String INTENT_ACTION_GRANT_USB = BuildConfig.APPLICATION_ID; + + public enum UsbPermission {Unknown, Requested, Granted, Denied} + + private UsbPermission usbPermission = UsbPermission.Unknown; + + private BroadcastReceiver broadcastReceiver; + private final Context context; + + private int vendorId = 0x0c26;//设备号 + private int portNum = 0;//端口号 + private int baudRate = 19200;//波特率 + + private UsbSerialPort usbSerialPort; + private SerialInputOutputManager usbIoManager; + public SerialInputOutputManager.Listener ioListener = null; + + private UsbManager usbManager; + private UsbDeviceConnection usbConnection; + private UsbSerialDriver driver; + + + private boolean connected = false;//是否处于连接状态 + + public CableSerialPort(Context mContext, SerialPort serialPort, int baud, OnConnectorStateChanged connectorStateChanged) { + vendorId = serialPort.vendorId; + portNum = serialPort.portNum; + baudRate = baud; + context = mContext; + this.onStateChanged=connectorStateChanged; + doBroadcast(); + } + + public CableSerialPort(Context mContext) { + context = mContext; + doBroadcast(); + } + + private void doBroadcast() { + broadcastReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (INTENT_ACTION_GRANT_USB.equals(intent.getAction())) { + usbPermission = intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false) + ? UsbPermission.Granted : UsbPermission.Denied; + connect(); + } + } + }; + } + + private boolean prepare() { + registerRigSerialPort(context); + UsbDevice device = null; + usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE); + + //此处把connection设成Null,这样在后面来通过是否null判断是否有权限。 + usbConnection = null; + //此处是不是做个权限判断? + if (usbManager == null) { + return false; + } + + + for (UsbDevice v : usbManager.getDeviceList().values()) { + if (v.getVendorId() == vendorId) { + device = v; + } + } + if (device == null) { + Log.e(TAG, String.format("串口设备打开失败: 没有找到设备0x%04x", vendorId)); + return false; + } + driver = UsbSerialProber.getDefaultProber().probeDevice(device); + if (driver == null) { + //试着把未知的设备加入到cdc驱动上 + driver = new CdcAcmSerialDriver(device); + } + if (driver.getPorts().size() < portNum) { + Log.e(TAG, "串口号不存在,无法打开。"); + return false; + } + Log.d(TAG, "connect: port size:" + String.valueOf(driver.getPorts().size())); + usbSerialPort = driver.getPorts().get(portNum); + usbConnection = usbManager.openDevice(driver.getDevice()); + + return true; + + } + + //@RequiresApi(api = Build.VERSION_CODES.S) + public boolean connect() { + connected = false; + if (!prepare()) { + //return false; + } + if (driver == null) { + if (onStateChanged!=null){ + onStateChanged.onRunError(GeneralVariables.getStringFromResource(R.string.serial_no_driver)); + } + return false; + } + if (usbConnection == null && usbPermission == UsbPermission.Unknown + && !usbManager.hasPermission(driver.getDevice())) { + usbPermission = UsbPermission.Requested; + + PendingIntent usbPermissionIntent; + + //在android12 开始,增加了PendingIntent.FLAG_MUTABLE保护机制,所以要做版本判断 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + usbPermissionIntent = PendingIntent.getBroadcast(context, 0 + , new Intent(INTENT_ACTION_GRANT_USB), PendingIntent.FLAG_MUTABLE); + } else { + usbPermissionIntent = PendingIntent.getBroadcast(context, 0 + , new Intent(INTENT_ACTION_GRANT_USB), 0); + } + + + //PendingIntent usbPermissionIntent = PendingIntent.getBroadcast(context, 0 + // , new Intent(INTENT_ACTION_GRANT_USB), PendingIntent.FLAG_MUTABLE); + // , new Intent(INTENT_ACTION_GRANT_USB), 0); + + + usbManager.requestPermission(driver.getDevice(), usbPermissionIntent); + prepare(); + } + if (usbConnection == null) { + if (onStateChanged!=null){ + onStateChanged.onRunError(GeneralVariables.getStringFromResource(R.string.serial_connect_no_access)); + } + + return false; + } + try { + usbSerialPort.open(usbConnection); + //波特率、停止位 + //usbSerialPort.setParameters(baudRate, 8, 1, UsbSerialPort.PARITY_NONE); + Log.d(TAG,String.format("serial:baud rate:%d,data bits:%d,stop bits:%d,parity bit:%d" + ,baudRate,GeneralVariables.serialDataBits + ,GeneralVariables.serialStopBits + ,GeneralVariables.serialParity)); + usbSerialPort.setParameters(baudRate, GeneralVariables.serialDataBits + , GeneralVariables.serialStopBits, GeneralVariables.serialParity); + usbIoManager = new SerialInputOutputManager(usbSerialPort, new SerialInputOutputManager.Listener() { + @Override + public void onNewData(byte[] data) { + if (ioListener != null) { + ioListener.onNewData(data); + } + } + + @Override + public void onRunError(Exception e) { + if (ioListener != null) { + ioListener.onRunError(e); + } + disconnect(); + } + }); + usbIoManager.start(); + Log.d(TAG, "串口打开成功!"); + connected = true; + + if (onStateChanged!=null){ + onStateChanged.onConnected(); + } + + + } catch (Exception e) { + Log.e(TAG, "串口打开失败: " + e.getMessage()); + if (onStateChanged!=null){ + onStateChanged.onRunError(GeneralVariables.getStringFromResource(R.string.serial_connect_failed) + + e.getMessage()); + } + disconnect(); + return false; + } + return true; + } + + public boolean sendData(final byte[] src) { + if (usbSerialPort != null) { + try { + usbSerialPort.write(src, SEND_TIMEOUT); + } catch (IOException e) { + e.printStackTrace(); + Log.e(TAG, "发送数据出错:" + e.getMessage()); + return false; + } + return true; + } else { + Log.e(TAG, "无法发送数据,串口没有打开。"); + return false; + } + + } + + public void disconnect() { + connected = false; + if (onStateChanged!=null){ + onStateChanged.onDisconnected(); + } + if (usbIoManager != null) { + usbIoManager.setListener(null); + usbIoManager.stop(); + } + usbIoManager = null; + try { + if (usbSerialPort != null) { + usbSerialPort.close(); + } + } catch (IOException ignored) { + } + usbSerialPort = null; + } + + public void registerRigSerialPort(Context context) { + Log.d(TAG, "registerRigSerialPort: registered!"); + context.registerReceiver(broadcastReceiver, new IntentFilter(INTENT_ACTION_GRANT_USB)); + } + + public void unregisterRigSerialPort(Activity activity) { + Log.d(TAG, "unregisterRigSerialPort: unregistered!"); + activity.unregisterReceiver(broadcastReceiver); + } + + + /** + * 打开和关闭RTS + * + * @param rts_on true:打开,false:关闭 + */ + public void setRTS_On(boolean rts_on) { + try { + EnumSet controlLines = usbSerialPort.getSupportedControlLines(); + if (controlLines.contains(UsbSerialPort.ControlLine.RTS)) { + usbSerialPort.setRTS(rts_on); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void setDTR_On(boolean dtr_on) { + try { + EnumSet controlLines = usbSerialPort.getSupportedControlLines(); + if (controlLines.contains(UsbSerialPort.ControlLine.DTR)) { + usbSerialPort.setDTR(dtr_on); + } + } catch (IOException e) { + e.printStackTrace(); + Log.d(TAG, "setDTR_On: " + e.getMessage()); + } + } + + public OnConnectorStateChanged getOnStateChanged() { + return onStateChanged; + } + + public void setOnStateChanged(OnConnectorStateChanged onStateChanged) { + this.onStateChanged = onStateChanged; + } + + public int getVendorId() { + return vendorId; + } + + public void setVendorId(int deviceId) { + this.vendorId = deviceId; + } + + public int getPortNum() { + return portNum; + } + + public void setPortNum(int portNum) { + this.portNum = portNum; + } + + public int getBaudRate() { + return baudRate; + } + + public void setBaudRate(int baudRate) { + this.baudRate = baudRate; + } + + /** + * 获取本机可用的串口设备串列表 + * + * @param context context + * @return 串口设备列表 + */ + public static ArrayList listSerialPorts(Context context) { + ArrayList serialPorts = new ArrayList<>(); + UsbManager usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE); + + for (UsbDevice device : usbManager.getDeviceList().values()) { + UsbSerialDriver driver = UsbSerialProber.getDefaultProber().probeDevice(device); + if (driver == null) { + continue; + //试着把未知的设备加入到cdc驱动上 + //driver = new CdcAcmSerialDriver(device); + } + for (int i = 0; i < driver.getPorts().size(); i++) { + serialPorts.add(new SerialPort(device.getDeviceId(), device.getVendorId() + , device.getProductId(), i)); + } + } + return serialPorts; + } + + public boolean isConnected() { + return connected; + } + + + public static class SerialPort { + public int deviceId = 0; + public int vendorId = 0x0c26;//厂商号 + public int productId = 0;//设备号 + public int portNum = 0;//端口号 + + public SerialPort(int deviceId, int vendorId, int productId, int portNum) { + this.deviceId = deviceId; + this.vendorId = vendorId; + this.productId = productId; + this.portNum = portNum; + } + + @SuppressLint("DefaultLocale") + @Override + public String toString() { + return String.format("SerialPort:deviceId=0x%04X, vendorId=0x%04X, portNum=%d" + , deviceId, vendorId, portNum); + } + + @SuppressLint("DefaultLocale") + public String information() { + return String.format("\\0x%04X\\0x%04X\\0x%04X\\0x%d", deviceId, vendorId, productId, portNum); + } + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/connector/ConnectMode.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/connector/ConnectMode.java new file mode 100644 index 00000000..4a43f33f --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/connector/ConnectMode.java @@ -0,0 +1,24 @@ +package com.bg7yoz.ft8cn.connector; + +/** + * 连接的模式 + * @author BGY70Z + * @date 2023-03-20 + */ +public class ConnectMode { + public static final int USB_CABLE=0; + public static final int BLUE_TOOTH=1; + public static final int NETWORK=2; + public static String getModeStr(int mode){ + switch (mode){ + case USB_CABLE: + return "USB Cable"; + case BLUE_TOOTH: + return "Bluetooth"; + case NETWORK: + return "Network"; + default: + return "-"; + } + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/connector/FlexConnector.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/connector/FlexConnector.java new file mode 100644 index 00000000..6876b81a --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/connector/FlexConnector.java @@ -0,0 +1,329 @@ +package com.bg7yoz.ft8cn.connector; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.util.Log; + +import androidx.lifecycle.MutableLiveData; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.flex.FlexCommand; +import com.bg7yoz.ft8cn.flex.FlexMeterInfos; +import com.bg7yoz.ft8cn.flex.FlexMeterList; +import com.bg7yoz.ft8cn.flex.FlexRadio; +import com.bg7yoz.ft8cn.flex.RadioTcpClient; +import com.bg7yoz.ft8cn.flex.VITA; +import com.bg7yoz.ft8cn.ui.ToastMessage; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; + +/** + * flex网络连接方式的Connector + * @author BGY70Z + * @date 2023-03-20 + */ +public class FlexConnector extends BaseRigConnector { + public MutableLiveData mutableMeterList=new MutableLiveData<>(); + public FlexMeterInfos flexMeterInfos =new FlexMeterInfos(""); + public FlexMeterList meterList=new FlexMeterList(); + public interface OnWaveDataReceived{ + void OnDataReceived(int bufferLen,float[] buffer); + } + public int maxRfPower; + public int maxTunePower; + + private static final String TAG = "FlexConnector"; + + private FlexRadio flexRadio; + + private OnWaveDataReceived onWaveDataReceived; + + + public FlexConnector(Context context, FlexRadio flexRadio, int controlMode) { + super(controlMode); + this.flexRadio = flexRadio; + maxTunePower=GeneralVariables.flexMaxTunePower; + maxRfPower=GeneralVariables.flexMaxRfPower; + setFlexRadioInterface(); + //connect(); + } + + public static int[] byteDataTo16BitData(byte[] buffer){ + int[] data=new int[buffer.length /2]; + for (int i = 0; i < buffer.length/2; i++) { + int res = (buffer[i*2+1] & 0x000000FF) | (((int) buffer[i*2]) << 8); + data[i]=res; + } + return data; + } + + + private void setFlexRadioInterface() { + flexRadio.setOnReceiveStreamData(new FlexRadio.OnReceiveStreamData() { + @Override + public void onReceiveAudio(byte[] data) { + if (onWaveDataReceived!=null){ + float[] buffer=getMonoFloatFromBytes(data);//把24000转成12000,立体声转成单声道 + onWaveDataReceived.OnDataReceived(buffer.length,buffer); + } + } + + @Override + public void onReceiveIQ(byte[] data) { + + } + + @Override + public void onReceiveFFT(VITA vita) { + //if (vita.streamId==0x40000000) { + // mutableVita.postValue(vita.showHeadStr() + "\n" + vita.showPayloadHex()); + //} + } + + @Override + public void onReceiveMeter(VITA vita) { + //Log.e(TAG, "onReceiveMeter: "+vita.showPayloadHex() ); + meterList.setMeters(vita.payload,flexMeterInfos); + + mutableMeterList.postValue(meterList); + + } + + @Override + public void onReceiveUnKnow(byte[] data) { + + } + }); + + + //当有命令返回值时的事件 + flexRadio.setOnCommandListener(new FlexRadio.OnCommandListener() { + @Override + public void onResponse(FlexRadio.FlexResponse response) { + if (response.resultValue!=0) {//只显示失败的命令 + //ToastMessage.show(response.resultStatus()); + //Log.e(TAG, "onResponse: "+response.resultStatus()); + } + + Log.d(TAG, "onResponse: command:"+response.flexCommand.toString()); + //Log.e(TAG, "onResponse: "+response.resultStatus()); + Log.e(TAG, "onResponse: "+response.rawData ); + + if (response.flexCommand== FlexCommand.METER_LIST){ + //FlexMeters flexMeters=new FlexMeters(response.exContent); + flexMeterInfos.setMeterInfos(response.exContent); + flexRadio.commandSubMeterAll();//订阅全部仪表消息 + //flexMeters.getAllMeters(); + //Log.e(TAG, "onResponse: ----->>>"+flexMeters.getAllMeters() ); + } + if (response.flexCommand==FlexCommand.STREAM_CREATE_DAX_TX){ + flexRadio.streamTxId=response.daxTxStreamId; + } + +// if (response.flexCommand== FlexCommand.METER_LIST){ +// Log.e(TAG, "onResponse: ."+response.rawData.replace("#","\n") ); +// } + } + }); + + //当有状态信息接收到时 + flexRadio.setOnStatusListener(new FlexRadio.OnStatusListener() { + @Override + public void onStatus(FlexRadio.FlexResponse response) { + //显示状态消息 + //ToastMessage.show(response.content); + Log.e(TAG, "onStatus: "+response.rawData ); + } + }); + + + + flexRadio.setOnTcpConnectStatus(new FlexRadio.OnTcpConnectStatus() { + @SuppressLint("DefaultLocale") + @Override + public void onConnectSuccess(RadioTcpClient tcpClient) { + ToastMessage.show(String.format(GeneralVariables.getStringFromResource(R.string.init_flex_operation) + ,flexRadio.getModel())); + + flexRadio.commandClientDisconnect();//断开之前的全部连接 + flexRadio.commandClientGui();//创建GUI + + flexRadio.commandSubDaxAll();//注册全部DAX流 + + + + flexRadio.commandClientSetEnforceNetWorkGui();//对网络MTU做设置 + + //flexRadio.commandSliceList();//列slice + flexRadio.commandSliceCreate();//创建slice + + + + + + //todo 防止流的端口没有释放,把端口变换一下? + //FlexRadio.streamPort++; + + flexRadio.commandUdpPort();//设置UDP端口 + + + flexRadio.commandStreamCreateDaxRx(1);//创建流数据到DAX通道1 + flexRadio.commandStreamCreateDaxTx(1);//创建流数据到DAX通道1 + + flexRadio.commandSetDaxAudio(1, 0, true);//打开DAX + + //TODO 是否设置??? dax tx T 或者 dax tx 1 + flexRadio.commandSliceTune(0,String.format("%.3f",GeneralVariables.band/1000000f)); + flexRadio.commandSliceSetMode(0, FlexRadio.FlexMode.DIGU);//设置操作模式 + flexRadio.commandSetFilter(0, 0, 3000);//设置滤波为3000HZ + + + flexRadio.commandMeterList();//列一下仪表 + //flexRadio.commandSubMeterAll();//此处订阅指令放到了接收响应部分 + + setMaxRfPower(maxRfPower);//设置发射功率 + setMaxTunePower(maxTunePower);//设置调谐功率 + + //flexRadio.commandSubMeterById(5);//列指定的仪表 + + //flexRadio.commandSliceSetNR(0, true); + //flexRadio.commandSliceSetNB(0, true); + + //flexRadio.commandDisplayPan(10, 10); + //flexRadio.commandSetFilter(0,0,3000); + // flexRadio.sendCommand(FlexCommand.FILT_SET, "filt 0 0 3000"); + //flexRadio.commandMeterCreateAmp(); + //flexRadio.commandMeterList(); + + + //flexRadio.sendCommand(FlexCommand.INFO, "info"); + //flexRadio.commandGetInfo(); + //flexRadio.commandSliceGetError(0); + + //flexRadio.sendCommand(FlexCommand.SLICE_GET_ERROR, "slice get_error 0"); + //flexRadio.sendCommand(FlexCommand.REMOTE_RADIO_RX_ON, "remote_audio rx_on on"); + // + //flexRadio.sendCommand("c1|client gui\n"); + //playData(); + + + } + + @Override + public void onConnectFail(RadioTcpClient tcpClient) { + ToastMessage.show(String.format(GeneralVariables.getStringFromResource + (R.string.flex_connect_failed),flexRadio.getModel())); + } + }); + + } + public void setMaxRfPower(int power){ + maxRfPower=power; + GeneralVariables.flexMaxRfPower=power; + flexRadio.commandSetRfPower(maxRfPower);//设置发射功率 + + } + public void setMaxTunePower(int power){ + maxTunePower=power; + GeneralVariables.flexMaxTunePower=power; + flexRadio.commandSetTunePower(maxTunePower);//设置调谐功率 + + } + public void startATU(){ + flexRadio.commandStartATU(); + } + public void tuneOnOff(boolean on){ + flexRadio.commandTuneTransmitOnOff(on); + } + public void subAllMeters(){ + if (flexMeterInfos.size()==0) { + //todo commandMeterList()是否可以不使用? + flexRadio.commandMeterList();//列一下仪表 + flexRadio.commandSubMeterAll();//显示全部仪表消息 + } + } + + @Override + public void sendData(byte[] data) { + flexRadio.sendData(data); + } + + + @Override + public void setPttOn(boolean on) { + flexRadio.isPttOn=on; + flexRadio.commandPTTOnOff(on); + } + + @Override + public void setPttOn(byte[] command) { + //cableSerialPort.sendData(command);//以CAT指令发送PTT + } + + @Override + public void sendWaveData(float[] data) { + //Log.e(TAG, "sendWaveData: flexConnector:"+data.length ); + flexRadio.sendWaveData(data); + } + + @Override + public void connect() { + super.connect(); + flexRadio.openAudio(); + flexRadio.connect(); + flexRadio.openStreamPort(); + } + + @Override + public void disconnect() { + super.disconnect(); + flexRadio.closeAudio(); + flexRadio.closeStreamPort(); + flexRadio.disConnect(); + } + + public OnWaveDataReceived getOnWaveDataReceived() { + return onWaveDataReceived; + } + + public void setOnWaveDataReceived(OnWaveDataReceived onWaveDataReceived) { + this.onWaveDataReceived = onWaveDataReceived; + } + + /** + * 获取单声道的数据,24000hz采样率改为12000采样率,把立体声改为单声道 + * @param bytes 原始声音数据 + * @return 单声道数据 + */ + public static float[] getMonoFloatFromBytes(byte[] bytes) { + float[] floats = new float[bytes.length / 16]; + DataInputStream dis = new DataInputStream(new ByteArrayInputStream(bytes)); + for (int i = 0; i < floats.length; i++) { + try { + float f1,f2; + f1=dis.readFloat(); + dis.readFloat();//放弃一个声道 + f2=dis.readFloat(); + floats[i] = Math.max(f1,f2);//取最大值 + dis.readFloat();//放弃1个声道 + } catch (IOException e) { + e.printStackTrace(); + break; + } + } + try { + dis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + return floats; + } + + @Override + public boolean isConnected() { + return flexRadio.isConnect(); + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/connector/IComWifiConnector.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/connector/IComWifiConnector.java new file mode 100644 index 00000000..205a37d4 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/connector/IComWifiConnector.java @@ -0,0 +1,44 @@ +package com.bg7yoz.ft8cn.connector; +/** + * ICom网络方式的连接器。 + * 注:ICom网络方式的音频数据包是Int类型,需要转换成Float类型 + * + * @author BGY70Z + * @date 2023-08-19 + */ + + +import com.bg7yoz.ft8cn.icom.WifiRig; + +public class IComWifiConnector extends WifiConnector{ + private static final String TAG = "IComWifiConnector"; + + public IComWifiConnector(int controlMode,WifiRig wifiRig) { + super(controlMode,wifiRig); + + this.wifiRig.setOnDataEvents(new WifiRig.OnDataEvents() { + @Override + public void onReceivedCivData(byte[] data) { + if (getOnConnectReceiveData()!=null){ + getOnConnectReceiveData().onData(data); + } + if (onWifiDataReceived!=null) { + onWifiDataReceived.OnCivReceived(data); + } + } + + @Override + public void onReceivedWaveData(byte[] data) {//接收音频数据事件,把音频数据转换成float格式的。 + if (onWifiDataReceived!=null){ + float[] waveFloat=new float[data.length/2]; + for (int i = 0; i mutableMaxTxPower = new MutableLiveData<>(); + + + public X6100Connector(Context context, X6100Radio xiegRadio, int controlMode) { + super(controlMode); + this.xieguRadio = xiegRadio; + setXieguRadioInterface(); + + } + + public static short[] byteDataTo16BitData(byte[] buffer){ + short[] data=new short[buffer.length /2]; + for (int i = 0; i < buffer.length/2; i++) { + short res = (short) ((buffer[i*2+1] & 0x00FF) | (((short) buffer[i*2]) << 8)); + data[i]=res; + } + return data; + } + + /** + * 把原始的声音数据转换成16位的数组数据。 + * @param buffer 原始的声音数据(8位) + * @return 返回16位的int格式数组 + */ + private float[] byteDataToFloatData(byte[] buffer){ + float[] data=new float[buffer.length /2]; + for (int i = 0; i < buffer.length/2; i++) { + int res = (buffer[i*2] & 0x000000FF) | (((int) buffer[i*2+1]) << 8); + data[i]=res/32768.0f; + } + return data; + } + private void setXieguRadioInterface() { + xieguRadio.setOnReceiveStreamData(new X6100Radio.OnReceiveStreamData() { + @Override + public void onReceiveAudio(byte[] data) { + if (onWaveDataReceived!=null){ + float[] waveFloat = byteDataToFloatData(data); + onWaveDataReceived.OnDataReceived(waveFloat.length,waveFloat); + } + } + + @Override + public void onReceiveIQ(byte[] data) { + + } + + @Override + public void onReceiveFFT(VITA vita) { + + } + + @Override + public void onReceiveMeter(X6100Meters meters) { + maxTXPower= meters.max_power; + mutableMaxTxPower.postValue(maxTXPower); + } + + @Override + public void onReceiveUnKnow(byte[] data) { + + } + }); + + + //当有命令返回值时的事件 + xieguRadio.setOnCommandListener(new X6100Radio.OnCommandListener() { + @Override + public void onResponse(X6100Radio.XieguResponse response) { + Log.d(TAG, String.format("onResponse(%s): %s" + ,response.xieguCommand.toString(),response.rawData )); + if (response.xieguCommand == X6100Radio.XieguCommand.STREAM){ + if (response.resultContent.toUpperCase().contains("PORT=")){//说明流端口打开了 + streamIsOn =true; + } + } + + if (response.resultCode!=0) {//只显示失败的命令 + ToastMessage.show(response.resultContent); + Log.e(TAG, "onResponse: "+response.resultContent); + } + + } + }); + + //当有状态信息接收到时 + xieguRadio.setOnStatusListener(new X6100Radio.OnStatusListener() { + @Override + public void onStatus(X6100Radio.XieguResponse response) { + //显示状态消息 + if (response.resultCode == 0){//说明是电台状态变化了 + String status[] = response.resultContent.split(" "); + for (int i = 0; i < status.length; i++) { + if (status[i].startsWith("active_freq")){//找出频率状态,设置频率 + String temp[]=status[i].split("="); + if (baseRig != null) { + baseRig.setFreq(Long.parseLong(temp[1].trim())); + } + } + } + } + Log.d(TAG, "onStatus: "+response.rawData ); + } + }); + + + + xieguRadio.setOnTcpConnectStatus(new X6100Radio.OnTcpConnectStatus() { + @SuppressLint("DefaultLocale") + @Override + public void onConnectSuccess(RadioTcpClient tcpClient) { + ToastMessage.show(String.format(GeneralVariables.getStringFromResource(R.string.init_flex_operation) + ,xieguRadio.getModelName())); + new Thread(new Runnable() {//此处使用线程方式,是防止tcp对象阻塞 + @Override + public void run() { + while (!streamIsOn) {//等待电台打开流端口 + xieguRadio.commandOpenStream();//设置UDP端口 + try { + Thread.sleep(300); + } catch (InterruptedException e) { + Log.e(TAG, Objects.requireNonNull(e.getMessage())); + } + //todo 此处经常丢命令 + xieguRadio.commandGetAudioInfo();//读取6100播放的参数 + //xieguRadio.commandSubGetMeter();//查阅仪表索引编号 + xieguRadio.commandSubAllMeter();//订阅仪表流数据 + //xieguRadio.commandSetTxPower(1);//订阅仪表流数据 + } + } + }).start(); + } + + @Override + public void onConnectFail(RadioTcpClient tcpClient) { + ToastMessage.show(String.format(GeneralVariables.getStringFromResource + (R.string.xiegu_connect_failed),xieguRadio.getModelName())); + } + + @Override + public void onConnectionClosed(RadioTcpClient tcpClient) { + if (baseRig.getOnRigStateChanged()!=null) { + baseRig.getOnRigStateChanged().onDisconnected(); + } + } + }); + + } + + + @Override + public void sendData(byte[] data) { + xieguRadio.sendData(data); + } + + + @Override + public void setPttOn(boolean on) { + xieguRadio.isPttOn=on; + xieguRadio.commandPTTOnOff(on); + } + + @Override + public void setPttOn(byte[] command) { + } + + @Override + public void sendWaveData(float[] data) { + xieguRadio.sendWaveData(data); + } + + + public void setMaxTXPower(int power){ + maxTXPower=power; + mutableMaxTxPower.postValue(maxTXPower); + GeneralVariables.flexMaxRfPower=power; + xieguRadio.commandSetTxPower(power);//设置发射功率 + + } + + //传送a91数据包的方式 + @Override + public void sendFt8A91(byte[] a91,float baseFreq){ + Log.d(TAG,String.format("A91:%s", BaseRig.byteToStr(a91))); + //xieguRadio.commandSendA91(a91,GeneralVariables.volumePercent,baseFreq); + xieguRadio.commandSendA91(a91,0.95f,baseFreq); + } + + @Override + public void setRFVolume(int volume) { + xieguRadio.commandSetTxVol(volume); + } + + @Override + public void connect() { + super.connect(); + xieguRadio.openAudio(); + xieguRadio.connect(); + xieguRadio.openStreamPort(); + } + + @Override + public void disconnect() { + super.disconnect(); + xieguRadio.closeAudio(); + xieguRadio.closeStreamPort(); + xieguRadio.disConnect(); + } + + public OnWaveDataReceived getOnWaveDataReceived() { + return onWaveDataReceived; + } + + public void setOnWaveDataReceived(OnWaveDataReceived onWaveDataReceived) { + this.onWaveDataReceived = onWaveDataReceived; + } + + public BaseRig getBaseRig() { + return baseRig; + } + + public void setBaseRig(BaseRig baseRig) { + this.baseRig = baseRig; + } + + @Override + public boolean isConnected() { + return xieguRadio.isConnect(); + } + + public X6100Radio getXieguRadio() { + return xieguRadio; + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/count/CountDbOpr.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/count/CountDbOpr.java new file mode 100644 index 00000000..8bde7da0 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/count/CountDbOpr.java @@ -0,0 +1,555 @@ +package com.bg7yoz.ft8cn.count; +/** + * 用于通联日志统计的的数据库操作。 + * 注:目前归属地的统计,是基于网格的,如果基于呼号的前缀统计,虽然准确,但统计速度太慢,用户的交互效果不好。 + * + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.annotation.SuppressLint; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.os.AsyncTask; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.callsign.CallsignInfo; +import com.bg7yoz.ft8cn.maidenhead.MaidenheadGrid; + +import java.util.ArrayList; + +public class CountDbOpr { + private static final String TAG="CountDbOpr"; + + public enum ChartType {Bar, Pie, Line, None} + public static final int ChartBar=0; + public static final int ChartPie=1; + public static final int ChartLine=2; + public static final int ChartNone=3; + public static void getQSLTotal(SQLiteDatabase db,AfterCount afterCount){ + //通联的呼号数量 + //SELECT count(DISTINCT callsign) FROM QslCallsigns qc + new GetTotal(db,afterCount).execute(); + } + + public static void getDxcc(SQLiteDatabase db,AfterCount afterCount){ + new GetDxccCount(db,afterCount).execute(); + } + + public static void getCQZoneCount(SQLiteDatabase db,AfterCount afterCount){ + new GetCqZoneCount(db,afterCount).execute(); + } + public static void getItuCount(SQLiteDatabase db,AfterCount afterCount){ + new GetItuZoneCount(db,afterCount).execute(); + } + public static void getBandCount(SQLiteDatabase db,AfterCount afterCount){ + new GetBandCount(db,afterCount).execute(); + } + + public static void getDistanceCount(SQLiteDatabase db,AfterCount afterCount){ + new DistanceCount(db,afterCount).execute(); + } + + + static class DistanceCount extends AsyncTask{ + private final SQLiteDatabase db; + private final AfterCount afterCount; + + public DistanceCount(SQLiteDatabase db, AfterCount afterCount) { + this.db = db; + this.afterCount = afterCount; + } + + @SuppressLint("Range") + @Override + protected Void doInBackground(Void... voids) { + String querySQL; + Cursor cursor; + double maxDistance=-1; + String maxDistanceGrid=""; + double minDistance=6553500f; + String minDistanceGrid=""; + + ArrayList values=new ArrayList<>(); + + ArrayList bands=new ArrayList<>(); + querySQL="select DISTINCT band from QSLTable q WHERE gridsquare<>\"\""; + cursor = db.rawQuery(querySQL,null); + + while (cursor.moveToNext()){ + bands.add(cursor.getString(cursor.getColumnIndex("band"))); + } + + for (String band:bands) { + + querySQL = "SELECT DISTINCT SUBSTR(gridsquare,1,4) as g FROM QSLTable q where (gridsquare <>\"\")and(band=?)"; + cursor = db.rawQuery(querySQL, new String[]{band}); + double max=-1; + String maxGrid=""; + double min=6553500f; + String minGrid=""; + + while (cursor.moveToNext()) { + String grid = cursor.getString(cursor.getColumnIndex("g")); + double distance = MaidenheadGrid.getDist(grid, GeneralVariables.getMyMaidenheadGrid()); + if (distance > maxDistance) { + maxDistance = distance; + maxDistanceGrid = grid; + } + if (distance < minDistance) { + minDistance = distance; + minDistanceGrid = grid; + } + + if (distance > max) { + max = distance; + maxGrid = grid; + } + if (distance < min) { + min = distance; + minGrid = grid; + } + + } + cursor.close(); + + if ((max>-1)&&(min<6553500f)){ + values.add(new CountValue((int) Math.round(max),String.format( + GeneralVariables.getStringFromResource(R.string.maximum_distance) + ,getQSLInfo(maxGrid)))); + values.add(new CountValue((int) Math.round(min),String.format( + GeneralVariables.getStringFromResource(R.string.minimum_distance) + ,getQSLInfo(minGrid)))); + } + } + + String info=String.format(GeneralVariables.getStringFromResource(R.string.count_distance_info) + ,maxDistance,maxDistanceGrid,minDistance,minDistanceGrid); + + if (afterCount!=null &&(maxDistance>0)&&(minDistance<6553500f)){ + afterCount.countInformation(new CountInfo(info + ,ChartType.None + ,GeneralVariables.getStringFromResource(R.string.distance_statistics) + ,values)); + } + return null; + } + + @SuppressLint("Range") + private String getQSLInfo(String grid){ + String querySQL="SELECT call,band,freq,qso_date,time_on,gridsquare FROM QSLTable q " + + "where SUBSTR(gridsquare,1,4) =? LIMIT 1"; + Cursor cursor = db.rawQuery(querySQL,new String[]{grid}); + StringBuilder result=new StringBuilder(); + int breakLine=0; + while (cursor.moveToNext()){ + String call=cursor.getString(cursor.getColumnIndex("call")); + String band=cursor.getString(cursor.getColumnIndex("band")); + String freq=cursor.getString(cursor.getColumnIndex("freq")); + //String qso_date=cursor.getString(cursor.getColumnIndex("qso_date")); + //String time_on=cursor.getString(cursor.getColumnIndex("time_on")); + String gridsquare=cursor.getString(cursor.getColumnIndex("gridsquare")); + + //获取呼号的位置 + CallsignInfo callsignInfo= GeneralVariables.callsignDatabase.getCallInfo(call); + + if (breakLine>0) result.append("\n"); + result.append(String.format("%s %s(%s) %s\n %s", call, freq, band + ,gridsquare,callsignInfo.toString())); + breakLine++; + } + return result.toString(); + } + + + } + + + /** + * 统计各波段比例 + */ + static class GetBandCount extends AsyncTask { + private final SQLiteDatabase db; + private final AfterCount afterCount; + + public GetBandCount(SQLiteDatabase db, AfterCount afterCount) { + this.db = db; + this.afterCount = afterCount; + } + + @SuppressLint({"Range", "DefaultLocale"}) + @Override + protected Void doInBackground(Void... voids) { + int successCount=0; + ArrayList values=new ArrayList<>(); + String querySQL; + Cursor cursor; + querySQL="SELECT UPPER( band) as band ,count(*) as c FROM QSLTable q \n" + + "GROUP BY UPPER( band) ORDER BY COUNT(*) desc "; + cursor = db.rawQuery(querySQL,null); + while (cursor.moveToNext()){ + int count=cursor.getInt(cursor.getColumnIndex("c")); + successCount=successCount+count; + values.add(new CountValue(count + ,String.format("%s",cursor.getString(cursor.getColumnIndex("band"))))); + } + StringBuilder stringBuilder=new StringBuilder(); + stringBuilder.append(String.format(GeneralVariables.getStringFromResource(R.string.count_total),successCount)); + for (int i = 0; i < values.size(); i++) { + stringBuilder.append(String.format("\n%s:\t%d",values.get(i).name,values.get(i).value)); + } + cursor.close(); + if (afterCount!=null){ + afterCount.countInformation(new CountInfo( + stringBuilder.toString() + ,ChartType.Pie,GeneralVariables.getStringFromResource(R.string.band_statistics) + ,values)); + } + + return null; + } + } + /** + * 统计通联数量 + */ + static class GetTotal extends AsyncTask{ + private final SQLiteDatabase db; + private final AfterCount afterCount; + + public GetTotal(SQLiteDatabase db, AfterCount afterCount) { + this.db = db; + this.afterCount = afterCount; + } + + @SuppressLint({"DefaultLocale", "Range"}) + @Override + protected Void doInBackground(Void... voids) { + + int logCount=0;//日志的数量 + int callsignCount=0;//呼号的数量 + int isQslCount=0;//确认的数量 + int isLotwQslCount=0;//三方平台确认的数量 + + //通联的呼号数量 + String querySQL; + Cursor cursor; + querySQL="SELECT count(*) AS C FROM QSLTable q"; + cursor = db.rawQuery(querySQL,null); + cursor.moveToFirst(); + logCount=cursor.getInt(cursor.getColumnIndex("C")); + cursor.close(); + + querySQL="SELECT count(DISTINCT \"call\") AS C FROM QSLTable q "; + cursor = db.rawQuery(querySQL,null); + cursor.moveToFirst(); + callsignCount=cursor.getInt(cursor.getColumnIndex("C")); + cursor.close(); + + querySQL="SELECT count(*) AS C FROM QSLTable q WHERE isQSL =1 or isLotW_QSL =1"; + cursor = db.rawQuery(querySQL,null); + cursor.moveToFirst(); + isQslCount=cursor.getInt(cursor.getColumnIndex("C")); + cursor.close(); + + querySQL="SELECT count(*) AS C FROM QSLTable q WHERE isLotW_QSL =1"; + cursor = db.rawQuery(querySQL,null); + cursor.moveToFirst(); + isLotwQslCount=cursor.getInt(cursor.getColumnIndex("C")); + cursor.close(); + + float qslPercent=0; + if (logCount>0){ + qslPercent=100f*(float) isQslCount/(float) logCount; + } + //result.append(String.format("通联的呼号数量:%d",cursor.getInt(cursor.getColumnIndex("C")))); + + if (afterCount!=null){ + ArrayList values=new ArrayList<>(); + values.add(new CountValue(isQslCount,GeneralVariables.getStringFromResource(R.string.count_confirmed))); + values.add(new CountValue(logCount-isQslCount,GeneralVariables.getStringFromResource(R.string.count_unconfirmed))); + StringBuilder stringBuilder=new StringBuilder(); + stringBuilder.append(GeneralVariables.getStringFromResource(R.string.count_total_logs)); + stringBuilder.append("\n"+GeneralVariables.getStringFromResource(R.string.count_confirmed_log)); + stringBuilder.append("\n"+GeneralVariables.getStringFromResource(R.string.count_lotw_confirmed)); + stringBuilder.append("\n"+GeneralVariables.getStringFromResource(R.string.count_manually_confirmed)); + stringBuilder.append("\n"+GeneralVariables.getStringFromResource(R.string.count_confirmed_proportion)); + stringBuilder.append("\n"+GeneralVariables.getStringFromResource(R.string.count_tota_callsigns)); + afterCount.countInformation(new CountInfo( + //String.format("日志数:%d\n确认的日志数:%d\n平台确认的日志数:%d" + + // "\n手动确认的日志数:%d\n日志确认比例:%.1f%%\n呼号数量:%d" + String.format(stringBuilder.toString() + ,logCount,isQslCount,isLotwQslCount,isQslCount-isLotwQslCount,qslPercent,callsignCount) + ,ChartType.Pie,GeneralVariables.getStringFromResource(R.string.confirmation_statistics) + ,values)); + } + + return null; + } + } + + /** + * 统计ITU分区数量 + */ + static class GetItuZoneCount extends AsyncTask { + private static final String TAG = "GetItuZoneCount"; + private final SQLiteDatabase db; + private final AfterCount afterCount; + + public GetItuZoneCount(SQLiteDatabase db, AfterCount afterCount) { + this.db = db; + this.afterCount = afterCount; + } + + @SuppressLint({"Range", "DefaultLocale"}) + @Override + protected Void doInBackground(Void... voids) { + ArrayList countValues=new ArrayList<>(); + int ituZoneCount=0; + int successCount=0; + String querySQL; + Cursor cursor; + + + querySQL="SELECT count(DISTINCT itu) as c From ituList il "; + + cursor = db.rawQuery(querySQL,null); + cursor.moveToFirst(); + ituZoneCount=cursor.getInt(cursor.getColumnIndex("c")); + cursor.close(); + + querySQL="SELECT il.itu ,count(*) as c FROM ituList il \n" + + "inner join QSLTable q\n" + + "on il.grid =UPPER(SUBSTR(q.gridsquare,1,4))\n" + + "GROUP BY il.itu ORDER BY COUNT(*) DESC"; + + cursor = db.rawQuery(querySQL,null); + while (cursor.moveToNext()){ + successCount++; + countValues.add(new CountValue(cursor.getInt(cursor.getColumnIndex("c")) + ,String.format(GeneralVariables.getStringFromResource(R.string.count_zone) + ,cursor.getString(cursor.getColumnIndex("itu"))))); + } + + if (afterCount!=null){ + afterCount.countInformation(new CountInfo("" + ,ChartType.Bar + ,GeneralVariables.getStringFromResource(R.string.itu_completion_statistics) + ,countValues)); + } + if (afterCount!=null&&ituZoneCount!=0){ + ArrayList values=new ArrayList<>(); + values.add(new CountValue(successCount + ,GeneralVariables.getStringFromResource(R.string.count_completed))); + values.add(new CountValue(ituZoneCount-successCount + ,GeneralVariables.getStringFromResource(R.string.count_incomplete))); + afterCount.countInformation(new CountInfo( + String.format(GeneralVariables.getStringFromResource(R.string.count_total_itu) + ,ituZoneCount,successCount,100f*(float)successCount/(float) ituZoneCount) + ,ChartType.Pie + ,GeneralVariables.getStringFromResource(R.string.count_itu_completed_scale) + ,values)); + } + return null; + } + } + + + + /** + * 统计CQ分区 + */ + static class GetCqZoneCount extends AsyncTask { + private static final String TAG = "GetCqZoneCount"; + private final SQLiteDatabase db; + private final AfterCount afterCount; + + public GetCqZoneCount(SQLiteDatabase db, AfterCount afterCount) { + this.db = db; + this.afterCount = afterCount; + } + + @SuppressLint({"Range", "DefaultLocale"}) + @Override + protected Void doInBackground(Void... voids) { + ArrayList countValues=new ArrayList<>(); + int cqZoneCount=0; + int successCount=0; + String querySQL; + Cursor cursor; + + + querySQL="SELECT count(DISTINCT cqzone) as c From cqzoneList cl "; + + cursor = db.rawQuery(querySQL,null); + cursor.moveToFirst(); + cqZoneCount=cursor.getInt(cursor.getColumnIndex("c")); + cursor.close(); + + querySQL="SELECT cl.cqzone ,count(*) as c FROM cqzoneList cl \n" + + "inner join QSLTable q \n" + + "on cl.grid =UPPER(SUBSTR(q.gridsquare,1,4)) \n" + + "GROUP BY cl.cqzone ORDER BY COUNT(*) DESC"; + + cursor = db.rawQuery(querySQL,null); + while (cursor.moveToNext()){ + successCount++; + countValues.add(new CountValue(cursor.getInt(cursor.getColumnIndex("c")) + ,String.format(GeneralVariables.getStringFromResource(R.string.count_zone) + ,cursor.getString(cursor.getColumnIndex("cqzone"))))); + } + + if (afterCount!=null){ + afterCount.countInformation(new CountInfo("" + ,ChartType.Bar + ,GeneralVariables.getStringFromResource(R.string.count_cqzone_completed) + ,countValues)); + } + if (afterCount!=null&&cqZoneCount!=0){ + ArrayList values=new ArrayList<>(); + values.add(new CountValue(successCount + ,GeneralVariables.getStringFromResource(R.string.count_completed))); + values.add(new CountValue(cqZoneCount-successCount + ,GeneralVariables.getStringFromResource(R.string.count_incomplete))); + afterCount.countInformation(new CountInfo( + String.format(GeneralVariables.getStringFromResource(R.string.count_total_cqzone) + ,cqZoneCount,successCount,100f*(float)successCount/(float) cqZoneCount) + ,ChartType.Pie + ,GeneralVariables.getStringFromResource(R.string.count_cqzone_proportion) + ,values)); + } + + + return null; + } + } + /** + * 统计DXCC分区的数据 + */ + static class GetDxccCount extends AsyncTask{ + private static final String TAG="GetDxccCount"; + private final SQLiteDatabase db; + private final AfterCount afterCount; + + class DxccInfo{ + String name; + int dxcc; + int count=0; + + public DxccInfo(String name, int dxcc, int count) { + this.name = name; + this.dxcc = dxcc; + this.count = count; + } + } + + public GetDxccCount(SQLiteDatabase db, AfterCount afterCount) { + this.db = db; + this.afterCount = afterCount; + } + + @SuppressLint({"Range", "DefaultLocale"}) + @Override + protected Void doInBackground(Void... voids) { + //DXCC的数量 + ArrayList dxccValues=new ArrayList<>(); + int dxccCount=0; + Cursor cursor; + String querySQL; + querySQL="SELECT count(*) as c FROM dxcclist"; + cursor = db.rawQuery(querySQL,null); + cursor.moveToFirst(); + dxccCount=cursor.getInt(cursor.getColumnIndex("c")); + cursor.close(); + + if (GeneralVariables.isChina) { + querySQL = "SELECT dg.dxcc,count(*) as c ,dl.name as dxccName FROM dxcc_grid dg\n" + + "inner join QSLTable q \n" + + "on dg.grid =UPPER(SUBSTR(q.gridsquare,1,4)) LEFT JOIN dxccList dl on dg.dxcc =dl.dxcc \n" + + "GROUP BY dg.dxcc ,dl.name ORDER BY count(*) DESC"; +// querySQL="SELECT dg.dxcc,count(*) as c ,dl.name as dxccName FROM dxcc_prefix dg\n" + +// "inner join QSLTable q\n" + +// //"on (q.call like (dg.prefix||'%'))\n" + +// "on ((SUBSTR( q.call,1,LENGTH( dg.prefix)) = (dg.prefix))) \n"+ +// "LEFT JOIN dxccList dl on dg.dxcc =dl.dxcc \n" + +// "GROUP BY dg.dxcc ,dl.name ORDER BY count(*) DESC"; + }else { +// querySQL="SELECT dg.dxcc,count(*) as c ,dl.aname as dxccName FROM dxcc_prefix dg\n" + +// "inner join QSLTable q\n" + +// "on (q.call like (dg.prefix||'%'))\n" + +// "LEFT JOIN dxccList dl on dg.dxcc =dl.dxcc \n" + +// "GROUP BY dg.dxcc ,dl.name ORDER BY count(*) DESC"; + querySQL = "SELECT dg.dxcc,count(*) as c ,dl.aname as dxccName FROM dxcc_grid dg\n" + + "inner join QSLTable q \n" + + "on dg.grid =UPPER(SUBSTR(q.gridsquare,1,4)) LEFT JOIN dxccList dl on dg.dxcc =dl.dxcc \n" + + "GROUP BY dg.dxcc ,dl.aname ORDER BY count(*) DESC"; + + } + cursor = db.rawQuery(querySQL,null); + int successCount=0; + while (cursor.moveToNext()){ + dxccValues.add(new CountValue(cursor.getInt(cursor.getColumnIndex("c")) + ,cursor.getString(cursor.getColumnIndex("dxccName")))); + successCount++; + } + + if (afterCount!=null){ + afterCount.countInformation(new CountInfo("" + ,ChartType.Bar + ,GeneralVariables.getStringFromResource(R.string.dxcc_completion_statistics) + ,dxccValues)); + } + + + if (afterCount!=null&&dxccCount!=0){ + ArrayList values=new ArrayList<>(); + values.add(new CountValue(successCount + ,GeneralVariables.getStringFromResource(R.string.count_completed))); + values.add(new CountValue(dxccCount-successCount + ,GeneralVariables.getStringFromResource(R.string.count_incomplete))); + afterCount.countInformation(new CountInfo( + String.format(GeneralVariables.getStringFromResource(R.string.count_total_dxcc) + ,dxccCount,successCount,100f*(float)successCount/(float) dxccCount) + ,ChartType.Pie + ,GeneralVariables.getStringFromResource(R.string.count_dxcc_proportion) + ,values)); + } + + return null; + } + } + + + + + public interface AfterCount{ + void countInformation(CountInfo countInfo); + } + + static public class CountInfo{ + public String title; + public String info; + public ArrayList values=null; + public ChartType chartType; + + public CountInfo(String info,ChartType chartType,String title + , ArrayList values) { + this.info = info; + this.values = values; + this.title=title; + this.chartType=chartType; + } + } + + static public class CountValue{ + public int value; + public String name; + + public CountValue(int value, String name) { + this.value = value; + this.name = name; + } + } + + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/count/CountFragment.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/count/CountFragment.java new file mode 100644 index 00000000..0a6f0d20 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/count/CountFragment.java @@ -0,0 +1,93 @@ +package com.bg7yoz.ft8cn.count; +/** + * 通联日志的统计界面 + * + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.annotation.SuppressLint; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.fragment.app.Fragment; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.Observer; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.bg7yoz.ft8cn.MainViewModel; +import com.bg7yoz.ft8cn.databinding.FragmentCountBinding; + +import java.util.ArrayList; + + +public class CountFragment extends Fragment { + private static final String TAG="CountFragment"; + private MainViewModel mainViewModel; + private FragmentCountBinding binding; + private ArrayList countInfoList=new ArrayList<>(); + private MutableLiveData> mutableInfoList=new MutableLiveData<>(); + + private RecyclerView countInfoListRecyclerView; + private CountInfoAdapter countInfoAdapter; + + private CountDbOpr.AfterCount afterCount=new CountDbOpr.AfterCount() { + @Override + public void countInformation(CountDbOpr.CountInfo countInfo) { + countInfoList.add(countInfo); + mutableInfoList.postValue(countInfoList); + } + }; + + + public CountFragment() { + // Required empty public constructor + } + + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mainViewModel = MainViewModel.getInstance(this); + } + + @SuppressLint("NotifyDataSetChanged") + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + binding=FragmentCountBinding.inflate(getLayoutInflater()); + mainViewModel = MainViewModel.getInstance(this); + countInfoList.clear(); + countInfoListRecyclerView=binding.countRecyclerView; + countInfoAdapter=new CountInfoAdapter(requireContext(),countInfoList); + countInfoListRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext())); + countInfoListRecyclerView.setAdapter(countInfoAdapter); + countInfoAdapter.notifyDataSetChanged(); + + + + CountDbOpr.getQSLTotal(mainViewModel.databaseOpr.getDb(),afterCount); + + + CountDbOpr.getDxcc(mainViewModel.databaseOpr.getDb(),afterCount); + CountDbOpr.getCQZoneCount(mainViewModel.databaseOpr.getDb(),afterCount); + CountDbOpr.getItuCount(mainViewModel.databaseOpr.getDb(),afterCount); + + CountDbOpr.getBandCount(mainViewModel.databaseOpr.getDb(),afterCount); + CountDbOpr.getDistanceCount(mainViewModel.databaseOpr.getDb(),afterCount); + + + + mutableInfoList.observe(requireActivity(), new Observer>() { + @Override + public void onChanged(ArrayList countInfos) { + countInfoAdapter.notifyDataSetChanged(); + } + }); + + return binding.getRoot(); + } +} \ No newline at end of file diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/count/CountInfoAdapter.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/count/CountInfoAdapter.java new file mode 100644 index 00000000..2f0e6191 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/count/CountInfoAdapter.java @@ -0,0 +1,260 @@ +package com.bg7yoz.ft8cn.count; +/** + * 用于列出统计结果的Adapter + * + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageButton; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.bg7yoz.ft8cn.R; +import com.github.mikephil.charting.charts.BarChart; +import com.github.mikephil.charting.charts.PieChart; +import com.github.mikephil.charting.components.Description; +import com.github.mikephil.charting.components.XAxis; +import com.github.mikephil.charting.data.BarData; +import com.github.mikephil.charting.data.BarDataSet; +import com.github.mikephil.charting.data.BarEntry; +import com.github.mikephil.charting.data.PieData; +import com.github.mikephil.charting.data.PieDataSet; +import com.github.mikephil.charting.data.PieEntry; +import com.github.mikephil.charting.formatter.IndexAxisValueFormatter; + +import java.util.ArrayList; +import java.util.List; + +public class CountInfoAdapter extends RecyclerView.Adapter{ + private static final String TAG="CountInfoAdapter"; + private final ArrayList countInfoList; + private final Context context; + + public CountInfoAdapter(Context context,ArrayList countInfoList) { + this.countInfoList = countInfoList; + this.context=context; + } + + @NonNull + @Override + public CountInfoItemHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext()); + View view ; + switch (viewType){ + case CountDbOpr.ChartPie: + view= layoutInflater.inflate(R.layout.count_info_pie_item, parent, false); + break; + case CountDbOpr.ChartBar: + view= layoutInflater.inflate(R.layout.count_info_bar_item, parent, false); + break; + default: + view= layoutInflater.inflate(R.layout.count_info_none_item, parent, false); + break; + } + + return new CountInfoItemHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull CountInfoItemHolder holder, int position) { + holder.countInfo=countInfoList.get(position); + holder.countInfoTextView.setText(holder.countInfo.info); + holder.countTitleTextView.setText(holder.countInfo.title); + switch (holder.countInfo.chartType){ + case Pie: + drawPie(holder); + break; + case Bar: + drawBar(holder); + break; + default: + addDetail(holder); + } + + } + + private void addDetail(@NonNull CountInfoItemHolder holder){ + if (holder.detailLayout==null) return; + holder.detailLayout.removeAllViews(); + for (int i = 0; i barEntries=new ArrayList<>(); + for (int i = 0; i (int) value) { + return holder.countInfo.values.get((int) value).name; + }else { + return ""; + } + } + }; + barChart.getXAxis().setValueFormatter(formatter); + + barChart.setDescription(null); + + barChart.animateY(500); + barChart.invalidate(); + + } + + private void drawPie(@NonNull CountInfoItemHolder holder){ + PieChart countPieChart; + countPieChart=(PieChart) holder.countChart; + countPieChart.getLegend().setTextColor(context.getResources().getColor(R.color.text_view_color)); + + List pieEntries=new ArrayList<>(); + for (int i = 0; i dxccObjects = loadDxccDataFromFile(); + for (DxccObject obj : dxccObjects) { + obj.insertToDb(sqLiteDatabase); + } + } + }).start(); + } + + } + + /** + * 把ITU分区的对应表导入数据库 + * + * @param sqLiteDatabase 数据库 + */ + private void createItuTables(SQLiteDatabase sqLiteDatabase) { + if (!checkTableExists(sqLiteDatabase, "ituList")) { + sqLiteDatabase.execSQL("CREATE TABLE ituList (itu INTEGER,grid TEXT)"); + new Thread(new Runnable() { + @Override + public void run() { + loadItuDataFromFile(sqLiteDatabase); + } + }).start(); + } + } + + private void createCqZoneTables(SQLiteDatabase sqLiteDatabase) { + if (!checkTableExists(sqLiteDatabase, "cqzoneList")) { + sqLiteDatabase.execSQL("CREATE TABLE cqzoneList (cqzone INTEGER,grid TEXT)"); + new Thread(new Runnable() { + @Override + public void run() { + loadICqZoneDataFromFile(sqLiteDatabase); + } + }).start(); + } + } + + /** + * 创建呼号与网格对应关系表 + * + * @param sqLiteDatabase db + */ + private void createCallsignQTHTables(SQLiteDatabase sqLiteDatabase) { + if (!checkTableExists(sqLiteDatabase, "CallsignQTH")) { + sqLiteDatabase.execSQL("CREATE TABLE CallsignQTH(callsign text, grid text" + + ",updateTime Int ,PRIMARY KEY(callsign))"); + } + } + + private void createSWLTables(SQLiteDatabase sqLiteDatabase) { + //Log.e(TAG,"upgrade database."); + if (!checkTableExists(sqLiteDatabase, "SWLMessages")) { + sqLiteDatabase.execSQL("CREATE TABLE SWLMessages (\n" + + "\tID INTEGER PRIMARY KEY AUTOINCREMENT,\n" + + "\tI3 INTEGER,\n" + + "\tN3 INTEGER,\n" + + "\tProtocol TEXT,\n" + + "\tUTC TEXT,\n" + + "\tSNR INTEGER,\n" + + "\tTIME_SEC REAL,\n" + + "\tFREQ INTEGER,\n" + + "\tCALL_TO TEXT,\n" + + "\tCALL_FROM TEXT,\n" + + "\tEXTRAL TEXT,\n" + + "\tREPORT INTEGER,\n" + + "\tBAND INTEGER\n" + + ")"); + sqLiteDatabase.execSQL("CREATE INDEX SWLMessages_CALL_TO_IDX " + + "ON SWLMessages (CALL_TO,CALL_FROM)"); + sqLiteDatabase.execSQL("CREATE INDEX SWLMessages_UTC_IDX ON SWLMessages (UTC)"); + } + + if (!checkTableExists(sqLiteDatabase, "SWLQSOTable")) { + sqLiteDatabase.execSQL("CREATE TABLE SWLQSOTable (\n" + + "\tid INTEGER PRIMARY KEY AUTOINCREMENT,\n" + + "\t\"call\" TEXT,\n" + + "\tgridsquare TEXT,\n" + + "\tmode TEXT,\n" + + "\trst_sent TEXT,\n" + + "\trst_rcvd TEXT,\n" + + "\tqso_date TEXT,\n" + + "\ttime_on TEXT,\n" + + "\tqso_date_off TEXT,\n" + + "\ttime_off TEXT,\n" + + "\tband TEXT,\n" + + "\tfreq TEXT,\n" + + "\tstation_callsign TEXT,\n" + + "\tmy_gridsquare TEXT,\n" + + "\toperator TEXT,\n" + + "\tcomment TEXT)"); + }else { + alterTable(sqLiteDatabase, "SWLQSOTable", "operator" + , "operator TEXT"); + } + } + + + /** + * 创建索引,以提高导入速度 + * @param sqLiteDatabase 数据库 + */ + private void createIndex(SQLiteDatabase sqLiteDatabase) { + if (!checkIndexExists(sqLiteDatabase, "QslCallsigns_callsign_IDX")) { + sqLiteDatabase.execSQL("CREATE INDEX QslCallsigns_callsign_IDX ON QslCallsigns (callsign,startTime,finishTime,mode)"); + } + if (!checkIndexExists(sqLiteDatabase, "QSLTable_call_IDX")) { + sqLiteDatabase.execSQL("CREATE INDEX QSLTable_call_IDX ON QSLTable (\"call\",qso_date,time_on,mode)"); + } + } + + + public void loadItuDataFromFile(SQLiteDatabase db) { + AssetManager assetManager = context.getAssets(); + InputStream inputStream; + db.execSQL("delete from ituList"); + + String insertSQL = "INSERT INTO ituList (itu,grid)" + + "VALUES(?,?)"; + try { + inputStream = assetManager.open("ituzone.json"); + byte[] bytes = new byte[inputStream.available()]; + inputStream.read(bytes); + JSONObject jsonObject = new JSONObject(new String(bytes)); + JSONArray array = jsonObject.names(); + for (int i = 0; i < array.length(); i++) { + JSONObject ituObject = new JSONObject(jsonObject.getString(array.getString(i))); + JSONArray mh = ituObject.getJSONArray("mh"); + for (int j = 0; j < mh.length(); j++) { + db.execSQL(insertSQL, new Object[]{array.getString(i), mh.getString(j)}); + } + } + inputStream.close(); + } catch (IOException | JSONException e) { + e.printStackTrace(); + Log.e(TAG, "loadDataFromFile: " + e.getMessage()); + } + } + + public void loadICqZoneDataFromFile(SQLiteDatabase db) { + AssetManager assetManager = context.getAssets(); + InputStream inputStream; + db.execSQL("delete from cqzoneList"); + String insertSQL = "INSERT INTO cqzoneList (cqzone,grid)" + + "VALUES(?,?)"; + try { + inputStream = assetManager.open("cqzone.json"); + byte[] bytes = new byte[inputStream.available()]; + inputStream.read(bytes); + JSONObject jsonObject = new JSONObject(new String(bytes)); + JSONArray array = jsonObject.names(); + for (int i = 0; i < array.length(); i++) { + JSONObject ituObject = new JSONObject(jsonObject.getString(array.getString(i))); + JSONArray mh = ituObject.getJSONArray("mh"); + for (int j = 0; j < mh.length(); j++) { + db.execSQL(insertSQL, new Object[]{array.getString(i), mh.getString(j)}); + } + } + inputStream.close(); + } catch (IOException | JSONException e) { + e.printStackTrace(); + Log.e(TAG, "loadDataFromFile: " + e.getMessage()); + } + } + + + public ArrayList loadDxccDataFromFile() { + AssetManager assetManager = context.getAssets(); + InputStream inputStream; + ArrayList dxccObjects = new ArrayList<>(); + try { + inputStream = assetManager.open("dxcc_list.json"); + byte[] bytes = new byte[inputStream.available()]; + inputStream.read(bytes); + JSONObject jsonObject = new JSONObject(new String(bytes)); + JSONArray array = jsonObject.names(); + + for (int i = 0; i < array.length(); i++) { + if (array.getString(i).equals("-1")) continue; + JSONObject dxccObject = new JSONObject(jsonObject.getString(array.getString(i))); + DxccObject dxcc = new DxccObject(); + dxcc.id = Integer.parseInt(array.getString(i)); + dxcc.dxcc = dxccObject.getInt("dxcc"); + dxcc.cc = dxccObject.getString("cc"); + dxcc.ccc = dxccObject.getString("ccc"); + dxcc.name = dxccObject.getString("name"); + dxcc.continent = dxccObject.getString("continent"); + dxcc.ituZone = dxccObject.getString("ituzone") + .replace("[", "") + .replace("]", "") + .replace("\"", ""); + dxcc.cqZone = dxccObject.getString("cqzone") + .replace("[", "") + .replace("]", "") + .replace("\"", ""); + dxcc.timeZone = dxccObject.getInt("timezone"); + dxcc.cCode = dxccObject.getInt("ccode"); + dxcc.aName = dxccObject.getString("aname"); + dxcc.pp = dxccObject.getString("pp"); + dxcc.lat = dxccObject.getDouble("lat"); + dxcc.lon = dxccObject.getDouble("lon"); + + JSONArray mh = dxccObject.getJSONArray("mh"); + for (int j = 0; j < mh.length(); j++) { + dxcc.grid.add(mh.getString(j)); + } + JSONArray prefix = dxccObject.getJSONArray("prefix"); + for (int j = 0; j < prefix.length(); j++) { + dxcc.prefix.add(prefix.getString(j)); + } + dxccObjects.add(dxcc); + //Log.e(TAG, "loadDataFromFile: id:" + dxcc.id + " dxcc:" + dxcc.dxcc); + } + + inputStream.close(); + } catch (IOException | JSONException e) { + e.printStackTrace(); + Log.e(TAG, "loadDataFromFile: " + e.getMessage()); + } + return dxccObjects; + } + + + /** + * 把呼号和网格对应关系写入表中 + * + * @param callsign 呼号 + * @param grid 网格 + */ + public void addCallsignQTH(String callsign, String grid) { + if (grid.trim().length() < 4) return; + new AddCallsignQTH(db).execute(callsign, grid); + Log.d(TAG, String.format("addCallsignQTH: callsign:%s,grid:%s", callsign, grid)); + } + + //查询配置信息。 + public void getConfigByKey(String KeyName, OnAfterQueryConfig onAfterQueryConfig) { + new QueryConfig(db, KeyName, onAfterQueryConfig).execute(); + } + + public void getCallSign(String callsign, String fieldName, String tableName, OnGetCallsign getCallsign) { + new QueryCallsign(db, tableName, fieldName, callsign, getCallsign).execute(); + } + + /** + * 写配置信息,异步操作 + */ + public void writeConfig(String KeyName, String Value, OnAfterWriteConfig onAfterWriteConfig) { + Log.d(TAG, "writeConfig: Value:" + Value); + new WriteConfig(db, KeyName, Value, onAfterWriteConfig).execute(); + } + + public void writeMessage(ArrayList messages) { + new WriteMessages(db, messages).execute(); + } + + /** + * 读取关注的呼号列表 + * + * @param onAffterQueryFollowCallsigns 回调函数 + */ + public void getFollowCallsigns(OnAfterQueryFollowCallsigns onAffterQueryFollowCallsigns) { + new GetFollowCallSigns(db, onAffterQueryFollowCallsigns).execute(); + } + + /** + * 查询SWL MESSAGE各BAND的数量 + * @param onAfterQueryFollowCallsigns 回调 + */ + public void getMessageLogTotal(OnAfterQueryFollowCallsigns onAfterQueryFollowCallsigns) { + new GetMessageLogTotal(db, onAfterQueryFollowCallsigns).execute(); + } + + /** + * 查询SWL QSO的在各个月的数量 + * @param onAfterQueryFollowCallsigns 回调 + */ + public void getSWLQsoLogTotal(OnAfterQueryFollowCallsigns onAfterQueryFollowCallsigns) { + new GetSWLQsoTotal(db, onAfterQueryFollowCallsigns).execute(); + } + + + /** + * 向数据库中添加关注的呼号 + * + * @param callsign 呼号 + */ + public void addFollowCallsign(String callsign) { + new AddFollowCallSign(db, callsign).execute(); + } + + /** + * 清空关注的呼号 + */ + public void clearFollowCallsigns() { + new Thread(new Runnable() { + @Override + public void run() { + db.execSQL("delete from followCallsigns "); + } + }).start(); + } + + /** + * 删除通联的日志 + */ + public void clearLogCacheData() { + new Thread(new Runnable() { + @Override + public void run() { + db.execSQL("delete from SWLMessages "); + } + }).start(); + } + + /** + * 删除SWL QSO日志 + */ + public void clearSWLQsoData() { + new Thread(new Runnable() { + @Override + public void run() { + db.execSQL("delete from SWLQSOTable "); + } + }).start(); + } + /** + * 把通联成功的日志和呼号写到数据库中 + * + * @param qslRecord 通联记录 + */ + public void addQSL_Callsign(QSLRecord qslRecord) { + new AddQSL_Info(this, qslRecord).execute(); + } + + /** + * 把SWL的QSO保存到数据库,SWL的QSO标准:至少要有双方的信号报告。不包含自己的呼号。 + * @param qslRecord 通联日志记录 + */ + public void addSWL_QSO(QSLRecord qslRecord) { + new Add_SWL_QSO_Info(this, qslRecord).execute(); + } + + //删除数据库中关注的呼号 + public void deleteFollowCallsign(String callsign) { + new DeleteFollowCallsign(db, callsign).execute(); + } + + //获取所有配置参数 + public void getAllConfigParameter(OnAfterQueryConfig onAfterQueryConfig) { + new GetAllConfigParameter(db, onAfterQueryConfig).execute(); + } + + /** + * 查询全部成功通联的呼号,能通联的频率为条件 + */ + public void getAllQSLCallsigns() { + new LoadAllQSLCallsigns(db).execute(); + } + + + /** + * 按呼号查找QSL的呼号记录 + * + * @param callsign 呼号 + * @param onQueryQSLCallsign 回调 + */ + public void getQSLCallsignsByCallsign(boolean showAll,int offset,String callsign, int filter, OnQueryQSLCallsign onQueryQSLCallsign) { + new GetQLSCallsignByCallsign(showAll,offset,db, callsign, filter, onQueryQSLCallsign).execute(); + } + + /** + * 查询已经QSO的网格,这个主要用在GridTracker上 + * 可以知道哪些网格是QSO,哪些是QSL + * + * @param onGetQsoGrids 当查询结束之后的事件。 + */ + public void getQsoGridQuery(OnGetQsoGrids onGetQsoGrids) { + new GetQsoGrids(db, onGetQsoGrids).execute(); + } + + /** + * 按呼号查询QSL记录 + * + * @param callsign 呼号 + * @param onQueryQSLRecordCallsign 回调 + */ + public void getQSLRecordByCallsign(boolean showAll,int offset,String callsign, int filter, OnQueryQSLRecordCallsign onQueryQSLRecordCallsign) { + new GetQSLByCallsign(showAll,offset,db, callsign, filter, onQueryQSLRecordCallsign).execute(); + } + + /** + * 删除通联呼号 + * + * @param id id号 + */ + public void deleteQSLCallsign(int id) { + new DeleteQSLCallsignByID(db, id).execute(); + } + + /** + * 删除日志 + * + * @param id id号 + */ + public void deleteQSLByID(int id) { + new DeleteQSLByID(db, id).execute(); + } + + /** + * 修改日志的手工确认 + * + * @param isQSL 是否确认 + * @param id ID号 + */ + public void setQSLTableIsQSL(boolean isQSL, int id) { + new SetQSLTableIsQSL(db, id, isQSL).execute(); + } + + public void setQSLCallsignIsQSL(boolean isQSL, int id) { + new SetQSLCallsignIsQSL(db, id, isQSL).execute(); + } + + /** + * 到数据库中查呼号和网格的对应关系,查出后,会把数据写入到GeneralVariables的callsignAndGrids中 + * + * @param callsign 呼号 + */ + public void getCallsignQTH(String callsign) { + new GetCallsignQTH(db).execute(callsign); + } + + +// /** +// * 写字符串到文件 +// * @param file +// * @param data +// */ +// private void writeStrToFile(File file, String data) { +// FileOutputStream fileOutputStream = null; +// try { +// fileOutputStream = new FileOutputStream(file, true); +// fileOutputStream.write(data.getBytes()); +// } catch (IOException e) { +// Log.e(TAG, String.format("写文件出错:%s", e.getMessage())); +// } finally { +// try { +// if (fileOutputStream != null) { +// fileOutputStream.close(); +// } +// } catch (IOException e) { +// Log.e(TAG, String.format("关闭写文件出错:%s", e.getMessage())); +// } +// } +// } + +// /** +// * 把日志数据写入到文件中,用于分享等处理 +// * @param cursor 游标 +// * @param isSWL 是否是swl模式 +// */ +// @SuppressLint({"DefaultLocale", "Range"}) +// public void downQSLTableToFile(File adiFile, Cursor cursor, boolean isSWL){ +// +// writeStrToFile(adiFile,"FT8CN ADIF Export\n"); +// int count =0; +// cursor.moveToPosition(-1); +// while (cursor.moveToNext()) { +// count++; +// writeStrToFile(adiFile,String.format("%s " +// , cursor.getString(cursor.getColumnIndex("call")).length() +// , cursor.getString(cursor.getColumnIndex("call")))); +// if (!isSWL) { +// if (cursor.getInt(cursor.getColumnIndex("isLotW_QSL")) == 1) { +// writeStrToFile(adiFile,"Y "); +// } else { +// writeStrToFile(adiFile,"N "); +// } +// if (cursor.getInt(cursor.getColumnIndex("isQSL")) == 1) { +// writeStrToFile(adiFile,"Y "); +// } else { +// writeStrToFile(adiFile,"N "); +// } +// } else { +// writeStrToFile(adiFile,"Y "); +// } +// +// if (cursor.getString(cursor.getColumnIndex("gridsquare")) != null) { +// writeStrToFile(adiFile,String.format("%s " +// , cursor.getString(cursor.getColumnIndex("gridsquare")).length() +// , cursor.getString(cursor.getColumnIndex("gridsquare")))); +// } +// +// if (cursor.getString(cursor.getColumnIndex("mode")) != null) { +// writeStrToFile(adiFile,String.format("%s " +// , cursor.getString(cursor.getColumnIndex("mode")).length() +// , cursor.getString(cursor.getColumnIndex("mode")))); +// } +// +// if (cursor.getString(cursor.getColumnIndex("rst_sent")) != null) { +// writeStrToFile(adiFile,String.format("%s " +// , cursor.getString(cursor.getColumnIndex("rst_sent")).length() +// , cursor.getString(cursor.getColumnIndex("rst_sent")))); +// } +// +// if (cursor.getString(cursor.getColumnIndex("rst_rcvd")) != null) { +// writeStrToFile(adiFile,String.format("%s " +// , cursor.getString(cursor.getColumnIndex("rst_rcvd")).length() +// , cursor.getString(cursor.getColumnIndex("rst_rcvd")))); +// } +// +// if (cursor.getString(cursor.getColumnIndex("qso_date")) != null) { +// writeStrToFile(adiFile,String.format("%s " +// , cursor.getString(cursor.getColumnIndex("qso_date")).length() +// , cursor.getString(cursor.getColumnIndex("qso_date")))); +// } +// +// if (cursor.getString(cursor.getColumnIndex("time_on")) != null) { +// writeStrToFile(adiFile,String.format("%s " +// , cursor.getString(cursor.getColumnIndex("time_on")).length() +// , cursor.getString(cursor.getColumnIndex("time_on")))); +// } +// +// if (cursor.getString(cursor.getColumnIndex("qso_date_off")) != null) { +// writeStrToFile(adiFile,String.format("%s " +// , cursor.getString(cursor.getColumnIndex("qso_date_off")).length() +// , cursor.getString(cursor.getColumnIndex("qso_date_off")))); +// } +// +// if (cursor.getString(cursor.getColumnIndex("time_off")) != null) { +// writeStrToFile(adiFile,String.format("%s " +// , cursor.getString(cursor.getColumnIndex("time_off")).length() +// , cursor.getString(cursor.getColumnIndex("time_off")))); +// } +// +// if (cursor.getString(cursor.getColumnIndex("band")) != null) { +// writeStrToFile(adiFile,String.format("%s " +// , cursor.getString(cursor.getColumnIndex("band")).length() +// , cursor.getString(cursor.getColumnIndex("band")))); +// } +// +// if (cursor.getString(cursor.getColumnIndex("freq")) != null) { +// writeStrToFile(adiFile,String.format("%s " +// , cursor.getString(cursor.getColumnIndex("freq")).length() +// , cursor.getString(cursor.getColumnIndex("freq")))); +// } +// +// if (cursor.getString(cursor.getColumnIndex("station_callsign")) != null) { +// writeStrToFile(adiFile,String.format("%s " +// , cursor.getString(cursor.getColumnIndex("station_callsign")).length() +// , cursor.getString(cursor.getColumnIndex("station_callsign")))); +// } +// +// if (cursor.getString(cursor.getColumnIndex("my_gridsquare")) != null) { +// writeStrToFile(adiFile,String.format("%s " +// , cursor.getString(cursor.getColumnIndex("my_gridsquare")).length() +// , cursor.getString(cursor.getColumnIndex("my_gridsquare")))); +// } +// +// if (cursor.getColumnIndex("operator") != -1) { +// if (cursor.getString(cursor.getColumnIndex("operator")) != null) { +// writeStrToFile(adiFile,String.format("%s " +// , cursor.getString(cursor.getColumnIndex("operator")).length() +// , cursor.getString(cursor.getColumnIndex("operator")))); +// } +// } +// String comment = cursor.getString(cursor.getColumnIndex("comment")); +// +// //Distance: 99 km +// //在写库的时候,一定要加" km" +// writeStrToFile(adiFile,String.format("%s \n" +// , comment.length() +// , comment)); +// } +// Log.e(TAG,String.format("写入数据%d条",count)); +// +// cursor.close(); +// } + + /** + * 生成ADIF文本内容 + * @param cursor 游标 + * @param isSWL 是否是swl模式 + * @return ADIF文本内容 + */ + @SuppressLint({"Range", "DefaultLocale"}) + public String downQSLTable(Cursor cursor, boolean isSWL) { + StringBuilder logStr = new StringBuilder(); + + logStr.append("FT8CN ADIF Export\n"); + cursor.moveToPosition(-1); + while (cursor.moveToNext()) { + logStr.append(String.format("%s " + , cursor.getString(cursor.getColumnIndex("call")).length() + , cursor.getString(cursor.getColumnIndex("call")))); + if (!isSWL) { + if (cursor.getInt(cursor.getColumnIndex("isLotW_QSL")) == 1) { + logStr.append("Y "); + } else { + logStr.append("N "); + } + if (cursor.getInt(cursor.getColumnIndex("isQSL")) == 1) { + logStr.append("Y "); + } else { + logStr.append("N "); + } + } else { + logStr.append("Y "); + } + + if (cursor.getString(cursor.getColumnIndex("gridsquare")) != null) { + logStr.append(String.format("%s " + , cursor.getString(cursor.getColumnIndex("gridsquare")).length() + , cursor.getString(cursor.getColumnIndex("gridsquare")))); + } + + if (cursor.getString(cursor.getColumnIndex("mode")) != null) { + logStr.append(String.format("%s " + , cursor.getString(cursor.getColumnIndex("mode")).length() + , cursor.getString(cursor.getColumnIndex("mode")))); + } + + if (cursor.getString(cursor.getColumnIndex("rst_sent")) != null) { + logStr.append(String.format("%s " + , cursor.getString(cursor.getColumnIndex("rst_sent")).length() + , cursor.getString(cursor.getColumnIndex("rst_sent")))); + } + + if (cursor.getString(cursor.getColumnIndex("rst_rcvd")) != null) { + logStr.append(String.format("%s " + , cursor.getString(cursor.getColumnIndex("rst_rcvd")).length() + , cursor.getString(cursor.getColumnIndex("rst_rcvd")))); + } + + if (cursor.getString(cursor.getColumnIndex("qso_date")) != null) { + logStr.append(String.format("%s " + , cursor.getString(cursor.getColumnIndex("qso_date")).length() + , cursor.getString(cursor.getColumnIndex("qso_date")))); + } + + if (cursor.getString(cursor.getColumnIndex("time_on")) != null) { + logStr.append(String.format("%s " + , cursor.getString(cursor.getColumnIndex("time_on")).length() + , cursor.getString(cursor.getColumnIndex("time_on")))); + } + + if (cursor.getString(cursor.getColumnIndex("qso_date_off")) != null) { + logStr.append(String.format("%s " + , cursor.getString(cursor.getColumnIndex("qso_date_off")).length() + , cursor.getString(cursor.getColumnIndex("qso_date_off")))); + } + + if (cursor.getString(cursor.getColumnIndex("time_off")) != null) { + logStr.append(String.format("%s " + , cursor.getString(cursor.getColumnIndex("time_off")).length() + , cursor.getString(cursor.getColumnIndex("time_off")))); + } + + if (cursor.getString(cursor.getColumnIndex("band")) != null) { + logStr.append(String.format("%s " + , cursor.getString(cursor.getColumnIndex("band")).length() + , cursor.getString(cursor.getColumnIndex("band")))); + } + + if (cursor.getString(cursor.getColumnIndex("freq")) != null) { + logStr.append(String.format("%s " + , cursor.getString(cursor.getColumnIndex("freq")).length() + , cursor.getString(cursor.getColumnIndex("freq")))); + } + + if (cursor.getString(cursor.getColumnIndex("station_callsign")) != null) { + logStr.append(String.format("%s " + , cursor.getString(cursor.getColumnIndex("station_callsign")).length() + , cursor.getString(cursor.getColumnIndex("station_callsign")))); + } + + if (cursor.getString(cursor.getColumnIndex("my_gridsquare")) != null) { + logStr.append(String.format("%s " + , cursor.getString(cursor.getColumnIndex("my_gridsquare")).length() + , cursor.getString(cursor.getColumnIndex("my_gridsquare")))); + } + + if (cursor.getColumnIndex("operator") != -1) { + if (cursor.getString(cursor.getColumnIndex("operator")) != null) { + logStr.append(String.format("%s " + , cursor.getString(cursor.getColumnIndex("operator")).length() + , cursor.getString(cursor.getColumnIndex("operator")))); + } + } + + String comment = cursor.getString(cursor.getColumnIndex("comment")); + + //Distance: 99 km + //在写库的时候,一定要加" km" + logStr.append(String.format("%s \n" + , comment.length() + , comment)); + } + + cursor.close(); + return logStr.toString(); + } + + /** + * 把已经通联的DXCC分区列出来 + */ + @SuppressLint("Range") + public void getQslDxccToMap() { + new Thread(new Runnable() { + @Override + public void run() { + String querySQL; + Cursor cursor; + Log.d(TAG, "run: 开始导入分区..."); + + //导入已经通联的dxcc + querySQL = "SELECT DISTINCT dl.pp FROM dxcc_grid dg\n" + + "inner join QSLTable q\n" + + "on dg.grid =UPPER(SUBSTR(q.gridsquare,1,4)) LEFT JOIN dxccList dl on dg.dxcc =dl.dxcc"; + cursor = db.rawQuery(querySQL, null); + while (cursor.moveToNext()) { + GeneralVariables.addDxcc(cursor.getString(cursor.getColumnIndex("pp"))); + } + cursor.close(); + + //导入已经通联的CQ分区 + querySQL = "SELECT DISTINCT cl.cqzone as cq FROM cqzoneList cl\n" + + "inner join QSLTable q\n" + + "on cl.grid =UPPER(SUBSTR(q.gridsquare,1,4)) "; + cursor = db.rawQuery(querySQL, null); + while (cursor.moveToNext()) { + GeneralVariables.addCqZone(cursor.getInt(cursor.getColumnIndex("cq"))); + } + cursor.close(); + + //导入已经通联的itu分区 + querySQL = "SELECT DISTINCT il.itu FROM ituList il\n" + + "inner join QSLTable q\n" + + "on il.grid =UPPER(SUBSTR(q.gridsquare,1,4))"; + cursor = db.rawQuery(querySQL, null); + while (cursor.moveToNext()) { + GeneralVariables.addItuZone(cursor.getInt(cursor.getColumnIndex("itu"))); + } + cursor.close(); + + Log.d(TAG, "run: 分区导入完毕..."); + } + }).start(); + + } + + + /** + * 检查通联的呼号是不是存在,如果存在,返回TRUE,并且更新isLotW_QSL, + * + * @param record 记录 + * @return 是否存在 + */ + @SuppressLint("Range") + public boolean checkQSLCallsign(QSLRecord record) { + QSLRecord newRecord = record; + newRecord.id = -1; + //检查是不是已经存在呼号了 + String querySQL = "select * from QslCallsigns WHERE (callsign=?)" + + "and (startTime=?) and(finishTime=?)" + + "and(mode=?)"; + + Cursor cursor = db.rawQuery(querySQL, new String[]{ + record.getToCallsign() + , record.getStartTime() + , record.getEndTime() + , record.getMode()}); + if (cursor.getCount() > 0) { + cursor.moveToFirst(); + newRecord.isLotW_QSL = cursor.getInt(cursor.getColumnIndex("isLotW_QSL")) == 1 + || record.isLotW_QSL; + newRecord.id = cursor.getLong(cursor.getColumnIndex("ID")); + } + cursor.close(); +// if (newRecord.id != -1) {//说明已经存在记录了 +// querySQL = "UPDATE QslCallsigns set isLotW_QSL=? WHERE ID=?"; +// db.execSQL(querySQL, new Object[]{newRecord.isLotW_QSL ? "1" : "0", newRecord.id}); +// } + return newRecord.id != -1;// + } + + @SuppressLint("Range") + public boolean checkIsQSL(QSLRecord record) { + QSLRecord newRecord = record; + newRecord.id = -1; + //检查是不是已经存在日志记录了 + String querySQL = "select * from QSLTable WHERE (call=?)" + + "and (qso_date=?) and(time_on=?)" + + "and(mode=?)"; + + Cursor cursor = db.rawQuery(querySQL, new String[]{ + record.getToCallsign() + , record.getQso_date() + , record.getTime_on() + , record.getMode()}); + if (cursor.getCount() > 0) { + cursor.moveToFirst(); + newRecord.isLotW_QSL = cursor.getInt(cursor.getColumnIndex("isLotW_QSL")) == 1 + || record.isLotW_QSL; + newRecord.id = cursor.getLong(cursor.getColumnIndex("id")); + } + cursor.close(); + +// if (newRecord.id != -1) {//说明已经存在记录了 +// querySQL = "UPDATE QSLTable set isLotW_QSL=? WHERE ID=?"; +// db.execSQL(querySQL, new Object[]{newRecord.isLotW_QSL ? "1" : "0", newRecord.id}); +// } + return newRecord.id != -1;// + } + + @SuppressLint("Range") + public boolean doInsertQSLData(QSLRecord record,AfterInsertQSLData afterInsertQSLData) { + if (record.getToCallsign() == null) { + if (afterInsertQSLData!=null){ + afterInsertQSLData.doAfterInsert(true,true);//说明是无效的QSL + } + return false; + } + + String querySQL; + if (!checkQSLCallsign(record)) {//如果不存在记录,就添加 + querySQL = "INSERT INTO QslCallsigns (callsign" + + ",isQSL,isLotW_import,isLotW_QSL" + + ",startTime,finishTime,mode,grid,band,band_i)" + + "values(?,?,?,?,?,?,?,?,?,?)"; + db.execSQL(querySQL, new Object[]{record.getToCallsign() + , record.isQSL ? 1 : 0//是否手工确认 + , record.isLotW_import ? 1 : 0//是否lotw导入 + , record.isLotW_QSL ? 1 : 0//是否lotw确认 + , record.getStartTime() + , record.getEndTime() + , record.getMode() + , record.getToMaidenGrid() + , BaseRigOperation.getFrequencyAllInfo(record.getBandFreq()) + , record.getBandFreq()}); + } else { + if (record.isQSL) { + db.execSQL("UPDATE QslCallsigns SET isQSL=? " + + "WHERE (callsign=?)AND(startTime=?)AND(finishTime=?)AND(mode=?)" + , new Object[]{1, record.getToCallsign(), record.getStartTime() + , record.getEndTime(), record.getMode()}); + } + if (record.isLotW_import) { + db.execSQL("UPDATE QslCallsigns SET isLotW_import=? " + + "WHERE (callsign=?)AND(startTime=?)AND(finishTime=?)AND(mode=?)" + , new Object[]{1, record.getToCallsign(), record.getStartTime() + , record.getEndTime(), record.getMode()}); + } + + if (record.isLotW_QSL) { + db.execSQL("UPDATE QslCallsigns SET isLotW_QSL=? " + + "WHERE (callsign=?)AND(startTime=?)AND(finishTime=?)AND(mode=?)" + , new Object[]{1, record.getToCallsign(), record.getStartTime() + , record.getEndTime(), record.getMode()}); + } + if (record.getToMaidenGrid().length() >= 4) { + db.execSQL("UPDATE QslCallsigns SET grid=? " + + "WHERE (callsign=?)AND(startTime=?)AND(finishTime=?)AND(mode=?)" + , new Object[]{record.getToMaidenGrid(), record.getToCallsign(), record.getStartTime() + , record.getEndTime(), record.getMode()}); + } + + } + + + if (!checkIsQSL(record)) {//如果不存在日志数据就添加 + querySQL = "INSERT INTO QSLTable(call, isQSL,isLotW_import,isLotW_QSL,gridsquare, mode, rst_sent, rst_rcvd, qso_date, " + + "time_on, qso_date_off, time_off, band, freq, station_callsign, my_gridsquare," + + "comment)VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; + + db.execSQL(querySQL, new String[]{record.getToCallsign() + , String.valueOf(record.isQSL ? 1 : 0) + , String.valueOf(record.isLotW_import ? 1 : 0) + , String.valueOf(record.isLotW_QSL ? 1 : 0) + , record.getToMaidenGrid() + , record.getMode() + , String.valueOf(record.getSendReport()) + , String.valueOf(record.getReceivedReport()) + , record.getQso_date() + , record.getTime_on() + + , record.getQso_date_off() + , record.getTime_off() + , record.getBandLength()//波长//RigOperationConstant.getMeterFromFreq(qslRecord.getBandFreq()) + , BaseRigOperation.getFrequencyFloat(record.getBandFreq()) + , record.getMyCallsign() + , record.getMyMaidenGrid() + , record.getComment()}); + if (afterInsertQSLData!=null){ + afterInsertQSLData.doAfterInsert(false,true);//说明是新的QSL + } + + } else { + if (record.isQSL) { + db.execSQL("UPDATE QSLTable SET isQSL=? " + + " WHERE (call=?) and (qso_date=?) and(time_on=?) and(mode=?)" + , new Object[]{1, record.getToCallsign() + , record.getQso_date() + , record.getTime_on() + , record.getMode()}); + } + if (record.isLotW_import) { + db.execSQL("UPDATE QSLTable SET isLotW_import=? " + + " WHERE (call=?) and (qso_date=?) and(time_on=?) and(mode=?)" + , new Object[]{1, record.getToCallsign() + , record.getQso_date() + , record.getTime_on() + , record.getMode()}); + } + if (record.isLotW_QSL) { + db.execSQL("UPDATE QSLTable SET isLotW_QSL=? " + + " WHERE (call=?) and (qso_date=?) and(time_on=?) and(mode=?)" + , new Object[]{1, record.getToCallsign() + , record.getQso_date() + , record.getTime_on() + , record.getMode()}); + } + if (record.getToMaidenGrid().length() >= 4) { + db.execSQL("UPDATE QSLTable SET gridsquare=? " + + " WHERE (call=?) and (qso_date=?) and(time_on=?) and(mode=?)" + , new Object[]{record.getToMaidenGrid(), record.getToCallsign() + , record.getQso_date() + , record.getTime_on() + , record.getMode()}); + } + if (record.getMyMaidenGrid().length() >= 4) { + db.execSQL("UPDATE QSLTable SET my_gridsquare=? " + + " WHERE (call=?) and (qso_date=?) and(time_on=?) and(mode=?)" + , new Object[]{record.getMyMaidenGrid(), record.getToCallsign() + , record.getQso_date() + , record.getTime_on() + , record.getMode()}); + } + if (record.getSendReport() > -100) { + db.execSQL("UPDATE QSLTable SET rst_sent=? " + + " WHERE (call=?) and (qso_date=?) and(time_on=?) and(mode=?)" + , new Object[]{record.getSendReport(), record.getToCallsign() + , record.getQso_date() + , record.getTime_on() + , record.getMode()}); + } + if (record.getReceivedReport() > -100) { + db.execSQL("UPDATE QSLTable SET rst_rcvd=? " + + " WHERE (call=?) and (qso_date=?) and(time_on=?) and(mode=?)" + , new Object[]{record.getReceivedReport(), record.getToCallsign() + , record.getQso_date() + , record.getTime_on() + , record.getMode()}); + } + + if (afterInsertQSLData!=null){ + afterInsertQSLData.doAfterInsert(false,false);//说明已经存在,需要更新的QSL + } + } + return true; + } + + + /** + * 查询配置信息的类 + */ + static class QueryConfig extends AsyncTask { + private final SQLiteDatabase db; + private final String KeyName; + private final OnAfterQueryConfig afterQueryConfig; + + public QueryConfig(SQLiteDatabase db, String keyName, OnAfterQueryConfig afterQueryConfig) { + this.db = db; + KeyName = keyName; + this.afterQueryConfig = afterQueryConfig; + } + + @Override + protected void onPreExecute() { + super.onPreExecute(); + if (afterQueryConfig != null) { + afterQueryConfig.doOnBeforeQueryConfig(KeyName); + } + } + + @SuppressLint("Range") + @Override + protected Void doInBackground(Void... voids) { + String querySQL = "select keyName,Value from config where KeyName =?"; + Cursor cursor = db.rawQuery(querySQL, new String[]{KeyName.toString()}); + if (cursor.moveToFirst()) { + if (afterQueryConfig != null) { + afterQueryConfig.doOnAfterQueryConfig(KeyName, cursor.getString(cursor.getColumnIndex("Value"))); + } + } else { + if (afterQueryConfig != null) { + afterQueryConfig.doOnAfterQueryConfig(KeyName, ""); + } + } + cursor.close(); + return null; + } + } + + static class QueryCallsign extends AsyncTask { + private final SQLiteDatabase db; + private final String tableName; + private final String fieldName; + private final String callSign; + private OnGetCallsign onGetCallsign; + + public QueryCallsign(SQLiteDatabase db, String tableName, String fieldName + , String callSign, OnGetCallsign onGetCallsign) { + this.db = db; + this.tableName = tableName; + this.fieldName = fieldName; + this.callSign = callSign; + this.onGetCallsign = onGetCallsign; + } + + @SuppressLint("Range") + @Override + protected Void doInBackground(Void... voids) { + String sql = String.format("select count(%s) as a FROM %s where %s=\"%s\" limit 1" + , fieldName, tableName, fieldName, callSign); + Cursor cursor = db.rawQuery(sql, null); + if (cursor.moveToFirst()) { + if (onGetCallsign != null) { + onGetCallsign.doOnAfterGetCallSign(cursor.getInt(cursor.getColumnIndex("a")) > 0); + } + } else { + if (onGetCallsign != null) { + onGetCallsign.doOnAfterGetCallSign(false); + } + + } + cursor.close(); + return null; + } + } + + /** + * 写配置信息的类 + */ + static class WriteConfig extends AsyncTask { + private final SQLiteDatabase db; + private final String KeyName; + private final String Value; + private final OnAfterWriteConfig afterWriteConfig; + + public WriteConfig(SQLiteDatabase db, String keyName, String Value, OnAfterWriteConfig afterWriteConfig) { + this.db = db; + this.KeyName = keyName; + this.afterWriteConfig = afterWriteConfig; + this.Value = Value; + } + + @SuppressLint("Range") + @Override + protected Void doInBackground(Void... voids) { + String querySQL = "DELETE FROM config where KeyName =?"; + db.execSQL(querySQL, new String[]{KeyName.toString()}); + querySQL = "INSERT INTO config (KeyName,Value)Values(?,?)"; + db.execSQL(querySQL, new String[]{KeyName.toString(), Value.toString()}); + if (afterWriteConfig != null) { + afterWriteConfig.doOnAfterWriteConfig(true); + } + return null; + } + } + + /** + * 把消息写到数据库 + */ + static class WriteMessages extends AsyncTask { + private final SQLiteDatabase db; + private ArrayList messages; + + public WriteMessages(SQLiteDatabase db, ArrayList messages) { + this.db = db; + this.messages = messages; + } + + @Override + protected Void doInBackground(Void... voids) { + String sql = "INSERT INTO SWLMessages(I3,N3,Protocol,UTC,SNR,TIME_SEC,FREQ,CALL_FROM" + + ",CALL_TO,EXTRAL,REPORT,BAND)\n" + + "VALUES(?,?,?,?,?,?,?,?,?,?,?,?)"; + for (Ft8Message message : messages) {//只对与我有关的消息做保存 + db.execSQL(sql, new Object[]{message.i3, message.n3, "FT8" + ,UtcTimer.getDatetimeYYYYMMDD_HHMMSS(message.utcTime) + , message.snr, message.time_sec, Math.round(message.freq_hz) + , message.callsignFrom, message.callsignTo, message.extraInfo + , message.report, message.band}); + + } + return null; + } + } + + /** + * 把关注的呼号写到数据库 + */ + static class AddFollowCallSign extends AsyncTask { + private final SQLiteDatabase db; + private final String callSign; + + public AddFollowCallSign(SQLiteDatabase db, String callSign) { + this.db = db; + this.callSign = callSign; + } + + @SuppressLint("Range") + @Override + protected Void doInBackground(Void... voids) { + String querySQL = "INSERT OR IGNORE INTO followCallsigns (callsign)values(?)"; + db.execSQL(querySQL, new String[]{callSign}); + return null; + } + } + + /** + * 向呼号网格对应表中写数据,AsyncTask中的String,是多参数,以数组形式给doInBackground + * 所以,写入数据第一个元素是呼号,第二个是网格 + */ + static class AddCallsignQTH extends AsyncTask { + private final SQLiteDatabase db; + + public AddCallsignQTH(SQLiteDatabase db) { + this.db = db; + } + + @Override + protected Void doInBackground(String... strings) { + if (strings.length == 2) { + String querySQL = "INSERT OR REPLACE INTO CallsignQTH (callsign,grid,updateTime)" + + "VALUES (Upper(?),?,?)"; + db.execSQL(querySQL, new Object[]{strings[0], strings[1], System.currentTimeMillis()}); + } + return null; + } + } + + static class Add_SWL_QSO_Info extends AsyncTask{ + private final DatabaseOpr databaseOpr; + private QSLRecord qslRecord; + public Add_SWL_QSO_Info(DatabaseOpr opr, QSLRecord qslRecord) { + this.databaseOpr = opr; + this.qslRecord = qslRecord; + } + @SuppressLint("Range") + @Override + protected Void doInBackground(Void... voids) { + String querySQL; + //删除之前重复的记录 + querySQL = "DELETE FROM SWLQSOTable where ([call]=?) and (station_callsign=?) and (qso_date=?) and(time_on=?) and (freq=?)"; + databaseOpr.db.execSQL(querySQL, new String[]{ + qslRecord.getToCallsign() + , qslRecord.getMyCallsign() + , qslRecord.getQso_date() + , qslRecord.getTime_on() + , BaseRigOperation.getFrequencyFloat(qslRecord.getBandFreq()) + }); + //添加记录 + querySQL = "INSERT INTO SWLQSOTable([call], gridsquare, mode, rst_sent, rst_rcvd, qso_date, " + + "time_on, qso_date_off, time_off, band, freq, station_callsign, my_gridsquare,operator,comment)\n" + + "VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; + + databaseOpr.db.execSQL(querySQL, new String[]{qslRecord.getToCallsign() + , qslRecord.getToMaidenGrid() + , qslRecord.getMode() + , String.valueOf(qslRecord.getSendReport()) + , String.valueOf(qslRecord.getReceivedReport()) + , qslRecord.getQso_date() + , qslRecord.getTime_on() + + , qslRecord.getQso_date_off() + , qslRecord.getTime_off() + , qslRecord.getBandLength()//波长//RigOperationConstant.getMeterFromFreq(qslRecord.getBandFreq()) + , BaseRigOperation.getFrequencyFloat(qslRecord.getBandFreq()) + , qslRecord.getMyCallsign() + , qslRecord.getMyMaidenGrid() + , GeneralVariables.myCallsign//我的呼号,不是双方的呼号 + , qslRecord.getComment()}); + + + return null; + } + + } + + /** + * 把QSL成功的呼号写到库中 + */ + static class AddQSL_Info extends AsyncTask { + //private final SQLiteDatabase db; + private final DatabaseOpr databaseOpr; + private QSLRecord qslRecord; + + public AddQSL_Info(DatabaseOpr opr, QSLRecord qslRecord) { + this.databaseOpr = opr; + this.qslRecord = qslRecord; + } + + + @SuppressLint("Range") + @Override + protected Void doInBackground(Void... voids) { + databaseOpr.doInsertQSLData(qslRecord,null);//添加日志和通联成功的呼号 + return null; + } + } + + + /** + * 从数据库中删除关注的呼号 + */ + static class DeleteFollowCallsign extends AsyncTask { + private final SQLiteDatabase db; + private final String callSign; + + public DeleteFollowCallsign(SQLiteDatabase db, String callSign) { + this.db = db; + this.callSign = callSign; + } + + @SuppressLint("Range") + @Override + protected Void doInBackground(Void... voids) { + String querySQL = "DELETE from followCallsigns WHERE callsign=?"; + db.execSQL(querySQL, new String[]{callSign}); + return null; + } + } + + /** + * 向呼号与网格对应关系表中查网格,参数是呼号 + */ + static class GetCallsignQTH extends AsyncTask { + private final SQLiteDatabase db; + + GetCallsignQTH(SQLiteDatabase db) { + this.db = db; + } + + @SuppressLint("Range") + @Override + protected Void doInBackground(String... strings) { + if (strings.length == 0) return null; + String querySQL = "select grid from CallsignQTH cq \n" + + "WHERE callsign =?"; + Cursor cursor = db.rawQuery(querySQL, new String[]{strings[0]}); + if (cursor.moveToFirst()) { + GeneralVariables.addCallsignAndGrid(strings[0] + , cursor.getString(cursor.getColumnIndex("grid"))); + } + cursor.close(); + + return null; + } + } + + static class GetMessageLogTotal extends AsyncTask { + private final SQLiteDatabase db; + private final OnAfterQueryFollowCallsigns onAffterQueryFollowCallsigns; + + public GetMessageLogTotal(SQLiteDatabase db, OnAfterQueryFollowCallsigns onAffterQueryFollowCallsigns) { + this.db = db; + this.onAffterQueryFollowCallsigns = onAffterQueryFollowCallsigns; + } + + @Override + @SuppressLint({"Range", "DefaultLocale"}) + protected Void doInBackground(Void... voids) { + String querySQL = "SELECT BAND ,count(*) as c from SWLMessages m group by BAND order by BAND "; + Cursor cursor = db.rawQuery(querySQL, new String[]{}); + ArrayList callsigns = new ArrayList<>(); + callsigns.add(GeneralVariables.getStringFromResource(R.string.band_total)); + callsigns.add("---------------------------------------"); + int sum = 0; + while (cursor.moveToNext()) { + long s = cursor.getLong(cursor.getColumnIndex("BAND")); //获取频段 + int total = cursor.getInt(cursor.getColumnIndex("c")); //获取数量 + callsigns.add(String.format("%.3fMHz \t %d", s / 1000000f, total)); + sum = sum + total; + } + callsigns.add(String.format("-----------Total %d -----------", sum)); + cursor.close(); + if (onAffterQueryFollowCallsigns != null) { + onAffterQueryFollowCallsigns.doOnAfterQueryFollowCallsigns(callsigns); + } + return null; + } + } + + + static class GetSWLQsoTotal extends AsyncTask { + private final SQLiteDatabase db; + private final OnAfterQueryFollowCallsigns onAffterQueryFollowCallsigns; + + public GetSWLQsoTotal(SQLiteDatabase db, OnAfterQueryFollowCallsigns onAffterQueryFollowCallsigns) { + this.db = db; + this.onAffterQueryFollowCallsigns = onAffterQueryFollowCallsigns; + } + + @Override + @SuppressLint({"Range", "DefaultLocale"}) + protected Void doInBackground(Void... voids) { + String querySQL = "select count(*) as c,substr(qso_date_off,1,6) as t \n" + + "from SWLQSOTable s\n" + + "group by substr(qso_date_off,1,6)"; + Cursor cursor = db.rawQuery(querySQL, new String[]{}); + ArrayList callsigns = new ArrayList<>(); + //callsigns.add(GeneralVariables.getStringFromResource(R.string.band_total)); + callsigns.add("---------------------------------------"); + int sum = 0; + while (cursor.moveToNext()) { + String date = cursor.getString(cursor.getColumnIndex("t")); //获取频段 + int total = cursor.getInt(cursor.getColumnIndex("c")); //获取数量 + callsigns.add(String.format("%s \t %d ", date, total)); + sum = sum + total; + } + callsigns.add(String.format("-----------Total %d -----------", sum)); + cursor.close(); + if (onAffterQueryFollowCallsigns != null) { + onAffterQueryFollowCallsigns.doOnAfterQueryFollowCallsigns(callsigns); + } + return null; + } + } + + + + /** + * 从数据库中获取关注的呼号类 + */ + static class GetFollowCallSigns extends AsyncTask { + private final SQLiteDatabase db; + private final OnAfterQueryFollowCallsigns onAffterQueryFollowCallsigns; + + public GetFollowCallSigns(SQLiteDatabase db, OnAfterQueryFollowCallsigns onAffterQueryFollowCallsigns) { + this.db = db; + this.onAffterQueryFollowCallsigns = onAffterQueryFollowCallsigns; + } + + @Override + protected Void doInBackground(Void... voids) { + String querySQL = "select callsign from followCallsigns"; + Cursor cursor = db.rawQuery(querySQL, new String[]{}); + ArrayList callsigns = new ArrayList<>(); + while (cursor.moveToNext()) { + @SuppressLint("Range") + String s = cursor.getString(cursor.getColumnIndex("callsign")); //获取第一列的值,第一列的索引从0开始 + if (s != null) { + callsigns.add(s); + } + } + cursor.close(); + if (onAffterQueryFollowCallsigns != null) { + onAffterQueryFollowCallsigns.doOnAfterQueryFollowCallsigns(callsigns); + } + return null; + } + } + + public static class GetCallsignMapGrid extends AsyncTask { + SQLiteDatabase db; + + public GetCallsignMapGrid(SQLiteDatabase db) { + this.db = db; + } + + @SuppressLint("Range") + @Override + protected Void doInBackground(Void... voids) { + + String querySQL = "select DISTINCT callsign,grid from QslCallsigns qc \n" + + "where LENGTH(grid)>3\n" + + "order by ID "; + Cursor cursor = db.rawQuery(querySQL, null); + while (cursor.moveToNext()) { + GeneralVariables.addCallsignAndGrid(cursor.getString(cursor.getColumnIndex("callsign")) + , cursor.getString(cursor.getColumnIndex("grid"))); + + } + cursor.close(); + return null; + } + } + + public interface OnGetQsoGrids { + void onAfterQuery(HashMap grids); + } + + + static class GetQsoGrids extends AsyncTask { + SQLiteDatabase db; + HashMap grids = new HashMap<>(); + OnGetQsoGrids onGetQsoGrids; + + public GetQsoGrids(SQLiteDatabase db, OnGetQsoGrids onGetQsoGrids) { + this.db = db; + this.onGetQsoGrids = onGetQsoGrids; + } + + @SuppressLint("Range") + @Override + protected Void doInBackground(Void... voids) { + + String querySQL = "select qc.gridsquare ,count(*) as cc,SUM(isQSL)+SUM(isLotW_QSL)as isQSL\n" + + "from QSLTable qc\n" + + "WHERE LENGTH (qc.gridsquare)>2 \n" + + "group by qc.gridsquare\n" + + "ORDER by SUM(isQSL)+SUM(isLotW_QSL) desc"; + Cursor cursor = db.rawQuery(querySQL, null); + + while (cursor.moveToNext()) { + grids.put(cursor.getString(cursor.getColumnIndex("gridsquare")) + , cursor.getInt(cursor.getColumnIndex("isQSL")) != 0); + + } + cursor.close(); + if (onGetQsoGrids != null) { + onGetQsoGrids.onAfterQuery(grids); + } + return null; + } + } + + static class GetQSLByCallsign extends AsyncTask { + boolean showAll; + int offset; + SQLiteDatabase db; + String callsign; + int filter; + OnQueryQSLRecordCallsign onQueryQSLRecordCallsign; + + public GetQSLByCallsign(boolean showAll,int offset,SQLiteDatabase db, String callsign, int queryFilter, OnQueryQSLRecordCallsign onQueryQSLRecordCallsign) { + this.showAll=showAll; + this.offset=offset; + this.db = db; + this.callsign = callsign; + this.filter = queryFilter; + this.onQueryQSLRecordCallsign = onQueryQSLRecordCallsign; + } + + @SuppressLint("Range") + @Override + protected Void doInBackground(Void... voids) { + String filterStr; + switch (filter) { + case 1: + filterStr = "and((isQSL =1)or(isLotW_QSL =1))\n"; + break; + case 2: + filterStr = "and((isQSL =0)and(isLotW_QSL =0))\n"; + break; + default: + filterStr = ""; + } + String limitStr=""; + if (!showAll){ + limitStr="limit 100 offset "+offset; + } + String querySQL = "select * from QSLTable where ([call] like ?) \n" + + filterStr + + " ORDER BY qso_date DESC, time_off DESC\n"+ + //" order by ID desc\n"+ + limitStr; + Cursor cursor = db.rawQuery(querySQL, new String[]{"%" + callsign + "%"}); + ArrayList records = new ArrayList<>(); + while (cursor.moveToNext()) { + QSLRecordStr record = new QSLRecordStr(); + record.id = cursor.getInt(cursor.getColumnIndex("id")); + record.setCall(cursor.getString(cursor.getColumnIndex("call"))); + record.isQSL = cursor.getInt(cursor.getColumnIndex("isQSL")) == 1; + record.isLotW_import = cursor.getInt(cursor.getColumnIndex("isLotW_import")) == 1; + record.isLotW_QSL = cursor.getInt(cursor.getColumnIndex("isLotW_QSL")) == 1; + record.setGridsquare(cursor.getString(cursor.getColumnIndex("gridsquare"))); + record.setMode(cursor.getString(cursor.getColumnIndex("mode"))); + record.setRst_sent(cursor.getString(cursor.getColumnIndex("rst_sent"))); + record.setRst_rcvd(cursor.getString(cursor.getColumnIndex("rst_rcvd"))); + record.setTime_on(String.format("%s-%s" + , cursor.getString(cursor.getColumnIndex("qso_date")) + , cursor.getString(cursor.getColumnIndex("time_on")))); + + record.setTime_off(String.format("%s-%s" + , cursor.getString(cursor.getColumnIndex("qso_date_off")) + , cursor.getString(cursor.getColumnIndex("time_off")))); + record.setBand(cursor.getString(cursor.getColumnIndex("band")));//波长 + record.setFreq(cursor.getString(cursor.getColumnIndex("freq")));//频率 + record.setStation_callsign(cursor.getString(cursor.getColumnIndex("station_callsign"))); + record.setMy_gridsquare(cursor.getString(cursor.getColumnIndex("my_gridsquare"))); + record.setComment(cursor.getString(cursor.getColumnIndex("comment"))); + records.add(record); + } + cursor.close(); + if (onQueryQSLRecordCallsign != null) { + onQueryQSLRecordCallsign.afterQuery(records); + } + return null; + } + } + + /** + * 通过呼号查询联通成功的呼号 + */ + static class GetQLSCallsignByCallsign extends AsyncTask { + SQLiteDatabase db; + String callsign; + int filter; + OnQueryQSLCallsign onQueryQSLCallsign; + int offset; + boolean showAll; + + public GetQLSCallsignByCallsign(boolean showAll,int offset,SQLiteDatabase db, String callsign, int queryFilter, OnQueryQSLCallsign onQueryQSLCallsign) { + this.showAll=showAll; + this.offset=offset; + this.db = db; + this.callsign = callsign; + this.filter = queryFilter; + this.onQueryQSLCallsign = onQueryQSLCallsign; + } + + @SuppressLint("Range") + @Override + protected Void doInBackground(Void... voids) { + String filterStr; + switch (filter) { + case 1: + filterStr = "and((q.isQSL =1)or(q.isLotW_QSL =1))\n"; + break; + case 2: + filterStr = "and((q.isQSL =0)and(q.isLotW_QSL =0))\n"; + break; + default: + filterStr = ""; + } + String limitStr=""; + if (!showAll){ + limitStr="limit 100 offset "+offset; + } + String querySQL = "select q.[call] as callsign ,q.gridsquare as grid" + + ",q.band||\"(\"||q.freq||\" MHz)\" as band \n" + + ",q.qso_date as last_time ,q.mode ,q.isQSL,q.isLotW_QSL\n" + + "from QSLTable q inner join QSLTable q2 ON q.id =q2.id \n" + + "where (q.[call] like ?)\n" + + filterStr + + "group by q.[call] ,q.gridsquare,q.freq ,q.qso_date,q.band\n" + + ",q.mode,q.isQSL,q.isLotW_QSL\n" + + "HAVING q.qso_date =MAX(q2.qso_date) \n" + + "order by q.qso_date desc\n"+ + limitStr; + + + Cursor cursor = db.rawQuery(querySQL, new String[]{"%" + callsign + "%"}); + ArrayList records = new ArrayList<>(); + while (cursor.moveToNext()) { + QSLCallsignRecord record = new QSLCallsignRecord(); + record.setCallsign(cursor.getString(cursor.getColumnIndex("callsign"))); + record.isQSL = cursor.getInt(cursor.getColumnIndex("isQSL")) == 1; + record.isLotW_QSL = cursor.getInt(cursor.getColumnIndex("isLotW_QSL")) == 1; + record.setLastTime(cursor.getString(cursor.getColumnIndex("last_time"))); + record.setMode(cursor.getString(cursor.getColumnIndex("mode"))); + record.setGrid(cursor.getString(cursor.getColumnIndex("grid"))); + record.setBand(cursor.getString(cursor.getColumnIndex("band"))); + records.add(record); + } + cursor.close(); + if (onQueryQSLCallsign != null) { + onQueryQSLCallsign.afterQuery(records); + } + return null; + } + } + + + /** + * 获取通联过的呼号 + */ + @SuppressLint("DefaultLocale") + static class GetAllQSLCallsign { + public static void get(SQLiteDatabase db) { + + //String querySQL = "select distinct [call] from QSLTable where freq=?"; + //改为以波长BAND取通联过的呼号 + String querySQL = "select distinct [call] from QSLTable where band=?"; + Cursor cursor = db.rawQuery(querySQL, new String[]{ + BaseRigOperation.getMeterFromFreq(GeneralVariables.band)}); + ArrayList callsigns = new ArrayList<>(); + while (cursor.moveToNext()) { + @SuppressLint("Range") + String s = cursor.getString(cursor.getColumnIndex("call")); + if (s != null) { + callsigns.add(s); + } + } + cursor.close(); + GeneralVariables.QSL_Callsign_list = callsigns; + + querySQL = "select distinct [call] from QSLTable where band<>?"; + cursor = db.rawQuery(querySQL, new String[]{ + BaseRigOperation.getMeterFromFreq(GeneralVariables.band)}); + + ArrayList other_callsigns = new ArrayList<>(); + while (cursor.moveToNext()) { + @SuppressLint("Range") + String s = cursor.getString(cursor.getColumnIndex("call")); + if (s != null) { + other_callsigns.add(s); + } + } + cursor.close(); + GeneralVariables.QSL_Callsign_list_other_band = other_callsigns; + } + + } + + + /** + * 通过ID删除通联呼号 + */ + static class DeleteQSLCallsignByID extends AsyncTask { + private final SQLiteDatabase db; + private final int id; + + public DeleteQSLCallsignByID(SQLiteDatabase db, int id) { + this.db = db; + this.id = id; + } + + + @Override + protected Void doInBackground(Void... voids) { + db.execSQL("delete from QslCallsigns where id=?", new Object[]{id}); + return null; + } + } + + + /** + * 通过ID删除日志 + */ + static class DeleteQSLByID extends AsyncTask { + private final SQLiteDatabase db; + private final int id; + + public DeleteQSLByID(SQLiteDatabase db, int id) { + this.db = db; + this.id = id; + } + + @Override + protected Void doInBackground(Void... voids) { + db.execSQL("delete from QSLTable where id=?", new Object[]{id}); + return null; + } + } + + static class SetQSLCallsignIsQSL extends AsyncTask { + private final SQLiteDatabase db; + private final int id; + private final boolean isQSL; + + public SetQSLCallsignIsQSL(SQLiteDatabase db, int id, boolean isQSL) { + this.db = db; + this.id = id; + this.isQSL = isQSL; + } + + @Override + protected Void doInBackground(Void... voids) { + db.execSQL("UPDATE QslCallsigns SET isQSL=? where id=?", new Object[]{isQSL ? "1" : "0", id}); + return null; + } + } + + /** + * 设置日志手工确认 + */ + static class SetQSLTableIsQSL extends AsyncTask { + private final SQLiteDatabase db; + private final int id; + private final boolean isQSL; + + public SetQSLTableIsQSL(SQLiteDatabase db, int id, boolean isQSL) { + this.db = db; + this.id = id; + this.isQSL = isQSL; + } + + @Override + protected Void doInBackground(Void... voids) { + db.execSQL("UPDATE QSLTable SET isQSL=? where id=?", new Object[]{isQSL ? "1" : "0", id}); + return null; + } + } + + + /** + * 查询全部通联成功的呼号,以通联时的频段为条件 + */ + static class LoadAllQSLCallsigns extends AsyncTask { + private final SQLiteDatabase db; + + public LoadAllQSLCallsigns(SQLiteDatabase db) { + this.db = db; + } + + @Override + protected Void doInBackground(Void... voids) { + GetAllQSLCallsign.get(db);//获取通联过的呼号 + return null; + } + } + + static class GetAllConfigParameter extends AsyncTask { + private final SQLiteDatabase db; + private OnAfterQueryConfig onAfterQueryConfig; + + public GetAllConfigParameter(SQLiteDatabase db, OnAfterQueryConfig onAfterQueryConfig) { + this.db = db; + this.onAfterQueryConfig = onAfterQueryConfig; + } + + @SuppressLint("Range") + private String getConfigByKey(String KeyName) { + String querySQL = "select keyName,Value from config where KeyName =?"; + Cursor cursor = db.rawQuery(querySQL, new String[]{KeyName}); + String result = ""; + if (cursor.moveToFirst()) { + result = cursor.getString(cursor.getColumnIndex("Value")); + } + cursor.close(); + return result; + } + + @SuppressLint("Range") + @Override + protected Void doInBackground(Void... voids) { + + String querySQL = "select keyName,Value from config "; + Cursor cursor = db.rawQuery(querySQL, null); + while (cursor.moveToNext()) { + @SuppressLint("Range") + //String result = ""; + String result = cursor.getString(cursor.getColumnIndex("Value")); + String name = cursor.getString(cursor.getColumnIndex("KeyName")); + + if (name.equalsIgnoreCase("grid")) { + GeneralVariables.setMyMaidenheadGrid(result); + } + if (name.equalsIgnoreCase("callsign")) { + GeneralVariables.myCallsign = result; + String callsign = GeneralVariables.myCallsign; + if (callsign.length() > 0) { + Ft8Message.hashList.addHash(FT8Package.getHash22(callsign), callsign); + Ft8Message.hashList.addHash(FT8Package.getHash12(callsign), callsign); + Ft8Message.hashList.addHash(FT8Package.getHash10(callsign), callsign); + if (callsign.contains("/")) { + String shortCallsign = GeneralVariables.getShortCallsign(callsign); + Ft8Message.hashList.addHash(FT8Package.getHash22(shortCallsign), shortCallsign); + Ft8Message.hashList.addHash(FT8Package.getHash12(shortCallsign), shortCallsign); + Ft8Message.hashList.addHash(FT8Package.getHash10(shortCallsign), shortCallsign); + } + } + } + if (name.equalsIgnoreCase("toModifier")) { + GeneralVariables.toModifier = result; + } + if (name.equalsIgnoreCase("freq")) { + float freq = 1000; + try { + freq = Float.parseFloat(result); + } catch (Exception e) { + Log.e(TAG, "doInBackground: " + e.getMessage()); + } + //GeneralVariables.setBaseFrequency(result.equals("") ? 1000 : Float.parseFloat(result)); + GeneralVariables.setBaseFrequency(freq); + } + if (name.equalsIgnoreCase("synFreq")) { + GeneralVariables.synFrequency = !(result.equals("") || result.equals("0")); + } + if (name.equalsIgnoreCase("transDelay")) { + if (result.matches("^\\d{1,4}$")) {//正则表达式,1-4位长度的数字 + GeneralVariables.transmitDelay = Integer.parseInt(result); + } else { + GeneralVariables.transmitDelay = FT8Common.FT8_TRANSMIT_DELAY; + } + } + + if (name.equalsIgnoreCase("civ")) { + GeneralVariables.civAddress = result.equals("") ? 0xa4 : Integer.parseInt(result, 16); + } + if (name.equalsIgnoreCase("baudRate")) { + GeneralVariables.baudRate = result.equals("") ? 19200 : Integer.parseInt(result); + } + if (name.equalsIgnoreCase("bandFreq")) { + GeneralVariables.band = result.equals("") ? 14074000 : Long.parseLong(result); + GeneralVariables.bandListIndex = OperationBand.getIndexByFreq(GeneralVariables.band); + } + + if (name.equalsIgnoreCase("msgMode")) { + GeneralVariables.simpleCallItemMode = result.equals("1") ; + } + + if (name.equalsIgnoreCase("ctrMode")) { + GeneralVariables.controlMode = result.equals("") ? ControlMode.VOX : Integer.parseInt(result); + } + if (name.equalsIgnoreCase("model")) {//电台型号 + GeneralVariables.modelNo = result.equals("") ? 0 : Integer.parseInt(result); + } + if (name.equalsIgnoreCase("instruction")) {//指令集 + GeneralVariables.instructionSet = result.equals("") ? 0 : Integer.parseInt(result); + } + if (name.equalsIgnoreCase("launchSupervision")) {//发射监管 + GeneralVariables.launchSupervision = result.equals("") ? + GeneralVariables.DEFAULT_LAUNCH_SUPERVISION : Integer.parseInt(result); + } + if (name.equalsIgnoreCase("noReplyLimit")) {// + GeneralVariables.noReplyLimit = result.equals("") ? 0 : Integer.parseInt(result); + } + if (name.equalsIgnoreCase("autoFollowCQ")) {//自动关注CQ + GeneralVariables.autoFollowCQ = (result.equals("") || result.equals("1")); + } + if (name.equalsIgnoreCase("autoCallFollow")) {//自动呼叫关注 + GeneralVariables.autoCallFollow = (result.equals("") || result.equals("1")); + } + if (name.equalsIgnoreCase("pttDelay")) {//ptt延时设置 + GeneralVariables.pttDelay = result.equals("") ? 100 : Integer.parseInt(result); + } + if (name.equalsIgnoreCase("icomIp")) {//IcomIp地址 + GeneralVariables.icomIp = result.equals("") ? "255.255.255.255" : result; + } + if (name.equalsIgnoreCase("icomPort")) {//Icom端口 + GeneralVariables.icomUdpPort = result.equals("") ? 50001 : Integer.parseInt(result); + } + if (name.equalsIgnoreCase("icomUserName")) {//Icom用户名 + GeneralVariables.icomUserName = result.equals("") ? "ic705" : result; + } + if (name.equalsIgnoreCase("icomPassword")) {//Icom密码 + GeneralVariables.icomPassword = result; + } + if (name.equalsIgnoreCase("volumeValue")) {//输出音量大小 + GeneralVariables.volumePercent = result.equals("") ? 1.0f : Float.parseFloat(result) / 100f; + } + if (name.equalsIgnoreCase("excludedCallsigns")) {//排除的呼号 + GeneralVariables.addExcludedCallsigns(result); + } + if (name.equalsIgnoreCase("flexMaxRfPower")) {//指令集 + GeneralVariables.flexMaxRfPower = result.equals("") ? 10 : Integer.parseInt(result); + } + if (name.equalsIgnoreCase("flexMaxTunePower")) {//指令集 + GeneralVariables.flexMaxTunePower = result.equals("") ? 10 : Integer.parseInt(result); + } + if (name.equalsIgnoreCase("saveSWL")) {//保存解码信息 + GeneralVariables.saveSWLMessage = result.equals("1"); + } + if (name.equalsIgnoreCase("saveSWLQSO")) {//保存解码信息 + GeneralVariables.saveSWL_QSO = result.equals("1"); + } + if (name.equalsIgnoreCase("audioBits")) {//输出音频是否32位浮点 + GeneralVariables.audioOutput32Bit = result.equals("1"); + } + if (name.equalsIgnoreCase("audioRate")) {//输出音频是否32位浮点 + GeneralVariables.audioSampleRate =Integer.parseInt( result); + } + if (name.equalsIgnoreCase("deepMode")) {//是不是深度解码模式 + GeneralVariables.deepDecodeMode =result.equals("1"); + } + if (name.equalsIgnoreCase("dataBits")) {//串口数据位 + GeneralVariables.serialDataBits =Integer.parseInt(result); + } + if (name.equalsIgnoreCase("stopBits")) {//串口停止位 + GeneralVariables.serialStopBits =Integer.parseInt(result); + } + if (name.equalsIgnoreCase("parityBits")) {//串口校验位 + GeneralVariables.serialParity =Integer.parseInt(result); + } + + // cloudlogs + if (name.equalsIgnoreCase("enableCloudlog")) { + GeneralVariables.enableCloudlog = result.equals("1"); + } + if (name.equalsIgnoreCase("cloudlogServerAddress")) { + GeneralVariables.cloudlogServerAddress = result; + } + if (name.equalsIgnoreCase("cloudlogApiKey")) { + GeneralVariables.cloudlogApiKey = result; + } + if (name.equalsIgnoreCase("cloudlogStationID")) { + GeneralVariables.cloudlogStationID = result; + } + + //QRZ + if (name.equalsIgnoreCase("enableQRZ")) { + GeneralVariables.enableQRZ = result.equals("1"); + } + if (name.equalsIgnoreCase("qrzApiKey")) { + GeneralVariables.qrzApiKey = result; + } + + if (name.equalsIgnoreCase("swrSwitch")) { + GeneralVariables.swr_switch_on = result.equals("1"); + } + if (name.equalsIgnoreCase("alcSwitch")) { + GeneralVariables.alc_switch_on = result.equals("1"); + } + + } + + cursor.close(); + + GetAllQSLCallsign.get(db);//获取通联过的呼号 + + if (onAfterQueryConfig != null) { + onAfterQueryConfig.doOnAfterQueryConfig(null, null); + } + + return null; + } + } + + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/database/DxccObject.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/database/DxccObject.java new file mode 100644 index 00000000..da3774d8 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/database/DxccObject.java @@ -0,0 +1,49 @@ +package com.bg7yoz.ft8cn.database; +/** + * 与DXCC有关的3个表,dxccList、dxcc_grid、dxcc_prefix,用于保存各DXCC分区所在的国家、经纬度、网格等信息 + * + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.database.sqlite.SQLiteDatabase; + +import java.util.ArrayList; + +public class DxccObject { + int id; + int dxcc; + String cc; + String ccc; + String name; + String continent; + String ituZone; + String cqZone; + int timeZone; + int cCode; + String aName; + String pp; + double lat; + double lon; + ArrayList grid=new ArrayList<>(); + ArrayList prefix=new ArrayList<>(); + + public void insertToDb(SQLiteDatabase db){ + String insertSQL="INSERT INTO dxccList (id,dxcc,cc,ccc,name,continent" + + ",ituzone,cqzone,timezone,ccode,aname,pp,lat,lon)"+ + "VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; + + db.execSQL(insertSQL,new Object[]{this.id,this.dxcc,this.cc,this.ccc,this.name,this.continent + ,this.ituZone,this.cqZone,this.timeZone,this.cCode,this.aName,this.pp,this.lat,this.lon}); + + String insertGrid="INSERT INTO dxcc_grid(dxcc,grid)VALUES(?,?)"; + for (int i = 0; i < this.grid.size(); i++) { + db.execSQL(insertGrid,new Object[]{this.dxcc,this.grid.get(i)}); + } + + String insert_Prefix="INSERT INTO dxcc_prefix(dxcc,prefix)VALUES(?,?)"; + for (int i = 0; i callsigns); +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/database/OnAfterWriteConfig.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/database/OnAfterWriteConfig.java new file mode 100644 index 00000000..7f4eb6eb --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/database/OnAfterWriteConfig.java @@ -0,0 +1,10 @@ +package com.bg7yoz.ft8cn.database; + +/** + * 保存配置信息的回调 + * @author BGY70Z + * @date 2023-03-20 + */ +public interface OnAfterWriteConfig { + void doOnAfterWriteConfig(boolean writeDone); +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/database/OnGetCallsign.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/database/OnGetCallsign.java new file mode 100644 index 00000000..c779300b --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/database/OnGetCallsign.java @@ -0,0 +1,10 @@ +package com.bg7yoz.ft8cn.database; + +/** + * 查询呼号的回调 + * @author BGY70Z + * @date 2023-03-20 + */ +public interface OnGetCallsign { + void doOnAfterGetCallSign(boolean exists); +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/database/OperationBand.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/database/OperationBand.java new file mode 100644 index 00000000..f2fc0676 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/database/OperationBand.java @@ -0,0 +1,158 @@ +package com.bg7yoz.ft8cn.database; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.res.AssetManager; +import android.util.Log; + +import com.bg7yoz.ft8cn.rigs.BaseRigOperation; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; + +/** + * 用于读取可用的载波波段列表,文件保存在assets/bands.txt中 + * @author BGY70Z + * @date 2023-03-20 + */ + +public class OperationBand { + private static final String TAG="OperationBand"; + private final Context context; + private static OperationBand operationBand = null; + + public static long getDefaultBand() { + return 14074000; + } + + public static String getDefaultWaveLength() { + return "20m"; + } + + public static ArrayList bandList = new ArrayList<>(); + public OperationBand(Context context) { + this.context = context; + //把波段数据导入到内存 + getBandsFromFile(); + } + + public static OperationBand getInstance(Context context) { + if (operationBand == null) { + operationBand=new OperationBand(context); + return operationBand; + } else { + return operationBand; + } + } + + /** + * 获取操作波段的数据,以列表的索引值查找,如果没有返回默认值14.074,20m + * @param index 索引 + * @return + */ + public Band getBandByIndex(int index){ + if (index==-1||index>=bandList.size()){ + return new Band(getDefaultBand(),getDefaultWaveLength()); + }else { + return bandList.get(index); + } + } + + /** + * 检查频率是不是在频率列表中,如果不在,把这个频率加到频段中 + * @param freq + * @return + */ + public static int getIndexByFreq(long freq){ + int result=-1; + for (int i = 0; i < bandList.size(); i++) { + if (bandList.get(i).band==freq){ + result=i; + break; + } + } + if (result==-1){ + bandList.add(new Band(freq, BaseRigOperation.getMeterFromFreq(freq))); + result=bandList.size()-1; + } + return result; + } + /** + * 从bands.txt文件中读出FT8信号列表。 + */ + public void getBandsFromFile(){ + AssetManager assetManager = context.getAssets(); + try { + bandList.clear(); + InputStream inputStream= assetManager.open("bands.txt"); + String[] st=getLinesFromInputStream(inputStream,"\n"); + for (int i = 0; i =bandList.size()){ + return bandList.get(0).getBandInfo(); + }else { + return bandList.get(index).getBandInfo(); + } + } + + /** + * 从InputStream中读出字符串 + * @param inputStream 输入流 + * @param deLimited 每行数据的分隔符。 + * @return String 返回字符串,如果失败,返回null + */ + public static String[] getLinesFromInputStream(InputStream inputStream, String deLimited) { + try { + byte[] bytes = new byte[inputStream.available()]; + inputStream.read(bytes); + return (new String(bytes)).split(deLimited); + }catch (IOException e){ + return null; + } + } + public static long getBandFreq(int index){ + if (index>bandList.size()){ + return 14074000; + } + return bandList.get(index).band; + } + + public static class Band { + public long band; + public String waveLength; + public boolean marked=false; + + public Band(long band, String waveLength) { + this.band = band; + this.waveLength = waveLength; + } + + public Band(String s) { + String[] info=s.split(":"); + marked= (info[0].equals("*")); + band=Long.parseLong(info[1]); + waveLength=info[info.length-1]; + } + @SuppressLint("DefaultLocale") + public String getBandInfo(){ + return String.format("%s %.3f MHz (%s)" + ,marked?"*":" " + ,(float)(band/1000000f) + ,waveLength); + } + } + + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/database/RigNameList.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/database/RigNameList.java new file mode 100644 index 00000000..019b0fa9 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/database/RigNameList.java @@ -0,0 +1,151 @@ +package com.bg7yoz.ft8cn.database; +/** + * 各电台信号的列表。文件在rigaddress.txt中 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.content.Context; +import android.content.res.AssetManager; +import android.util.Log; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; + +public class RigNameList { + private static final String TAG="RigNameList"; + private Context context; + private static RigNameList rigNameList = null; + + + public ArrayList rigList = new ArrayList<>(); + + public RigNameList(Context context) { + this.context = context; + //电台数据导入到内存 + getRigNamesFromFile(); + } + + public static RigNameList getInstance(Context context) { + if (rigNameList == null) { + return new RigNameList(context); + } else { + return rigNameList; + } + } + + /** + * 获取各电台参数数据,以列表的索引值查找,如果没有返回默认值以空 + * @param index 索引 + * @return 电台参数 + */ + public RigName getRigNameByIndex(int index){ + if (index==-1||index>=rigList.size()){ + return new RigName("",0xA4,19200,0); + }else { + return rigList.get(index); + } + } + + /** + * rigaddress.txt文件中读出各电台参数列表。 + */ + public void getRigNamesFromFile(){ + AssetManager assetManager = context.getAssets(); + try { + InputStream inputStream= assetManager.open("rigaddress.txt"); + String[] st=getLinesFromInputStream(inputStream,"\n"); + rigList.add(new RigName("",0xA4,19200,0)); + for (int i = 0; i { + private static final String TAG = "FlexMeters"; + public int sMeterId = -1; + public int tempCId = -1; + public int swrId = -1; + public int pwrId = -1; + public int alcId = -1; + + public FlexMeterInfos(String content) { + setMeterInfos(content); + } + + /** + * 根据电台回复的消息,获取每个METER的ID与meter定义的映射表 + * + * @param content 消息 + */ + public synchronized void setMeterInfos(String content) { + String[] temp; + if (content.length() == 0) return; + temp = content.substring(content.indexOf("meter ") + "meter ".length()).split("#"); + for (int i = 0; i < temp.length; i++) { + String[] val = temp[i].split("="); + if (val.length == 2) { + if (val[0].contains(".")) { + int index = Integer.parseInt(val[0].substring(0, val[0].indexOf("."))); + FlexMeterInfo meterInfo; + + meterInfo = this.get(index); + if (meterInfo == null) { + meterInfo = new FlexMeterInfo(); + this.put(index, meterInfo); + } + + + if (val[0].toLowerCase().contains(".src")) { + + meterInfo.src = val[1]; + } + if (val[0].toLowerCase().contains(".num")) { + meterInfo.num = val[1]; + } + if (val[0].toLowerCase().contains(".nam")) { + meterInfo.nam = val[1]; + //为了方便MeterList快速查询 + if (val[1].toUpperCase().contains("LEVEL")) { + sMeterId = index; + } else if (val[1].toUpperCase().contains("PATEMP")) { + tempCId = index; + } else if (val[1].toUpperCase().contains("SWR")) { + swrId = index; + } else if (val[1].toUpperCase().contains("FWDPWR")) { + pwrId = index; + } else if (val[1].toUpperCase().contains("ALC")) { + alcId = index; + } + + } + if (val[0].toLowerCase().contains(".low")) { + meterInfo.low = Float.parseFloat(val[1]); + } + if (val[0].toLowerCase().contains(".hi")) { + meterInfo.hi = Float.parseFloat(val[1]); + } + if (val[0].toLowerCase().contains(".desc")) { + meterInfo.desc = val[1]; + } + if (val[0].toLowerCase().contains(".unit")) { + String s = val[1].toUpperCase(); + if (s.contains("DB")) { + meterInfo.unit = FlexMeterType.dBm; + } else if (s.contains("SWR")) { + meterInfo.unit = FlexMeterType.swr; + } else if (s.contains("DEG")) { + meterInfo.unit = FlexMeterType.Temperature; + } else if (s.contains("VOLT")) { + meterInfo.unit = FlexMeterType.volt; + } else { + meterInfo.unit = FlexMeterType.other; + } + + } + if (val[0].toLowerCase().contains(".fps")) { + meterInfo.fps = val[1]; + } + if (val[0].toLowerCase().contains(".peak")) { + meterInfo.peak = val[1]; + } + } + } + } +// sMeterId=getMeterId("LEVEL"); +// tempCId=getMeterId("PATEMP"); +// swrId=getMeterId("SWR"); +// pwrId=getMeterId("FWDPWR"); +// alcId=getMeterId("ALC"); + } + + /** + * 查Meter得id,没有返回-1 + * + * @return id + */ + private int getMeterId(String s) { + for (int key : this.keySet()) { + if (get(key).nam.equalsIgnoreCase(s)) { + return key; + } + } + return -1; + } + + + public static class FlexMeterInfo { + public String src; + public String num; + public String nam; + public float low; + public float hi; + public String desc; + public FlexMeterType unit = FlexMeterType.other; + public String fps; + public String peak; + + @Override + public String toString() { + return "{" + + "src='" + src + '\'' + + ", num='" + num + '\'' + + ", nam='" + nam + '\'' + + ", low='" + low + '\'' + + ", hi='" + hi + '\'' + + ", desc='" + desc + '\'' + + ", unit='" + unit + '\'' + + ", fps='" + fps + '\'' + + ", peak='" + peak + '\'' + + '}'; + } + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/flex/FlexMeterList.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/flex/FlexMeterList.java new file mode 100644 index 00000000..ef465baf --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/flex/FlexMeterList.java @@ -0,0 +1,97 @@ +package com.bg7yoz.ft8cn.flex; +/** + * Meter的哈希表。Meter是2个32位的数,ID+VALUE。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import static com.bg7yoz.ft8cn.flex.VITA.readShortData; + +import android.annotation.SuppressLint; + +import java.util.HashMap; + +public class FlexMeterList extends HashMap { + public float sMeterVal=-150;//-150~10 + public float tempCVal=0;//0~100 + public float alcVal=-150;//-150~20 + public float swrVal=1;//1~999 + public float pwrVal=0;//0~100W + public synchronized void setMeters(byte[] data, FlexMeterInfos infos) { + for (int i = 0; i < data.length / 4; i++) { + int val = readShortData(data, i * 4); + FlexMeter meter = get(val); + if (meter == null) { + if (infos.get(val) == null) continue; + meter = new FlexMeter(); + meter.name = infos.get(val).nam; + meter.desc = infos.get(val).desc; + meter.type = infos.get(val).unit; + meter.id = val; + } + switch (meter.type) { + case dBm: + case swr: + meter.value = readShortData(data, i * 4 + 2) / 128f; + if (meter.name.contains("PWR")){//把dBm转换成功率值 + meter.value=(float) Math.pow(10,meter.value/10f)/1000f; + } + //节省资源,提前赋值 + if (meter.id==infos.sMeterId) sMeterVal=meter.value; + if (meter.id==infos.swrId) swrVal=meter.value; + if (meter.id==infos.pwrId) pwrVal=meter.value; + if (meter.id==infos.alcId) alcVal=meter.value; + break; + case volt: + meter.value = readShortData(data, i * 4 + 2) / 256f; + break; + case Temperature: + meter.value = readShortData(data, i * 4 + 2) / 64f; + //节省资源,提前赋值 + if (meter.id==infos.tempCId) tempCVal=meter.value; + break; + case other: + default: + meter.value = readShortData(data, i * 4 + 2); + } + + put(val, meter); + } + + } + + public synchronized String getMeters(){ + StringBuilder temp=new StringBuilder(); + int i=0; + for (int key:this.keySet()) { + i++; + temp.append(String.format("%-35s",get(key).toString())); + if (i%2==0){ + temp.append("\n"); + } + } + return temp.toString(); + } + + + + + + + + public static class FlexMeter { + public int id; + public float value; + public String name; + public String desc; + public FlexMeterType type=FlexMeterType.other; + + @SuppressLint("DefaultLocale") + @Override + public String toString() { + return String.format("%02d.%s : %.1f",id,name,value); + + } + } + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/flex/FlexMeterType.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/flex/FlexMeterType.java new file mode 100644 index 00000000..164ecad6 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/flex/FlexMeterType.java @@ -0,0 +1,10 @@ +package com.bg7yoz.ft8cn.flex; + +/** + * meter的常用类型 + * @author BGY70Z + * @date 2023-03-20 + */ +public enum FlexMeterType { + dBm,swr,Temperature,volt,other +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/flex/FlexRadio.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/flex/FlexRadio.java new file mode 100644 index 00000000..a68cfc24 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/flex/FlexRadio.java @@ -0,0 +1,1436 @@ +package com.bg7yoz.ft8cn.flex; +/** + * Flex的操作,命令使用TCP,数据流使用UDP。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.annotation.SuppressLint; +import android.media.AudioAttributes; +import android.media.AudioFormat; +import android.media.AudioTrack; +import android.util.Log; + +import androidx.annotation.NonNull; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.ui.ToastMessage; +import com.bg7yoz.ft8cn.wave.FT8Resample; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.SocketException; +import java.net.UnknownHostException; +import java.util.HashSet; + + +public class FlexRadio { + + public enum FlexMode {LSB, USB, AM, CW, DIGL, DIGU, SAM, FM, NFM, DFM, RTTY, RAW, ARQ, UNKNOW} + + public enum AntMode {ANT1, ANT2, RX_A, XVTA, UNKNOW} + + + private static final String TAG = "FlexRadio"; + public static int streamPort = 7051; + private int flexStreamPort = 4993; + public boolean isPttOn = false; + public long streamTxId = 0x084000000; + + public static int getStreamPort() {//获取用于流传输的UDP端口,防止重复,采用自增方式 + return ++streamPort; + } + + //private int streamPort;//当前用于流传输的UDP端口,这个是本实例的端口 + + + /********************* + * 电台的基本信息,从discovery协议中获取 + *************************/ + private String discovery_protocol_version;//=3.0.0.2 + private String model;//=FLEX-6400 + private String serial;//=1418-6579-6400-0461 + private String version;//=3.3.32.8203 + private String nickname;//=FlexRADIO + private String callsign;//=FlexRADIO + private String ip = "";//=192.168.3.86 + private int port = 4992;//=4992//用于控制电台的TCP端口 + private String status;//=Available + private String inUse_ip;//=192.168.3.5 + private String inUse_host;//=DESKTOP-RR564NK.local + private String max_licensed_version;//=v3 + private String radio_license_id;//=00-1C-2D-05-04-70 + private String requires_additional_license;//=0 + private String fpc_mac;//= + private int wan_connected;//=1 + private int licensed_clients;//=2 + private int available_clients;//=1 + private int max_panadapters;//=2 + private int available_panadapters;//=1 + private int max_slices;//=2 + private int available_slices;//=1 + private String gui_client_ips;//=192.168.3.5 + private String gui_client_hosts;//=DESKTOP-RR564NK.local + private String gui_client_programs;//=SmartSDR-Win + private String gui_client_stations;//=DESKTOP-RR564NK + private String gui_client_handles;//=0x19EAFA02 + + private long lastSeen;//最后一次消息的时间 + private boolean isAvailable = true;//电台是不是有效 + + + private int commandSeq = 1;//指令的序列 + private FlexCommand flexCommand; + private int handle = 0; + private String commandStr; + + + private final StringBuilder buffer = new StringBuilder();//指令的缓存 + private final RadioTcpClient tcpClient = new RadioTcpClient(); + private RadioUdpClient streamClient; + + private boolean allFlexRadioStatusEvent = false; + private String clientID = ""; + private long daxAudioStreamId = 0; + private int daxTxAudioStreamId = 0; + private long panadapterStreamId = 0; + private final HashSet streamIdSet = new HashSet<>(); + + //************************事件处理接口******************************* + private OnReceiveDataListener onReceiveDataListener;//当前接收到的数据事件 + private OnTcpConnectStatus onTcpConnectStatus;//当TCP连接状态变化的事件 + private OnReceiveStreamData onReceiveStreamData;//当接收到流数据后的处理事件 + private OnCommandListener onCommandListener;//触发命令事件 + private OnMessageListener onMessageListener;//触发消息事件 + private OnStatusListener onStatusListener;//触发状态事件 + //***************************************************************** + private AudioTrack audioTrack = null; + + public FlexRadio() { + updateLastSeen(); + } + + public FlexRadio(String discoverStr) { + update(discoverStr); + updateLastSeen(); + } + + public void updateLastSeen() { + this.lastSeen = System.currentTimeMillis(); + } + + /** + * 到参数列表中找指定的字符类型参数 + * + * @param parameters 参数列表 + * @param prefix 参数名前缀 + * @return 参数 + */ + private String getParameterStr(String[] parameters, String prefix) { + for (int i = 0; i < parameters.length; i++) { + if (parameters[i].toLowerCase().startsWith(prefix.toLowerCase() + "=")) { + return parameters[i].substring(prefix.length() + 1); + } + } + //如果没找到,返回空字符串 + return ""; + + } + + /** + * 到参数列表中找指定的int类型参数 + * + * @param parameters 参数列表 + * @param prefix 参数名前缀 + * @return 参数 + */ + private int getParameterInt(String[] parameters, String prefix) { + for (int i = 0; i < parameters.length; i++) { + if (parameters[i].toLowerCase().startsWith(prefix.toLowerCase() + "=")) { + try { + return Integer.parseInt(parameters[i].substring(prefix.length() + 1)); + } catch (NumberFormatException e) { + e.printStackTrace(); + Log.e(TAG, "getParameterInt exception: " + e.getMessage()); + return 0; + } + } + } + //如果没找到,返回0 + return 0; + + } + + /** + * 从discovery协议中更新参数 + * + * @param discoverStr 参数 + */ + public void update(String discoverStr) { + String[] paras = discoverStr.split(" "); + discovery_protocol_version = getParameterStr(paras, "discovery_protocol_version"); + model = getParameterStr(paras, "model"); + serial = getParameterStr(paras, "serial"); + version = getParameterStr(paras, "version"); + nickname = getParameterStr(paras, "nickname"); + callsign = getParameterStr(paras, "callsign"); + ip = getParameterStr(paras, "ip"); + port = getParameterInt(paras, "port"); + status = getParameterStr(paras, "status"); + inUse_ip = getParameterStr(paras, "inUse_ip"); + inUse_host = getParameterStr(paras, "inUse_host"); + max_licensed_version = getParameterStr(paras, "max_licensed_version"); + radio_license_id = getParameterStr(paras, "radio_license_id"); + requires_additional_license = getParameterStr(paras, "requires_additional_license"); + fpc_mac = getParameterStr(paras, "fpc_mac"); + wan_connected = getParameterInt(paras, "wan_connected"); + licensed_clients = getParameterInt(paras, "licensed_clients"); + available_clients = getParameterInt(paras, "available_clients"); + max_panadapters = getParameterInt(paras, "max_panadapters"); + available_panadapters = getParameterInt(paras, "available_panadapters"); + max_slices = getParameterInt(paras, "max_slices"); + available_slices = getParameterInt(paras, "available_slices"); + gui_client_ips = getParameterStr(paras, "gui_client_ips"); + gui_client_hosts = getParameterStr(paras, "gui_client_hosts"); + gui_client_programs = getParameterStr(paras, "gui_client_programs"); + gui_client_stations = getParameterStr(paras, "gui_client_stations"); + gui_client_handles = getParameterStr(paras, "gui_client_handles"); + } + + /** + * 检查这个实例是否是同一个电台 + * + * @param serialNum 电台序列号 + * @return 是/否 + */ + public boolean isEqual(String serialNum) { + return this.serial.equalsIgnoreCase(serialNum); + } + + + /** + * 连接到控制电台 + */ + public void connect() { + this.connect(this.ip, this.port); + } + + /** + * 连接控制到电台,TCP + * + * @param ip 地址 + * @param port 端口 + */ + public void connect(String ip, int port) { + if (tcpClient.isConnect()) { + tcpClient.disconnect(); + } + //Tcp连接触发的事件 + tcpClient.setOnDataReceiveListener(new RadioTcpClient.OnDataReceiveListener() { + @Override + public void onConnectSuccess() { + if (onTcpConnectStatus != null) { + onTcpConnectStatus.onConnectSuccess(tcpClient); + } + } + + @Override + public void onConnectFail() { + if (onTcpConnectStatus != null) { + onTcpConnectStatus.onConnectFail(tcpClient); + } + } + + @Override + public void onDataReceive(byte[] buffer) { + if (onReceiveDataListener != null) { + onReceiveDataListener.onDataReceive(buffer); + } + onReceiveData(buffer); + } + + @Override + public void onConnectionClosed() { + tcpClient.disconnect(); + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.tcp_connect_closed)); + } + }); + clearBufferData();//清除一下缓存的指令数据 + tcpClient.connect(ip, port);//连接TCP + + //openStreamPort();//打开接收数据流的端口 + } + + /** + * 当接收到音频数据时的处理 + * + * @param data 音频数据 + */ + private void doReceiveAudio(byte[] data) { + if (onReceiveStreamData != null) { + onReceiveStreamData.onReceiveAudio(data); + } + if (audioTrack != null) {//如果音频播放已经打开,就写音频流数据 + float[] sound = getFloatFromBytes(data);//长度是256个float + audioTrack.write(sound, 0, sound.length, AudioTrack.WRITE_NON_BLOCKING); + } + } + + /** + * 当接收到IQ数据时的处理 + * + * @param data 数据 + */ + private void doReceiveIQ(byte[] data) { + if (onReceiveStreamData != null) { + onReceiveStreamData.onReceiveIQ(data); + } + } + + /** + * 当接收到FFT数据时的处理 + * + * @param vita 数据 + */ + private void doReceiveFFT(VITA vita) { + if (onReceiveStreamData != null) { + onReceiveStreamData.onReceiveFFT(vita); + } + } + + /** + * 当接收到仪表数据时的处理 + * + * @param vita 数据 + */ + private void doReceiveMeter(VITA vita) { + if (onReceiveStreamData != null) { + onReceiveStreamData.onReceiveMeter(vita); + } + } + + /** + * 当接收到未知数据时的处理 + * + * @param data 数据 + */ + private void doReceiveUnKnow(byte[] data) { + if (onReceiveStreamData != null) { + onReceiveStreamData.onReceiveUnKnow(data); + } + } + + /** + * 打开音频,流方式。当收到音频流的时候,播放数据 + */ + public void openAudio() { + AudioAttributes attributes = new AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_MEDIA) + .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) + .build(); + AudioFormat myFormat = new AudioFormat.Builder().setSampleRate(24000) + .setEncoding(AudioFormat.ENCODING_PCM_FLOAT) + .setChannelMask(AudioFormat.CHANNEL_OUT_STEREO).build(); + int mySession = 0; + audioTrack = new AudioTrack(attributes, myFormat + , 24000 * 4, AudioTrack.MODE_STREAM + , mySession); + audioTrack.play(); + } + + /** + * 关闭音频 + */ + public void closeAudio() { + if (audioTrack != null) { + audioTrack.stop(); + //audioTrack.release(); + audioTrack = null; + } + } + + private synchronized void addStreamIdToSet(long streamId) { + streamIdSet.add(streamId); + } + + /** + * 打开接收数据流的端口 + */ + public void openStreamPort() { + if (streamClient != null) { + if (streamClient.isActivated()) { + try { + streamClient.setActivated(false); + } catch (Exception e) { + e.printStackTrace(); + } + + } + } + + + RadioUdpClient.OnUdpEvents onUdpEvents = new RadioUdpClient.OnUdpEvents() { + @Override + public void OnReceiveData(DatagramSocket socket, DatagramPacket packet, byte[] data) { + if (flexStreamPort != packet.getPort()) flexStreamPort = packet.getPort(); + + + VITA vita = new VITA(data); + addStreamIdToSet(vita.streamId); + + //Log.e(TAG, String.format("OnReceiveData: stream id:0x%x,class id:0x%x",vita.streamId,vita.classId) ); + switch (vita.classId) { + case VITA.FLEX_DAX_AUDIO_CLASS_ID://音频数据 + //Log.e(TAG, String.format("FLEX_DAX_AUDIO_CLASS_ID stream id:0x%x",vita.streamId )); + doReceiveAudio(vita.payload); + break; + case VITA.FLEX_DAX_IQ_CLASS_ID://IQ数据 + doReceiveIQ(vita.payload); + break; + case VITA.FLEX_FFT_CLASS_ID://频谱数据 + doReceiveFFT(vita); + //Log.e(TAG, String.format("OnReceiveData: FFT:%d,STREAM ID:0x%x",vita.payload.length,vita.streamId)); + break; + case VITA.FLEX_METER_CLASS_ID://仪表数据 + //Log.e(TAG, String.format("FLEX_METER_CLASS_ID: stream id:0x%x",vita.streamId )); + doReceiveMeter(vita); + //Log.e(TAG, String.format("OnReceiveData: METER class id:0x%x,stream id:0x%x,length:%d\n%s" + // ,vita.classId,vita.streamId,vita.payload.length,vita.showPayload() )); + break; + default://未知类型的数据 + doReceiveUnKnow(data); + break; + } + } + }; + + //此处要确定stream的udp端口 + streamPort = getStreamPort(); + streamClient = new RadioUdpClient(streamPort); + streamClient.setOnUdpEvents(onUdpEvents); + try { + streamClient.setActivated(true); + } catch (SocketException e) { + e.printStackTrace(); + Log.d(TAG, "onCreate: " + e.getMessage()); + } + + + } + + /** + * 关闭接收数据流的端口 + */ + public synchronized void closeStreamPort() { + if (streamClient != null) { + if (streamClient.isActivated()) { + try { + streamClient.setActivated(false); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + streamClient = null; + } + + /** + * 断开与电台的连接 + */ + public synchronized void disConnect() { + if (tcpClient.isConnect()) { + tcpClient.disconnect(); + } + } + + /** + * flexRadio发射的采样率为24000采样率,还要把单声道改为立体声 + * @param data 音频 + */ + public void sendWaveData(float[] data) { + + float[] temp = new float[data.length * 2]; + //转成立体声,24000采样率 + for (int i = 0; i < data.length; i++) { + temp[i * 2] = data[i]; + temp[i * 2 + 1] = data[i]; + } + + + //port=4991; + //streamTxId=0x084000001; + // class id=0x00 00 1c 2d 53 4c 01 23???? + //每5毫秒一个包?立体声,共256个float + Log.e(TAG, String.format("sendWaveData: streamid:0x%x,ip:%s,port:%d",streamTxId,ip, port) ); + new Thread(new Runnable() { + @Override + public void run() { + + VITA vita = new VITA(); + + int count = 0; + int packetCount=0; + while (count temp.length) break; + } + + //byte[] send = vita.audioDataToVita(packetCount, streamTxId,0x534c2d, voice); + //daxTxAudioStreamId=0x0084000001&0x00000000ffffffff; + //Log.e(TAG, String.format("run: daxTxAudioStreamId:0x%X",daxTxAudioStreamId) ); + //daxTxAudioStreamId,0x534c0123, + vita.streamId=daxTxAudioStreamId; + vita.classId = 0x534c0123; + vita.classId64 = 0x00001c2d534c0123L; + byte[] send = vita.audioFloatDataToVita(packetCount, voice); + packetCount++; + try { + //Log.e(TAG, String.format("run: send ip:%s, port:%d",ip,4993) ); + streamClient.sendData(send, ip, 4993); + } catch (UnknownHostException e) { + throw new RuntimeException(e); + } + if (count>temp.length) break; + //} + while (isPttOn) { + if (System.currentTimeMillis() - now >= 5) {//5毫秒一个周期,每个周期256个float。 + break; + } + } + if (!isPttOn){ + // Log.e(TAG, String.format("count:%d,temp.length:%d",count,temp.length )); + } + + } + + +// for (int i = 0; i < (temp.length / (24 * 2 * 40)); i++) {//40毫秒的数据量 +// if (!isPttOn) return; +// long now = System.currentTimeMillis() - 1;//获取当前时间 +// +// float[] voice = new float[24 * 2 * 10]; +// for (int j = 0; j < 24 * 2 *10; j++) { +// voice[j] = temp[i * 24 * 2 * 10 + j]; +// } +// //Log.e(TAG, "sendWaveData: "+floatToStr(voice) ); +// //streamTxId=0x84000001; +// byte[] send = vita.audioDataToVita(count, streamTxId, voice); +// count++; +// +// try { +// streamClient.sendData(send, ip, port); +// } catch (UnknownHostException e) { +// throw new RuntimeException(e); +// } +// +// while (isPttOn) { +// if (System.currentTimeMillis() - now >= 41) {//40毫秒一个周期,每个周期3个包,每个包64个float。 +// break; +// } +// } +// } + } + }).start(); + + + //设置发送音频包 + //streamClient.sendData(); + } + public static String byteToStr(byte[] data) { + StringBuilder s = new StringBuilder(); + for (int i = 0; i < data.length; i++) { + s.append(String.format("%02x ", data[i] & 0xff)); + } + return s.toString(); + } + @SuppressLint("DefaultLocale") + public static String floatToStr(float[] data) { + StringBuilder s = new StringBuilder(); + for (int i = 0; i < data.length; i++) { + s.append(String.format("%f ", data[i])); + } + return s.toString(); + } + /** + * 电台是否连接 + * + * @return 是否 + */ + public boolean isConnect() { + return tcpClient.isConnect(); + } + + public synchronized void sendData(byte[] data) { + tcpClient.sendByte(data); + } + + /** + * 制作命令,命令序号规则:后3位是命令的种类,序号除1000,是命令的真正序号 + * + * @param command 命令的种类 + * @param cmdContent 命令的具体内容 + */ + @SuppressLint("DefaultLocale") + public void sendCommand(FlexCommand command, String cmdContent) { + if (tcpClient.isConnect()) { + commandSeq++; + flexCommand = command; + commandStr = String.format("C%d%03d|%s\n", commandSeq, command.ordinal() + , cmdContent); + tcpClient.sendByte(commandStr.getBytes()); + Log.d(TAG, "sendCommand: " + commandStr); + } + } + + /** + * 清空缓存数据 + */ + private void clearBufferData() { + buffer.setLength(0); + } + + /** + * 当接收到数据时触发的事件,此处是TCP连接得到的数据 + * + * @param data 数据 + */ + private void onReceiveData(byte[] data) { + String s = new String(data); + if (!s.contains("\n")) {//不包含换行符,说明命令行没有接受完。 + buffer.append(s); + } else {//说明已经有命令行了。可能不止一个哦。在此部分要触发OnReceiveLine + String[] commands = s.split("\n"); + if (commands.length > 0) {//把收到数据的第一行,追加到之前接收的命令数据上 + buffer.append(commands[0]); + } + + //先把缓存中的数据触发出来 + doReceiveLineEvent(buffer.toString()); + clearBufferData(); + //从第二行开始触发,最后一行不触发,最后一行要看是不是换行结尾 + for (int i = 1; i < commands.length - 1; i++) { + doReceiveLineEvent(commands[i]); + } + + if (commands.length > 1) {//当数据是多行的时候,最后一行的处理 + if (s.endsWith("\n")) {//如果是以换行结尾,或者缓冲区没满(接收完全了),就触发事件 + doReceiveLineEvent(commands[commands.length - 1]); + } else {//如果不是以换行结尾,说明指令没有接收完全 + buffer.append(commands[commands.length - 1]); + } + } + } + } + + /** + * 当接收到数据行时,触发的事件。可以触发两种事件: + * 1.行数据事件onReceiveLineListener; + * 2.命令事件onCommandListener。 + * + * @param line 数据行 + */ + private void doReceiveLineEvent(String line) { + + FlexResponse response = new FlexResponse(line); + //更新一下句柄 + switch (response.responseStyle) { + case VERSION: + this.version = response.version; + break; + case HANDLE: + this.handle = response.handle; + break; + case RESPONSE: + if (response.daxStreamId != 0) { + this.daxAudioStreamId = response.daxStreamId; + } + if (response.panadapterStreamId != 0) { + this.panadapterStreamId = response.panadapterStreamId; + } + if (response.daxTxStreamId != 0) { + this.daxTxAudioStreamId = response.daxTxStreamId; + Log.d(TAG, String.format("doReceiveLineEvent: txStreamID:0x%x", daxTxAudioStreamId)); + } + + break; + } + + if (response.responseStyle == FlexResponseStyle.RESPONSE) { + if (getCommandStyleFromResponse(response) == FlexCommand.CLIENT_GUI) { + setClientIDFromResponse(response);//设置CLIENT ID + } + } + + //是不是显示其它终端的状态信息 + if (response.responseStyle == FlexResponseStyle.STATUS) { + if (!allFlexRadioStatusEvent && (!(handle == response.handle || response.handle == 0))) { + return; + } + + } + + switch (response.responseStyle) { + case RESPONSE://当接收到的是指令的返回消息 + doCommandResponse(response);//对一些指令返回的消息要处理一下。 + break; + case STATUS://当接收到的是状态消息 + if (onStatusListener != null) { + onStatusListener.onStatus(response); + } + break; + case MESSAGE://当接收到的是消息 + if (onMessageListener != null) { + onMessageListener.onMessage(response); + break; + } + } + } + + /** + * 处理命令返回的消息,同时触发命令返回消息事件 + * + * @param response 返回消息 + */ + private void doCommandResponse(FlexResponse response) { + if (onCommandListener != null) { + onCommandListener.onResponse(response); + } + } + + + private void setClientIDFromResponse(FlexResponse response) { + if (response.responseStyle != FlexResponseStyle.RESPONSE) return; + if (getCommandStyleFromResponse(response) != FlexCommand.CLIENT_GUI) return; + if (response.content.equals("0")) {//R3001|0|0BF06C76-EB9E-47E0-B570-EAFB7D556055 + String[] temp = response.rawData.split("\\|"); + if (temp.length < 3) return; + clientID = temp[2]; + } + } + + public FlexCommand getCommandStyleFromResponse(FlexResponse response) { + if (response.responseStyle != FlexResponseStyle.RESPONSE) { + return FlexCommand.UNKNOW; + } + //Log.e(TAG, "getCommandStyleFromResponse: "+response.rawData ); + + try { + return FlexCommand.values()[Integer.parseInt(response.head.substring(response.head.length() - 3))]; + } catch (NumberFormatException e) { + e.printStackTrace(); + Log.e(TAG, "getCommandStyleFromResponse exception: " + e.getMessage()); + } + return FlexCommand.UNKNOW; + } + + /** + * 检查是不是 刚刚 离线,离线条件:5秒内没有收到电台的广播数据包 + * + * @return 是否 + */ + public boolean isInvalidNow() { + if (isAvailable) {//如果标记在线,而大于5秒的时间没有收到数据包,就视为刚刚离线。 + isAvailable = System.currentTimeMillis() - lastSeen < 1000 * 5;//小于5秒,就视为在线 + return !isAvailable; + } else {//如果已经标记不在线了,就不是刚刚离弦的。 + return false; + } + } + + @NonNull + @Override + public String toString() { + return String.format("FlexRadio{version='%s', handle=%X}", version, handle); + } + + //**************封装FlexRadio各种指令*开始*********************** + public synchronized void commandClientDisconnect() { + sendCommand(FlexCommand.CLIENT_DISCONNECT, "client disconnect"); + } + + public synchronized void commandClientGui() { + sendCommand(FlexCommand.CLIENT_GUI, "client gui"); + } + + public synchronized void commandClientSetEnforceNetWorkGui() { + sendCommand(FlexCommand.CLIENT_SET_ENFORCE_NETWORK + , "client set enforce_network_mtu=1 network_mtu=1450"); + } + + @SuppressLint("DefaultLocale") + public synchronized void commandSliceRemove(int sliceOder) { + sendCommand(FlexCommand.SLICE_REMOVE, String.format("slice r %d", sliceOder)); + } + + public synchronized void commandSliceList() { + sendCommand(FlexCommand.SLICE_LIST, "slice list"); + } + + public synchronized void commandSliceCreate() { + sendCommand(FlexCommand.SLICE_CREATE_FREQ, "slice create"); + } + + @SuppressLint("DefaultLocale") + public synchronized void commandSliceTune(int sliceOder, String freq) { + sendCommand(FlexCommand.SLICE_TUNE, String.format("slice t %d %s", sliceOder, freq)); + } + + @SuppressLint("DefaultLocale") + public synchronized void commandSliceSetRxAnt(int sliceOder, AntMode antMode) { + sendCommand(FlexCommand.SLICE_SET_RX_ANT, String.format("slice s %d rxant=%s", sliceOder, antMode.toString())); + } + + @SuppressLint("DefaultLocale") + public synchronized void commandSliceSetTxAnt(int sliceOder, AntMode antMode) { + sendCommand(FlexCommand.SLICE_SET_TX_ANT, String.format("slice s %d txant=%s", sliceOder, antMode.toString())); + } + + @SuppressLint("DefaultLocale") + public synchronized void commandSliceSetMode(int sliceOder, FlexMode mode) { + sendCommand(FlexCommand.SLICE_SET_TX_ANT, String.format("slice s %d mode=%s", sliceOder, mode.toString())); + } + + @SuppressLint("DefaultLocale") + public synchronized void commandSliceSetNR(int sliceOder, boolean on) { + sendCommand(FlexCommand.SLICE_SET_NR, String.format("slice s %d nr=%s", sliceOder, on ? "on" : "off")); + } + + @SuppressLint("DefaultLocale") + public synchronized void commandSliceGetError(int sliceOder) { + sendCommand(FlexCommand.SLICE_GET_ERROR, String.format("slice get_error %d", sliceOder)); + } + + @SuppressLint("DefaultLocale") + public synchronized void commandSliceSetNB(int sliceOder, boolean on) { + sendCommand(FlexCommand.SLICE_SET_NB, String.format("slice s %d nb=%s", sliceOder, on ? "on" : "off")); + } + + @SuppressLint("DefaultLocale") + public synchronized void commandSetDaxAudio(int channel, int sliceOder, boolean txEnable) { + sendCommand(FlexCommand.DAX_AUDIO, String.format("dax audio set %d slice=%d tx=%s", channel, sliceOder, txEnable ? "1" : "0")); + //sendCommand(FlexCommand.DAX_AUDIO, String.format("dax audio set %d tx=%s", channel, txEnable ? "1" : "0")); + //sendCommand(FlexCommand.DAX_AUDIO, "dax tx 1"); + } + + @SuppressLint("DefaultLocale") + public synchronized void commandSetDaxIQ(int channel, int panadapter, int rate) { + sendCommand(FlexCommand.DAX_IQ, String.format("dax iq set %d pan=%d rat=%d", channel, panadapter, rate)); + } + + @SuppressLint("DefaultLocale") + public synchronized void commandUdpPort() { + sendCommand(FlexCommand.CLIENT_UDPPORT, String.format("client udpport %d", streamPort)); + } + + @SuppressLint("DefaultLocale") + public synchronized void commandStreamCreateDaxRx(int channel) { + sendCommand(FlexCommand.STREAM_CREATE_DAX_RX, String.format("stream create type=dax_rx dax_channel=%d", channel)); + } + + @SuppressLint("DefaultLocale") + public synchronized void commandStreamCreateDaxTx(int channel) { + sendCommand(FlexCommand.STREAM_CREATE_DAX_TX, String.format("stream create type=dax_tx dax_channel=%d compression=none", channel)); +// sendCommand(FlexCommand.STREAM_CREATE_DAX_TX, String.format("stream create type=dax_tx compression=none")); + //sendCommand(FlexCommand.STREAM_CREATE_DAX_TX, String.format("stream create type=remote_audio_tx")); + } + + public synchronized void commandRemoveDaxStream() { + sendCommand(FlexCommand.STREAM_REMOVE, String.format("stream remove 0x%x", getDaxAudioStreamId())); + } + + public synchronized void commandRemoveAllStream() { + for (Long id : streamIdSet) { + sendCommand(FlexCommand.STREAM_REMOVE, String.format("stream remove 0x%x", id)); + } + } + + @SuppressLint("DefaultLocale") + public synchronized void commandSetFilter(int sliceOrder, int filt_low, int filt_high) { + sendCommand(FlexCommand.FILT_SET, String.format("filt %d %d %d", sliceOrder, filt_low, filt_high)); + } + + @SuppressLint("DefaultLocale") + public synchronized void commandStartATU() { + sendCommand(FlexCommand.FILT_SET, "atu start"); + } + + public synchronized void commandGetInfo() { + sendCommand(FlexCommand.INFO, "info"); + } + + public synchronized void commandPanadapterCreate() { + sendCommand(FlexCommand.PANADAPTER_CREATE, "display pan c freq=9.5 ant=ANT1 x=800 y=400"); + } + + public synchronized void commandPanadapterRemove() { + sendCommand(FlexCommand.PANADAPTER_REMOVE, String.format("display pan r 0x%x", panadapterStreamId)); + //sendCommand(FlexCommand.PANADAPTER_REMOVE,"display pan r 0x40000001"); + //sendCommand(FlexCommand.PANADAPTER_REMOVE,"display pan r 0x40000000"); + } + + public synchronized void commandMeterCreateAmp() { + sendCommand(FlexCommand.METER_CREATE_AMP, "meter create name=AFRAMP type=AMP min=-150.0 max=20.0 units=AMPS"); + } + + public synchronized void commandMeterList() { + sendCommand(FlexCommand.METER_LIST, "meter list"); + } + + public synchronized void commandSubClientAll() { + sendCommand(FlexCommand.SUB_CLIENT_ALL, "sub client all"); + } + + public synchronized void commandSubTxAll() { + sendCommand(FlexCommand.SUB_TX_ALL, "sub client all"); + } + + public synchronized void commandSubAtuAll() { + sendCommand(FlexCommand.SUB_ATU_ALL, "sub atu all"); + } + + public synchronized void commandSubAmplifierAtuAll() { + sendCommand(FlexCommand.SUB_amplifier_ALL, "sub amplifier all"); + } + + public synchronized void commandSubMeterAll() { + sendCommand(FlexCommand.SUB_METER_ALL, "sub meter all"); + //sendCommand(FlexCommand.SUB_METER_ALL,"sub meter 15"); + } + + @SuppressLint("DefaultLocale") + public synchronized void commandSubMeterById(int id) { + sendCommand(FlexCommand.SUB_METER_ID, String.format("sub meter %d", id)); + } + + public synchronized void commandSubPanAll() { + sendCommand(FlexCommand.SUB_PAN_ALL, "sub pan all"); + } + + public synchronized void commandSubSliceAll() { + sendCommand(FlexCommand.SUB_METER_ALL, "sub slice all"); + } + + public synchronized void commandSubAudioStreamAll() { + sendCommand(FlexCommand.SUB_AUDIO_STREAM_ALL, "sub audio_stream all"); + } + + public synchronized void commandSubDaxIqAll() { + sendCommand(FlexCommand.SUB_DAX_IQ_ALL, "sub daxiq all"); + } + + public synchronized void commandSubDaxAll() { + sendCommand(FlexCommand.SUB_DAX_ALL, "sub dax all"); + } + + @SuppressLint("DefaultLocale") + public synchronized void commandSetRfPower(int power) { + sendCommand(FlexCommand.TRANSMIT_MAX_POWER, String.format("transmit set max_power_level=%d", power)); + sendCommand(FlexCommand.TRANSMIT_POWER, String.format("transmit set rfpower=%d", power)); + //sendCommand(FlexCommand.TRANSMIT_MAX_POWER,"info"); + } + + @SuppressLint("DefaultLocale") + public synchronized void commandSetTunePower(int power) { + sendCommand(FlexCommand.AUT_TUNE_MAX_POWER, String.format("transmit set tunepower=%d", power)); + } + + public synchronized void commandPTTOnOff(boolean on) { + if (on) { + sendCommand(FlexCommand.PTT_ON, "xmit 1"); + } else { + sendCommand(FlexCommand.PTT_ON, "xmit 0"); + } + } + + public synchronized void commandTuneTransmitOnOff(boolean on) { + if (on) { + sendCommand(FlexCommand.PTT_ON, "transmit tune on"); + } else { + sendCommand(FlexCommand.PTT_ON, "transmit tune off"); + } + } + + + @SuppressLint("DefaultLocale") + public synchronized void commandDisplayPan(int x, int y) { + sendCommand(FlexCommand.DISPLAY_PAN, String.format("display pan set 0x%X xpixels=%d", 0x40000000, x)); + sendCommand(FlexCommand.DISPLAY_PAN, String.format("display pan set 0x%X ypixels=%d", 0x40000000, y)); + } + //**************封装FlexRadio各种指令*结束*********************** + + @Override + protected void finalize() throws Throwable { + closeStreamPort(); + super.finalize(); + } + + + //**************各种接口********************** + + /** + * 当TCP接收到数据 + */ + public interface OnReceiveDataListener { + void onDataReceive(byte[] data); + } + + /** + * 当接收到指令回复 + */ + public interface OnCommandListener { + void onResponse(FlexResponse response); + } + + public interface OnStatusListener { + void onStatus(FlexResponse response); + } + + public interface OnMessageListener { + void onMessage(FlexResponse response); + } + + /** + * 当TCP连接状态变化 + */ + public interface OnTcpConnectStatus { + void onConnectSuccess(RadioTcpClient tcpClient); + + void onConnectFail(RadioTcpClient tcpClient); + } + + /** + * 当接收到流数据时的事件 + */ + public interface OnReceiveStreamData { + void onReceiveAudio(byte[] data);//音频数据 + + void onReceiveIQ(byte[] data);//IQ数据 + + void onReceiveFFT(VITA vita);//频谱数据 + + void onReceiveMeter(VITA vita);//仪表数据 + + void onReceiveUnKnow(byte[] data);//未知数据 + } + //******************************************* + + + /** + * 电台TCP回复数据的基础类 + */ + public static class FlexResponse { + private static final String TAG = "FlexResponse"; + public FlexResponseStyle responseStyle; + public String head;//消息头 + public String content;//消息内容 + public String exContent;//扩展潇潇兮,有的返回消息分为3段,取第3段消息 + public String rawData;//原始数据 + public int seq_number;//32位int,指令序号 + public int handle;//句柄,32位,16进制 + public String version;//版本信息 + public int message_num;//消息号,32位,16进制。其中位24-25包含消息的严重性(0=信息,1=警告,2=错误,3=致命错误) + public long daxStreamId = 0; + public int daxTxStreamId = 0; + public long panadapterStreamId = 0; + public FlexCommand flexCommand = FlexCommand.UNKNOW; + public long resultValue = 0; + + public FlexResponse(String line) { + //Log.e(TAG, "FlexResponse: line--->"+line ); + rawData = line; + char header; + if (line.length() > 0) { + header = line.toUpperCase().charAt(0); + } else { + header = 0; + } + switch (header) { + case 'S': + responseStyle = FlexResponseStyle.STATUS; + getHeadAndContent(line, "\\|"); + try { + this.handle = Integer.parseInt(head.substring(1), 16);//解析16进制 + } catch (NumberFormatException e) { + e.printStackTrace(); + Log.e(TAG, "FlexResponse status handle exception: " + e.getMessage()); + } + break; + case 'R': + responseStyle = FlexResponseStyle.RESPONSE; + getHeadAndContent(line, "\\|"); + try { + seq_number = Integer.parseInt(head.substring(1));//解析指令序号 + flexCommand = FlexCommand.values()[seq_number % 1000]; + switch (flexCommand) { + case STREAM_CREATE_DAX_RX: + this.daxStreamId = getStreamId(line); + break; + case PANADAPTER_CREATE: + this.panadapterStreamId = getStreamId(line); + break; + case STREAM_CREATE_DAX_TX: + this.daxTxStreamId = getStreamId(line); + break; + } + resultValue = Integer.parseInt(content, 16);//取命令的返回值 + + } catch (NumberFormatException e) { + e.printStackTrace(); + Log.e(TAG, "FlexResponse parseInt seq_number exception: " + e.getMessage()); + } + break; + case 'H': + responseStyle = FlexResponseStyle.HANDLE; + head = line; + content = line; + Log.e(TAG, "FlexResponse: handle:" + line.substring(1)); + try { + this.handle = Integer.parseInt(line.substring(1), 16);//解析16进制 + } catch (NumberFormatException e) { + e.printStackTrace(); + Log.e(TAG, "FlexResponse parseInt handle exception: " + e.getMessage()); + } + + break; + case 'V': + responseStyle = FlexResponseStyle.VERSION; + head = line; + content = line; + this.version = line.substring(1); + break; + case 'M': + responseStyle = FlexResponseStyle.MESSAGE; + getHeadAndContent(line, "\\|"); + try { + //Log.e(TAG, "FlexResponse: "+line ); + this.message_num = Integer.parseInt(head.substring(2), 16);//消息号,32位,16进制 + } catch (NumberFormatException e) { + e.printStackTrace(); + Log.e(TAG, "FlexResponse parseInt message_num exception: " + e.getMessage()); + } + + break; + case 'C': + responseStyle = FlexResponseStyle.COMMAND; + getHeadAndContent(line, "\\|"); + int index = 1; + if (head.length() > 2) { + if (head.toUpperCase().charAt(1) == 'D') index = 2; + } + try { + seq_number = Integer.parseInt(head.substring(index)); + } catch (NumberFormatException e) { + e.printStackTrace(); + Log.e(TAG, "FlexResponse parseInt seq_number exception: " + e.getMessage()); + } + + break; + case 0: + default: + responseStyle = FlexResponseStyle.UNKNOW; + break; + } + } + + private int getStreamId(String line) { + String[] lines = line.split("\\|"); + if (lines.length > 2) { + if (lines[1].equals("0")) { + try { + return Integer.parseInt(lines[2], 16);//stream id,16进制 + } catch (NumberFormatException e) { + e.printStackTrace(); + Log.e(TAG, "getDaxStreamId exception: " + e.getMessage()); + } + } + } + return 0; + } + + /** + * 分割消息的头和内容,并分别负值给head和content + * + * @param line 消息 + * @param split 分隔符 + */ + private void getHeadAndContent(String line, String split) { + String[] temp = line.split(split); + if (line.length() > 1) { + head = temp[0]; + content = temp[1]; + } else { + head = ""; + content = ""; + + } + + if (temp.length > 2) { + exContent = temp[2]; + } else { + exContent = ""; + } + + } + + public String resultStatus() { + if (resultValue == 0) { + return String.format(GeneralVariables.getStringFromResource( + R.string.instruction_success), flexCommand.toString()); + } else { + return String.format(GeneralVariables.getStringFromResource( + R.string.instruction_failed), flexCommand.toString(), rawData); + } + } + + } + + + // ********事件的Getter和Setter********* + + public OnReceiveDataListener getOnReceiveDataListener() { + return onReceiveDataListener; + } + + public void setOnReceiveDataListener(OnReceiveDataListener onReceiveDataListener) { + this.onReceiveDataListener = onReceiveDataListener; + } + + public OnCommandListener getOnCommandListener() { + return onCommandListener; + } + + public void setOnCommandListener(OnCommandListener onCommandListener) { + this.onCommandListener = onCommandListener; + } + + public RadioTcpClient getTcpClient() { + return tcpClient; + } + + public String getVersion() { + return version; + } + + public int getHandle() { + return handle; + } + + public String getHandleStr() { + return String.format("%X", handle); + } + + public void setHandle(int handle) { + this.handle = handle; + } + + public boolean isAllFlexRadioStatusEvent() { + return allFlexRadioStatusEvent; + } + + public void setAllFlexRadioStatusEvent(boolean allFlexRadioStatusEvent) { + this.allFlexRadioStatusEvent = allFlexRadioStatusEvent; + } + + public String getClientID() { + return clientID; + } + + public void setClientID(String clientID) { + clientID = clientID; + } + + public int getCommandSeq() { + return commandSeq * 1000 + flexCommand.ordinal(); + } + + public String getCommandStr() { + return commandStr; + } + + public long getDaxAudioStreamId() { + return daxAudioStreamId; + } + + public String getDiscovery_protocol_version() { + return discovery_protocol_version; + } + + public String getModel() { + return model; + } + + public String getSerial() { + return serial; + } + + public String getNickname() { + return nickname; + } + + public String getCallsign() { + return callsign; + } + + public String getIp() { + return ip; + } + + public int getPort() { + return port; + } + + public String getStatus() { + return status; + } + + public String getInUse_ip() { + return inUse_ip; + } + + public String getInUse_host() { + return inUse_host; + } + + public String getMax_licensed_version() { + return max_licensed_version; + } + + public String getRadio_license_id() { + return radio_license_id; + } + + public String getRequires_additional_license() { + return requires_additional_license; + } + + public String getFpc_mac() { + return fpc_mac; + } + + public int getWan_connected() { + return wan_connected; + } + + public int getLicensed_clients() { + return licensed_clients; + } + + public int getAvailable_clients() { + return available_clients; + } + + public int getMax_panadapters() { + return max_panadapters; + } + + public int getAvailable_panadapters() { + return available_panadapters; + } + + public int getMax_slices() { + return max_slices; + } + + public int getAvailable_slices() { + return available_slices; + } + + public String getGui_client_ips() { + return gui_client_ips; + } + + public String getGui_client_hosts() { + return gui_client_hosts; + } + + public String getGui_client_programs() { + return gui_client_programs; + } + + public String getGui_client_stations() { + return gui_client_stations; + } + + public String getGui_client_handles() { + return gui_client_handles; + } + + public boolean isAvailable() { + return isAvailable; + } + + public OnTcpConnectStatus getOnTcpConnectStatus() { + return onTcpConnectStatus; + } + + public void setOnTcpConnectStatus(OnTcpConnectStatus onTcpConnectStatus) { + this.onTcpConnectStatus = onTcpConnectStatus; + } + + public OnReceiveStreamData getOnReceiveStreamData() { + return onReceiveStreamData; + } + + public void setOnReceiveStreamData(OnReceiveStreamData onReceiveStreamData) { + this.onReceiveStreamData = onReceiveStreamData; + } + + public OnStatusListener getOnStatusListener() { + return onStatusListener; + } + + public void setOnStatusListener(OnStatusListener onStatusListener) { + this.onStatusListener = onStatusListener; + } + + public RadioUdpClient getStreamClient() { + return streamClient; + } + + public AudioTrack getAudioTrack() { + return audioTrack; + } + + + public static float[] getFloatFromBytes(byte[] bytes) { + float[] floats = new float[bytes.length / 4]; + DataInputStream dis = new DataInputStream(new ByteArrayInputStream(bytes)); + for (int i = 0; i < floats.length; i++) { + try { + floats[i] = dis.readFloat(); + } catch (IOException e) { + e.printStackTrace(); + Log.e(TAG, "getFloat: ------>>" + e.getMessage()); + break; + } + } + try { + dis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + return floats; + } + + public void setIp(String ip) { + this.ip = ip; + } + + public void setModel(String model) { + this.model = model; + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/flex/FlexRadioFactory.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/flex/FlexRadioFactory.java new file mode 100644 index 00000000..833e2ec5 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/flex/FlexRadioFactory.java @@ -0,0 +1,185 @@ +package com.bg7yoz.ft8cn.flex; + +import android.util.Log; + +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.SocketException; +import java.util.ArrayList; +import java.util.Timer; +import java.util.TimerTask; + +// VITA 形成的发现消息解析器的枚举定义 +//enum VitaTokens { +// nullToken , +// ipToken, +// portToken, +// modelToken, +// serialToken, +// callsignToken, +// nameToken, +// dpVersionToken, +// versionToken, +// statusToken, +//}; +/** + * RadioFactory 当前发现的所有收音机。 + * RadioFactory: 实例化这个类来创建一个 Radio Factory,它将为网络上发现的无线电维护FlexRadio列表flexRadios。 + * + * 通过Upd协议,在4992端口的广播数据中获取vita协议数据,并解析出序列号,用于更新电台列表flexRadios。 + * @author BGY70Z + * @date 2023-03-20 + */ +public class FlexRadioFactory { + private static final String TAG="FlexRadioFactory"; + private static final int FLEX_DISCOVERY_PORT =4992; + private static FlexRadioFactory instance=null; + private final RadioUdpClient broadcastClient ; + private OnFlexRadioEvents onFlexRadioEvents; + + private Timer refreshTimer=null; + private TimerTask refreshTask=null; + + public ArrayList flexRadios=new ArrayList<>(); + + /** + * 获取电台列表实例 + * @return 电台列表实例 + */ + public static FlexRadioFactory getInstance(){ + if (instance==null){ + instance= new FlexRadioFactory(); + } + return instance; + } + + + + public FlexRadioFactory() { + broadcastClient = new RadioUdpClient(FLEX_DISCOVERY_PORT); + + broadcastClient.setOnUdpEvents(new RadioUdpClient.OnUdpEvents() { + @Override + public void OnReceiveData(DatagramSocket socket, DatagramPacket packet, byte[] data) { + VITA vita = new VITA(data); + if (vita.isAvailable//如果数据包有效,且classId=0x534CFFFF,StreamId=0x800,更新电台列表 + &&vita.informationClassCode==VITA.FLEX_CLASS_ID + &&vita.packetClassCode==VITA.VS_Discovery + &&vita.streamId==VITA.FLEX_Discovery_stream_ID){ + updateFlexRadioList(new String(vita.payload)); + } + } + }); + try { + broadcastClient.setActivated(true); + } catch (SocketException e) { + e.printStackTrace(); + Log.e(TAG, "FlexRadioFactory: "+e.getMessage()); + } + + } + + + public void startRefreshTimer(){ + if (refreshTimer==null) { + refreshTask=new TimerTask() { + @Override + public void run() { + Log.e(TAG, "run: 检查离线" ); + checkOffLineRadios(); + } + }; + refreshTimer=new Timer(); + refreshTimer.schedule(refreshTask, 1000, 1000);//检查电台列表中的电台是否在线(每一秒) + } + } + public void cancelRefreshTimer(){ + if (refreshTimer!=null){ + refreshTimer.cancel(); + refreshTimer=null; + refreshTask.cancel(); + refreshTask=null; + } + } + + /** + * 从数据中查找电台的序列号 + * @param s 数据 + * @return 序列号 + */ + private String getSerialNum(String s){ + String[] strings=s.split(" "); + for (int i = 0; i > 28) +public static intVH_C(x) ((x & 0x08000000) >> 26) +public static intVH_T(x) ((x & 0x04000000) >> 25) +public static intVH_TSI(x) ((x & 0x00c00000) >> 21) +public static intVH_TSF(x) ((x & 0x00300000) >> 19) +public static intVH_PKT_CNT(x) ((x & 0x000f0000) >> 16) +public static intVH_PKT_SIZE(x) (x & 0x0000ffff) + */ + +// Enumerates for field values + +import android.annotation.SuppressLint; + +import java.nio.ByteBuffer; + + + +public class VITA { + private static final String TAG = "VITA"; + + // 最小有效的VITA包长度 + private static final int VITAmin = 28; + + public static final int FRS_OUI = 0x12cd; + //public static final int VITA_PORT = 4991; + + public static final int FLEX_CLASS_ID = 0x534C; + public static final int FLEX_DAX_AUDIO_CLASS_ID = 0x534C03E3; + public static final int FLEX_DAX_IQ_CLASS_ID = 0x534C00E3; + public static final int FLEX_FFT_CLASS_ID = 0x534C8003; + public static final int FLEX_METER_CLASS_ID = 0x534C8002; + public static final int FLEX_Discovery_stream_ID = 0x800; + + + public static final int VS_Meter = 0x8002; + public static final int VS_PAN_FFT = 0x8003; + public static final int VS_Waterfall = 0x8004; + public static final int VS_Opus = 0x8005; + public static final int DAX_IQ_24Khz = 0x00e3; + public static final int DAX_IQ_48Khz = 0x00e4; + public static final int DAX_IQ_96Khz = 0x00e5; + public static final int DAX_IQ_192KHz = 0x00e6; + public static final int VS_DAX_Audio = 0x03e3; + public static final int VS_Discovery = 0xffff; + + //与x6100有关的id信息 + public static final long XIEGU_Discovery_Class_Id = 0x005849454755FFFFL; + public static final int XIEGU_Discovery_Stream_Id = 0x00000800; + public static final long XIEGU_AUDIO_CLASS_ID = 0x00584945475500A1L; + public static final int XIEGU_PING_Stream_Id= 0x00000600; + public static final long XIEGU_PING_CLASS_ID = 0x58494547550006L; + public static final long XIEGU_METER_CLASS_ID = 0x58494547550007L; + public static final int XIEGU_METER_Stream_Id= 0x00000700; + + + + private byte[] buffer; + public boolean streamIdPresent;//是否有流字符 + public VitaPacketType packetType; + public boolean classIdPresent;//指示数据包中是否包含类标识符(类ID)字段 + public boolean trailerPresent;//指示数据包是否包含尾部。 + public VitaTSI tsi;//时间戳的类型。 + public VitaTSF tsf;//时间戳小数部分类型 + public int packetCount;//包计数器,可以对连续的IF data packet进行计数,这些packet具有相同的Stream Identifier 和packet type。 + public int packetSize;//表示有多少32bit数在IF Data packet 里面 + public int streamId;//流ID,32位 + //时间戳共有两部分,小数部分和整数部分,整数部分以秒为分辨率,32位,小数部分64位。 + public int integerTimestamp;//u_int32,long是64位的 + public long fracTimeStamp; + public long oui; + public int informationClassCode;//无用了,用classId代替 + public int packetClassCode;//无用了,用classId代替 + public int classId;//FLEX应该是0x534CFFF,是informationClassCode与packetClassCode合并的 + public long classId64; + + public byte[] payload = null; + public long trailer; + public boolean isAvailable = false;//电台对象是否有效。 + + /** + * 设置vita数据包的头部 + * @param packet 数据包 + * @return 数据包 + */ + public byte[] setVitaPacketHeader(byte[] packet){ + if (packet.length < 28) return packet; + packet[0] = (byte) (packetType.ordinal() << 4);//packetType + if (classIdPresent) packet[0] |=0x08; + if (trailerPresent) packet[0] |= 0x04; + + + packet[1] = (byte) (packetCount & 0xf);//packet count + packet[1] |= (byte) (tsi.ordinal() << 6);//TSI + packet[1] |= (byte) (tsf.ordinal() << 4);//TSF + + packet[2] = (byte) ((packetSize & 0xff00 ) >> 8 & 0xff);//packetSize 1(高8位) + packet[3] = (byte) (packetSize & 0xff);//packetSize 2(低8位) + + //-----Stream Identifier--No.2 word---- + packet[4] = (byte) (((streamId & 0x00ff000000) >> 24) & 0xff); + packet[5] = (byte) (((streamId & 0x0000ff0000) >> 16) & 0xff); + packet[6] = (byte) (((streamId & 0x000000ff00) >> 8) & 0xff); + packet[7] = (byte) (streamId & 0x00000000ff); + //----Class ID--No.3 words---- + + packet[8] = 0x00; + packet[9] = (byte)(((classId64 & 0x00ff000000000000L) >> 48)& 0xff); + packet[10] =(byte)(((classId64 & 0x0000ff0000000000L) >> 40)& 0xff); + packet[11] =(byte)(((classId64 & 0x000000ff00000000L) >> 32)& 0xff); + + //---Class ID--No.4 word---- + packet[12] =(byte)(((classId64 & 0x00000000ff000000L) >> 24)& 0xff); + packet[13] =(byte)(((classId64 & 0x0000000000ff0000L) >> 16)& 0xff); + packet[14] =(byte)(((classId64 & 0x000000000000ff00L) >> 8)& 0xff); + packet[15] =(byte)((classId64 & 0x00000000000000ffL )); + + //---Timestamp Int--No.5 word---- + packet[16] =(byte)(((integerTimestamp & 0xff000000) >> 24)& 0xff); + packet[17] =(byte)(((integerTimestamp & 0x00ff0000) >> 16)& 0xff); + packet[18] =(byte)(((integerTimestamp & 0x0000ff00) >> 8)& 0xff); + packet[19] =(byte)(integerTimestamp & 0x000000ff); + + //---Timestamp franc Int--No.6 No.7 word---- + packet[20] = (byte)(((fracTimeStamp & 0xff00000000000000L) >> 56)& 0xff); + packet[21] = (byte)(((fracTimeStamp & 0x00ff000000000000L) >> 48)& 0xff); + packet[22] = (byte)(((fracTimeStamp & 0x0000ff0000000000L) >> 40)& 0xff); + packet[23] = (byte)(((fracTimeStamp & 0x000000ff00000000L) >> 32)& 0xff); + //---Class ID--No.4 word---- + + packet[24] =(byte)(((fracTimeStamp & 0x00000000ff000000L) >> 24)& 0xff); + packet[25] =(byte)(((fracTimeStamp & 0x0000000000ff0000L) >> 16)& 0xff); + packet[26] =(byte)(((fracTimeStamp & 0x000000000000ff00L) >> 8)& 0xff); + packet[27] =(byte)(fracTimeStamp & 0x00000000000000ffL ) ; + return packet; + } + + public byte[] pingDataToVita(){ + byte[] result=new byte[28]; + return setVitaPacketHeader(result); + } + + /** + * 生成音频流的VITA数据包 + * + * @param count 包计数器 + * @param payload 音频流数据 + * @return vita数据包 + */ + public byte[] audioShortDataToVita(int count, short[] payload){ + packetType = VitaPacketType.EXT_DATA_WITH_STREAM; + classIdPresent = true; + trailerPresent = false;//没有尾巴 + tsi = VitaTSI.TSI_OTHER;// + tsf = VitaTSF.TSF_SAMPLE_COUNT; + this.packetCount = count; + this.packetSize = (payload.length / 2) + 7; + + byte[] result=new byte[payload.length*2 + 28]; + setVitaPacketHeader(result); + + //----HEADER--No.1 word------ + +// result[0] = (byte) (packetType.ordinal() << 4);//packetType +// if (classIdPresent) result[0] |=0x08; +// if (trailerPresent) result[0] |= 0x04; +// +// +// result[1] = (byte) (packetCount & 0xf);//packet count +// result[1] |= (byte) (tsi.ordinal() << 6);//TSI +// result[1] |= (byte) (tsf.ordinal() << 4);//TSF +// +// result[2] = (byte) ((packetSize & 0xff00 ) >> 8 & 0xff);//packetSize 1(高8位) +// result[3] = (byte) (packetSize & 0xff);//packetSize 2(低8位) +// +// //-----Stream Identifier--No.2 word---- +// result[4] = (byte) (((streamId & 0x00ff000000) >> 24) & 0xff); +// result[5] = (byte) (((streamId & 0x0000ff0000) >> 16) & 0xff); +// result[6] = (byte) (((streamId & 0x000000ff00) >> 8) & 0xff); +// result[7] = (byte) (streamId & 0x00000000ff); +// //----Class ID--No.3 words---- +// +// result[8] = 0x00; +// result[9] = (byte)(((classId64 & 0x00ff000000000000L) >> 48)& 0xff); +// result[10] =(byte)(((classId64 & 0x0000ff0000000000L) >> 40)& 0xff); +// result[11] =(byte)(((classId64 & 0x000000ff00000000L) >> 32)& 0xff); +// +// //---Class ID--No.4 word---- +// result[12] =(byte)(((classId64 & 0x00000000ff000000L) >> 24)& 0xff); +// result[13] =(byte)(((classId64 & 0x0000000000ff0000L) >> 16)& 0xff); +// result[14] =(byte)(((classId64 & 0x000000000000ff00L) >> 8)& 0xff); +// result[15] =(byte)((classId64 & 0x00000000000000ffL )); +// +// //---Timestamp Int--No.5 word---- +// result[16] =(byte)(((integerTimestamp & 0xff000000) >> 24)& 0xff); +// result[17] =(byte)(((integerTimestamp & 0x00ff0000) >> 16)& 0xff); +// result[18] =(byte)(((integerTimestamp & 0x0000ff00) >> 8)& 0xff); +// result[19] =(byte)(integerTimestamp & 0x000000ff); +// +// //---Timestamp franc Int--No.6 No.7 word---- +// result[20] = (byte)(((fracTimeStamp & 0xff00000000000000L) >> 56)& 0xff); +// result[21] = (byte)(((fracTimeStamp & 0x00ff000000000000L) >> 48)& 0xff); +// result[22] = (byte)(((fracTimeStamp & 0x0000ff0000000000L) >> 40)& 0xff); +// result[23] = (byte)(((fracTimeStamp & 0x000000ff00000000L) >> 32)& 0xff); +// //---Class ID--No.4 word---- +// +// result[24] =(byte)(((fracTimeStamp & 0x00000000ff000000L) >> 24)& 0xff); +// result[25] =(byte)(((fracTimeStamp & 0x0000000000ff0000L) >> 16)& 0xff); +// result[26] =(byte)(((fracTimeStamp & 0x000000000000ff00L) >> 8)& 0xff); +// result[27] =(byte)(fracTimeStamp & 0x00000000000000ffL ) ; + + for (int i = 0; i < payload.length ; i++) { + result[28+i*2]=(byte)(payload[i]&0xff) ; + result[28+i*2+1]= (byte)((payload[i]>>8)&0xff) ; + } + return result; + } + + + /** + * 生成音频流的VITA数据包,id应当是电台create stream是赋给的 + * @param data 音频流数据 + * @return vita数据包 + */ + public byte[] audioFloatDataToVita(int count, float[] data) { + byte[] result = new byte[data.length * 4 + 28];//一个float占用4个字节,28字节是包头的长度7个word + packetType = VitaPacketType.EXT_DATA_WITH_STREAM; + classIdPresent = true; + trailerPresent = false;//没有尾巴 + tsi = VitaTSI.TSI_OTHER;// + tsf = VitaTSF.TSF_SAMPLE_COUNT; + this.packetCount = count; + this.packetSize = (data.length / 2) + 7; + + + //----HEADER--No.1 word------ + + result[0] = (byte) (packetType.ordinal() << 4);//packetType + if (classIdPresent) result[0] |=0x08; + if (trailerPresent) result[0] |= 0x04; + + + result[1] = (byte) (packetCount & 0xf);//packet count + result[1] |= (byte) (tsi.ordinal() << 6);//TSI + result[1] |= (byte) (tsf.ordinal() << 4);//TSF + + result[2] = (byte) ((packetSize & 0xff00 ) >> 8 & 0xff);//packetSize 1(高8位) + result[3] = (byte) (packetSize & 0xff);//packetSize 2(低8位) + + //-----Stream Identifier--No.2 word---- + result[4] = (byte) (((streamId & 0x00ff000000) >> 24) & 0xff); + result[5] = (byte) (((streamId & 0x0000ff0000) >> 16) & 0xff); + result[6] = (byte) (((streamId & 0x000000ff00) >> 8) & 0xff); + result[7] = (byte) (streamId & 0x00000000ff); + //----Class ID--No.3 words---- + + result[8] = 0x00; + result[9] = (byte)(((classId64 & 0x00ff000000000000L) >> 48)& 0xff); + result[10] =(byte)(((classId64 & 0x0000ff0000000000L) >> 40)& 0xff); + result[11] =(byte)(((classId64 & 0x000000ff00000000L) >> 32)& 0xff); + + //---Class ID--No.4 word---- + result[12] =(byte)(((classId64 & 0x00000000ff000000L) >> 24)& 0xff); + result[13] =(byte)(((classId64 & 0x0000000000ff0000L) >> 16)& 0xff); + result[14] =(byte)(((classId64 & 0x000000000000ff00L) >> 8)& 0xff); + result[15] =(byte)((classId64 & 0x00000000000000ffL )); + + //---Timestamp Int--No.5 word---- + result[16] =(byte)(((integerTimestamp & 0xff000000) >> 24)& 0xff); + result[17] =(byte)(((integerTimestamp & 0x00ff0000) >> 16)& 0xff); + result[18] =(byte)(((integerTimestamp & 0x0000ff00) >> 8)& 0xff); + result[19] =(byte)(integerTimestamp & 0x000000ff); + + //---Timestamp franc Int--No.6 No.7 word---- + result[20] = (byte)(((fracTimeStamp & 0xff00000000000000L) >> 56)& 0xff); + result[21] = (byte)(((fracTimeStamp & 0x00ff000000000000L) >> 48)& 0xff); + result[22] = (byte)(((fracTimeStamp & 0x0000ff0000000000L) >> 40)& 0xff); + result[23] = (byte)(((fracTimeStamp & 0x000000ff00000000L) >> 32)& 0xff); + //---Class ID--No.4 word---- + + result[24] =(byte)(((fracTimeStamp & 0x00000000ff000000L) >> 24)& 0xff); + result[25] =(byte)(((fracTimeStamp & 0x0000000000ff0000L) >> 16)& 0xff); + result[26] =(byte)(((fracTimeStamp & 0x000000000000ff00L) >> 8)& 0xff); + result[27] =(byte)(fracTimeStamp & 0x00000000000000ffL ) ; + + + for (int i = 0; i < data.length; i++) { + byte[] bytes = ByteBuffer.allocate(4).putFloat(data[i]).array();//float转byte[] + result[i * 4 + 28] = bytes[0]; + result[i * 4 + 29] = bytes[1]; + result[i * 4 + 30] = bytes[2]; + result[i * 4 + 31] = bytes[3]; + } + + + + + return result; + } + + + public VITA() { + } + + public VITA( VitaPacketType packetType + , VitaTSI tsi, VitaTSF tsf + , int packetCount + , int streamId, long classId64) { + this.streamIdPresent = true; + this.packetType = packetType; + this.classIdPresent = true; + this.trailerPresent = false; + this.tsi = tsi; + this.tsf = tsf; + this.packetCount = packetCount; + this.streamId = streamId; + this.classId64 = classId64; + this.isAvailable = true; + } + + public VITA(byte[] data) { + this.buffer = data; + //如果包的长度太小,或包为空,就退出计算 + if (data == null) return; + if (data.length < VITAmin) return; + + isAvailable = true;//数据长度达到28个字节,说明是有效的。 + packetType = VitaPacketType.values()[(data[0] >> 4) & 0x0f]; + classIdPresent = (data[0] & 0x8) == 0x8;//指示数据包中是否包含类标识符(类ID)字段 + trailerPresent = (data[0] & 0x4) == 0x4;//指示数据包是否包含尾部。 + tsi = VitaTSI.values()[(data[1] >> 6) & 0x3];//如果有时间戳的话指示时间戳的整数部分是啥类型的 + tsf = VitaTSF.values()[(data[1] >> 4) & 0x3]; + packetCount = data[1] & 0x0f; + packetSize = ((((int) data[2]) & 0x00ff) << 8) | ((int) data[3]) & 0x00ff; + + int offset = 4;//定位 + //检查是否有流字符 + streamIdPresent = packetType == VitaPacketType.IF_DATA_WITH_STREAM + || packetType == VitaPacketType.EXT_DATA_WITH_STREAM; + + if (streamIdPresent) {//是否有流ID,获取流ID,32位 + streamId = ((((int) data[offset]) & 0x00ff) << 24) | ((((int) data[offset + 1]) & 0x00ff) << 16) + | ((((int) data[offset + 2]) & 0x00ff) << 8) | ((int) data[offset + 3]) & 0x00ff; + offset += 4; + } + + if (classIdPresent) { + //只取24位,前8位保留 + oui = ((((int) data[offset + 1]) & 0x00ff) << 16) + | ((((int) data[offset + 2]) & 0x00ff) << 8) | ((int) data[offset + 3]) & 0x00ff; + + informationClassCode = ((((int) data[offset + 4]) & 0x00ff) << 8) | ((int) data[offset + 5]) & 0x00ff; + packetClassCode = ((((int) data[offset + 6]) & 0x00ff) << 8) | ((int) data[offset + 7]) & 0x00ff; + + classId = ((((int) data[offset + 4]) & 0x00ff) << 24) | ((((int) data[offset + 5]) & 0x00ff) << 16) + | ((((int) data[offset + 6]) & 0x00ff) << 8) | ((int) data[offset + 7]) & 0x00ff; + + classId64 = ((((long) data[offset + 1]) & 0x00ff) << 48) + | ((((long) data[offset + 2]) & 0x00ff) << 40) + | ((((long) data[offset + 3]) & 0x00ff)<<32) + | ((((long) data[offset + 4]) & 0x00ff) << 24) + | ((((long) data[offset + 5]) & 0x00ff) << 16) + | ((((long) data[offset + 6]) & 0x00ff) << 8) + | ((long) data[offset + 7]) & 0x00ff; + //Log.d(TAG,String.format("classId64:%X",classId64)); + offset += 8; + } + //Log.e(TAG, "VITA: "+String.format("id: 0x%x, classIdPresent:0x%x,packetSize:%d",streamId,classId,packetSize) ); + + //获取时间戳,以秒为单位的时间戳,32位。 + //时间戳共有两部分,小数部分和整数部分,整数部分以秒为分辨率,32位, 主要传递UTC时间或者 GPS 时间, + //小数部分主要有三种,一种是sample-count ,以采样周期为最小分辨率,一种是real-time以ps为最小单位,第三种是以任意选择的时间进行累加得出的,前面两种时间戳可以直接与整数部分叠加,第三种则不能保证与整数部分保持恒定关系,前两种与整数部分叠加来操作的可以在覆盖的时间范围为年 + //小数部分的时间戳共有64位,小数部分可以在没有整数部分的情况下使用, + //所有的时间带来都是在以一个采样数据为该reference-point 时间 + if (tsi != VitaTSI.TSI_NONE) {//32位, + integerTimestamp = ((((int) data[offset]) & 0x00ff) << 24) | ((((int) data[offset + 1]) & 0x00ff) << 16) + | ((((int) data[offset + 2]) & 0x00ff) << 8) | ((int) data[offset + 3]) & 0x00ff; + offset += 4; + } + //获取时间戳的小数部分,64位。 + if (tsf != VitaTSF.TSF_NONE) { + fracTimeStamp = ((((long) data[offset]) & 0x00ff) << 56) | ((((long) data[offset + 1]) & 0x00ff) << 48) + | ((((long) data[offset + 2]) & 0x00ff) << 40) | ((((long) data[offset + 3]) & 0x00ff) << 32) + | ((((long) data[offset + 4]) & 0x00ff) << 24) | ((((int) data[offset + 5]) & 0x00ff) << 16) + | ((((int) data[offset + 6]) & 0x00ff) << 8) | ((int) data[offset + 7]) & 0x00ff; + offset += 8; + } + + + //Log.e(TAG, String.format("VITA: data length:%d,offset:%d",data.length,offset) ); + if (offset < data.length) { + payload = new byte[data.length - offset - (trailerPresent ? 2 : 0)];//如果有尾部,就减去一个word的位置 + System.arraycopy(data, offset, payload, 0, payload.length); + } + if (trailerPresent) { + trailer = ((((int) data[data.length - 2]) & 0x00ff) << 8) | ((int) data[data.length - 1]) & 0x00ff; + } + } + + /** + * 获取payload的长度,如果没有数据,payload长度为0; + * + * @return payload长度 + */ + public int getPayloadLength() { + if (buffer == null) { + return 0; + } else { + return buffer.length; + } + } + + /** + * 显示扩展数据 + * + * @return string + */ + public String showPayload() { + if (payload != null) { + return new String(payload);//.replace(" ", "\n"); + } else { + return ""; + } + } + + public String showPayloadHex() { + if (payload != null) { + return byteToStr(payload); + } else { + return ""; + } + } + + /** + * 显示VITA 49的包头信息 + * + * @return string + */ + @SuppressLint("DefaultLocale") + public String showHeadStr() { + return String.format("包类型(packetType): %s\n" + + "包数量(packetCount): %d\n" + + "包大小(packetSize): %d\n" + + "是否有流ID(streamIdPresent): %s\n" + + "流ID(streamId): 0x%X\n" + + "是否有类ID(classIdPresent): %s\n" + + "类ID(classId): 0x%X\n" + + "类高位(informationClassCode): 0x%X\n" + + "类低位(packetClassCode): 0x%X\n" + + "公司标识码(oui): 0x%X\n" + + "时间戳类型(tsi): %s\n" + + "时间戳整数部分(integerTimestamp):0x%X\n" + + "时间戳小数部分类型(tsf): %s\n" + + "时间戳小数部分值(fracTimeStamp): 0x%X\n" + + "负载长度(payloadLength): %d\n" + + "是否有尾部(trailerPresent): %s\n" + + , packetType.toString() + , packetCount + , packetSize + , streamIdPresent ? "是" : "否" + , streamId + , classIdPresent ? "是" : "否" + , classId + , informationClassCode + , packetClassCode + , oui + , tsi.toString() + , integerTimestamp + , tsf.toString() + , fracTimeStamp + , (payload == null ? 0 : payload.length) + , trailerPresent ? "是" : "否" + ); + } + + /** + * 显示VITA 49 包数据 + * + * @return string + */ + @SuppressLint("DefaultLocale") + @Override + public String toString() { + return String.format("%s负载(payload):\n%s\n" + , showHeadStr() + , (payload == null ? "" : new String(payload)) + ); + + + } + + + + public static String byteToStr(byte[] data) { + StringBuilder s = new StringBuilder(); + for (int i = 0; i < data.length; i++) { + s.append(String.format("%02x ", data[i] & 0xff)); + } + return s.toString(); + } + + + /** + * 把字节转换成short,做小端模式转换 + * + * @param data 字节数据 + * @param start 起始位置 + * @return short + */ + public static short readShortDataBigEnd(byte[] data, int start) { + if (data.length - start < 2) return 0; + return (short) ((short) data[start] & 0xff + | ((short) data[start +1] & 0xff) << 8); + } + + /** + * 把字节转换成short,不做小端转换!! + * + * @param data 字节数据 + * @param start 起始位置 + * @return short + */ + public static short readShortData(byte[] data, int start) { + if (data.length - start < 2) return 0; + return (short) ((short) data[start + 1] & 0xff + | ((short) data[start] & 0xff) << 8); + } + + public static float readShortFloat(byte[] data, int start) { + if (data.length - start < 2) return 0.0f; + int accum = 0; + accum = accum | (data[start] & 0xff) << 0; + accum = accum | (data[start + 1] & 0xff) << 8; + return Float.intBitsToFloat(accum); + } + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/flex/VitaPacketType.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/flex/VitaPacketType.java new file mode 100644 index 00000000..10b3d0c2 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/flex/VitaPacketType.java @@ -0,0 +1,10 @@ +package com.bg7yoz.ft8cn.flex; + +public enum VitaPacketType { + IF_DATA,//IF Data packet without Stream Identifier + IF_DATA_WITH_STREAM,//IF Data packet with Stream Identifier + EXT_DATA,//Extension Data packet without Stream Identifier + EXT_DATA_WITH_STREAM,//Extension Data packet with Stream Identifier + IF_CONTEXT,//IF Context packet(see Section 7) + EXT_CONTEXT//Extension Context packet(see Section 7); +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/flex/VitaTSF.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/flex/VitaTSF.java new file mode 100644 index 00000000..117b0e14 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/flex/VitaTSF.java @@ -0,0 +1,17 @@ +package com.bg7yoz.ft8cn.flex; + +//时间戳小数部分类型 +//小数部分主要有三种: +// 一种是sample-count ,以采样周期为最小分辨率, +// 一种是real-time以ps为最小单位, +// 第三种是以任意选择的时间进行累加得出的, +// 前面两种时间戳可以直接与整数部分叠加, +// 第三种则不能保证与整数部分保持恒定关系,前两种与整数部分叠加来操作的可以在覆盖的时间范围为年 +// 小数部分的时间戳共有64位,小数部分可以在没有整数部分的情况下使用, +// 所有的时间带来都是在以一个采样数据为该参考点(reference-point)的时间。 +public enum VitaTSF { + TSF_NONE,//No Fractional-seconds Timestamp field included. 不包括分数秒时间戳字段 + TSF_SAMPLE_COUNT,//Sample Count Timestamp. 样本计数时间戳 + TSF_REALTIME,//Real Time(Picoseconds) Timestamp. 实时(皮秒)时间戳 + TSF_FREERUN,//Free Running Count Timestamp. 自由运行计数时间戳 +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/flex/VitaTSI.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/flex/VitaTSI.java new file mode 100644 index 00000000..35c3e645 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/flex/VitaTSI.java @@ -0,0 +1,13 @@ +package com.bg7yoz.ft8cn.flex; + +//时间戳的类型 +//时间戳共有两部分,小数部分和整数部分,整数部分以秒为分辨率,32位, 主要传递UTC时间或者 GPS 时间, +//小数部分主要有三种,一种是sample-count ,以采样周期为最小分辨率,一种是real-time以ps为最小单位,第三种是以任意选择的时间进行累加得出的,前面两种时间戳可以直接与整数部分叠加,第三种则不能保证与整数部分保持恒定关系,前两种与整数部分叠加来操作的可以在覆盖的时间范围为年 +//小数部分的时间戳共有64位,小数部分可以在没有整数部分的情况下使用, +//所有的时间带来都是在以一个采样数据为该reference-point 时间 +public enum VitaTSI { + TSI_NONE,//No Integer-seconds Timestamp field included + TSI_UTC,//Coordinated Universal Time(UTC) + TSI_GPS,//GPS time + TSI_OTHER//Other +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/floatview/FloatView.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/floatview/FloatView.java new file mode 100644 index 00000000..618b442b --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/floatview/FloatView.java @@ -0,0 +1,381 @@ +package com.bg7yoz.ft8cn.floatview; +/** + * FloatButton的主界面 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.annotation.SuppressLint; +import android.content.Context; +import android.util.AttributeSet; +import android.util.TypedValue; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.widget.ImageButton; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.constraintlayout.widget.ConstraintSet; +import androidx.constraintlayout.widget.Constraints; + +import java.util.ArrayList; + + +public class FloatView extends ConstraintLayout { + private static final String TAG = "FloatView"; + + public enum FLOAT_BOARD { + LEFT, RIGHT, TOP, BUTTON + } + + + private int parentViewHeight = 100;//上一级view的高度 + private int parentViewWidth = 100;//上一级view的宽度 + private float mDownX = 0; + private float mDownY = 0; + private int lastLeft = 0; + private int lastTop = 0; + + + //------------悬浮窗口的属性-------------------- + private int buttonSize = 96;//按钮的大小 + private final ArrayList buttons = new ArrayList<>(); + private boolean originalFromTop = false;//是否上下靠边 + private boolean originalFromLeft = true;//是否左右靠边 + private int buttonBackgroundResourceId = -1;//按钮的背景 + private int backgroundResourceId = -1;//浮窗的背景 + private int buttonMargin = 0;//按钮在浮窗中的边界宽度 + private int floatMargin = 40;//浮窗距离边界的距离 + private FLOAT_BOARD floatBoard = FLOAT_BOARD.LEFT; + + + /** + * 构造函数,需要大小 + * + * @param context context + * @param buttonSize 按钮大小,正方形 + */ + public FloatView(@NonNull Context context, int buttonSize) { + this(context); + this.buttonSize = buttonSize; + } + + public FloatView(@NonNull Context context) { + this(context, null); + } + + public FloatView(@NonNull Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0); + } + + + public FloatView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + initView(); + } + + public FloatViewButton addButton(String name, int imageResourceId, OnClickListener onClickListener) { + FloatViewButton floatViewButton=getButtonByName(name); + if (floatViewButton==null){ + floatViewButton =addButton(View.generateViewId(), imageResourceId, onClickListener); + } + floatViewButton.setName(name); + return floatViewButton; + } + + public FloatViewButton addButton(int id, String name, int imageResourceId, OnClickListener onClickListener) { + FloatViewButton floatViewButton=getButtonByName(name); + if (floatViewButton==null){ + floatViewButton = addButton(id, imageResourceId, onClickListener); + } + floatViewButton.setName(name); + return floatViewButton; + } + + public FloatViewButton addButton(int id, int imageResourceId, OnClickListener onClickListener) { + FloatViewButton imageButton = new FloatViewButton(getContext()); + //imageButton.setScaleType(ImageView.ScaleType.FIT_CENTER); + imageButton.setImageResource(imageResourceId); + if (buttonBackgroundResourceId != -1) { + imageButton.setBackgroundResource(buttonBackgroundResourceId); + } + //imageButton.setId(R.id.float_nav); + imageButton.setId(id); + imageButton.setOnClickListener(onClickListener); + + imageButton.setAlpha(0.5f); + + addView(imageButton); + buttons.add(imageButton); + resetView(); + + return imageButton; + } + + /** + * 通过按钮的名称删除按钮 + * + * @param name 按钮的名称 + */ + public void deleteButtonByName(String name) { + for (int i = buttons.size() - 1; i >= 0; i--) { + FloatViewButton floatViewButton = buttons.get(i); + if (floatViewButton.getName().equals(name)) { + buttons.remove(i); + removeView(floatViewButton); + } + resetView(); + } + } + + public void deleteButtonByIndex(int index) { + if (buttons.size() > index && index > -1) { + FloatViewButton floatViewButton = buttons.get(index); + buttons.remove(index); + removeView(floatViewButton); + resetView(); + } + } + + public FloatViewButton getButtonByName(String name) { + for (FloatViewButton button : buttons) { + if (button.getName().equals(name)) { + return button; + } + } + return null; + } + + /** + * 把dp值转换为像素点 + * + * @param dp dp值 + * @return 像素点 + */ + private int dpToPixel(int dp) { + return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp + , getResources().getDisplayMetrics()); +// return (int) (dp*getResources().getDisplayMetrics().density); + } + + /** + * 重新设置一下按钮 + */ + public void resetView() { + for (int i = 0; i < buttons.size(); i++) { + //LayoutParams buttonLp = new LayoutParams(buttonSize, buttonSize); + LayoutParams buttonLp = new LayoutParams(dpToPixel(buttonSize), dpToPixel(buttonSize)); + buttonLp.startToStart = ConstraintSet.PARENT_ID; + buttonLp.endToEnd = ConstraintSet.PARENT_ID; + buttonLp.leftMargin = buttonMargin; + buttonLp.rightMargin = buttonMargin; + if (i == 0) { + buttonLp.topToTop = ConstraintSet.PARENT_ID; + buttonLp.topMargin = buttonMargin; + } else { + buttonLp.topToBottom = buttons.get(i - 1).getId(); + buttonLp.topMargin = buttonMargin+dpToPixel(4);//按钮之间留一点点空隙 + } + if (i == buttons.size() - 1) { + buttonLp.bottomToBottom = ConstraintSet.PARENT_ID; + buttonLp.bottomMargin = buttonMargin; + } + buttons.get(i).setLayoutParams(buttonLp); + } + + + } + + @SuppressLint("ClickableViewAccessibility") + private void initView() { + LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);// LayoutParams.WRAP_CONTENT); + lp.startToStart = ConstraintSet.PARENT_ID;//只连接窗口的左边和上边 + lp.topToTop = ConstraintSet.PARENT_ID; + this.setLayoutParams(lp); + } + + public void initLocation() { + initLocation(this.floatBoard); + } + + + /** + * 初始化浮窗的位置,默认在窗口的右侧, + */ + public void initLocation(FLOAT_BOARD float_board) { + this.floatBoard = float_board; + getParentViewHeightAndWidth(); + int width; + int height; + + if (parentViewWidth == 0 && parentViewHeight == 0) { + WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE); + width = wm.getDefaultDisplay().getWidth(); + height = wm.getDefaultDisplay().getHeight(); + } else {//这部分基本没有执行过 + width = parentViewWidth; + height = parentViewHeight; + } + switch (float_board) { + case RIGHT: + setLayoutLeftTop(width - dpToPixel(floatMargin * 2 - buttonSize) - 10 + , (int) (height / 2f - dpToPixel(buttonMargin + buttonSize * buttons.size())/2f)); + break; + case LEFT: + setLayoutLeftTop(floatMargin + 10 + , (int) (height / 2f - dpToPixel(buttonMargin + buttonSize * buttons.size() )/2f)); + break; + case TOP: + setLayoutLeftTop((int) (width / 2f - dpToPixel(buttonMargin - buttonSize) / 2f), floatMargin); + break; + case BUTTON: + setLayoutLeftTop((int) (width / 2f - dpToPixel(buttonMargin - buttonSize) / 2f) + , height - dpToPixel(floatMargin - buttonMargin * 2 - buttonSize * buttons.size())); + break; + } + + } + + /** + * 获取父View的高度和宽度 + */ + private void getParentViewHeightAndWidth() { + View view = (View) getParent(); + if (view != null) { + parentViewHeight = view.getHeight(); + parentViewWidth = view.getWidth(); + } + + } + + public void setLayoutLeftTop(int left, int top) { + ConstraintLayout.LayoutParams layoutParams = new Constraints.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT + , ViewGroup.LayoutParams.WRAP_CONTENT); + layoutParams.topToTop = ConstraintSet.PARENT_ID; + layoutParams.startToStart = ConstraintSet.PARENT_ID; + layoutParams.leftMargin = left; + layoutParams.topMargin = top; + setLayoutParams(layoutParams); + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent event) { + + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + mDownX = event.getX(); + mDownY = event.getY(); + break; + case MotionEvent.ACTION_MOVE: + offsetTopAndBottom((int) (event.getY() - mDownY)); + offsetLeftAndRight((int) (event.getX() - mDownX)); + + lastLeft = getLeft(); + lastTop = getTop(); + setLayoutLeftTop(getLeft(), getTop()); + + case MotionEvent.ACTION_UP: + + setLayoutLeftTop(lastLeft, lastTop); + + adsorbTopAdnBottom();//吸附上下 + adsorbLeftAndRight();//吸附左右 + break; + case MotionEvent.ACTION_CANCEL: + break; + + } + return super.onInterceptTouchEvent(event); + } + + + private void adsorbTopAdnBottom() { + if (originalFromTop) { + getParentViewHeightAndWidth(); + + float boundaryLine = parentViewHeight / 4f; + if (getTop() < boundaryLine) { + setLayoutLeftTop(getLeft(), floatMargin); + } else if (getBottom() > parentViewHeight - boundaryLine) { + setLayoutLeftTop(getLeft(), parentViewHeight - getHeight() - floatMargin); + } + } + } + + private void adsorbLeftAndRight() { + if (originalFromLeft) { + getParentViewHeightAndWidth(); + float boundaryLine = parentViewWidth / 4f; + if (getLeft() < boundaryLine) { + setLayoutLeftTop(floatMargin, getTop()); + } else if (getRight() > parentViewWidth - boundaryLine) { + setLayoutLeftTop(parentViewWidth - getWidth() - floatMargin, getTop()); + //animate().setInterpolator(new DecelerateInterpolator()).setDuration(300).x(parentViewWidth - getWidth() - floatMargin).start(); + } + } + } + + + public boolean isOriginalFromTop() { + return originalFromTop; + } + + public void setOriginalFromTop(boolean originalFromTop) { + this.originalFromTop = originalFromTop; + } + + public boolean isOriginalFromLeft() { + return originalFromLeft; + } + + public void setOriginalFromLeft(boolean originalFromLeft) { + this.originalFromLeft = originalFromLeft; + } + + public int getButtonBackgroundResourceId() { + return buttonBackgroundResourceId; + } + + public void setButtonBackgroundResourceId(int buttonBackgroundResourceId) { + this.buttonBackgroundResourceId = buttonBackgroundResourceId; + for (ImageButton button : this.buttons) { + button.setBackgroundResource(buttonBackgroundResourceId); + } + } + + public int getBackgroundResourceId() { + return backgroundResourceId; + } + + public void setBackgroundResourceId(int backgroundResourceId) { + this.setBackgroundResource(backgroundResourceId); + this.backgroundResourceId = backgroundResourceId; + } + + public int getButtonMargin() { + return buttonMargin; + } + + public void setButtonMargin(int buttonMargin) { + this.buttonMargin = buttonMargin; + } + + public int getFloatMargin() { + return floatMargin; + } + + public void setFloatMargin(int floatMargin) { + this.floatMargin = floatMargin; + } + + public FLOAT_BOARD getFloatBoard() { + return floatBoard; + } + + public void setFloatBoard(FLOAT_BOARD float_board) { + this.floatBoard = float_board; + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/floatview/FloatViewButton.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/floatview/FloatViewButton.java new file mode 100644 index 00000000..cba76706 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/floatview/FloatViewButton.java @@ -0,0 +1,39 @@ +package com.bg7yoz.ft8cn.floatview; +/** + * 自定义FloatButton + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.annotation.SuppressLint; +import android.content.Context; +import android.util.AttributeSet; +import android.widget.ImageButton; + +@SuppressLint("AppCompatCustomView") +public class FloatViewButton extends ImageButton { + private String name; + public FloatViewButton(Context context) { + super(context); + } + + public FloatViewButton(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public FloatViewButton(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + public String getName() { + if (name==null){ + return ""; + }else { + return name; + } + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ft8listener/A91List.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ft8listener/A91List.java new file mode 100644 index 00000000..c5163149 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ft8listener/A91List.java @@ -0,0 +1,31 @@ +package com.bg7yoz.ft8cn.ft8listener; + +import com.bg7yoz.ft8cn.ft8transmit.GenerateFT8; + +import java.util.ArrayList; + +public class A91List { + + public ArrayList list=new ArrayList<>(); + public void clear(){ + list.clear(); + } + public void add(byte[] data,float freq,float sec){ + A91 a91=new A91(data,sec,freq); + list.add(a91); + } + public int size(){ + return list.size(); + } + public static class A91{ + public byte[] a91 ;//= new byte[GenerateFT8.FTX_LDPC_K_BYTES]; + public float time_sec = 0;//时间偏移(秒) + public float freq_hz = 0;//频率 + + public A91(byte[] a91, float time_sec, float freq_hz) { + this.a91 = a91; + this.time_sec = time_sec; + this.freq_hz = freq_hz; + } + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ft8listener/FT8SignalListener.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ft8listener/FT8SignalListener.java new file mode 100644 index 00000000..f4b8b3b9 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ft8listener/FT8SignalListener.java @@ -0,0 +1,368 @@ +package com.bg7yoz.ft8cn.ft8listener; +/** + * 用于监听音频的类。监听通过时钟UtcTimer来控制周期,通过OnWaveDataListener接口来读取音频数据。 + * + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.util.Log; + +import androidx.lifecycle.MutableLiveData; + +import com.bg7yoz.ft8cn.FT8Common; +import com.bg7yoz.ft8cn.Ft8Message; +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.database.DatabaseOpr; +import com.bg7yoz.ft8cn.ft8transmit.GenerateFT8; +import com.bg7yoz.ft8cn.timer.OnUtcTimer; +import com.bg7yoz.ft8cn.timer.UtcTimer; +import com.bg7yoz.ft8cn.wave.OnGetVoiceDataDone; +import com.bg7yoz.ft8cn.wave.WaveFileReader; +import com.bg7yoz.ft8cn.wave.WaveFileWriter; + +import java.util.ArrayList; + +public class FT8SignalListener { + private static final String TAG = "FT8SignalListener"; + private final UtcTimer utcTimer; + //private HamRecorder hamRecorder; + private final OnFt8Listen onFt8Listen;//当开始监听,解码结束后触发的事件 + //private long band; + public MutableLiveData decodeTimeSec = new MutableLiveData<>();//解码的时长 + public long timeSec=0;//解码的时长 + + private OnWaveDataListener onWaveDataListener; + + + private DatabaseOpr db; + + private final A91List a91List = new A91List();//a91列表 + + + static { + System.loadLibrary("ft8cn"); + } + + public interface OnWaveDataListener { + void getVoiceData(int duration, boolean afterDoneRemove, OnGetVoiceDataDone getVoiceDataDone); + } + + public FT8SignalListener(DatabaseOpr db, OnFt8Listen onFt8Listen) { + //this.hamRecorder = hamRecorder; + this.onFt8Listen = onFt8Listen; + this.db = db; + + //创建动作触发器,与UTC时间同步,以15秒一个周期,DoOnSecTimer是在周期起始时触发的事件。150是15秒 + utcTimer = new UtcTimer(FT8Common.FT8_SLOT_TIME_M, false, new OnUtcTimer() { + @Override + public void doHeartBeatTimer(long utc) {//不触发时的时钟信息 + } + + @Override + public void doOnSecTimer(long utc) {//当指定间隔时触发时 + Log.d(TAG, String.format("触发录音,%d", utc)); + runRecorde(utc); + } + }); + } + + public void startListen() { + utcTimer.start(); + } + + public void stopListen() { + utcTimer.stop(); + } + + public boolean isListening() { + return utcTimer.isRunning(); + } + + /** + * 获取当前时间的偏移量,这里包括总的时钟偏移,也包括本实例的偏移 + * + * @return int + */ + public int time_Offset() { + return utcTimer.getTime_sec() + UtcTimer.delay; + } + + /** + * 录音。在后台以多线程的方式录音,录音自动生成一个临时的Wav格式文件。 + * 有两个回调函数,用于开始录音时和结束录音时。当结束录音时,激活解码程序。 + * + * @param utc 当前解码的UTC时间 + */ + private void runRecorde(long utc) { + Log.d(TAG, "开始录音..."); + + if (onWaveDataListener != null) { + onWaveDataListener.getVoiceData(FT8Common.FT8_SLOT_TIME_MILLISECOND, true + , new OnGetVoiceDataDone() { + @Override + public void onGetDone(float[] data) { + Log.d(TAG, String.format("开始解码...###,数据长度:%d",data.length)); + decodeFt8(utc, data); + } + }); + } + } + + public void decodeFt8(long utc, float[] voiceData) { + + //此处是测试用代码------------------------- +// String fileName = getCacheFileName("test_01.wav"); +// Log.e(TAG, "onClick: fileName:" + fileName); +// WaveFileReader reader = new WaveFileReader(fileName); +// int data[][] = reader.getData(); + //---------------------------------------------------------- + + new Thread(new Runnable() { + @Override + public void run() { + long time = System.currentTimeMillis(); + if (onFt8Listen != null) { + onFt8Listen.beforeListen(utc); + } + +// float[] tempData = ints2floats(data); + + + ///读入音频数据,并做预处理 + //其实这种方式要注意一个问题,在一个周期之内,必须解码完毕,否则新的解码又要开始了 + long ft8Decoder = InitDecoder(utc, FT8Common.SAMPLE_RATE + , voiceData.length, true); +// , tempData.length, true); + DecoderMonitorPressFloat(voiceData, ft8Decoder);//读入音频数据 +// DecoderMonitorPressFloat(tempData, ft8Decoder);//读入音频数据 + + + ArrayList allMsg = new ArrayList<>(); +// ArrayList msgs = runDecode(utc, voiceData,false); + ArrayList msgs = runDecode(ft8Decoder, utc, false); + addMsgToList(allMsg, msgs); + timeSec = System.currentTimeMillis() - time; + decodeTimeSec.postValue(timeSec);//解码耗时 + if (onFt8Listen != null) { + onFt8Listen.afterDecode(utc, averageOffset(allMsg), UtcTimer.sequential(utc), msgs, false); + } + + + if (GeneralVariables.deepDecodeMode) {//进入深度解码模式 + //float[] newSignal=tempData; + msgs = runDecode(ft8Decoder, utc, true); + addMsgToList(allMsg, msgs); + timeSec = System.currentTimeMillis() - time; + decodeTimeSec.postValue(timeSec);//解码耗时 + if (onFt8Listen != null) { + onFt8Listen.afterDecode(utc, averageOffset(allMsg), UtcTimer.sequential(utc), msgs, true); + } + + do { + if (timeSec > FT8Common.DEEP_DECODE_TIMEOUT) break;//此处做超时检测,超过一定时间(7秒),就不做减码操作了 + //减去解码的信号 + ReBuildSignal.subtractSignal(ft8Decoder, a91List); + + //再做一次解码 + msgs = runDecode(ft8Decoder, utc, true); + addMsgToList(allMsg, msgs); + timeSec = System.currentTimeMillis() - time; + decodeTimeSec.postValue(timeSec);//解码耗时 + if (onFt8Listen != null) { + onFt8Listen.afterDecode(utc, averageOffset(allMsg), UtcTimer.sequential(utc), msgs, true); + } + + } while (msgs.size() > 0 ); + + } + //移到finalize() 方法中调用了 + DeleteDecoder(ft8Decoder); + + Log.d(TAG, String.format("解码耗时:%d毫秒", System.currentTimeMillis() - time)); + + } + }).start(); + } + + + private ArrayList runDecode(long ft8Decoder, long utc, boolean isDeep) { + ArrayList ft8Messages = new ArrayList<>(); + Ft8Message ft8Message = new Ft8Message(FT8Common.FT8_MODE); + + ft8Message.utcTime = utc; + ft8Message.band = GeneralVariables.band; + a91List.clear(); + + setDecodeMode(ft8Decoder, isDeep);//设置迭代次数,isDeep==true,迭代次数增加 + + int num_candidates = DecoderFt8FindSync(ft8Decoder);//最多120个 + //long startTime = System.currentTimeMillis(); + for (int idx = 0; idx < num_candidates; ++idx) { + //todo 应当做一下超时计算 + try {//做一下解码失败保护 + if (DecoderFt8Analysis(idx, ft8Decoder, ft8Message)) { + + if (ft8Message.isValid) { + Ft8Message msg = new Ft8Message(ft8Message);//此处使用msg,是因为有的哈希呼号会把<...>替换掉 + byte[] a91 = DecoderGetA91(ft8Decoder); + a91List.add(a91, ft8Message.freq_hz, ft8Message.time_sec); + + if (checkMessageSame(ft8Messages, msg)) { + continue; + } + + msg.isWeakSignal = isDeep;//是不是弱信号 + ft8Messages.add(msg); + + } + } + } catch (Exception e) { + Log.e(TAG, "run: " + e.getMessage()); + } + + } + + + return ft8Messages; + } + + /** + * 计算平均时间偏移值 + * + * @param messages 消息列表 + * @return 偏移值 + */ + private float averageOffset(ArrayList messages) { + if (messages.size() == 0) return 0f; + float dt = 0; + //int dtAverage = 0; + for (Ft8Message msg : messages) { + dt += msg.time_sec; + } + return dt / messages.size(); + } + + /** + * 把消息添加到列表中 + * + * @param allMsg 消息列表 + * @param newMsg 新的消息 + */ + private void addMsgToList(ArrayList allMsg, ArrayList newMsg) { + for (int i = newMsg.size() - 1; i >= 0; i--) { + if (checkMessageSame(allMsg, newMsg.get(i))) { + newMsg.remove(i); + } else { + allMsg.add(newMsg.get(i)); + } + } + } + + /** + * 检查消息列表里同样的内容是否存在 + * + * @param ft8Messages 消息列表 + * @param ft8Message 消息 + * @return boolean + */ + private boolean checkMessageSame(ArrayList ft8Messages, Ft8Message ft8Message) { + for (Ft8Message msg : ft8Messages) { + if (msg.getMessageText().equals(ft8Message.getMessageText())) { + if (msg.snr < ft8Message.snr) { + msg.snr = ft8Message.snr; + } + return true; + } + } + return false; + } + + @Override + protected void finalize() throws Throwable { + //DeleteDecoder(ft8Decoder); + super.finalize(); + } + + public OnWaveDataListener getOnWaveDataListener() { + return onWaveDataListener; + } + + public void setOnWaveDataListener(OnWaveDataListener onWaveDataListener) { + this.onWaveDataListener = onWaveDataListener; + } + + + public String getCacheFileName(String fileName) { + return GeneralVariables.getMainContext().getCacheDir() + "/" + fileName; + } + + public float[] ints2floats(int data[][]) { + float temp[] = new float[data[0].length]; + for (int i = 0; i < data[0].length; i++) { + temp[i] = data[0][i] / 32768.0f; + } + return temp; + } + + public int[] floats2ints(float data[]) { + int temp[] = new int[data.length]; + for (int i = 0; i < data.length; i++) { + temp[i] = (int) (data[i] * 32767.0f); + } + return temp; + } + + /** + * 解码的第一步,初始化解码器,获取解码器的地址。 + * + * @param utcTime UTC时间 + * @param sampleRat 采样率,12000 + * @param num_samples 缓冲区数据的长度 + * @param isFt8 是否是FT8信号 + * @return 返回解码器的地址 + */ + public native long InitDecoder(long utcTime, int sampleRat, int num_samples, boolean isFt8); + + /** + * 解码的第二步,读取Wav数据。 + * + * @param buffer Wav数据缓冲区 + * @param decoder 解码器数据的地址 + */ + public native void DecoderMonitorPress(int[] buffer, long decoder); + + public native void DecoderMonitorPressFloat(float[] buffer, long decoder); + + + /** + * 解码的第三步,同步数据。 + * + * @param decoder 解码器地址 + * @return 中标信号的数量 + */ + public native int DecoderFt8FindSync(long decoder); + + /** + * 解码的第四步,分析出消息。(需要在一个循环里) + * + * @param idx 中标信号的序号 + * @param decoder 解码器的地址 + * @param ft8Message 解出来的消息 + * @return boolean + */ + public native boolean DecoderFt8Analysis(int idx, long decoder, Ft8Message ft8Message); + + /** + * 解码的最后一步,删除解码器数据 + * + * @param decoder 解码器数据的地址 + */ + public native void DeleteDecoder(long decoder); + + public native void DecoderFt8Reset(long decoder, long utcTime, int num_samples); + + public native byte[] DecoderGetA91(long decoder);//获取当前message的a91数据 + + public native void setDecodeMode(long decoder, boolean isDeep);//设置解码的模式,isDeep=true是多次迭代,=false是快速迭代 +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ft8listener/OnFt8Listen.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ft8listener/OnFt8Listen.java new file mode 100644 index 00000000..04492d07 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ft8listener/OnFt8Listen.java @@ -0,0 +1,27 @@ +package com.bg7yoz.ft8cn.ft8listener; +/** + * 监听音频的回调,当结束解码后,调用afterDecode来通知解码的消息 + * @author BGY70Z + * @date 2023-03-20 + */ + +import com.bg7yoz.ft8cn.Ft8Message; + +import java.util.ArrayList; + +public interface OnFt8Listen { + /** + * 当开始监听时触发的事件 + * @param utc 当前的UTC时间 + */ + void beforeListen(long utc); + + /** + *当解码结束后触发的事件 + * @param utc 当前周期的UTC时间 + * @param time_sec 此次平均的偏移时间(秒) + * @param sequential 当前的时序 + * @param messages 消息列表 + */ + void afterDecode(long utc,float time_sec,int sequential, ArrayList messages,boolean isDeep); +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ft8listener/ReBuildSignal.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ft8listener/ReBuildSignal.java new file mode 100644 index 00000000..5e2a3a55 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ft8listener/ReBuildSignal.java @@ -0,0 +1,28 @@ +package com.bg7yoz.ft8cn.ft8listener; + +import android.util.Log; + +import com.bg7yoz.ft8cn.FT8Common; +import com.bg7yoz.ft8cn.Ft8Message; +import com.bg7yoz.ft8cn.ft8transmit.GenerateFT8; +import com.bg7yoz.ft8cn.wave.WaveFileWriter; + +import java.util.ArrayList; + +public class ReBuildSignal { + private static String TAG = "ReBuildSignal"; + static { + System.loadLibrary("ft8cn"); + } + + + public static void subtractSignal(long decoder,A91List a91List){ + for (A91List.A91 a91 : a91List.list) { + doSubtractSignal(decoder,a91.a91,FT8Common.SAMPLE_RATE,a91.freq_hz,a91.time_sec); + } + } + + private static native void doSubtractSignal(long decoder,byte[] payload,int sample_rate + ,float frequency,float time_sec); + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ft8signal/FT8Package.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ft8signal/FT8Package.java new file mode 100644 index 00000000..034a1692 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ft8signal/FT8Package.java @@ -0,0 +1,376 @@ +package com.bg7yoz.ft8cn.ft8signal; +/** + * 按照FT8协议打包符号。 + * + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.util.Log; + +import com.bg7yoz.ft8cn.Ft8Message; +import com.bg7yoz.ft8cn.ft8transmit.GenerateFT8; + +public class FT8Package { + private static final String TAG = "FT8Package"; + public static final int NTOKENS = 2063592; + public static final int MAX22 = 4194304; + public static final int MAXGRID4 = 32400; + + + private static final String A1 = " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + private static final String A2 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + private static final String A3 = "0123456789"; + private static final String A4 = " ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + private static final String A5 = " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ/"; + + static { + System.loadLibrary("ft8cn"); + } + + + /** + * 生成i3=4的非标准消息的77位数据包。 + * @param message 消息 + * @return 数据包 + */ + public static byte[] generatePack77_i4(Ft8Message message) { + + String toCall = message.callsignTo.replace("<", "").replace(">", ""); + String fromCall = message.callsignFrom.replace("<", "").replace(">", ""); + int hash12; + if (message.checkIsCQ()) {//如果是CQ,就把自己的呼号的哈希加上 + hash12 = getHash12(fromCall); + } else { + hash12 = getHash12(toCall); + } + if (fromCall.length() > 11) {//非标准呼号的长度不等长于11位 + fromCall = fromCall.substring(0, 11); + } + + byte[] data = new byte[10]; + long n58 = 0; + for (int i = 0; i < fromCall.length(); i++) { + n58 = n58 * 38 + A5.indexOf(fromCall.charAt(i)); + } + //n58=3479529522318088L; + + data[0] = (byte) ((hash12 & 0x00000fff) >> 4); + data[1] = (byte) ((hash12 & 0x0000000f) << 4); + data[1] = (byte) (data[1] | ((n58 & 0x0fff_ffff_ffff_ffffL) >> 54)); + data[2] = (byte) (((n58 & 0x00ff_ffff_ffff_ffffL) >> 54 - 8)); + data[3] = (byte) (((n58 & 0x0000_ffff_ffff_ffffL) >> 54 - 8 - 8)); + data[4] = (byte) (((n58 & 0x0000_00ff_ffff_ffffL) >> 54 - 8 - 8 - 8)); + data[5] = (byte) (((n58 & 0x0000_0000_ffff_ffffL) >> 54 - 8 - 8 - 8 - 8)); + data[6] = (byte) (((n58 & 0x0000_0000_00ff_ffffL) >> 54 - 8 - 8 - 8 - 8 - 8)); + data[7] = (byte) (((n58 & 0x0000_0000_0000_ffffL) >> 54 - 48)); + data[8] = (byte) (((n58 & 0x0000_0000_0000_00ffL) << 2)); + //RRR=1,RR73=2,73=3,""=0 + if (message.checkIsCQ()) { + data[9] = (byte) 0x60; + } else { + data[9] = (byte) 0x20; + switch (message.extraInfo) { + case "RRR": //r2=1 + data[8] = (byte) (data[8] & 0xfe); + data[9] = (byte) (data[9] | 0x80); + break; + case "RR73": //r2=2 + data[8] = (byte) (data[8] | 0x01); + //data[9] = (byte) (data[9] | 0x00);//data[9]无需改变 + break; + case "73": //r2=3 + data[8] = (byte) (data[8] | 0x01); + data[9] = (byte) (data[9] | 0x80); + break; + } + } + + return data; + } + + /** + * 从复合呼号中提取标准呼号,复合呼号是指带“/”的呼号。 + * 此应用场景:双方都是复合呼号,那么发送方(我方)要改为标准呼号。 + * 从复合呼号提取标准呼号的逻辑是:拆解“/”分隔的部分,取符合FT8标准呼号的正则表达式,如果没有则取最长字符串部分。 + * @param compoundCallsign 复合呼号 + * @return 标准呼号 + */ + public static String getStdCall(String compoundCallsign) { + if (!compoundCallsign.contains("/")) return compoundCallsign; + String[] callsigns = compoundCallsign.split("/"); + for (String callsign : callsigns) {//用正则表达式提取标准呼号 + //FT8的认定:标准业余呼号由一个或两个字符的前缀组成,其中至少一个必须是字母,后跟一个十进制数字和最多三个字母的后缀。 + if (callsign.matches("[A-Z0-9]?[A-Z0-9][0-9][A-Z][A-Z0-9]?[A-Z]?")) { + return callsign; + } + } + //当无法提取标准呼号时,取最长的字段 + int len = 0; + int index = 0; + for (int i = 0; i < callsigns.length; i++) { + if (callsigns[i].length() > len) { + len = callsigns[i].length(); + index = i; + } + } + return callsigns[index]; + } + + /** + * i1=1,i1=2,在FT8协议的定义当中,分别是标准消息,和欧盟甚高频(EU VHF),这两个消息的唯一区别是: + * i1=1,消息可以带/R,i1=2,消息是可以带/P + * 所以,这两个消息可以合并为一个类型。 + * + * @param message 原始消息 + * @return packet77 + */ + public static byte[] generatePack77_i1(Ft8Message message) { + String toCall = message.callsignTo.replace("<", "").replace(">", ""); + String fromCall = message.callsignFrom.replace("<", "").replace(">", ""); + + if (message.checkIsCQ() && message.modifier != null) {//把修饰符加上 + if (message.modifier.length() > 0) { + toCall = toCall + " " + message.modifier; + } + } + + //如果以/P 或/R结尾的呼号,要把这个/P /R去掉 + if (toCall.endsWith("/P") || toCall.endsWith("/R")) { + toCall = toCall.substring(0, toCall.length() - 2); + } + + if (fromCall.endsWith("/P") || fromCall.endsWith("/R")) { + fromCall = fromCall.substring(0, fromCall.length() - 2); +// fromCall = message.callsignFrom.substring(0, message.callsignFrom.length() - 2); + } + + //当双方都是复合呼号或非标准呼号时(带/的呼号),我的呼号变成标准呼号 + if ((toCall.contains("/")) && fromCall.contains("/")) { + fromCall = getStdCall(fromCall);//从复合呼号中提取标准呼号 + // fromCall = fromCall.substring(0, fromCall.indexOf("/")); + } + byte r1_p1=pack_r1_p1(message.callsignTo); + + byte r2_p2; + //如果双方都有后缀,但不是相同的类型后缀,则取消r1或p1标志,以发送方后缀为准 + if ((message.callsignFrom.endsWith("/R")&&message.callsignTo.endsWith("/P")) + ||(message.callsignFrom.endsWith("/P")&&message.callsignTo.endsWith("/R"))){ + r2_p2=0; + }else { + r2_p2 = pack_r1_p1(message.getCallsignFrom()); + } + + + byte[] data = new byte[12]; + data[0] = (byte) ((pack_c28(toCall) & 0x0fffffff) >> 20); + data[1] = (byte) ((pack_c28(toCall) & 0x00ffffff) >> 12); + data[2] = (byte) ((pack_c28(toCall) & 0x0000ffff) >> 4); + data[3] = (byte) ((pack_c28(toCall) & 0x0000000f) << 4); + //data[3] = (byte) (data[3] | (pack_r1_p1(message.callsignTo) << 3)); + data[3] = (byte) (data[3] | (r1_p1 << 3)); + data[3] = (byte) (data[3] | (pack_c28(fromCall) & 0x00fffffff) >> 25); + + + data[4] = (byte) ((pack_c28(fromCall) & 0x003ffffff) >> 25 - 8); + data[5] = (byte) ((pack_c28(fromCall) & 0x00003ffff) >> 25 - 8 - 8); + data[6] = (byte) ((pack_c28(fromCall) & 0x0000003ff) >> 25 - 8 - 8 - 8); + data[7] = (byte) ((pack_c28(fromCall) & 0x0000000ff) << 7); + + + data[7] = (byte) (data[7] | (r2_p2) << 6); + //data[7] = (byte) (data[7] | (pack_r1_p1(message.getCallsignFrom())) << 6); + data[7] = (byte) (data[7] | (pack_R1_g15(message.extraInfo) & 0x0ffff) >> 10); + data[8] = (byte) ((pack_R1_g15(message.extraInfo) & 0x0003fff) >> 2); + data[9] = (byte) ((pack_R1_g15(message.extraInfo) & 0x00000ff) << 6); + data[9] = (byte) (data[9] | (message.i3 & 0x3) << 3); + return data; + } + + /** + * 生成R1+g15数据(网格、或信号报告),实际是16位,包括前面R1。如R-17:R1=1,-17:R1=0 + * + * @param grid4 网格或信号报告 + * @return 返回R1+g15数据 + */ + public static int pack_R1_g15(String grid4) { + if (grid4 == null)// 只有两个呼号,没有信号报告和网格 + { + return MAXGRID4 + 1; + } + if (grid4.length() == 0) {// 只有两个呼号,没有信号报告和网格 + return MAXGRID4 + 1; + } + + // 特殊的报告,RRR,RR73,73 + if (grid4.equals("RRR")) + return MAXGRID4 + 2; + if (grid4.equals("RR73")) + return MAXGRID4 + 3; + if (grid4.equals("73")) + return MAXGRID4 + 4; + + + // 检查是不是标准的4字符网格 + if (grid4.matches("[A-Z][A-Z][0-9][0-9]")) { + int igrid4 = grid4.charAt(0) - 'A'; + igrid4 = igrid4 * 18 + (grid4.charAt(1) - 'A'); + igrid4 = igrid4 * 10 + (grid4.charAt(2) - '0'); + igrid4 = igrid4 * 10 + (grid4.charAt(3) - '0'); + return igrid4; + } + + + // 检查是不是信号报告: +dd / -dd / R+dd / R-dd + // 信号报告在-30到99dB之间 + // 信号报告的正则:[R]?[+-][0-9]{1,2} + String s = grid4; + if (grid4.charAt(0) == 'R') { + s = grid4.substring(1); + int irpt = 35 + Integer.parseInt(s); + return (MAXGRID4 + irpt) | 0x8000; // R1 = 1 + } else { + int irpt = 35 + Integer.parseInt(grid4); + return (MAXGRID4 + irpt); // R1 = 0 + } + + } + + public static byte pack_r1_p1(String callsign) { + String s = callsign.substring(callsign.length() - 2); + if (s.equals("/R") || s.equals("/P")) { + return 1; + } else { + return 0; + } + } + + /** + * 根据呼号生成c28数据。呼号为标准呼号时,不带/R或/P。如果呼号不是标准呼号,用hash22+2063592; + * + * @param callsign 呼号 + * @return c28数据 + */ + public static int pack_c28(String callsign) { + //byte[] data=new byte[]{(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00}; + switch (callsign) { + case "DE": + return 0; + case "QRZ": + return 1; + case "CQ": + return 2; + } + + //判断是否有修饰符000-999,A-Z,AA-ZZ,AAA-ZZZ,AAAA-ZZZZ + if (callsign.startsWith("CQ ") && callsign.length() > 3) { + String temp = callsign.substring(3).trim().toUpperCase(); + if (temp.matches("[0-9]{3}")) { + int i = Integer.parseInt(temp); + return i + 3; + } + if (temp.matches("[A-Z]{1,4}")) { + + int a0 = 0; + int a1 = 0; + int a2 = 0; + int a3 = 0; + if (temp.length() == 1) {//A-Z + a0 = (int) temp.charAt(0) - 65; + return a0 + 1004; + } + if (temp.length() == 2) {//AA-ZZ + a0 = (int) temp.charAt(0) - 65; + a1 = (int) temp.charAt(1) - 65; + return a0 * 27 + a1 + 1031; + } + if (temp.length() == 3) {//AAA-ZZZ + a0 = (int) temp.charAt(0) - 65; + a1 = (int) temp.charAt(1) - 65; + a2 = (int) temp.charAt(2) - 65; + return a0 * 27 * 27 + a1 * 27 + a2 + 1760; + } + if (temp.length() == 4) {//AAAA-ZZZZ + a0 = (int) temp.charAt(0) - 65; + a1 = (int) temp.charAt(1) - 65; + a2 = (int) temp.charAt(2) - 65; + a3 = (int) temp.charAt(3) - 65; + return a0 * 27 * 27 * 27 + a1 * 27 * 27 + a2 * 27 + a3 + 21443; + } + } + } + + + //格式化成标准的呼号。6位、第3位带数字 + //c6也可以是非标准呼号。大于6位的都是非标准呼号 + String c6 = formatCallsign(callsign); + //判断是不是标准呼号 + if (!GenerateFT8.checkIsStandardCallsign(callsign)) {//生成HASH22+2063592 + return NTOKENS + getHash22(callsign); + } + + //6位呼号取值 + int i0, i1, i2, i3, i4, i5; + i0 = A1.indexOf(c6.substring(0, 1)); + i1 = A2.indexOf(c6.substring(1, 2)); + i2 = A3.indexOf(c6.substring(2, 3)); + i3 = A4.indexOf(c6.substring(3, 4)); + i4 = A4.indexOf(c6.substring(4, 5)); + i5 = A4.indexOf(c6.substring(5, 6)); + + int n28 = i0; + n28 = n28 * 36 + i1; + n28 = n28 * 10 + i2; + n28 = n28 * 27 + i3; + n28 = n28 * 27 + i4; + n28 = n28 * 27 + i5; + + + return NTOKENS + MAX22 + n28; + + } + + + /** + * 格式化标准的呼号 + * 标准呼号是6位,前缀是1~2个字母+1个数字,后缀对多3个字母 + * 格式化的内容: + * 1.斯威士兰(Swaziland)的呼号前缀问题: 3DA0XYZ -> 3D0XYZ + * 2.几内亚(Guinea)呼号前缀问题: 3XA0XYZ -> QA0XYZ + * 3.第2位是数字的呼号,前面用空格补充。A0XYZ->" A0XYZ" + * 4.后缀不足3位的,也要补足空格。BA2BI->"BA2BI " + * + * @param callsign 呼号 + * @return 返回C28值,以int的值来表示 + */ + private static String formatCallsign(String callsign) { + String c6 = callsign; + // 解决斯威士兰(Swaziland)的呼号前缀问题: 3DA0XYZ -> 3D0XYZ + if (callsign.length() > 3 && callsign.substring(0, 4).equals("3DA0") && callsign.length() <= 7) { + c6 = "3D0" + callsign.substring(4); + // 解决几内亚(Guinea)呼号前缀问题: 3XA0XYZ -> QA0XYZ + } else if (callsign.length() > 3 && callsign.substring(0, 3).matches("3X[A-Z]") && callsign.length() <= 7) { + c6 = "Q" + callsign.substring(2); + } else { + // 第2位是数字,第3位是字母的,要在前面补充空格:A0XYZ -> " A0XYZ",A6开头的除外 + if (callsign.substring(0, 3).matches("[A-Z][0-9][A-Z]")) { + c6 = " " + callsign; + } + } + + if (c6.length() < 6) {//如果长度不足6位,结尾补充空格 + for (int i = 0; i < 6 - c6.length() + 1; i++) { + c6 = c6 + " "; + } + } + + return c6; + } + + public static native int getHash12(String callsign); + + + public static native int getHash10(String callsign); + + public static native int getHash22(String callsign); +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ft8transmit/FT8TransmitSignal.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ft8transmit/FT8TransmitSignal.java new file mode 100644 index 00000000..cf2d7573 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ft8transmit/FT8TransmitSignal.java @@ -0,0 +1,1109 @@ +package com.bg7yoz.ft8cn.ft8transmit; +/** + * 与发射信号有关的类。包括分析通联过程的自动程序。 + * + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.annotation.SuppressLint; +import android.media.AudioAttributes; +import android.media.AudioFormat; +import android.media.AudioTrack; +import android.util.Log; + +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.Observer; + +import com.bg7yoz.ft8cn.FT8Common; +import com.bg7yoz.ft8cn.Ft8Message; +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.connector.ConnectMode; +import com.bg7yoz.ft8cn.database.ControlMode; +import com.bg7yoz.ft8cn.database.DatabaseOpr; +import com.bg7yoz.ft8cn.log.QSLRecord; +import com.bg7yoz.ft8cn.rigs.BaseRigOperation; +import com.bg7yoz.ft8cn.timer.OnUtcTimer; +import com.bg7yoz.ft8cn.timer.UtcTimer; +import com.bg7yoz.ft8cn.ui.ToastMessage; + +import java.util.ArrayList; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +public class FT8TransmitSignal { + private static final String TAG = "FT8TransmitSignal"; + + private boolean transmitFreeText = false; + private String freeText = "FREE TEXT"; + + private final DatabaseOpr databaseOpr;//配置信息,和相关数据的数据库 + private TransmitCallsign toCallsign;//目标呼号 + public MutableLiveData mutableToCallsign = new MutableLiveData<>(); + + private int functionOrder = 6; + public MutableLiveData mutableFunctionOrder = new MutableLiveData<>();//指令的顺序变化 + private boolean activated = false;//是否处于可以发射的模式 + public MutableLiveData mutableIsActivated = new MutableLiveData<>(); + public int sequential;//发射的时序 + public MutableLiveData mutableSequential = new MutableLiveData<>(); + private boolean isTransmitting = false; + public MutableLiveData mutableIsTransmitting = new MutableLiveData<>();//是否处于发射状态 + public MutableLiveData mutableTransmittingMessage = new MutableLiveData<>();//当前消息的内容 + + //public MutableLiveData currentOrder = new MutableLiveData<>();//当前要发射的指令 + + //******************************************** + //此处的信息是用于保存QSL的 + private long messageStartTime = 0;//消息开始的时间 + private long messageEndTime = 0;//消息结束的时间 + private String toMaidenheadGrid = "";//目标的网格信息 + private int sendReport = 0;//我发送到对方的报告 + private int sentTargetReport = -100;// + + + private int receivedReport = 0;//我接收到的报告 + private int receiveTargetReport = -100;//发送给对方的信号报告 + //******************************************** + private final OnTransmitSuccess onTransmitSuccess;//一般是用于保存QSL数据 + + + //防止播放中止,变量不能放在方法中 + private AudioAttributes attributes = null; + private AudioFormat myFormat = null; + private AudioTrack audioTrack = null; + + public UtcTimer utcTimer; + + + public ArrayList functionList = new ArrayList<>(); + public MutableLiveData> mutableFunctions = new MutableLiveData<>(); + + private final OnDoTransmitted onDoTransmitted;//一般是用于打开关闭PTT + private final ExecutorService doTransmitThreadPool = Executors.newCachedThreadPool(); + private final DoTransmitRunnable doTransmitRunnable = new DoTransmitRunnable(this); + + static { + System.loadLibrary("ft8cn"); + } + + /** + * 发射模块的构造函数,需要两个回调,一个是当发射时(有两个动作,用于打开/关闭PTT),另一个时当成功时(用于保存QSL)。 + * + * @param databaseOpr 数据库 + * @param doTransmitted 当发射前后时的回调 + * @param onTransmitSuccess 当发射成功时的回调 + */ + public FT8TransmitSignal(DatabaseOpr databaseOpr + , OnDoTransmitted doTransmitted, OnTransmitSuccess onTransmitSuccess) { + this.onDoTransmitted = doTransmitted;//用于打开关闭PTT的事件 + this.onTransmitSuccess = onTransmitSuccess;//用于保存QSL的事件 + this.databaseOpr = databaseOpr; + + setTransmitting(false); + setActivated(false); + + + //观察音量设置的变化 + GeneralVariables.mutableVolumePercent.observeForever(new Observer() { + @Override + public void onChanged(Float aFloat) { + if (audioTrack != null) { + audioTrack.setVolume(aFloat); + } + } + }); + + utcTimer = new UtcTimer(FT8Common.FT8_SLOT_TIME_M, false, new OnUtcTimer() { + @Override + public void doHeartBeatTimer(long utc) { + + } + + //@RequiresApi(api = Build.VERSION_CODES.N) + @Override + public void doOnSecTimer(long utc) { + //超过自动监管时间,就停止 + if (GeneralVariables.isLaunchSupervisionTimeout()) { + setActivated(false); + return; + } + if (UtcTimer.getNowSequential() == sequential && activated) { + if (GeneralVariables.myCallsign.length() < 3) { + //我的呼号不正确,不能发射! + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.callsign_error)); + return; + } + doTransmit();//发射动作还是准确按时间来,延迟是音频信号的延迟 + } + } + }); + + utcTimer.start(); + + } + + /** + * 立即发射 + */ + //@RequiresApi(api = Build.VERSION_CODES.N) + public void transmitNow() { + if (GeneralVariables.myCallsign.length() < 3) { + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.callsign_error)); + return; + } + ToastMessage.show(String.format(GeneralVariables.getStringFromResource(R.string.adjust_call_target) + , toCallsign.callsign)); + + //把信号报告相关的复位 + resetTargetReport(); + + if (UtcTimer.getNowSequential() == sequential) { + if ((UtcTimer.getSystemTime() % 15000) < 2500) { + setTransmitting(false); + doTransmit(); + } + } + } + + //发射信号 + //@RequiresApi(api = Build.VERSION_CODES.N) + public void doTransmit() { + if (!activated) { + return; + } + //检测是不是黑名单频率,WSPR-2的频率,频率=电台频率+声音频率 + if (BaseRigOperation.checkIsWSPR2( + GeneralVariables.band + Math.round(GeneralVariables.getBaseFrequency()))) { + ToastMessage.show(String.format(GeneralVariables.getStringFromResource(R.string.use_wspr2_error) + , BaseRigOperation.getFrequencyAllInfo(GeneralVariables.band))); + setActivated(false); + return; + } + Log.d(TAG, "doTransmit: 开始发射..."); + doTransmitThreadPool.execute(doTransmitRunnable); + + mutableFunctions.postValue(functionList); + } + + /** + * 设置呼叫,生成发射消息列表 + * + * @param transmitCallsign 目标呼号 + * @param functionOrder 命令顺序 + * @param toMaidenheadGrid 目标网格 + */ + @SuppressLint("DefaultLocale") + //@RequiresApi(api = Build.VERSION_CODES.N) + public void setTransmit(TransmitCallsign transmitCallsign + , int functionOrder, String toMaidenheadGrid) { + + messageStartTime = 0;//复位起始的时间 + + Log.d(TAG, "准备发射数据..."); + if (GeneralVariables.checkFun1(toMaidenheadGrid)) { + this.toMaidenheadGrid = toMaidenheadGrid; + } else { + this.toMaidenheadGrid = ""; + } + mutableToCallsign.postValue(transmitCallsign);//设定呼叫的目标对象(含报告、时序,频率,呼号) + toCallsign = transmitCallsign;//设定呼叫的目标 + //mutableToCallsign.postValue(toCallsign);//设定呼叫的目标 + + if (functionOrder == -1) {//说明是回复消息 + //此时的toMaidenheadGrid是extraInfo + this.functionOrder = GeneralVariables.checkFunOrderByExtraInfo(toMaidenheadGrid) + 1; + if (this.functionOrder == 6) {//如果已经是73了,就改到消息1 + this.functionOrder = 1; + } + } else { + this.functionOrder = functionOrder;//当前指令的序号 + } + + if (transmitCallsign.frequency == 0) { + transmitCallsign.frequency = GeneralVariables.getBaseFrequency(); + } + if (GeneralVariables.synFrequency) {//如果是同频发送,就与目标呼号频率一致 + setBaseFrequency(transmitCallsign.frequency); + } + + sequential = (toCallsign.sequential + 1) % 2;//发射的时序 + mutableSequential.postValue(sequential);//通知发射时序改变 + generateFun(); + mutableFunctionOrder.postValue(functionOrder); + + } + + @SuppressLint("DefaultLocale") + public void setBaseFrequency(float freq) { + GeneralVariables.setBaseFrequency(freq); + //写到数据中 + databaseOpr.writeConfig("freq", String.format("%.0f", freq), null); + } + + /** + * 根据消息号,生成对应的消息 + * + * @param order 消息号 + * @return FT8消息 + */ + public Ft8Message getFunctionCommand(int order) { + switch (order) { + //发射模式1,BG7YOY BG7YOZ OL50 + case 1: + resetTargetReport();//把给对方的信号报告记录复位成-100 + return new Ft8Message(1, 0, toCallsign.callsign, GeneralVariables.myCallsign + , GeneralVariables.getMyMaidenhead4Grid()); + //发射模式2,BG7YOY BG7YOZ -10 + case 2: + sentTargetReport = toCallsign.snr; + + return new Ft8Message(1, 0, toCallsign.callsign + , GeneralVariables.myCallsign, toCallsign.getSnr()); + //发射模式3,BG7YOY BG7YOZ R-10 + case 3: + sentTargetReport = toCallsign.snr; + return new Ft8Message(1, 0, toCallsign.callsign + , GeneralVariables.myCallsign, "R" + toCallsign.getSnr()); + //发射模式4,BG7YOY BG7YOZ RRR + case 4: + return new Ft8Message(1, 0, toCallsign.callsign + , GeneralVariables.myCallsign, "RR73"); + //发射模式5,BG7YOY BG7YOZ 73 + case 5: + return new Ft8Message(1, 0, toCallsign.callsign + , GeneralVariables.myCallsign, "73"); + //发射模式6,CQ BG7YOZ OL50 + case 6: + resetTargetReport();//把给对方的信号报告,接收到对方的信号报告记录复位成-100 + Ft8Message msg = new Ft8Message(1, 0, "CQ", GeneralVariables.myCallsign + , GeneralVariables.getMyMaidenhead4Grid()); + msg.modifier = GeneralVariables.toModifier; + return msg; + } + + return new Ft8Message("CQ", GeneralVariables.myCallsign + , GeneralVariables.getMyMaidenhead4Grid()); + } + + /** + * 生成指令序列 + */ + public void generateFun() { + //ArrayList functions = new ArrayList<>(); + GeneralVariables.noReplyCount = 0; + functionList.clear(); + for (int i = 1; i <= 6; i++) { + if (functionOrder == 6) {//如果当前的指令序列是6(CQ),那么就只生成一个消息 + functionList.add(new FunctionOfTransmit(6, getFunctionCommand(6), false)); + break; + } else { + functionList.add(new FunctionOfTransmit(i, getFunctionCommand(i), false)); + } + } + mutableFunctions.postValue(functionList); + setCurrentFunctionOrder(functionOrder);//设置当前消息 + } + + /** + * 为了最大限度兼容,把32位浮点转换成16位整型,有些声卡不支持32位的浮点。 + * + * @param buffer 32位浮点音频 + * @return 16位整型 + */ + private short[] float2Short(float[] buffer) { + short[] temp = new short[buffer.length + 8];//多出8个为0的数据包,是为了兼容QP-7C的RP2040音频判断 + for (int i = 0; i < buffer.length; i++) { + float x = buffer[i]; + if (x > 1.0) + x = 1.0f; + else if (x < -1.0) + x = -1.0f; + temp[i] = (short) (x * 32767.0); + } + return temp; + } + + private void playFT8Signal(Ft8Message msg) { + + if (GeneralVariables.connectMode == ConnectMode.NETWORK) {//网络方式就不播放音频了 + Log.d(TAG, "playFT8Signal: 进入网络发射程序,等待音频发送。"); + + + if (onDoTransmitted != null) {//处理音频数据,可以给ICOM的网络模式发送 + onDoTransmitted.onTransmitByWifi(msg); + } + + + long now = System.currentTimeMillis(); + while (isTransmitting) {//等待音频数据包发送完毕再退出,以触发afterTransmitting + try { + Thread.sleep(1); + long current = System.currentTimeMillis() - now; + if (current > 13100) {//实际发射的时长 + isTransmitting = false; + break; + } + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + Log.d(TAG, "playFT8Signal: 退出网络音频发送。"); + afterPlayAudio(); + return; + } + + //进入到CAT串口传输音频方式 + //2023-08-16 由DS1UFX提交修改(基于0.9版),用于(tr)uSDX audio over cat的支持。 + if (GeneralVariables.controlMode == ControlMode.CAT) { + Log.d(TAG, "playFT8Signal: try to transmit over CAT"); + + if (onDoTransmitted != null) {//处理音频数据,可以给truSDX的CAT模式发送 + if (onDoTransmitted.supportTransmitOverCAT()) { + onDoTransmitted.onTransmitOverCAT(msg); + + long now = System.currentTimeMillis(); + while (isTransmitting) {//等待音频数据包发送完毕再退出,以触发afterTransmitting + try { + Thread.sleep(1); + long current = System.currentTimeMillis() - now; + if (current > 13000) {//实际发射的时长 + isTransmitting = false; + break; + } + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + Log.d(TAG, "playFT8Signal: transmitting over CAT is finished."); + afterPlayAudio(); + return; + } + } + } + + + //进入声卡模式 + float[] buffer; + buffer = GenerateFT8.generateFt8(msg, GeneralVariables.getBaseFrequency() + , GeneralVariables.audioSampleRate); + if (buffer == null) { + afterPlayAudio(); + return; + } + + Log.d(TAG, String.format("playFT8Signal: 准备声卡播放....位数:%s,采样率:%d" + , GeneralVariables.audioOutput32Bit ? "Float32" : "Int16" + , GeneralVariables.audioSampleRate)); + attributes = new AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_MEDIA) + .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) + .build(); + + //myFormat = new AudioFormat.Builder().setSampleRate(FT8Common.SAMPLE_RATE) + myFormat = new AudioFormat.Builder().setSampleRate(GeneralVariables.audioSampleRate) + .setEncoding(GeneralVariables.audioOutput32Bit ? //浮点与整型 + AudioFormat.ENCODING_PCM_FLOAT : AudioFormat.ENCODING_PCM_16BIT) + .setChannelMask(AudioFormat.CHANNEL_OUT_MONO).build(); + int mySession = 0; + audioTrack = new AudioTrack(attributes, myFormat + , GeneralVariables.audioOutput32Bit ? GeneralVariables.audioSampleRate * 15 * 4 + : GeneralVariables.audioSampleRate * 15 * 2//浮点与整型 + , AudioTrack.MODE_STATIC + , mySession); + + //区分32浮点和整型 + int writeResult; + if (GeneralVariables.audioOutput32Bit) { + writeResult = audioTrack.write(buffer, 0, buffer.length + , AudioTrack.WRITE_NON_BLOCKING); + } else { + short[] audio_data = float2Short(buffer); + writeResult = audioTrack.write(audio_data, 0, audio_data.length + , AudioTrack.WRITE_NON_BLOCKING); + } + + if (buffer.length > writeResult) { + Log.e(TAG, String.format("播放缓冲区不足:%d--->%d", buffer.length, writeResult)); + } + + //检查写入的结果,如果是异常情况,则直接需要释放资源 + if (writeResult == AudioTrack.ERROR_INVALID_OPERATION + || writeResult == AudioTrack.ERROR_BAD_VALUE + || writeResult == AudioTrack.ERROR_DEAD_OBJECT + || writeResult == AudioTrack.ERROR) { + //出异常情况 + Log.e(TAG, String.format("播放出错:%d", writeResult)); + afterPlayAudio(); + return; + } + audioTrack.setNotificationMarkerPosition(buffer.length); + audioTrack.setPlaybackPositionUpdateListener(new AudioTrack.OnPlaybackPositionUpdateListener() { + @Override + public void onMarkerReached(AudioTrack audioTrack) { + afterPlayAudio(); + } + + @Override + public void onPeriodicNotification(AudioTrack audioTrack) { + + } + }); + if (audioTrack != null) { + audioTrack.play(); + audioTrack.setVolume(GeneralVariables.volumePercent);//设置播放的音量 + } + } + + /** + * 播放完声音后的处理动作。包括回调onAfterTransmit,用于关闭PTT + */ + private void afterPlayAudio() { + if (onDoTransmitted != null) { + onDoTransmitted.onAfterTransmit(getFunctionCommand(functionOrder), functionOrder); + } + isTransmitting = false; + mutableIsTransmitting.postValue(false); + if (audioTrack != null) { + audioTrack.release(); + audioTrack = null; + } + } + + //当通联成功时的动作 + private void doComplete() { + messageEndTime = UtcTimer.getSystemTime();//获取结束的时间 + + //如对方没有网格,就从历史呼号与网格对应表中查找 + toMaidenheadGrid = GeneralVariables.getGridByCallsign(toCallsign.callsign, databaseOpr); + + if (messageStartTime == 0) {//如果起始时间没有,就取现在的 + messageStartTime = UtcTimer.getSystemTime(); + } + + + //从历史记录中查信号报告 + //此处处理信号报告,是因为保存的信号报告经常与实际通联的信号报告不一致。 + //遍历接收到对方的信号报告 + for (int i = GeneralVariables.transmitMessages.size() - 1; i >= 0; i--) { + Ft8Message message = GeneralVariables.transmitMessages.get(i); + if ((GeneralVariables.checkFun3(message.extraInfo) + || GeneralVariables.checkFun2(message.extraInfo)) + && (message.callsignFrom.equals(toCallsign.callsign) + && GeneralVariables.checkIsMyCallsign(message.callsignTo))) { + //&& message.callsignTo.equals(GeneralVariables.myCallsign))) { + receiveTargetReport = getReportFromExtraInfo(message.extraInfo); + break; + } + } + //遍历我发送给对方的信号报告 + for (int i = GeneralVariables.transmitMessages.size() - 1; i >= 0; i--) { + Ft8Message message = GeneralVariables.transmitMessages.get(i); + if ((GeneralVariables.checkFun3(message.extraInfo) + || GeneralVariables.checkFun2(message.extraInfo)) + && (message.callsignTo.equals(toCallsign.callsign) + && GeneralVariables.checkIsMyCallsign(message.callsignFrom))) { + //&& message.callsignFrom.equals(GeneralVariables.myCallsign))) { + sentTargetReport = getReportFromExtraInfo(message.extraInfo); + break; + } + } + + + messageEndTime = UtcTimer.getSystemTime(); + if (onDoTransmitted != null) {//用于保存通联记录 + onTransmitSuccess.doAfterTransmit(new QSLRecord( + messageStartTime, + messageEndTime, + GeneralVariables.myCallsign, + GeneralVariables.getMyMaidenhead4Grid(), + toCallsign.callsign, + toMaidenheadGrid, + sentTargetReport != -100 ? sentTargetReport : sendReport, + receiveTargetReport != -100 ? receiveTargetReport : receivedReport,//如果给对方的信号报告是不是-100,就用发给对方的信号报告记录 + "FT8", + GeneralVariables.band, + Math.round(GeneralVariables.getBaseFrequency()) + )); + + GeneralVariables.addQSLCallsign(toCallsign.callsign);//把通联成功的呼号添加到列表中 + ToastMessage.show(String.format("QSO : %s , at %s", toCallsign.callsign + , BaseRigOperation.getFrequencyAllInfo(GeneralVariables.band))); + } + + } + + /** + * 设置当前要发射的指令顺序 + * + * @param order 顺序 + */ + public void setCurrentFunctionOrder(int order) { + functionOrder = order; + for (int i = 0; i < functionList.size(); i++) { + functionList.get(i).setCurrentOrder(order); + } + if (order == 1) { + resetTargetReport();//复位信号报告 + } + if (order == 4 || order == 5) { + updateQSlRecordList(order, toCallsign); + } + mutableFunctions.postValue(functionList); + } + + + /** + * 当目标是复合呼号(非标准信号),JTDX回复可能会缩短 + * + * @param fromCall 对方的呼号 + * @param toCall 我的目标呼号 + * @return 是不是 + */ + private boolean checkCallsignIsCallTo(String fromCall, String toCall) { + if (toCall.contains("/")) {//当对方的呼号在斜线时,JTDX会把/后面的字符去掉 + return toCall.contains(fromCall); + } else { + return fromCall.equals(toCall); + } + } + + /** + * 检查消息中from中有目标呼号的数量。当有目标呼号呼叫我的消息,返回0,如果目标呼号呼叫别人,返回值应当大于1 + * + * @param messages 消息列表 + * @return 0:有目标呼叫我的,1:没有任何目标呼号发出的消息,>1:有目标呼号呼叫别人的消息 + */ + private int checkTargetCallMe(ArrayList messages) { + int fromCount = 1; + for (int i = messages.size() - 1; i >= 0; i--) { + Ft8Message ft8Message = messages.get(i); + if (ft8Message.getSequence() == sequential) continue;//同一个时序下的消息不做解析 + if (toCallsign == null) { + continue; + } + //if (ft8Message.getCallsignTo().equals(GeneralVariables.myCallsign) + if (GeneralVariables.checkIsMyCallsign(ft8Message.getCallsignTo()) + && checkCallsignIsCallTo(ft8Message.getCallsignFrom(), toCallsign.callsign)) { + return 0; + } + if (checkCallsignIsCallTo(ft8Message.getCallsignFrom(), toCallsign.callsign)) { + fromCount++;//计数器,from是目标呼号的情况 + } + } + return fromCount; + } + + /** + * 检测本消息列表中对方回复消息的序号,如果没有,返回-1 + * + * @param messages 消息列表 + * @return 消息的序号 + */ + private int checkFunctionOrdFromMessages(ArrayList messages) { + for (int i = messages.size() - 1; i >= 0; i--) { + Ft8Message ft8Message = messages.get(i); + if (ft8Message.getSequence() == sequential) continue;//同一个时序下的消息不做解析 + if (toCallsign == null) { + continue; + } + //是双方的呼叫信息 + //if (ft8Message.getCallsignTo().equals(GeneralVariables.myCallsign) + if (GeneralVariables.checkIsMyCallsign(ft8Message.getCallsignTo()) + && checkCallsignIsCallTo(ft8Message.getCallsignFrom(), toCallsign.callsign)) { + //--TODO ----检查起始时间是不是0,如果是0,补充起始时间。因为有的呼叫会越过第一步 + + //检测是不是对方给我的信号报告 + if (GeneralVariables.checkFun3(ft8Message.extraInfo) + || GeneralVariables.checkFun2(ft8Message.extraInfo)) { + //从消息中取信号报告,如果不正确(-100),那么就取消息中的信号报告 + receivedReport = getReportFromExtraInfo(ft8Message.extraInfo); + receiveTargetReport = receivedReport;//对方给我的信号报告,要保存下来 + if (receivedReport == -100) {//如果不正确,就取消息的报告 + receivedReport = ft8Message.report; + } + } + sendReport = messages.get(i).snr;//把接收到的信号保存下来 + + int order = GeneralVariables.checkFunOrder(ft8Message);//检查消息的序号 + if (order != -1) return order;//说明成功解析出序号 + } + } + + return -1;//说明没找到消息 + } + + /** + * 从扩展消息中获取对方给的信号报告,获取失败,值-100 + * + * @param extraInfo 扩展消息 + * @return 信号报告 + */ + private int getReportFromExtraInfo(String extraInfo) { + String s = extraInfo.replace("R", "").trim(); + try { + return Integer.parseInt(s); + } catch (Exception e) { + return -100; + } + } + + /** + * 检查是不是属于排除的消息: + * 1.与发射的时序相同 + * 2.不在相同的波段 + * 3.呼号是排除的字头 + * + * @param msg 消息 + * @return 是/否 + */ + private boolean isExcludeMessage(Ft8Message msg) { + return msg.getSequence() == sequential || msg.band != GeneralVariables.band + || GeneralVariables.checkIsExcludeCallsign(msg.callsignFrom); + } + + /** + * 检查有没有人CQ我,或我关注的呼号在CQ + * + * @param messages 消息列表 + * @return false=没有符合的消息,TRUE=有符合的消息 + */ + //@RequiresApi(api = Build.VERSION_CODES.N) + private boolean checkCQMeOrFollowCQMessage(ArrayList messages) { + //此message是刚刚解码出的消息 + //第一个循环与第二个循环都是检查是否有CQ我的消息。第一个循环是优先查询是不是我的目标呼号。 + // 目的是当多个目标呼叫我,我的回复不专一的问题。 + //检查CQ我,不是73,且是我呼叫的目标 + for (int i = messages.size() - 1; i >= 0; i--) {//此处是检查有没有CQ我。(TO:ME,且不能是73) + Ft8Message msg = messages.get(i); + if (isExcludeMessage(msg)) continue;//检查是不是属于排除的消息: + if (toCallsign == null) break; + + //if (msg.getCallsignTo().equals(GeneralVariables.myCallsign) + if (GeneralVariables.checkIsMyCallsign(msg.getCallsignTo()) + && msg.getCallsignFrom().equals(toCallsign.callsign)//todo 注意测试复合呼号的情况 + && !GeneralVariables.checkFun5(msg.extraInfo)) {//cq我、不是73、发送方是我关注的目标 + //设置发射之前,确定消息的序号,避免从头开始 + setTransmit(new TransmitCallsign(msg.i3, msg.n3, msg.getCallsignFrom(), msg.freq_hz + , msg.getSequence(), msg.snr) + , GeneralVariables.checkFunOrder(msg) + 1 + , msg.extraInfo); + return true; + } + } + + //检查CQ我,不是73, + for (int i = messages.size() - 1; i >= 0; i--) {//此处是检查有没有CQ我。(TO:ME,且不能是73) + Ft8Message msg = messages.get(i); + if (isExcludeMessage(msg)) continue;//检查是不是属于排除的消息: + //if ((msg.getCallsignTo().equals(GeneralVariables.myCallsign) + if ((GeneralVariables.checkIsMyCallsign(msg.getCallsignTo()) + && !GeneralVariables.checkFun5(msg.extraInfo))) {//cq我、不是73、 + //设置发射之前,确定消息的序号,避免从头开始 + setTransmit(new TransmitCallsign(msg.i3, msg.n3, msg.getCallsignFrom(), msg.freq_hz + , msg.getSequence(), msg.snr) + , GeneralVariables.checkFunOrder(msg) + 1 + , msg.extraInfo); + return true; + } + } + + + //如果不自动呼叫我关注的消息,就退出 + if (!GeneralVariables.autoCallFollow) { + return false; + } + + if (toCallsign == null) { + return false; + } + //当已经有目标呼号的时候,不对关注的呼号做反应 + if (toCallsign.haveTargetCallsign()) { + return false; + } + + //我关注的呼号次之,!!!到关注的消息列表中找 + //此处是检查关注的呼号在CQ。(TO:CQ,且不能本次通联能成功的呼号) + for (int i = GeneralVariables.transmitMessages.size() - 1; i >= 0; i--) { + Ft8Message msg = GeneralVariables.transmitMessages.get(i); + if (isExcludeMessage(msg)) continue;//检查是不是属于排除的消息: + + //处于CQ,FROM是我的关注呼号,并且不在通联成功的呼号列表中 + if ((msg.checkIsCQ()//在CQ + && ((GeneralVariables.autoCallFollow && GeneralVariables.autoFollowCQ)//自动呼叫CQ + || GeneralVariables.callsignInFollow(msg.getCallsignFrom()))//是我关注的 + && !GeneralVariables.checkQSLCallsign(msg.getCallsignFrom())//之前没有联通成功过 + && !GeneralVariables.checkIsMyCallsign(msg.callsignFrom))) {//不是我自己 + //&& !msg.callsignFrom.equals(GeneralVariables.myCallsign))) {//不是我自己 + + resetTargetReport(); + setTransmit(new TransmitCallsign(msg.i3, msg.n3, msg.getCallsignFrom(), msg.freq_hz + , msg.getSequence(), msg.snr), 1, msg.extraInfo); + + return true; + } + } + + return false; + + } + + + public void updateQSlRecordList(int order, TransmitCallsign toCall) { + if (toCall == null) return; + if (toCall.callsign.equals("CQ")) return; + + QSLRecord record = GeneralVariables.qslRecordList.getRecordByCallsign(toCall.callsign); + if (record == null) { + toMaidenheadGrid = GeneralVariables.getGridByCallsign(toCallsign.callsign, databaseOpr); + record = GeneralVariables.qslRecordList.addQSLRecord(new QSLRecord( + messageStartTime, + messageEndTime, + GeneralVariables.myCallsign, + GeneralVariables.getMyMaidenhead4Grid(), + toCallsign.callsign, + toMaidenheadGrid, + sentTargetReport != -100 ? sentTargetReport : sendReport, + receiveTargetReport != -100 ? receiveTargetReport : receivedReport,//如果给对方的信号报告是不是-100,就用发给对方的信号报告记录 + "FT8", + GeneralVariables.band, + Math.round(GeneralVariables.getBaseFrequency() + ))); + } + //根据消息序列更新内容 + switch (order) { + case 1://更新网格,和对方消息的SNR + record.setToMaidenGrid(toMaidenheadGrid); + record.setSendReport(sentTargetReport != -100 ? sentTargetReport : sendReport); + GeneralVariables.qslRecordList.deleteIfSaved(record); + break; + + case 2://更新对方返回的信号报告,和对方的信号报告 + case 3: + record.setSendReport(sentTargetReport != -100 ? sentTargetReport : sendReport); + record.setReceivedReport(receiveTargetReport != -100 ? receiveTargetReport : receivedReport); + GeneralVariables.qslRecordList.deleteIfSaved(record); + break; + + //当RR73或73的状态下,就保存日志。 + case 4: + case 5: + if (!record.saved) { + doComplete();//保存到数据库 + record.saved = true; + } + + break; + } + + } + + /** + * 从关注列表解码的消息中,此处是变化发射程序的入口 + * + * @param msgList 消息列表 + */ + //@RequiresApi(api = Build.VERSION_CODES.N) + public void parseMessageToFunction(ArrayList msgList) { + if (GeneralVariables.myCallsign.length() < 3) { + return; + } + if (msgList.size() == 0) return;//没有消息解析,返回 + + if (msgList.get(0).getSequence() == sequential) { + return; + } + ArrayList messages = new ArrayList<>(msgList);//防止线程冲突 + + + int newOrder = checkFunctionOrdFromMessages(messages);//检查消息中对方回复的消息序号,-1为没有收到 + if (newOrder != -1) {//如果有消息序号,说明有回应,复位错误计数器 + GeneralVariables.noReplyCount = 0; + } + + //更新一下通联的列表检查是不是在通联列表中,如果没有记录下来,就保存 + updateQSlRecordList(newOrder, toCallsign); + + + // 判断通联成功:对方回73(5)||我是73(5),且对方没回(-1) + // 或者我是RR73(4),且已经达到无回应阈值,且有无回应限制 + // 或我是RR73(4),且对方开始呼叫别人了,解决RR73卡死的问题 + if (newOrder == 5//消息中目标回复我RR73了 + || (functionOrder == 5 && newOrder == -1)// 判断通联成功:对方回73(5)||我是73(5),且对方没回(-1) + || (functionOrder == 4 && + (GeneralVariables.noReplyCount > GeneralVariables.noReplyLimit * 2) + && (GeneralVariables.noReplyLimit > 0)) // 或者我是RR73(4),且已经达到无回应阈值,且有无回应限制 + + || (functionOrder == 4 && checkTargetCallMe(messages) > 1)// 或我是RR73(4),且对方开始呼叫别人了(>1是目标呼号呼叫别人了) + + || (functionOrder == 4 && (GeneralVariables.noReplyCount > 20) + && (GeneralVariables.noReplyLimit == 0))//当呼叫无回应为“忽略”,且我是RR73(4),那么无回应次数大于10次,就复位,防止RR73卡死 + + ) { + //进入到CQ状态 + resetToCQ(); + + //加入检查消息中有没有呼叫我的,或关注的呼号在CQ + checkCQMeOrFollowCQMessage(messages); + setCurrentFunctionOrder(functionOrder);//设置当前消息 + mutableFunctionOrder.postValue(functionOrder); + return; + } + + + if (newOrder != -1) {//说明收到消息,且未完成通联 + //原来是newOrder == 1,但有的时候,对方直接给信号报告,也就是消息2. + if (newOrder == 1 || newOrder == 2) {//说明是别人第一次回复我 + resetTargetReport();//把信号报告复位一下 + generateFun(); + } + + functionOrder = newOrder + 1;//执行下一个序号的消息 + mutableFunctions.postValue(functionList); + mutableFunctionOrder.postValue(functionOrder); + setCurrentFunctionOrder(functionOrder);//设置当前消息 + return; + } + + + //到此位置,我还没有在6号消息状态,检查看有没有人呼叫我 + // 2022-09-22如果这时有人呼叫我,或自动跟踪状态,我就设置新的发射消息列表 + if (checkCQMeOrFollowCQMessage(messages)) { + return; + } + + + //到此位置,说明没有收到回复的消息 + //之明如果我是在CQ,那么newOrder必然是-1 + if (functionOrder == 6) {//我处于CQ状态 + checkCQMeOrFollowCQMessage(messages); + return; + } + + + //到此位置,说明没有回应,错误次数要加1,弱信号检测不记无回应 + if (!messages.get(0).isWeakSignal) { + GeneralVariables.noReplyCount++; + } + //如果超出无反应限定值,复位到CQ状态 + if ((GeneralVariables.noReplyCount > GeneralVariables.noReplyLimit) && (GeneralVariables.noReplyLimit > 0)) { + //检查关注消息列表,如果没有新的CQ,就进入到CQ状态,如果有,就转入到呼叫新的目标。 + if (!getNewTargetCallsign(messages)) {//检查关注列表中的CQ消息,如果有新的目标,返回TRUE; + functionOrder = 6; + toCallsign.callsign = "CQ"; + } + generateFun(); + setCurrentFunctionOrder(functionOrder);//设置当前消息 + mutableToCallsign.postValue(toCallsign); + mutableFunctionOrder.postValue(functionOrder); + + } + + } + + /** + * 检查关注列表中,有没有正在CQ的消息,且不是我现在的目标呼号 + * + * @param messages 关注的消息列表 + * @return 目标呼号,没有返回NULL + */ + public boolean getNewTargetCallsign(ArrayList messages) { + if (toCallsign == null) return false; + for (int i = messages.size() - 1; i >= 0; i--) { + Ft8Message ft8Message = messages.get(i); + if (ft8Message.band != GeneralVariables.band) {//如果消息不在相同的波段内,不理会 + continue; + } + //不是CQ,不理会 + if (!ft8Message.checkIsCQ()) { + continue; + } + //不是当前的目标呼号,且之前没有通联成功过 + if ((!ft8Message.getCallsignFrom().equals(toCallsign.callsign) + && (!GeneralVariables.checkQSLCallsign(ft8Message.getCallsignFrom())))) //之前没有联通成功过 + { + functionOrder = 1; + toCallsign.callsign = ft8Message.getCallsignFrom(); + return true; + } + + + } + return false; + } + + public boolean isSynFrequency() { + return GeneralVariables.synFrequency; + } + + + public boolean isActivated() { + return activated; + } + + public void setActivated(boolean activated) { + this.activated = activated; + if (!this.activated) {//强制关闭发射 + setTransmitting(false); + } + mutableIsActivated.postValue(activated); + } + + public boolean isTransmitting() { + return isTransmitting; + } + + public void setTransmitting(boolean transmitting) { + if (GeneralVariables.myCallsign.length() < 3 && transmitting) { + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.callsign_error)); + return; + } + + if (!transmitting) {//停止发射 + if (audioTrack != null) { + if (audioTrack.getState() != AudioTrack.STATE_UNINITIALIZED) { + audioTrack.pause(); + } + if (onDoTransmitted != null) {//通知一下,已经不发射了 + onDoTransmitted.onAfterTransmit(getFunctionCommand(functionOrder), functionOrder); + } + } + } + + mutableIsTransmitting.postValue(transmitting); + isTransmitting = transmitting; + } + + /** + * 复位发射程序到6,时序也会改变 + */ + //@RequiresApi(api = Build.VERSION_CODES.N) + public void restTransmitting() { + if (GeneralVariables.myCallsign.length() < 3) { + return; + } + //要判断我的呼号类型,才能确定i3n3 !!! + int i3 = GenerateFT8.checkI3ByCallsign(GeneralVariables.myCallsign); + setTransmit(new TransmitCallsign(i3, 0, "CQ", UtcTimer.getNowSequential()) + , 6, ""); + + } + + /** + * 把给对方的信号记录复位成-100; + */ + public void resetTargetReport() { + receiveTargetReport = -100; + sentTargetReport = -100; + } + + /** + * 复位发射程序到6,不会改变时序 + */ + //@RequiresApi(api = Build.VERSION_CODES.N) + public void resetToCQ() { + resetTargetReport(); + if (toCallsign == null) { + //要判断我的呼号类型,才能确定i3n3 !!! + int i3 = GenerateFT8.checkI3ByCallsign(GeneralVariables.myCallsign); + setTransmit(new TransmitCallsign(i3, 0, "CQ", (UtcTimer.getNowSequential() + 1) % 2) + , 6, ""); + } else { + functionOrder = 6; + toCallsign.callsign = "CQ"; + mutableToCallsign.postValue(toCallsign);//设定呼叫的目标 + generateFun(); + } + } + + /** + * 设置发射时间延迟,这个延迟时间,也是给上一个周期解码的一个时间 + * + * @param sec 毫秒 + */ + public void setTimer_sec(int sec) { + utcTimer.setTime_sec(sec); + } + + public boolean isTransmitFreeText() { + return transmitFreeText; + } + + public void setFreeText(String freeText) { + this.freeText = freeText; + } + + public void setTransmitFreeText(boolean transmitFreeText) { + this.transmitFreeText = transmitFreeText; + if (transmitFreeText) { + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.trans_free_text_mode)); + } else { + ToastMessage.show((GeneralVariables.getStringFromResource(R.string.trans_standard_messge_mode))); + } + } + + + private static class DoTransmitRunnable implements Runnable { + FT8TransmitSignal transmitSignal; + + public DoTransmitRunnable(FT8TransmitSignal transmitSignal) { + this.transmitSignal = transmitSignal; + } + + @SuppressLint("DefaultLocale") + @Override + public void run() { + //todo 此处可能要修改,维护一个列表。把每个呼号,网格,时间,波段,记录下来 + if (transmitSignal.functionOrder == 1 || transmitSignal.functionOrder == 2) {//当消息处于1或2时,说明开始了通联 + transmitSignal.messageStartTime = UtcTimer.getSystemTime(); + } + if (transmitSignal.messageStartTime == 0) {//如果起始时间没有,就取现在的 + transmitSignal.messageStartTime = UtcTimer.getSystemTime(); + } + + //用于显示将要发射的消息内容 + Ft8Message msg; + if (transmitSignal.transmitFreeText) { + msg = new Ft8Message("CQ", GeneralVariables.myCallsign, transmitSignal.freeText); + msg.i3 = 0; + msg.n3 = 0; + } else { + msg = transmitSignal.getFunctionCommand(transmitSignal.functionOrder); + } + msg.modifier = GeneralVariables.toModifier; + + if (transmitSignal.onDoTransmitted != null) { + //此处用于处理PTT等事件 + transmitSignal.onDoTransmitted.onBeforeTransmit(msg, transmitSignal.functionOrder); + } + + transmitSignal.isTransmitting = true; + transmitSignal.mutableIsTransmitting.postValue(true); + + + transmitSignal.mutableTransmittingMessage.postValue(String.format(" (%.0fHz) %s" + , GeneralVariables.getBaseFrequency() + , msg.getMessageText())); + //生成信号 +// float[] buffer=GenerateFT8.generateFt8(msg, GeneralVariables.getBaseFrequency()); +// if (buffer==null) { +// return; +// } + + //电台动作可能有要有个延迟时间,所以时间并不一定完全准确 + try {//给电台一个100毫秒的响应时间 + Thread.sleep(GeneralVariables.pttDelay);//给PTT指令后,电台一个响应时间,默认100毫秒 + } catch (InterruptedException e) { + e.printStackTrace(); + } + +// if (transmitSignal.onDoTransmitted != null) {//处理音频数据,可以给ICOM的网络模式发送 +// transmitSignal.onDoTransmitted.onAfterGenerate(buffer); +// } + //播放音频 + //transmitSignal.playFT8Signal(buffer); + transmitSignal.playFT8Signal(msg); + } + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ft8transmit/FunctionOfTransmit.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ft8transmit/FunctionOfTransmit.java new file mode 100644 index 00000000..5b0aeb73 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ft8transmit/FunctionOfTransmit.java @@ -0,0 +1,74 @@ +package com.bg7yoz.ft8cn.ft8transmit; +/** + * FT8通联的6步 + * @author BGY70Z + * @date 2023-03-20 + */ + +import com.bg7yoz.ft8cn.Ft8Message; + +public class FunctionOfTransmit { + private int functionOrder;//消息的序号 + private String functionMessage;//消息内容 + private boolean completed;//是否完成 + private boolean isCurrentOrder;//是不是当前要发射的消息 + private Ft8Message ft8Message; + +// /** +// * 老的发送消息方法 +// * @param functionOrder 消息序号 +// * @param functionMessage 消息内容 +// * @param completed 是否结束 +// */ +// @Deprecated +// public FunctionOfTransmit(int functionOrder, String functionMessage, boolean completed) { +// this.functionOrder = functionOrder; +// this.functionMessage = functionMessage; +// this.completed = completed; +// } + + /** + * 新版发送消息方法 + * @param functionOrder 消息序号 + * @param message FT8消息 + * @param completed 是否结束 + */ + public FunctionOfTransmit(int functionOrder, Ft8Message message, boolean completed) { + this.functionOrder = functionOrder; + ft8Message=message; + this.completed = completed; + this.functionMessage = message.getMessageText(); + } + + public int getFunctionOrder() { + return functionOrder; + } + + public void setFunctionOrder(int functionOrder) { + this.functionOrder = functionOrder; + } + + public String getFunctionMessage() { + return functionMessage; + } + + public void setFunctionMessage(String functionMessage) { + this.functionMessage = functionMessage; + } + + public boolean isCompleted() { + return completed; + } + + public void setCompleted(boolean completed) { + this.completed = completed; + } + + public boolean isCurrentOrder() { + return isCurrentOrder; + } + + public void setCurrentOrder(int currentOrder) { + isCurrentOrder = currentOrder==functionOrder; + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ft8transmit/GenerateFT8.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ft8transmit/GenerateFT8.java new file mode 100644 index 00000000..71dfa7f8 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ft8transmit/GenerateFT8.java @@ -0,0 +1,269 @@ +package com.bg7yoz.ft8cn.ft8transmit; +/** + * 生成FT8音频信号的类。音频数据是32位的浮点数组。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.util.Log; + +import com.bg7yoz.ft8cn.Ft8Message; +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.ft8signal.FT8Package; +import com.bg7yoz.ft8cn.ui.ToastMessage; + +public class GenerateFT8 { + private static final String TAG = "GenerateFT8"; + private static final int FTX_LDPC_K = 91; + public static final int FTX_LDPC_K_BYTES = (FTX_LDPC_K + 7) / 8; + private static final int FT8_NN = 79; + private static final float FT8_SYMBOL_PERIOD = 0.160f; + private static final float FT8_SYMBOL_BT = 2.0f; + private static final float FT8_SLOT_TIME = 15.0f; + private static final int Ft8num_samples = 15 * 12000; + private static final float M_PI = 3.14159265358979323846f; + + public static final int num_tones = FT8_NN;//符号数量:FT8是79个,FT4是105个。 + public static final float symbol_period = FT8_SYMBOL_PERIOD;//FT8_SYMBOL_PERIOD=0.160f + private static final float symbol_bt = FT8_SYMBOL_BT;//FT8_SYMBOL_BT=2.0f + private static final float slot_time = FT8_SLOT_TIME;//FT8_SLOT_TIME=15f + //public static int sample_rate = 48000;//采样率 + //public static int sample_rate = 12000;//采样率 + + + static { + System.loadLibrary("ft8cn"); + } + + + public static int checkI3ByCallsign(String callsign) { + String substring = callsign.substring(callsign.length() - 2); + if (substring.equals("/P")) { + if (callsign.length() <= 8) { + return 2;//i3=2消息 + } else { + return 4;//说明时非标准呼号 + } + } + if (substring.equals("/R")) { + if (callsign.length() <= 8) { + return 1;//i3=2消息 + } else { + return 4;//说明时非标准呼号 + } + } + if (callsign.contains("/")) {//除了/P /R以外,其余的都是非标准呼号 + return 4; + } + if (callsign.length() > 6) {//呼号大于6位,也是非标准呼号 + return 4; + } + if (callsign.length() == 0) {//没有呼号,就是自由文本 + return 0; + } + return 1; + } + + public static String byteToBinString(byte[] data) { + if (data == null) { + return ""; + } + StringBuilder string = new StringBuilder(); + for (int i = 0; i < data.length; i++) { + string.append(String.format(",%8s", Integer.toBinaryString(data[i] & 0xff)).replace(" ", "0")); + } + return string.toString(); + } + + public static String byteToHexString(byte[] data) { + StringBuilder string = new StringBuilder(); + for (int i = 0; i < data.length; i++) { + string.append(String.format(",%02X", data[i])); + } + return string.toString(); + } + + + /** + * 检查是不是标准呼号 + * + * @param callsign 呼号 + * @return 是不是 + */ + public static boolean checkIsStandardCallsign(String callsign) { + String temp; + if (callsign.endsWith("/P") || callsign.endsWith("/R")){ + temp=callsign.substring(0,callsign.length()-2); + }else { + temp=callsign; + } + //FT8的认定:标准业余呼号由一个或两个字符的前缀组成,其中至少一个必须是字母,后跟一个十进制数字和最多三个字母的后缀。 + return temp.matches("[A-Z0-9]?[A-Z0-9][0-9][A-Z][A-Z0-9]?[A-Z]?"); + + + } + + /** + * 检查是不是信号报告 + * + * @param extraInfo 扩展消息 + * @return 是不是 + */ + private static boolean checkIsReport(String extraInfo) { + if (extraInfo.equals("73") || extraInfo.equals("RRR") + || extraInfo.equals("RR73")||extraInfo.equals("")) { + return false; + } + return !extraInfo.trim().matches("[A-Z][A-Z][0-9][0-9]"); + } + + public static float[] generateFt8(Ft8Message msg, float frequency,int sample_rate){ + return generateFt8(msg,frequency,sample_rate,true); + } + + public static byte[] generateA91(Ft8Message msg,boolean hasModifier){ + if (msg.callsignFrom.length()<3){ + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.callsign_error)); + return null; + } + // 首先,将文本数据打包为二进制消息,共12个字节 + byte[] packed = new byte[FTX_LDPC_K_BYTES]; + //把"<>"去掉 + msg.callsignTo = msg.callsignTo.replace("<", "").replace(">", ""); + msg.callsignFrom = msg.callsignFrom.replace("<", "").replace(">", ""); + if (hasModifier) { + msg.modifier = GeneralVariables.toModifier;//修饰符 + }else { + msg.modifier=""; + } + + + //判定用非标准呼号i3=4的条件: + //1.FROMCALL为非标准呼号 ,且 符合2或3 + //2.扩展消息时 网格、RR73,RRR,73 + //3.CQ,QRZ,DE + + + + if (msg.i3 != 0) {//目前只支持i3=1,i3=2,i3=4,i3=0 && n3=0 + if (!checkIsStandardCallsign(msg.callsignFrom) + && (!checkIsReport(msg.extraInfo) || msg.checkIsCQ())) { + msg.i3 = 4; + //} else if (msg.callsignFrom.endsWith("/P")||(msg.callsignTo.endsWith("/P"))) { + } else if (msg.callsignFrom.endsWith("/P")//如果目标有/P后缀,则以目标呼号为准。如果目标没有/P后缀,则以发送方是否有/P后缀为准 + ||(msg.callsignTo.endsWith("/P")&&(!msg.callsignFrom.endsWith("/P")))) { + msg.i3 = 2; + } else { + msg.i3 = 1; + } + } + + if (msg.i3 == 1 || msg.i3 == 2) { + packed = FT8Package.generatePack77_i1(msg); + } else if (msg.i3 == 4) {//说明是非标准呼号 + packed = FT8Package.generatePack77_i4(msg); + } else { + packFreeTextTo77(msg.getMessageText(), packed); + } + + return packed; + } + + /** + * 生成FT8信号 + * @param msg 消息 + * @param frequency 频率 + * @param sample_rate 采样率 + * @param hasModifier 是否有修饰符 + * @return + */ + public static float[] generateFt8(Ft8Message msg, float frequency,int sample_rate,boolean hasModifier) { +// if (msg.callsignFrom.length()<3){ +// ToastMessage.show(GeneralVariables.getStringFromResource(R.string.callsign_error)); +// return null; +// } +// // 首先,将文本数据打包为二进制消息,共12个字节 +// byte[] packed = new byte[FTX_LDPC_K_BYTES]; +// //把"<>"去掉 +// msg.callsignTo = msg.callsignTo.replace("<", "").replace(">", ""); +// msg.callsignFrom = msg.callsignFrom.replace("<", "").replace(">", ""); +// if (hasModifier) { +// msg.modifier = GeneralVariables.toModifier;//修饰符 +// }else { +// msg.modifier=""; +// } + + //判定用非标准呼号i3=4的条件: + //1.FROMCALL为非标准呼号 ,且 符合2或3 + //2.扩展消息时 网格、RR73,RRR,73 + //3.CQ,QRZ,DE + + + +// if (msg.i3 != 0) {//目前只支持i3=1,i3=2,i3=4,i3=0 && n3=0 +// if (!checkIsStandardCallsign(msg.callsignFrom) +// && (!checkIsReport(msg.extraInfo) || msg.checkIsCQ())) { +// msg.i3 = 4; +// } else if (msg.callsignFrom.endsWith("/P")||(msg.callsignTo.endsWith("/P"))) { +// msg.i3 = 2; +// } else { +// msg.i3 = 1; +// } +// } +// +// if (msg.i3 == 1 || msg.i3 == 2) { +// packed = FT8Package.generatePack77_i1(msg); +// } else if (msg.i3 == 4) {//说明是非标准呼号 +// packed = FT8Package.generatePack77_i4(msg); +// } else { +// packFreeTextTo77(msg.getMessageText(), packed); +// } + + return generateFt8ByA91(generateA91(msg,hasModifier),frequency,sample_rate); + //return generateFt8ByA91(packed,frequency,sample_rate); + + } + + public static float[] generateFt8ByA91(byte[] a91, float frequency,int sample_rate){ + byte[] tones = new byte[num_tones]; // 79音调(符号)数组 + //此处是12个字节(91+7)/8,可以使用a91生成音频 + ft8_encode(a91, tones); + + // 第三,将FSK音调转换为音频信号b + + + int num_samples = (int) (0.5f + num_tones * symbol_period * sample_rate); // 数据信号中的采样数0.5+79*0.16*12000 + + + float[] signal = new float[num_samples]; + + //Ft8num_sampleFT8声音的总采样数,不是字节数。15*12000 + //for (int i = 0; i < Ft8num_samples; i++)//把数据全部静音。 + for (int i = 0; i < num_samples; i++)//把数据全部静音。 + { + signal[i] = 0; + } + + // 用79个字节符号,生成FT8音频 + synth_gfsk(tones, num_tones, frequency, symbol_bt, symbol_period, sample_rate, signal, 0); +// for (int i = 0; i < num_samples; i++)//把数据全部静音。 +// { +// if (signal[i]>1.0||signal[i]<-1.0){ +// Log.e(TAG, "generateFt8: "+signal[i] ); +// } +// } + return signal; + } + + + private static native int packFreeTextTo77(String msg, byte[] c77); + + private static native int pack77(String msg, byte[] c77); + + private static native void ft8_encode(byte[] payload, byte[] tones); + + private static native void synth_gfsk(byte[] symbols, int n_sym, float f0, + float symbol_bt, float symbol_period, + int signal_rate, float[] signal, int offset); +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ft8transmit/OnDoTransmitted.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ft8transmit/OnDoTransmitted.java new file mode 100644 index 00000000..0c431f8e --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ft8transmit/OnDoTransmitted.java @@ -0,0 +1,18 @@ +package com.bg7yoz.ft8cn.ft8transmit; +/** + * 发射的回调 + * @author BGY70Z + * @date 2023-03-20 + */ + +import com.bg7yoz.ft8cn.Ft8Message; + +public interface OnDoTransmitted { + void onBeforeTransmit(Ft8Message message,int functionOder); + void onAfterTransmit(Ft8Message message, int functionOder); + void onTransmitByWifi(Ft8Message message); + + //2023-08-16 由DS1UFX提交修改(基于0.9版),增加(tr)uSDX audio over cat的支持。 + boolean supportTransmitOverCAT(); + void onTransmitOverCAT(Ft8Message message); +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ft8transmit/OnTransmitSuccess.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ft8transmit/OnTransmitSuccess.java new file mode 100644 index 00000000..e72c664f --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ft8transmit/OnTransmitSuccess.java @@ -0,0 +1,12 @@ +package com.bg7yoz.ft8cn.ft8transmit; +/** + * 发射结束后的回调 + * @author BGY70Z + * @date 2023-03-20 + */ + +import com.bg7yoz.ft8cn.log.QSLRecord; + +public interface OnTransmitSuccess { + void doAfterTransmit(QSLRecord qslRecord); +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ft8transmit/QSLRecord.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ft8transmit/QSLRecord.java new file mode 100644 index 00000000..257a3a90 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ft8transmit/QSLRecord.java @@ -0,0 +1,100 @@ +package com.bg7yoz.ft8cn.ft8transmit; + +/** + * 记录QSO的类,用于保存数据库。 + * @author BGY70Z + * @date 2023-03-20 + */ +public class QSLRecord { + private long startTime;//起始时间 + private long endTime;//结束时间 + + private String myCallsign;//我的呼号 + private String myMaidenGrid;//我的网格 + private String toCallsign;//对方的呼号 + private String toMaidenGrid;//对方的网格 + private int sendReport;//对方收到我的报告(也就是我发送的信号强度) + private int receivedReport;//我收到对方的报告(也就是SNR) + private String mode="FT8"; + + private long bandFreq;//发射的波段 + private int frequency;//发射的频率 + + + public QSLRecord(long startTime, long endTime, String myCallsign, String myMaidenGrid + , String toCallsign, String toMaidenGrid, int sendReport, int receivedReport + , String mode, long bandFreq, int frequency) { + this.startTime = startTime; + this.endTime = endTime; + this.myCallsign = myCallsign; + this.myMaidenGrid = myMaidenGrid; + this.toCallsign = toCallsign; + this.toMaidenGrid = toMaidenGrid; + this.sendReport = sendReport; + this.receivedReport = receivedReport; + this.mode = mode; + this.bandFreq = bandFreq; + this.frequency = frequency; + } + + @Override + public String toString() { + return "QSLRecord{" + + "startTime=" + startTime + + ", endTime=" + endTime + + ", myCallsign='" + myCallsign + '\'' + + ", myMaidenGrid='" + myMaidenGrid + '\'' + + ", toCallsign='" + toCallsign + '\'' + + ", toMaidenGrid='" + toMaidenGrid + '\'' + + ", sendReport=" + sendReport + + ", receivedReport=" + receivedReport + + ", mode='" + mode + '\'' + + ", bandFreq=" + bandFreq + + ", frequency=" + frequency + + '}'; + } + + public long getEndTime() { + return endTime; + } + + public String getToCallsign() { + return toCallsign; + } + + public String getToMaidenGrid() { + return toMaidenGrid; + } + + public String getMode() { + return mode; + } + + public long getBandFreq() { + return bandFreq; + } + + public int getFrequency() { + return frequency; + } + + public long getStartTime() { + return startTime; + } + + public String getMyCallsign() { + return myCallsign; + } + + public String getMyMaidenGrid() { + return myMaidenGrid; + } + + public int getSendReport() { + return sendReport; + } + + public int getReceivedReport() { + return receivedReport; + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ft8transmit/QslRecordList.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ft8transmit/QslRecordList.java new file mode 100644 index 00000000..538e0597 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ft8transmit/QslRecordList.java @@ -0,0 +1,100 @@ +package com.bg7yoz.ft8cn.ft8transmit; +/** + * 通联记录的列表 + * @author BGY70Z + * @date 2023-03-20 + */ + +import com.bg7yoz.ft8cn.log.QSLRecord; + +import java.util.ArrayList; + +public class QslRecordList extends ArrayList { + + /** + * 根据呼号查是否有通联记录 + * @param callsign 呼号 + * @return 记录,没有则为空 + */ + public QSLRecord getRecordByCallsign(String callsign){ + for (int i = this.size()-1; i >=0 ; i--) { + if (this.get(i).getToCallsign().equals(callsign)){ + return this.get(i); + } + } + return null; + } + + /** + * 按照呼号查找,是否有通联记录,且保存过。如果没有记录,视作没保存过。 + * @param callsign 呼号 + * @return 是否保存过 + */ + public boolean getSavedRecByCallsign(String callsign){ + QSLRecord record=getRecordByCallsign(callsign); + if (record==null){ + return false; + }else { + return record.saved; + } + } + + /** + * 添加通联过的记录,如果已经存在,就更新记录 + * @param record 通联记录 + * @return 通联记录 + */ + public QSLRecord addQSLRecord(QSLRecord record){ + if (record.getToCallsign().equals("CQ")) return null; + //清除已经保存过的通联记录 + //for (int i = this.size()-1; i >=0 ; i--) { + // if (this.get(i).getToCallsign().equals(record.getToCallsign())){ + // if (this.get(i).saved){ + // this.remove(i); + // } + // } + //} + //找一下看有没有已经在列表中,但还没有保存的记录 + QSLRecord oldRecord= getRecordByCallsign(record.getToCallsign()); + if (oldRecord==null){ + this.add(record); + return record; + }else { + oldRecord.update(record); + } + return oldRecord; + } + + /** + * 删除已经保存过的呼号 + * @param record + */ + public void deleteIfSaved(QSLRecord record){ + //清除已经保存过的通联记录 + for (int i = this.size()-1; i >=0 ; i--) { + if (this.get(i).getToCallsign().equals(record.getToCallsign())){ + if (this.get(i).saved){ + this.remove(i); + } + } + } + } + + public String toHTML(){ + StringBuilder html=new StringBuilder(); + for (int i = 0; i < this.size(); i++) { + if (i%2==0) { + html.append(""); + html.append(String.format("%s", this.get(i).toHtmlString())); + html.append("
\n\n"); + }else { + html.append(">"); + html.append(String.format("%s", this.get(i).toHtmlString())); + html.append("
\n\n"); + } + + } + return html.toString(); + } + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ft8transmit/TransmitCallsign.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ft8transmit/TransmitCallsign.java new file mode 100644 index 00000000..fa8f803f --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ft8transmit/TransmitCallsign.java @@ -0,0 +1,59 @@ +package com.bg7yoz.ft8cn.ft8transmit; +/** + * 呼叫过程所记录的呼号信息 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.annotation.SuppressLint; + +public class TransmitCallsign { + private static final String TAG="TransmitCallsign"; + public String callsign; + public float frequency; + public int sequential; + public int snr; + public int i3; + public int n3; + public String dxcc; + public int cqZone; + public int itu; + + public TransmitCallsign(int i3,int n3,String callsign, int sequential) { + this.callsign = callsign; + this.sequential = sequential; + this.i3=i3; + this.n3=n3; + } + + public TransmitCallsign(int i3,int n3,String callsign, float frequency + , int sequential, int snr) { + this.callsign = callsign; + this.frequency = frequency; + this.sequential = sequential; + this.snr = snr; + this.i3=i3; + this.n3=n3; + + } + + /** + * 当目标呼号为空,或CQ,说明没有目标呼号 + * @return 是否有目标呼号 + */ + public boolean haveTargetCallsign(){ + if (callsign==null){ + return false; + } + return !callsign.equals("CQ"); + } + + @SuppressLint("DefaultLocale") + public String getSnr(){ + if (snr>0){ + return String.format("+%d",snr); + }else { + return String.format("%d",snr); + } + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/grid_tracker/GridInfoWindow.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/grid_tracker/GridInfoWindow.java new file mode 100644 index 00000000..98da410e --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/grid_tracker/GridInfoWindow.java @@ -0,0 +1,118 @@ +package com.bg7yoz.ft8cn.grid_tracker; +/** + * 网格追踪中每个连线的窗口界面。包含各类型分区图标。与我有关的通联,文字是红色的。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.annotation.SuppressLint; +import android.graphics.Paint; +import android.util.Log; +import android.view.MotionEvent; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.constraintlayout.widget.ConstraintLayout; + +import com.bg7yoz.ft8cn.Ft8Message; +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; + +import org.osmdroid.views.MapView; +import org.osmdroid.views.overlay.OverlayWithIW; +import org.osmdroid.views.overlay.infowindow.InfoWindow; + +public class GridInfoWindow extends InfoWindow { + public static final int UNDEFINED_RES_ID = 0; + + private final TextView titleView; + private final TextView descriptionView; + private final TextView subDescriptionView; + + + @SuppressLint("UseCompatLoadingForDrawables") + public GridInfoWindow(int layoutResId, MapView mapView, Ft8Message msg) { + super(layoutResId, mapView); + //setResIds(mapView.getContext()); + titleView = (TextView) this.mView.findViewById(R.id.tracker_info_bubble_title); + descriptionView = (TextView) this.mView.findViewById(R.id.tracker_info_bubble_description); + subDescriptionView = (TextView) this.mView.findViewById(R.id.tracker_info_bubble_subdescription); + ImageView fromDxccImage = (ImageView) this.mView.findViewById(R.id.track_from_dxcc_image); + ImageView fromItuImage = (ImageView) this.mView.findViewById(R.id.track_from_itu_image); + ImageView fromCqImage = (ImageView) this.mView.findViewById(R.id.track_from_cq_image); + ImageView toDxccImage = (ImageView) this.mView.findViewById(R.id.track_to_dxcc_image); + ImageView toItuImage = (ImageView) this.mView.findViewById(R.id.track_to_itu_image); + ImageView toCqImage = (ImageView) this.mView.findViewById(R.id.track_to_cq_image); + ConstraintLayout layout=(ConstraintLayout) mView.findViewById(R.id.trackerGridInfoConstraintLayout); + + if (!msg.fromDxcc) fromDxccImage.setVisibility(View.GONE); + if (!msg.fromItu) fromItuImage.setVisibility(View.GONE); + if (!msg.fromCq) fromCqImage.setVisibility(View.GONE); + if (!msg.toDxcc) toDxccImage.setVisibility(View.GONE); + if (!msg.toItu) toItuImage.setVisibility(View.GONE); + if (!msg.toCq) toCqImage.setVisibility(View.GONE); + + + //查是不是在本波段内通联成功过的呼号 + if (GeneralVariables.checkQSLCallsign(msg.getCallsignFrom())) {//如果在数据库中,划线 + titleView.setPaintFlags( + titleView.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); + } else {//如果不在数据库中,去掉划线 + titleView.setPaintFlags( + titleView.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG)); + } + boolean otherBandIsQso = GeneralVariables.checkQSLCallsign_OtherBand(msg.getCallsignFrom()); + + //是否有与我呼号有关的消息 + if (msg.inMyCall()) { + layout.setBackground(mView.getResources().getDrawable(R.drawable.tracker_new_cq_info_win_style)); + titleView.setTextColor(mapView.getResources().getColor( + R.color.message_in_my_call_text_color)); + } else if (otherBandIsQso) { + //设置在别的波段通联过的消息颜色 + titleView.setTextColor(mapView.getResources().getColor( + R.color.fromcall_is_qso_text_color)); + } else { + titleView.setTextColor(mapView.getResources().getColor( + R.color.message_text_color)); + } + + + this.mView.setOnTouchListener(new View.OnTouchListener() { + public boolean onTouch(View v, MotionEvent e) { + if (e.getAction() == 1) { + GridInfoWindow.this.close(); + } + return true; + } + }); + } + + + @Override + public void onOpen(Object item) { + OverlayWithIW overlay = (OverlayWithIW) item; + String title = overlay.getTitle(); + if (title == null) { + title = ""; + } + + if (this.mView == null) { + Log.w("OsmDroid", "Error trapped, BasicInfoWindow.open, mView is null!"); + } else { + titleView.setText(title); + String snippet = overlay.getSnippet(); + //Spanned snippetHtml = Html.fromHtml(snippet); + descriptionView.setText(snippet); + String subDesc = overlay.getSubDescription(); + subDescriptionView.setText(subDesc); + + } + } + + @Override + public void onClose() { + + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/grid_tracker/GridMarkerInfoWindow.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/grid_tracker/GridMarkerInfoWindow.java new file mode 100644 index 00000000..c11f19a5 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/grid_tracker/GridMarkerInfoWindow.java @@ -0,0 +1,159 @@ +package com.bg7yoz.ft8cn.grid_tracker; +/** + * 网格追踪中Marker(网格)的消息窗口。包括各分区的图标,点击呼叫的按钮。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.annotation.SuppressLint; +import android.graphics.Paint; +import android.util.Log; +import android.view.MotionEvent; +import android.view.View; +import android.widget.ImageButton; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.constraintlayout.widget.ConstraintLayout; + +import com.bg7yoz.ft8cn.Ft8Message; +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.MainViewModel; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.ui.ToastMessage; + +import org.osmdroid.views.MapView; +import org.osmdroid.views.overlay.OverlayWithIW; +import org.osmdroid.views.overlay.infowindow.InfoWindow; + +public class GridMarkerInfoWindow extends InfoWindow { + public static final int UNDEFINED_RES_ID = 0; + + private final TextView titleView; + private final TextView descriptionView; + private final TextView subDescriptionView; + private final MainViewModel mainViewModel; + private Ft8Message msg; + + + @SuppressLint("UseCompatLoadingForDrawables") + public GridMarkerInfoWindow(MainViewModel mainViewModel,int layoutResId, MapView mapView, Ft8Message msg) { + super(layoutResId, mapView); + this.mainViewModel=mainViewModel; + this.msg=msg; + //setResIds(mapView.getContext()); + titleView = (TextView) this.mView.findViewById(R.id.tracker_marker_info_bubble_title); + descriptionView = (TextView) this.mView.findViewById(R.id.tracker_marker_info_bubble_description); + subDescriptionView = (TextView) this.mView.findViewById(R.id.tracker_marker_info_bubble_subdescription); + ImageView fromDxccImage = (ImageView) this.mView.findViewById(R.id.track_marker_from_dxcc_image); + ImageView fromItuImage = (ImageView) this.mView.findViewById(R.id.track_marker_from_itu_image); + ImageView fromCqImage = (ImageView) this.mView.findViewById(R.id.track_marker_from_cq_image); + if (!msg.fromDxcc) fromDxccImage.setVisibility(View.GONE); + if (!msg.fromItu) fromItuImage.setVisibility(View.GONE); + if (!msg.fromCq) fromCqImage.setVisibility(View.GONE); + + ConstraintLayout layout=(ConstraintLayout) mView.findViewById(R.id.trackerMarkerConstraintLayout); + if (msg.fromCq||msg.fromItu||msg.fromDxcc){//如果是没有通联过的区域,把颜色改成红色 + layout.setBackground(mView.getResources().getDrawable(R.drawable.tracker_new_cq_info_win_style)); + ToastMessage.show(String.format(GeneralVariables.getStringFromResource( + (R.string.tracker_new_zone_found)),msg.getMessageText())); + } + + + + //查是不是在本波段内通联成功过的呼号 + if (GeneralVariables.checkQSLCallsign(msg.getCallsignFrom())) {//如果在数据库中,划线 + titleView.setPaintFlags( + titleView.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); + } else {//如果不在数据库中,去掉划线 + titleView.setPaintFlags( + titleView.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG)); + } + boolean otherBandIsQso = GeneralVariables.checkQSLCallsign_OtherBand(msg.getCallsignFrom()); + + //是否有与我呼号有关的消息 + if (msg.inMyCall()) { + layout.setBackground(mView.getResources().getDrawable(R.drawable.tracker_new_cq_info_win_style)); + titleView.setTextColor(mapView.getResources().getColor( + R.color.message_in_my_call_text_color)); + } else if (otherBandIsQso) { + //设置在别的波段通联过的消息颜色 + titleView.setTextColor(mapView.getResources().getColor( + R.color.fromcall_is_qso_text_color)); + } else { + titleView.setTextColor(mapView.getResources().getColor( + R.color.message_text_color)); + } + + + + + + + ImageButton imageButton=(ImageButton) this.mView.findViewById(R.id.callThisImageButton); + //if (GeneralVariables.myCallsign.equals(msg.getCallsignFrom())){ + if (GeneralVariables.checkIsMyCallsign(msg.getCallsignFrom())){ + imageButton.setVisibility(View.GONE); + } + + imageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + doCallNow(); + } + }); + this.mView.setOnTouchListener(new View.OnTouchListener() { + public boolean onTouch(View v, MotionEvent e) { + if (e.getAction() == 1) { + GridMarkerInfoWindow.this.close(); + } + return true; + } + }); + } + /** + * 马上对发起者呼叫 + * + */ + //@RequiresApi(api = Build.VERSION_CODES.N) + private void doCallNow() { + mainViewModel.addFollowCallsign(msg.getCallsignFrom()); + if (!mainViewModel.ft8TransmitSignal.isActivated()) { + mainViewModel.ft8TransmitSignal.setActivated(true); + GeneralVariables.transmitMessages.add(msg);//把消息添加到关注列表中 + } + //呼叫发启者 + mainViewModel.ft8TransmitSignal.setTransmit(msg.getFromCallTransmitCallsign() + , 1, msg.extraInfo); + mainViewModel.ft8TransmitSignal.transmitNow(); + + GeneralVariables.resetLaunchSupervision();//复位自动监管 + } + + + @Override + public void onOpen(Object item) { + OverlayWithIW overlay = (OverlayWithIW) item; + String title = overlay.getTitle(); + if (title == null) { + title = ""; + } + + if (this.mView == null) { + Log.w("OsmDroid", "Error trapped, BasicInfoWindow.open, mView is null!"); + } else { + titleView.setText(title); + String snippet = overlay.getSnippet(); + //Spanned snippetHtml = Html.fromHtml(snippet); + descriptionView.setText(snippet); + String subDesc = overlay.getSubDescription(); + subDescriptionView.setText(subDesc); + + } + } + + @Override + public void onClose() { + + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/grid_tracker/GridOsmMapView.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/grid_tracker/GridOsmMapView.java new file mode 100644 index 00000000..089befbe --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/grid_tracker/GridOsmMapView.java @@ -0,0 +1,951 @@ +package com.bg7yoz.ft8cn.grid_tracker; +/** + * OsmMapView中画通联线、画网格等操作。地图是sqlite模式,采用离线方式(nightUSGS4Layer)。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import static java.lang.Math.PI; +import static java.lang.Math.asin; +import static java.lang.Math.atan; +import static java.lang.Math.cos; +import static java.lang.Math.floor; +import static java.lang.Math.sin; +import static java.lang.Math.tan; + +import android.animation.ValueAnimator; +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.Color; +import android.graphics.DashPathEffect; +import android.graphics.Paint; +import android.graphics.PorterDuff; +import android.graphics.drawable.Drawable; +import android.util.Log; + +import com.bg7yoz.ft8cn.Ft8Message; +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.MainViewModel; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.database.DatabaseOpr; +import com.bg7yoz.ft8cn.log.QSLRecordStr; +import com.bg7yoz.ft8cn.maidenhead.MaidenheadGrid; +import com.google.android.gms.maps.model.LatLng; + +import org.osmdroid.tileprovider.IRegisterReceiver; +import org.osmdroid.tileprovider.modules.IArchiveFile; +import org.osmdroid.tileprovider.modules.OfflineTileProvider; +import org.osmdroid.tileprovider.tilesource.FileBasedTileSource; +import org.osmdroid.tileprovider.tilesource.TileSourceFactory; +import org.osmdroid.tileprovider.util.SimpleRegisterReceiver; +import org.osmdroid.util.BoundingBox; +import org.osmdroid.util.GeoPoint; +import org.osmdroid.views.CustomZoomButtonsDisplay; +import org.osmdroid.views.MapView; +import org.osmdroid.views.overlay.Marker; +import org.osmdroid.views.overlay.Polygon; +import org.osmdroid.views.overlay.Polyline; +import org.osmdroid.views.overlay.milestones.MilestoneLineDisplayer; +import org.osmdroid.views.overlay.milestones.MilestoneLister; +import org.osmdroid.views.overlay.milestones.MilestoneManager; +import org.osmdroid.views.overlay.milestones.MilestoneMeterDistanceSliceLister; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +public class GridOsmMapView { + private static final String TAG = "GridOsmMapView"; + + public enum GridMode {//网格的模式 + QSX, QSO, QSL + } + + public enum ShowTipsMode { + ALL, NEW, NONE + } + + private final MainViewModel mainViewModel; + //public static int COLOR_QSX = 0x7f0000ff;//红色50%,未通联过 + //public static int COLOR_QSO = 0x7fffff00;//黄色50%,通联过 + //public static int COLOR_QSL = 0x7fff0000;//红色50%,确认过 + private boolean showCQ = true; + private boolean showQSX = false; + + public final MapView gridMapView; + private final Context context; + // public ItemizedIconOverlay markerOverlay; + // private final ArrayList markerItems = new ArrayList<>(); + private final ArrayList gridLines = new ArrayList<>(); + private GridPolyLine selectedLine = null; + private static final int TIME_OUT = 3; + private int selectLineTimeOut = TIME_OUT;//被选择的画线,停留的周期数 + private final ArrayList gridPolygons = new ArrayList<>(); + private final ArrayList gridMarkers = new ArrayList<>(); + + private ShowTipsMode showTipsMode = ShowTipsMode.NEW; + + public GridOsmMapView(Context context, MapView gridMapView, MainViewModel mainViewModel) { + this.gridMapView = gridMapView; + this.context = context; + this.mainViewModel = mainViewModel; + } + + + public void initMap(String grid, boolean offset) { + mapViewOtherData(gridMapView);//设置内部源 + gridMapView.setMultiTouchControls(true); + gridMapView.setBuiltInZoomControls(true);//显示缩放按钮 + gridMapView.getZoomController().getDisplay().setPositions(true + , CustomZoomButtonsDisplay.HorizontalPosition.RIGHT + , CustomZoomButtonsDisplay.VerticalPosition.BOTTOM); + gridMapView.setTilesScaledToDpi(true); + + gridMapView.setMaxZoomLevel(6.0); + gridMapView.setMinZoomLevel(1.0); + gridMapView.getController().setZoom(1.6); + + gridMapView.setUseDataConnection(true); + gridMapView.setMultiTouchControls(true); + gridMapView.getOverlayManager().getTilesOverlay().setEnabled(true); + gridMapView.setSelected(true); + setGrayLine(); + + //addMarkerOverlay();//添加Marker图层 + + + //[A-Ra-r]{2}[0-9]{2}[A-Xa-x]{2},六位梅登海德正则 + // [A-Ra-r]{2}[0-9]{2},四位梅登海德正则 + LatLng latLng = MaidenheadGrid.gridToLatLng(grid);//做一下判断是不是网格 + if (latLng != null) { + if (offset) { + gridMapView.getController().setCenter(new GeoPoint(latLng.latitude + , latLng.longitude - 90f)); + } else { + gridMapView.getController().setCenter(new GeoPoint(latLng.latitude + , latLng.longitude)); + } + } + } + + /** + * 缩放到线路的范围之内 + * + * @param line 线 + */ + public void zoomToLineBound(GridPolyLine line) { + BoundingBox boundingBox = new BoundingBox(); + selectedLine = line; + selectLineTimeOut = TIME_OUT; + line.getOutlinePaint().setColor(gridMapView.getResources().getColor( + R.color.tracker_select_line_color)); + line.getOutlinePaint().setStrokeWidth(6); + //mOutlinePaint = getStrokePaint(0xffFF1E27, 3); + + GeoPoint eastNorthPoint = new GeoPoint(line.getActualPoints().get(0).getLatitude() + , line.getActualPoints().get(0).getLongitude()); + GeoPoint westSouthPoint = new GeoPoint(line.getActualPoints().get(1).getLatitude() + , line.getActualPoints().get(1).getLongitude()); + + if (Math.abs(westSouthPoint.getLongitude() - eastNorthPoint.getLongitude()) > 180) { + if (eastNorthPoint.getLongitude() > westSouthPoint.getLongitude()) { + double temp = westSouthPoint.getLongitude(); + westSouthPoint.setLongitude(eastNorthPoint.getLongitude()); + eastNorthPoint.setLongitude(temp); + + } + } else { + if (eastNorthPoint.getLongitude() < westSouthPoint.getLongitude()) { + double temp = westSouthPoint.getLongitude(); + westSouthPoint.setLongitude(eastNorthPoint.getLongitude()); + eastNorthPoint.setLongitude(temp); + + } + } + if (eastNorthPoint.getLatitude() < westSouthPoint.getLatitude()) { + double temp = westSouthPoint.getLatitude(); + westSouthPoint.setLatitude(eastNorthPoint.getLatitude()); + eastNorthPoint.setLatitude(temp); + } + + boundingBox.set(eastNorthPoint.getLatitude(), eastNorthPoint.getLongitude() + , westSouthPoint.getLatitude(), westSouthPoint.getLongitude()); + + gridMapView.zoomToBoundingBox(boundingBox, true, 100); + } + + + /** + * 显示CQ的位置 + * + * @param marker CQ的标记 + * @param offset 是否偏移 + */ + public void gotoCqGrid(GridMarker marker, boolean offset) { + GeoPoint geoPoint = new GeoPoint(marker.getPosition()); + if (offset) { + geoPoint.setLongitude(geoPoint.getLongitude() - 40f); + } + gridMapView.getController().animateTo(geoPoint, 2.5, 500L); + } + + + public synchronized GridMarker addGridMarker(String grid, Ft8Message msg) { + //todo 对于4.0的CQ消息,是没有网格信息的,可以以国家的地理位置代替 + if (LatLng2GeoPoint(MaidenheadGrid.gridToLatLng(grid)) == null) return null; + GridMarker marker = new GridMarker(context, mainViewModel, gridMapView, grid, msg); + gridMarkers.add(marker); + return marker; + } + + /** + * 清除标记marker + */ + public synchronized void clearMarkers() { + for (GridMarker marker : gridMarkers) { + marker.closeInfoWindow(); + gridMapView.getOverlays().remove(marker); + } + gridMarkers.clear(); + gridMapView.invalidate(); + } + + public GridPolyLine getSelectedLine() { + return selectedLine; + } + + public void clearSelectedLines() { + if (selectedLine != null) { + selectedLine.closeInfoWindow(); + gridMapView.getOverlays().remove(selectedLine); + selectedLine = null; + + } + } + + /** + * 清除线条 + */ + public synchronized void clearLines() { + + boolean isOpening = false; + + if (selectedLine != null) { + selectLineTimeOut--; + isOpening = selectedLine.isInfoWindowOpen(); + selectedLine.closeInfoWindow(); + gridMapView.getOverlays().remove(selectedLine); + } + for (GridPolyLine line : gridLines) { + line.closeInfoWindow(); + gridMapView.getOverlays().remove(line); + } + gridLines.clear(); + if (selectedLine != null && selectLineTimeOut > 0) { + gridMapView.getOverlays().add(selectedLine); + if (isOpening) selectedLine.showInfoWindow(); + } + gridMapView.invalidate(); + } + + + /** + * 清除网格瓦片 + */ + public synchronized void clearGridPolygon() { + for (GridPolygon polygon : gridPolygons) { + gridMapView.getOverlays().remove(polygon); + } + gridPolygons.clear(); + gridMapView.invalidate(); + } + + /** + * 清除全部图层 + */ + public void clearAll() { + clearMarkers(); + clearLines(); + clearGridPolygon(); + } + + /** + * 按照网格,查找网格图层,如果没有返回null + * + * @param grid 网格 + * @return 图层 + */ + public synchronized GridPolygon getGridPolygon(String grid) { + synchronized (gridPolygons) { + for (GridPolygon polygon : gridPolygons) { + if (polygon.grid.equals(grid)) return polygon; + } + } + return null; + } + + /** + * 标记、更新新发生消息的网格 + * + * @param grid 网格 + * @param msg 消息内容 + * @param subDetail 细节 + * @return 网格对象 + */ + public GridPolygon upgradeGridInfo(String grid, String msg, String subDetail) { + GridPolygon gridPolygon = getGridPolygon(grid); + if (gridPolygon == null) { + gridPolygon = addGridPolygon(grid, GridMode.QSX); + } + gridPolygon.setSnippet(msg); + gridPolygon.setSubDescription(subDetail); + //gridPolygon.showInfoWindow(); + return gridPolygon; + } + + /** + * 标记、更新新发生消息的网格 + * + * @param recordStr 历史记录 + * @return 网格对象 + */ + public GridPolygon upgradeGridInfo(QSLRecordStr recordStr) { + GridPolygon gridPolygon = getGridPolygon(recordStr.getGridsquare()); + if (gridPolygon == null) { + if (recordStr.isQSL) { + gridPolygon = addGridPolygon(recordStr.getGridsquare(), GridMode.QSL); + } else { + gridPolygon = addGridPolygon(recordStr.getGridsquare(), GridMode.QSO); + } + } + + gridPolygon.setSnippet(String.format(String.format("%s %s", + String.format(GeneralVariables.getStringFromResource(R.string.qsl_freq) + , recordStr.getFreq()), + String.format(GeneralVariables.getStringFromResource(R.string.qsl_band) + , recordStr.getBand())))); + + gridPolygon.setSubDescription(String.format("%s\n%s\n%s %s\n%s %s", + String.format(GeneralVariables.getStringFromResource(R.string.qsl_start_time) + , recordStr.getTime_on()), + String.format(GeneralVariables.getStringFromResource(R.string.qsl_end_time) + , recordStr.getTime_off()), + String.format(GeneralVariables.getStringFromResource(R.string.qsl_rst_rcvd) + , recordStr.getRst_rcvd()), + String.format(GeneralVariables.getStringFromResource(R.string.qsl_rst_sent) + , recordStr.getRst_sent()), + + String.format(GeneralVariables.getStringFromResource(R.string.qsl_mode) + , recordStr.getMode()), + recordStr.getComment() + )); + gridPolygon.setTitle(String.format("%s--%s", recordStr.getCall(), recordStr.getStation_callsign()));//显示消息内容 + gridPolygon.setInfoWindow(new GridRecordInfoWindow(R.layout.tracker_record_info_win, gridMapView)); + return gridPolygon; + } + + /** + * 更新地图 + */ + public void mapUpdate(){ + gridMapView.invalidate(); + } + + /** + * 升级网格状态,如果没有,说明是新的,就添加网格。返回false。如果有,返回true。 + * + * @param grid 网格 + * @param gridMode 模式 + * @return 发现 + */ + public boolean upgradeGridMode(String grid, GridMode gridMode) { + GridPolygon polygon = getGridPolygon(grid); + if (polygon != null) { + polygon.upgradeGridMode(gridMode); + return true; + } else { + addGridPolygon(grid, gridMode); + return false; + } + } + + /** + * 添加网格图层 + * + * @param grid 网格 + * @param gridMode 网格类型 + * @return 返回一个网格图层对象 + */ + public synchronized GridPolygon addGridPolygon(String grid, GridMode gridMode) { + if (gridMapView == null) return null; + if (gridMapView.getRepository()==null) return null; + try {//当日志量过多时,会出现闪退的问题,在此处做一个异常捕获,防止闪退 + + GridPolygon polygon = new GridPolygon(context, gridMapView, grid, gridMode); + gridPolygons.add(polygon); + gridMapView.getOverlays().add(polygon); + return polygon; + + } catch (Exception e) { + //throw new RuntimeException(e); + } + return null; + } + + /** + * 查找有没有符合的CQ Marker + * + * @param message 消息 + * @return Marker + */ + public GridMarker getMarker(Ft8Message message) { + for (GridMarker marker : gridMarkers) { + if (marker.msg == message) { + return marker; + } + } + return null; + } + + /** + * 查找有没有符合消息的线 + * + * @param message 消息 + * @return 线 + */ + public GridPolyLine getLine(Ft8Message message) { + for (GridPolyLine line : gridLines) { + if (line.msg == message) { + return line; + } + } + return null; + } + + /** + * 在两个网格之间画线。 + * + * @param message 消息 + * @param db 数据库 + */ + public synchronized GridPolyLine drawLine(Ft8Message message, DatabaseOpr db) { + LatLng fromLatLng = MaidenheadGrid.gridToLatLng(message.getMaidenheadGrid(db)); + LatLng toLatLng = MaidenheadGrid.gridToLatLng(message.getToMaidenheadGrid(db)); + if (fromLatLng == null) { + fromLatLng = message.fromLatLng; + } + + if (toLatLng == null) { + toLatLng = message.toLatLng; + } + if (fromLatLng == null || toLatLng == null) { + return null; + } + final GridPolyLine line = new GridPolyLine(gridMapView, fromLatLng, toLatLng, message); + gridLines.add(line); + return line; + } + + public synchronized GridPolyLine drawLine(QSLRecordStr recordStr) { + LatLng fromLatLng = MaidenheadGrid.gridToLatLng(recordStr.getGridsquare()); + LatLng toLatLng = MaidenheadGrid.gridToLatLng(recordStr.getMy_gridsquare()); + if (fromLatLng == null) { + //todo 把呼号转为国家的经纬度 + return null; + } + + if (toLatLng == null) { + //todo 把呼号转为国家的经纬度 + return null; + } + final GridPolyLine line = new GridPolyLine(gridMapView, fromLatLng, toLatLng, recordStr); + return line; + } + + /** + * 设定地图的离线来源 + * + * @param mapView osmMap + */ + public void mapViewOtherData(MapView mapView) { + //可以根据时间不同,显示不同的地图 + String strFilepath = getAssetsCacheFile(context, context.getString(R.string.map_name)); + File exitFile = new File(strFilepath); + if (!exitFile.exists()) { + mapView.setTileSource(TileSourceFactory.USGS_SAT); + } else { + OfflineTileProvider tileProvider = new OfflineTileProvider( + (IRegisterReceiver) new SimpleRegisterReceiver(context), new File[]{exitFile}); + mapView.setTileProvider(tileProvider); + String source = ""; + IArchiveFile[] archives = tileProvider.getArchives(); + if (archives.length > 0) { + Set tileSources = archives[0].getTileSources(); + if (!tileSources.isEmpty()) { + source = tileSources.iterator().next(); + mapView.setTileSource(FileBasedTileSource.getSource(source)); + } else { + mapView.setTileSource(TileSourceFactory.DEFAULT_TILE_SOURCE); + } + } else + mapView.setTileSource(TileSourceFactory.DEFAULT_TILE_SOURCE); + mapView.invalidate(); + + } + } + + /** + * 获取Assets目录,这里面保存着地图文件 + * + * @param context context + * @param fileName 地图文件名,sqlite格式 + * @return 包含全路径的文件名 + */ + public String getAssetsCacheFile(Context context, String fileName) { + File cacheFile = new File(context.getCacheDir(), fileName); + try { + InputStream inputStream = context.getAssets().open(fileName); + try { + FileOutputStream outputStream = new FileOutputStream(cacheFile); + try { + byte[] buf = new byte[1024]; + int len; + while ((len = inputStream.read(buf)) > 0) { + outputStream.write(buf, 0, len); + } + } finally { + outputStream.close(); + } + } finally { + inputStream.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + return cacheFile.getAbsolutePath(); + } + + public static GeoPoint LatLng2GeoPoint(LatLng latLng) { + if (latLng == null) return null; + return new GeoPoint(latLng.latitude, latLng.longitude); + } + + public static ArrayList LatLngs2GeoPoints(LatLng[] latLngs) { + ArrayList geoPoints = new ArrayList<>(); + if (latLngs != null) { + for (int i = 0; i < latLngs.length; i++) { + geoPoints.add(LatLng2GeoPoint(latLngs[i])); + } + } + return geoPoints; + } + + public static class GridPolyLine extends Polyline { + //public String fromGrid; + //public String toGrid; + public Ft8Message msg; + public QSLRecordStr recorder; + //public boolean marked = false; + + @SuppressLint("DefaultLocale") + public GridPolyLine(MapView mapView, LatLng fromLatLng, LatLng toLatLng, QSLRecordStr recordStr) { + super(mapView); + this.recorder = recordStr; + setSnippet(String.format(String.format("%s %s", + String.format(GeneralVariables.getStringFromResource(R.string.qsl_freq) + , recordStr.getFreq()), + String.format(GeneralVariables.getStringFromResource(R.string.qsl_band) + , recordStr.getBand())))); + + setSubDescription(String.format("%s\n%s\n%s %s\n%s %s", + String.format(GeneralVariables.getStringFromResource(R.string.qsl_start_time) + , recordStr.getTime_on()), + String.format(GeneralVariables.getStringFromResource(R.string.qsl_end_time) + , recordStr.getTime_off()), + String.format(GeneralVariables.getStringFromResource(R.string.qsl_rst_rcvd) + , recordStr.getRst_rcvd()), + String.format(GeneralVariables.getStringFromResource(R.string.qsl_rst_sent) + , recordStr.getRst_sent()), + + String.format(GeneralVariables.getStringFromResource(R.string.qsl_mode) + , recordStr.getMode()), + recordStr.getComment() + )); + setTitle(String.format("%s--%s", recordStr.getCall(), recordStr.getStation_callsign()));//显示消息内容 + this.mOutlinePaint = getStrokePaint( + mapView.getResources().getColor( + R.color.tracker_history_line_color), 3); + List pts = new ArrayList<>(); + pts.add(GridOsmMapView.LatLng2GeoPoint(fromLatLng)); + pts.add(GridOsmMapView.LatLng2GeoPoint(toLatLng)); + + + setPoints(pts); + setGeodesic(true); + setInfoWindow(new GridRecordInfoWindow(R.layout.tracker_record_info_win, mapView)); + mapView.getOverlayManager().add(this); + } + + @SuppressLint("DefaultLocale") + public GridPolyLine(MapView mapView, LatLng fromLatLng, LatLng toLatLng, Ft8Message msg) { + super(mapView); + this.msg = msg; + + setSnippet(String.format("%s<--%s", msg.toWhere, msg.fromWhere));//表示距离 + setSubDescription(String.format("%dBm , %.1f ms , %s" + , msg.snr, msg.time_sec + , MaidenheadGrid.getDistLatLngStr(fromLatLng, toLatLng))); + setTitle(msg.getMessageText());//显示消息内容 + if (msg.inMyCall()) { + this.mOutlinePaint = getStrokePaint( + mapView.getResources().getColor( + R.color.tracker_in_my_line_color), 3); + } else { + this.mOutlinePaint = getStrokePaint(mapView.getResources().getColor( + R.color.tracker_line_color), 3); + } + + List pts = new ArrayList<>(); + pts.add(GridOsmMapView.LatLng2GeoPoint(fromLatLng)); + pts.add(GridOsmMapView.LatLng2GeoPoint(toLatLng)); + + + setPoints(pts); + setGeodesic(true); + setInfoWindow(new GridInfoWindow(R.layout.tracker_grid_info_win, mapView, msg)); + mapView.getOverlayManager().add(this); + //showInfoWindow(); + + final float lineLen = (float) getDistance(); + final float pointLen = lineLen / 10f > 200000 ? 200000f : lineLen / 10f; + + final List managers = new ArrayList<>(); + + final MilestoneMeterDistanceSliceLister slicerForPath = new MilestoneMeterDistanceSliceLister(); + managers.add(getAnimatedPathManager(slicerForPath)); + + setMilestoneManagers(managers); + + + //设置方向动画 + final ValueAnimator percentageCompletion = ValueAnimator.ofFloat(0, 1); // 10 kilometers + + percentageCompletion.setRepeatCount(ValueAnimator.INFINITE); + percentageCompletion.setDuration(1000); // 1 seconds + percentageCompletion.setStartDelay(0); // 1 second + + percentageCompletion.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator animation) { + double dist = ((float) animation.getAnimatedValue()) * lineLen; + double distStart = dist - pointLen; + if (distStart < 0) distStart = 0; + slicerForPath.setMeterDistanceSlice(distStart, dist); + mapView.invalidate(); + } + }); + percentageCompletion.start(); + } + + /** + * 线条的动画点,设置:绿色,10f宽度 + */ + private MilestoneManager getAnimatedPathManager(final MilestoneLister pMilestoneLister) { + final Paint slicePaint = getStrokePaint(Color.GREEN, 15f); + return new MilestoneManager(pMilestoneLister, new MilestoneLineDisplayer(slicePaint)); + } + + private Paint getStrokePaint(final int pColor, final float pWidth) { + Paint paint = new Paint(); + paint.setStrokeWidth(pWidth); + paint.setStyle(Paint.Style.STROKE); + paint.setAntiAlias(true); + paint.setColor(pColor); + //paint.setStrokeCap(Paint.Cap.ROUND); + paint.setPathEffect(new DashPathEffect(new float[]{20, 10}, 0)); + return paint; + } + + public void showNewInfo() { + if (msg != null) { + if ((msg.fromDxcc || msg.fromItu || msg.fromCq) + && !GeneralVariables.checkQSLCallsign(msg.callsignFrom)) { + showInfoWindow(); + } + } + if (recorder != null) { + showInfoWindow(); + } + + } + } + + public static class GridPolygon extends Polygon { + public String grid; + public GridMode gridMode; + private final Context context; + //private BasicInfoWindow infoWindow; + //public String details; + + public GridPolygon(Context context, MapView mapView, String grid, GridMode gridMode) { + super(mapView); + this.grid = grid; + this.gridMode = gridMode; + this.context = context; + + setTitle(grid); + setStrokeWidth(3f); + setStrokeColor(this.context.getColor(R.color.osm_grid_out_line_color)); + + updateGridMode(); + + ArrayList pts = LatLngs2GeoPoints(MaidenheadGrid.gridToPolygon(grid)); + setPoints(pts); + + setVisible(true); + + } + + public synchronized void updateGridMode() { + synchronized (this) {//防止闪退 + switch (gridMode) { + case QSL: + this.mFillPaint.setColor(this.context.getColor(R.color.tracker_sample_qsl_color)); + //setFillColor(this.context.getColor(R.color.tracker_sample_qsl_color)); + break; + case QSO: + this.mFillPaint.setColor(this.context.getColor(R.color.tracker_sample_qso_color)); + //setFillColor(this.context.getColor(R.color.tracker_sample_qso_color)); + break; + case QSX: + this.mFillPaint.setColor(this.context.getColor(R.color.tracker_sample_qsx_color)); + //setFillColor(this.context.getColor(R.color.tracker_sample_qsx_color)); + break; + } + } + } + + public synchronized void upgradeGridMode(GridMode mode) { + if (mode.ordinal() > gridMode.ordinal()) { + gridMode = mode; + updateGridMode(); + } + } + } + + public static class GridMarker extends Marker { + public String grid; + private final Context context; + private final Ft8Message msg; + + @SuppressLint({"UseCompatLoadingForDrawables", "DefaultLocale"}) + public GridMarker(Context context, MainViewModel mainViewModel, MapView mapView + , String grid, Ft8Message msg) { + super(mapView); + this.grid = grid; + this.context = context; + this.msg = msg; + + this.setPosition(LatLng2GeoPoint(MaidenheadGrid.gridToLatLng(grid))); + this.setAnchor(ANCHOR_CENTER, ANCHOR_BOTTOM); + this.setInfoWindow(new GridMarkerInfoWindow(mainViewModel + , R.layout.tracker_cq_marker_info_win, mapView, msg)); + setSnippet(String.format("%d dBm , %.1f ms", msg.snr, msg.time_sec)); + setSubDescription(String.format("%s , %s" + , MaidenheadGrid.getDistStr(grid, GeneralVariables.getMyMaidenheadGrid()) + , msg.fromWhere));//表示距离 + setTitle(msg.getMessageText());//显示消息内容 + + + @SuppressLint("UseCompatLoadingForDrawables") + Drawable d; + if (GeneralVariables.checkQSLCallsign(msg.callsignFrom)) { + d = context.getDrawable(R.drawable.ic_baseline_cq_qso_24).mutate(); + d.setColorFilter(context.getColor(R.color.tracker_cq_marker_is_qso_color) + , PorterDuff.Mode.SRC_ATOP); + + } else { + d = context.getDrawable(R.drawable.ic_baseline_cq_24).mutate(); + } + if (GeneralVariables.checkQSLCallsign_OtherBand(msg.callsignFrom)) { + d.setColorFilter(context.getColor(R.color.tracker_cq_marker_other_is_qso_color) + , PorterDuff.Mode.SRC_ATOP); + } + setIcon(d); + + //this.showInfoWindow(); + mapView.getOverlays().add(this); + } + + public void showNewInfo() { + if ((msg.fromDxcc || msg.fromItu || msg.fromCq || (msg.checkIsCQ())) + && !GeneralVariables.checkQSLCallsign(msg.callsignFrom)) { + showInfoWindow(); + } + } + } + + + /** + * 显示提示,根据显示模式来显示。 + */ + public void showInfoWindows() { + setShowTipsMode(showTipsMode); + } + + /** + * 显示全部提示 + */ + public void showAllInfoWindows() { + if (showQSX) { + for (GridPolyLine line : gridLines) { + line.showInfoWindow(); + } + } + if (showCQ) { + for (GridMarker marker : gridMarkers) { + marker.showInfoWindow(); + } + } + } + + /** + * 只显示新的提示 + */ + public void showNewInfoWindows() { + if (showQSX) { + for (GridPolyLine line : gridLines) { + line.showNewInfo(); + } + } + if (showCQ) { + for (GridMarker marker : gridMarkers) { + marker.showNewInfo(); + } + } + } + + /** + * 关闭全部提示窗口 + */ + public synchronized void hideInfoWindows() { + for (GridPolygon polygon : gridPolygons + ) { + polygon.closeInfoWindow(); + } + for (GridPolyLine line : gridLines) { + line.closeInfoWindow(); + } + for (GridMarker marker : gridMarkers) { + marker.closeInfoWindow(); + } + gridMapView.invalidate(); + } + + + public void setShowCQ(boolean showCQ) { + this.showCQ = showCQ; + showInfoWindows(); + } + + public void setShowQSX(boolean showQSX) { + this.showQSX = showQSX; + showInfoWindows(); + } + + public void setShowTipsMode(ShowTipsMode showTipsMode) { + this.showTipsMode = showTipsMode; + hideInfoWindows(); + switch (this.showTipsMode) { + case ALL: + showAllInfoWindows(); + break; + case NEW: + showNewInfoWindows(); + break; + case NONE: + break; + } + } + + + private static double[] computeDayNightTerminator(long t) { + // The nice thing about the java time standard is that converting it + // to a julian date is trivial - unlike the gyrations the original + // matlab code had to go through to convert the y/n/d/h/m/s parameters + final double julianDate1970 = t / (double) (1000 * 60 * 60 * 24); + // convert from the unix epoch to the astronomical epoch + // (noon on January 1, 4713 BC, GMT/UT) (the .5 is noon versus midnight) + final double juliandate = julianDate1970 + 2440587.500000; + final double K = PI / 180; + // here be dragons! + final double T = (juliandate - 2451545.0) / 36525; + double L = 280.46645 + 36000.76983 * T + 0.0003032 * T * T; + L = L % 360; + if (L < 0) + L = L + 360; + double M = 357.52910 + 35999.05030 * T - 0.0001559 * T * T - + 0.00000048 * T * T * T; + M = M % 360; + if (M < 0) + M = M + 360; + final double C = (1.914600 - 0.004817 * T - 0.000014 * T * T) * sin(K * M) + + (0.019993 - 0.000101 * T) * sin(K * 2 * M) + + 0.000290 * sin(K * 3 * M); + final double theta = L + C; + final double LS = L; + final double LM = 218.3165 + 481267.8813 * T; + final double eps0 = 23.0 + 26.0 / 60.0 + 21.448 / 3600.0 - + (46.8150 * T + + 0.00059 * T * T - 0.001813 * T * T * T) / 3600; + final double omega = 125.04452 - 1934.136261 * T + 0.0020708 * T * T + + T * T * + T / 450000; + final double deltaEps = + (9.20 * cos(K * omega) + 0.57 * cos(K * 2 * LS) + + 0.10 * cos(K * 2 * LM) - 0.09 * cos(K * 2 * omega)) / 3600; + final double eps = eps0 + deltaEps + 0.00256 * + cos(K * (125.04 - 1934.136 * T)); + final double lambda = theta - 0.00569 - 0.00478 * sin(K * (125.04 - + 1934.136 * + T)); + final double delta = asin(sin(K * eps) * sin(K * lambda)); + final double dec = delta / K; + final double tau = (juliandate - floor(juliandate)) * 360; + double[] coords = new double[361]; + for (int i = 0; i < 361; i++) + coords[i] = atan(cos((i - 180 + tau) * K) / tan(dec * K)) / K + 90; + return coords; + } + + /** + * 根据当前时间画灰线 + */ + public void setGrayLine() { + double[] lats = computeDayNightTerminator(System.currentTimeMillis()); + LatLng[] grayLine = new LatLng[lats.length * 3]; + for (int i = 0; i < lats.length; i++) { + grayLine[i] = new LatLng((lats[i] - 90), i); + grayLine[lats.length + i] = new LatLng((lats[i] - 90), i); + grayLine[lats.length * 2 + i] = new LatLng((lats[i] - 90), i); + } + + Polyline line = new Polyline(gridMapView); + line.setWidth(15f); + line.setColor(context.getColor(R.color.tracker_gray_line_color)); + + List pts = new ArrayList<>(); + for (int i = 0; i < grayLine.length; i++) { + pts.add(GridOsmMapView.LatLng2GeoPoint(grayLine[i])); + } + line.setInfoWindow(null); + line.setPoints(pts); + gridMapView.getOverlays().add(line); + + } + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/grid_tracker/GridRecordInfoWindow.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/grid_tracker/GridRecordInfoWindow.java new file mode 100644 index 00000000..3c9209b3 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/grid_tracker/GridRecordInfoWindow.java @@ -0,0 +1,89 @@ +package com.bg7yoz.ft8cn.grid_tracker; +/** + * 通联日志的提示窗口。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.annotation.SuppressLint; +import android.graphics.Paint; +import android.util.Log; +import android.view.MotionEvent; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.constraintlayout.widget.ConstraintLayout; + +import com.bg7yoz.ft8cn.Ft8Message; +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; + +import org.osmdroid.views.MapView; +import org.osmdroid.views.overlay.OverlayWithIW; +import org.osmdroid.views.overlay.infowindow.InfoWindow; + +public class GridRecordInfoWindow extends InfoWindow { + public static final int UNDEFINED_RES_ID = 0; + // static int mTitleId = 0; +// static int mDescriptionId = 0; +// static int mSubDescriptionId = 0; +// static int fromDxccImageId = 0; +// static int fromItuImageId = 0; +// static int fromCqImageId = 0; +// static int toDxccImageId = 0; +// static int toItuImageId = 0; +// static int toCqImageId = 0; + private final TextView titleView; + private final TextView descriptionView; + private final TextView subDescriptionView; + + + @SuppressLint("UseCompatLoadingForDrawables") + public GridRecordInfoWindow(int layoutResId, MapView mapView) { + super(layoutResId, mapView); + //setResIds(mapView.getContext()); + titleView = (TextView) this.mView.findViewById(R.id.tracker_rec_info_bubble_title); + descriptionView = (TextView) this.mView.findViewById(R.id.tracker_rec_info_bubble_description); + subDescriptionView = (TextView) this.mView.findViewById(R.id.tracker_rec_info_bubble_subdescription); + + ConstraintLayout layout=(ConstraintLayout) mView.findViewById(R.id.trackerGridRecInfoConstraintLayout); + + + this.mView.setOnTouchListener(new View.OnTouchListener() { + public boolean onTouch(View v, MotionEvent e) { + if (e.getAction() == 1) { + GridRecordInfoWindow.this.close(); + } + return true; + } + }); + } + + + @Override + public void onOpen(Object item) { + OverlayWithIW overlay = (OverlayWithIW) item; + String title = overlay.getTitle(); + if (title == null) { + title = ""; + } + + if (this.mView == null) { + Log.w("OsmDroid", "Error trapped, BasicInfoWindow.open, mView is null!"); + } else { + titleView.setText(title); + String snippet = overlay.getSnippet(); + //Spanned snippetHtml = Html.fromHtml(snippet); + descriptionView.setText(snippet); + String subDesc = overlay.getSubDescription(); + subDescriptionView.setText(subDesc); + + } + } + + @Override + public void onClose() { + + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/grid_tracker/GridTrackerMainActivity.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/grid_tracker/GridTrackerMainActivity.java new file mode 100644 index 00000000..b2506dc1 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/grid_tracker/GridTrackerMainActivity.java @@ -0,0 +1,902 @@ +package com.bg7yoz.ft8cn.grid_tracker; +/** + * 网格追踪的主窗口。 + * + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.animation.Animator; +import android.animation.AnimatorSet; +import android.animation.ObjectAnimator; +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.Intent; +import android.content.pm.ActivityInfo; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; +import android.graphics.drawable.Drawable; +import android.os.AsyncTask; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.util.AttributeSet; +import android.util.Log; +import android.view.MenuItem; +import android.view.View; +import android.view.WindowManager; +import android.view.animation.AnimationUtils; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatDelegate; +import androidx.core.content.ContextCompat; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.Observer; +import androidx.recyclerview.widget.ItemTouchHelper; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.bg7yoz.ft8cn.Ft8Message; +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.MainViewModel; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.database.DatabaseOpr; +import com.bg7yoz.ft8cn.database.OnAfterQueryConfig; +import com.bg7yoz.ft8cn.databinding.ActivityGridTrackerMainBinding; +import com.bg7yoz.ft8cn.floatview.FloatView; +import com.bg7yoz.ft8cn.floatview.FloatViewButton; +import com.bg7yoz.ft8cn.ft8transmit.TransmitCallsign; +import com.bg7yoz.ft8cn.log.OnQueryQSLRecordCallsign; +import com.bg7yoz.ft8cn.log.QSLRecordStr; +import com.bg7yoz.ft8cn.timer.UtcTimer; +import com.bg7yoz.ft8cn.ui.CallingListAdapter; +import com.bg7yoz.ft8cn.ui.FreqDialog; +import com.bg7yoz.ft8cn.ui.SetVolumeDialog; +import com.bg7yoz.ft8cn.ui.ToastMessage; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +public class GridTrackerMainActivity extends AppCompatActivity { + private static final String TAG = "GridTrackerMainActivity"; + private static final String DataConfigShowMode = "tracker_show_mode"; + private static final String DataConfigShowQsx = "tracker_show_qsx"; + private static final String DataConfigShowCQ = "tracker_show_cq"; + + private MainViewModel mainViewModel; + private ActivityGridTrackerMainBinding binding; + private FloatView floatView; + private FloatViewButton transButton; + private GridOsmMapView gridOsmMapView; + + private RecyclerView callMessagesRecyclerView; + private CallingListAdapter callingListAdapter; + private boolean messageListIsClose = false; + private boolean configBarIsClose = false; + private QSLRecordStr qlsRecorder = null;//用于历史显示消息 + private MutableLiveData> qslRecordList = new MutableLiveData<>(); + public static final int DRAW_LINE = 1; + + + @SuppressLint("NotifyDataSetChanged") + protected void doAfterCreate() { + //设置消息列表 + callingListAdapter.notifyDataSetChanged(); + callMessagesRecyclerView.scrollToPosition(callingListAdapter.getItemCount() - 1); + + setTipsRadioGroupClickerListener();//显示模式Group radio动作 + setShowTipsSwitchClickerListener();//显示提示开关动作 + readConfig(); + + //读取调用本activity的参数,如果不为空,说明要画参数中的消息 + //画在日志界面中被选择的消息 + Intent intentGet = getIntent(); + qlsRecorder = (QSLRecordStr) intentGet.getSerializableExtra("qslList"); + if (qlsRecorder != null) { + GridOsmMapView.GridPolyLine line = drawMessage(qlsRecorder);//在地图上画每一个消息 + if (line != null) { + line.showInfoWindow(); + } + } + //画日志界面查询出的全部消息 + String queryKey = intentGet.getStringExtra("qslAll"); + int queryFilter = intentGet.getIntExtra("queryFilter", 0); + if (queryKey != null) { + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.tracker_query_qso_info)); + mainViewModel.databaseOpr.getQSLRecordByCallsign(true, 0, queryKey, queryFilter + , new OnQueryQSLRecordCallsign() { + @Override + public void afterQuery(ArrayList records) { + qslRecordList.postValue(records); + } + }); + } + } + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + + //禁止休眠 + getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON + , WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + + //设置深色模式 + getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_YES); + + //全屏 + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN + , WindowManager.LayoutParams.FLAG_FULLSCREEN); + + + mainViewModel = MainViewModel.getInstance(this); + binding = ActivityGridTrackerMainBinding.inflate(getLayoutInflater()); + + gridOsmMapView = new GridOsmMapView(getBaseContext(), binding.osmMap, mainViewModel); + + + callMessagesRecyclerView = binding.callMessagesRecyclerView; + callingListAdapter = new CallingListAdapter(this, mainViewModel + , mainViewModel.ft8Messages, CallingListAdapter.ShowMode.TRACKER); + callMessagesRecyclerView.setLayoutManager(new LinearLayoutManager(this)); + callMessagesRecyclerView.setAdapter(callingListAdapter); + + + callingListAdapter.setOnItemClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + int position = (int) view.getTag(); + if (position == -1) { + return; + } + if (position > mainViewModel.ft8Messages.size() - 1) { + return; + } + Ft8Message msg = mainViewModel.ft8Messages.get(position); + + if (msg.checkIsCQ()) { + GridOsmMapView.GridMarker marker = gridOsmMapView.getMarker(msg); + if (marker == null) marker = gridOsmMapView.addGridMarker( + msg.getMaidenheadGrid(mainViewModel.databaseOpr), msg); + if (marker != null) { + gridOsmMapView.hideInfoWindows(); + gridOsmMapView.gotoCqGrid(marker, true); + marker.showInfoWindow(); + } + } else { + gridOsmMapView.hideInfoWindows(); + gridOsmMapView.clearSelectedLines(); + GridOsmMapView.GridPolyLine line; + line = gridOsmMapView.drawLine(msg, mainViewModel.databaseOpr); + if (line != null) { + gridOsmMapView.zoomToLineBound(line); + line.showInfoWindow(); + closeMessages(); + } + } + } + }); + //设置消息列表滑动,用于快速呼叫 + initRecyclerViewAction(); + + //观察解码数量 + mainViewModel.mutable_Decoded_Counter.observe(this, new Observer() { + @SuppressLint({"DefaultLocale", "NotifyDataSetChanged"}) + @Override + public void onChanged(Integer integer) { + } + }); + mainViewModel.mutableIsDecoding.observe(this, new Observer() { + @Override + public void onChanged(Boolean aBoolean) { + if (aBoolean) { + gridOsmMapView.clearLines(); + gridOsmMapView.clearMarkers(); + } + } + }); + mainViewModel.mutableFt8MessageList.observe(this, new Observer>() { + @SuppressLint("NotifyDataSetChanged") + @Override + public void onChanged(ArrayList messages) { + if (mainViewModel.currentMessages == null) return; + ArrayList tempMsg = new ArrayList<>(mainViewModel.currentMessages); + callingListAdapter.notifyDataSetChanged(); + if (callMessagesRecyclerView.computeVerticalScrollRange() + - callMessagesRecyclerView.computeVerticalScrollExtent() + - callMessagesRecyclerView.computeVerticalScrollOffset() < 500) { + callMessagesRecyclerView.scrollToPosition(callingListAdapter.getItemCount() - 1); + } + + binding.gridMessageTextView.setText(String.format("%s %s" + , String.format(GeneralVariables.getStringFromResource( + R.string.tracker_decoded_new) + , mainViewModel.currentDecodeCount), String.format( + getString(R.string.decoding_takes_milliseconds) + , mainViewModel.ft8SignalListener.decodeTimeSec.getValue()))); + + + //画电台之间的连线 + //对CQ的电台打点 + for (Ft8Message msg : tempMsg) { + drawMessage(msg);//在地图上画每一个消息 + } + gridOsmMapView.showInfoWindows(); + //} + } + }); + + + //观察DEBUG信息 + GeneralVariables.mutableDebugMessage.observe(this, new Observer() { + @Override + public void onChanged(String s) { + if (s.length() > 1) { + binding.trackerDebugLayout.setVisibility(View.VISIBLE); + } else { + binding.trackerDebugLayout.setVisibility(View.GONE); + } + binding.debugMessageTextView.setText(s); + } + }); + //设置发射消息框的动画 + binding.transmittingMessageTextView.setAnimation(AnimationUtils.loadAnimation(this + , R.anim.view_blink)); + //观察发射的状态 + mainViewModel.ft8TransmitSignal.mutableIsTransmitting.observe(this, + new Observer() { + @Override + public void onChanged(Boolean aBoolean) { + if (aBoolean) { + binding.transmittingLayout.setVisibility(View.VISIBLE); + } else { + binding.transmittingLayout.setVisibility(View.GONE); + } + } + }); + + //观察发射内容的变化 + mainViewModel.ft8TransmitSignal.mutableTransmittingMessage.observe(this, + new Observer() { + @Override + public void onChanged(String s) { + binding.transmittingMessageTextView.setText(s); + } + }); + + + //观察时钟的变化,显示进度条 + mainViewModel.timerSec.observe(this, new Observer() { + @Override + public void onChanged(Long aLong) { + if (mainViewModel.ft8TransmitSignal.sequential == UtcTimer.getNowSequential() + && mainViewModel.ft8TransmitSignal.isActivated()) { + binding.utcProgressBar.setBackgroundColor(getColor(R.color.calling_list_isMyCall_color)); + } else { + binding.utcProgressBar.setBackgroundColor(getColor(R.color.progresss_bar_back_color)); + } + binding.utcProgressBar.setProgress((int) ((aLong / 1000) % 15)); + } + }); + + //添加浮动按钮 + InitFloatView(); + + + //gridOsmMapView.initMap(GeneralVariables.getMyMaidenhead4Grid(), true); + + //把呼号与网格对应关系中的网格提取出来 + for (Map.Entry entry : GeneralVariables.callsignAndGrids.entrySet()) { + gridOsmMapView.upgradeGridMode(entry.getValue(), GridOsmMapView.GridMode.QSX); + } + + //观察呼号与网格的对应关系表的变化,如果有新增的,就添加 + GeneralVariables.mutableNewGrid.observe(this, new Observer() { + @Override + public void onChanged(String s) { + if (!gridOsmMapView.upgradeGridMode(s, GridOsmMapView.GridMode.QSX)) { + ToastMessage.show(String.format(GeneralVariables.getStringFromResource( + R.string.grid_tracker_new_grid), s)); + } + } + }); + + //获取曾经通联过的网格 + mainViewModel.databaseOpr.getQsoGridQuery(new DatabaseOpr.OnGetQsoGrids() { + @Override + public void onAfterQuery(HashMap grids) { + for (Map.Entry entry : grids.entrySet()) { + gridOsmMapView.upgradeGridMode(entry.getKey() + , entry.getValue() ? GridOsmMapView.GridMode.QSL : GridOsmMapView.GridMode.QSO); + } + } + }); + + //关闭消息按钮 + binding.closeMessageImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + closeMessages(); + } + }); + //打开消息按钮 + binding.openMessagesImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + openMessage(); + } + }); + gridOsmMapView.initMap(GeneralVariables.getMyMaidenhead4Grid(), true); + + qslRecordList.observe(this, new Observer>() { + @Override + public void onChanged(ArrayList qslRecordStrs) { + for (QSLRecordStr record : qslRecordStrs) { + //todo 数据量过大可能会卡死,OOM + drawMessage(record);//在地图上画每一个消息 + } + gridOsmMapView.mapUpdate(); + } + }); + + new Handler(Looper.getMainLooper()).postDelayed(new Runnable() { + @Override + public void run() { + closeMessages(); + closeConfigBar(); + doAfterCreate(); + } + }, 1000); + + setContentView(binding.getRoot()); + } + + + /** + * 在地图上画消息,包括收发消息和CQ消息 + * + * @param msg 消息 + */ + @SuppressLint("DefaultLocale") + private void drawMessage(Ft8Message msg) { + gridOsmMapView.upgradeGridInfo( + msg.getMaidenheadGrid(mainViewModel.databaseOpr), msg.getMessageText() + , String.format("%d dBm , %.1f ms", msg.snr, msg.time_sec)); + gridOsmMapView.drawLine(msg, mainViewModel.databaseOpr); + if (msg.checkIsCQ()) { + gridOsmMapView.addGridMarker( + msg.getMaidenheadGrid(mainViewModel.databaseOpr) + , msg); + } + } + + private GridOsmMapView.GridPolyLine drawMessage(QSLRecordStr recordStr) { + if (recordStr.getMy_gridsquare().equals("") || recordStr.getGridsquare().equals("")) { + return null; + } + gridOsmMapView.gridMapView.post(new Runnable() { + @Override + public void run() { + gridOsmMapView.upgradeGridInfo(recordStr); + gridOsmMapView.drawLine(recordStr); + } + }); + + return null; + } + + private void setShowTipsSwitchClickerListener() { + + binding.trackerShowQsxSwitch.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + gridOsmMapView.hideInfoWindows(); + if (binding.trackerShowQsxSwitch.isChecked()) { + binding.trackerShowQsxSwitch.setText(GeneralVariables.getStringFromResource( + R.string.tracker_show_qsx_tips)); + } else { + binding.trackerShowQsxSwitch.setText(GeneralVariables.getStringFromResource( + R.string.tracker_hide_qsx_tips)); + } + gridOsmMapView.setShowQSX(binding.trackerShowQsxSwitch.isChecked()); + writeConfig(DataConfigShowQsx, binding.trackerShowQsxSwitch.isChecked() ? "1" : "0"); + } + }); + + binding.trackerShowCqSwitch.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + gridOsmMapView.hideInfoWindows(); + if (binding.trackerShowCqSwitch.isChecked()) { + binding.trackerShowCqSwitch.setText(GeneralVariables.getStringFromResource( + R.string.tracker_show_cq_tips)); + } else { + binding.trackerShowCqSwitch.setText(GeneralVariables.getStringFromResource( + R.string.tracker_hide_cq_tips)); + } + gridOsmMapView.setShowCQ(binding.trackerShowCqSwitch.isChecked()); + writeConfig(DataConfigShowCQ, binding.trackerShowCqSwitch.isChecked() ? "1" : "0"); + + } + }); + } + + /** + * 设置显示模式动作 + */ + private void setTipsRadioGroupClickerListener() { + View.OnClickListener listener = new View.OnClickListener() { + @Override + public void onClick(View view) { + if (binding.tipsAllRadioButton.isChecked()) { + gridOsmMapView.setShowTipsMode(GridOsmMapView.ShowTipsMode.ALL); + writeConfig(DataConfigShowMode, "0"); + } + if (binding.tipsNewRadioButton.isChecked()) { + gridOsmMapView.setShowTipsMode(GridOsmMapView.ShowTipsMode.NEW); + writeConfig(DataConfigShowMode, "1"); + } + if (binding.tipsNoneRadioButton.isChecked()) { + gridOsmMapView.setShowTipsMode(GridOsmMapView.ShowTipsMode.NONE); + binding.trackerShowQsxSwitch.setVisibility(View.GONE); + binding.trackerShowCqSwitch.setVisibility(View.GONE); + writeConfig(DataConfigShowMode, "2"); + } else { + binding.trackerShowQsxSwitch.setVisibility(View.VISIBLE); + binding.trackerShowCqSwitch.setVisibility(View.VISIBLE); + } + } + }; + binding.tipsAllRadioButton.setOnClickListener(listener); + binding.tipsNewRadioButton.setOnClickListener(listener); + binding.tipsNoneRadioButton.setOnClickListener(listener); + + View.OnClickListener barListener = new View.OnClickListener() { + @Override + public void onClick(View view) { + closeConfigBar(); + } + }; + binding.closeTIpsImageView.setOnClickListener(barListener); + binding.trackerInfoModeTextView.setOnClickListener(barListener); + + } + + private void openConfigBar() { + if (!configBarIsClose) return; + configBarIsClose = false; + ObjectAnimator openConfigAnimator = ObjectAnimator.ofFloat(binding.trackerConfigLayout + , "translationY", 0); + //openConfigAnimator.setDuration(500); + openConfigAnimator.setFloatValues(binding.trackerConfigLayout.getHeight() + 10, 0); + openConfigAnimator.start(); + } + + private void closeConfigBar() { + if (configBarIsClose) return; + configBarIsClose = true; + ObjectAnimator openConfigAnimator = ObjectAnimator.ofFloat(binding.trackerConfigLayout + , "translationY", 0); + //openConfigAnimator.setDuration(500); + openConfigAnimator.setFloatValues(0, binding.trackerConfigLayout.getHeight() + 100); + openConfigAnimator.start(); + } + + /** + * 关闭消息栏 + */ + private void openMessage() { + if (!messageListIsClose) return; + messageListIsClose = false; + ObjectAnimator openMessageAnimator = ObjectAnimator.ofFloat(binding.callingListConstraintLayout + , "translationX", 0); + //openMessageAnimator.setDuration(500); + openMessageAnimator.setFloatValues(-binding.callingListConstraintLayout.getWidth() - 10, 0); + + AnimatorSet animatorSet = new AnimatorSet(); + animatorSet.playTogether(openMessageAnimator); + animatorSet.addListener(new Animator.AnimatorListener() { + @Override + public void onAnimationStart(Animator animator) { + binding.openMessagesImageButton.setVisibility(View.GONE); + } + + @Override + public void onAnimationEnd(Animator animator) { + binding.closeMessageImageButton.setVisibility(View.VISIBLE); + } + + @Override + public void onAnimationCancel(Animator animator) { + + } + + @Override + public void onAnimationRepeat(Animator animator) { + + } + }); + + animatorSet.start(); + } + + /** + * 动画关闭消息栏 + */ + private void closeMessages() { + if (messageListIsClose) return; + messageListIsClose = true; + ObjectAnimator closeMessageAnimator = ObjectAnimator.ofFloat(binding.callingListConstraintLayout + , "translationX", 0); + //closeMessageAnimator.setDuration(500); + closeMessageAnimator.setFloatValues(0, -binding.callingListConstraintLayout.getWidth() - 10); + + AnimatorSet animatorSet = new AnimatorSet(); + animatorSet.playTogether(closeMessageAnimator); + animatorSet.addListener(new Animator.AnimatorListener() { + @Override + public void onAnimationStart(Animator animator) { + binding.closeMessageImageButton.setVisibility(View.GONE); + } + + @Override + public void onAnimationEnd(Animator animator) { + binding.openMessagesImageButton.setVisibility(View.VISIBLE); + } + + @Override + public void onAnimationCancel(Animator animator) { + + } + + @Override + public void onAnimationRepeat(Animator animator) { + + } + }); + + animatorSet.start(); + } + + + /** + * 添加浮动按钮 + */ + + private void InitFloatView() { + floatView = new FloatView(this, 32); + + binding.trackConstraint.addView(floatView); + floatView.setButtonMargin(0); + floatView.setFloatBoard(FloatView.FLOAT_BOARD.RIGHT); + + floatView.setButtonBackgroundResourceId(R.drawable.float_button_style); + + transButton = floatView.addButton(R.id.grid_tracker_trans, "grid_tracker_trans" + , R.drawable.ic_baseline_cancel_schedule_send_off + , new View.OnClickListener() { + @Override + public void onClick(View view) { + //如果 + if (!mainViewModel.ft8TransmitSignal.isActivated()) { + mainViewModel.ft8TransmitSignal.restTransmitting(); + } + mainViewModel.ft8TransmitSignal.setActivated(!mainViewModel.ft8TransmitSignal.isActivated()); + GeneralVariables.resetLaunchSupervision();//复位自动监管 + } + }); + + + //动态添加按钮,建议使用静态的ID,静态ID在VALUES/FLOAT_BUTTON_IDS.XML中设置 + + floatView.addButton(R.id.float_freq, "float_freq", R.drawable.ic_baseline_freq_24 + , new View.OnClickListener() { + @Override + public void onClick(View view) { + new FreqDialog(binding.trackConstraint.getContext(), mainViewModel).show(); + } + }); + + floatView.addButton(R.id.set_volume, "set_volume", R.drawable.ic_baseline_volume_up_24 + , new View.OnClickListener() { + @Override + public void onClick(View view) { + new SetVolumeDialog(binding.trackConstraint.getContext(), mainViewModel).show(); + } + }); + floatView.addButton(R.id.grid_tracker_config, "grid_tracker_config" + , R.drawable.ic_baseline_tracker_settings_24 + , new View.OnClickListener() { + @Override + public void onClick(View view) { + if (configBarIsClose) { + openConfigBar(); + } else { + closeConfigBar(); + } + } + }); + + + //显示当前目标呼号 + mainViewModel.ft8TransmitSignal.mutableToCallsign.observe(this, new Observer() { + @Override + public void onChanged(TransmitCallsign transmitCallsign) { + binding.trackerTargetTextView.setText(String.format( + GeneralVariables.getStringFromResource(R.string.target_callsign) + , transmitCallsign.callsign)); + } + }); + + //观察发射状态按钮的变化 + Observer transmittingObserver = new Observer() { + @Override + public void onChanged(Boolean aBoolean) { + if (mainViewModel.ft8TransmitSignal.isActivated()) { + binding.trackerTargetTextView.setVisibility(View.VISIBLE); + } else { + binding.trackerTargetTextView.setVisibility(View.GONE); + } + + if (mainViewModel.ft8TransmitSignal.isTransmitting()) { + transButton.setImageResource(R.drawable.ic_baseline_send_red_48); + transButton.setAnimation(AnimationUtils.loadAnimation(getBaseContext(), R.anim.view_blink)); + } else { + //录音对象也要处于启动状态才可以有发射的状态 + if (mainViewModel.ft8TransmitSignal.isActivated() && mainViewModel.hamRecorder.isRunning()) { + transButton.setImageResource(R.drawable.ic_baseline_send_white_48); + } else { + transButton.setImageResource(R.drawable.ic_baseline_cancel_schedule_send_off); + } + transButton.setAnimation(null); + } + + } + }; + //显示发射状态 + mainViewModel.ft8TransmitSignal.mutableIsTransmitting.observe(this, transmittingObserver); + mainViewModel.ft8TransmitSignal.mutableIsActivated.observe(this, transmittingObserver); + + floatView.initLocation(); + } + + /** + * 把配置信息写到数据库 + * + * @param KeyName 关键词 + * @param Value 值 + */ + private void writeConfig(String KeyName, String Value) { + mainViewModel.databaseOpr.writeConfig(KeyName, Value, null); + } + + private void readConfig() { + OnAfterQueryConfig queryConfig = new OnAfterQueryConfig() { + @Override + public void doOnBeforeQueryConfig(String KeyName) { + + } + + @Override + public void doOnAfterQueryConfig(String KeyName, String Value) { + runOnUiThread(new Runnable() { + @Override + public void run() { + if (KeyName.equalsIgnoreCase(DataConfigShowMode)) { + if (Value.equals("1")) { + gridOsmMapView.setShowTipsMode(GridOsmMapView.ShowTipsMode.NEW); + binding.tipsNewRadioButton.setChecked(true); + binding.tipsNewRadioButton.callOnClick(); + } else if (Value.equals("2")) { + gridOsmMapView.setShowTipsMode(GridOsmMapView.ShowTipsMode.NONE); + binding.tipsNoneRadioButton.setChecked(true); + binding.tipsNoneRadioButton.callOnClick(); + } else { + gridOsmMapView.setShowTipsMode(GridOsmMapView.ShowTipsMode.ALL); + binding.tipsAllRadioButton.setChecked(true); + binding.tipsAllRadioButton.callOnClick(); + } + //tipsAllRadioButton + } + if (KeyName.equalsIgnoreCase(DataConfigShowQsx)) { + gridOsmMapView.setShowQSX(Value.equals("1")); + binding.trackerShowQsxSwitch.setChecked(Value.equals("1")); + binding.trackerShowQsxSwitch.callOnClick(); + } + if (KeyName.equalsIgnoreCase(DataConfigShowCQ)) { + gridOsmMapView.setShowCQ(Value.equals("1")); + binding.trackerShowCqSwitch.setChecked(Value.equals("1")); + binding.trackerShowCqSwitch.callOnClick(); + } + } + }); + } + }; + mainViewModel.databaseOpr.getConfigByKey(DataConfigShowMode, queryConfig); + mainViewModel.databaseOpr.getConfigByKey(DataConfigShowQsx, queryConfig); + mainViewModel.databaseOpr.getConfigByKey(DataConfigShowCQ, queryConfig); + } + + /** + * 马上对发起者呼叫 + * + * @param message 消息 + */ + //@RequiresApi(api = Build.VERSION_CODES.N) + private void doCallNow(Ft8Message message) { + mainViewModel.addFollowCallsign(message.getCallsignFrom()); + if (!mainViewModel.ft8TransmitSignal.isActivated()) { + mainViewModel.ft8TransmitSignal.setActivated(true); + GeneralVariables.transmitMessages.add(message);//把消息添加到关注列表中 + } + //呼叫发启者 + mainViewModel.ft8TransmitSignal.setTransmit(message.getFromCallTransmitCallsign() + , 1, message.extraInfo); + mainViewModel.ft8TransmitSignal.transmitNow(); + + GeneralVariables.resetLaunchSupervision();//复位自动监管 + } + + + /** + * 设置列表滑动动作 + */ + private void initRecyclerViewAction() { + new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(ItemTouchHelper.ANIMATION_TYPE_DRAG + , ItemTouchHelper.START | ItemTouchHelper.END) { + @Override + public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder + , @NonNull RecyclerView.ViewHolder target) { + return false; + } + + //@RequiresApi(api = Build.VERSION_CODES.N) + @SuppressLint("NotifyDataSetChanged") + @Override + public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) { + if (direction == ItemTouchHelper.START) { + Ft8Message message = callingListAdapter.getMessageByViewHolder(viewHolder); + if (message != null) { + //呼叫的目标不能是自己 + if (!message.getCallsignFrom().equals("<...>") + //&& !message.getCallsignFrom().equals(GeneralVariables.myCallsign) + && !GeneralVariables.checkIsMyCallsign(message.getCallsignFrom()) + && !(message.i3 == 0 && message.n3 == 0)) { + doCallNow(message); + } + } + callingListAdapter.notifyDataSetChanged(); + //callingListAdapter.notifyItemChanged(viewHolder.getAdapterPosition()); + } + if (direction == ItemTouchHelper.END) {//删除 + callingListAdapter.deleteMessage(viewHolder.getAdapterPosition()); + callingListAdapter.notifyItemRemoved(viewHolder.getAdapterPosition()); + } + } + + + @Override + public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) { + super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive); + Ft8Message message = callingListAdapter.getMessageByViewHolder(viewHolder); + //制作呼叫背景的图标显示 + final Drawable callIcon = ContextCompat.getDrawable(getBaseContext(), R.drawable.ic_baseline_send_red_48); + final Drawable delIcon = ContextCompat.getDrawable(getBaseContext(), R.drawable.log_item_delete_icon); + final Drawable background = new ColorDrawable(Color.LTGRAY); + + if (message == null) { + return; + } + if (message.getCallsignFrom().equals("<...>")) {//如果属于不能呼叫的消息,就不显示图标 + return; + } + Drawable icon; + if (dX > 0) { + icon = delIcon; + } else { + icon = callIcon; + } + View itemView = viewHolder.itemView; + int iconMargin = (itemView.getHeight() - icon.getIntrinsicHeight()) / 2; + int iconLeft, iconRight, iconTop, iconBottom; + int backTop, backBottom, backLeft, backRight; + backTop = itemView.getTop(); + backBottom = itemView.getBottom(); + iconTop = itemView.getTop() + (itemView.getHeight() - icon.getIntrinsicHeight()) / 2; + iconBottom = iconTop + icon.getIntrinsicHeight(); + if (dX > 0) { + backLeft = itemView.getLeft(); + backRight = itemView.getLeft() + (int) dX; + background.setBounds(backLeft, backTop, backRight, backBottom); + iconLeft = itemView.getLeft() + iconMargin; + iconRight = iconLeft + icon.getIntrinsicWidth(); + icon.setBounds(iconLeft, iconTop, iconRight, iconBottom); + } else if (dX < 0) { + backRight = itemView.getRight(); + backLeft = itemView.getRight() + (int) dX; + background.setBounds(backLeft, backTop, backRight, backBottom); + iconRight = itemView.getRight() - iconMargin; + iconLeft = iconRight - icon.getIntrinsicWidth(); + icon.setBounds(iconLeft, iconTop, iconRight, iconBottom); + } else { + background.setBounds(0, 0, 0, 0); + icon.setBounds(0, 0, 0, 0); + } + background.draw(c); + icon.draw(c); + + } + }).attachToRecyclerView(binding.callMessagesRecyclerView); + } + + + /** + * 菜单选项 + * + * @param item 菜单 + * @return 是否选择 + */ + //@RequiresApi(api = Build.VERSION_CODES.N) + @Override + public boolean onContextItemSelected(@NonNull MenuItem item) { + //Ft8Message ft8Message = (Ft8Message) item.getActionView().getTag(); + int position = (int) item.getActionView().getTag(); + Ft8Message ft8Message = callingListAdapter.getMessageByPosition(position); + if (ft8Message == null) return super.onContextItemSelected(item); + + GeneralVariables.resetLaunchSupervision();//复位自动监管 + switch (item.getItemId()) { + case 1://时序与发送者相反!!! + Log.d(TAG, "呼叫:" + ft8Message.getCallsignTo()); + if (!mainViewModel.ft8TransmitSignal.isActivated()) { + mainViewModel.ft8TransmitSignal.setActivated(true); + } + mainViewModel.ft8TransmitSignal.setTransmit(ft8Message.getToCallTransmitCallsign() + , 1, ft8Message.extraInfo); + mainViewModel.ft8TransmitSignal.transmitNow(); + break; + + case 3: + Log.d(TAG, "呼叫:" + ft8Message.getCallsignFrom()); + doCallNow(ft8Message); + break; + + case 4://回复 + Log.d(TAG, "回复:" + ft8Message.getCallsignFrom()); + mainViewModel.addFollowCallsign(ft8Message.getCallsignFrom()); + if (!mainViewModel.ft8TransmitSignal.isActivated()) { + mainViewModel.ft8TransmitSignal.setActivated(true); + GeneralVariables.transmitMessages.add(ft8Message);//把消息添加到关注列表中 + } + //呼叫发启者 + mainViewModel.ft8TransmitSignal.setTransmit(ft8Message.getFromCallTransmitCallsign() + , -1, ft8Message.extraInfo); + mainViewModel.ft8TransmitSignal.transmitNow(); + break; + + + } + + return super.onContextItemSelected(item); + } + + + @Override + protected void onResume() { + super.onResume(); + binding.osmMap.onResume(); + } + + @Override + protected void onPause() { + super.onPause(); + binding.osmMap.onPause(); + } +} \ No newline at end of file diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/html/HtmlContext.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/html/HtmlContext.java new file mode 100644 index 00000000..9d4a309e --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/html/HtmlContext.java @@ -0,0 +1,219 @@ +package com.bg7yoz.ft8cn.html; +/** + * Http服务内容的出框架。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.annotation.SuppressLint; +import android.database.Cursor; + +import com.bg7yoz.ft8cn.BuildConfig; +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; + +public class HtmlContext { + private static final String HTML_HEAD = " FT8CN\n" + + " \n" + + " "+ + "\n" + + "\n" + + "\n"; + private static final String HTML_TITLE = "
" + + "Welcome to FT8CN "+ BuildConfig.VERSION_NAME+"
" + +GeneralVariables.getStringFromResource(R.string.html_return) + +"
\n"; + private static final String HTML_FOOTER = "" + + "
BG7YOZ
" + + ""+GeneralVariables.getStringFromResource(R.string.html_return)+"
\n"; + + private static String HTML_BODY(String context) { + return "" + HTML_TITLE + "
"+context+"\n
" + HTML_FOOTER + ""; + } + + public static String HTML_STRING(String context) { + return HTML_HEAD + HTML_BODY(context); + } + + + public static String DEFAULT_HTML() { + return HTML_STRING("" + + "" + + "" + + "" + + "" + + "" + + "" + + + "" + + "" + + "" + + //"" + + + "" + + "" + + + "" + + + "" + + "" + + + "
" + + GeneralVariables.getStringFromResource(R.string.html_track_operation_information) +"
" + +GeneralVariables.getStringFromResource(R.string.html_track_callsign_hash_table) + +"
" + +GeneralVariables.getStringFromResource(R.string.html_trace_parsed_messages)+"
" + +GeneralVariables.getStringFromResource(R.string.html_trace_callsign_and_grid_correspondence_table) + +"
" + +GeneralVariables.getStringFromResource(R.string.html_query_swl_message) + +"
" + +GeneralVariables.getStringFromResource(R.string.html_query_qso_swl) + +"
" + +GeneralVariables.getStringFromResource(R.string.html_query_configuration_information) + +"
" + +GeneralVariables.getStringFromResource(R.string.html_query_all_table)+"
" + +GeneralVariables.getStringFromResource(R.string.html_manage_tracking_callsign)+"
" + // +GeneralVariables.getStringFromResource(R.string.html_manage_communication_callsigns)+"
" + +GeneralVariables.getStringFromResource(R.string.html_show_communication_callsigns)+"
" + +GeneralVariables.getStringFromResource(R.string.html_callsign_qth)+"
"//查询日志 + +GeneralVariables.getStringFromResource(R.string.html_query_logs)+"
" + +GeneralVariables.getStringFromResource(R.string.html_export_log) + +""+GeneralVariables.getStringFromResource(R.string.html_to_the_third_party)+"
" + +GeneralVariables.getStringFromResource(R.string.html_import_log) + +""+GeneralVariables.getStringFromResource(R.string.html_from_jtdx_lotw)+"
"); + } + + /** + * 生成表格的内容 + * @param sb html + * @param s 内容 + * @return html + */ + public static StringBuilder tableCell(StringBuilder sb, String... s){ + for (String c: s) { + sb.append(String.format("%s",c)); + } + sb.append("\n"); + return sb; + } + + /** + * 生成表格标题 + * @param sb html + * @param s 标题 + * @return html + */ + public static StringBuilder tableCellHeader(StringBuilder sb, String... s){ + for (String c: s) { + sb.append(String.format("%s",c)); + } + sb.append("\n"); + return sb; + } + @SuppressLint("DefaultLocale") + public static StringBuilder tableKeyRow(StringBuilder sb , Boolean darkMode, String key, int value){ + sb.append(String.format("%s%d\n" + ,darkMode ? "class=\"bbb\"" : "" + ,key,value)); + return sb; + } + + public static StringBuilder tableKeyRow(StringBuilder sb ,Boolean darkMode,String key,String value){ + sb.append(String.format("%s%s\n" + ,darkMode ? "class=\"bbb\"" : "" + ,key,value)); + return sb; + } + + public static StringBuilder tableRowBegin(StringBuilder sb){ + return tableRowBegin(sb,false,false); + } + public static StringBuilder tableRowBegin(StringBuilder sb,Boolean alignCenter,boolean darkMode){ + sb.append(String.format("" + ,alignCenter?"align=center":"" + ,darkMode ? "class=\"bbb\"":"")); + return sb; + } + public static StringBuilder tableRowEnd(StringBuilder sb){ + sb.append(""); + return sb; + } + + public static StringBuilder tableBegin(StringBuilder sb){ + return tableBegin(sb,false,1,true); + } + public static StringBuilder tableBegin(StringBuilder sb,boolean hasBorder,boolean fullWidth){ + return tableBegin(sb,hasBorder,1,fullWidth); + } + @SuppressLint("DefaultLocale") + public static StringBuilder tableBegin(StringBuilder sb, boolean hasBorder, int cellpadding,boolean fullWidth){ + sb.append(String.format("" + ,hasBorder ? "border=\"1\"" :"" + ,cellpadding + ,fullWidth ? "width=\"100%\"":"")); + return sb; + } + + public static StringBuilder tableEnd(StringBuilder sb){ + sb.append("
"); + return sb; + } + public static String ListTableContext(Cursor cursor,boolean fullWidth){ + return ListTableContext(cursor,false,0,fullWidth); + } + public static String ListTableContext(Cursor cursor,boolean hasBorder,int cellpadding ,boolean fullWidth) { + StringBuilder result = new StringBuilder(); + HtmlContext.tableBegin(result,hasBorder,cellpadding,fullWidth).append("\n"); + + //写字段名 + HtmlContext.tableRowBegin(result); + for (int i = 0; i < cursor.getColumnCount(); i++) { + HtmlContext.tableCellHeader(result,cursor.getColumnName(i)); + } + HtmlContext.tableRowEnd(result).append("\n"); + int order=0; + while (cursor.moveToNext()) { + HtmlContext.tableRowBegin(result,false,order % 2 !=0); + for (int i = 0; i < cursor.getColumnCount(); i++) { + HtmlContext.tableCell(result,(cursor.getString(i)!=null) ? cursor.getString(i) :""); + } + HtmlContext.tableRowEnd(result).append("\n"); + order++; + } + HtmlContext.tableEnd(result).append("\n"); + cursor.close(); + return result.toString(); + } + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/html/ImportTaskList.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/html/ImportTaskList.java new file mode 100644 index 00000000..409b5dfa --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/html/ImportTaskList.java @@ -0,0 +1,134 @@ +package com.bg7yoz.ft8cn.html; + +import android.annotation.SuppressLint; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; + +import java.util.HashMap; + +public class ImportTaskList extends HashMap { + + /** + * 获取上传的任务,以session为key + * + * @param session session + * @return 任务的HTML + */ + public String getTaskHTML(int session) { + ImportTask task = this.get(session); + if (task == null) { + return GeneralVariables.getStringFromResource(R.string.null_task_html); + } + return task.getHtml(); + } + public void cancelTask(int session){ + ImportTask task = this.get(session); + if (task != null) { + task.setStatus(ImportState.CANCELED); + } + } + + /** + * 检查任务是不是在运行。 + * + * @param session 任务ID + * @return false 没有任务或任务结束 + */ + public boolean checkTaskIsRunning(int session) { + ImportTask task = this.get(session); + if (task == null) { + return false; + } else { + return task.status == ImportState.STARTING || task.status == ImportState.IMPORTING; + } + } + + /** + * 添加任务到列表,要确保线程安全 + * + * @param session session + * @param task 任务 + */ + public synchronized ImportTask addTask(int session, ImportTask task) { + this.put(session, task); + return task; + } + + public ImportTask addTask(int session) { + return addTask(session, new ImportTask(session)); + } + + + enum ImportState { + STARTING, IMPORTING, FINISHED, CANCELED + } + + public static class ImportTask { + + + int session;//session,用于记录上传会话,是一个hash + public int count = 0;//解析出总的数据量 + public int importedCount = 0;//导入的数量 + public int readErrorCount = 0;//读取数据错误数量 + public int processCount = 0; + public int updateCount = 0;//更新的数量 + public int invalidCount = 0;//无效的QSL + public int newCount = 0;//新导入的数量 + public ImportState status = ImportState.STARTING;//状态:0:开始,1:运行,2:结束,3:取消 + String message = "";//任务消息描述 + String errorMsg = ""; + + @SuppressLint("DefaultLocale") + public String getHtml() { + String htmlHeader = "\n"; + String htmlEnder = "
\n"; + String progress = String.format("%s %.1f%%(%d/%d)\n", GeneralVariables.getStringFromResource(R.string.import_progress_html) + , count == 0 ? 0 : processCount * 100f / count, processCount, count); + String cell = "%s\n"; + String errorHtml = status == ImportState.FINISHED || status == ImportState.CANCELED ? errorMsg : ""; + String doCancelButton = status == ImportState.FINISHED || status == ImportState.CANCELED ? "" + : String.format("

" + , session,GeneralVariables.getStringFromResource(R.string.import_cancel_button)); + return htmlHeader + + String.format(cell, progress) + + String.format(cell, String.format(GeneralVariables.getStringFromResource(R.string.import_read_error_count_html), readErrorCount)) + + String.format(cell, String.format(GeneralVariables.getStringFromResource(R.string.import_new_count_html), newCount)) + + String.format(cell, String.format(GeneralVariables.getStringFromResource(R.string.import_update_count_html), updateCount)) + + String.format(cell, String.format(GeneralVariables.getStringFromResource(R.string.import_invalid_count_html), invalidCount)) + + String.format(cell, String.format(GeneralVariables.getStringFromResource(R.string.import_readed_html), importedCount)) + + String.format(cell, message) + + String.format(cell, errorHtml) + + htmlEnder + + doCancelButton; + } + + public ImportTask(int session) { + this.session = session; + } + + public void setStatus(ImportState status) { + this.status = status; + setStateMSG(status); + } + + private void setStateMSG(ImportState state) { + switch (state) { + case IMPORTING: + this.message = String.format("%s" + ,GeneralVariables.getStringFromResource(R.string.log_importing_html)); + break; + case FINISHED: + this.message = String.format("%s" + ,GeneralVariables.getStringFromResource(R.string.log_import_finished_html)); + break; + case CANCELED: + this.message = String.format("%s" + ,GeneralVariables.getStringFromResource(R.string.import_canceled_html)); + break; + } + } + + + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/html/LogHttpServer.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/html/LogHttpServer.java new file mode 100644 index 00000000..91db7247 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/html/LogHttpServer.java @@ -0,0 +1,1987 @@ +package com.bg7yoz.ft8cn.html; +/** + * Http服务的具体内容。数据库访问不需要异步方式。 + * + * @author BGY70Z + * @date 2023-03-20 + */ + +import static com.bg7yoz.ft8cn.html.HtmlContext.HTML_STRING; + +import android.annotation.SuppressLint; +import android.database.Cursor; +import android.util.Log; + +import com.bg7yoz.ft8cn.Ft8Message; +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.MainViewModel; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.connector.CableSerialPort; +import com.bg7yoz.ft8cn.connector.ConnectMode; +import com.bg7yoz.ft8cn.database.AfterInsertQSLData; +import com.bg7yoz.ft8cn.database.ControlMode; +import com.bg7yoz.ft8cn.database.RigNameList; +import com.bg7yoz.ft8cn.log.LogFileImport; +import com.bg7yoz.ft8cn.log.QSLRecord; +import com.bg7yoz.ft8cn.maidenhead.MaidenheadGrid; +import com.bg7yoz.ft8cn.rigs.BaseRigOperation; +import com.bg7yoz.ft8cn.timer.UtcTimer; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +import fi.iki.elonen.NanoHTTPD; + +@SuppressWarnings("ConstantConditions") +public class LogHttpServer extends NanoHTTPD { + private final MainViewModel mainViewModel; + public static int DEFAULT_PORT = 7050; + private static final String TAG = "LOG HTTP"; + + private final ImportTaskList importTaskList = new ImportTaskList();//导如日志的任务列表 + + + public LogHttpServer(MainViewModel viewModel, int port) { + super(port); + this.mainViewModel = viewModel; + + } + + @Override + public Response serve(IHTTPSession session) { + String[] uriList = session.getUri().split("/"); + String uri = ""; + String msg; + Log.i(TAG, "serve uri: " + session.getUri()); + + if (uriList.length >= 2) { + uri = uriList[1]; + } + + if (uri.equalsIgnoreCase("CONFIG")) {//查配置信息 + msg = HTML_STRING(getConfig()); + } else if (uri.equalsIgnoreCase("showQSLCallsigns")) {//显示通联过的呼号,包括最后的时间 + msg = HTML_STRING(showQslCallsigns(session)); + } else if (uri.equalsIgnoreCase("DEBUG")) {//查通联过的呼号 + msg = HTML_STRING(showDebug()); + } else if (uri.equalsIgnoreCase("SHOWHASH")) {//查通呼号的哈希表 + msg = HTML_STRING(showCallsignHash()); + } else if (uri.equalsIgnoreCase("NEWMESSAGE")) {//查本周期通联消息表 + msg = HTML_STRING(getNewMessages()); + } else if (uri.equalsIgnoreCase("MESSAGE")) {//查保存的SWL通联消息表 + return getMessages(session); + } else if (uri.equalsIgnoreCase("QSOSWLMSG")) {//查SWL QSO通联消息表 + return getSWLQsoMessages(session); + } else if (uri.equalsIgnoreCase("QSOLogs")) {//查QSO日志 + return getQsoLogs(session); + } else if (uri.equalsIgnoreCase("CALLSIGNGRID")) {//查呼号与网格的对应关系 + msg = HTML_STRING(showCallGridList()); + } else if (uri.equalsIgnoreCase("GETCALLSIGNQTH")) { + msg = HTML_STRING(getCallsignQTH(session)); + } else if (uri.equalsIgnoreCase("ALLTABLE")) {//查所有的表 + msg = HTML_STRING(getAllTableName()); + } else if (uri.equalsIgnoreCase("FOLLOWCALLSIGNS")) {//查关注的呼号 + msg = HTML_STRING(getFollowCallsigns()); + } else if (uri.equalsIgnoreCase("DELFOLLOW")) {//删除关注的呼号 + if (uriList.length >= 3) { + deleteFollowCallSign(uriList[2].replace("_", "/")); + } + msg = HTML_STRING(getFollowCallsigns()); + } else if (uri.equalsIgnoreCase("DELQSL")) { + if (uriList.length >= 3) { + deleteQSLByMonth(uriList[2].replace("_", "/")); + } + msg = HTML_STRING(showQSLTable()); + } else if (uri.equalsIgnoreCase("QSLCALLSIGNS")) {//查通联过的呼号 + msg = HTML_STRING(getQSLCallsigns()); + } else if (uri.equalsIgnoreCase("QSLTABLE")) { + msg = HTML_STRING(showQSLTable()); + } else if (uri.equalsIgnoreCase("IMPORTLOG")) { + msg = HTML_STRING(showImportLog()); + } else if (uri.equalsIgnoreCase("GETIMPORTTASK")) {//这个是用户实时获取导入状态的URI + msg = HTML_STRING(makeGetImportTaskHTML(session)); + } else if (uri.equalsIgnoreCase("CANCELTASK")) {//这个是用户取消导入的URI + msg = HTML_STRING(doCancelImport(session)); + } else if (uri.equalsIgnoreCase("IMPORTLOGDATA")) { + msg = HTML_STRING(doImportLogFile(session)); + } else if (uri.equalsIgnoreCase("SHOWALLQSL")) { + msg = HTML_STRING(showAllQSL()); + } else if (uri.equalsIgnoreCase("SHOWQSL")) { + msg = HTML_STRING(showQSLByMonth(uriList[2])); + } else if (uri.equalsIgnoreCase("DELQSLCALLSIGN")) {//删除通联过的呼号 + if (uriList.length >= 3) { + deleteQSLCallSign(uriList[2].replace("_", "/")); + } + msg = HTML_STRING(getQSLCallsigns()); + } else { + msg = HtmlContext.DEFAULT_HTML(); + } + //return newFixedLengthResponse(msg); + + try { + Response response; + if (uri.equalsIgnoreCase("DOWNALLQSL")) {//下载日志 + msg = downAllQSl(); + response = newFixedLengthResponse(NanoHTTPD.Response.Status.OK, "text/plain", msg); + response.addHeader("Content-Disposition", "attachment;filename=All_log.adi"); + } else if (uri.equalsIgnoreCase("DOWNQSL")) { + if (uriList.length >= 3) { + msg = downQSLByMonth(uriList[2], true); + } else { + msg = HtmlContext.DEFAULT_HTML(); + } + response = newFixedLengthResponse(NanoHTTPD.Response.Status.OK, "text/plain", msg); + response.addHeader("Content-Disposition", String.format("attachment;filename=log%s.adi", uriList[2])); + + } else if (uri.equalsIgnoreCase("DOWNQSLNOQSL")) { + if (uriList.length >= 3) { + msg = downQSLByMonth(uriList[2], false); + } else { + msg = HtmlContext.DEFAULT_HTML(); + } + response = newFixedLengthResponse(NanoHTTPD.Response.Status.OK, "text/plain", msg); + response.addHeader("Content-Disposition", String.format("attachment;filename=log%s.adi", uriList[2])); + + } else { + response = newFixedLengthResponse(msg); + } + return response;// + } catch (Exception exception) { + return newFixedLengthResponse(Response.Status.INTERNAL_ERROR, MIME_PLAINTEXT, exception.getMessage()); + } + } + + + @SuppressLint("DefaultLocale") + private String doImportLogFile(IHTTPSession session) { + //判断是不是POST日志文件 + if (session.getMethod().equals(Method.POST) + || session.getMethod().equals(Method.PUT)) { + Map files = new HashMap<>(); + //Map header = session.getHeaders(); + try { + session.parseBody(files); + + Log.e(TAG, "doImportLogFile: information:" + files.toString()); + String param = files.get("file1");//这个是post或put文件的key + + ImportTaskList.ImportTask task = importTaskList.addTask(param.hashCode());//生成一个新的任务 + + LogFileImport logFileImport = new LogFileImport(task, param); + + + //把提交的数据放到一个独立的线程运行,防止WEB页面停留太久 + new Thread(new Runnable() { + @Override + public void run() { + doImportADI(task, logFileImport); + } + }).start(); + + //重定向,跳转到实时导入信息界面 + return String.format("\n" + , param.hashCode()); + + } catch (IOException | ResponseException e) { + e.printStackTrace(); + return String.format(GeneralVariables.getStringFromResource(R.string.html_import_failed) + , e.getMessage()); + } + } + return GeneralVariables.getStringFromResource(R.string.html_illegal_command); + } + + + private String makeGetImportTaskHTML(IHTTPSession session) { + String script = ""; + script = "\n\n"; + Map pars = session.getParms(); + if (pars.get("session") != null) { + String s = Objects.requireNonNull(pars.get("session")); + int id = Integer.parseInt(s); + if (!importTaskList.checkTaskIsRunning(id)) {//如果任务停止,就没有必要刷新了 + script = ""; + } + return script + importTaskList.getTaskHTML(id); + } + + return script; + } + + @SuppressLint("DefaultLocale") + private String doCancelImport(IHTTPSession session) { + Map pars = session.getParms(); + Log.e(TAG, "doCancelImport: " + pars.toString()); + if (pars.get("session") != null) { + String s = Objects.requireNonNull(pars.get("session")); + int id = Integer.parseInt(s); + importTaskList.cancelTask(id); + return String.format("\n" + , id); + } + return ""; + } + + @SuppressLint("DefaultLocale") + private void doImportADI(ImportTaskList.ImportTask task, LogFileImport logFileImport) { + task.setStatus(ImportTaskList.ImportState.IMPORTING); + ArrayList> recordList = logFileImport.getLogRecords();//以正则表达式:[<][Ee][Oo][Rr][>]分行 + task.importedCount = 0; + task.count = recordList.size();//总行数 + for (HashMap record : recordList) { + if (task.status == ImportTaskList.ImportState.CANCELED) break;//检查是不是取消导入 + + QSLRecord qslRecord = new QSLRecord(record); + task.processCount++; + if (mainViewModel.databaseOpr.doInsertQSLData(qslRecord, new AfterInsertQSLData() { + @Override + public void doAfterInsert(boolean isInvalid, boolean isNewQSL) { + if (isInvalid) { + task.invalidCount++; + return; + } + if (isNewQSL) { + task.newCount++; + } else { + task.updateCount++; + } + } + })) { + task.importedCount++; + } + } + + + //此处是显示错误的数据 + StringBuilder temp = new StringBuilder(); + if (logFileImport.getErrorCount() > 0) { + temp.append(""); + temp.append(String.format("\n", logFileImport.getErrorCount())); + for (int key : logFileImport.getErrorLines().keySet()) { + temp.append(String.format("\n" + , key, logFileImport.getErrorLines().get(key))); + } + + temp.append("
%d malformed logs
%d
%s
"); + } + + task.errorMsg = temp.toString(); + if (task.status!= ImportTaskList.ImportState.CANCELED) { + task.setStatus(ImportTaskList.ImportState.FINISHED); + } + mainViewModel.databaseOpr.getQslDxccToMap();//更新一下已经通联的分区 + } + + + /** + * 获取配置信息 + * + * @return config表内容 + */ + private String getConfig() { + Cursor cursor = mainViewModel.databaseOpr.getDb() + .rawQuery("select KeyName,Value from config", null); + return HtmlContext.ListTableContext(cursor, true, 4, false); + } + + /** + * 获取通联过的呼号,包括:呼号、最后时间、频段,波长、网格 + * + * @return config表内容 + */ + private String showQslCallsigns(IHTTPSession session) { + String callsign = ""; + //读取查询的参数 + Map pars = session.getParms(); + if (pars.get("callsign") != null) { + callsign = Objects.requireNonNull(pars.get("callsign")); + } + String where = String.format("%%%s%%", callsign); + + String html = String.format("

%s" + + "

\n" + , GeneralVariables.getStringFromResource(R.string.html_callsign) + , callsign + , GeneralVariables.getStringFromResource(R.string.html_message_query)); + + Cursor cursor = mainViewModel.databaseOpr.getDb() + .rawQuery("select q.[call] as callsign ,q.gridsquare,q.band||\"(\"||q.freq||\")\" as band \n" + + ",q.qso_date||\"-\"||q.time_on as last_time from QSLTable q \n" + + "inner join QSLTable q2 ON q.id =q2.id \n" + + "where q.[call] like ?\n" + + "group by q.[call] ,q.gridsquare,q.freq ,q.qso_date,q.time_on,q.band\n" + + "HAVING q.qso_date||q.time_on =MAX(q2.qso_date||q2.time_on) \n", new String[]{where}); + return html + HtmlContext.ListTableContext(cursor, true, 3, false); + + } + + /** + * 获取全部的表名 + * + * @return html + */ + private String getAllTableName() { + Cursor cursor = mainViewModel.databaseOpr.getDb() + .rawQuery("select * from sqlite_master where type='table'", null); + return HtmlContext.ListTableContext(cursor, true, 4, true); + } + + @SuppressLint({"Range", "DefaultLocale"}) + private String getCallsignQTH(IHTTPSession session) { + String callsign = ""; + String grid = ""; + //读取查询的参数 + Map pars = session.getParms(); + + if (pars.get("callsign") != null) { + callsign = Objects.requireNonNull(pars.get("callsign")); + } + if (pars.get("grid") != null) { + grid = Objects.requireNonNull(pars.get("grid")); + } + String whereCallsign = String.format("%%%s%%", callsign.toUpperCase()); + String whereGrid = String.format("%%%s%%", grid.toUpperCase()); + Cursor cursor = mainViewModel.databaseOpr.getDb() + .rawQuery("select callsign ,grid,updateTime from CallsignQTH where (callsign like ?) and (grid like ?)" + , new String[]{whereCallsign, whereGrid}); + StringBuilder result = new StringBuilder(); + HtmlContext.tableBegin(result, true, 2, false).append("\n"); + + result.append(String.format("
%s
\n" + + "%s\n" + + "


\n" + , GeneralVariables.getStringFromResource(R.string.html_callsign) + , callsign + , GeneralVariables.getStringFromResource(R.string.html_qsl_grid) + , grid + , GeneralVariables.getStringFromResource(R.string.html_message_query))); + //写字段名 + HtmlContext.tableRowBegin(result).append("\n"); + HtmlContext.tableCellHeader(result + , GeneralVariables.getStringFromResource(R.string.html_callsign) + , GeneralVariables.getStringFromResource(R.string.html_qsl_grid) + , GeneralVariables.getStringFromResource(R.string.html_distance) + , GeneralVariables.getStringFromResource(R.string.html_update_time) + ).append("\n"); + + HtmlContext.tableRowEnd(result).append("\n"); + + @SuppressLint("SimpleDateFormat") SimpleDateFormat formatTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + int order = 0; + while (cursor.moveToNext()) { + HtmlContext.tableRowBegin(result, true, order % 2 != 0); + Date date = new Date(cursor.getLong(cursor.getColumnIndex("updateTime"))); + + HtmlContext.tableCell(result + , cursor.getString(cursor.getColumnIndex("callsign")) + , cursor.getString(cursor.getColumnIndex("grid")) + , MaidenheadGrid.getDistStr(GeneralVariables.getMyMaidenhead4Grid() + , cursor.getString(cursor.getColumnIndex("grid"))) + , formatTime.format(date) + ).append("\n"); + HtmlContext.tableRowEnd(result).append("\n"); + order++; + } + HtmlContext.tableEnd(result).append("
\n"); + result.append(String.format("%d", order)); + cursor.close(); + return result.toString(); + } + + + /** + * 获取关注的呼号 + * + * @return HTML + */ + private String getFollowCallsigns() { + Cursor cursor = mainViewModel.databaseOpr.getDb().rawQuery("select * from followCallsigns", null); + StringBuilder result = new StringBuilder(); + HtmlContext.tableBegin(result, true, 3, false).append("\n"); + + //写字段名 + HtmlContext.tableRowBegin(result).append("\n"); + for (int i = 0; i < cursor.getColumnCount(); i++) { + HtmlContext.tableCellHeader(result + , GeneralVariables.getStringFromResource(R.string.html_callsign) + , GeneralVariables.getStringFromResource(R.string.html_operation)).append("\n"); + } + HtmlContext.tableRowEnd(result).append("\n"); + int order = 0; + while (cursor.moveToNext()) { + HtmlContext.tableRowBegin(result, true, order % 2 != 0).append("\n"); + for (int i = 0; i < cursor.getColumnCount(); i++) { + HtmlContext.tableCell(result + , cursor.getString(i) + , String.format("%s" + , cursor.getString(i).replace("/", "_") + , GeneralVariables.getStringFromResource(R.string.html_delete)) + ).append("\n"); + } + HtmlContext.tableRowEnd(result).append("\n"); + order++; + } + HtmlContext.tableEnd(result).append("\n"); + cursor.close(); + return result.toString(); + } + + /** + * 删除关注的呼号 + * + * @param callsign 关注的呼号 + */ + private void deleteFollowCallSign(String callsign) { + mainViewModel.databaseOpr.getDb().execSQL("delete from followCallsigns where callsign=?", new String[]{callsign}); + } + + private void deleteQSLByMonth(String month) { + mainViewModel.databaseOpr.getDb().execSQL("delete from QSLTable where SUBSTR(qso_date,1,6)=? \n" + , new String[]{month}); + } + + + /** + * 查询通联过的呼号 + * + * @return HTML + */ + @SuppressLint("Range") + private String getQSLCallsigns() { + Cursor cursor = mainViewModel.databaseOpr.getDb().rawQuery( + "select * from QslCallsigns order by ID desc", null); + StringBuilder result = new StringBuilder(); + HtmlContext.tableBegin(result, false, 0, true).append("\n"); + + //写字段名 + HtmlContext.tableRowBegin(result).append("\n"); + HtmlContext.tableCellHeader(result + , GeneralVariables.getStringFromResource(R.string.html_qsl_start_time) + , GeneralVariables.getStringFromResource(R.string.html_qsl_end_time) + , GeneralVariables.getStringFromResource(R.string.html_callsign) + , GeneralVariables.getStringFromResource(R.string.html_qsl_mode) + , GeneralVariables.getStringFromResource(R.string.html_qsl_grid) + , GeneralVariables.getStringFromResource(R.string.html_qsl_band) + , GeneralVariables.getStringFromResource(R.string.html_qsl_freq) + , GeneralVariables.getStringFromResource(R.string.html_qsl_manual_confirmation) + , GeneralVariables.getStringFromResource(R.string.html_qsl_lotw_confirmation) + , GeneralVariables.getStringFromResource(R.string.html_qsl_data_source) + , GeneralVariables.getStringFromResource(R.string.html_operation)).append("\n"); + HtmlContext.tableRowEnd(result).append("\n"); + int order = 0; + while (cursor.moveToNext()) { + HtmlContext.tableRowBegin(result, true, order % 2 != 0); + HtmlContext.tableCell(result + , cursor.getString(cursor.getColumnIndex("startTime")) + , cursor.getString(cursor.getColumnIndex("finishTime")) + , cursor.getString(cursor.getColumnIndex("callsign")) + , cursor.getString(cursor.getColumnIndex("mode")) + , cursor.getString(cursor.getColumnIndex("grid")) + , cursor.getString(cursor.getColumnIndex("band")) + , cursor.getString(cursor.getColumnIndex("band_i")) + "Hz" + , (cursor.getInt(cursor.getColumnIndex("isQSL")) == 1) + ? "√" : "×" + , (cursor.getInt(cursor.getColumnIndex("isLotW_QSL")) == 1) + ? "√" : "×" + , (cursor.getInt(cursor.getColumnIndex("isLotW_import")) == 1) + ? GeneralVariables.getStringFromResource(R.string.html_qsl_import_data_from_external) + : GeneralVariables.getStringFromResource(R.string.html_qsl_native_data) + , String.format("%s" + , cursor.getString(cursor.getColumnIndex("ID")) + , GeneralVariables.getStringFromResource(R.string.html_delete))).append("\n"); + HtmlContext.tableRowEnd(result).append("\n"); + order++; + } + HtmlContext.tableEnd(result).append("\n"); + cursor.close(); + return result.toString(); + } + + private void deleteQSLCallSign(String callsign) { + mainViewModel.databaseOpr.getDb().execSQL("delete from QslCallsigns where id=?", new String[]{callsign}); + } + + /** + * 显示呼号与网格的对应关系 + * + * @return html + */ + @SuppressLint("DefaultLocale") + private String showCallGridList() { + StringBuilder result = new StringBuilder(); + result.append(""); + result.append(String.format(GeneralVariables.getStringFromResource(R.string.html_callsign_grid_total) + , GeneralVariables.callsignAndGrids.size())); + HtmlContext.tableBegin(result, true, 1, false); + HtmlContext.tableRowBegin(result); + result.append(String.format("%s", GeneralVariables.getStringFromResource(R.string.html_callsign))); + result.append(String.format("%s", GeneralVariables.getStringFromResource(R.string.html_qsl_grid))); + HtmlContext.tableRowEnd(result).append("\n"); + + result.append(GeneralVariables.getCallsignAndGridToHTML()); + HtmlContext.tableEnd(result).append("
\n"); + + return result.toString(); + } + + /** + * 显示调试信息 + * + * @return html + */ + @SuppressLint("DefaultLocale") + private String showDebug() { + StringBuilder result = new StringBuilder(); + result.append(""); + + HtmlContext.tableBegin(result, true, 5, false).append("\n"); + + HtmlContext.tableRowBegin(result); + HtmlContext.tableCellHeader(result + , GeneralVariables.getStringFromResource(R.string.html_variable) + , GeneralVariables.getStringFromResource(R.string.html_value)).append("\n"); + + HtmlContext.tableKeyRow(result, false, "UTC" + , UtcTimer.getTimeStr(mainViewModel.timerSec.getValue())); + + HtmlContext.tableKeyRow(result, true + , GeneralVariables.getStringFromResource(R.string.html_my_callsign) + , GeneralVariables.myCallsign); + + HtmlContext.tableKeyRow(result, false + , GeneralVariables.getStringFromResource(R.string.html_my_grid) + , GeneralVariables.getMyMaidenheadGrid()); + + HtmlContext.tableKeyRow(result, true//消息最大缓存条数 + , GeneralVariables.getStringFromResource(R.string.html_max_message_cache) + , String.format("%d", GeneralVariables.MESSAGE_COUNT)); + + HtmlContext.tableKeyRow(result, false//音量大小 + , GeneralVariables.getStringFromResource(R.string.signal_strength) + , String.format("%.0f%%\n", GeneralVariables.volumePercent * 100f)); + + + HtmlContext.tableKeyRow(result, true + , GeneralVariables.getStringFromResource(R.string.html_audio_bits) + , GeneralVariables.audioOutput32Bit ? + GeneralVariables.getStringFromResource(R.string.audio32_bit) + : GeneralVariables.getStringFromResource(R.string.audio16_bit)); + + HtmlContext.tableKeyRow(result, false + , GeneralVariables.getStringFromResource(R.string.html_audio_rate) + , String.format("%dHz", GeneralVariables.audioSampleRate)); + + HtmlContext.tableKeyRow(result, true + , GeneralVariables.getStringFromResource(R.string.html_decodes_in_this_cycle) + , String.format("%d", mainViewModel.currentDecodeCount)); + + HtmlContext.tableKeyRow(result, false + , GeneralVariables.getStringFromResource(R.string.decode_mode_text) + , GeneralVariables.deepDecodeMode + ? GeneralVariables.getStringFromResource(R.string.deep_mode) + : GeneralVariables.getStringFromResource(R.string.fast_mode)); + + + HtmlContext.tableKeyRow(result, true + , GeneralVariables.getStringFromResource(R.string.html_total_number_of_decodes) + , String.format("%d", mainViewModel.ft8Messages.size())); + + HtmlContext.tableKeyRow(result, false + , GeneralVariables.getStringFromResource(R.string.html_in_recording_state) + , Boolean.TRUE.equals(mainViewModel.mutableIsRecording.getValue()) + ? GeneralVariables.getStringFromResource(R.string.html_recording) + : GeneralVariables.getStringFromResource(R.string.html_no_recording)); + + HtmlContext.tableKeyRow(result, true + , GeneralVariables.getStringFromResource(R.string.html_time_consuming_for_this_decoding) + , String.format(GeneralVariables.getStringFromResource(R.string.html_milliseconds) + , mainViewModel.ft8SignalListener.decodeTimeSec.getValue())); + + HtmlContext.tableKeyRow(result, false + , GeneralVariables.getStringFromResource(R.string.html_average_delay_time_of_this_cycle) + , String.format(GeneralVariables.getStringFromResource(R.string.html_seconds) + , mainViewModel.mutableTimerOffset.getValue())); + + HtmlContext.tableKeyRow(result, true + , GeneralVariables.getStringFromResource(R.string.html_sound_frequency) + , String.format("%.0fHz", GeneralVariables.getBaseFrequency())); + + HtmlContext.tableKeyRow(result, false + , GeneralVariables.getStringFromResource(R.string.html_transmission_delay_time) + , String.format(GeneralVariables.getStringFromResource(R.string.html_milliseconds) + , GeneralVariables.transmitDelay)); + + HtmlContext.tableKeyRow(result, true + , GeneralVariables.getStringFromResource(R.string.html_launch_supervision) + , String.format(GeneralVariables.getStringFromResource(R.string.html_milliseconds) + , GeneralVariables.launchSupervision)); + + HtmlContext.tableKeyRow(result, false + , GeneralVariables.getStringFromResource(R.string.html_automatic_program_run_time) + , String.format(GeneralVariables.getStringFromResource(R.string.html_milliseconds) + , GeneralVariables.launchSupervisionCount())); + + HtmlContext.tableKeyRow(result, true + , GeneralVariables.getStringFromResource(R.string.html_no_reply_limit) + , GeneralVariables.noReplyLimit); + + HtmlContext.tableKeyRow(result, false + , GeneralVariables.getStringFromResource(R.string.html_no_reply_count) + , GeneralVariables.noReplyCount); + + HtmlContext.tableKeyRow(result, true + , GeneralVariables.getStringFromResource(R.string.follow_cq) + , String.valueOf(GeneralVariables.autoFollowCQ)); + + HtmlContext.tableKeyRow(result, false + , GeneralVariables.getStringFromResource(R.string.auto_call_follow) + , String.valueOf(GeneralVariables.autoCallFollow)); + + HtmlContext.tableKeyRow(result, true + , GeneralVariables.getStringFromResource(R.string.html_target_callsign) + , (mainViewModel.ft8TransmitSignal.mutableToCallsign.getValue() != null) + ? mainViewModel.ft8TransmitSignal.mutableToCallsign.getValue().callsign : ""); + + HtmlContext.tableKeyRow(result, false + , GeneralVariables.getStringFromResource(R.string.html_sequential) + , mainViewModel.ft8TransmitSignal.sequential); + + HtmlContext.tableKeyRow(result, true + , GeneralVariables.getStringFromResource(R.string.synFrequency) + , String.valueOf(GeneralVariables.synFrequency)); + + HtmlContext.tableKeyRow(result, false + , GeneralVariables.getStringFromResource(R.string.tran_delay) + , GeneralVariables.transmitDelay); + + HtmlContext.tableKeyRow(result, true + , GeneralVariables.getStringFromResource(R.string.ptt_delay) + , GeneralVariables.pttDelay); + + HtmlContext.tableKeyRow(result, false + , GeneralVariables.getStringFromResource(R.string.rig_name) + , RigNameList.getInstance( + GeneralVariables.getMainContext()).getRigNameByIndex(GeneralVariables.modelNo).modelName); + + HtmlContext.tableKeyRow(result, true + , GeneralVariables.getStringFromResource(R.string.html_mark_message) + , String.format("%s", mainViewModel.markMessage + ? GeneralVariables.getStringFromResource(R.string.html_marking_message) + : GeneralVariables.getStringFromResource(R.string.html_do_not_mark_message))); + + HtmlContext.tableKeyRow(result, false + , GeneralVariables.getStringFromResource(R.string.html_operation_mode) + , ControlMode.getControlModeStr(GeneralVariables.controlMode)); + + HtmlContext.tableKeyRow(result, true + , GeneralVariables.getStringFromResource(R.string.html_civ_address) + , String.format("0x%2X", GeneralVariables.civAddress)); + + HtmlContext.tableKeyRow(result, false + , GeneralVariables.getStringFromResource(R.string.html_baud_rate) + , GeneralVariables.baudRate); + + result.append(""); + result.append(""); + result.append(GeneralVariables.getStringFromResource(R.string.html_available_serial_ports)); + result.append("\n"); + result.append(""); + if (mainViewModel.mutableSerialPorts != null) { + if (mainViewModel.mutableSerialPorts.getValue().size() == 0) { + result.append("-"); + } + } + for (CableSerialPort.SerialPort serialPort : Objects.requireNonNull(mainViewModel.mutableSerialPorts.getValue())) { + result.append(serialPort.information()).append("
\n"); + } + result.append(""); + result.append("\n"); + + + HtmlContext.tableKeyRow(result, true + , GeneralVariables.getStringFromResource(R.string.html_instruction_set) + , (mainViewModel.baseRig != null) ? mainViewModel.baseRig.getName() : "-"); + + HtmlContext.tableKeyRow(result, false + , GeneralVariables.getStringFromResource(R.string.html_connect_mode) + , (GeneralVariables.controlMode == ControlMode.VOX) ? "-" + : ConnectMode.getModeStr(GeneralVariables.connectMode)); + + HtmlContext.tableKeyRow(result, true + , GeneralVariables.getStringFromResource(R.string.html_baud_rate) + , GeneralVariables.baudRate); + + HtmlContext.tableKeyRow(result, false + , GeneralVariables.getStringFromResource(R.string.html_carrier_frequency_band) + , GeneralVariables.getBandString()); + + HtmlContext.tableKeyRow(result, true + , GeneralVariables.getStringFromResource(R.string.html_radio_frequency) + , (mainViewModel.baseRig != null) + ? BaseRigOperation.getFrequencyStr(mainViewModel.baseRig.getFreq()) : "-"); + + HtmlContext.tableKeyRow(result, false + , GeneralVariables.getStringFromResource(R.string.html_flex_max_rf_power) + , String.format("%d W", GeneralVariables.flexMaxRfPower)); + + HtmlContext.tableKeyRow(result, true + , GeneralVariables.getStringFromResource(R.string.html_atu_tune_power) + , String.format("%d W", GeneralVariables.flexMaxTunePower)); + + HtmlContext.tableKeyRow(result, false + , GeneralVariables.getStringFromResource(R.string.be_excluded_callsigns) + , GeneralVariables.getExcludeCallsigns()); + + HtmlContext.tableKeyRow(result, true + , GeneralVariables.getStringFromResource(R.string.config_save_swl) + , String.valueOf(GeneralVariables.saveSWLMessage)); + + HtmlContext.tableKeyRow(result, false + , GeneralVariables.getStringFromResource(R.string.config_save_swl_qso) + , String.valueOf(GeneralVariables.saveSWL_QSO)); + + HtmlContext.tableEnd(result).append("
\n"); + + HtmlContext.tableBegin(result, false, 0, true).append("\n"); + result.append(String.format("%s\n" + , String.format(GeneralVariables.getStringFromResource(R.string.html_successful_callsign) + , GeneralVariables.getBandString()))); + + result.append(""); + for (int i = 0; i < GeneralVariables.QSL_Callsign_list.size(); i++) { + result.append(GeneralVariables.QSL_Callsign_list.get(i)); + result.append(", "); + if (((i + 1) % 10) == 0) { + result.append("\n"); + } + } + result.append("\n"); + HtmlContext.tableEnd(result).append("
\n"); + + HtmlContext.tableBegin(result, false, 0, true).append("\n"); + result.append(String.format("%s\n" + , GeneralVariables.getStringFromResource(R.string.html_tracking_callsign))); + + result.append(""); + for (int i = 0; i < GeneralVariables.followCallsign.size(); i++) { + result.append(GeneralVariables.followCallsign.get(i)); + result.append(", "); + if (((i + 1) % 10) == 0) { + result.append("\n"); + } + } + result.append("\n"); + HtmlContext.tableEnd(result).append("\n"); + + HtmlContext.tableBegin(result, false, 0, true).append("\n"); + result.append(String.format("%s\n" + , GeneralVariables.getStringFromResource(R.string.html_tracking_qso_information))); + + result.append(""); + result.append(GeneralVariables.qslRecordList.toHTML()); + result.append("\n"); + HtmlContext.tableEnd(result).append("\n"); + + return result.toString(); + } + + /** + * 显示呼号的HASH + * + * @return html + */ + private String showCallsignHash() { + StringBuilder result = new StringBuilder(); + result.append(""); + HtmlContext.tableBegin(result, true, 3, false).append("\n"); + HtmlContext.tableRowBegin(result); + //表头 + HtmlContext.tableCellHeader(result, GeneralVariables.getStringFromResource(R.string.html_callsign) + , GeneralVariables.getStringFromResource(R.string.html_hash_value)); + + HtmlContext.tableRowEnd(result).append("\n"); + + + int order = 0; + for (Map.Entry entry : Ft8Message.hashList.entrySet()) { + HtmlContext.tableRowBegin(result, false, (order / 3) % 2 != 0); + + HtmlContext.tableCell(result, entry.getValue()); + HtmlContext.tableCell(result, String.format(" 0x%x ", entry.getKey())); + HtmlContext.tableRowEnd(result).append("\n"); + + order++; + } + HtmlContext.tableEnd(result).append("\n"); + + return result.toString(); + } + + @SuppressLint("Range") + private Response exportSWLMessage(String exportFile, String callsign, String start_date, String end_date) { + Response response; + StringBuilder fileName = new StringBuilder(); + fileName.append("message"); + if (callsign.length() > 0) { + fileName.append("_"); + fileName.append(callsign.replace("/", "_") + .replace("\\", "_") + .replace(":", "_") + .replace("?", "_") + .replace("*", "_") + .replace("|", "_") + .replace("\"", "_") + .replace("'", "_") + .replace("<", "_") + .replace(".", "_") + .replace(">", "_")); + } + if (start_date.length() > 0) { + fileName.append(String.format("_%s", start_date)); + } + if (end_date.length() > 0) { + fileName.append(String.format("_%s", end_date)); + } + fileName.append(".").append(exportFile); + + + Cursor cursor; + StringBuilder dateSql = new StringBuilder(); + if (!start_date.equals("")) { + dateSql.append(String.format(" AND (SUBSTR(UTC,1,8)>=\"%s\") " + , start_date.replace("-", ""))); + } + if (!end_date.equals("")) { + dateSql.append(String.format(" AND (SUBSTR(UTC,1,8)<=\"%s\") " + , end_date.replace("-", ""))); + } + String whereStr = String.format("%%%s%%", callsign); + cursor = mainViewModel.databaseOpr.getDb().rawQuery( + "select * from SWLMessages where ((CALL_TO LIKE ?)OR(CALL_FROM LIKE ?)) " + + dateSql + + " order by ID " + , new String[]{whereStr, whereStr}); + + StringBuilder result = new StringBuilder(); + + String formatStr; + if (exportFile.equalsIgnoreCase("CSV")) { + formatStr = "%s,%.3f,Rx,%s,%d,%.1f,%d,%s\n"; + } else { + formatStr = "%s %12.3f Rx %s %6d %4.1f %4d %s\n"; + } + + while (cursor.moveToNext()) { + String utcTime = cursor.getString(cursor.getColumnIndex("UTC")); + int dB = cursor.getInt(cursor.getColumnIndex("SNR")); + float dt = cursor.getFloat(cursor.getColumnIndex("TIME_SEC")); + int freq = cursor.getInt(cursor.getColumnIndex("FREQ")); + String callTo = cursor.getString(cursor.getColumnIndex("CALL_TO")); + String protocol = cursor.getString(cursor.getColumnIndex("Protocol")); + String callFrom = cursor.getString(cursor.getColumnIndex("CALL_FROM")); + String extra = cursor.getString(cursor.getColumnIndex("EXTRAL")); + long band = cursor.getLong(cursor.getColumnIndex("BAND")); + + result.append(String.format(formatStr + , utcTime, (band / 1000f / 1000f), protocol, dB, dt, freq, String.format("%s %s %s", callTo, callFrom, extra))); + } + cursor.close(); + + + response = newFixedLengthResponse(NanoHTTPD.Response.Status.OK, "text/plain", result.toString()); + response.addHeader("Content-Disposition" + , String.format("attachment;filename=%s", fileName)); + + return response; + } + + /** + * 查SWL消息表 + * + * @return html + */ + @SuppressLint({"DefaultLocale", "Range"}) + private Response getMessages(IHTTPSession session) { + int pageSize = 100; + String callsign = ""; + + + StringBuilder result = new StringBuilder(); + String startDate = ""; + String endDate = ""; + String exportFile = ""; + + //读取查询的参数 + Map pars = session.getParms(); + int pageIndex = 1; + if (pars.get("page") != null) { + pageIndex = Integer.parseInt(Objects.requireNonNull(pars.get("page"))); + } + if (pars.get("pageSize") != null) { + pageSize = Integer.parseInt(Objects.requireNonNull(pars.get("pageSize"))); + } + if (pars.get("callsign") != null) { + callsign = Objects.requireNonNull(pars.get("callsign")); + } + if (pars.get("start_date") != null) { + startDate = Objects.requireNonNull(pars.get("start_date")); + } + if (pars.get("end_date") != null) { + endDate = Objects.requireNonNull(pars.get("end_date")); + } + String whereStr = String.format("%%%s%%", callsign); + + if (pars.get("exportFile") != null) { + exportFile = Objects.requireNonNull(pars.get("exportFile")); + } + + //导出到文件中 + if (exportFile.equalsIgnoreCase("CSV") + || exportFile.equalsIgnoreCase("TXT")) { + return exportSWLMessage(exportFile, callsign, startDate, endDate); + } + + HtmlContext.tableBegin(result, false, 0, true).append("\n"); + HtmlContext.tableRowBegin(result).append(""); + + + result.append(String.format("%s" + + " , %s
" + , callsign, startDate, endDate, GeneralVariables.getStringFromResource(R.string.html_export_csv) + , callsign, startDate, endDate, GeneralVariables.getStringFromResource(R.string.html_export_text))); + + Cursor cursor; + StringBuilder dateSql = new StringBuilder(); + if (!startDate.equals("")) { + dateSql.append(String.format(" AND (SUBSTR(UTC,1,8)>=\"%s\") " + , startDate.replace("-", ""))); + } + if (!endDate.equals("")) { + dateSql.append(String.format(" AND (SUBSTR(UTC,1,8)<=\"%s\") " + , endDate.replace("-", ""))); + } + //计算总的记录数 + cursor = mainViewModel.databaseOpr.getDb().rawQuery( + "select count(*) as rc from SWLMessages " + + "where ((CALL_TO LIKE ?)OR(CALL_FROM LIKE ?))" + dateSql + , new String[]{whereStr, whereStr}); + cursor.moveToFirst(); + int pageCount = Math.round(((float) cursor.getInt(cursor.getColumnIndex("rc")) / pageSize) + 0.5f); + if (pageIndex > pageCount) pageIndex = pageCount; + cursor.close(); + + //查询、每页消息数设定 + result.append(String.format("
%s , %s" + + "" +//页码及页大小 + "
\n%s " +//呼号 + "  
\n" + + "
\n%s " +//起始时间 + " \n%s 
" //结束时间 + + , String.format(GeneralVariables.getStringFromResource(R.string.html_message_page_count), pageCount) + , GeneralVariables.getStringFromResource(R.string.html_message_page_size) + , pageSize + , GeneralVariables.getStringFromResource(R.string.html_callsign) + , callsign + , GeneralVariables.getStringFromResource(R.string.html_message_query) + , GeneralVariables.getStringFromResource(R.string.html_start_date_swl_message) + , startDate + , GeneralVariables.getStringFromResource(R.string.html_end_date_swl_message) + , endDate)); + + + //定位页,第一页、上一页、下一页,最后一页 + result.append(String.format("|<" + + "  <<" + + "" + + ">>" + + "  >|
\n" + , 1, pageSize, callsign, startDate, endDate + , pageIndex - 1 == 0 ? 1 : pageIndex - 1, pageSize, callsign, startDate, endDate + , pageIndex + , pageIndex == pageCount ? pageCount : pageIndex + 1, pageSize, callsign, startDate, endDate + , pageCount, pageSize, callsign, startDate, endDate)); + result.append(""); + HtmlContext.tableRowEnd(result); + HtmlContext.tableEnd(result).append("\n"); + + + cursor = mainViewModel.databaseOpr.getDb().rawQuery( + String.format( + "select * from SWLMessages where ((CALL_TO LIKE ?)OR(CALL_FROM LIKE ?)) " + + dateSql + + " order by ID LIMIT(%d),%d " + , (pageIndex - 1) * pageSize, pageSize), new String[]{whereStr, whereStr}); + + //result.append("\n"); + HtmlContext.tableBegin(result, false, true).append("\n"); + HtmlContext.tableRowBegin(result).append("\n"); + HtmlContext.tableCellHeader(result, "No."); + HtmlContext.tableCellHeader(result, GeneralVariables.getStringFromResource(R.string.html_protocol)); + HtmlContext.tableCellHeader(result, "i3.n3", "UTC", "dB", "Δt"); + HtmlContext.tableCellHeader(result, GeneralVariables.getStringFromResource(R.string.html_qsl_freq)); + HtmlContext.tableCellHeader(result, GeneralVariables.getStringFromResource(R.string.message)); + HtmlContext.tableCellHeader(result, GeneralVariables.getStringFromResource(R.string.html_carrier_frequency_band)).append("\n"); + HtmlContext.tableRowEnd(result).append("\n"); + + + int order = 0; + while (cursor.moveToNext()) { + HtmlContext.tableRowBegin(result, true, order % 2 != 0); + + int i3 = cursor.getInt(cursor.getColumnIndex("I3")); + int n3 = cursor.getInt(cursor.getColumnIndex("N3")); + String utcTime = cursor.getString(cursor.getColumnIndex("UTC")); + int dB = cursor.getInt(cursor.getColumnIndex("SNR")); + float dt = cursor.getFloat(cursor.getColumnIndex("TIME_SEC")); + int freq = cursor.getInt(cursor.getColumnIndex("FREQ")); + String protocol = cursor.getString(cursor.getColumnIndex("Protocol")); + String callTo = cursor.getString(cursor.getColumnIndex("CALL_TO")); + String callFrom = cursor.getString(cursor.getColumnIndex("CALL_FROM")); + String extra = cursor.getString(cursor.getColumnIndex("EXTRAL")); + long band = cursor.getLong(cursor.getColumnIndex("BAND")); + + HtmlContext.tableCell(result, String.format("%d", order + 1 + pageSize * (pageIndex - 1))); + HtmlContext.tableCell(result, protocol, Ft8Message.getCommandInfoByI3N3(i3, n3)); + HtmlContext.tableCell(result, utcTime); + HtmlContext.tableCell(result, String.format("%d", dB)); + HtmlContext.tableCell(result, String.format("%.1f", dt)); + HtmlContext.tableCell(result, String.format("%dHz", freq)); + HtmlContext.tableCell(result, String.format("" + + "%s  " + + "%s  %s", pageSize, callTo.replace("<", "") + .replace(">", "") + , callTo.replace("<", "<") + .replace(">", ">") + , pageSize, callFrom.replace("<", "") + .replace(">", "") + , callFrom.replace("<", "<") + .replace(">", ">"), extra)); + HtmlContext.tableCell(result, BaseRigOperation.getFrequencyStr(band)).append("\n"); + HtmlContext.tableRowEnd(result).append("\n"); + + order++; + } + cursor.close(); + HtmlContext.tableEnd(result).append("
\n"); + //result.append("

"); + + + return newFixedLengthResponse(HtmlContext.HTML_STRING(result.toString())); + //return result.toString(); + + } + + + /** + * 把swo的QSO日志导出到文件 + * + * @param exportFile 文件名 + * @param callsign 呼号 + * @param start_date 起始日期 + * @param end_date 结束日期 + * @return 数据 + */ + @SuppressLint("Range") + private Response exportSWLQSOMessage(String exportFile, String callsign, String start_date, String end_date) { + Response response; + StringBuilder fileName = new StringBuilder(); + fileName.append("swl_qso"); + if (callsign.length() > 0) { + fileName.append("_"); + fileName.append(callsign.replace("/", "_") + .replace("\\", "_") + .replace(":", "_") + .replace("?", "_") + .replace("*", "_") + .replace("|", "_") + .replace("\"", "_") + .replace("'", "_") + .replace("<", "_") + .replace(".", "_") + .replace(">", "_")); + } + if (start_date.length() > 0) { + fileName.append(String.format("_%s", start_date)); + } + if (end_date.length() > 0) { + fileName.append(String.format("_%s", end_date)); + } + fileName.append(".").append(exportFile); + + + Cursor cursor; + StringBuilder dateSql = new StringBuilder(); + if (!start_date.equals("")) { + dateSql.append(String.format(" AND (SUBSTR(qso_date_off,1,8)>=\"%s\") " + , start_date.replace("-", ""))); + } + if (!end_date.equals("")) { + dateSql.append(String.format(" AND (SUBSTR(qso_date_off,1,8)<=\"%s\") " + , end_date.replace("-", ""))); + } + String whereStr = String.format("%%%s%%", callsign); + + cursor = mainViewModel.databaseOpr.getDb().rawQuery( + String.format( + "select * from SWLQSOTable where (([call] LIKE ?)OR(station_callsign LIKE ?)) " + + dateSql + + " order by qso_date desc,time_on desc "), new String[]{whereStr, whereStr}); + + + response = newFixedLengthResponse(NanoHTTPD.Response.Status.OK, "text/plain" + , mainViewModel.databaseOpr.downQSLTable(cursor, true)); + response.addHeader("Content-Disposition" + , String.format("attachment;filename=%s", fileName)); + + return response; + } + + + /** + * 查询SWL日志 + * + * @param session 会话 + * @return html + */ + @SuppressLint({"DefaultLocale", "Range"}) + private Response getSWLQsoMessages(IHTTPSession session) { + int pageSize = 100; + String callsign = ""; + + + StringBuilder result = new StringBuilder(); + String startDate = ""; + String endDate = ""; + String exportFile = ""; + + //读取查询的参数 + Map pars = session.getParms(); + int pageIndex = 1; + if (pars.get("page") != null) { + pageIndex = Integer.parseInt(Objects.requireNonNull(pars.get("page"))); + } + if (pars.get("pageSize") != null) { + pageSize = Integer.parseInt(Objects.requireNonNull(pars.get("pageSize"))); + } + if (pars.get("callsign") != null) { + callsign = Objects.requireNonNull(pars.get("callsign")); + } + if (pars.get("start_date") != null) { + startDate = Objects.requireNonNull(pars.get("start_date")); + } + if (pars.get("end_date") != null) { + endDate = Objects.requireNonNull(pars.get("end_date")); + } + String whereStr = String.format("%%%s%%", callsign); + + if (pars.get("exportFile") != null) { + exportFile = Objects.requireNonNull(pars.get("exportFile")); + } + + //导出到文件中 + if (exportFile.equalsIgnoreCase("ADI")) { + return exportSWLQSOMessage(exportFile, callsign, startDate, endDate); + } + + HtmlContext.tableBegin(result, false, 0, true).append("\n"); + HtmlContext.tableRowBegin(result).append("\n"); + result.append(""); + + result.append(String.format("%s" + , callsign, startDate, endDate, GeneralVariables.getStringFromResource(R.string.html_export_adi))); + + Cursor cursor; + StringBuilder dateSql = new StringBuilder(); + if (!startDate.equals("")) { + dateSql.append(String.format(" AND (SUBSTR(qso_date_off,1,8)>=\"%s\") " + , startDate.replace("-", ""))); + } + if (!endDate.equals("")) { + dateSql.append(String.format(" AND (SUBSTR(qso_date_off,1,8)<=\"%s\") " + , endDate.replace("-", ""))); + } + //计算总的记录数 + cursor = mainViewModel.databaseOpr.getDb().rawQuery( + "select count(*) as rc from SWLQSOTable " + + "where (([call] LIKE ?)OR(station_callsign LIKE ?))" + dateSql + , new String[]{whereStr, whereStr}); + cursor.moveToFirst(); + int pageCount = Math.round(((float) cursor.getInt(cursor.getColumnIndex("rc")) / pageSize) + 0.5f); + if (pageIndex > pageCount) pageIndex = pageCount; + cursor.close(); + + //查询、每页消息数设定 + result.append(String.format("
%s , %s" + + "" +//页码及页大小 + "
\n%s " +//呼号 + "  
\n" + + "
\n%s " +//起始时间 + " \n%s 
" //结束时间 + + , String.format(GeneralVariables.getStringFromResource(R.string.html_message_page_count), pageCount) + , GeneralVariables.getStringFromResource(R.string.html_message_page_size) + , pageSize + , GeneralVariables.getStringFromResource(R.string.html_callsign) + , callsign + , GeneralVariables.getStringFromResource(R.string.html_message_query) + , GeneralVariables.getStringFromResource(R.string.html_start_date_swl_message) + , startDate + , GeneralVariables.getStringFromResource(R.string.html_end_date_swl_message) + , endDate)); + + + //定位页,第一页、上一页、下一页,最后一页 + result.append(String.format("|<" + + "  <<" + + "" + + ">>" + + "  >|
\n" + + , 1, pageSize, callsign, startDate, endDate + , pageIndex - 1 == 0 ? 1 : pageIndex - 1, pageSize, callsign, startDate, endDate + , pageIndex + , pageIndex == pageCount ? pageCount : pageIndex + 1, pageSize, callsign, startDate, endDate + , pageCount, pageSize, callsign, startDate, endDate)); + + result.append(""); + HtmlContext.tableRowEnd(result); + HtmlContext.tableEnd(result).append("\n"); + + cursor = mainViewModel.databaseOpr.getDb().rawQuery( + String.format( + "select * from SWLQSOTable where (([call] LIKE ?)OR(station_callsign LIKE ?)) " + + dateSql + + " order by qso_date desc,time_on desc LIMIT(%d),%d " + , (pageIndex - 1) * pageSize, pageSize), new String[]{whereStr, whereStr}); + + HtmlContext.tableBegin(result, false, true).append("\n"); + + HtmlContext.tableRowBegin(result); + HtmlContext.tableCellHeader(result, "No." + , GeneralVariables.getStringFromResource(R.string.html_callsign)//"call" + , GeneralVariables.getStringFromResource(R.string.html_qsl_grid)//"gridsquare" + , GeneralVariables.getStringFromResource(R.string.html_qsl_mode)//"mode" + , GeneralVariables.getStringFromResource(R.string.html_rst_sent)//"rst_sent" + , GeneralVariables.getStringFromResource(R.string.html_rst_rcvd)//"rst_rcvd" + , GeneralVariables.getStringFromResource(R.string.html_qsl_start_day)//"qso date" + , GeneralVariables.getStringFromResource(R.string.html_qsl_start_time)//"time_on" + , GeneralVariables.getStringFromResource(R.string.html_qsl_end_date)//qso date off + , GeneralVariables.getStringFromResource(R.string.html_qsl_end_time)//"time_off" + , GeneralVariables.getStringFromResource(R.string.html_qsl_band)//"band" + , GeneralVariables.getStringFromResource(R.string.html_qsl_freq)//"freq" + , GeneralVariables.getStringFromResource(R.string.html_callsign)//"station_callsign" + , GeneralVariables.getStringFromResource(R.string.html_qsl_grid)//"my_gridsquare" + , "Operator"//"my_gridsquare" + , GeneralVariables.getStringFromResource(R.string.html_comment))//"comment") + .append("\n"); + HtmlContext.tableRowEnd(result).append("\n"); + int order = 0; + while (cursor.moveToNext()) { + HtmlContext.tableRowBegin(result, true, order % 2 != 0).append("\n"); + + String call = cursor.getString(cursor.getColumnIndex("call")); + String gridsquare = cursor.getString(cursor.getColumnIndex("gridsquare")); + String mode = cursor.getString(cursor.getColumnIndex("mode")); + String rst_sent = cursor.getString(cursor.getColumnIndex("rst_sent")); + String rst_rcvd = cursor.getString(cursor.getColumnIndex("rst_rcvd")); + String qso_date = cursor.getString(cursor.getColumnIndex("qso_date")); + String time_on = cursor.getString(cursor.getColumnIndex("time_on")); + String qso_date_off = cursor.getString(cursor.getColumnIndex("qso_date_off")); + String time_off = cursor.getString(cursor.getColumnIndex("time_off")); + String band = cursor.getString(cursor.getColumnIndex("band")); + String freq = cursor.getString(cursor.getColumnIndex("freq")); + String station_callsign = cursor.getString(cursor.getColumnIndex("station_callsign")); + String my_gridsquare = cursor.getString(cursor.getColumnIndex("my_gridsquare")); + String operator = cursor.getString(cursor.getColumnIndex("operator")); + String comment = cursor.getString(cursor.getColumnIndex("comment")); + + + //生成数据表的一行 + HtmlContext.tableCell(result, String.format("%d", order + 1 + pageSize * (pageIndex - 1))); + HtmlContext.tableCell(result, String.format("%s" + , pageSize, call.replace("<", "") + .replace(">", "") + , call.replace("<", "<") + .replace(">", ">"))); + HtmlContext.tableCell(result, gridsquare == null ? "" : gridsquare); + HtmlContext.tableCell(result, mode, rst_sent, rst_rcvd, qso_date, time_on, qso_date_off, time_off); + HtmlContext.tableCell(result, band, freq); + HtmlContext.tableCell(result, String.format("%s" + , pageSize + , station_callsign.replace("<", "") + .replace(">", "") + , station_callsign.replace("<", "<") + .replace(">", ">"))); + + HtmlContext.tableCell(result, my_gridsquare == null ? "" : my_gridsquare); + HtmlContext.tableCell(result, operator == null ? "" : operator, comment).append("\n"); + HtmlContext.tableRowEnd(result).append("\n"); + order++; + } + cursor.close(); + HtmlContext.tableEnd(result).append("
\n"); + + return newFixedLengthResponse(HtmlContext.HTML_STRING(result.toString())); + } + + + /** + * 把QSO日志导出到文件 + * + * @param exportFile 文件名 + * @param callsign 呼号 + * @param start_date 起始日期 + * @param end_date 结束日期 + * @return 数据 + */ + @SuppressLint("Range") + private Response exportQSOLogs(String exportFile, String callsign, String start_date, String end_date, String extWhere) { + Response response; + StringBuilder fileName = new StringBuilder(); + fileName.append("qso_log"); + if (callsign.length() > 0) { + fileName.append("_"); + fileName.append(callsign.replace("/", "_") + .replace("\\", "_") + .replace(":", "_") + .replace("?", "_") + .replace("*", "_") + .replace("|", "_") + .replace("\"", "_") + .replace("'", "_") + .replace("<", "_") + .replace(".", "_") + .replace(">", "_")); + } + if (start_date.length() > 0) { + fileName.append(String.format("_%s", start_date)); + } + if (end_date.length() > 0) { + fileName.append(String.format("_%s", end_date)); + } + fileName.append(".").append(exportFile); + + + Cursor cursor; + String whereStr = String.format("%%%s%%", callsign); + + cursor = mainViewModel.databaseOpr.getDb().rawQuery( + String.format( + "select * from QSLTable where (([call] LIKE ?)OR(station_callsign LIKE ?)) " + + extWhere + + " order by qso_date desc,time_on desc "), new String[]{whereStr, whereStr}); + + + response = newFixedLengthResponse(NanoHTTPD.Response.Status.OK, "text/plain" + , mainViewModel.databaseOpr.downQSLTable(cursor, false)); + response.addHeader("Content-Disposition" + , String.format("attachment;filename=%s", fileName)); + + return response; + } + + /** + * 查询QSO日志 + * + * @param session 会话 + * @return html + */ + @SuppressLint({"DefaultLocale", "Range"}) + private Response getQsoLogs(IHTTPSession session) { + int pageSize = 100; + String callsign = ""; + + + StringBuilder result = new StringBuilder(); + String startDate = ""; + String endDate = ""; + String exportFile = ""; + String qIsQSL = ""; + String qIsImported = ""; + + //读取查询的参数 + Map pars = session.getParms(); + int pageIndex = 1; + if (pars.get("page") != null) { + pageIndex = Integer.parseInt(Objects.requireNonNull(pars.get("page"))); + } + if (pars.get("pageSize") != null) { + pageSize = Integer.parseInt(Objects.requireNonNull(pars.get("pageSize"))); + } + if (pars.get("callsign") != null) { + callsign = Objects.requireNonNull(pars.get("callsign")); + } + if (pars.get("start_date") != null) { + startDate = Objects.requireNonNull(pars.get("start_date")); + } + if (pars.get("end_date") != null) { + endDate = Objects.requireNonNull(pars.get("end_date")); + } + String whereStr = String.format("%%%s%%", callsign); + + if (pars.get("exportFile") != null) { + exportFile = Objects.requireNonNull(pars.get("exportFile")); + } + if (pars.get("QSL") != null) { + qIsQSL = Objects.requireNonNull(pars.get("QSL")); + } + if (pars.get("Imported") != null) { + qIsImported = Objects.requireNonNull(pars.get("Imported")); + } + + result.append("
\n"); + HtmlContext.tableBegin(result, false, 0, true).append("\n"); + HtmlContext.tableRowBegin(result).append(""); + result.append(String.format("%s\n" + , callsign, startDate, endDate, qIsQSL, qIsImported + , GeneralVariables.getStringFromResource(R.string.html_export_adi))); + + Cursor cursor; + StringBuilder dateSql = new StringBuilder(); + if (!startDate.equals("")) { + dateSql.append(String.format(" AND (SUBSTR(qso_date_off,1,8)>=\"%s\") " + , startDate.replace("-", ""))); + } + if (!endDate.equals("")) { + dateSql.append(String.format(" AND (SUBSTR(qso_date_off,1,8)<=\"%s\") " + , endDate.replace("-", ""))); + } + if (!qIsQSL.equals("")) { + dateSql.append(String.format(" AND ((isQSl = %s) %s (isLotW_QSL = %s))" + , qIsQSL, qIsQSL.equals("1") ? "OR" : "AND", qIsQSL)); + } + if (!qIsImported.equals("")) { + dateSql.append(String.format(" AND (isLotW_import = %s)", qIsImported)); + } + + + //导出到文件中 + if (exportFile.equalsIgnoreCase("ADI")) { + return exportQSOLogs(exportFile, callsign, startDate, endDate, dateSql.toString()); + } + + //计算总的记录数 + cursor = mainViewModel.databaseOpr.getDb().rawQuery( + "select count(*) as rc from QSLTable " + + "where (([call] LIKE ?)OR(station_callsign LIKE ?))" + dateSql + , new String[]{whereStr, whereStr}); + cursor.moveToFirst(); + int pageCount = Math.round(((float) cursor.getInt(cursor.getColumnIndex("rc")) / pageSize) + 0.5f); + if (pageIndex > pageCount) pageIndex = pageCount; + cursor.close(); + + //查询、每页消息数设定 + result.append(""); + HtmlContext.tableRowEnd(result); + HtmlContext.tableRowBegin(result).append("\n"); + + result.append(String.format("%s , %s" + + "" +//页码及页大小 + "  
\n" + + "
\n%s " +//呼号 + "\n%s " +//起始时间 + "\n%s \n" +//结束时间 + " \n" + + " \n" + + "
\n" + + + "
\n" + + " QSL" + + "
\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "
" + + "
\n" + + "
\n" + + "
\n" + + " " + GeneralVariables.getStringFromResource(R.string.html_qso_source) + "" + + "
\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
" + + "
" + + "
" + + "\n" + + " "); + HtmlContext.tableRowEnd(result); + HtmlContext.tableEnd(result); + result.append(""); + //"
" + + + , String.format(GeneralVariables.getStringFromResource(R.string.html_message_page_count), pageCount) + , GeneralVariables.getStringFromResource(R.string.html_message_page_size) + , pageSize + , GeneralVariables.getStringFromResource(R.string.html_message_query) + + , GeneralVariables.getStringFromResource(R.string.html_callsign) + , callsign + , GeneralVariables.getStringFromResource(R.string.html_start_date_swl_message) + , startDate + , GeneralVariables.getStringFromResource(R.string.html_end_date_swl_message) + , endDate + + , qIsQSL.equals("") ? "checked=\"true\"" : "" + , qIsQSL.equals("0") ? "checked=\"true\"" : "" + , qIsQSL.equals("1") ? "checked=\"true\"" : "" + + + , qIsImported.equals("") ? "checked=\"true\"" : "" + , qIsImported.equals("0") ? "checked=\"true\"" : "" + , qIsImported.equals("1") ? "checked=\"true\"" : "" + )); + + + //定位页,第一页、上一页、下一页,最后一页 + result.append(String.format("|<" + + "  <<" + + "" + + ">>\n" + + "  >|\n" + + , 1, pageSize, callsign, startDate, endDate, qIsQSL, qIsImported + , pageIndex - 1 == 0 ? 1 : pageIndex - 1, pageSize, callsign, startDate, endDate, qIsQSL, qIsImported + , pageIndex + , pageIndex == pageCount ? pageCount : pageIndex + 1, pageSize, callsign, startDate, endDate, qIsQSL, qIsImported + , pageCount, pageSize, callsign, startDate, endDate, qIsQSL, qIsImported)); + result.append("
\n" + + + cursor = mainViewModel.databaseOpr.getDb().rawQuery( + String.format( + "select * from QSLTable where (([call] LIKE ?)OR(station_callsign LIKE ?)) " + + dateSql + + " order by qso_date desc,time_on desc LIMIT(%d),%d " + , (pageIndex - 1) * pageSize, pageSize), new String[]{whereStr, whereStr}); + + HtmlContext.tableBegin(result, false, true).append("\n"); + + //表头 + HtmlContext.tableRowBegin(result).append("\n"); + HtmlContext.tableCellHeader(result, "No.", "QSL" + , GeneralVariables.getStringFromResource(R.string.html_qso_source) + , GeneralVariables.getStringFromResource(R.string.html_callsign) + , GeneralVariables.getStringFromResource(R.string.html_qsl_grid) + , GeneralVariables.getStringFromResource(R.string.html_qsl_mode) + , GeneralVariables.getStringFromResource(R.string.html_rst_sent) + , GeneralVariables.getStringFromResource(R.string.html_rst_rcvd) + , GeneralVariables.getStringFromResource(R.string.html_qsl_start_day)//"qso date" + , GeneralVariables.getStringFromResource(R.string.html_qsl_start_time)//"time_on" + , GeneralVariables.getStringFromResource(R.string.html_qsl_end_date)//qso date off + , GeneralVariables.getStringFromResource(R.string.html_qsl_end_time)//"time_off" + , GeneralVariables.getStringFromResource(R.string.html_qsl_band) + , GeneralVariables.getStringFromResource(R.string.html_qsl_freq) + , GeneralVariables.getStringFromResource(R.string.html_callsign)//"station_callsign" + , GeneralVariables.getStringFromResource(R.string.html_qsl_grid)//"my_gridsquare" + , GeneralVariables.getStringFromResource(R.string.html_comment))//"comment") + .append("\n"); + HtmlContext.tableRowEnd(result).append("\n"); + + //表内容 + int order = 0; + while (cursor.moveToNext()) { + HtmlContext.tableRowBegin(result, true, order % 2 != 0).append("\n"); + + String call = cursor.getString(cursor.getColumnIndex("call")); + boolean isQSL = cursor.getInt(cursor.getColumnIndex("isQSL")) == 1; + boolean isLotW_Import = cursor.getInt(cursor.getColumnIndex("isLotW_import")) == 1; + boolean isLotW_QSL = cursor.getInt(cursor.getColumnIndex("isLotW_QSL")) == 1; + String gridsquare = cursor.getString(cursor.getColumnIndex("gridsquare")); + String mode = cursor.getString(cursor.getColumnIndex("mode")); + String rst_sent = cursor.getString(cursor.getColumnIndex("rst_sent")); + String rst_rcvd = cursor.getString(cursor.getColumnIndex("rst_rcvd")); + String qso_date = cursor.getString(cursor.getColumnIndex("qso_date")); + String time_on = cursor.getString(cursor.getColumnIndex("time_on")); + String qso_date_off = cursor.getString(cursor.getColumnIndex("qso_date_off")); + String time_off = cursor.getString(cursor.getColumnIndex("time_off")); + String band = cursor.getString(cursor.getColumnIndex("band")); + String freq = cursor.getString(cursor.getColumnIndex("freq")); + String station_callsign = cursor.getString(cursor.getColumnIndex("station_callsign")); + String my_gridsquare = cursor.getString(cursor.getColumnIndex("my_gridsquare")); + String comment = cursor.getString(cursor.getColumnIndex("comment")); + + + HtmlContext.tableCell(result, String.format("%d", order + 1 + pageSize * (pageIndex - 1))); + HtmlContext.tableCell(result, (isQSL || isLotW_QSL) ? "√" : "✗"); + HtmlContext.tableCell(result, isLotW_Import ? + String.format("%s" + , GeneralVariables.getStringFromResource(R.string.html_qso_external)) + : String.format("%s" + , GeneralVariables.getStringFromResource(R.string.html_qso_raw)));//是否是导入的 + HtmlContext.tableCell(result, String.format("%s" + , pageSize + , call.replace("<", "") + .replace(">", "") + , call.replace("<", "<") + .replace(">", ">"))); + HtmlContext.tableCell(result, gridsquare == null ? "" : gridsquare, mode, rst_sent, rst_rcvd + , qso_date, time_on, qso_date_off, time_off, band, freq); + HtmlContext.tableCell(result, String.format("%s" + , pageSize + , station_callsign.replace("<", "") + .replace(">", "") + , station_callsign.replace("<", "<") + .replace(">", ">"))); + HtmlContext.tableCell(result, my_gridsquare == null ? "" : my_gridsquare + , comment).append("\n"); + + HtmlContext.tableRowEnd(result).append("\n"); + + order++; + } + cursor.close(); + HtmlContext.tableEnd(result).append("
\n"); + + return newFixedLengthResponse(HtmlContext.HTML_STRING(result.toString())); + } + + /** + * 获取全部通联日志 + * + * @return HTML + */ + private String showAllQSL() { + Cursor cursor = mainViewModel.databaseOpr.getDb().rawQuery( + "select * from QSLTable order by ID DESC ", null); + return HtmlContext.ListTableContext(cursor, true); + } + + /** + * 按月获取日志 + * + * @param month 月份yyyymm + * @return HTML + */ + private String showQSLByMonth(String month) { + Cursor cursor = mainViewModel.databaseOpr.getDb().rawQuery( + "select * from QSLTable WHERE SUBSTR(qso_date,1,?)=? \n" + + "order by ID DESC ", new String[]{String.valueOf(month.length()), month}); + return HtmlContext.ListTableContext(cursor, true); + } + + /** + * 查最新解码的消息 + * + * @return html + */ + private String getNewMessages() { + StringBuilder result = new StringBuilder(); + result.append(""); + HtmlContext.tableBegin(result, false, true).append("\n"); + + HtmlContext.tableRowBegin(result); + HtmlContext.tableCellHeader(result, "UTC", "dB", "Δt" + , GeneralVariables.getStringFromResource(R.string.html_qsl_freq) + , GeneralVariables.getStringFromResource(R.string.message) + , GeneralVariables.getStringFromResource(R.string.html_carrier_frequency_band)); + HtmlContext.tableRowEnd(result).append("\n"); + + int order = 0; + if (mainViewModel.currentMessages != null) { + for (Ft8Message message : mainViewModel.currentMessages) { + HtmlContext.tableRowBegin(result, true, order % 2 != 0) + .append("\n").append(message.toHtml()); + HtmlContext.tableRowEnd(result).append("\n"); + order++; + } + } + HtmlContext.tableEnd(result).append("
\n"); + return result.toString(); + } + + /** + * 显示导入FT8CN日志文件的HTML + * + * @return HTML + */ + private String showImportLog() { + StringBuilder result = new StringBuilder(); + HtmlContext.tableBegin(result, false, 0, true).append("\n"); + HtmlContext.tableRowBegin(result, false, true); + HtmlContext.tableCell(result, String.format("%s%s%s" + , GeneralVariables.getStringFromResource(R.string.html_please_select) + , GeneralVariables.getStringFromResource(R.string.html_adi_format) + , GeneralVariables.getStringFromResource(R.string.html_file_in_other_format))); + + HtmlContext.tableRowEnd(result).append("\n"); + HtmlContext.tableRowBegin(result).append("\n"); + + result.append("
\n" + + " \n" + + " \n" + + "
"); + HtmlContext.tableRowEnd(result).append("\n"); + HtmlContext.tableEnd(result).append("\n"); + return result.toString(); + } + + @SuppressLint("Range") + private String showQSLTable() { + + StringBuilder result = new StringBuilder(); + HtmlContext.tableBegin(result, false, 1, true).append("\n"); + HtmlContext.tableRowBegin(result).append("\n"); + + HtmlContext.tableCellHeader(result + , GeneralVariables.getStringFromResource(R.string.html_time) + , GeneralVariables.getStringFromResource(R.string.html_total) + , GeneralVariables.getStringFromResource(R.string.html_operation) + , GeneralVariables.getStringFromResource(R.string.html_operation) + , GeneralVariables.getStringFromResource(R.string.html_operation) + ).append("\n"); + + HtmlContext.tableRowEnd(result).append("\n"); + + Cursor cursor = mainViewModel.databaseOpr.getDb().rawQuery("select count(*) as b from QSLTable" + , null); + cursor.moveToFirst(); + + result.append(String.format("%s" + , GeneralVariables.getStringFromResource(R.string.html_all_logs))); + result.append(String.format("%s", cursor.getString(cursor.getColumnIndex("b")))); + result.append(String.format("%s" + , GeneralVariables.getStringFromResource(R.string.html_download))); + result.append(""); + cursor.close(); + + cursor = mainViewModel.databaseOpr.getDb().rawQuery("select count(*) as b from QSLTable\n" + + "WHERE SUBSTR(qso_date,1,8)=?", new String[]{UtcTimer.getYYYYMMDD(UtcTimer.getSystemTime())}); + cursor.moveToFirst(); + + HtmlContext.tableRowBegin(result, true, true).append("\n"); + HtmlContext.tableCell(result, String.format("%s" + , UtcTimer.getYYYYMMDD(UtcTimer.getSystemTime()) + , GeneralVariables.getStringFromResource(R.string.html_today_log))); + HtmlContext.tableCell(result, cursor.getString(cursor.getColumnIndex("b"))); + HtmlContext.tableCell(result, String.format("%s" + , UtcTimer.getYYYYMMDD(UtcTimer.getSystemTime()) + , GeneralVariables.getStringFromResource(R.string.html_download_all))); + HtmlContext.tableCell(result, String.format("%s" + , UtcTimer.getYYYYMMDD(UtcTimer.getSystemTime()) + , GeneralVariables.getStringFromResource(R.string.html_download_unconfirmed))); + HtmlContext.tableCell(result, String.format("%s" + , UtcTimer.getYYYYMMDD(UtcTimer.getSystemTime()) + , GeneralVariables.getStringFromResource(R.string.html_delete))).append("\n"); + + HtmlContext.tableRowEnd(result).append("\n"); + + cursor.close(); + + int order = 1; + cursor = mainViewModel.databaseOpr.getDb() + .rawQuery("select SUBSTR(qso_date,1,6) as a,count(*) as b from QSLTable\n" + + "group by SUBSTR(qso_date,1,6)", null); + while (cursor.moveToNext()) { + HtmlContext.tableRowBegin(result, true, order % 2 == 0); + + HtmlContext.tableCell(result, String.format("%s" + , cursor.getString(cursor.getColumnIndex("a")) + , cursor.getString(cursor.getColumnIndex("a")))); + + HtmlContext.tableCell(result, cursor.getString(cursor.getColumnIndex("b"))); + HtmlContext.tableCell(result, String.format("%s" + , cursor.getString(cursor.getColumnIndex("a")) + , GeneralVariables.getStringFromResource(R.string.html_download_all))); + HtmlContext.tableCell(result, String.format("%s" + , cursor.getString(cursor.getColumnIndex("a")) + , GeneralVariables.getStringFromResource(R.string.html_download_unconfirmed))); + HtmlContext.tableCell(result, String.format("%s" + , cursor.getString(cursor.getColumnIndex("a")) + , GeneralVariables.getStringFromResource(R.string.html_delete))).append("\n"); + + HtmlContext.tableRowEnd(result).append("\n"); + order++; + } + HtmlContext.tableEnd(result).append("\n"); + cursor.close(); + return result.toString(); + } + + private String downQSLByMonth(String month, boolean downall) { + Cursor cursor; + if (downall) { + cursor = mainViewModel.databaseOpr.getDb().rawQuery("select * from QSLTable \n" + + "WHERE (SUBSTR(qso_date,1,?)=?)" + , new String[]{String.valueOf(month.length()), month}); + } else { + cursor = mainViewModel.databaseOpr.getDb().rawQuery("select * from QSLTable \n" + + "WHERE (SUBSTR(qso_date,1,?)=?)and(isLotW_QSL=0 and isQSL=0)" + , new String[]{String.valueOf(month.length()), month}); + + } + return mainViewModel.databaseOpr.downQSLTable(cursor, false); + } + + /** + * 下载全部日志 + * + * @return String + */ + private String downAllQSl() { + Cursor cursor = mainViewModel.databaseOpr.getDb().rawQuery("select * from QSLTable", null); + return mainViewModel.databaseOpr.downQSLTable(cursor, false); + } + + /** + * 生成QSL记录文本 + * + * @return 日志内容 + */ +// @SuppressLint({"Range", "DefaultLocale"}) +// private String downQSLTable(Cursor cursor, boolean isSWL) { +// StringBuilder logStr = new StringBuilder(); +// +// logStr.append("FT8CN ADIF Export\n"); +// while (cursor.moveToNext()) { +// logStr.append(String.format("%s " +// , cursor.getString(cursor.getColumnIndex("call")).length() +// , cursor.getString(cursor.getColumnIndex("call")))); +// if (!isSWL) { +// if (cursor.getInt(cursor.getColumnIndex("isLotW_QSL")) == 1) { +// logStr.append("Y "); +// } else { +// logStr.append("N "); +// } +// if (cursor.getInt(cursor.getColumnIndex("isQSL")) == 1) { +// logStr.append("Y "); +// } else { +// logStr.append("N "); +// } +// } else { +// logStr.append("Y "); +// } +// +// if (cursor.getString(cursor.getColumnIndex("gridsquare")) != null) { +// logStr.append(String.format("%s " +// , cursor.getString(cursor.getColumnIndex("gridsquare")).length() +// , cursor.getString(cursor.getColumnIndex("gridsquare")))); +// } +// +// if (cursor.getString(cursor.getColumnIndex("mode")) != null) { +// logStr.append(String.format("%s " +// , cursor.getString(cursor.getColumnIndex("mode")).length() +// , cursor.getString(cursor.getColumnIndex("mode")))); +// } +// +// if (cursor.getString(cursor.getColumnIndex("rst_sent")) != null) { +// logStr.append(String.format("%s " +// , cursor.getString(cursor.getColumnIndex("rst_sent")).length() +// , cursor.getString(cursor.getColumnIndex("rst_sent")))); +// } +// +// if (cursor.getString(cursor.getColumnIndex("rst_rcvd")) != null) { +// logStr.append(String.format("%s " +// , cursor.getString(cursor.getColumnIndex("rst_rcvd")).length() +// , cursor.getString(cursor.getColumnIndex("rst_rcvd")))); +// } +// +// if (cursor.getString(cursor.getColumnIndex("qso_date")) != null) { +// logStr.append(String.format("%s " +// , cursor.getString(cursor.getColumnIndex("qso_date")).length() +// , cursor.getString(cursor.getColumnIndex("qso_date")))); +// } +// +// if (cursor.getString(cursor.getColumnIndex("time_on")) != null) { +// logStr.append(String.format("%s " +// , cursor.getString(cursor.getColumnIndex("time_on")).length() +// , cursor.getString(cursor.getColumnIndex("time_on")))); +// } +// +// if (cursor.getString(cursor.getColumnIndex("qso_date_off")) != null) { +// logStr.append(String.format("%s " +// , cursor.getString(cursor.getColumnIndex("qso_date_off")).length() +// , cursor.getString(cursor.getColumnIndex("qso_date_off")))); +// } +// +// if (cursor.getString(cursor.getColumnIndex("time_off")) != null) { +// logStr.append(String.format("%s " +// , cursor.getString(cursor.getColumnIndex("time_off")).length() +// , cursor.getString(cursor.getColumnIndex("time_off")))); +// } +// +// if (cursor.getString(cursor.getColumnIndex("band")) != null) { +// logStr.append(String.format("%s " +// , cursor.getString(cursor.getColumnIndex("band")).length() +// , cursor.getString(cursor.getColumnIndex("band")))); +// } +// +// if (cursor.getString(cursor.getColumnIndex("freq")) != null) { +// logStr.append(String.format("%s " +// , cursor.getString(cursor.getColumnIndex("freq")).length() +// , cursor.getString(cursor.getColumnIndex("freq")))); +// } +// +// if (cursor.getString(cursor.getColumnIndex("station_callsign")) != null) { +// logStr.append(String.format("%s " +// , cursor.getString(cursor.getColumnIndex("station_callsign")).length() +// , cursor.getString(cursor.getColumnIndex("station_callsign")))); +// } +// +// if (cursor.getString(cursor.getColumnIndex("my_gridsquare")) != null) { +// logStr.append(String.format("%s " +// , cursor.getString(cursor.getColumnIndex("my_gridsquare")).length() +// , cursor.getString(cursor.getColumnIndex("my_gridsquare")))); +// } +// +// if (cursor.getColumnIndex("operator") != -1) { +// if (cursor.getString(cursor.getColumnIndex("operator")) != null) { +// logStr.append(String.format("%s " +// , cursor.getString(cursor.getColumnIndex("operator")).length() +// , cursor.getString(cursor.getColumnIndex("operator")))); +// } +// } +// +// String comment = cursor.getString(cursor.getColumnIndex("comment")); +// +// //Distance: 99 km +// //在写库的时候,一定要加" km" +// logStr.append(String.format("%s \n" +// , comment.length() +// , comment)); +// } +// +// cursor.close(); +// return logStr.toString(); +// } + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/icom/AudioUdp.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/icom/AudioUdp.java new file mode 100644 index 00000000..72ec7128 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/icom/AudioUdp.java @@ -0,0 +1,29 @@ +package com.bg7yoz.ft8cn.icom; +/** + * 处理音频流的基本类。 + * @author BGY70Z + * @date 2023-08-26 + */ + +import android.util.Log; + +import com.bg7yoz.ft8cn.GeneralVariables; + +import java.net.DatagramPacket; +import java.util.Arrays; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +public class AudioUdp extends IcomUdpBase { + private static final String TAG = "AudioUdp"; + + public AudioUdp() { + udpStyle = IcomUdpStyle.AudioUdp; + } + + + + public void sendTxAudioData(float[] audioData){} + public void startTxAudio(){} + public void stopTXAudio(){} +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/icom/ControlUdp.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/icom/ControlUdp.java new file mode 100644 index 00000000..f9e8b3e9 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/icom/ControlUdp.java @@ -0,0 +1,244 @@ +package com.bg7yoz.ft8cn.icom; +/** + * 控制流的基本类。 + * + * @author BGY70Z + * @date 2023-08-26 + */ + +import android.util.Log; + +import java.net.DatagramPacket; +import java.util.Timer; +import java.util.TimerTask; + +public class ControlUdp extends IcomUdpBase { + private static final String TAG = "ControlUdp"; + public final String APP_NAME = "FT8CN"; + + //与采样率有关,每20ms发送的样本数12000/50=240=F0,实际字节数是(16bit),还要乘以2,也就是480字节 + + + public Timer tokenTimer;//续订令牌的时钟 + + public String userName; + public String password; + public String rigName = ""; + public String audioName = ""; + public byte[] rigMacAddress = new byte[6];//0xA8、0x90包中提供 + public String connectionMode = ""; + + public boolean gotAuthOK = false;//token认证通过了 + public boolean isAuthenticated = false;//登录成功 + public boolean rigIsBusy = false; + + public IcomCivUdp civUdp; + public AudioUdp audioUdp; + + + public ControlUdp(String userName, String password, String remoteIp, int remotePort) { + udpStyle = IcomUdpStyle.ControlUdp; + this.userName = userName; + this.password = password; + + this.rigIp = remoteIp; + this.rigPort = remotePort; + + } + + + @Override + public void onDataReceived(DatagramPacket packet, byte[] data) { + // 父类默认处理一下数据包: + // 控制包0x10(CMD_I_AM_HERE、CMD_RETRANSMIT), + // ping包0x15 + // 变长包:RETRANSMIT包,type=IComPacketTypes.CMD_RETRANSMIT + super.onDataReceived(packet, data); + switch (data.length) { + case IComPacketTypes.CONTROL_SIZE://在父类中已经实现0x04,0x01指令 + if (IComPacketTypes.ControlPacket.getType(data) == IComPacketTypes.CMD_I_AM_HERE) { + rigIp = packet.getAddress().getHostAddress(); + } + //如果电台回复I'm ready,就发起login + if (IComPacketTypes.ControlPacket.getType(data) == IComPacketTypes.CMD_I_AM_READY) { + sendLoginPacket();//电台准备好了,申请登录 0x80包 + startIdleTimer();//打开发送空包时钟 + } + break; + case IComPacketTypes.TOKEN_SIZE://处理令牌的续订之类的事情 + onReceiveTokenPacket(data); + break; + case IComPacketTypes.STATUS_SIZE://0x50电台回复我它的参数:CivPort,AudioPort等 + onReceiveStatusPacket(data); + break; + case IComPacketTypes.LOGIN_RESPONSE_SIZE://0x60电台回复登录的请求 + onReceiveLoginResponse(data); + break; + case IComPacketTypes.CONNINFO_SIZE://电台会回复2次0x90包,区别在于busy字段 + onReceiveConnInfoPacket(data); + break; + case IComPacketTypes.CAP_CAPABILITIES_SIZE://0xA8数据包,返回civ地址 + byte[] audioCap = IComPacketTypes.CapCapabilitiesPacket.getRadioCapPacket(data, 0); + if (audioCap != null) { + civUdp.supportTX = IComPacketTypes.RadioCapPacket.getSupportTX(audioCap); + civUdp.civAddress = IComPacketTypes.RadioCapPacket.getCivAddress(audioCap); + audioName = IComPacketTypes.RadioCapPacket.getAudioName(audioCap); + } + break; + } + } + + + /** + * 处理电台发送过来的connInfo(0x90)数据包,电台发送0x90包有两次,第一次busy=0,第二次busy=1。 + * 在0x90数据包中取macAddress,电台名称 + * 这部分留给IcomControlUdp和XieGuControlUdp来处理 + * @param data 0x90数据包 + */ + public void onReceiveConnInfoPacket(byte[] data) { + } + + + /** + * 处理电台回复登录数据包 + * + * @param data 0x60数据包 + */ + public void onReceiveLoginResponse(byte[] data) { + if (IComPacketTypes.ControlPacket.getType(data) == 0x01) return; + connectionMode = IComPacketTypes.LoginResponsePacket.getConnection(data); + Log.d(TAG, "connection mode:" + connectionMode); + if (IComPacketTypes.LoginResponsePacket.authIsOK(data)) {//errorCode=0x00,认证成功 + Log.d(TAG, "onReceiveLoginResponse: Login succeed!"); + if (!isAuthenticated) { + rigToken = IComPacketTypes.LoginResponsePacket.getToken(data); + Log.d(TAG, "onReceiveLoginResponse: send token confirm 0x02"); + sendTokenPacket(IComPacketTypes.TOKEN_TYPE_CONFIRM);//发送令牌确认包 0x40 + startTokenTimer();//启动令牌续订时钟 + isAuthenticated = true; + } + } + if (onStreamEvents != null) {//触发认证事件 + onStreamEvents.OnLoginResponse(IComPacketTypes.LoginResponsePacket.authIsOK(data)); + } + } + + /** + * 处理电台回复我的参数。0x50数据包 + * + * @param data 0x50数据包 + */ + public void onReceiveStatusPacket(byte[] data) { + //if (this.authDone) return;//6100会频繁激活0x50包 + if (IComPacketTypes.ControlPacket.getType(data) == 0x01) return; + if (IComPacketTypes.StatusPacket.getAuthOK(data) + && IComPacketTypes.StatusPacket.getIsConnected(data)) {//令牌认证成功,且处于连接状态 + audioUdp.rigPort = IComPacketTypes.StatusPacket.getRigAudioPort(data); + audioUdp.rigIp = rigIp; + civUdp.rigPort = IComPacketTypes.StatusPacket.getRigCivPort(data); + civUdp.rigIp = rigIp; + Log.e(TAG, String.format("onReceiveStatusPacket: Status packet 0x50: civRigPort:%d,audioRigPort:%d" + , civUdp.rigPort, audioUdp.rigPort)); + //todo 6100与icom有差异 + civUdp.startAreYouThereTimer();//civ端口启动连接电台 + audioUdp.startAreYouThereTimer();//audio端口启动连接电台 + }//else处理关闭连接??? + } + + /** + * 处理令牌数据包 + * + * @param data 0x40数据包 + */ + public void onReceiveTokenPacket(byte[] data) { + //看是不是续订令牌包 + if (IComPacketTypes.TokenPacket.getRequestType(data) == IComPacketTypes.TOKEN_TYPE_RENEWAL + && IComPacketTypes.TokenPacket.getRequestReply(data) == 0x02 + && IComPacketTypes.ControlPacket.getType(data) != IComPacketTypes.CMD_RETRANSMIT) { + int response = IComPacketTypes.TokenPacket.getResponse(data); + if (response == 0x0000) {//说明续订成功了 + gotAuthOK = true; + } else if (response == 0xffffffff) { + remoteId = IComPacketTypes.ControlPacket.getSentId(data); + localToken = IComPacketTypes.TokenPacket.getTokRequest(data); + rigToken = IComPacketTypes.TokenPacket.getToken(data); + sendConnectionRequest();//申请连接 + } else { + Log.e(TAG, "Token renewal failed,unknow response"); + } + } + } + + /** + * 发送civ指令 + * + * @param data 指令 + */ + public void sendCivData(byte[] data) { + civUdp.sendCivData(data); + } + + /** + * 发送音频数据到电台 + * + * @param data 数据 + */ + public void sendWaveData(float[] data) { + audioUdp.sendTxAudioData(data); + } + + /** + * 发送0x90数据包,向电台请求连接 + */ + public void sendConnectionRequest() { + sendTrackedPacket(IComPacketTypes.ConnInfoPacket.connectRequestPacket((short) 0 + , localId, remoteId, (byte) 0x01, (byte) 0x03, innerSeq, localToken, rigToken + , rigMacAddress, rigName, userName, IComPacketTypes.AUDIO_SAMPLE_RATE + , civUdp.getLocalPort(), audioUdp.getLocalPort() + , IComPacketTypes.TX_BUFFER_SIZE)); + innerSeq++; + } + + /** + * 发送登录数据包0x80包 + */ + public void sendLoginPacket() { + sendTrackedPacket(IComPacketTypes.LoginPacket.loginPacketData((short) 0 + , localId, remoteId, innerSeq, localToken, rigToken, userName, password, APP_NAME)); + innerSeq++; + } + + @Override + public void setOnStreamEvents(OnStreamEvents onStreamEvents) { + super.setOnStreamEvents(onStreamEvents); + audioUdp.onStreamEvents = onStreamEvents; + civUdp.onStreamEvents = onStreamEvents; + } + + /** + * 启动令牌续订时钟 + */ + public void startTokenTimer() { + stopTimer(tokenTimer); + Log.d(TAG, String.format("start Toke Timer: local port:%d,remote port %d", localPort, rigPort)); + tokenTimer = new Timer(); + tokenTimer.scheduleAtFixedRate(new TimerTask() { + @Override + public void run() { + sendTokenPacket(IComPacketTypes.TOKEN_TYPE_RENEWAL); + } + }, IComPacketTypes.TOKEN_RENEWAL_PERIOD_MS, IComPacketTypes.TOKEN_RENEWAL_PERIOD_MS); + } + + public void closeAll() { + sendTrackedPacket(IComPacketTypes.TokenPacket.getTokenPacketData((short) 0 + , localId, remoteId, IComPacketTypes.TOKEN_TYPE_DELETE, innerSeq, localToken, rigToken)); + innerSeq++; + this.close(); + civUdp.close(); + audioUdp.stopTXAudio(); + audioUdp.close(); + + civUdp.sendOpenClose(false); + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/icom/IComPacketTypes.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/icom/IComPacketTypes.java new file mode 100644 index 00000000..709c0fd4 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/icom/IComPacketTypes.java @@ -0,0 +1,1044 @@ +package com.bg7yoz.ft8cn.icom; + +import android.util.Log; + +/** + * ICom各数据包的解包和封包。 + * + * @author BGY70Z + * @date 2023-03-20 + */ +public class IComPacketTypes { + private static final String TAG = "IComPacketTypes"; + + public static final int TX_BUFFER_SIZE = 0xf0; + public static final int XIEGU_TX_BUFFER_SIZE = 0x96; + /** + * 各类型包的长度 + */ + public static final int CONTROL_SIZE = 0x10; + public static final int WATCHDOG_SIZE = 0x14; + public static final int PING_SIZE = 0x15; + public static final int OPENCLOSE_SIZE = 0x16; + public static final int RETRANSMIT_RANGE_SIZE = 0x18;//重新传输,范围 + public static final int TOKEN_SIZE = 0x40; + public static final int STATUS_SIZE = 0x50; + public static final int LOGIN_RESPONSE_SIZE = 0x60; + public static final int LOGIN_SIZE = 0x80; + public static final int CONNINFO_SIZE = 0x90; + public static final int CAPABILITIES_SIZE = 0x42;//功能包 + public static final int RADIO_CAP_SIZE = 0x66; + public static final int CAP_CAPABILITIES_SIZE = 0xA8;//0x42+0x66 + public static final int AUDIO_HEAD_SIZE = 0x18;//音频数据包的头是0x10+0x08,后面再跟音频数据 + + + public static final short CMD_NULL = 0x00;//空指令 + public static final short CMD_RETRANSMIT = 0x01;//请求重新发送,seq是重新发送的序号 + public static final short CMD_ARE_YOU_THERE = 0x03;//询问是否在?seq值必须为0 + public static final short CMD_I_AM_HERE = 0x04;//回答是否在? + public static final short CMD_DISCONNECT = 0x05;//断开 + public static final short CMD_ARE_YOU_READY = 0x06;//询问电台是否准备好了,seq=1 + public static final short CMD_I_AM_READY = 0x06;//电台回复已经准备好 + public static final short CMD_PING = 0x07;//ping ,seq有自己的序列 + + public static final byte TOKEN_TYPE_DELETE = 0x01;//令牌删除包 + public static final byte TOKEN_TYPE_CONFIRM = 0x02;//令牌确认包 + public static final byte TOKEN_TYPE_DISCONNECT = 0x04;//断开CI-V和音频流 + public static final byte TOKEN_TYPE_RENEWAL = 0x05;//令牌续订 + + + public static final long PING_PERIOD_MS = 500;//ping时钟的周期 + public static final long ARE_YOU_THERE_PERIOD_MS = 500;//查找电台的时钟周期 + public static final long IDLE_PERIOD_MS = 100;//空包时钟的周期 + public static final long TOKEN_RENEWAL_PERIOD_MS = 60000;//令牌旭东的时钟周期 + public static final long PURGE_MILLISECONDS = 10000;//数据缓冲区的时间最长是10秒钟 + public static final long OPEN_CLOSE_PERIOD_MS = 500;//civ指令定时发送open指令,确保端口打开 + public static final long WATCH_DOG_PERIOD_MS = 500;//监视数据接收状况的看门狗 + public static final long WATCH_DOG_ALERT_MS = 2000;//触发数据接收状况报警的阈值 + public static final long METER_TIMER_PERIOD_MS = 500;//检查meter的时钟周期 + + public static final int AUDIO_SAMPLE_RATE = 12000;//音频的采样率,这是FT8CN发送给iCom使用的采样率 + public static final int XIEGU_AUDIO_SAMPLE_RATE = 48000;//音频的采样率,这是FT8CN发送给XIEGU使用的采样率 + + public static final short CODEC_ALL_SUPPORTED = 0x018b; + public static final short CODEC_ONLY_24K = 0x0100; + public static final short CODEC_ONLY_12K = 0x0080; + public static final short CODEC_ONLY_441K = 0x0040;//44.1k + public static final short CODEC_ONLY_2205K = 0x0020;//22.05k + public static final short CODEC_ONLY_11025K = 0x0010;//11.025k + public static final short CODEC_ONLY_48K = 0x0008; + public static final short CODEC_ONLY_32K = 0x0004; + public static final short CODEC_ONLY_16K = 0x0002; + public static final short CODEC_ONLY_8K = 0x0001; + + public static class IcomCodecType { + public static final byte ULAW_1CH_8BIT = 0x01; + public static final byte LPCM_1CH_8BIT = 0x02; + public static final byte LPCM_1CH_16BIT = 0x04;//FT8CN推荐值 + public static final byte PCM_2CH_8BIT = 0x08; + public static final byte LPCM_2CH_16BIT = 0x10; + public static final byte ULAW_2CH_8BIT = 0x20; + public static final byte OPUS_CH1 = 0x40; + public static final byte OPUS_CH2 = (byte) 0x80; + } + + + /** + * 控制指令数据包。用于简单通信和重传请求的不带内容的数据包,0x10 + */ + public static class ControlPacket { + /** + * 把控制数据包转换成数据流 + * + * @return 数据流 + */ + public static byte[] toBytes(short type, short seq, int sentId, int rcvdId) { + byte[] packet = new byte[CONTROL_SIZE]; + System.arraycopy(intToBigEndian(CONTROL_SIZE), 0, packet, 0, 4); + System.arraycopy(shortToBigEndian(type), 0, packet, 4, 2); + System.arraycopy(shortToBigEndian(seq), 0, packet, 6, 2); + System.arraycopy(intToBigEndian(sentId), 0, packet, 8, 4); + System.arraycopy(intToBigEndian(rcvdId), 0, packet, 12, 4); + return packet; + } + + public static byte[] idlePacketData(short seq, int sendid, int rcvdId) { + return toBytes(CMD_NULL, seq, sendid, rcvdId); + } + + public static boolean isControlPacket(byte[] data) {//0x10 + return data.length == CONTROL_SIZE && readIntBigEndianData(data, 0x00) == CONTROL_SIZE; + } + + public static short getType(byte[] data) { + if (data.length < CONTROL_SIZE) return 0; + return readShortBigEndianData(data, 0x04); + } + + public static short getSeq(byte[] data) { + if (data.length < CONTROL_SIZE) return 0; + return readShortBigEndianData(data, 0x06); + } + + public static int getSentId(byte[] data) { + if (data.length < CONTROL_SIZE) return 0; + return readIntBigEndianData(data, 0x08); + } + + public static int getRcvdId(byte[] data) { + if (data.length < CONTROL_SIZE) return 0; + return readIntBigEndianData(data, 0x0c); + } + + public static void setRcvdId(byte[] data, int rcvdId) { + System.arraycopy(intToBigEndian(rcvdId), 0x00, data, 0x0c, 4); + } + } + + public static class AudioPacket { + /** + * quint32 len; // 0x00 + * quint16 type; // 0x04 + * quint16 seq; // 0x06 + * quint32 sentid; // 0x08 + * quint32 rcvdid; // 0x0c + *

+ *

+ * //接收的时候,ident=0x8116 ,8106,8006 + * quint16 ident; // 0x10 发射的时候: 当datalen=0xa0时,ident=0x9781,否则ident=0x0080; + * quint16 sendseq; // 0x12 + * quint16 unused; // 0x14 + * quint16 datalen; // 0x16 + */ + public static boolean isAudioPacket(byte[] data) { + if (data.length < AUDIO_HEAD_SIZE) return false; + return data.length - AUDIO_HEAD_SIZE == readShortData(data, 0x16); + } + + public static short getDataLen(byte[] data) { + return readShortData(data, 0x16); + } + + public static byte[] getAudioData(byte[] data) { + byte[] audio = new byte[data.length - AUDIO_HEAD_SIZE]; + System.arraycopy(data, 0x18, audio, 0, audio.length); + return audio; + } + + public static byte[] getTxAudioPacket(byte[] audio, short seq, int sentid, int rcvdid, short sendSeq) { + byte[] packet = new byte[audio.length + AUDIO_HEAD_SIZE]; + System.arraycopy(intToBigEndian(packet.length), 0, packet, 0, 4);//包长 + System.arraycopy(shortToBigEndian(seq), 0, packet, 0x06, 2);//序号=0 + System.arraycopy(intToBigEndian(sentid), 0, packet, 0x08, 4);//客户id + System.arraycopy(intToBigEndian(rcvdid), 0, packet, 0x0c, 4);//电台id + if (audio.length == 0xa0) { + System.arraycopy(shortToByte((short) 0x8197), 0, packet, 0x10, 2); + } else {//这个是常用的数值 + System.arraycopy(shortToByte((short) 0x8000), 0, packet, 0x10, 2);//一般是这个值 + } + System.arraycopy(shortToByte(sendSeq), 0, packet, 0x12, 2);//包序号 + + System.arraycopy(shortToByte((short) audio.length), 0, packet, 0x16, 2); + System.arraycopy(audio, 0, packet, 0x18, audio.length); + return packet; + } + } + + public static class CivPacket { + /** + * CIV指令包 + * quint32 len; // 0x00 + * quint16 type; // 0x04 + * quint16 seq; // 0x06 + * quint32 sentid; // 0x08 + * quint32 rcvdid; // 0x0c + * char reply; // 0x10,civ是c1 + * quint16 civ_len; // 0x11 此字段是小端模式,0x0001,在数组中的顺序是0x0100 + * quint16 sendseq; //0x13 + * byte[] civ_data;//0x15 + */ + public static boolean checkIsCiv(byte[] data) { + if (data.length <= 0x15) return false; + //是civ指令的条件:长度不能小于0x15,dataLen字段与实际相符,reply=0xc1,type!=0x01 + return (data.length - 0x15 == readShortBigEndianData(data, 0x11)) + && (data[0x10] == (byte) 0xc1) + && (ControlPacket.getType(data) != CMD_RETRANSMIT); + } + + public static byte[] getCivData(byte[] data) { + byte[] civ = new byte[data.length - 0x15]; + System.arraycopy(data, 0x15, civ, 0, data.length - 0x15); + return civ; + } + + public static byte[] setCivData(short seq, int sentid, int rcvdid, short civSeq, byte[] data) { + byte[] packet = new byte[data.length + 0x15]; + System.arraycopy(intToBigEndian(packet.length), 0, packet, 0, 4); + System.arraycopy(shortToBigEndian(seq), 0, packet, 0x06, 2); + System.arraycopy(intToBigEndian(sentid), 0, packet, 0x08, 4); + System.arraycopy(intToBigEndian(rcvdid), 0, packet, 0x0c, 4); + packet[0x10] = (byte) 0xc1; + System.arraycopy(shortToBigEndian((short) data.length), 0, packet, 0x11, 2); + System.arraycopy(shortToByte(civSeq), 0, packet, 0x13, 2); + System.arraycopy(data, 0, packet, 0x15, data.length); + return packet; + } + } + + public static class OpenClosePacket { + /** + * quint32 len; // 0x00 + * quint16 type; // 0x04 + * quint16 seq; // 0x06 + * quint32 sentid; // 0x08 + * quint32 rcvdid; // 0x0c + * char reply; // 0x10,openClose是c0,civ是c1 + * quint16 civ_len; // 0x11 此字段是小端模式,0x0001,在数组中的顺序是0x0100 + * quint16 sendseq; //0x13 + * char magic; // 0x15 + */ + public static byte[] toBytes(short seq, int sentId, int rcvdId, short civSeq, byte magic) { + byte[] packet = new byte[OPENCLOSE_SIZE]; + System.arraycopy(intToBigEndian(OPENCLOSE_SIZE), 0, packet, 0, 4); + //System.arraycopy(shortToBigEndian(type), 0, packet, 4, 2); + System.arraycopy(shortToBigEndian(seq), 0, packet, 6, 2); + System.arraycopy(intToBigEndian(sentId), 0, packet, 8, 4); + System.arraycopy(intToBigEndian(rcvdId), 0, packet, 12, 4); + + packet[0x10] = (byte) 0xc0; + System.arraycopy(shortToBigEndian((short) 0x0001), 0, packet, 0x11, 2); + System.arraycopy(shortToByte(civSeq), 0, packet, 0x13, 2); + packet[0x15] = magic; + return packet; + } + } + + /** + * ping 数据包,0x15。 + * 如果reply==0,说明是对方ping过来的包,必须要回复。如果reply=1,说明是对方回Ping的,本地的pingSeq++ + */ + public static class PingPacket { + /** + * quint32 len; // 0x00 + * quint16 type; // 0x04 + * quint16 seq; // 0x06 + * quint32 sentid; // 0x08 + * quint32 rcvdid; // 0x0c + * char reply; // 0x10 如果接收的数据中reply=0x00,我就要用sendReplayPingData()回复Ping。 + * union { // 此部分发送与接收定义是不同的 + * struct { // Ping包 + * quint32 time; // 0x11 + * }; + * struct { // 发送 + * quint16 datalen; // 0x11 + * quint16 sendseq; //0x13 + * }; + * } + */ + public static boolean isPingPacket(byte[] data) { + return readShortBigEndianData(data, 0x04) == CMD_PING; + } + + public static byte getReply(byte[] data) { + return data[0x10]; + } + + + /** + * 根据接收的Ping包,生成回复的Ping包。 + * + * @param data 接收到的Ping包 + * @param localID 主机的ID + * @param remoteID 电台的ID + * @return 回复的PIng包 + */ + public static byte[] sendReplayPingData(byte[] data, int localID, int remoteID) { + byte[] packet = new byte[PING_SIZE]; + System.arraycopy(intToBigEndian(PING_SIZE), 0, packet, 0, 4); //len int32 0x00 + System.arraycopy(shortToBigEndian(CMD_PING), 0, packet, 4, 2);//type int16 0x04 + packet[0x6] = data[0x6]; //seq int16 0x06 + packet[0x7] = data[0x7];//把原来的seq值取过来 + System.arraycopy(intToBigEndian(localID), 0, packet, 8, 4); //localID int32 0x08 + System.arraycopy(intToBigEndian(remoteID), 0, packet, 12, 4);//remoteID int32 0x0c + packet[0x10] = (byte) (0x01); //reply byte 0x10, reply=01是回Ping,reply=00是Ping + //Time + packet[0x11] = data[0x11]; + packet[0x12] = data[0x12]; + packet[0x13] = data[0x13]; + packet[0x14] = data[0x14]; + return packet; + } + + /** + * 生成用于Ping电台的数据包,seq应当是pingSeq,与指令数据包不在一个序列,序列号要等接收到回Ping的包再自增。 + * + * @param localID 主机ID + * @param remoteID 电台ID + * @param seq 序列号 + * @return 数据包 + */ + public static byte[] sendPingData(int localID, int remoteID, short seq) { + byte[] packet = new byte[PING_SIZE]; + System.arraycopy(intToBigEndian(PING_SIZE), 0, packet, 0, 4);// len int32 0x00发送时,len=0 + System.arraycopy(shortToBigEndian(CMD_PING), 0, packet, 4, 2);//type int16 0x04 + System.arraycopy(shortToBigEndian(seq), 0, packet, 6, 2);//seq int16 0x06 + System.arraycopy(intToBigEndian(localID), 0, packet, 8, 4); //localID int32 0x08 + System.arraycopy(intToBigEndian(remoteID), 0, packet, 12, 4);//remoteID int32 0x0c + packet[0x10] = (byte) (0x00);//ping对方,=0x00,如果回复=0x01 + //Time + System.arraycopy(intToBigEndian((int) System.currentTimeMillis()) + , 0, packet, 11, 4); + + return packet; + } + } + + /** + * Status(0x50)包, + */ + public static class StatusPacket { + /** + quint32 len; // 0x00 + quint16 type; // 0x04 + quint16 seq; // 0x06 + quint32 sentid; // 0x08 + quint32 rcvdid; // 0x0c + char unuseda[2]; // 0x10 + quint16 payloadsize; // 0x12 + quint8 requestreply; // 0x13 + quint8 requesttype; // 0x14 + quint16 innerseq; // 0x16 + char unusedb[2]; // 0x18 + quint16 tokrequest; // 0x1a + quint32 token; // 0x1c + union { + struct { + quint16 authstartid; // 0x20 + char unusedd[5]; // 0x22 + quint16 commoncap; // 0x27 + char unusede; // 0x29 + quint8 macaddress[6]; // 0x2a + }; + quint8 guid[GUIDLEN]; // 0x20 + }; + quint32 error; // 0x30 + char unusedg[12]; // 0x34 + char disc; // 0x40 + char unusedh; // 0x41 + quint16 civport; // 0x42 // Sent bigendian + quint16 unusedi; // 0x44 // Sent bigendian + quint16 audioport; // 0x46 // Sent bigendian + char unusedj[7]; // 0x49 + */ + public static boolean isStatusPacket(byte[] data) { + return (data.length == STATUS_SIZE && readIntBigEndianData(data, 0) == STATUS_SIZE); + } + + public static boolean getAuthOK(byte[] data) { + return readIntBigEndianData(data, 0x30) == 0;//0x30 error=0,failed error=0xffffffff + } + + public static boolean getIsConnected(byte[] data) { + return data[0x40] == 0x00; + } + + public static int getRigCivPort(byte[] data) { + return readShortData(data, 0x42) & 0xffff; + } + + public static int getRigAudioPort(byte[] data) { + return readShortData(data, 0x46) & 0xffff; + } + + } + + + /** + * 0x90包。电台回复,或APP回复连接参数包. + */ + public static class ConnInfoPacket { + /** + quint32 len; // 0x00 + quint16 type; // 0x04 + quint16 seq; // 0x06 + quint32 sentid; // 0x08 + quint32 rcvdid; // 0x0c + char unuseda[2]; // 0x10 + quint16 payloadsize; // 0x12 + quint8 requestreply; // 0x13 + quint8 requesttype; // 0x14 + quint16 innerseq; // 0x16 + char unusedb[2]; // 0x18 + quint16 tokrequest; // 0x1a 主机的TOKEN + quint32 token; // 0x1c 电台的TOKEN + union { + struct { + quint16 authstartid; // 0x20 + char unusedg[5]; // 0x22 + quint16 commoncap; // 0x27 当commonCap==0x1080时,用mac地址标识电台,否则就是16字节的GUID + char unusedh; // 0x29 + quint8 macaddress[6]; // 0x2a + }; + quint8 guid[GUIDLEN]; // 0x20 + }; + char unusedab[16]; // 0x30 + char name[32]; // 0x40 + union { // 此部分有两种类型:发送和接收 + struct { // 接收到数据的结构 + quint32 busy; // 0x60 + char computer[16]; // 0x64 + char unusedi[16]; // 0x74 + quint32 ipaddress; // 0x84 + char unusedj[8]; // 0x78 + }; + struct { // 发送的数据结构,用于告知电台以下参数 + char username[16]; // 0x60 用户名的密文 + char rxenable; // 0x70 可以接收=0x01 + char txenable; // 0x71 可以发射=0x01 + char rxcodec; // 0x72 接收的编码方式,IcomCodecType,0x04,LPcm 16Bit 1ch, + char txcodec; // 0x73 发射的编码方式,IcomCodecType,0x04,LPcm 16Bit 1ch, + quint32 rxsample; // 0x74 接收采样率 + quint32 txsample; // 0x78 发射采样率 + quint32 civport; // 0x7c 主机端CI-V端口 + quint32 audioport; // 0x80 主机端音频端口 + quint32 txbuffer; // 0x84 发送缓冲区,不清楚时什么单位wfView的值时0x96 + quint8 convert; // 0x88 + char unusedl[7]; // 0x89 + + */ + + public static boolean getBusy(byte[] data) { + return data[0x60] != 0x00; + } + + public static byte[] getMacAddress(byte[] data) { + byte[] mac = new byte[6]; + System.arraycopy(data, 0x2a, mac, 0, 6);//macAddress + return mac; + } + + public static String getRigName(byte[] data) { + byte[] name = new byte[32]; + System.arraycopy(data, 0x40, name, 0, 32);//rig Name + return new String(name).trim(); + } + + public static byte[] connectRequestPacket(short seq, int localSID, int remoteSID + , byte requestReply, byte requestType + , short authInnerSendSeq, short tokRequest, int token + , byte[] macAddress + , String rigName, String userName, int sampleRate + , int civPort, int audioPort, int txBufferSize) { + byte[] packet = new byte[CONNINFO_SIZE]; + System.arraycopy(intToBigEndian(CONNINFO_SIZE), 0, packet, 0, 4);//len + System.arraycopy(shortToBigEndian((short) 0), 0, packet, 4, 2); //type=0 + System.arraycopy(shortToBigEndian(seq), 0, packet, 6, 2); //seq + System.arraycopy(intToBigEndian(localSID), 0, packet, 8, 4); //localID + System.arraycopy(intToBigEndian(remoteSID), 0, packet, 12, 4); //remoteID + //System.arraycopy({0x00,0x00}, 0, packet, 16, 2); //unuseda byte[2] + System.arraycopy(shortToByte((short) (CONNINFO_SIZE - 0x10)) + , 0, packet, 18, 2);//payloadsize + packet[20] = requestReply;//0x01;//requestReply; + packet[21] = requestType;//requestType;应当是0x03,回复电台我需要的参数。 + System.arraycopy(shortToByte(authInnerSendSeq), 0, packet, 22, 2);//innerSeq + //System.arraycopy(unusedB, 0, packet, 24, 2);//unusedb + System.arraycopy(shortToByte(tokRequest), 0, packet, 26, 2);//tokRequest主机的TOKEN + System.arraycopy(intToByte(token), 0, packet, 28, 4);//电台的TOKEN + packet[0x26] = 0x10; + packet[0x27] = (byte) 0x80;//这两个字节是commCap字段,默认设成0x1080 + System.arraycopy(macAddress, 0, packet, 0x28, 6);//macAddress + + System.arraycopy(stringToByte(rigName, 32), 0, packet, 64, 32);//电台名称 + System.arraycopy(passCode(userName), 0, packet, 96, 16);//用户名密文 + packet[0x70] = 0x01;//rxEnable,支持接收 + packet[0x71] = 0x01;//txEnable,支持发射 + packet[0x72] = IcomCodecType.LPCM_1CH_16BIT;//rxCodec,0x04:LPcm 16Bit 1ch,0x02:LPcm 8Bit 1ch + packet[0x73] = IcomCodecType.LPCM_1CH_16BIT;//txCodec,0x04:LPcm 16Bit 1ch,0x02:LPcm 8Bit 1ch + System.arraycopy(intToByte(sampleRate), 0, packet, 0x74, 4);//rxSampleRate,采样率 + System.arraycopy(intToByte(sampleRate), 0, packet, 0x78, 4);//txSampleRate,采样率 + System.arraycopy(intToByte(civPort), 0, packet, 0x7c, 4);//civPort,本地CI-V端口 + System.arraycopy(intToByte(audioPort), 0, packet, 0x80, 4);//audioPort,本地音频端口 + System.arraycopy(intToByte(txBufferSize), 0, packet, 0x84, 4);//txBuffer,发送缓冲区 + packet[0x88] = 0x01;//convert + + return packet; + } + + public static byte[] connInfoPacketData(byte[] rigData, + short seq, int localSID, int remoteSID + , byte requestReply, byte requestType + , short authInnerSendSeq, short tokRequest, int token + , String rigName, String userName, int rx_sampleRate,int tx_sampleRate + , int civPort, int audioPort, int txBufferSize) { + byte[] packet = new byte[CONNINFO_SIZE]; + System.arraycopy(intToBigEndian(CONNINFO_SIZE), 0, packet, 0, 4);//len + System.arraycopy(shortToBigEndian((short) 0), 0, packet, 4, 2); //type=0 + System.arraycopy(shortToBigEndian(seq), 0, packet, 6, 2); //seq + System.arraycopy(intToBigEndian(localSID), 0, packet, 8, 4); //localID + System.arraycopy(intToBigEndian(remoteSID), 0, packet, 12, 4); //remoteID + //System.arraycopy({0x00,0x00}, 0, packet, 16, 2); //unuseda byte[2] + System.arraycopy(shortToByte((short) (CONNINFO_SIZE - 0x10)) + , 0, packet, 18, 2);//payloadsize + packet[20] = requestReply;//0x01;//requestReply; + packet[21] = requestType;//requestType;应当是0x03,回复电台我需要的参数。 + System.arraycopy(shortToByte(authInnerSendSeq), 0, packet, 22, 2);//innerSeq + //System.arraycopy(unusedB, 0, packet, 24, 2);//unusedb + System.arraycopy(shortToByte(tokRequest), 0, packet, 26, 2);//tokRequest主机的TOKEN + System.arraycopy(intToByte(token), 0, packet, 28, 4);//电台的TOKEN + //把电台发送的数据复制回去: + //00 00 00 00 00 00 00 10 80 00 00 90 c7 0f b6 ed + //autID|unusedG |comcp|uH|macAddress | + //00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + //|unusedB 共16字节 | + System.arraycopy(rigData, 32, packet, 32, 32); + + System.arraycopy(stringToByte(rigName, 32), 0, packet, 64, 32);//电台名称 + System.arraycopy(passCode(userName), 0, packet, 96, 16);//用户名密文 + packet[0x70] = 0x01;//rxEnable,支持接收 + packet[0x71] = 0x01;//txEnable,支持发射 + packet[0x72] = IcomCodecType.LPCM_1CH_16BIT;//rxCodec,0x04:LPcm 16Bit 1ch,0x02:LPcm 8Bit 1ch + packet[0x73] = IcomCodecType.LPCM_1CH_16BIT;//txCodec,0x04:LPcm 16Bit 1ch,0x02:LPcm 8Bit 1ch + System.arraycopy(intToByte(rx_sampleRate), 0, packet, 0x74, 4);//rxSampleRate,采样率 + System.arraycopy(intToByte(tx_sampleRate), 0, packet, 0x78, 4);//txSampleRate,采样率 + System.arraycopy(intToByte(civPort), 0, packet, 0x7c, 4);//civPort,本地CI-V端口 + System.arraycopy(intToByte(audioPort), 0, packet, 0x80, 4);//audioPort,本地音频端口 + System.arraycopy(intToByte(txBufferSize), 0, packet, 0x84, 4);//txBuffer,发送缓冲区 + packet[0x88] = 0x01;//convert + + return packet; + } + } + + + /** + * 0xA8包,电台回复电台的参数信息,0x42+0x66,0x42是capabilites头,0x66是radioCap + */ + public static class CapCapabilitiesPacket { + /** + * 查radioCap的数量 + * + * @param data 数据包 + * @return 数量 + */ + public static int getRadioPacketCount(byte[] data) { + int count; + count = (data.length - CAPABILITIES_SIZE) / RADIO_CAP_SIZE; + if (count > 0) { + return count; + } else { + return count; + } + } + + /** + * 获取radioCap数据包,也许radioCap的数量不止一个,所以要用index来指定哪一个数据包 + * + * @param data 数据包 + * @param index 数据包的索引,以0为起点 + * @return radioCap数据包 + */ + public static byte[] getRadioCapPacket(byte[] data, int index) { + if (data.length < (CAPABILITIES_SIZE + RADIO_CAP_SIZE * (index + 1))) + return null;//如果小于最小长度,就返回空 + byte[] packet = new byte[0x66]; + System.arraycopy(data, CAPABILITIES_SIZE + RADIO_CAP_SIZE * index, packet, 0, RADIO_CAP_SIZE); + return packet; + } + } + + /** + * 电台参数数据包(0x66长度),它是在Capabilities(0x42长度)包的后面,如果是一个,总数据包的长度是0xA8, + */ + public static class RadioCapPacket { + /** + union { + struct { + quint8 unusede[7]; // 0x00 + quint16 commoncap; // 0x07 + quint8 unused; // 0x09 + quint8 macaddress[6]; // 0x0a + }; + quint8 guid[GUIDLEN]; // 0x0 + }; + char name[32]; // 0x10 + char audio[32]; // 0x30 + quint16 conntype; // 0x50 + char civ; // 0x52 + quint16 rxsample; // 0x53 + quint16 txsample; // 0x55 + quint8 enablea; // 0x57 + quint8 enableb; // 0x58 + quint8 enablec; // 0x59 + quint32 baudrate; // 0x5a + quint16 capf; // 0x5e + char unusedi; // 0x60 + quint16 capg; // 0x61 + char unusedj[3]; // 0x63 + */ + + /** + * 获取电台名称 + * + * @param data 0x66数据包 + * @return 名称 + */ + public static String getRigName(byte[] data) { + byte[] rigName = new byte[32]; + System.arraycopy(data, 0x10, rigName, 0, 32); + return new String(rigName).trim(); + } + + public static String getAudioName(byte[] data) { + byte[] audioName = new byte[32]; + System.arraycopy(data, 0x30, audioName, 0, 32); + return new String(audioName).trim(); + } + + public static byte getCivAddress(byte[] data) { + return data[0x52]; + } + + public static short getRxSupportSample(byte[] data) { + return readShortData(data, 0x53); + } + + public static short getTxSupportSample(byte[] data) { + return readShortData(data, 0x55); + } + + public static boolean getSupportTX(byte[] data) { + return data[0x57] == 0x01; + } + + } + + /** + * TOKEN(0x40)数据包。 + * 发送时,requestType=0x02是令牌确认,发送0x01是删除令牌。 + * 接收时,requestType=0x05,且requestReply=0x02&&type=0x01说明是电台令牌续订操作,这时要判断response的值。 + * response=0x00 00 00 00说明时续订成功,response=0xff ff ff ff说明时拒绝续订,此时应记录下RemoteId、 + * Token,tokRequest的值,关闭各端口,重新开始登录操作 + */ + public static class TokenPacket { + /** + public int len = TOKEN_SIZE; // 0x00 (int32) + public short type; // 0x04(int16) + public short seq; // 0x06(int16) + public int sentId; // 0x08(int32) MyID,与本地IP地址、端口有关 + public int rcvdId; // 0x0c(int32) + public byte[] unusedA = new byte[2]; // 0x10 char[2]//可能是用于指令的序号 + public short payloadSize = TOKEN_SIZE - 0x10;// 0x12(int16) 负载长度,是包长度-包头16字节 + public byte requestReply; // 0x14(int8) + public byte requestType; // 0x15(int8) + public short innerSeq; // 0x16(int16) + public byte[] unusedB = new byte[2];// 0x18(char[2] + public short tokRequest; // 0x1a(int16) + public int token; // 0x1c(int32) + public short tokRequest; // 0x20 + public byte[] unusedG = new byte[5]; // 0x22 + public short commonCap;//0x27 + public byte unusedH;//0x29 + public byte[] macAddress=new byte[6];//0x2a + public byte[] guid=new byte[16];//0x20 + public int response;//0x30 + public byte[] unusedE=new byte[12];//0x34 + */ + + /** + * 生成Token数据包 + * + * @param seq 序列号 + * @param localSID 主机的ID + * @param remoteSID 电台的ID + * @param requestType 发送0x02是令牌确认,发送0x01是删除令牌。如果接收0x05,且requestReply=0x02&&type=0x01 + * 说明是电台令牌续订成功 + * @param authInnerSendSeq 内部序列号 + * @param tokRequest 主机的TOKEN + * @param token 电台的TOKEN + * @return 数组 + */ + public static byte[] getTokenPacketData( + short seq, int localSID, int remoteSID, byte requestType + , short authInnerSendSeq, short tokRequest, int token) { + byte[] packet = new byte[TOKEN_SIZE]; + System.arraycopy(intToBigEndian(TOKEN_SIZE), 0, packet, 0, 4); //len int32 0x00 + //System.arraycopy(shortToBigEndian((short) 0), 0, packet, 4, 2);//type int16 0x04 + System.arraycopy(shortToBigEndian(seq), 0, packet, 6, 2); //seq int16 0x06 + System.arraycopy(intToBigEndian(localSID), 0, packet, 8, 4); //localId int32 0x08 + System.arraycopy(intToBigEndian(remoteSID), 0, packet, 12, 4); //remoteId int32 0x0c + //System.arraycopy({0x00,0x00}, 0, packet, 16, 2); //unusedA byte[2] 0x10 + System.arraycopy(shortToByte((short) (TOKEN_SIZE - 0x10)) + , 0, packet, 18, 2); //payloadSize int16 0x12 + packet[20] = 0x01; //requestReply byte 0x14 + packet[21] = requestType; //requestType byte 0x15 + System.arraycopy(shortToByte(authInnerSendSeq), 0, packet, 22, 2);//innerSeq int16 0x16 + //System.arraycopy(unusedB, 0, packet, 24, 2); //unusedB byte[2] 0x18 + System.arraycopy(shortToByte(tokRequest), 0, packet, 26, 2);//tokRequest int16 0x1a + System.arraycopy(intToByte(token), 0, packet, 28, 4); //token int32 0x1c + //后面其余的部分为用0填充 + return packet; + } + + public static byte[] getRenewalPacketData( + short seq, int localSID, int remoteSID + , short authInnerSendSeq, short tokRequest, int token + ) { + return getTokenPacketData(seq, localSID, remoteSID, TOKEN_TYPE_RENEWAL, authInnerSendSeq, tokRequest, token); + } + + /** + * 检查是不是令牌续订成功,条件:requestType=0x05,且requestReply=0x02&&type=0x01&&response=0x00 + * + * @param data 数据包 + * @return 是否续订成功 + */ + public static boolean TokenRenewalOK(byte[] data) { + byte requestType = data[0x15]; + byte requestReply = data[0x14]; + short type = readShortBigEndianData(data, 0x04); + int response = readIntData(data, 0x30); + return requestType == 0x05 && requestReply == 0x02 && type == 0x01 && response == 0x00; + } + + public static byte getRequestType(byte[] data) { + return data[21];//0x15 + } + + public static byte getRequestReply(byte[] data) { + return data[20];//0x14 + } + + public static int getResponse(byte[] data) { + return readIntData(data, 0x30); + } + + public static short getTokRequest(byte[] data) { + return readShortData(data, 26);//0x1a + } + + public static int getToken(byte[] data) { + return readIntData(data, 28);//0x1c + } + } + + + /** + * 登录回复包,0x60包,长度96; + */ + public static class LoginResponsePacket { + /** + public int len;// 0x00 (int32) + public short type; // 0x04(int16) + public short seq; // 0x06(int16) + public int sentId; // 0x08(int32) MyID,与本地IP地址、端口有关 + public int rcvdId; // 0x0c(int32) + public byte[] unusedA = new byte[2]; // 0x10 char[2]//可能是用于指令的序号 + public short payloadSize;// 0x12(int16) 负载长度,是包长度-包头16字节 + public byte requestReply; // 0x14(int8) + public byte requestType; // 0x15(int8) + public short innerSeq; // 0x16(int16) + public byte[] unusedB = new byte[2];// 0x18(char[2] + public short tokRequest; // 0x1a(int16) + public int token; // 0x1c(int32) + public short authStartId; // 0x20 + public byte[] unusedD = new byte[14]; // 0x22 + public int error; // 0x30 + public byte[] unusedE = new byte[12]; // 0x34 + public byte[] connection = new byte[16]; // 0x40 + public byte[] unusedF = new byte[16]; // 0x50 + */ + + public static boolean authIsOK(byte[] data) { + return readIntData(data, 0x30) == 0x00; + } + + public static int errorNum(byte[] data) { + return readIntData(data, 0x30); + } + + public static int getToken(byte[] data) { + return readIntData(data, 0x1c); + } + + public static String getConnection(byte[] data) { + byte[] connection = new byte[16]; + System.arraycopy(data, 0x40, connection, 0, 16); + return new String(connection).trim(); + } + + } + + + /** + * 登录用数据包,0x80包,长度128 + */ + public static class LoginPacket { + /** + public int len = LOGIN_SIZE; // 0x00 (int32) + public short type; // 0x04(int16) + public short seq; // 0x06(int16) + public int sentId; // 0x08(int32) MyID,与本地IP地址、端口有关 + public int rcvdId; // 0x0c(int32) + public byte[] unusedA = new byte[2]; // 0x10 char[2]//可能是用于指令的序号 + public short payloadSize = LOGIN_SIZE - 0x10;// 0x12(int16) 负载长度,是包长度-包头16字节 + public byte requestReply; // 0x14(int8) + public byte requestType; // 0x15(int8) + public short innerSeq; // 0x16(int16) + public byte[] unusedB = new byte[2];// 0x18(char[2] + public short tokRequest; // 0x1a(int16) + public int token; // 0x1c(int32) + public byte[] unusedC = new byte[32]; // 0x20(char[32]) + private byte[] userName = new byte[16]; // 0x40(char[16]) + private byte[] password = new byte[16]; // 0x50(char[16]) + private final byte[] name = new byte[16];// 0x60(char[16]) + public byte[] unusedF = new byte[16]; // 0x70(char[16]) + */ + + + /** + * 生成Login(0x80)数据包 + * + * @param seq 序号 + * @param localSID 主机ID + * @param remoteSID 电台ID + * @param authInnerSendSeq 内部序号 + * @param tokRequest 我的TOKEN + * @param userName 用户名(明文) + * @param password 密码(明文) + * @param name 终端的名称 + * @return 数据包 + */ + public static byte[] loginPacketData(short seq, int localSID, int remoteSID, short authInnerSendSeq + , short tokRequest, int token, String userName, String password, String name) { + byte[] packet = new byte[LOGIN_SIZE]; + System.arraycopy(intToBigEndian(LOGIN_SIZE), 0, packet, 0, 4); //len int32 0x00 + System.arraycopy(shortToBigEndian((short) 0), 0, packet, 4, 2);//type int16 0x04 + System.arraycopy(shortToBigEndian(seq), 0, packet, 6, 2); //seq int 16 0x06 + System.arraycopy(intToBigEndian(localSID), 0, packet, 8, 4); //localId int32 0x08 + System.arraycopy(intToBigEndian(remoteSID), 0, packet, 12, 4); //remoteId int32 0x0c + //System.arraycopy({0x00,0x00}, 0, packet, 16, 2); //unusedA byte[2] 0x10 + System.arraycopy(shortToByte((short) (LOGIN_SIZE - 0x10)) + , 0, packet, 18, 2);//payloadSize,int16,大端模式,是包长度-包头16字节 0x12 + packet[20] = 0x01;//requestReply byte 0x14 + packet[21] = 0x00;//requestType byte 0x15 + System.arraycopy(shortToByte(authInnerSendSeq), 0, packet, 22, 2);//innerSeq int16 x016 + //System.arraycopy(unusedB, 0, packet, 24, 2); //unusedB byte[2] 0x18 + System.arraycopy(shortToByte(tokRequest), 0, packet, 26, 2);//tokRequest int16 0x1a,我的token + System.arraycopy(intToByte(token), 0, packet, 28, 4);//token int32 0x1c,电台的token + //System.arraycopy(unusedC, 0, packet, 32, 32); //unusedC byte[32] 0x0x20 + System.arraycopy(passCode(userName), 0, packet, 64, 16);//userName byte[16] 0x40,用户名密文 + System.arraycopy(passCode(password), 0, packet, 80, 16);//password byte[16] 0x50,密码密文 + System.arraycopy(stringToByte(name, 16), 0, packet, 96, 16);//name byte[16] 0x60,主机的名称 + //System.arraycopy(unusedF, 0, packet, 112, 16); //unusedF byte[16] 0x70 + return packet; + } + + } + + + /** + * 用户名、密码加密算法,最长只支持到16位。 + * + * @param pass 用户名或密码 + * @return 密文,最长16位 + */ + public static byte[] passCode(String pass) { + byte[] sequence =//字典 + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0x47, 0x5d, 0x4c, 0x42, 0x66, 0x20, 0x23, 0x46, 0x4e, 0x57, 0x45, 0x3d, 0x67, 0x76, 0x60, 0x41, 0x62, 0x39, 0x59, 0x2d, 0x68, 0x7e, + 0x7c, 0x65, 0x7d, 0x49, 0x29, 0x72, 0x73, 0x78, 0x21, 0x6e, 0x5a, 0x5e, 0x4a, 0x3e, 0x71, 0x2c, 0x2a, 0x54, 0x3c, 0x3a, 0x63, 0x4f, + 0x43, 0x75, 0x27, 0x79, 0x5b, 0x35, 0x70, 0x48, 0x6b, 0x56, 0x6f, 0x34, 0x32, 0x6c, 0x30, 0x61, 0x6d, 0x7b, 0x2f, 0x4b, 0x64, 0x38, + 0x2b, 0x2e, 0x50, 0x40, 0x3f, 0x55, 0x33, 0x37, 0x25, 0x77, 0x24, 0x26, 0x74, 0x6a, 0x28, 0x53, 0x4d, 0x69, 0x22, 0x5c, 0x44, 0x31, + 0x36, 0x58, 0x3b, 0x7a, 0x51, 0x5f, 0x52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + + }; + + byte[] passBytes = pass.getBytes(); + byte[] enCodePass = new byte[16];//密文不能超过16字节 + + for (int i = 0; i < passBytes.length && i < 16; i++) { + int p = (passBytes[i] + i) & 0xff;//防止出现负数 + if (p > 126) { + p = 32 + p % 127; + } + enCodePass[i] = sequence[p]; + } + return enCodePass; + } + + /** + * 把字符串转指定长度的byte数组 + * + * @param s 字符串 + * @param len 长度 + * @return 数组 + */ + public static byte[] stringToByte(String s, int len) { + byte[] buf = new byte[len]; + byte[] temp = s.getBytes(); + for (int i = 0; i < temp.length; i++) { + if (i >= len) break; + buf[i] = temp[i]; + } + return buf; + } + + /** + * 把int转为小端模式,(高位在结尾) + * + * @param n int + * @return 数组 + */ + public static byte[] intToBigEndian(int n) { + byte[] b = new byte[4]; + b[0] = (byte) (n & 0xff); + b[1] = (byte) (n >> 8 & 0xff); + b[2] = (byte) (n >> 16 & 0xff); + b[3] = (byte) (n >> 24 & 0xff); + return b; + } + + /** + * int32转换成4字节数组 + * + * @param n int32 + * @return 数组 + */ + public static byte[] intToByte(int n) { + byte[] b = new byte[4]; + b[3] = (byte) (n & 0xff); + b[2] = (byte) (n >> 8 & 0xff); + b[1] = (byte) (n >> 16 & 0xff); + b[0] = (byte) (n >> 24 & 0xff); + return b; + } + + /** + * 从流数据中读取小端模式的Int32 + * + * @param data 流数据 + * @param start 起始点 + * @return Int32 + */ + public static int readIntBigEndianData(byte[] data, int start) { + if (data.length - start < 4) return 0; + return (int) data[start] & 0xff + | ((int) data[start + 1] & 0xff) << 8 + | ((int) data[start + 2] & 0xff) << 16 + | ((int) data[start + 3] & 0xff) << 24; + } + + public static int readIntData(byte[] data, int start) { + if (data.length - start < 4) return 0; + return (int) data[start + 3] & 0xff + | ((int) data[start + 2] & 0xff) << 8 + | ((int) data[start + 1] & 0xff) << 16 + | ((int) data[start] & 0xff) << 24; + } + + /** + * 从流数据中读取小端模式的Short + * + * @param data 流数据 + * @param start 起始点 + * @return Int16 + */ + public static short readShortBigEndianData(byte[] data, int start) { + if (data.length - start < 2) return 0; + return (short) ((short) data[start] & 0xff + | ((short) data[start + 1] & 0xff) << 8); + } + + /** + * 把字节转换成short,不做小端转换!! + * + * @param data 字节数据 + * @return short + */ + public static short readShortData(byte[] data, int start) { + if (data.length - start < 2) return 0; + return (short) ((short) data[start + 1] & 0xff + | ((short) data[start] & 0xff) << 8); + } + + /** + * 把short转为小端模式,(高位在结尾) + * + * @param n short + * @return 数组 + */ + public static byte[] shortToBigEndian(short n) { + byte[] b = new byte[2]; + b[0] = (byte) (n & 0xff); + b[1] = (byte) (n >> 8 & 0xff); + return b; + } + + /** + * 把short转成byte数组 + * + * @param n short + * @return 数组 + */ + public static byte[] shortToByte(short n) { + byte[] b = new byte[2]; + b[1] = (byte) (n & 0xff); + b[0] = (byte) (n >> 8 & 0xff); + return b; + } + + /** + * 显示16进制内容 + * + * @param data 数组 + * @return 内容 + */ + public static String byteToStr(byte[] data) { + StringBuilder s = new StringBuilder(); + for (int i = 0; i < data.length; i++) { + s.append(String.format("%02x ", data[i] & 0xff)); + } + return s.toString(); + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/icom/IComWifiRig.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/icom/IComWifiRig.java new file mode 100644 index 00000000..725b2998 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/icom/IComWifiRig.java @@ -0,0 +1,106 @@ +package com.bg7yoz.ft8cn.icom; +/** + * WIFI模式下iCom电台操作。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.media.AudioTrack; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.icom.IcomUdpBase.IcomUdpStyle; +import com.bg7yoz.ft8cn.ui.ToastMessage; + +import java.io.IOException; + +public class IComWifiRig extends WifiRig{ + + public IComWifiRig(String ip, int port, String userName, String password) { + super(ip,port,userName,password); + } + + @Override + public void start(){ + opened=true; + openAudio();//打开音频 + controlUdp=new IcomControlUdp(userName,password,ip,port); + + //设置事件,这里可以处理电台状态,和接收电台送来的音频数据 + controlUdp.setOnStreamEvents(new IcomUdpBase.OnStreamEvents() { + @Override + public void OnReceivedIAmHere(byte[] data) { + + } + + @Override + public void OnReceivedCivData(byte[] data) { + if (onDataEvents!=null){ + onDataEvents.onReceivedCivData(data); + } + } + + @Override + public void OnReceivedAudioData(byte[] audioData) { + if (onDataEvents!=null){ + onDataEvents.onReceivedWaveData(audioData); + } + if (audioTrack!=null){ + // if (!isPttOn) {//如果ptt没有按下 + audioTrack.write(audioData, 0, audioData.length + , AudioTrack.WRITE_NON_BLOCKING); + // } + } + } + + @Override + public void OnUdpSendIOException(IcomUdpStyle style,IOException e) { + ToastMessage.show(String.format(GeneralVariables.getStringFromResource( + R.string.network_exception),IcomUdpBase.getUdpStyle(style),e.getMessage())); + close(); + } + + @Override + public void OnLoginResponse(boolean authIsOK) { + if (authIsOK){ + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.login_succeed)); + }else { + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.loging_failed)); + controlUdp.closeAll(); + } + } + + }); + controlUdp.openStream();//打开端口 + controlUdp.startAreYouThereTimer();//开始连接电台 + } + + @Override + public void setPttOn(boolean on){//打开PTT + isPttOn=on; + controlUdp.civUdp.sendPttAction(on); + controlUdp.audioUdp.isPttOn=on; + } + + @Override + public void sendCivData(byte[] data){ + controlUdp.sendCivData(data); + } + + @Override + public void sendWaveData(float[] data){//发送音频数据到电台 + controlUdp.sendWaveData(data); + } + + /** + * 关闭各种连接,以及音频 + */ + @Override + public void close(){ + opened=false; + controlUdp.closeAll(); + closeAudio(); + } + + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/icom/IcomAudioUdp.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/icom/IcomAudioUdp.java new file mode 100644 index 00000000..0a46c91d --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/icom/IcomAudioUdp.java @@ -0,0 +1,105 @@ +package com.bg7yoz.ft8cn.icom; +/** + * 处理ICom的音频流,继承至AudioUdp。 + * @author BGY70Z + * @date 2023-08-26 + */ + +import android.util.Log; + +import com.bg7yoz.ft8cn.GeneralVariables; + +import java.net.DatagramPacket; +import java.util.Arrays; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.ThreadPoolExecutor; + +public class IcomAudioUdp extends AudioUdp { + private static final String TAG = "IcomAudioUdp"; + + + private final ExecutorService doTXThreadPool =Executors.newCachedThreadPool(); + private final DoTXAudioRunnable doTXAudioRunnable=new DoTXAudioRunnable(this); + + + @Override + public void sendTxAudioData(float[] audioData) { + if (audioData==null) return; + + short[] temp=new short[audioData.length]; + //传递过来的音频是LPCM,32 float,12000Hz + //iCOM的音频格式是LPCM 16 Int,12000Hz + //要做一下浮点到16位int的转换 + for (int i = 0; i < audioData.length; i++) { + float x = audioData[i]; + if (x > 1.0) + x = 1.0f; + else if (x < -1.0) + x = -1.0f; + temp[i] = (short) (x * 32767.0); + } + doTXAudioRunnable.audioData=temp; + doTXThreadPool.execute(doTXAudioRunnable); + } + private static class DoTXAudioRunnable implements Runnable{ + IcomAudioUdp icomAudioUdp; + short[] audioData;//传递过来的音频是LPCM 16bit Int,12000hz + + public DoTXAudioRunnable(IcomAudioUdp icomAudioUdp) { + this.icomAudioUdp = icomAudioUdp; + } + + @Override + public void run() { + if (audioData==null) return; + + final int partialLen = IComPacketTypes.TX_BUFFER_SIZE * 2;//数据包的长度 + //要转换一下到BYTE,小端模式 + + //byte[] data = new byte[audioData.length * 2 + partialLen * 4];//多出一点空声音放在前后各20ms*2共80ms + //先播放,是给出空的声音,for i 循环,做了一个判断,是给前面的空声音,for j循环,做得判断,是让后面发送空声音 + byte[] audioPacket = new byte[partialLen]; + for (int i = 0; i < (audioData.length / IComPacketTypes.TX_BUFFER_SIZE) + 8; i++) {//多出6个周期,前面3个,后面3个多 + if (!icomAudioUdp.isPttOn) break; + long now = System.currentTimeMillis() - 1;//获取当前时间 + + icomAudioUdp.sendTrackedPacket(IComPacketTypes.AudioPacket.getTxAudioPacket(audioPacket + , (short) 0, icomAudioUdp.localId, icomAudioUdp.remoteId, icomAudioUdp.innerSeq)); + icomAudioUdp.innerSeq++; + + Arrays.fill(audioPacket,(byte)0x00); + if (i>=3) {//让前两个空数据发送出去 + for (int j = 0; j < IComPacketTypes.TX_BUFFER_SIZE; j++) { + if ((i-3) * IComPacketTypes.TX_BUFFER_SIZE + j < audioData.length) { + System.arraycopy(IComPacketTypes.shortToBigEndian((short) + (audioData[(i-3) * IComPacketTypes.TX_BUFFER_SIZE + j] + * GeneralVariables.volumePercent))//乘以信号量的比率 + , 0, audioPacket, j * 2, 2); + } + } + } + while (icomAudioUdp.isPttOn) { + if (System.currentTimeMillis() - now >= 21) {//20毫秒一个周期 + break; + } + } + } + Log.d(TAG, "run: 音频发送完毕!!" ); + Thread.currentThread().interrupt(); + } + + } + + + @Override + public void onDataReceived(DatagramPacket packet, byte[] data) { + super.onDataReceived(packet, data); + //接收到的是12000采样率的数据 + if (!IComPacketTypes.AudioPacket.isAudioPacket(data)) return; + byte[] audioData = IComPacketTypes.AudioPacket.getAudioData(data); + if (onStreamEvents != null) { + onStreamEvents.OnReceivedAudioData(audioData); + } + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/icom/IcomCivUdp.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/icom/IcomCivUdp.java new file mode 100644 index 00000000..75fd2df0 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/icom/IcomCivUdp.java @@ -0,0 +1,110 @@ +package com.bg7yoz.ft8cn.icom; +/** + * 处理ICom的CIV流。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.util.Log; + +import com.bg7yoz.ft8cn.rigs.IcomRigConstant; + +import java.net.DatagramPacket; +import java.util.Timer; +import java.util.TimerTask; + +public class IcomCivUdp extends IcomUdpBase{ + private static final String TAG="IcomCivUdp"; + public byte civAddress=(byte)0xA4; + public boolean supportTX=true; + public short civSeq=0; + + + private Timer openCivDataTimer; + + + public IcomCivUdp() { + udpStyle=IcomUdpStyle.CivUdp; + } + + @Override + public void onDataReceived(DatagramPacket packet,byte[] data) { + super.onDataReceived(packet,data); + + if (data.length == IComPacketTypes.CONTROL_SIZE) { + if (IComPacketTypes.ControlPacket.getType(data) == IComPacketTypes.CMD_I_AM_READY) { + Log.d(TAG, "onDataReceived: civ I am ready!!"); + sendOpenClose(true);//打开连接 + startIdleTimer();//打开发送空包时钟 + startCivDataTimer();//启动civ看门狗 + + } + } else { + if (IComPacketTypes.ControlPacket.getType(data) != IComPacketTypes.CMD_PING) { + Log.d(TAG, "onDataReceived: CIV :" + IComPacketTypes.byteToStr(data)); + checkCivData(data); + } + if (IComPacketTypes.ControlPacket.getType(data) == IComPacketTypes.CMD_RETRANSMIT) { + Log.d(TAG, "onDataReceived: type=0x01"+IComPacketTypes.byteToStr(data) ); + //lastReceived=System.currentTimeMillis();//更新一下最后接收数据的时间,让watchDog处理 + } + + } + } + + public void checkCivData(byte[] data){ + if (IComPacketTypes.CivPacket.checkIsCiv(data)){ + lastReceivedTime=System.currentTimeMillis(); + if (getOnStreamEvents()!=null){ + getOnStreamEvents().OnReceivedCivData(IComPacketTypes.CivPacket.getCivData(data)); + } + } + } + + public void sendOpenClose(boolean open){ + if (open) { + sendTrackedPacket(IComPacketTypes.OpenClosePacket.toBytes((short) 0 + , localId, remoteId, civSeq,(byte) 0x04));//打开连接 + }else { + sendTrackedPacket(IComPacketTypes.OpenClosePacket.toBytes((short) 0 + , localId, remoteId, civSeq,(byte) 0x00));//关闭连接 + } + civSeq++; + } + public void startCivDataTimer(){ + stopTimer(openCivDataTimer); + Log.d(TAG, String.format("openCivDataTimer: local port:%d,remote port %d", localPort, rigPort)); + openCivDataTimer = new Timer(); + openCivDataTimer.scheduleAtFixedRate(new TimerTask() { + @Override + public void run() { + if (System.currentTimeMillis()-lastReceivedTime>2000) { + sendOpenClose(true); + } + } + }, 100, IComPacketTypes.OPEN_CLOSE_PERIOD_MS); + } + + + public void sendPttAction(boolean pttOn){ + if (pttOn) { + sendCivData(IcomRigConstant.setPTTState(0xe0, civAddress, IcomRigConstant.PTT_ON)); + }else { + sendCivData(IcomRigConstant.setPTTState(0xe0, civAddress, IcomRigConstant.PTT_OFF)); + } + } + + public void sendCivData(byte[] data){ + sendTrackedPacket(IComPacketTypes.CivPacket.setCivData((short) 0,localId,remoteId,civSeq,data)); + civSeq++; + } + + @Override + public void close() { + super.close(); + sendOpenClose(false); + stopTimer(openCivDataTimer); + stopTimer(idleTimer); + + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/icom/IcomControlUdp.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/icom/IcomControlUdp.java new file mode 100644 index 00000000..e448e408 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/icom/IcomControlUdp.java @@ -0,0 +1,59 @@ +package com.bg7yoz.ft8cn.icom; +/** + * ICom的控制流。 + * + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.util.Log; + +import java.net.DatagramPacket; +import java.util.Timer; +import java.util.TimerTask; + +public class IcomControlUdp extends ControlUdp { + private static final String TAG = "IcomControlUdp"; + + + public IcomControlUdp(String userName, String password, String remoteIp, int remotePort) { + super(userName,password,remoteIp,remotePort); + + civUdp = new IcomCivUdp(); + audioUdp = new IcomAudioUdp(); + + civUdp.rigIp = remoteIp; + audioUdp.rigIp = remoteIp; + civUdp.openStream(); + audioUdp.openStream(); + } + + + /** + * 处理电台发送过来的connInfo(0x90)数据包,电台发送0x90包有两次,第一次busy=0,第二次busy=1。 + * 在0x90数据包中取macAddress,电台名称 + * + * @param data 0x90数据包 + */ + @Override + public void onReceiveConnInfoPacket(byte[] data) { + rigMacAddress = IComPacketTypes.ConnInfoPacket.getMacAddress(data); + rigIsBusy = IComPacketTypes.ConnInfoPacket.getBusy(data); + rigName = IComPacketTypes.ConnInfoPacket.getRigName(data); + + if (!rigIsBusy) {//说明是第一次收到0x90数据包,要回复一个x090数据包 + sendTrackedPacket( + IComPacketTypes.ConnInfoPacket.connInfoPacketData(data, (short) 0 + , localId, remoteId + , (byte) 0x01, (byte) 0x03, innerSeq, localToken, rigToken + , rigName, userName + , IComPacketTypes.AUDIO_SAMPLE_RATE//接收12000采样率 + , IComPacketTypes.AUDIO_SAMPLE_RATE//发射12000采样率 + , civUdp.localPort, audioUdp.localPort + , IComPacketTypes.XIEGU_TX_BUFFER_SIZE));//0x96是wfView常用的缓冲区长度 + //, IComPacketTypes.TX_BUFFER_SIZE));//0xf0是之前测试的缓冲区长度 + innerSeq++; + } + } + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/icom/IcomSeqBuffer.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/icom/IcomSeqBuffer.java new file mode 100644 index 00000000..54ba9049 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/icom/IcomSeqBuffer.java @@ -0,0 +1,78 @@ +package com.bg7yoz.ft8cn.icom; +/** + * ICom指令数据的缓存。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import java.util.ArrayList; + +public class IcomSeqBuffer { + private long last=System.currentTimeMillis(); + + public static class SeqBufEntry { + public short seq;//序号 + public byte[] data;//数据 + public long addedAt;//添加的时间,最多保存10秒钟 + + public SeqBufEntry(short seq, byte[] data) { + this.seq = seq; + this.data = data; + addedAt = System.currentTimeMillis(); + } + } + + public ArrayList entries = new ArrayList<>(); + + /** + * 添加指令号缓存 + * + * @param seq 序号 + * @param data 指令 + */ + public synchronized void add(short seq, byte[] data) { + entries.add(new SeqBufEntry(seq, data)); + last=System.currentTimeMillis(); + purgeOldEntries();//要删除多余的历史记录 + } + + /** + * 弹出旧的指令,保证指令在缓存的限定范围内 + */ + public void purgeOldEntries() { + if (entries.size() == 0) return; + long now=System.currentTimeMillis(); + for (int i = entries.size()-1; i >=0 ; i--) {//删除超过10秒的历史记录 + if (now-entries.get(i).addedAt>IComPacketTypes.PURGE_MILLISECONDS){ + entries.remove(i); + } + } + + //while (entries.size() > MaxBufferCount) { + // entries.remove(0); + //} + } + + /** + * 按序号查找缓存中是否有历史指令 + * + * @param seqNum 序号 + * @return 指令数据,如果没有为NULL。 + */ + public synchronized byte[] get(int seqNum) { + int founded = -1; + for (int i = entries.size() - 1; i >= 0; i--) { + if (entries.get(i).seq == seqNum) { + founded = i; + } + } + if (founded != -1) { + return entries.get(founded).data; + } else { + return null; + } + } + public long getTimeOut(){ + return System.currentTimeMillis()-last; + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/icom/IcomUdpBase.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/icom/IcomUdpBase.java new file mode 100644 index 00000000..72f1ddf6 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/icom/IcomUdpBase.java @@ -0,0 +1,460 @@ +package com.bg7yoz.ft8cn.icom; +/** + * 简单封装的udp流处理。 + * + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.util.Log; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; + +import org.checkerframework.checker.units.qual.A; + +import java.io.IOException; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.SocketException; +import java.net.UnknownHostException; +import java.util.Timer; +import java.util.TimerTask; + + +public class IcomUdpBase { + public enum IcomUdpStyle {//数据流的类型 + UdpBase, + ControlUdp, + CivUdp, + AudioUdp + } + + public static String getUdpStyle(IcomUdpStyle style) { + switch (style) { + case ControlUdp: + return GeneralVariables.getStringFromResource(R.string.control_stream); + case CivUdp: + return GeneralVariables.getStringFromResource(R.string.civ_stream); + case AudioUdp: + return GeneralVariables.getStringFromResource(R.string.audio_stream); + default: + return GeneralVariables.getStringFromResource(R.string.data_stream); + } + } + + /** + * 事件接口 + */ + public interface OnStreamEvents { + void OnReceivedIAmHere(byte[] data); + + void OnReceivedCivData(byte[] data); + + void OnReceivedAudioData(byte[] audioData); + + void OnUdpSendIOException(IcomUdpStyle style, IOException e); + + void OnLoginResponse(boolean authIsOK); + //void OnWatchDogAlert(IcomUdpStyle style,boolean isAlerted); + } + + public IcomUdpStyle udpStyle = IcomUdpStyle.UdpBase; + + private static final String TAG = "IcomUdpBase"; + public int rigPort; + public String rigIp; + public int localPort; + public int localId = (int) System.currentTimeMillis();//随机码,以时间为随机变量 + public int remoteId; + public boolean authDone = false;//登录 + public boolean rigReadyDone = false;//电台已经ready,control可以执行登录,ci-v可以执行open. + public short trackedSeq = 1;//因为are you there=0,are you ready=1。从are you ready之后才发track包 + public short pingSeq = 0;//ping的起始值是0 + public short innerSeq = 0x30; + public int rigToken;//电台提供的令牌 + public short localToken = (short) System.currentTimeMillis();//本地生成的令牌,可以是随机数 + public boolean isPttOn = false; + + + public IcomSeqBuffer txSeqBuffer = new IcomSeqBuffer();//发送命令的历史列表 + //public IcomSeqBuffer rxSeqBuffer = new IcomSeqBuffer();//接收命令的历史列表 + public long lastReceivedTime = System.currentTimeMillis();//最后收到数据的时间 + public long lastSentTime = System.currentTimeMillis();//最后收到数据的时间 + + + public IcomUdpClient udpClient;//用于与电台通讯的udp + + + public OnStreamEvents onStreamEvents;//一些事件处理 + //Timer,执行代码部分:TimerTask,具体执行:timer.schedule(task,delay,period) + public Timer areYouThereTimer; + private AreYouThereTimerTask areYouThereTask = null; + public Timer pingTimer; + public Timer idleTimer;//发送空数据包的时钟 + + + public void close() { + onStreamEvents = null;//不用弹出网络异常的消息了 + sendUntrackedPacket(IComPacketTypes.ControlPacket.toBytes(IComPacketTypes.CMD_DISCONNECT + , (short) 0, localId, remoteId)); + stopTimer(areYouThereTimer); + stopTimer(pingTimer); + stopTimer(idleTimer); + closeStream(); + } + + /** + * 关闭udpClient + */ + public void closeStream() { + if (udpClient != null) { + try { + udpClient.setActivated(false); + } catch (SocketException e) { + e.printStackTrace(); + Log.e(TAG, "closeStream: " + e.getMessage()); + } + } + } + + /** + * 打开Udp流端口,如果Udp端口已经打开了,会再打开一次,本地端口应该会变化 + */ + public void openStream() {//打开 + if (udpClient == null) { + udpClient = new IcomUdpClient(-1); + } + udpClient.setOnUdpEvents(new IcomUdpClient.OnUdpEvents() { + @Override + public void OnReceiveData(DatagramSocket socket, DatagramPacket packet, byte[] data) { + //屏蔽掉非法的数据包 + if (data.length < IComPacketTypes.CONTROL_SIZE) return;//如果小于最小的控制包,退出 + if (IComPacketTypes.ControlPacket.getRcvdId(data) != localId) + return;//如果接收的ID与我的ID不同,也退出 + + onDataReceived(packet, data); + } + + @Override + public void OnUdpSendIOException(IOException e) { + if (onStreamEvents != null) { + onStreamEvents.OnUdpSendIOException(udpStyle, e); + } + } + }); + + try { + if (udpClient.isActivated()) udpClient.setActivated(false); + udpClient.setActivated(true); + localPort = udpClient.getLocalPort(); + Log.d(TAG, "IcomUdpBase: Open udp local port:" + localPort); + } catch (SocketException e) { + e.printStackTrace(); + Log.e(TAG, "IcomUdpBase: Open udp failed:" + e.getMessage()); + } + } + + /** + * 查看udp是否打开 + * @return 是否 + */ + public boolean streamOpened() { + if (udpClient == null) { + return false; + } else { + return udpClient.isActivated(); + } + } + + /** + * 当接收到数据之后的操作,后代类可以重载 + * + * @param data 数据 + */ + public void onDataReceived(DatagramPacket packet, byte[] data) { + + //此处是对共性的数据接包做处理,不是共性的,可以在后续继承的类中override. + switch (data.length) { + case IComPacketTypes.CONTROL_SIZE://控制包,处理I'm here和重新传输 + onReceivedControlPacket(data); + break; + case IComPacketTypes.PING_SIZE://ping包 + onReceivedPingPacket(data);//回复ping + break; + case IComPacketTypes.RETRANSMIT_RANGE_SIZE://0x18,请求按序号范围重新发送 + break; + + } + + //一次性处理多个重传请求:type=0x01,len!=0x10,多个重传的序号是个short数组,在0x10字节之后。 + if (data.length != IComPacketTypes.CONTROL_SIZE + && IComPacketTypes.ControlPacket.getType(data) == IComPacketTypes.CMD_RETRANSMIT) { + retransmitMultiPacket(data); + } + + //todo-接收数据,如果不是Ping包,且type=0x00&&seq!=0x00,说明是指令,考虑把指令添加到rxSeqBuffer中。 + //todo-接收指令的缓冲区是rxSeqBuffer + + } + + /** + * 当接收到Control(0x10)包 + * + * @param data 数据包 + */ + public void onReceivedControlPacket(byte[] data) { + //todo 应当实现回复type=0x01的指令,也就是retransmit + switch (IComPacketTypes.ControlPacket.getType(data)) { + case IComPacketTypes.CMD_I_AM_HERE: + if (onStreamEvents != null) { + onStreamEvents.OnReceivedIAmHere(data); + } + remoteId = IComPacketTypes.ControlPacket.getSentId(data);//记录下对方的ID + stopTimer(areYouThereTimer);//停止are you there Timer + startPingTimer();//打开Ping时钟,3个端口都有ping + //发送are you ready? + sendUntrackedPacket(IComPacketTypes.ControlPacket.toBytes( + IComPacketTypes.CMD_ARE_YOU_READY, (short) 1, localId, remoteId + )); + //在control流中启动idle timer + //如果Ping time没有启动,启动500ms,3个端口都有Ping + break; + case IComPacketTypes.CMD_I_AM_READY: + //startIdleTimer();//打开发送空包时钟 + //不同的端口处理方法不同,要在子类的override中实现 + //control 是login + //civ 是openClose + //audio 没看到 + break; + case IComPacketTypes.CMD_RETRANSMIT://说明是有一个需要重传的数据包 + retransmitPacket(data); + break; + } + + } + + /** + * 查找并重新传输单个数据包 + * + * @param data 电台发送的请求数据包 + */ + public void retransmitPacket(byte[] data) { + retransmitPacket(IComPacketTypes.ControlPacket.getSeq(data)); + } + + /** + * 查找并重新传输单个数据包 + * + * @param retransmitSeq 请求重新传输的序号 + */ + public void retransmitPacket(short retransmitSeq) { + byte[] packet = txSeqBuffer.get(retransmitSeq); + + if (packet != null) {//找到了历史发送的数据包 + sendUntrackedPacket(packet); + } else {//没有找到数据包,就发送一个空包 + sendUntrackedPacket(IComPacketTypes.ControlPacket.idlePacketData(retransmitSeq, localId, remoteId)); + } + } + + /** + * 查找并重新传输多个数据包,数据的格式是:controlPacket+short数组 + * + * @param data 电台发送的请求数据包 + */ + public void retransmitMultiPacket(byte[] data) { + if (data.length <= IComPacketTypes.CONTROL_SIZE) return; + if (IComPacketTypes.ControlPacket.getType(data) != IComPacketTypes.CMD_RETRANSMIT) return; + for (int i = 0x10; i < data.length; i = i + 2) { + if (i + 1 > data.length - 1) break;//做一个保护,如果字节数不是偶数,防止数组下标溢出 + //重新传输指令 + retransmitPacket(IComPacketTypes.readShortBigEndianData(data, i)); + } + } + + + /** + * 启动Are you there 时钟 + * 每500ms触发一次 + * Are you there包是控制包0x10包,类型 0x03 + */ + public void startAreYouThereTimer() { + Log.e(TAG, "startAreYouThereTimer: stop timer:" + this.toString()); + stopTimer(areYouThereTimer); + + areYouThereTimer = new Timer(); + + areYouThereTimer.scheduleAtFixedRate(new AreYouThereTimerTask() + , 0, IComPacketTypes.ARE_YOU_THERE_PERIOD_MS); + } + + /** + * 启动ping时钟 + */ + public void startPingTimer() { + stopTimer(pingTimer);//如果之前有打开的时钟,就关闭 + Log.d(TAG, String.format("start PingTimer: local port:%d,remote port %d", localPort, rigPort)); + pingTimer = new Timer(); + pingTimer.scheduleAtFixedRate(new PingTimerTask(), 0, IComPacketTypes.PING_PERIOD_MS); + } + + /** + * 发送空包时钟 + */ + public void startIdleTimer() { + stopTimer(idleTimer); + Log.d(TAG, String.format("start Idle Timer: local port:%d,remote port %d", localPort, rigPort)); + idleTimer = new Timer(); + idleTimer.scheduleAtFixedRate(new IdleTimerTask(), IComPacketTypes.IDLE_PERIOD_MS + , IComPacketTypes.IDLE_PERIOD_MS); + } + + /** + * 停止时钟 + * + * @param timer 时钟 + */ + public void stopTimer(Timer timer) { + if (timer != null) { + timer.cancel(); + timer.purge(); + timer = null; + } + } + + + public void onReceivedPingPacket(byte[] data) { + //两种情况,一种是电台ping我,另一个是电台回复我的Ping包 + if (IComPacketTypes.ControlPacket.getType(data) == IComPacketTypes.CMD_PING) { + if (IComPacketTypes.PingPacket.getReply(data) == 0x00) {//电台ping我 + sendReplyPingPacket(data);//回复电台Ping + } else {//回复我的ping,序号++ + if (IComPacketTypes.ControlPacket.getSeq(data) == pingSeq) { + pingSeq++; + } + } + } + } + + /** + * 发送令牌包0x40 + * @param requestType 令牌类型,0x02确认,0x05续订 + */ + public void sendTokenPacket(byte requestType) { + sendTrackedPacket(IComPacketTypes.TokenPacket.getTokenPacketData((short) 0 + , localId, remoteId, requestType, innerSeq, localToken, rigToken)); + innerSeq++; + } + + /** + * 发Ping电台数据包 + */ + public void sendPingPacket() { + byte[] data = IComPacketTypes.PingPacket.sendPingData(localId, remoteId, pingSeq); + sendUntrackedPacket(data);//因为Ping包走自己的序列,所以发送unTracked包 + //pingSeq++;要在电台回复我之后,再自增 + } + + /** + * 回复电台的ping + * + * @param data 对方的ping数据 + */ + public void sendReplyPingPacket(byte[] data) { + byte[] packet = IComPacketTypes.PingPacket.sendReplayPingData(data, localId, remoteId); + sendUntrackedPacket(packet); + } + + /** + * 发送指令数据包 + * + * @param data 数据包 + */ + public synchronized void sendUntrackedPacket(byte[] data) { + try { + udpClient.sendData(data, rigIp, rigPort); + } catch (UnknownHostException e) { + e.printStackTrace(); + } + } + + /** + * 发送tracked数据包 + * + * @param data 数据包 + */ + public synchronized void sendTrackedPacket(byte[] data) { + try { + lastSentTime = System.currentTimeMillis(); + System.arraycopy(IComPacketTypes.shortToBigEndian(trackedSeq), 0 + , data, 6, 2);//把序号写到数据列表里 + udpClient.sendData(data, rigIp, rigPort); + txSeqBuffer.add(trackedSeq, data); + trackedSeq++; + } catch (UnknownHostException e) { + e.printStackTrace(); + } + } + + public int getLocalPort() { + return localPort; + } + + /** + * 发送空数据包,是Tracked发送。此函数,一般在idleTimer中调用。放在此处,是为了方便调用。 + */ + public void sendIdlePacket() { + //seq设置为0,是因为:在sendTrackedPacket中,会把trackedSeq写到数据包中 + sendTrackedPacket(IComPacketTypes.ControlPacket.idlePacketData((short) 0, localPort, remoteId)); + } + + + public OnStreamEvents getOnStreamEvents() { + return onStreamEvents; + } + + public void setOnStreamEvents(OnStreamEvents onStreamEvents) { + this.onStreamEvents = onStreamEvents; + } + + /** + * Are you there时钟任务 + * 控制包0x10,类型0x03 + */ + public class AreYouThereTimerTask extends TimerTask { + @Override + public void run() { + Log.d(TAG, String.format("Task,AreYouThereTimer: local port:%d,remote port %d", localPort, rigPort)); + sendUntrackedPacket( + IComPacketTypes.ControlPacket.toBytes(IComPacketTypes.CMD_ARE_YOU_THERE + , (short) 0, localId, 0)); + } + } + + /** + * Ping时钟任务 + */ + public class PingTimerTask extends TimerTask { + @Override + public void run() { + sendPingPacket();//发送Ping包 + } + } + + /** + * 空指令时钟任务 + */ + public class IdleTimerTask extends TimerTask { + + @Override + public void run() { + if (txSeqBuffer.getTimeOut() > 200) {//当超过200毫秒没有发送指令,就发送一个空指令 + sendTrackedPacket( + IComPacketTypes.ControlPacket.toBytes(IComPacketTypes.CMD_NULL + , (short) 0, localId, remoteId)); + } + } + } + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/icom/IcomUdpClient.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/icom/IcomUdpClient.java new file mode 100644 index 00000000..c9485c05 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/icom/IcomUdpClient.java @@ -0,0 +1,234 @@ +package com.bg7yoz.ft8cn.icom; +/** + * 简单封装的udp协议处理 + * + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.util.Log; + +import java.io.IOException; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.SocketException; +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +public class IcomUdpClient { + private static final String TAG = "RadioUdpSocket"; + + + private final int MAX_BUFFER_SIZE = 1024 * 2; + private DatagramSocket sendSocket; + //private int remotePort; + private int localPort = -1; + private boolean activated = false; + private OnUdpEvents onUdpEvents = null; + private final ExecutorService doReceiveThreadPool = Executors.newCachedThreadPool(); + private DoReceiveRunnable doReceiveRunnable = new DoReceiveRunnable(this); + private final ExecutorService sendDataThreadPool = Executors.newCachedThreadPool(); + private SendDataRunnable sendDataRunnable = new SendDataRunnable(this); + + public IcomUdpClient() {//本地端口随机 + localPort = -1; + } + + public IcomUdpClient(int localPort) {//如果localPort==-1,本地端口随机 + this.localPort = localPort; + } + + public void sendData(byte[] data, String ip, int port) throws UnknownHostException { + if (!activated) return; + + InetAddress address = InetAddress.getByName(ip); + sendDataRunnable.address = address; + sendDataRunnable.data = data; + sendDataRunnable.port = port; + sendDataThreadPool.execute(sendDataRunnable); +// new Thread(new Runnable() { +// @Override +// public void run() { +// DatagramPacket packet = new DatagramPacket(data, data.length, address, port); +// synchronized (this) { +// try { +// sendSocket.send(packet); +// } catch (IOException e) { +// e.printStackTrace(); +// Log.e(TAG, "IComUdpClient: " + e.getMessage()); +// if (onUdpEvents!=null){ +// onUdpEvents.OnUdpSendIOException(e); +// } +// } +// } +// } +// }).start(); + } + + private static class SendDataRunnable implements Runnable { + byte[] data; + int port; + InetAddress address; + IcomUdpClient client; + + public SendDataRunnable(IcomUdpClient client) { + this.client = client; + } + + @Override + public void run() { + DatagramPacket packet = new DatagramPacket(data, data.length, address, port); + synchronized (this) { + try { + if (client.sendSocket != null) client.sendSocket.send(packet); + + } catch (IOException e) { + e.printStackTrace(); + Log.e(TAG, "IComUdpClient: " + e.getMessage()); + if (client != null) { + if (client.onUdpEvents != null) { + client.onUdpEvents.OnUdpSendIOException(e); + } + } + } + } + } + } + + public boolean isActivated() { + return activated; + } + + public synchronized void setActivated(boolean activated) throws SocketException { + this.activated = activated; + if (activated) {//通过activated判断是否结束接收线程,并清空sendSocket指针 + sendSocket = new DatagramSocket(); + //new DatagramSocket(null);//绑定的端口号随机 + sendSocket.setReuseAddress(true); + if (localPort != -1) {//绑定指定的本机端口 + sendSocket.bind(new InetSocketAddress(localPort)); + } + + //更新一下本地端口值 + localPort = sendSocket.getLocalPort(); + Log.e(TAG, "openUdpPort: " + sendSocket.getLocalPort()); + //Log.e(TAG, "openUdpIp: " + sendSocket.getLocalAddress()); + + + receiveData(); + } else { + if (sendSocket != null) { + sendSocket.close(); + try { + Thread.sleep(100); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + } + + private void receiveData() { + doReceiveThreadPool.execute(doReceiveRunnable); +// new Thread(new Runnable() { +// @Override +// public void run() { +// while (activated) { +// byte[] data = new byte[MAX_BUFFER_SIZE]; +// DatagramPacket packet = new DatagramPacket(data, data.length); +// try { +// sendSocket.receive(packet); +// if (onUdpEvents != null) { +// byte[] temp = Arrays.copyOf(packet.getData(), packet.getLength()); +// onUdpEvents.OnReceiveData(sendSocket, packet, temp); +// } +// //Log.d(TAG, "receiveData:host ip: " + packet.getAddress().getHostName()); +// } catch (IOException e) { +// e.printStackTrace(); +// Log.e(TAG, "receiveData: error:" + e.getMessage()); +// } +// +// } +// Log.e(TAG, "udpClient: is exit!"); +// sendSocket.close(); +// sendSocket = null; +// } +// }).start(); + + } + + public void setOnUdpEvents(OnUdpEvents onUdpEvents) { + this.onUdpEvents = onUdpEvents; + } + + public interface OnUdpEvents { + void OnReceiveData(DatagramSocket socket, DatagramPacket packet, byte[] data); + + void OnUdpSendIOException(IOException e); + } + + public int getLocalPort() { + if (sendSocket != null) { + return sendSocket.getLocalPort(); + } else { + return 0; + } + } + + public String getLocalIp() { + if (sendSocket != null) { + return sendSocket.getLocalAddress().toString(); + } else { + return "127.0.0.1"; + } + } + + public DatagramSocket getSendSocket() { + return sendSocket; + } + + + public static String byteToStr(byte[] data) { + StringBuilder s = new StringBuilder(); + for (int i = 0; i < data.length; i++) { + s.append(String.format("%02x ", data[i] & 0xff)); + } + return s.toString(); + } + + private static class DoReceiveRunnable implements Runnable { + IcomUdpClient icomUdpClient; + + public DoReceiveRunnable(IcomUdpClient icomUdpClient) { + this.icomUdpClient = icomUdpClient; + } + + @Override + public void run() { + while (icomUdpClient.activated) { + byte[] data = new byte[icomUdpClient.MAX_BUFFER_SIZE]; + DatagramPacket packet = new DatagramPacket(data, data.length); + try { + icomUdpClient.sendSocket.receive(packet); + if (icomUdpClient.onUdpEvents != null) { + byte[] temp = Arrays.copyOf(packet.getData(), packet.getLength()); + icomUdpClient.onUdpEvents.OnReceiveData(icomUdpClient.sendSocket, packet, temp); + } + //Log.d(TAG, "receiveData:host ip: " + packet.getAddress().getHostName()); + } catch (IOException e) { + e.printStackTrace(); + Log.e(TAG, "receiveData: error:" + e.getMessage()); + } + + } + Log.e(TAG, "udpClient: is exit!"); + icomUdpClient.sendSocket.close(); + icomUdpClient.sendSocket = null; + } + } + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/icom/WifiRig.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/icom/WifiRig.java new file mode 100644 index 00000000..68010cc8 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/icom/WifiRig.java @@ -0,0 +1,95 @@ +package com.bg7yoz.ft8cn.icom; +/** + * WIFI模式下iCom电台操作。 + * + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.media.AudioAttributes; +import android.media.AudioFormat; +import android.media.AudioTrack; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.icom.IcomUdpBase.IcomUdpStyle; +import com.bg7yoz.ft8cn.ui.ToastMessage; + +import java.io.IOException; + +public abstract class WifiRig { + public interface OnDataEvents { + void onReceivedCivData(byte[] data); + + void onReceivedWaveData(byte[] data); + } + + public ControlUdp controlUdp; + public AudioTrack audioTrack = null; + public final String ip; + public final int port; + public final String userName; + public final String password; + public boolean opened = false; + public boolean isPttOn = false; + + public OnDataEvents onDataEvents; + + + public WifiRig(String ip, int port, String userName, String password) { + this.ip = ip; + this.port = port; + this.userName = userName; + this.password = password; + } + + + public abstract void start(); + + public abstract void setPttOn(boolean on); + + public abstract void sendCivData(byte[] data); + + public abstract void sendWaveData(float[] data); + + /** + * 关闭各种连接,以及音频 + */ + public abstract void close(); + + + /** + * 打开音频,流方式。当收到音频流的时候,播放数据 + */ + public void openAudio() { + if (audioTrack != null) closeAudio(); + + AudioAttributes attributes = new AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_MEDIA) + .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) + .build(); + AudioFormat myFormat = new AudioFormat.Builder().setSampleRate(IComPacketTypes.AUDIO_SAMPLE_RATE) + .setEncoding(AudioFormat.ENCODING_PCM_16BIT) + .setChannelMask(AudioFormat.CHANNEL_OUT_MONO).build(); + int mySession = 0; + + audioTrack = new AudioTrack(attributes, myFormat + , IComPacketTypes.AUDIO_SAMPLE_RATE * 4, AudioTrack.MODE_STREAM + , mySession); + audioTrack.play(); + } + + /** + * 关闭音频 + */ + public void closeAudio() { + if (audioTrack != null) { + audioTrack.stop(); + audioTrack = null; + } + } + + public void setOnDataEvents(OnDataEvents onDataEvents) { + this.onDataEvents = onDataEvents; + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/icom/XieGuAudioUdp.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/icom/XieGuAudioUdp.java new file mode 100644 index 00000000..b0aacf5a --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/icom/XieGuAudioUdp.java @@ -0,0 +1,191 @@ +package com.bg7yoz.ft8cn.icom; +/** + * 处理协谷的音频流,继承至AudioUdp。 + * + * @author BGY70Z + * @date 2023-08-26 + */ + +import android.util.Log; + +import com.bg7yoz.ft8cn.GeneralVariables; + +import java.net.DatagramPacket; +import java.util.Arrays; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +public class XieGuAudioUdp extends AudioUdp { + private static final String TAG = "XieGuAudioUdp"; + + private final ExecutorService doTXThreadPool = Executors.newCachedThreadPool(); +// private final DoTXAudioRunnable doTXAudioRunnable = new DoTXAudioRunnable(this); + + + private final AudioRunnable audioRunnable = new AudioRunnable(this); + private boolean audioIsRunning = false; + //private DatagramPacket packet; + //private byte[] data; + + @Override + public void sendTxAudioData(float[] audioData) { + if (audioData == null) return; + + short[] temp = new short[audioData.length];//12000 + //传递过来的音频是LPCM,32 float,12000Hz + //要做一下浮点到16位int的转换 + for (int i = 0; i < audioData.length; i++) { + float x = audioData[i]; + if (x > 0.999999f) + temp[i] = 32767; + else if (x < -0.999999f) + temp[i] = -32766; + else + temp[i] = (short) (x * 32767.0); + } + + audioRunnable.setAudioData(temp); + //doTXAudioRunnable.audioData = temp; + //doTXThreadPool.execute(doTXAudioRunnable); + } + + @Override + public void startTxAudio() { + if (!audioIsRunning) { + audioIsRunning = true; + doTXThreadPool.execute(audioRunnable); + + } + } + + + @Override + public void stopTXAudio() { + audioIsRunning = false; + audioRunnable.stop(); + } + + + private static class AudioRunnable implements Runnable { + private final int partialLen = (int) (IComPacketTypes.AUDIO_SAMPLE_RATE * 0.02);//20ms的数据包的长度 + private final byte[] audioPacket = new byte[partialLen * 2]; + private final byte[] ft8Audio = new byte[15 * IComPacketTypes.AUDIO_SAMPLE_RATE * 2];//15秒,采样率*2(16位,所以2倍) + private int index = 0; + XieGuAudioUdp audioUdp; + private boolean isRunning = true; + + public AudioRunnable(XieGuAudioUdp audioUdp) { + + this.audioUdp = audioUdp; + Log.e(TAG, "AudioRunnable: create runnable"); + } + + public void setAudioData(short[] audioData) { + for (int i = 0; i < audioData.length; i++) { + System.arraycopy(IComPacketTypes.shortToBigEndian((short) + (audioData[i] + * GeneralVariables.volumePercent))//乘以信号量的比率 + , 0, ft8Audio, i * 2, 2); + } + index = 0; + + } + + @Override + public void run() { + while (isRunning) { + long now = System.currentTimeMillis() - 1;//获取当前时间 + if (audioUdp.isPttOn) { + System.arraycopy(ft8Audio, index, audioPacket, 0, audioPacket.length); + index = index + partialLen * 2; + if (index >= ft8Audio.length) index = 0; + } + + + audioUdp.sendTrackedPacket(IComPacketTypes.AudioPacket.getTxAudioPacket(audioPacket + , (short) 0, audioUdp.localId, audioUdp.remoteId, audioUdp.innerSeq)); + audioUdp.innerSeq++; + while (isRunning) { + if (System.currentTimeMillis() - now >= 21) {//20毫秒一个周期 + break; + } + } + } + } + + public void stop() { + isRunning = false; + } + } +// +// private static class DoTXAudioRunnable implements Runnable { +// XieGuAudioUdp audioUdp; +// short[] audioData;//传递过来的音频是LPCM 16bit Int,12000hz +// +// public DoTXAudioRunnable(XieGuAudioUdp audioUdp) { +// this.audioUdp = audioUdp; +// } +// +// @Override +// public void run() { +// if (audioData == null) return; +// +// final int partialLen = (int) (IComPacketTypes.AUDIO_SAMPLE_RATE * 0.02);//20ms的数据包的长度 +// +// //要转换一下到BYTE,小端模式 +// //先播放,是给出空的声音,for i 循环,做了一个判断,是给前面的空声音,for j循环,做得判断,是让后面发送空声音 +// byte[] audioPacket = new byte[partialLen * 2]; +// for (int i = 0; i < (audioData.length / partialLen) + 8; i++) {//多出6个周期,前面3个,后面3个多 +// if (!audioUdp.isPttOn) break; +// long now = System.currentTimeMillis() - 1;//获取当前时间 +// +// audioUdp.sendTrackedPacket(IComPacketTypes.AudioPacket.getTxAudioPacket(audioPacket +// , (short) 0, audioUdp.localId, audioUdp.remoteId, audioUdp.innerSeq)); +// audioUdp.innerSeq++; +// +// Arrays.fill(audioPacket, (byte) 0x00); +// if (i >= 3) {//让前两个空数据发送出去 +// for (int j = 0; j < partialLen; j++) { +// if ((i - 3) * partialLen + j < audioData.length) { +// System.arraycopy(IComPacketTypes.shortToBigEndian((short) +// (audioData[(i - 3) * partialLen + j] +// * GeneralVariables.volumePercent))//乘以信号量的比率 +// , 0, audioPacket, j * 2, 2); +// } +// } +// } +// while (audioUdp.isPttOn) { +// if (System.currentTimeMillis() - now >= 21) {//20毫秒一个周期 +// break; +// } +// } +// } +// Log.d(TAG, "run: 音频发送完毕!!"); +// Thread.currentThread().interrupt(); +// } +// +// } + + /** + * 接收到电台发过来的音频数据 + * + * @param packet 数据包 + * @param data 数据 + */ + @Override + public void onDataReceived(DatagramPacket packet, byte[] data) { + super.onDataReceived(packet, data); + if (IComPacketTypes.CONTROL_SIZE == data.length) { + if (IComPacketTypes.ControlPacket.getType(data) == IComPacketTypes.CMD_I_AM_READY) { + startTxAudio(); + } + } + if (!IComPacketTypes.AudioPacket.isAudioPacket(data)) return; + byte[] audioData = IComPacketTypes.AudioPacket.getAudioData(data); + if (onStreamEvents != null) { + onStreamEvents.OnReceivedAudioData(audioData); + } + } + + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/icom/XieGuControlUdp.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/icom/XieGuControlUdp.java new file mode 100644 index 00000000..96adcf59 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/icom/XieGuControlUdp.java @@ -0,0 +1,64 @@ +package com.bg7yoz.ft8cn.icom; +/** + * Wifi模式协谷的的控制流。 + * + * @author BGY70Z + * @date 2023-08-26 + */ + +import android.util.Log; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.ui.ToastMessage; + +import java.io.IOException; +import java.net.DatagramPacket; +import java.util.Timer; +import java.util.TimerTask; + +public class XieGuControlUdp extends ControlUdp { + private static final String TAG = "XieGuControlUdp"; + + + public XieGuControlUdp(String userName, String password, String remoteIp, int remotePort) { + super(userName,password,remoteIp,remotePort); + + + civUdp = new IcomCivUdp(); + audioUdp = new XieGuAudioUdp(); + + civUdp.rigIp = remoteIp; + audioUdp.rigIp = remoteIp; + civUdp.openStream(); + audioUdp.openStream(); + } + + /** + * 处理电台发送过来的connInfo(0x90)数据包,电台发送0x90包有两次,第一次busy=0,第二次busy=1。 + * 在0x90数据包中取macAddress,电台名称 + * + * @param data 0x90数据包 + */ + @Override + public void onReceiveConnInfoPacket(byte[] data) { + rigMacAddress = IComPacketTypes.ConnInfoPacket.getMacAddress(data); + rigIsBusy = IComPacketTypes.ConnInfoPacket.getBusy(data); + rigName = IComPacketTypes.ConnInfoPacket.getRigName(data); + + if (!rigIsBusy) {//说明是第一次收到0x90数据包,要回复一个x090数据包 + sendTrackedPacket( + IComPacketTypes.ConnInfoPacket.connInfoPacketData(data, (short) 0 + , localId, remoteId + , (byte) 0x01, (byte) 0x03, innerSeq, localToken, rigToken + , rigName, userName + , IComPacketTypes.AUDIO_SAMPLE_RATE//接收12000采样率 + , IComPacketTypes.AUDIO_SAMPLE_RATE//12000采样率 + //, IComPacketTypes.XIEGU_AUDIO_SAMPLE_RATE//48000采样率 + , civUdp.localPort, audioUdp.localPort + , IComPacketTypes.XIEGU_TX_BUFFER_SIZE)); + innerSeq++; + } + } + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/icom/XieGuWifiRig.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/icom/XieGuWifiRig.java new file mode 100644 index 00000000..9f2df920 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/icom/XieGuWifiRig.java @@ -0,0 +1,104 @@ +package com.bg7yoz.ft8cn.icom; +/** + * WIFI模式下协谷电台操作。 + * @author BGY70Z + * @date 2023-08-27 + */ + +import android.media.AudioTrack; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.icom.IcomUdpBase.IcomUdpStyle; +import com.bg7yoz.ft8cn.ui.ToastMessage; + +import java.io.IOException; + +public class XieGuWifiRig extends WifiRig{ + + public XieGuWifiRig(String ip, int port, String userName, String password) { + super(ip,port,userName,password); + } + + @Override + public void start(){ + opened=true; + openAudio();//打开音频 + controlUdp=new XieGuControlUdp(userName,password,ip,port); + + //设置事件,这里可以处理电台状态,和接收电台送来的音频数据 + controlUdp.setOnStreamEvents(new IcomUdpBase.OnStreamEvents() { + @Override + public void OnReceivedIAmHere(byte[] data) { + + } + + @Override + public void OnReceivedCivData(byte[] data) { + if (onDataEvents!=null){ + onDataEvents.onReceivedCivData(data); + } + } + + @Override + public void OnReceivedAudioData(byte[] audioData) { + if (onDataEvents!=null){ + onDataEvents.onReceivedWaveData(audioData); + } + if (audioTrack!=null){ + audioTrack.write(audioData, 0, audioData.length + , AudioTrack.WRITE_NON_BLOCKING); + } + } + + @Override + public void OnUdpSendIOException(IcomUdpStyle style,IOException e) { + ToastMessage.show(String.format(GeneralVariables.getStringFromResource( + R.string.network_exception),IcomUdpBase.getUdpStyle(style),e.getMessage())); + close(); + } + + @Override + public void OnLoginResponse(boolean authIsOK) { + if (authIsOK){ + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.login_succeed)); + }else { + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.loging_failed)); + controlUdp.closeAll(); + } + } + + }); + controlUdp.openStream();//打开端口 + controlUdp.startAreYouThereTimer();//开始连接电台 + } + + @Override + public void setPttOn(boolean on){//打开PTT + isPttOn=on; + controlUdp.civUdp.sendPttAction(on); + controlUdp.audioUdp.isPttOn=on; + } + + @Override + public void sendCivData(byte[] data){ + controlUdp.sendCivData(data); + } + + @Override + public void sendWaveData(float[] data){//发送音频数据到电台 + controlUdp.sendWaveData(data); + } + + /** + * 关闭各种连接,以及音频 + */ + @Override + public void close(){ + opened=false; + controlUdp.closeAll(); + closeAudio(); + } + + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/log/HashTable.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/log/HashTable.java new file mode 100644 index 00000000..1e8368e1 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/log/HashTable.java @@ -0,0 +1,117 @@ +package com.bg7yoz.ft8cn.log; +/** + * 用于记录SWL QSO所用的哈希表类型 ,因为要记录上方的呼号,所以要有2个String KEY,HashMap并不合适, + * 这里采用谷歌的guava:31.1-jre库 + * + * BG7YOZ + * 2023-03-20 + * + */ + +import androidx.annotation.Nullable; + +import com.google.common.collect.Table; + +import java.util.Collection; +import java.util.Map; +import java.util.Set; + +public class HashTable implements Table { + @Override + public boolean contains(@Nullable Object rowKey, @Nullable Object columnKey) { + return false; + } + + @Override + public boolean containsRow(@Nullable Object rowKey) { + return false; + } + + @Override + public boolean containsColumn(@Nullable Object columnKey) { + return false; + } + + @Override + public boolean containsValue(@Nullable Object value) { + return false; + } + + @Nullable + @Override + public @org.checkerframework.checker.nullness.qual.Nullable Object get(@Nullable Object rowKey, @Nullable Object columnKey) { + return null; + } + + @Override + public boolean isEmpty() { + return false; + } + + @Override + public int size() { + return 0; + } + + @Override + public void clear() { + + } + + @Nullable + @Override + public @org.checkerframework.checker.nullness.qual.Nullable Object put(Object rowKey, Object columnKey, Object value) { + return null; + } + + @Override + public void putAll(Table table) { + + } + + @Nullable + @Override + public @org.checkerframework.checker.nullness.qual.Nullable Object remove(@Nullable Object rowKey, @Nullable Object columnKey) { + return null; + } + + @Override + public Map row(Object rowKey) { + return null; + } + + @Override + public Map column(Object columnKey) { + return null; + } + + @Override + public Set cellSet() { + return null; + } + + @Override + public Set rowKeySet() { + return null; + } + + @Override + public Set columnKeySet() { + return null; + } + + @Override + public Collection values() { + return null; + } + + @Override + public Map rowMap() { + return null; + } + + @Override + public Map columnMap() { + return null; + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/log/ImportSharedLogs.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/log/ImportSharedLogs.java new file mode 100644 index 00000000..bfc6e855 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/log/ImportSharedLogs.java @@ -0,0 +1,163 @@ +package com.bg7yoz.ft8cn.log; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.MainViewModel; +import com.bg7yoz.ft8cn.R; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.HashMap; + +public class ImportSharedLogs { + private static final String TAG = "ImportSharedLogs"; + //private final Uri uri; + private String fileContext; + private final MainViewModel mainViewModel; + private InputStream logFileStream = null; + //private final HashMap errorLines=new HashMap<>(); + + public ImportSharedLogs(MainViewModel mainViewModel) throws IOException { + this.mainViewModel = mainViewModel; + } + + private boolean loadData(OnShareLogEvents onShareLogEvents) { + if (logFileStream != null) { + byte[] bytes = new byte[0]; + try { + bytes = new byte[logFileStream.available()]; + logFileStream.read(bytes); + fileContext = new String(bytes); + } catch (IOException e) { + if (onShareLogEvents != null) { + onShareLogEvents.onShareFailed(String.format( + GeneralVariables.getStringFromResource(R.string.import_share_failed) + , e.getMessage())); + } + return false; + } + return true; + + } else { + fileContext = ""; + return false; + } + } + + public String getLogBody() { + String[] temp = fileContext.split("[<][Ee][Oo][Hh][>]"); + if (temp.length > 1) { + return temp[temp.length - 1]; + } else { + return ""; + } + } + + /** + * 获取日志文件中全部的记录,每条记录是以HashMap保存的。HashMap的Key是字段名(大写),Value是值。 + * + * @return 记录列表。ArrayList + */ + public ArrayList> getLogRecords() { + String[] temp = getLogBody().split("[<][Ee][Oo][Rr][>]");//拆解出每个记录的原始内容 + ArrayList> records = new ArrayList<>(); + int count = 0;//解析计数器 + for (String s : temp) {//对每一个原始记录内容做拆解 + count++; + if (!s.contains("<")) { + continue; + }//说明没有标签,不做拆解 + try { + HashMap record = new HashMap<>();//创建一个记录 + String[] fields = s.split("<");//拆解记录的每一个字段 + + for (String field : fields) {//对每一个原始记录做拆解 + + if (field.length() > 1) {//如果是可拆解的 + String[] values = field.split(">");//拆解记录的字段名和值 + + if (values.length > 1) {//如果是可拆解的 + if (values[0].contains(":")) {//拆解字段名和字段的长度,冒号前的字段名,后面是长度 + String[] ttt = values[0].split(":"); + if (ttt.length > 1) { + String name = ttt[0];//字段名 + int valueLen = Integer.parseInt(ttt[1]);//字段长度 + if (valueLen > 0) { + if (values[1].length() < valueLen) { + valueLen = values[1].length() - 1; + } + String value = values[1].substring(0, valueLen);//字段值 + record.put(name.toUpperCase(), value);//保存字段,key要大写 + } + } + + } + } + } + } + records.add(record);//保存记录 + } catch (Exception e) { + //errorLines.put(count,s);//把错误的内容保存下来。 + //importTask.readErrorCount=errorLines.size(); + } + } + return records; + } + + public void doImport(InputStream logFileStream, OnShareLogEvents onShareLogEvents) { + this.logFileStream = logFileStream; + + new Thread(new Runnable() { + @Override + public void run() { + //读入数据 + if (onShareLogEvents != null) { + onShareLogEvents.onPreparing(GeneralVariables.getStringFromResource(R.string.preparing_import_logs)); + } + if (!loadData(onShareLogEvents)) { + return; + } + + int position = 0; + ArrayList> recordList = getLogRecords();//以正则表达式:[<][Ee][Oo][Rr][>]分行 + int count = recordList.size(); + + if (onShareLogEvents != null) { + onShareLogEvents.onShareStart(count, String.format( + GeneralVariables.getStringFromResource(R.string.total_logs) + , count)); + } + + + for (HashMap record : recordList) { + position++; + QSLRecord qslRecord = new QSLRecord(record); + + mainViewModel.databaseOpr.doInsertQSLData(qslRecord, null); + + if (onShareLogEvents != null) { + if (!onShareLogEvents.onShareProgress(count, position + , String.format(GeneralVariables.getStringFromResource(R.string.share_logs_been_read) + , position))) { + break; + } + } + + + } + + if (onShareLogEvents != null) { + onShareLogEvents.afterGet(count, String.format( + GeneralVariables.getStringFromResource(R.string.total_logs) + , position)); + } + + } + }).start(); + } + + + public String getFileContext() { + return fileContext; + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/log/LogCallsignAdapter.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/log/LogCallsignAdapter.java new file mode 100644 index 00000000..980842a6 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/log/LogCallsignAdapter.java @@ -0,0 +1,199 @@ +package com.bg7yoz.ft8cn.log; +/** + * 日志中通联呼号的列表 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.annotation.SuppressLint; +import android.content.Context; +import android.view.ContextMenu; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.recyclerview.widget.RecyclerView; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.MainViewModel; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.callsign.CallsignInfo; +import com.bg7yoz.ft8cn.callsign.OnAfterQueryCallsignLocation; +import com.bg7yoz.ft8cn.maidenhead.MaidenheadGrid; + +import java.util.ArrayList; + +public class LogCallsignAdapter extends RecyclerView.Adapter { + //private ArrayList callsignRecords=new ArrayList<>(); + private final MainViewModel mainViewModel; + private final Context context; + + public LogCallsignAdapter(Context context,MainViewModel mainViewModel) { + this.mainViewModel = mainViewModel; + this.context=context; + } + + @NonNull + @Override + public LogCallsignItemHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext()); + View view = layoutInflater.inflate(R.layout.log_callsign_holder_item, parent, false); + return new LogCallsignItemHolder(view); + } + + + + + /** + * 获取记录 + * @param position 位置 + * @return 记录 + */ + public QSLCallsignRecord getRecord(int position){ + return mainViewModel.callsignRecords.get(position); + } + /** + * 返回查询结题 + * @param records 记录 + */ + @SuppressLint("NotifyDataSetChanged") + public void setQSLCallsignList(ArrayList records){ + mainViewModel.callsignRecords.addAll(records); + //mainViewModel.callsignRecords=records; + notifyDataSetChanged(); + } + + /** + * 清空记录 + */ + public void clearRecords(){ + mainViewModel.callsignRecords.clear(); + } + + @SuppressLint("SetTextI18n") + @Override + public void onBindViewHolder(@NonNull LogCallsignItemHolder holder, int position) { + if ((position%2)==0){ + holder.logCallSignQSLHolderConstraintLayout.setBackgroundResource(R.drawable.calling_list_cell_0_style); + }else { + holder.logCallSignQSLHolderConstraintLayout.setBackgroundResource(R.drawable.calling_list_cell_1_style); + } + holder.record=mainViewModel.callsignRecords.get(position); + + + if (holder.record.isQSL||holder.record.isLotW_QSL){ + holder.callsignQSOIsQSLextView.setText(GeneralVariables.getStringFromResource(R.string.confirmed)); + holder.callsignQSOIsQSLextView.setTextColor(context.getResources().getColor( + R.color.is_qsl_text_color)); + }else { + holder.callsignQSOIsQSLextView.setText(GeneralVariables.getStringFromResource(R.string.unconfirmed)); + holder.callsignQSOIsQSLextView.setTextColor(context.getResources().getColor( + R.color.is_not_qsl_text_color)); + } + if (holder.record.isLotW_QSL){ + holder.isQSLModeDistTextView.setText(GeneralVariables.getStringFromResource(R.string.lotw_confirmation)); + }else if (holder.record.isQSL){ + holder.isQSLModeDistTextView.setText(GeneralVariables.getStringFromResource(R.string.manual_confirmation)); + }else { + holder.isQSLModeDistTextView.setText(""); + } + + holder.callsignLogTextView.setText(holder.record.getCallsign()); + + holder.callsignQSOLastTimeTextView.setText(String.format( + GeneralVariables.getStringFromResource(R.string.log_last_time) + ,holder.record.getLastTime())); + if (holder.record.getGrid().length()>0) { + holder.callsignQSOGridTextView.setText(String.format( + GeneralVariables.getStringFromResource(R.string.log_grid) + , holder.record.getGrid())); + }else { + holder.callsignQSOGridTextView.setText(""); + } + + holder.callsignQSLBandTextView.setText(holder.record.getBand()); + holder.callsignQSOModeTextView.setText(String.format( + GeneralVariables.getStringFromResource(R.string.log_mode) + ,holder.record.getMode())); + //计算距离 + holder.callsignQSLDistTextView.setText(MaidenheadGrid.getDistStr( + GeneralVariables.getMyMaidenheadGrid() + , holder.record.getGrid())); + + if (holder.record.where==null){ + setQueryHolderCallsign(holder); + }else {holder.callsignQSOWhereTextView.setText(holder.record.where);} + holder.callsignDxccZoneTextView.setText(holder.record.dxccStr); + } + + + //查呼号的归属地 + private void setQueryHolderCallsign(@NonNull LogCallsignAdapter.LogCallsignItemHolder holder) { + GeneralVariables.callsignDatabase.getCallsignInformation(holder.record.getCallsign() + , new OnAfterQueryCallsignLocation() { + @Override + public void doOnAfterQueryCallsignLocation(CallsignInfo callsignInfo) { + holder.callsignQSOWhereTextView.post(new Runnable() { + @SuppressLint("DefaultLocale") + @Override + public void run() { + if (GeneralVariables.isChina) { + holder.callsignQSOWhereTextView.setText(callsignInfo.CountryNameCN); + holder.record.where = callsignInfo.CountryNameCN; + }else { + holder.callsignQSOWhereTextView.setText(callsignInfo.CountryNameEn); + holder.record.where = callsignInfo.CountryNameEn; + } + holder.record.dxccStr=String.format("DXCC : %s, ITU : %d, CQZONE : %d" + ,callsignInfo.DXCC,callsignInfo.ITUZone,callsignInfo.CQZone); + holder.callsignDxccZoneTextView.setText(holder.record.dxccStr); + } + }); + } + }); + } + + + + @Override + public int getItemCount() { + return mainViewModel.callsignRecords.size(); + } + + static class LogCallsignItemHolder extends RecyclerView.ViewHolder{ + QSLCallsignRecord record; + ConstraintLayout logCallSignQSLHolderConstraintLayout; + TextView callsignLogTextView,callsignQSOLastTimeTextView,callsignQSLBandTextView + ,callsignQSOGridTextView,callsignQSOModeTextView,callsignQSLDistTextView + ,callsignQSOWhereTextView,callsignQSOIsQSLextView + ,isQSLModeDistTextView,callsignDxccZoneTextView; + public LogCallsignItemHolder(@NonNull View itemView) { + super(itemView); + logCallSignQSLHolderConstraintLayout=itemView.findViewById(R.id.logCallSignQSLHolderConstraintLayout); + callsignLogTextView=itemView.findViewById(R.id.callsignLogTextView); + callsignQSOLastTimeTextView=itemView.findViewById(R.id.callsignQSOLastTimeTextView); + callsignQSLBandTextView=itemView.findViewById(R.id.callsignQSLBandTextView); + callsignQSOGridTextView=itemView.findViewById(R.id.callsignQSOGridTextView); + callsignQSOModeTextView=itemView.findViewById(R.id.callsignQSOModeTextView); + callsignQSLDistTextView=itemView.findViewById(R.id.callsignQSLDistTextView); + callsignQSOWhereTextView=itemView.findViewById(R.id.callsignQSOWhereTextView); + callsignQSOIsQSLextView=itemView.findViewById(R.id.callsignQSOIsQSLextView); + isQSLModeDistTextView=itemView.findViewById(R.id.isQSLModeDistTextView); + callsignDxccZoneTextView=itemView.findViewById(R.id.callsignDxccZoneTextView); + + itemView.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() { + @Override + public void onCreateContextMenu(ContextMenu contextMenu, View view + , ContextMenu.ContextMenuInfo contextMenuInfo) { + view.setTag(getAdapterPosition()); + contextMenu.add(0,2,0 + ,String.format(GeneralVariables.getStringFromResource(R.string.qsl_qrz_confirmation_s) + ,record.getCallsign())).setActionView(view); + } + }); + } + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/log/LogFileImport.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/log/LogFileImport.java new file mode 100644 index 00000000..d0402032 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/log/LogFileImport.java @@ -0,0 +1,117 @@ +package com.bg7yoz.ft8cn.log; + +import android.util.Log; + +import com.bg7yoz.ft8cn.html.ImportTaskList; + +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; + +/** + * 日志文件导入。 + * 构建方法需要日志文件名,此处的文件是由NanoHTTPd的session中的post过来的。 + * getFileContext是获取全部文件内容。 + * getLogBody是获取日志文件中全部的原始记录内容,也就是全部以后面的数据 + * getLogRecords是获取拆解后的全部记录列表,记录是以HashMap方式保存的,其中HashMap的Key是字段名(大写),value是实际的值 + * + * @author BGY70Z + * @date 2023-03-20 + */ + +public class LogFileImport { + private static final String TAG = "LogFileImport"; + private final String fileContext; + private final HashMap errorLines=new HashMap<>(); + private ImportTaskList.ImportTask importTask; + + /** + * 构建函数,需要文件名,如果在读取文件时出错,会回抛异常 + * + * @param logFileName 日志文件名 + * @throws IOException 回抛异常 + */ + public LogFileImport(ImportTaskList.ImportTask task, String logFileName) throws IOException { + importTask=task; + FileInputStream logFileStream = new FileInputStream(logFileName); + byte[] bytes = new byte[logFileStream.available()]; + logFileStream.read(bytes); + fileContext = new String(bytes); + } + + /** + * 获取日志文件的全部内容 + * + * @return 全部文本 + */ + public String getFileContext() { + return fileContext; + } + + public String getLogBody() { + String[] temp = fileContext.split("[<][Ee][Oo][Hh][>]"); + if (temp.length > 1) { + return temp[temp.length - 1]; + } else { + return ""; + } + } + + /** + * 获取日志文件中全部的记录,每条记录是以HashMap保存的。HashMap的Key是字段名(大写),Value是值。 + * + * @return 记录列表。ArrayList + */ + public ArrayList> getLogRecords() { + String[] temp = getLogBody().split("[<][Ee][Oo][Rr][>]");//拆解出每个记录的原始内容 + ArrayList> records = new ArrayList<>(); + int count=0;//解析计数器 + for (String s : temp) {//对每一个原始记录内容做拆解 + count++; + if (!s.contains("<")) { + continue; + }//说明没有标签,不做拆解 + try { + HashMap record = new HashMap<>();//创建一个记录 + String[] fields = s.split("<");//拆解记录的每一个字段 + + for (String field : fields) {//对每一个原始记录做拆解 + + if (field.length() > 1) {//如果是可拆解的 + String[] values = field.split(">");//拆解记录的字段名和值 + + if (values.length > 1) {//如果是可拆解的 + if (values[0].contains(":")) {//拆解字段名和字段的长度,冒号前的字段名,后面是长度 + String[] ttt = values[0].split(":"); + if (ttt.length > 1) { + String name = ttt[0];//字段名 + int valueLen = Integer.parseInt(ttt[1]);//字段长度 + if (valueLen > 0) { + if (values[1].length() < valueLen) { + valueLen = values[1].length() - 1; + } + String value = values[1].substring(0, valueLen);//字段值 + record.put(name.toUpperCase(), value);//保存字段,key要大写 + } + } + + } + } + } + } + records.add(record);//保存记录 + }catch (Exception e){ + errorLines.put(count,s.replace("<","<"));//把错误的内容保存下来。 + importTask.readErrorCount=errorLines.size(); + } + } + return records; + } + public int getErrorCount(){ + return errorLines.size(); + } + public HashMap getErrorLines(){ + return errorLines; + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/log/LogQSLAdapter.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/log/LogQSLAdapter.java new file mode 100644 index 00000000..8e170f89 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/log/LogQSLAdapter.java @@ -0,0 +1,241 @@ +package com.bg7yoz.ft8cn.log; +/** + * 通联日志的列表。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.annotation.SuppressLint; +import android.content.Context; +import android.view.ContextMenu; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.recyclerview.widget.RecyclerView; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.MainViewModel; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.callsign.CallsignInfo; +import com.bg7yoz.ft8cn.callsign.OnAfterQueryCallsignLocation; + +import java.util.ArrayList; + +public class LogQSLAdapter extends RecyclerView.Adapter { + private ArrayList qslRecords=new ArrayList<>(); + private final MainViewModel mainViewModel; + private final Context context; + + public LogQSLAdapter(Context context, MainViewModel mainViewModel) { + this.mainViewModel = mainViewModel; + this.context = context; + } + + @NonNull + @Override + public LogQSLItemHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext()); + View view = layoutInflater.inflate(R.layout.log_qsl_holder_item, parent, false); + return new LogQSLItemHolder(view); + } + + + @SuppressLint("NotifyDataSetChanged") + public void setQSLList(ArrayList list) { + qslRecords.addAll(list); + notifyDataSetChanged(); + } + + /** + * 清空记录列表 + */ + public void clearRecords(){ + qslRecords.clear(); + } + + /** + * 删除日志 + * + * @param position 在列表中的位置 + */ + public void deleteRecord(int position) { + mainViewModel.databaseOpr.deleteQSLByID(qslRecords.get(position).id); + qslRecords.remove(position); + } + + public QSLRecordStr getRecord(int position) { + return qslRecords.get(position); + } + + /** + * 修改手工确认项 + * + * @param position 列表位置 + * @param b 状态 + */ + public void setRecordIsQSL(int position, boolean b) { + qslRecords.get(position).isQSL = b; + mainViewModel.databaseOpr.setQSLTableIsQSL(b, qslRecords.get(position).id); + + } + + @SuppressLint({"DefaultLocale", "SetTextI18n"}) + @Override + public void onBindViewHolder(@NonNull LogQSLItemHolder holder, int position) { + holder.record = qslRecords.get(position); + + if ((position % 2) == 0) { + holder.logQSLHolderConstraintLayout.setBackgroundResource(R.drawable.calling_list_cell_0_style); + } else { + holder.logQSLHolderConstraintLayout.setBackgroundResource(R.drawable.calling_list_cell_1_style); + } + holder.logQSLCallsignTextView.setText(holder.record.getCall()); + if (!holder.record.getGridsquare().equals("")) { + holder.logQSOGridTextView.setText(String.format(GeneralVariables.getStringFromResource(R.string.qsl_grid) + , holder.record.getGridsquare())); + } else { + holder.logQSOGridTextView.setText(""); + } + holder.logQSLMyCallsignTextView.setText(holder.record.getStation_callsign()); + if (!holder.record.getMy_gridsquare().equals("")) { + holder.logQSLMyGridTextView.setText(String.format(GeneralVariables.getStringFromResource(R.string.qsl_grid) + , holder.record.getMy_gridsquare())); + } else { + holder.logQSLMyGridTextView.setText(""); + } + holder.logQSOStartTimeTextView.setText(String.format(GeneralVariables.getStringFromResource(R.string.qsl_start_time) + , holder.record.getTime_on())); + holder.logQSOEndTimeTextView.setText(String.format(GeneralVariables.getStringFromResource(R.string.qsl_end_time) + , holder.record.getTime_off())); + + holder.logQSOReceiveTextView.setText(String.format(GeneralVariables.getStringFromResource(R.string.qsl_rst_rcvd) + , holder.record.getRst_rcvd().equals("-120") + ||holder.record.getRst_rcvd().equals("-100") + ?"":holder.record.getRst_rcvd())); + holder.logQSOSendTextView.setText(String.format(GeneralVariables.getStringFromResource(R.string.qsl_rst_sent) + ,holder.record.getRst_sent().equals("-120") + ||holder.record.getRst_sent().equals("-100") + ?"": holder.record.getRst_sent())); + holder.logQSLBandTextView.setText(String.format(GeneralVariables.getStringFromResource(R.string.qsl_band) + , holder.record.getBand())); + holder.logQSLFreqTextView.setText(String.format(GeneralVariables.getStringFromResource(R.string.qsl_freq) + , holder.record.getFreq())); + holder.logQSOModeTextView.setText(String.format(GeneralVariables.getStringFromResource(R.string.qsl_mode) + , holder.record.getMode())); + holder.logQSOcCommentTextView.setText(holder.record.getComment()); + + if (holder.record.isLotW_QSL) { + holder.logIsQSLTextView.setText(GeneralVariables.getStringFromResource(R.string.qsl_lotw_confirmation)); + holder.logIsQSLTextView.setTextColor(context.getResources().getColor( + R.color.is_qsl_text_color)); + } else if (holder.record.isQSL) { + holder.logIsQSLTextView.setText(GeneralVariables.getStringFromResource(R.string.qsl_manual_confirmation)); + holder.logIsQSLTextView.setTextColor(context.getResources().getColor( + R.color.is_qsl_text_color)); + + } else { + holder.logIsQSLTextView.setText(GeneralVariables.getStringFromResource(R.string.qsl_unconfirmed)); + holder.logIsQSLTextView.setTextColor(context.getResources().getColor( + R.color.is_not_qsl_text_color)); + } + + //查呼号的位置 + if (holder.record.where == null) { + setQueryHolderCallsign(holder); + } else if (holder.record.where.equals("")) { + setQueryHolderCallsign(holder); + } else { + holder.logQSLWhereTextView.setText(holder.record.where); + } + } + + //查呼号的归属地 + private void setQueryHolderCallsign(@NonNull LogQSLAdapter.LogQSLItemHolder holder) { + GeneralVariables.callsignDatabase.getCallsignInformation(holder.record.getCall() + , new OnAfterQueryCallsignLocation() { + @Override + public void doOnAfterQueryCallsignLocation(CallsignInfo callsignInfo) { + holder.logQSLWhereTextView.post(new Runnable() { + @Override + public void run() { + if (GeneralVariables.isChina) { + holder.logQSLWhereTextView.setText(callsignInfo.CountryNameCN); + holder.record.where = callsignInfo.CountryNameCN; + } else { + holder.logQSLWhereTextView.setText(callsignInfo.CountryNameEn); + holder.record.where = callsignInfo.CountryNameEn; + } + } + }); + + } + }); + } + + + @Override + public int getItemCount() { + return qslRecords.size(); + } + + public ArrayList getRecords() { + return qslRecords; + } + + static class LogQSLItemHolder extends RecyclerView.ViewHolder { + QSLRecordStr record; + ConstraintLayout logQSLHolderConstraintLayout; + TextView logQSLCallsignTextView, logQSOGridTextView, logQSOStartTimeTextView, logQSOEndTimeTextView, logQSOReceiveTextView, logQSOSendTextView, logQSLBandTextView, logQSLFreqTextView, logQSOModeTextView, logQSOcCommentTextView, logQSLMyCallsignTextView, logQSLMyGridTextView, logQSLWhereTextView, logIsQSLTextView; + + public LogQSLItemHolder(@NonNull View itemView) { + super(itemView); + logQSLHolderConstraintLayout = itemView.findViewById(R.id.logQSLHolderConstraintLayout); + logQSLCallsignTextView = itemView.findViewById(R.id.logQSLCallsignTextView); + logQSOGridTextView = itemView.findViewById(R.id.logQSOGridTextView); + logQSOStartTimeTextView = itemView.findViewById(R.id.logQSOStartTimeTextView); + logQSOEndTimeTextView = itemView.findViewById(R.id.logQSOEndTimeTextView); + logQSOReceiveTextView = itemView.findViewById(R.id.logQSOReceiveTextView); + logQSOSendTextView = itemView.findViewById(R.id.logQSOSendTextView); + logQSLBandTextView = itemView.findViewById(R.id.logQSLBandTextView); + logQSLFreqTextView = itemView.findViewById(R.id.logQSLFreqTextView); + logQSOModeTextView = itemView.findViewById(R.id.logQSOModeTextView); + logQSOcCommentTextView = itemView.findViewById(R.id.logQSOcCommentTextView); + logQSLMyCallsignTextView = itemView.findViewById(R.id.logQSLMyCallsignTextView); + logQSLMyGridTextView = itemView.findViewById(R.id.logQSLMyGridTextView); + logQSLWhereTextView = itemView.findViewById(R.id.logQSLWhereTextView); + logIsQSLTextView = itemView.findViewById(R.id.logIsQSLTextView); + + itemView.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() { + @Override + public void onCreateContextMenu(ContextMenu contextMenu, View view + , ContextMenu.ContextMenuInfo contextMenuInfo) { + view.setTag(getAdapterPosition()); + //添加菜单的参数i1:组,i2:id值,i3:显示顺序 + if (record.isQSL) { + contextMenu.add(0, 0, 0 + , String.format(GeneralVariables.getStringFromResource(R.string.qsl_cancel_confirmation) + , record.getCall())).setActionView(view); + } else { + contextMenu.add(0, 1, 0 + , String.format(GeneralVariables.getStringFromResource(R.string.qsl_manual_confirmation_s) + , record.getCall())).setActionView(view); + } + contextMenu.add(0, 2, 0 + , String.format(GeneralVariables.getStringFromResource(R.string.qsl_qrz_confirmation_s) + , record.getCall())).setActionView(view); + + if (record.getGridsquare() != null && !record.getGridsquare().equals("") + && record.getMy_gridsquare() != null && !record.getMy_gridsquare().equals("")) { + contextMenu.add(0, 3, 0 + , GeneralVariables.getStringFromResource(R.string.log_menu_location)) + .setActionView(view); + } + } + }); + } + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/log/OnQueryQSLCallsign.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/log/OnQueryQSLCallsign.java new file mode 100644 index 00000000..ea540268 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/log/OnQueryQSLCallsign.java @@ -0,0 +1,12 @@ +package com.bg7yoz.ft8cn.log; +/** + * 查询呼号日志的回调。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import java.util.ArrayList; + +public interface OnQueryQSLCallsign { + void afterQuery(ArrayList records); +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/log/OnQueryQSLRecordCallsign.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/log/OnQueryQSLRecordCallsign.java new file mode 100644 index 00000000..e24b8d94 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/log/OnQueryQSLRecordCallsign.java @@ -0,0 +1,12 @@ +package com.bg7yoz.ft8cn.log; +/** + * 查询通联日志的回调。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import java.util.ArrayList; + +public interface OnQueryQSLRecordCallsign { + void afterQuery(ArrayList records); +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/log/OnShareLogEvents.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/log/OnShareLogEvents.java new file mode 100644 index 00000000..20734ae8 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/log/OnShareLogEvents.java @@ -0,0 +1,13 @@ +package com.bg7yoz.ft8cn.log; + +import java.io.File; + +public interface OnShareLogEvents { + void onPreparing(String info); + void onShareStart(int count, String info); + + boolean onShareProgress(int count, int position, String info); + + void afterGet(int count, String info); + void onShareFailed(String info); +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/log/QSLCallsignRecord.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/log/QSLCallsignRecord.java new file mode 100644 index 00000000..7c0b466c --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/log/QSLCallsignRecord.java @@ -0,0 +1,80 @@ +package com.bg7yoz.ft8cn.log; + +/** + * 通联过的呼号的日志。 + * @author BGY70Z + * @date 2023-03-20 + */ +public class QSLCallsignRecord { + private String callsign; + private String mode; + private String grid; + private String band; + private String lastTime; + public String where=null; + public String dxccStr=""; + public boolean isQSL=false;//是否手工确认 + public boolean isLotW_QSL = false;//是否是lotw确认的 + + public String getCallsign() { + return callsign; + } + + public void setCallsign(String callsign) { + if (callsign!=null) { + this.callsign = callsign; + }else { + this.callsign=""; + } + } + + public String getLastTime() { + return lastTime; + } + + public void setLastTime(String lastTime) { + if (lastTime!=null) { + this.lastTime = lastTime; + }else { + this.lastTime=""; + } + } + + + + public String getMode() { + return mode; + } + + public void setMode(String mode) { + if (mode!=null) { + this.mode = mode; + }else { + this.mode=""; + } + } + + public String getGrid() { + return grid; + } + + public void setGrid(String grid) { + if (grid!=null) { + this.grid = grid; + }else { + this.grid=""; + } + } + + public String getBand() { + return band; + } + + public void setBand(String band) { + if (band!=null) { + this.band = band; + }else { + this.band=""; + } + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/log/QSLRecord.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/log/QSLRecord.java new file mode 100644 index 00000000..974690c9 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/log/QSLRecord.java @@ -0,0 +1,386 @@ +package com.bg7yoz.ft8cn.log; + +import android.util.Log; + +import com.bg7yoz.ft8cn.Ft8Message; +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.maidenhead.MaidenheadGrid; +import com.bg7yoz.ft8cn.rigs.BaseRigOperation; +import com.bg7yoz.ft8cn.timer.UtcTimer; + +import java.util.HashMap; +import java.util.Objects; + +/** + * 用于记录通联成功信息的类。通联成功是指FT8完成6条消息的通联。并不是互认。 + * isLotW_import是指是否是外部的数据导入,因为用户可能使用了JTDX等软件通联,这样可以把通联的结果导入到FT8CN + * isLotW_QSL是指是否被平台确认。 + * isQSL是指是否被手工确认 + * + * @author BGY70Z + * @date 2023-03-20 + */ +public class QSLRecord { + private static final String TAG = "QSLRecord"; + public long id = -1; + //private long startTime;//起始时间 + private String qso_date; + private String time_on; + private String qso_date_off; + private String time_off; + //private long endTime;//结束时间 + + private final String myCallsign;//我的呼号 + private String myMaidenGrid;//我的网格 + private String toCallsign;//对方的呼号 + private String toMaidenGrid;//对方的网格 + private int sendReport;//对方收到我的报告(也就是我发送的信号强度) + private int receivedReport;//我收到对方的报告(也就是SNR) + private String mode = "FT8"; + private String bandLength = ""; + private long bandFreq;//发射的波段 + private int wavFrequency;//发射的频率 + private String comment; + public boolean isQSL = false;//手工确认 + public boolean isLotW_import = false;//是否是从外部数据导入的,此项需要在数据库中比对才能设定 + public boolean isLotW_QSL = false;//是否是lotw确认的 + + public boolean saved = false;//是否被保存到数据库中 + + public boolean isInvalid=false;//是否解析出错 + public String errorMSG="";//如果解析出错,错误的消息 + + /** + * 用于SWL QSO记录,记录SWL QSO的条件是收听到双方的信号报告 + * + * @param msg FT8消息 + */ + public QSLRecord(Ft8Message msg) { + this.qso_date_off = UtcTimer.getYYYYMMDD(msg.utcTime); + this.time_off = UtcTimer.getTimeHHMMSS(msg.utcTime); + this.myCallsign = msg.callsignFrom; + this.toCallsign = msg.callsignTo; + wavFrequency = Math.round(msg.freq_hz); + sendReport = -100; + receivedReport = -100; + bandLength = BaseRigOperation.getMeterFromFreq(GeneralVariables.band);//获取波长 + bandFreq = GeneralVariables.band; + comment = "SWL By FT8CN"; + } + + /** + * 构建通联成功的对象 + * + * @param startTime 起始时间 + * @param endTime 结束时间 + * @param myCallsign 我的呼号 + * @param myMaidenGrid 我的网格 + * @param toCallsign 对方呼号 + * @param toMaidenGrid 对方网格 + * @param sendReport 发送的报告 + * @param receivedReport 接收的报告 + * @param mode 模式 默认FT8 + * @param bandFreq 载波频率 + * @param wavFrequency 声音频率 + */ + public QSLRecord(long startTime, long endTime, String myCallsign, String myMaidenGrid + , String toCallsign, String toMaidenGrid, int sendReport, int receivedReport + , String mode, long bandFreq, int wavFrequency) { + //this.startTime = startTime; + this.qso_date = UtcTimer.getYYYYMMDD(startTime); + this.time_on = UtcTimer.getTimeHHMMSS(startTime); + this.qso_date_off = UtcTimer.getYYYYMMDD(endTime); + this.time_off = UtcTimer.getTimeHHMMSS(endTime); + this.myCallsign = myCallsign; + this.myMaidenGrid = myMaidenGrid; + this.toCallsign = toCallsign; + this.toMaidenGrid = toMaidenGrid; + this.sendReport = sendReport; + this.receivedReport = receivedReport; + this.mode = mode; + this.bandLength = BaseRigOperation.getMeterFromFreq(bandFreq);//获取波长 + this.bandFreq = bandFreq; + this.wavFrequency = wavFrequency; + String distance = ""; + if (!myMaidenGrid.equals("") && !toMaidenGrid.equals("")) { + distance = MaidenheadGrid.getDistStrEN(myMaidenGrid, toMaidenGrid); + } + this.comment = + distance.equals("") ? "QSO by FT8CN" + : String.format("Distance: %s, QSO by FT8CN", distance); + } + + public void update(QSLRecord record) { + this.qso_date_off = record.qso_date_off; + this.time_off = record.time_off; + this.toMaidenGrid = record.toMaidenGrid; + this.sendReport = record.sendReport; + this.receivedReport = record.receivedReport; + } + + public QSLRecord(HashMap map) { + isLotW_import = true;//说明是外部导入的数据 + if (map.containsKey("CALL")) {//对方呼号 + toCallsign = map.get("CALL"); + } + if (map.containsKey("STATION_CALLSIGN")) {//我的呼号 + myCallsign = map.get("STATION_CALLSIGN"); + } else { + myCallsign = ""; + } + if (map.containsKey("BAND")) {//载波波长 + bandLength = map.get("BAND"); + } else { + bandLength = ""; + } + + if (map.containsKey("FREQ")) {//载波频率 + try {//要把float转成Long + float freq = Float.parseFloat(Objects.requireNonNull(map.get("FREQ"))); + bandFreq = Math.round(freq * 1000000); + } catch (NumberFormatException e) { + isInvalid=true; + errorMSG="freq:"+e.getMessage(); + e.printStackTrace(); + Log.e(TAG, "QSLRecord: freq" + e.getMessage()); + } + } + if (map.containsKey("MODE")) {//模式 + mode = map.get("MODE"); + } else { + mode = ""; + } + if (map.containsKey("QSO_DATE")) {//通联日期 + qso_date = map.get("QSO_DATE"); + } else { + qso_date = ""; + } + if (map.containsKey("TIME_ON")) {//通联起始时间 + time_on = map.get("TIME_ON"); + } else { + time_on = ""; + } + if (map.containsKey("QSO_DATE_OFF")) {//通联结束日期,此字段只在JTDX中有。 + qso_date_off = map.get("QSO_DATE_OFF"); + } else { + qso_date_off = qso_date; + } + if (map.containsKey("TIME_OFF")) {//通联结束时间,n1mm、Log32、JTDX有,Lotw没有 + time_off = map.get("TIME_OFF"); + } else { + time_off = ""; + } + if (map.containsKey("QSL_RCVD")) {//通联互认,lotw中有。 + isLotW_QSL = Objects.requireNonNull(map.get("QSL_RCVD")).equalsIgnoreCase("Y"); + } + if (map.containsKey("LOTW_QSL_RCVD")) {//通联互认,log32中有。 + isLotW_QSL = Objects.requireNonNull(map.get("LOTW_QSL_RCVD")).equalsIgnoreCase("Y"); + } + if (map.containsKey("QSL_MANUAL")) {//通联互认,lotw中有。 + isQSL = Objects.requireNonNull(map.get("QSL_MANUAL")).equalsIgnoreCase("Y"); + } + + if (map.containsKey("MY_GRIDSQUARE")) {//我的网格(lotw,log32有,lotw根据设置不同,也可能没有)N1MM没有网格 + myMaidenGrid = map.get("MY_GRIDSQUARE"); + } else { + myMaidenGrid = ""; + } + + if (map.containsKey("GRIDSQUARE")) {//对方的网格(lotw,log32有,lotw根据设置不同,也可能没有)N1MM没有网格 + toMaidenGrid = map.get("GRIDSQUARE"); + } else { + toMaidenGrid = ""; + } + + + if (map.containsKey("RST_RCVD")) {//接收到的报告。信号报告n1mm,log32,jtdx有,Lotw没有 + try {//要把float转成Long + receivedReport = Integer.parseInt(Objects.requireNonNull(map.get("RST_RCVD").trim())); + } catch (NumberFormatException e) { + isInvalid=true; + errorMSG="RST_RCVD:"+e.getMessage(); + e.printStackTrace(); + Log.e(TAG, "QSLRecord: RST_RCVD:" + e.getMessage()); + } + } else { + receivedReport = -120; + } + + if (map.containsKey("RST_SENT")) {//接收到的报告。信号报告n1mm,log32,jtdx有,Lotw没有 + try {//要把float转成Long + sendReport = Integer.parseInt(Objects.requireNonNull(map.get("RST_SENT").trim())); + } catch (NumberFormatException e) { + isInvalid=true; + errorMSG="RST_SENT:"+e.getMessage(); + e.printStackTrace(); + Log.e(TAG, "QSLRecord: RST_SENT:" + e.getMessage()); + } + } else { + sendReport = -120; + } + if (map.containsKey("COMMENT")) {//注释,JTDX中有 + comment = map.get("COMMENT"); + } else { + comment = String.format(GeneralVariables.getStringFromResource(R.string.qsl_record_import_time) + , UtcTimer.getDatetimeStr(UtcTimer.getSystemTime())); + } + + + } + + /** + * SWL QSO的提示 + * + * @return 提示 + */ + public String swlQSOInfo() { + return String.format("QSO of SWL:%s<--%s", toCallsign, myCallsign); + } + + @Override + public String toString() { + return "QSLRecord{" + + "id=" + id + + ", qso_date='" + qso_date + '\'' + + ", time_on='" + time_on + '\'' + + ", qso_date_off='" + qso_date_off + '\'' + + ", time_off='" + time_off + '\'' + + ", myCallsign='" + myCallsign + '\'' + + ", myMaidenGrid='" + myMaidenGrid + '\'' + + ", toCallsign='" + toCallsign + '\'' + + ", toMaidenGrid='" + toMaidenGrid + '\'' + + ", sendReport=" + sendReport + + ", receivedReport=" + receivedReport + + ", mode='" + mode + '\'' + + ", bandLength='" + bandLength + '\'' + + ", bandFreq=" + bandFreq + + ", wavFrequency=" + wavFrequency + + ", isQSL=" + isQSL + + ", isLotW_import=" + isLotW_import + + ", isLotW_QSL=" + isLotW_QSL + + ", saved=" + saved + + ", comment='" + comment + '\'' + + '}'; + } + + public String toHtmlString() { + String ss = saved ? ", saved=true" : ", saved=false"; + return "QSLRecord{" + + "id=" + id + + ", qso_date='" + qso_date + '\'' + + ", time_on='" + time_on + '\'' + + ", qso_date_off='" + qso_date_off + '\'' + + ", time_off='" + time_off + '\'' + + ", myCallsign='" + myCallsign + '\'' + + ", myMaidenGrid='" + myMaidenGrid + '\'' + + ", toCallsign='" + toCallsign + '\'' + + ", toMaidenGrid='" + toMaidenGrid + '\'' + + ", sendReport=" + sendReport + + ", receivedReport=" + receivedReport + + ", mode='" + mode + '\'' + + ", bandLength='" + bandLength + '\'' + + ", bandFreq=" + bandFreq + + ", wavFrequency=" + wavFrequency + + ", isQSL=" + isQSL + + ", isLotW_import=" + isLotW_import + + ", isLotW_QSL=" + isLotW_QSL + + ss + + ", comment='" + comment + '\'' + + '}'; + } + + public String getBandLength() { + return bandLength; + } + + public String getToCallsign() { + return toCallsign; + } + + public String getToMaidenGrid() { + return toMaidenGrid; + } + + public String getMode() { + return mode; + } + + public long getBandFreq() { + return bandFreq; + } + + public int getWavFrequency() { + return wavFrequency; + } + + + public String getMyCallsign() { + return myCallsign; + } + + public String getMyMaidenGrid() { + return myMaidenGrid; + } + + public void setMyMaidenGrid(String myMaidenGrid) { + this.myMaidenGrid = myMaidenGrid; + } + + public int getSendReport() { + return sendReport; + } + + public int getReceivedReport() { + return receivedReport; + } + + public String getQso_date() { + return qso_date; + } + + public String getTime_on() { + return time_on; + } + + public String getQso_date_off() { + return qso_date_off; + } + + public String getTime_off() { + return time_off; + } + + public String getStartTime() { + return qso_date + "-" + time_on; + } + + public String getEndTime() { + return qso_date_off + "-" + time_off; + } + + public String getComment() { + return comment; + } + + + public void setToMaidenGrid(String toMaidenGrid) { + this.toMaidenGrid = toMaidenGrid; + } + + public void setSendReport(int sendReport) { + this.sendReport = sendReport; + } + + public void setReceivedReport(int receivedReport) { + this.receivedReport = receivedReport; + } + + public void setQso_date(String qso_date) { + this.qso_date = qso_date; + } + + public void setTime_on(String time_on) { + this.time_on = time_on; + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/log/QSLRecordStr.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/log/QSLRecordStr.java new file mode 100644 index 00000000..42e74fd0 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/log/QSLRecordStr.java @@ -0,0 +1,180 @@ +package com.bg7yoz.ft8cn.log; + +import android.os.Parcel; +import android.os.Parcelable; + +import com.bg7yoz.ft8cn.Ft8Message; + +import java.io.Serializable; + +/** + * 用于在ADAPTER中显示内容,此数据在数据库的查询中生成 + * @author BGY70Z + * @date 2023-03-20 + */ +public class QSLRecordStr implements Serializable { + public int id; + private String call=""; + private String gridsquare=""; + private String mode=""; + private String rst_sent=""; + private String rst_rcvd=""; + private String time_on="";//此时间包括日期(QSO_DATE+TIME_ON组成) + private String time_off="";//此时间包括日期(QSO_DATE_OFF+TIME_OFF组成) + private String band="";//波长 + private String freq=""; + private String station_callsign=""; + private String my_gridsquare=""; + private String comment; + public String where = null; + public boolean isQSL = false;//手工确认 + public boolean isLotW_import = false;//是否是lotw导入的 + public boolean isLotW_QSL = false;//是否是lotw确认的 + + + public String getCall() { + return call; + } + + public void setCall(String call) { + if (call!=null) { + this.call = call; + }else { + this.call=""; + } + } + + public String getGridsquare() { + return gridsquare; + } + + public void setGridsquare(String gridsquare) { + if (gridsquare!=null) { + this.gridsquare = gridsquare; + }else { + this.gridsquare=""; + } + } + + public String getMode() { + return mode; + } + + public void setMode(String mode) { + if (mode!=null) { + this.mode = mode; + }else { + this.mode=""; + } + } + + public String getRst_sent() { + return rst_sent; + } + + public void setRst_sent(String rst_sent) { + if (rst_sent!=null) { + this.rst_sent = rst_sent; + }else { + this.rst_sent=""; + } + } + + public String getRst_rcvd() { + return rst_rcvd; + } + + public void setRst_rcvd(String rst_rcvd) { + if (rst_rcvd!=null) { + this.rst_rcvd = rst_rcvd; + }else { + this.rst_rcvd=""; + } + } + + public String getTime_on() { + return time_on; + } + + public void setTime_on(String time_on) { + if (time_on!=null) { + this.time_on = time_on; + }else { + this.time_on=""; + } + } + + public String getTime_off() { + return time_off; + } + + public void setTime_off(String time_off) { + if (time_off!=null) { + this.time_off = time_off; + }else { + this.time_off=""; + } + } + + public String getBand() { + return band; + } + + public void setBand(String band) { + if (band!=null) { + this.band = band; + }else { + this.band=""; + } + } + + public String getFreq() { + return freq; + } + + public void setFreq(String freq) { + if (freq!=null) { + this.freq = freq; + }else { + this.freq=""; + } + } + + public String getStation_callsign() { + return station_callsign; + } + + public void setStation_callsign(String station_callsign) { + if (station_callsign!=null) { + this.station_callsign = station_callsign; + }else { + this.station_callsign=""; + } + } + + public String getMy_gridsquare() { + return my_gridsquare; + } + + public void setMy_gridsquare(String my_gridsquare) { + if (my_gridsquare!=null) { + this.my_gridsquare = my_gridsquare; + }else { + this.my_gridsquare=""; + } + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + if (comment!=null) { + this.comment = comment; + }else { + this.comment=""; + } + } + + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/log/SWLQsoList.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/log/SWLQsoList.java new file mode 100644 index 00000000..89c6ada8 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/log/SWLQsoList.java @@ -0,0 +1,165 @@ +package com.bg7yoz.ft8cn.log; + +import com.bg7yoz.ft8cn.Ft8Message; +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.timer.UtcTimer; + +import java.util.ArrayList; + +/** + * 用于计算和处理SWL消息中的QSO记录。 + * QSO的计算方法:把FT8通联的6个阶段分成3部分: + * 1.CQ C1 grid + * 2.C1 C2 grid + * ---------第一部分--- + * 3.C2 C1 report + * 4.C1 C2 r-report + * --------第二部分---- + * 5.C2 C1 RR73(RRR) + * 6.C1 C2 73 + * --------第三部分---- + *

+ * 一个基本的QSO,必须有自己的结束点(第三部分),双方的信号报告(在第二部分判断),网格报告可有可无(第一部分) + * 以RR73、RRR、73为检查点,符合以上第一、二部分 + * swlQsoList是个双key的HashMap,用于防止重复记录QSO。 + * C1与C2顺序不同,代表不同的呼叫方。体现在station_callsign和call字段上 + * + * @author BG7YOZ + * @date 2023-03-07 + */ +public class SWLQsoList { + private static final String TAG = "SWLQsoList"; + //通联成功的列表,防止重复,两个KEY顺序分别是:station_callsign和call,Boolean=true,已经QSO + private final HashTable qsoList =new HashTable(); + + public SWLQsoList() { + } + + /** + * 检查有没有QSO消息 + * + * @param newMessages 新的FT8消息 + * @param allMessages 全部的FT8消息 + * @param onFoundSwlQso 当有发现的回调 + */ + public void findSwlQso(ArrayList newMessages, ArrayList allMessages + , OnFoundSwlQso onFoundSwlQso) { + + for (int i = 0; i < newMessages.size(); i++) { + Ft8Message msg = newMessages.get(i); + if (msg.inMyCall()) continue;//对包含我自己的消息不处理 + + if (GeneralVariables.checkFun4_5(msg.extraInfo)//结束标识RRR、RR73、73 + && !qsoList.contains(msg.callsignFrom, msg.callsignTo)) {//没有QSO记录 + + QSLRecord qslRecord = new QSLRecord(msg); + + if (checkPart2(allMessages, qslRecord)) {//找双方的信号报告,一个基本的QSO,必须有双方的信号报告 + + checkPart1(allMessages, qslRecord);//找双方的网格报告,顺便更新time_on的时间 + + if (onFoundSwlQso != null) {//触发回调,用于记录到数据库 + qsoList.put(msg.callsignFrom, msg.callsignTo, true);//把QSO记录保存下来 + onFoundSwlQso.doFound(qslRecord);//触发找到QSO的动作 + } + } + } + } + } + + /** + * 查第2部分是否存在,顺便把信号报告保存到QSLRecord中 + * + * @param allMessages 消息列表 + * @param record QSLRecord + * @return 返回值 没有发现:0,存在:2 + */ + private boolean checkPart2(ArrayList allMessages, QSLRecord record) { + boolean foundFromReport = false; + boolean foundToReport = false; + long time_on = System.currentTimeMillis();//先把当前的时间作为最早时间 + for (int i = allMessages.size() - 1; i >= 0; i--) { + Ft8Message msg = allMessages.get(i); + //if (msg.callsignFrom.equals(record.getMyCallsign()) + if (GeneralVariables.checkIsMyCallsign(msg.callsignFrom) + && msg.callsignTo.equals(record.getToCallsign()) + && !foundFromReport) {//callsignFrom发出的信号报告 + int report = GeneralVariables.checkFun2_3(msg.extraInfo); + + if (time_on > msg.utcTime) time_on = msg.utcTime;//取最早的时间 + if (report != -100) { + record.setSendReport(report); + foundFromReport = true; + } + } + + if (msg.callsignFrom.equals(record.getToCallsign()) + //&& msg.callsignTo.equals(record.getMyCallsign()) + && GeneralVariables.checkIsMyCallsign(msg.callsignTo) + && !foundToReport) {//callsignTo发出的信号报告 + int report = GeneralVariables.checkFun2_3(msg.extraInfo); + if (time_on > msg.utcTime) time_on = msg.utcTime;//取最早的时间 + if (report != -100) { + record.setReceivedReport(report); + foundToReport = true; + } + } + if (foundToReport && foundFromReport) {//如果双方的信号报告都找到了,就退出循环 + record.setQso_date(UtcTimer.getYYYYMMDD(time_on)); + record.setTime_on(UtcTimer.getTimeHHMMSS(time_on)); + break; + } + } + return foundToReport && foundFromReport;//双方的信号报告都有,才算一个QSO + } + + /** + * 查第2部分是否存在,顺便把网格报告保存到QSLRecord中 + * + * @param allMessages 消息列表 + * @param record QSLRecord + */ + private void checkPart1(ArrayList allMessages, QSLRecord record) { + boolean foundFromGrid = false; + boolean foundToGrid = false; + long time_on = System.currentTimeMillis();//先把当前的时间作为最早时间 + for (int i = allMessages.size() - 1; i >= 0; i--) { + Ft8Message msg = allMessages.get(i); + if (!foundFromGrid + //&& msg.callsignFrom.equals(record.getMyCallsign()) + && GeneralVariables.checkIsMyCallsign(msg.callsignFrom) + && (msg.callsignTo.equals(record.getToCallsign()) || msg.checkIsCQ())) {//callsignFrom的网格报告 + + if (GeneralVariables.checkFun1_6(msg.extraInfo)) { + record.setMyMaidenGrid(msg.extraInfo.trim()); + foundFromGrid = true; + } + if (time_on > msg.utcTime) time_on = msg.utcTime;//取最早的时间 + } + + if (!foundToGrid + && msg.callsignFrom.equals(record.getToCallsign()) + //&& (msg.callsignTo.equals(record.getMyCallsign()) + && (GeneralVariables.checkIsMyCallsign(msg.callsignTo) + || msg.checkIsCQ())) {//callsignTo发出的信号报告 + if (GeneralVariables.checkFun1_6(msg.extraInfo)) { + record.setToMaidenGrid(msg.extraInfo.trim()); + foundToGrid = true; + } + if (time_on > msg.utcTime) time_on = msg.utcTime;//取最早的时间 + } + if (foundToGrid && foundFromGrid) {//如果双方的信号报告都找到了,就退出循环 + break; + } + } + + if (foundFromGrid || foundToGrid) {//发现网格报告,至少一个方向的 + record.setQso_date(UtcTimer.getYYYYMMDD(time_on)); + record.setTime_on(UtcTimer.getTimeHHMMSS(time_on)); + } + } + + public interface OnFoundSwlQso { + void doFound(QSLRecord record); + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/log/ShareLogs.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/log/ShareLogs.java new file mode 100644 index 00000000..63b47b47 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/log/ShareLogs.java @@ -0,0 +1,301 @@ +package com.bg7yoz.ft8cn.log; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.Intent; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.net.Uri; +import android.util.Log; + +import androidx.core.content.FileProvider; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.ui.ToastMessage; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; + +public class ShareLogs { + private static final String TAG = "ShareLogs"; + private boolean isCancel=false; + + private String makeSQL(int queryFilter) { + String filterStr; + switch (queryFilter) { + case 1: + filterStr = "and((q.isQSL =1)or(q.isLotW_QSL =1))\n"; + break; + case 2: + filterStr = "and((q.isQSL =0)and(q.isLotW_QSL =0))\n"; + break; + default: + filterStr = ""; + } + return " FROM QSLTable AS q \n" + + "WHERE ((CALL LIKE ?)OR(station_callsign LIKE ?))\n" + + filterStr; + + } + + + @SuppressLint("Range") + private int getCount(SQLiteDatabase db, String queryKey, int queryFilter) { + String sql = makeSQL(queryFilter); + String key = "%" + queryKey + "%"; + Cursor cursor = db.rawQuery("SELECT COUNT(*) AS C " + sql, new String[]{key, key}); + cursor.moveToFirst(); + int count = cursor.getInt(cursor.getColumnIndex("C")); + + cursor.close(); + return count; + } + + private Cursor getData(SQLiteDatabase db, String queryKey, int queryFilter) { + String sql = makeSQL(queryFilter); + String key = "%" + queryKey + "%"; + return db.rawQuery("SELECT * " + sql, new String[]{key, key}); + } + + /** + * 把日志数据写入到文件中,用于分享等处理 + * + * @param db 数据库 + * @param queryKey 关键词 + * @param queryFilter 过滤条件 + * @param adiFile 临时文件 + * @param isSWL 是否是swl模式 + * @param onGetShareLogs 回调 + */ + @SuppressLint({"DefaultLocale", "Range"}) + private void downQSLTableToFile(SQLiteDatabase db, String queryKey, int queryFilter, File adiFile + , boolean isSWL + , OnShareLogEvents onGetShareLogs) { + final int count = getCount(db, queryKey, queryFilter); + + if (onGetShareLogs != null) { + onGetShareLogs.onShareStart(count, String.format( + GeneralVariables.getStringFromResource(R.string.total_logs) + , count)); + } + Cursor cursor = getData(db, queryKey, queryFilter); + FileOutputStream fileOutputStream = null; + int position = 0; + try { + fileOutputStream = new FileOutputStream(adiFile, true); + fileOutputStream.write("FT8CN ADIF Export\n".getBytes()); + cursor.moveToPosition(-1); + while (cursor.moveToNext()) { + position++; + if (onGetShareLogs != null) { + if (!onGetShareLogs.onShareProgress(count, position + , String.format(GeneralVariables.getStringFromResource(R.string.get_log_no) + , position))){ + break; + }; + } + fileOutputStream.write(String.format("%s " + , cursor.getString(cursor.getColumnIndex("call")).length() + , cursor.getString(cursor.getColumnIndex("call"))).getBytes()); + if (!isSWL) { + if (cursor.getInt(cursor.getColumnIndex("isLotW_QSL")) == 1) { + fileOutputStream.write("Y ".getBytes()); + } else { + fileOutputStream.write("N ".getBytes()); + } + if (cursor.getInt(cursor.getColumnIndex("isQSL")) == 1) { + fileOutputStream.write("Y ".getBytes()); + } else { + fileOutputStream.write("N ".getBytes()); + } + } else { + fileOutputStream.write("Y ".getBytes()); + } + + if (cursor.getString(cursor.getColumnIndex("gridsquare")) != null) { + fileOutputStream.write(String.format("%s " + , cursor.getString(cursor.getColumnIndex("gridsquare")).length() + , cursor.getString(cursor.getColumnIndex("gridsquare"))).getBytes()); + } + + if (cursor.getString(cursor.getColumnIndex("mode")) != null) { + fileOutputStream.write(String.format("%s " + , cursor.getString(cursor.getColumnIndex("mode")).length() + , cursor.getString(cursor.getColumnIndex("mode"))).getBytes()); + } + + if (cursor.getString(cursor.getColumnIndex("rst_sent")) != null) { + fileOutputStream.write(String.format("%s " + , cursor.getString(cursor.getColumnIndex("rst_sent")).length() + , cursor.getString(cursor.getColumnIndex("rst_sent"))).getBytes()); + } + + if (cursor.getString(cursor.getColumnIndex("rst_rcvd")) != null) { + fileOutputStream.write(String.format("%s " + , cursor.getString(cursor.getColumnIndex("rst_rcvd")).length() + , cursor.getString(cursor.getColumnIndex("rst_rcvd"))).getBytes()); + } + + if (cursor.getString(cursor.getColumnIndex("qso_date")) != null) { + fileOutputStream.write(String.format("%s " + , cursor.getString(cursor.getColumnIndex("qso_date")).length() + , cursor.getString(cursor.getColumnIndex("qso_date"))).getBytes()); + } + + if (cursor.getString(cursor.getColumnIndex("time_on")) != null) { + fileOutputStream.write(String.format("%s " + , cursor.getString(cursor.getColumnIndex("time_on")).length() + , cursor.getString(cursor.getColumnIndex("time_on"))).getBytes()); + } + + if (cursor.getString(cursor.getColumnIndex("qso_date_off")) != null) { + fileOutputStream.write( String.format("%s " + , cursor.getString(cursor.getColumnIndex("qso_date_off")).length() + , cursor.getString(cursor.getColumnIndex("qso_date_off"))).getBytes()); + } + + if (cursor.getString(cursor.getColumnIndex("time_off")) != null) { + fileOutputStream.write(String.format("%s " + , cursor.getString(cursor.getColumnIndex("time_off")).length() + , cursor.getString(cursor.getColumnIndex("time_off"))).getBytes()); + } + + if (cursor.getString(cursor.getColumnIndex("band")) != null) { + fileOutputStream.write(String.format("%s " + , cursor.getString(cursor.getColumnIndex("band")).length() + , cursor.getString(cursor.getColumnIndex("band"))).getBytes()); + } + + if (cursor.getString(cursor.getColumnIndex("freq")) != null) { + fileOutputStream.write(String.format("%s " + , cursor.getString(cursor.getColumnIndex("freq")).length() + , cursor.getString(cursor.getColumnIndex("freq"))).getBytes()); + } + + if (cursor.getString(cursor.getColumnIndex("station_callsign")) != null) { + fileOutputStream.write(String.format("%s " + , cursor.getString(cursor.getColumnIndex("station_callsign")).length() + , cursor.getString(cursor.getColumnIndex("station_callsign"))).getBytes()); + } + + if (cursor.getString(cursor.getColumnIndex("my_gridsquare")) != null) { + fileOutputStream.write(String.format("%s " + , cursor.getString(cursor.getColumnIndex("my_gridsquare")).length() + , cursor.getString(cursor.getColumnIndex("my_gridsquare"))).getBytes()); + } + + if (cursor.getColumnIndex("operator") != -1) { + if (cursor.getString(cursor.getColumnIndex("operator")) != null) { + fileOutputStream.write(String.format("%s " + , cursor.getString(cursor.getColumnIndex("operator")).length() + , cursor.getString(cursor.getColumnIndex("operator"))).getBytes()); + } + } + String comment = cursor.getString(cursor.getColumnIndex("comment")); + + //Distance: 99 km + //在写库的时候,一定要加" km" + fileOutputStream.write(String.format("%s \n" + , comment.length() + , comment).getBytes()); + } + + + } catch (IOException e) { + Log.e(TAG,String.format("写文件出错:%s",e.getMessage())); + ToastMessage.show(String.format(GeneralVariables + .getStringFromResource(R.string.write_file_error), e.getMessage())); + } finally { + try { + if (fileOutputStream != null) { + fileOutputStream.close(); + } + } catch (IOException e) { + Log.e(TAG, String.format("关闭写文件出错:%s", e.getMessage())); + ToastMessage.show(String.format(GeneralVariables + .getStringFromResource(R.string.write_file_error), e.getMessage())); + } + } + + if (onGetShareLogs != null) { + onGetShareLogs.afterGet(count, String.format( + GeneralVariables.getStringFromResource(R.string.total_logs) + , position)); + } + Log.d(TAG, String.format("写入数据%d条", position)); + + cursor.close(); + } + + /** + * 分享文件 + * + * @param context Context + * @param file 文件对象 + * @param title 标题 + */ + public void doShareLogs(Context context, File file, String title + , SQLiteDatabase db, String queryKey, int queryFilter, File adiFile + , boolean isSWL + , OnShareLogEvents onGetShareLogs) { + + isCancel=false; + + downQSLTableToFile(db, queryKey, queryFilter, adiFile, false, new OnShareLogEvents() { + @Override + public void onPreparing(String info) { + if (onGetShareLogs!=null){ + onGetShareLogs.onPreparing(info); + } + } + + @Override + public void onShareStart(int count, String info) { + if (onGetShareLogs != null) { + onGetShareLogs.onShareStart(count, info); + } + } + + @Override + public boolean onShareProgress(int count, int position, String info) { + if (onGetShareLogs != null) { + boolean temp=onGetShareLogs.onShareProgress(count, position, info); + isCancel=!temp; + return temp; + } + return true; + } + + @Override + public void afterGet( int count, String info) { + if (onGetShareLogs != null) { + onGetShareLogs.afterGet( count, info); + } + if (!isCancel) { + Intent sharingIntent = new Intent(Intent.ACTION_SEND); + Uri fileUri = FileProvider.getUriForFile(context.getApplicationContext() + , "com.bg7yoz.ft8cn.fileprovider", file); + sharingIntent.setType("text/plain"); + sharingIntent.putExtra(Intent.EXTRA_STREAM, fileUri); + sharingIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + context.startActivity(Intent.createChooser(sharingIntent, title)); + } + } + + @Override + public void onShareFailed(String info) { + if (onGetShareLogs!=null){ + onGetShareLogs.onShareFailed(info); + } + } + }); + + + } + + + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/log/ThirdPartyService.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/log/ThirdPartyService.java new file mode 100644 index 00000000..df70561a --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/log/ThirdPartyService.java @@ -0,0 +1,282 @@ +package com.bg7yoz.ft8cn.log; +import android.util.Log; + +import com.bg7yoz.ft8cn.GeneralVariables; + +import org.json.JSONObject; +import org.json.JSONStringer; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserFactory; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.StringReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.HashMap; + +enum ServiceType{ + Cloudlog, + QRZ +} + +public class ThirdPartyService { + public static String TAG = "ThirdPartyService"; + + private static String QSLRecordToADIF(QSLRecord qslRecord, ServiceType serv){ + StringBuilder logStr = new StringBuilder(); + logStr.append(String.format("%s " + , qslRecord.getToCallsign().length() + , qslRecord.getToCallsign())); + + if (qslRecord.getToMaidenGrid() != null) { + logStr.append(String.format("%s " + , qslRecord.getToMaidenGrid().length() + , qslRecord.getToMaidenGrid())); + } + + if (qslRecord.getMode() != null) { + logStr.append(String.format("%s " + , qslRecord.getMode().length() + , qslRecord.getMode())); + } + + if (String.valueOf(qslRecord.getSendReport()) != null) { + logStr.append(String.format("%s " + , String.valueOf(qslRecord.getSendReport()).length() + , String.valueOf(qslRecord.getSendReport()))); + } + + if (String.valueOf(qslRecord.getReceivedReport()) != null) { + logStr.append(String.format("%s " + , String.valueOf(qslRecord.getReceivedReport()).length() + , String.valueOf(qslRecord.getReceivedReport()))); + } + + if (qslRecord.getQso_date() != null) { + logStr.append(String.format("%s " + , qslRecord.getQso_date().length() + , qslRecord.getQso_date())); + } + + if (qslRecord.getTime_on() != null) { + logStr.append(String.format("%s " + , qslRecord.getTime_on().length() + , qslRecord.getTime_on())); + } + if (qslRecord.getBandLength() != null) { + logStr.append(String.format("%s " + , qslRecord.getBandLength().length() + , qslRecord.getBandLength())); + } + + if (qslRecord.getQso_date_off() != null) { + logStr.append(String.format("%s " + , qslRecord.getQso_date_off().length() + , qslRecord.getQso_date_off())); + } + + if (qslRecord.getTime_off() != null) { + logStr.append(String.format("%s " + , qslRecord.getTime_off().length() + , qslRecord.getTime_off())); + } + + if (String.valueOf(qslRecord.getBandFreq()) != null) { + String freq = ""; + Log.d(TAG,String.valueOf(qslRecord.getBandFreq())); + if (serv == ServiceType.Cloudlog || serv == ServiceType.QRZ){ + double i = (double)qslRecord.getBandFreq() / 1000000; + freq = String.valueOf(i); + } + + logStr.append(String.format("%s " + , freq.length() + , freq)); + } + + if (qslRecord.getMyCallsign() != null) { + logStr.append(String.format("%s " + , qslRecord.getMyCallsign().length() + , qslRecord.getMyCallsign())); + } + + if (qslRecord.getMyMaidenGrid() != null) { + logStr.append(String.format("%s " + , qslRecord.getMyMaidenGrid().length() + , qslRecord.getMyMaidenGrid())); + } + + String comment = qslRecord.getComment(); + + //Distance: 99 km + //在写库的时候,一定要加" km" + logStr.append(String.format("%s \n" + , comment.length() + , comment)); + return logStr.toString(); + } + public static void UploadToCloudLog(QSLRecord qslRecord){ + // 转换为adif格式 + String logStr = QSLRecordToADIF(qslRecord,ServiceType.Cloudlog); + Log.d(TAG,logStr); + String address = GeneralVariables.getCloudlogServerAddress(); + if (!address.endsWith("/")){ + address+="/"; + } + HashMap json = new HashMap<>(); + json.put("key", GeneralVariables.getCloudlogServerApiKey()); + json.put("station_profile_id", GeneralVariables.getCloudlogStationID()); + json.put("type","adif"); + json.put("string", logStr); + + JSONStringer js = new JSONStringer(); + try { + String result = js.object().key("key").value(GeneralVariables.getCloudlogServerApiKey()).key("station_profile_id").value(GeneralVariables.getCloudlogStationID()) + .key("type").value("adif").key("string").value(logStr).endObject().toString(); + String clRes = sendPostRequest(address+"api/qso/",result); + Log.d(TAG,"Updated to Cloudlog successfully. result:"+clRes); + }catch (Exception k){ + Log.d(TAG, k.toString()); + } + } + public static boolean CheckCloudlogConnection(){ + String address = GeneralVariables.getCloudlogServerAddress(); + String apiKey = GeneralVariables.getCloudlogServerApiKey(); + // 检查地址末尾是否含有 / + if (!address.endsWith("/")){ + address+="/"; + } + try{ + String url = address + "api/auth/"+ apiKey; + Log.d(TAG, "URL: "+url); + String result = sendGetRequest(url); + Log.d(TAG, result); + if (!result.equals("Validrw")){ + return false; + } + return true; + }catch (Exception e){ + Log.d(TAG, e.toString()); + return false; + } + } + + public static boolean CheckQRZConnection(){ + String apiKey = GeneralVariables.getQrzApiKey(); + try{ + String url = "https://logbook.qrz.com/api?KEY="+apiKey+"&ACTION=STATUS"; + String result = sendGetRequest(url); + HashMap status = new HashMap<>(); + for (String s : result.split("&")) { + String[] split = s.split("="); + if (split.length>1){ + status.put(split[0],split[1]); + } + } + Log.d(TAG, status.toString()); + if (!status.get("RESULT").equals("OK")){ + return false; + } + return true; + }catch (Exception e){ + Log.d(TAG, e.toString()); + return false; + } + } + + public static void UploadToQRZ(QSLRecord qslRecord){ + // 转换为adif格式 + String logStr = QSLRecordToADIF(qslRecord, ServiceType.QRZ); + Log.d(TAG,logStr); + String apikey = GeneralVariables.getQrzApiKey(); + HashMap json = new HashMap<>(); + + String url = String.format("https://logbook.qrz.com/api/KEY=%s&ACTION=INSERT&ADIF=%s",apikey,logStr); + + try { + String result = sendGetRequest(url); + Log.d(TAG,"Updated to QRZ successfully. result:" + result); + }catch (Exception k){ + Log.d(TAG, k.toString()); + } + } + + public static String sendPostRequest(String url, String json) throws IOException { + HttpURLConnection conn = null; + BufferedReader reader = null; + + try { + URL urlObj = new URL(url); + conn = (HttpURLConnection) urlObj.openConnection(); + + // 设置请求方法为POST + conn.setRequestMethod("POST"); + // 设置请求的头部信息 + conn.setRequestProperty("Content-Type", "application/json"); + + // 获取OutputStream,将请求的数据写入流中 + OutputStream os = conn.getOutputStream(); + os.write(json.getBytes()); + os.flush(); + + // 获取服务器的响应结果 + int responseCode = conn.getResponseCode(); + // cloudlog使用HTTP_CREATED作为创建记录成功的响应 + if (responseCode == HttpURLConnection.HTTP_OK || responseCode==HttpURLConnection.HTTP_CREATED) { + reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); + StringBuilder response = new StringBuilder(); + String line; + while ((line = reader.readLine()) != null) { + response.append(line); + } + return response.toString(); + } + } finally { + if (conn != null) { + conn.disconnect(); + } + if (reader != null) { + reader.close(); + } + } + + return null; + } + public static String sendGetRequest(String url) throws IOException { + HttpURLConnection conn = null; + BufferedReader reader = null; + + try { + URL urlObj = new URL(url); + conn = (HttpURLConnection) urlObj.openConnection(); + + // 设置请求方法为POST + conn.setRequestMethod("GET"); + // 设置请求的头部信息 + conn.setRequestProperty("Content-Type", "application/json"); + + // 获取服务器的响应结果 + int responseCode = conn.getResponseCode(); + if (responseCode == HttpURLConnection.HTTP_OK) { + reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); + StringBuilder response = new StringBuilder(); + String line; + while ((line = reader.readLine()) != null) { + response.append(line); + } + return response.toString(); + } + } finally { + if (conn != null) { + conn.disconnect(); + } + if (reader != null) { + reader.close(); + } + } + return null; + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/maidenhead/MaidenheadGrid.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/maidenhead/MaidenheadGrid.java new file mode 100644 index 00000000..27b5e9d0 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/maidenhead/MaidenheadGrid.java @@ -0,0 +1,406 @@ +package com.bg7yoz.ft8cn.maidenhead; +/** + * 梅登海德网格的处理。包括经纬度换算、距离计算。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.annotation.SuppressLint; +import android.content.Context; +import android.location.Location; +import android.location.LocationManager; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; +import com.google.android.gms.maps.model.LatLng; + +import java.util.List; + +public class MaidenheadGrid { + private static final String TAG = "MaidenheadGrid"; + private static final double EARTH_RADIUS = 6371393; // 平均半径,单位:m;不是赤道半径。赤道为6378左右 + + /** + * 计算梅登海德网格的经纬度,4字符或6字符。如果网格数据不正确,返回null。如果是四字符的,尾部加ll,取中间的位置。 + * + * @param grid 梅登海德网格数据 + * @return LatLng 返回经纬度,如果数据不正确,返回null + */ + public static LatLng gridToLatLng(String grid) { + if (grid==null) return null; + if (grid.length()==0) return null; + //判断是不是符合梅登海德网格的规则 + if (grid.length() != 2&&grid.length() != 4 && grid.length() != 6) { + return null; + } + if (grid.equalsIgnoreCase("RR73")) return null; + if (grid.equalsIgnoreCase("RR")) return null; + double x=0; + double y=0; + double z=0; + //纬度 + double lat=0; + if (grid.length()==2){ + x=grid.toUpperCase().getBytes()[1]-'A'+0.5f; + }else { + x=grid.toUpperCase().getBytes()[1]-'A'; + } + x*=10; + + if (grid.length()==4){ + y=grid.getBytes()[3]-'0'+0.5f; + }else if (grid.length()==6){ + y=grid.getBytes()[3]-'0'; + } + + if (grid.length()==6){ + z=grid.toUpperCase().getBytes()[5]-'A'+0.5f; + z=z*(1/18f); + } + lat=x+y+z-90; + + //经度 + x=0; + y=0; + z=0; + double lng=0; + if (grid.length()==2){ + x=grid.toUpperCase().getBytes()[0]-'A'+0.5; + }else { + x=grid.toUpperCase().getBytes()[0]-'A'; + } + x*=20; + if (grid.length()==4){ + y=grid.getBytes()[2]-'0'+0.5; + }else if (grid.length()==6){ + y=grid.getBytes()[2]-'0'; + } + y*=2; + if (grid.length()==6){ + z=grid.toUpperCase().getBytes()[4]-'A'+0.5; + z=z*(2/18f); + } + lng=x+y+z-180; + if (lat>85) lat=85;//防止在地图上越界 + if (lat<-85) lat=-85;//防止在地图上越界 + + + return new LatLng(lat,lng); + + + } + + + + + + + public static LatLng[] gridToPolygon(String grid) { + if (grid.length() != 2 && grid.length() != 4 && grid.length() != 6) { + return null; + } + LatLng[] latLngs = new LatLng[4]; + + //纬度1 + double x; + double y = 0; + double z = 0; + double lat1; + x = grid.toUpperCase().getBytes()[1] - 'A'; + x *= 10; + if (grid.length() > 2) { + y = grid.getBytes()[3] - '0'; + } + if (grid.length() > 4) { + z = grid.toUpperCase().getBytes()[5] - 'A'; + z = z * (1f / 18f); + } + lat1 = x + y + z - 90; + if (lat1<-85.0){ + lat1=-85.0; + } + if (lat1>85.0){ + lat1=85.0; + } + + //纬度2 + x = 0; + y = 0; + z = 0; + double lat2; + if (grid.length() == 2) { + x = grid.toUpperCase().getBytes()[1] - 'A' + 1; + } else { + x = grid.toUpperCase().getBytes()[1] - 'A'; + } + x *= 10; + if (grid.length() == 4) { + y = grid.getBytes()[3] - '0' + 1; + } else if (grid.length() == 6) { + y = grid.getBytes()[3] - '0'; + } + if (grid.length() == 6) { + z = grid.toUpperCase().getBytes()[5] - 'A' + 1; + z = z * (1f / 18f); + } + lat2 = x + y + z - 90; + if (lat2<-85.0){ + lat2=-85.0; + } + if (lat2>85.0){ + lat2=85.0; + } + + + //经度1 + x=0;y=0;z=0; + double lng1; + x=grid.toUpperCase().getBytes()[0]-'A'; + x*=20; + + if (grid.length()>2){ + y=grid.getBytes()[2]-'0'; + y*=2; + } + if (grid.length()>4){ + z=grid.toUpperCase().getBytes()[4]-'A'; + z=z*2/18f; + } + lng1=x+y+z-180; + + //经度2 + x=0;y=0;z=0; + double lng2; + if (grid.length()==2){ + x=grid.toUpperCase().getBytes()[0]-'A'+1; + }else { + x=grid.toUpperCase().getBytes()[0]-'A'; + } + x*=20; + if (grid.length()==4){ + y=grid.getBytes()[2]-'0'+1; + }else if (grid.length()==6){ + y=grid.getBytes()[2]-'0'; + } + y*=2; + if (grid.length()==6){ + z=grid.toUpperCase().getBytes()[4]-'A'+1; + z=z*2/18f; + } + lng2=x+y+z-180; + + latLngs[0] = new LatLng(lat1,lng1); + latLngs[1] = new LatLng(lat1,lng2); + latLngs[2] = new LatLng(lat2,lng2); + latLngs[3] = new LatLng(lat2,lng1); + + return latLngs; + + + } + + /** + * 此函数根据纬度计算 6 字符 Maidenhead网格。 + * 经纬度采用 NMEA 格式。换句话说,西经和南纬度为负数。它们被指定为double类型 + * + * @param location 经纬度 + * @return String 梅登海德字符 + */ + public static String getGridSquare(LatLng location) { + double tempNumber;//用于中间计算 + int index;//确定要显示的字符 + double _long = location.longitude; + double _lat = location.latitude; + StringBuilder buff = new StringBuilder(); + + /* + * 计算第一对两个字符 + */ + _long += 180; // 从太平洋中部开始 + tempNumber = _long / 20; // 每个主要正方形都是 20 度宽 + index = (int) tempNumber; // 大写字母的索引 + buff.append(String.valueOf((char) (index + 'A'))); // 设置第一个字符 + _long = _long - (index * 20); // 第 2 步的剩余部分 + + _lat += 90; //从南极开始 180 度 + tempNumber = _lat / 10; // 每个大正方形高 10 度 + index = (int) tempNumber; // 大写字母的索引 + buff.append(String.valueOf((char) (index + 'A')));//设置第二个字符 + _lat = _lat - (index * 10); // 第 2 步的剩余部分 + + /* + * 现在是第二对两数字: + */ + tempNumber = _long / 2; // 步骤 1 的余数除以 2 + index = (int) tempNumber; // 数字索引 + buff.append(String.valueOf((char) (index + '0')));//设置第三个字符 + _long = _long - (index * 2); //第 3 步的剩余部分 + + tempNumber = _lat; // 步骤 1 的余数除以 1 + index = (int) tempNumber; // 数字索引 + buff.append(String.valueOf((char) (index + '0')));//设置第四个字符 + _lat = _lat - index; //第 3 步的剩余部分 + + /* + *现在是第三对两个小写字符: + */ + tempNumber = _long / 0.083333; //步骤 2 的余数除以 0.083333 + index = (int) tempNumber; // 小写字母的索引 + buff.append(String.valueOf((char) (index + 'a')));//设置第五个字符 + + tempNumber = _lat / 0.0416665; // 步骤 2 的余数除以 0.0416665 + index = (int) tempNumber; // 小写字母的索引 + buff.append(String.valueOf((char) (index + 'a')));//设置第五个字符 + + return buff.toString().substring(0, 4); + } + + /** + * 计算经纬度之间的距离 + * + * @param latLng1 经纬度 + * @param latLng2 经纬度 + * @return 距离,公里。 + */ + public static double getDist(LatLng latLng1, LatLng latLng2) { + double radiansAX = Math.toRadians(latLng1.longitude); // A经弧度 + double radiansAY = Math.toRadians(latLng1.latitude); // A纬弧度 + double radiansBX = Math.toRadians(latLng2.longitude); // B经弧度 + double radiansBY = Math.toRadians(latLng2.latitude); // B纬弧度 + + // 公式中“cosβ1cosβ2cos(α1-α2)+sinβ1sinβ2”的部分,得到∠AOB的cos值 + double cos = Math.cos(radiansAY) * Math.cos(radiansBY) * Math.cos(radiansAX - radiansBX) + + Math.sin(radiansAY) * Math.sin(radiansBY); + double acos = Math.acos(cos); // 反余弦值 + return EARTH_RADIUS * acos / 1000; // 最终结果km + } + + /** + * 计算梅登海德网格之间的距离 + * + * @param mGrid1 梅登海德网格 + * @param mGrid2 梅登海德网格2 + * @return double 两个网格之间的距离 + */ + public static double getDist(String mGrid1, String mGrid2) { + LatLng latLng1 = gridToLatLng(mGrid1); + LatLng latLng2 = gridToLatLng(mGrid2); + if (latLng1 != null && latLng2 != null) { + return getDist(latLng1, latLng2); + } else { + return 0; + } + } + + /** + * 计算两个网格之间的距离 + * + * @param mGrid1 网格 + * @param mGrid2 网格 + * @return 距离 + */ + @SuppressLint("DefaultLocale") + public static String getDistStr(String mGrid1, String mGrid2) { + double dist = getDist(mGrid1, mGrid2); + if (dist == 0) { + return ""; + } else { + return String.format(GeneralVariables.getStringFromResource(R.string.distance), dist); + } + } + public static String getDistLatLngStr(LatLng latLng1,LatLng latLng2){ + return String.format(GeneralVariables.getStringFromResource(R.string.distance), getDist(latLng1,latLng2)); + + } + + /** + * 计算两个网格之间的距离,以英文显示公里数 + * + * @param mGrid1 网格 + * @param mGrid2 网格 + * @return 距离 + */ + @SuppressLint("DefaultLocale") + public static String getDistStrEN(String mGrid1, String mGrid2) { + double dist = getDist(mGrid1, mGrid2); + if (dist == 0) { + return ""; + } else { + return String.format("%.0f km", dist); + } + } + + /** + * 获取本设备的经纬度 + * + * @param context context + * @return 经纬度 + */ + public static LatLng getLocalLocation(Context context) { + // 获取位置服务 + String serviceName = Context.LOCATION_SERVICE; + // 调用getSystemService()方法来获取LocationManager对象 + LocationManager locationManager = (LocationManager) context.getSystemService(serviceName); + // 指定LocationManager的定位方法 + //String provider = LocationManager.GPS_PROVIDER; + // 调用getLastKnownLocation()方法获取当前的位置信息 + + List providers = locationManager.getProviders(true); + Location location = null; + for (String s : providers) { + @SuppressLint("MissingPermission") Location l = locationManager.getLastKnownLocation(s); + if (l == null) { + continue; + } + if (location == null || l.getAccuracy() < location.getAccuracy()) { + // Found best last known location: %s", l); + location = l; + } + } + + if (location != null) { + return new LatLng(location.getLatitude(), location.getLongitude()); + } else { + return null; + } + } + + + /** + * 获取本机的梅登海德网格数据。需要定位的权限。 + * + * @param context context + * @return String 返回6字符的梅登海德网格。 + */ + public static String getMyMaidenheadGrid(Context context) { + LatLng latLng = getLocalLocation(context); + + if (latLng != null) { + return getGridSquare(latLng); + } else { + //ToastMessage.show("无法定位,请确认是否有定位的权限。"); + return ""; + } + } + + /** + * 检查是不是梅登海德网格。如果不是返回false。 + * + * @param s 梅登海德网格 + * @return boolean 是否是梅登海德网格。 + */ + public static boolean checkMaidenhead(String s) { + if (s.length() != 4 && s.length() != 6) { + return false; + } else { + if (s.equals("RR73")) { + return false; + } + return Character.isAlphabetic(s.charAt(0)) + && Character.isAlphabetic(s.charAt(1)) + && Character.isDigit(s.charAt(2)) + && Character.isDigit(s.charAt(3)); + } + } + +} \ No newline at end of file diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/BaseRig.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/BaseRig.java new file mode 100644 index 00000000..31fd6c49 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/BaseRig.java @@ -0,0 +1,145 @@ +package com.bg7yoz.ft8cn.rigs; + +import androidx.lifecycle.MutableLiveData; + +import com.bg7yoz.ft8cn.Ft8Message; +import com.bg7yoz.ft8cn.connector.BaseRigConnector; + +/** + * 电台的抽象类。 + * @author BGY70Z + * @date 2023-03-20 + */ +public abstract class BaseRig { + private long freq;//当前频率值 + public MutableLiveData mutableFrequency = new MutableLiveData<>(); + private int controlMode;//控制模式 + private OnRigStateChanged onRigStateChanged;//当电台的一些状态发生变化的回调 + private int civAddress;//CIV地址 + private int baudRate;//波特率 + private boolean isPttOn=false;//ptt是否打开 + private BaseRigConnector connector = null;//连接电台的对象 + + public abstract boolean isConnected();//确认电台是否连接 + + public abstract void setUsbModeToRig();//设置电台上边带方式 + + public abstract void setFreqToRig();//设置电台频率 + + public abstract void onReceiveData(byte[] data);//当电台发送回数据的动作 + + public abstract void readFreqFromRig();//从电台读取频率 + + public abstract String getName();//获取电台的名字 + + private final OnConnectReceiveData onConnectReceiveData = new OnConnectReceiveData() { + @Override + public void onData(byte[] data) { + onReceiveData(data); + } + }; + + public void setPTT(boolean on) {//设置PTT打开或关闭 + isPttOn=on; + if (onRigStateChanged != null) { + onRigStateChanged.onPttChanged(on); + } + } + +// public void sendWaveData(float[] data) { +// //留给ICOM电台使用 +// } + public void sendWaveData(Ft8Message message) { + //留给ICOM电台使用 + } + + public long getFreq() { + return freq; + } + + public void setFreq(long freq) { + if (freq == this.freq) return; + if (freq == 0) return; + if (freq == -1) return; + mutableFrequency.postValue(freq); + this.freq = freq; + if (onRigStateChanged != null) { + onRigStateChanged.onFreqChanged(freq); + } + } + + public void setConnector(BaseRigConnector connector) { + this.connector = connector; + + this.connector.setOnRigStateChanged(onRigStateChanged); + this.connector.setOnConnectReceiveData(new OnConnectReceiveData() { + @Override + public void onData(byte[] data) { + onReceiveData(data); + } + }); + } + + public void setControlMode(int mode) { + controlMode = mode; + if (connector != null) { + connector.setControlMode(mode); + } + } + + public int getControlMode() { + return controlMode; + } + + public static String byteToStr(byte[] data) { + StringBuilder s = new StringBuilder(); + for (int i = 0; i < data.length; i++) { + s.append(String.format("%02x ", data[i] & 0xff)); + } + return s.toString(); + } + + public BaseRigConnector getConnector() { + return connector; + } + + public OnRigStateChanged getOnRigStateChanged() { + return onRigStateChanged; + } + + public void setOnRigStateChanged(OnRigStateChanged onRigStateChanged) { + this.onRigStateChanged = onRigStateChanged; + } + + public int getCivAddress() { + return civAddress; + } + + public void setCivAddress(int civAddress) { + this.civAddress = civAddress; + } + + public int getBaudRate() { + return baudRate; + } + + public void setBaudRate(int baudRate) { + this.baudRate = baudRate; + } + + public boolean isPttOn() { + return isPttOn; + } + + + /** + * 2023-08-16 由DS1UFX提交修改(基于0.9版),增加(tr)uSDX audio over cat的支持。 + */ + public boolean supportWaveOverCAT() { + return false; + } + + public void onDisconnecting() { + } + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/BaseRigOperation.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/BaseRigOperation.java new file mode 100644 index 00000000..796fb003 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/BaseRigOperation.java @@ -0,0 +1,138 @@ +package com.bg7yoz.ft8cn.rigs; +/** + * 电台相关计算。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.annotation.SuppressLint; + +public class BaseRigOperation { + @SuppressLint("DefaultLocale") + public static String getFrequencyStr(long freq) { + return String.format("%d.%03dMHz", freq / 1000000, (freq % 1000000) / 1000); + } + /** + * 检查是不是在WSPR2的频段内 + * + * @param freq 频率 + * @return 是否 + */ + public static boolean checkIsWSPR2(long freq) { + //freq=电台频率+声音频率 + return (freq >= 137400 && freq <= 137600) //2190m + || (freq >= 475400 && freq <= 475600) //630m + || (freq >= 1838000 && freq <= 1838200) //160m + || (freq >= 3594000 && freq <= 3594200) //80m + || (freq >= 5288600 && freq <= 5288800) //60m + || (freq >= 7040000 && freq <= 7040200) //40m + || (freq >= 10140100 && freq <= 10140300) //30m + || (freq >= 14097000 && freq <= 14097200) //20m + || (freq >= 18106000 && freq <= 18106200) //17m + || (freq >= 21096000 && freq <= 21096200) //15m + || (freq >= 24926000 && freq <= 24926200) //12m + || (freq >= 28126000 && freq <= 28126200) //10m + || (freq >= 50294400 && freq <= 50294600) //6m + || (freq >= 70092400 && freq <= 70092600) //4m + || (freq >= 144489900 && freq <= 144490100) //2m + || (freq >= 432301600 && freq <= 432301800) //70cm + || (freq >= 1296501400 && freq <= 1296501600);//23cm + } + + /** + * 通过频率获取波长 + * + * @param freq 频率 + * @return 波长 + */ + @SuppressLint("DefaultLocale") + public static String getMeterFromFreq(long freq) { + if (freq >= 135700 && freq <= 137800) { + return "2200m"; + } // 2200m + else if (freq >= 472000 && freq <= 479000) { + return "630m"; + } // 160m + else if (freq >= 1800000 && freq <= 2000000) { + return "160m"; + } // 160m + else if (freq >= 3500000 && freq <= 4000000) { + return "80m"; + } // 80m + else if (freq >= 5351500 && freq <= 5366500) { + return "60m"; + } // 80m + else if (freq >= 7000000 && freq <= 7300000) { + return "40m"; + } // 40m + else if (freq >= 10100000 && freq <= 10150000) { + return "30m"; + } // 30m + else if (freq >= 14000000 && freq <= 14350000) { + return "20m"; + } // 20m + else if (freq >= 18068000 && freq <= 18168000) { + return "17m"; + } // 17m + else if (freq >= 21000000 && freq <= 21450000) { + return "15m"; + } // 15m + else if (freq >= 24890000 && freq <= 24990000) { + return "12m"; + } // 12m + else if (freq >= 28000000 && freq <= 29700000) { + return "10m"; + } // 10m + else if (freq >= 50000000 && freq <= 54000000) { + return "6m"; + } // 6m + else if (freq >= 144000000 && freq <= 148000000) { + return "2m"; + } // 2m + else if (freq >= 220000000 && freq <= 225000000) { + return "1.25m"; + } //1.25m + else if (freq >= 420000000 && freq <= 450000000) { + return "70cm"; + } //0.7m + else if (freq >= 902000000 && freq <= 928000000) { + return "33cm"; + } //0.33m + else if (freq >= 1240000000 && freq <= 1300000000) { + return "23cm"; + } //0.23m + else { + return calculationMeterFromFreq(freq); + }//不在范围内,就计算一下 + } + + @SuppressLint("DefaultLocale") + private static String calculationMeterFromFreq(Long freq) { + if (freq == 0) return ""; + float meter = 300000000f / (float) freq; + if (meter < 1) {//以厘米为单位 + return String.format("%dcm", Math.round(meter * 10) * 10); + } else if (meter < 20) {//小于20米,以米为单位 + return String.format("%dm", Math.round(meter)); + } else {//大于20M,以10米为单位 + return String.format("%dm", Math.round(meter / 10) * 10); + } + } + + public static String getFrequencyAllInfo(long freq) { + return String.format("%s (%s)", getFrequencyStr(freq), getMeterFromFreq(freq)); + } + + @SuppressLint("DefaultLocale") + public static String getFrequencyFloat(long freq) { + return String.format("%d.%06d", freq / 1000000, (freq % 1000000)); + } + + public static String byteToStr(byte[] data) { + StringBuilder s = new StringBuilder(); + for (int i = 0; i < data.length; i++) { + s.append(String.format("0x%02x ", data[i] & 0xff)); + } + return s.toString(); + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/CRC16.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/CRC16.java new file mode 100644 index 00000000..33cfeabd --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/CRC16.java @@ -0,0 +1,93 @@ +package com.bg7yoz.ft8cn.rigs; + +/** + * crc16-ccitt-false加密工具 + * + * @author BGY70Z + * @date 2023-03-20 + * + */ +public class CRC16 { + + /** + * crc16-ccitt-false加/解密(四字节) + * + * @param bytes + * @return + */ + public static int crc16(byte[] bytes) { + return crc16(bytes, bytes.length); + } + + /** + * crc16-ccitt-false加/解密(四字节) + * + * @param bytes -字节数组 + * @return + */ + public static int crc16(byte[] bytes, int len) { + int crc = 0xFFFF; + for (int j = 0; j < len; j++) { + crc = ((crc >>> 8) | (crc << 8)) & 0xffff; + crc ^= (bytes[j] & 0xff);// byte to int, trunc sign + crc ^= ((crc & 0xff) >> 4); + crc ^= (crc << 12) & 0xffff; + crc ^= ((crc & 0xFF) << 5) & 0xffff; + } + crc &= 0xffff; + return crc; + } + + /** + * crc16-ccitt-false加/解密(四字节) + * + * @param bytes + * @return + */ + public static int crc16(byte[] bytes, int start, int len) { + int crc = 0xFFFF; + for (; start < len; start++) { + crc = ((crc >>> 8) | (crc << 8)) & 0xffff; + crc ^= (bytes[start] & 0xff);// byte to int, trunc sign + crc ^= ((crc & 0xff) >> 4); + crc ^= (crc << 12) & 0xffff; + crc ^= ((crc & 0xFF) << 5) & 0xffff; + } + crc &= 0xffff; + return crc; + } + + /** + * crc16-ccitt-false加/解密 + * + * @param bytes + * -字节数组 + * @return + */ + public static short crc16_short(byte[] bytes) { + return crc16_short(bytes, 0, bytes.length); + } + + /** + * crc16-ccitt-false加/解密(计算从0位置开始的len长度) + * + * @param bytes + * -字节数组 + * @param len + * -长度 + * @return + */ + public static short crc16_short(byte[] bytes, int len) { + return (short) crc16(bytes, len); + } + + /** + * crc16-ccitt-false加/解密(两字节) + * + * @param bytes + * @return + */ + public static short crc16_short(byte[] bytes, int start, int len) { + return (short) crc16(bytes, start, len); + } +} \ No newline at end of file diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/ElecraftCommand.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/ElecraftCommand.java new file mode 100644 index 00000000..f1454a32 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/ElecraftCommand.java @@ -0,0 +1,78 @@ +package com.bg7yoz.ft8cn.rigs; + + +import android.util.Log; + +public class ElecraftCommand { + private static final String TAG = "ElecraftCommand"; + private final String commandID; + private final String data; + /** + * 获取命令(两字节字符串) + * + * @return 主命令值 + */ + public String getCommandID() {//获取主命令 + return commandID; + } + + /** + * 获取命令数据,字符串,没有分号 + * + * @return 命令数据 + */ + public String getData() {//获取命令数据 + return data; + } + + public ElecraftCommand(String commandID, String data) { + this.commandID = commandID; + this.data = data; + } + //解析接收的指令 + + /** + * 从串口中接到的数据解析出指令的数据:指令头+内容+分号 + * + * @param buffer 从串口接收到的数据 + * @return 返回电台指令对象,如果不符合指令的格式,返回null。 + */ + public static ElecraftCommand getCommand(String buffer) { + if (buffer.length() < 2) {//指令的长度必须大于等于2 + return null; + } + if (buffer.substring(0,2).matches("[a-zA-Z][a-zA-Z]")) { + return new ElecraftCommand(buffer.substring(0, 2), buffer.substring(2)); + } + return null; + } + + + /** + * 计算频率 + * @param command 指令 + * @return 频率 + */ + public static long getFrequency(ElecraftCommand command) { + try { + if(command.getCommandID().equals("FA")||command.getCommandID().equals("FB")) { + return Long.parseLong(command.getData()); + }else { + return 0; + } + }catch (Exception e){ + Log.e(TAG, "获取频率失败: "+command.getData()+"\n"+e.getMessage() ); + } + return 0; + } + + public static boolean isSWRMeter(ElecraftCommand command) { + return command.data.length() >= 3; + } + + public static int getSWRMeter(ElecraftCommand command) { + return Integer.parseInt(command.data.substring(0,3)); + } + + +} \ No newline at end of file diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/ElecraftRig.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/ElecraftRig.java new file mode 100644 index 00000000..6dee5c1e --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/ElecraftRig.java @@ -0,0 +1,175 @@ +package com.bg7yoz.ft8cn.rigs; + +import static com.bg7yoz.ft8cn.GeneralVariables.QUERY_FREQ_TIMEOUT; +import static com.bg7yoz.ft8cn.GeneralVariables.START_QUERY_FREQ_DELAY; + +import android.util.Log; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.database.ControlMode; +import com.bg7yoz.ft8cn.ui.ToastMessage; + +import java.util.Timer; +import java.util.TimerTask; + +/** + * 3代的指令,不同电台还有不同,频率长度981,991是9位,其它的长度是8位 + */ +public class ElecraftRig extends BaseRig { + private static final String TAG = "ElecraftRig"; + private final StringBuilder buffer = new StringBuilder(); + private int swr = 0; + private boolean swrAlert = false; + + private Timer readFreqTimer = new Timer(); + + private TimerTask readTask() { + return new TimerTask() { + @Override + public void run() { + try { + if (!isConnected()) { + readFreqTimer.cancel(); + readFreqTimer.purge(); + readFreqTimer = null; + return; + } + if (isPttOn()) { + readMeters(); + } else { + readFreqFromRig(); + } + } catch (Exception e) { + Log.e(TAG, "readFreq error:" + e.getMessage()); + } + } + }; + } + + /** + * 读取Meter RM; + */ + private void readMeters() { + if (getConnector() != null) { + clearBufferData();//清空一下缓存 + getConnector().sendData(ElecraftRigConstant.setReadMetersSWR()); + } + } + + private void showAlert() { + if (!GeneralVariables.swr_switch_on) return;//告警开关是否关闭 + if (swr >= ElecraftRigConstant.swr_alert_max) { + if (!swrAlert) { + swrAlert = true; + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.swr_high_alert)); + } + } else { + swrAlert = false; + } + + } + + /** + * 清空缓存数据 + */ + private void clearBufferData() { + buffer.setLength(0); + } + + @Override + public void setPTT(boolean on) { + super.setPTT(on); + if (getConnector() != null) { + switch (getControlMode()) { + case ControlMode.CAT://以CIV指令 + getConnector().setPttOn(ElecraftRigConstant.setPTTState(on)); + break; + case ControlMode.RTS: + case ControlMode.DTR: + getConnector().setPttOn(on); + break; + } + } + } + + @Override + public boolean isConnected() { + if (getConnector() == null) { + return false; + } + return getConnector().isConnected(); + } + + @Override + public void setUsbModeToRig() { + if (getConnector() != null) { + getConnector().sendData(ElecraftRigConstant.setOperationUSBMode()); + } + } + + @Override + public void setFreqToRig() { + if (getConnector() != null) { + getConnector().sendData(ElecraftRigConstant.setOperationFreq11Byte(getFreq())); + } + } + + @Override + public void onReceiveData(byte[] data) { + String s = new String(data); + + if (!s.contains(";")) { + buffer.append(s); + if (buffer.length() > 1000) clearBufferData(); + // return;//说明数据还没接收完。 + } else { + if (s.indexOf(";") > 0) {//说明接到结束的数据了,并且不是第一个字符是; + buffer.append(s.substring(0, s.indexOf(";"))); + } + + //开始分析数据 + ElecraftCommand elecraftCommand = ElecraftCommand.getCommand(buffer.toString()); + clearBufferData();//清一下缓存 + //要把剩下的数据放到缓存里 + buffer.append(s.substring(s.indexOf(";") + 1)); + + if (elecraftCommand == null) { + return; + } + if (elecraftCommand.getCommandID().equalsIgnoreCase("FA") + || elecraftCommand.getCommandID().equalsIgnoreCase("FB")) { + long tempFreq = ElecraftCommand.getFrequency(elecraftCommand); + if (tempFreq != 0) {//如果tempFreq==0,说明频率不正常 + setFreq(ElecraftCommand.getFrequency(elecraftCommand)); + } + } else if (elecraftCommand.getCommandID().equalsIgnoreCase("SW")) {//METER + if (ElecraftCommand.isSWRMeter(elecraftCommand)) { + swr = ElecraftCommand.getSWRMeter(elecraftCommand); + } + + showAlert(); + } + + + } + + } + + @Override + public void readFreqFromRig() { + if (getConnector() != null) { + clearBufferData();//清空一下缓存 + getConnector().sendData(ElecraftRigConstant.setReadOperationFreq()); + } + } + + @Override + public String getName() { + return "Elecraft series"; + } + + public ElecraftRig() { + readFreqTimer.schedule(readTask(), START_QUERY_FREQ_DELAY, QUERY_FREQ_TIMEOUT); + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/ElecraftRigConstant.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/ElecraftRigConstant.java new file mode 100644 index 00000000..e9b94447 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/ElecraftRigConstant.java @@ -0,0 +1,87 @@ +package com.bg7yoz.ft8cn.rigs; + +import android.annotation.SuppressLint; + +public class ElecraftRigConstant { + private static final String TAG = "ElecraftRigConstant"; + //LSB:0,USB:1,AM:2,CW:3,RTTY:4,FM:5,WFM:6,CW_R:7,RTTY_R:8,DV:17 + public static final int LSB = 0x01; + public static final int USB = 0x02; + public static final int CW = 0x03; + public static final int FM = 0x04; + public static final int AM = 0x05; + public static final int DATA = 0x06; + public static final int CW_R = 0x07; + public static final int DATA_R = 0x08; + public static final int swr_alert_max=30;//相当于3.0 + + //PTT状态 + + //指令集 + private static final String PTT_ON = "TX;"; + private static final String PTT_OFF = "RX;"; + private static final String USB_MODE = "MD2;"; + private static final String DATA_R_MODE = "MD6;";//TODO---此处要新增DATA_R模式指令 + private static final String READ_FREQ = "FA;"; + private static final String READ_SWR = "SWR;"; + + + + + + + + public static String getModeStr(int mode) { + switch (mode) { + case LSB: + return "LSB"; + case USB: + return "USB"; + case CW: + return "CW"; + case FM: + return "FM"; + case AM: + return "AM"; + case CW_R: + return "CW_R"; + case DATA: + return "DATA"; + case DATA_R: + return "DATA_R"; + default: + return "UNKNOWN"; + } + } + + + public static byte[] setPTTState(boolean on) { + if (on) { + return PTT_ON.getBytes(); + } else { + return PTT_OFF.getBytes(); + } + + } + + public static byte[] setOperationUSBMode() { + return USB_MODE.getBytes(); + } + + + @SuppressLint("DefaultLocale") + public static byte[] setOperationFreq11Byte(long freq) {//用于KENWOOD TS590 + return String.format("FA%011d;",freq).getBytes(); + } + + + + public static byte[] setReadOperationFreq(){ + return READ_FREQ.getBytes(); + } + + public static byte[] setReadMetersSWR(){ + return READ_SWR.getBytes(); + } + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/Flex6000Command.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/Flex6000Command.java new file mode 100644 index 00000000..483889e3 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/Flex6000Command.java @@ -0,0 +1,72 @@ +package com.bg7yoz.ft8cn.rigs; + + +import android.util.Log; + +public class Flex6000Command { + private static final String TAG = "Flex6000Command"; + private final String commandID; + private final String data; + /** + * 获取命令(两字节字符串) + * + * @return 主命令值 + */ + public String getCommandID() {//获取主命令 + return commandID; + } + + /** + * 获取命令数据,字符串,没有分号 + * + * @return 命令数据 + */ + public String getData() {//获取命令数据 + return data; + } + + public Flex6000Command(String commandID, String data) { + this.commandID = commandID; + this.data = data; + } + //解析接收的指令 + + /** + * 从串口中接到的数据解析出指令的数据:指令头+内容+分号 + * + * @param buffer 从串口接收到的数据 + * @return 返回电台指令对象,如果不符合指令的格式,返回null。 + */ + public static Flex6000Command getCommand(String buffer) { + if (buffer.length() < 4) {//指令的长度必须大于等于4,ZZFA + return null; + } + if (buffer.substring(0,4).matches("[a-zA-Z][a-zA-Z][a-zA-Z][a-zA-Z]")) { + return new Flex6000Command(buffer.substring(0, 4), buffer.substring(4)); + } + return null; + } + + + /** + * 计算频率 + * @param command 指令 + * @return 频率 + */ + public static long getFrequency(Flex6000Command command) { + try { + if(command.getCommandID().equals("ZZFA")||command.getCommandID().equals("ZZFB")) { + return Long.parseLong(command.getData()); + }else { + return 0; + } + }catch (Exception e){ + Log.e(TAG, "获取频率失败: "+command.getData()+"\n"+e.getMessage() ); + } + return 0; + } + + + + +} \ No newline at end of file diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/Flex6000Rig.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/Flex6000Rig.java new file mode 100644 index 00000000..2a832c75 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/Flex6000Rig.java @@ -0,0 +1,145 @@ +package com.bg7yoz.ft8cn.rigs; + +import static com.bg7yoz.ft8cn.GeneralVariables.QUERY_FREQ_TIMEOUT; +import static com.bg7yoz.ft8cn.GeneralVariables.START_QUERY_FREQ_DELAY; + +import android.os.Handler; +import android.util.Log; + +import com.bg7yoz.ft8cn.database.ControlMode; + +import java.util.Timer; +import java.util.TimerTask; + +/** + * KENWOOD TS590,与YAESU3代指令接近,命令结构使用Yaesu3Command,指令在KenwoodTK90RigConstant中。 + */ +public class Flex6000Rig extends BaseRig { + private static final String TAG = "KenwoodTS590Rig"; + private final StringBuilder buffer = new StringBuilder(); + + private Timer readFreqTimer = new Timer(); + + private TimerTask readTask() { + return new TimerTask() { + @Override + public void run() { + try { + if (!isConnected()) { + readFreqTimer.cancel(); + readFreqTimer.purge(); + readFreqTimer = null; + return; + } + readFreqFromRig(); + } catch (Exception e) { + Log.e(TAG, "readFreq error:" + e.getMessage()); + } + } + }; + } + + /** + * 清空缓存数据 + */ + private void clearBufferData() { + buffer.setLength(0); + } + + @Override + public void setPTT(boolean on) { + super.setPTT(on); + if (getConnector() != null) { + switch (getControlMode()) { + case ControlMode.CAT://以CIV指令 + getConnector().setPttOn(Flex6000RigConstant.setPTTState(on)); + break; + case ControlMode.RTS: + case ControlMode.DTR: + getConnector().setPttOn(on); + break; + } + } + } + + @Override + public boolean isConnected() { + if (getConnector() == null) { + return false; + } + return getConnector().isConnected(); + } + + @Override + public void setUsbModeToRig() { + if (getConnector() != null) { + getConnector().sendData(Flex6000RigConstant.setOperationUSB_DIGI_Mode()); + } + } + + @Override + public void setFreqToRig() { + if (getConnector() != null) { + getConnector().sendData(Flex6000RigConstant.setOperationFreq(getFreq())); + } + } + + @Override + public void onReceiveData(byte[] data) { + String s = new String(data); + + if (!s.contains(";")) + { + buffer.append(s); + if (buffer.length()>1000) clearBufferData(); + return;//说明数据还没接收完。 + }else { + if (s.indexOf(";")>0){//说明接到结束的数据了,并且不是第一个字符是; + buffer.append(s.substring(0,s.indexOf(";"))); + } + //开始分析数据 + Flex6000Command flex6000Command = Flex6000Command.getCommand(buffer.toString()); + clearBufferData();//清一下缓存 + //要把剩下的数据放到缓存里 + buffer.append(s.substring(s.indexOf(";")+1)); + + if (flex6000Command == null) { + return; + } + if (flex6000Command.getCommandID().equalsIgnoreCase("ZZFA")) { + long tempFreq=Flex6000Command.getFrequency(flex6000Command); + if (tempFreq!=0) {//如果tempFreq==0,说明频率不正常 + setFreq(Flex6000Command.getFrequency(flex6000Command)); + } + } + + } + + } + + @Override + public void readFreqFromRig() { + if (getConnector() != null) { + clearBufferData();//清空一下缓存 + getConnector().sendData(Flex6000RigConstant.setReadOperationFreq()); + } + } + + @Override + public String getName() { + return "FLEX 6000 series"; + } + + public Flex6000Rig() { + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + if (getConnector()!=null){//切换VFO A + //getConnector().sendData(Flex6000RigConstant.setVFOMode()); + } + } + },START_QUERY_FREQ_DELAY-500); + + readFreqTimer.schedule(readTask(), START_QUERY_FREQ_DELAY,QUERY_FREQ_TIMEOUT); + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/Flex6000RigConstant.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/Flex6000RigConstant.java new file mode 100644 index 00000000..26e48701 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/Flex6000RigConstant.java @@ -0,0 +1,94 @@ +package com.bg7yoz.ft8cn.rigs; + +import android.annotation.SuppressLint; + +public class Flex6000RigConstant { + private static final String TAG = "Flex6000RigConstant"; + //LSB:0,USB:1,AM:2,CW:3,RTTY:4,FM:5,WFM:6,CW_R:7,RTTY_R:8,DV:17 + public static final int LSB = 0x00; + public static final int USB = 0x01; + public static final int CW_L = 0x03; + public static final int CW_U = 0x04; + public static final int FM = 0x05; + public static final int AM = 0x06; + public static final int DIGI_U= 0x07; + public static final int DIGI_L= 0x09; + + //PTT状态 + + //指令集 + private static final String PTT_ON = "ZZTX1;"; + private static final String PTT_OFF = "ZZTX0;"; + private static final String USB_DIGI = "ZZMD07;"; + private static final String READ_FREQ = "ZZFA;"; + private static final String SET_VFO = "ZZFR"; + + + + + public static String getModeStr(int mode) { + switch (mode) { + case LSB: + return "LSB"; + case USB: + return "USB"; + case CW_L: + return "CW_L"; + case CW_U: + return "CW_U"; + case FM: + return "FM"; + case AM: + return "AM"; + case DIGI_U: + return "DIGI_U"; + case DIGI_L: + return "DIGI_L"; + default: + return "UNKNOWN"; + } + } + + + public static byte[] setPTTState(boolean on) { + if (on) { + return PTT_ON.getBytes(); + } else { + return PTT_OFF.getBytes(); + } + + } + + public static byte[] setFlexTTState(boolean on) { + if (on) { + return PTT_ON.getBytes(); + } else { + return PTT_OFF.getBytes(); + } + + } + + + + //设置成VFO模式 + public static byte[] setVFOMode(){ + return SET_VFO.getBytes(); + } + + + public static byte[] setOperationUSB_DIGI_Mode() { + return USB_DIGI.getBytes(); + } + + + @SuppressLint("DefaultLocale") + public static byte[] setOperationFreq(long freq) { + return String.format("ZZFA%011d\r",freq).getBytes(); + } + + public static byte[] setReadOperationFreq(){ + return READ_FREQ.getBytes(); + } + + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/FlexNetworkRig.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/FlexNetworkRig.java new file mode 100644 index 00000000..bf799b04 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/FlexNetworkRig.java @@ -0,0 +1,113 @@ +package com.bg7yoz.ft8cn.rigs; + +import android.annotation.SuppressLint; +import android.util.Log; + +import com.bg7yoz.ft8cn.Ft8Message; +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.connector.FlexConnector; +import com.bg7yoz.ft8cn.flex.FlexCommand; +import com.bg7yoz.ft8cn.flex.FlexRadio; +import com.bg7yoz.ft8cn.ft8transmit.GenerateFT8; + +public class FlexNetworkRig extends BaseRig { + private static final String TAG = "FlexNetworkRig"; + private int commandSeq = 1;//指令的序列 + private FlexCommand flexCommand; + private String commandStr; + + //private final int ctrAddress=0xE0;//接收地址,默认0xE0;电台回复命令有时也可以是0x00 + //private byte[] dataBuffer=new byte[0];//数据缓冲区 + @SuppressLint("DefaultLocale") + public void sendCommand(FlexCommand command, String cmdContent) { + if (getConnector().isConnected()) { + commandSeq++; + flexCommand = command; + commandStr = String.format("C%d%03d|%s\n", commandSeq, command.ordinal() + , cmdContent); + getConnector().sendData(commandStr.getBytes()); + } + } + + + @SuppressLint("DefaultLocale") + public synchronized void commandSliceTune(int sliceOder, String freq) { + sendCommand(FlexCommand.SLICE_TUNE, String.format("slice t %d %s", sliceOder, freq)); + } + + @SuppressLint("DefaultLocale") + public synchronized void commandSliceSetMode(int sliceOder, FlexRadio.FlexMode mode) { + sendCommand(FlexCommand.SLICE_SET_TX_ANT, String.format("slice s %d mode=%s", sliceOder, mode.toString())); + } + + @Override + public void setPTT(boolean on) { + getConnector().setPttOn(on); + + } + + @Override + public boolean isConnected() { + if (getConnector() == null) { + return false; + } + return getConnector().isConnected(); + } + + @Override + public void setUsbModeToRig() { + if (getConnector() != null) { + commandSliceSetMode(0, FlexRadio.FlexMode.DIGU);//设置操作模式 + } + } + + @SuppressLint("DefaultLocale") + @Override + public void setFreqToRig() { + if (getConnector() != null) { + commandSliceTune(0, String.format("%.3f", getFreq() / 1000000f)); + } + } + + + @Override + public void onReceiveData(byte[] data) { + //ToastMessage.show("--"+byteToStr(data)); + + } + + @Override + public void readFreqFromRig() { + if (getConnector() != null) { + //getConnector().sendData(IcomRigConstant.setReadFreq(ctrAddress, getCivAddress())); + } + } + + @Override + public void sendWaveData(Ft8Message message) { + + if (getConnector() != null) { + float[] data = GenerateFT8.generateFt8(message, GeneralVariables.getBaseFrequency() + , 24000);//flex音频的采样率是24000 + if (data == null) { + setPTT(false); + return; + } + getConnector().sendWaveData(data); + } + } + + @Override + public String getName() { + return "FlexRadio series"; + } + + + public String getFrequencyStr() { + return BaseRigOperation.getFrequencyStr(getFreq()); + } + + public FlexNetworkRig() { + Log.d(TAG, "FlexRadio: Create."); + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/GuoHeQ900Rig.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/GuoHeQ900Rig.java new file mode 100644 index 00000000..7d66a5ef --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/GuoHeQ900Rig.java @@ -0,0 +1,189 @@ +package com.bg7yoz.ft8cn.rigs; + +import static com.bg7yoz.ft8cn.GeneralVariables.QUERY_FREQ_TIMEOUT; +import static com.bg7yoz.ft8cn.GeneralVariables.START_QUERY_FREQ_DELAY; + +import android.util.Log; + +import java.util.Timer; +import java.util.TimerTask; + +/** + * YAESU的部分电台,回送的数据不是连续的,所以,要做一个缓冲区,接受5字节长度。满了就复位。或发送指令时,就复位。 + */ +public class GuoHeQ900Rig extends BaseRig { + private static final String TAG = "GuoHeQ900Rig"; + private Timer readFreqTimer = new Timer(); + private byte[] buffer; + private int dataCount=-1; + + private TimerTask readTask() { + return new TimerTask() { + @Override + public void run() { + try { + if (!isConnected()) { + readFreqTimer.cancel(); + readFreqTimer.purge(); + readFreqTimer = null; + return; + } + readFreqFromRig(); + } catch (Exception e) { + Log.e(TAG, "readFreq error:" + e.getMessage()); + } + } + }; + } + + + @Override + public void setPTT(boolean on) { + super.setPTT(on); + Log.d(TAG, "setPTT: " + on); + + if (getConnector() != null) { + getConnector().setPttOn(GuoHeRigConstant.setPTTState(on)); + } + } + + public synchronized void setPttOn(byte[] command) { + + getConnector().sendData(command);//以CAT指令发送PTT + } + + @Override + public boolean isConnected() { + if (getConnector() == null) { + return false; + } + return getConnector().isConnected(); + } + + @Override + public void setUsbModeToRig() { + if (getConnector() != null) { + getConnector().sendData(GuoHeRigConstant.setOperationUSBMode());//USB模式 + //getConnector().sendData(GuoHeRigConstant.setOperationFT8Mode());//FT8模式 + } + } + + @Override + public void setFreqToRig() { + if (getConnector() != null) { + getConnector().sendData(GuoHeRigConstant.setOperationFreq(getFreq())); + } + } + + + private int checkHead(byte[] data) { + int count = 0; + for (int i = 0; i < data.length; i++) { + if (data[i] == (byte) 0xa5) { + count++; + if (count == 4) { + return i+1; + } + } + } + return -1; + } + + private void clearBuffer(){ + dataCount=-1; + buffer=null; + } + + @Override + public void onReceiveData(byte[] data) { + synchronized (this) { + try { + int startIndex = checkHead(data); + if (startIndex != -1) { + int len = data[startIndex]+1; + + buffer = new byte[len]; + dataCount = 0; + for (int i = startIndex ; i < data.length; i++) { + buffer[dataCount] = data[i]; + dataCount++; + if (dataCount == buffer.length) { + break; + } + } + } else { + if (buffer == null) { + return; + } + if (dataCount < buffer.length && dataCount > 0) { + for (int i = 0; i < data.length; i++) { + buffer[dataCount] = data[i]; + dataCount++; + if (dataCount == buffer.length) { + break; + } + } + } + } + + if (buffer.length == dataCount) {//说明已经收取全部指令 + byte[] crcData=new byte[buffer.length-2]; + for (int i = 0; i < crcData.length; i++) { + crcData[i]=buffer[i]; + } + //Log.e(TAG, "onReceiveData: crc data:"+byteToStr(crcData) ); + //Log.e(TAG, "onReceiveData: crc --->"+String.format("%x",CRC16.crc16(crcData)) ); + int crc=CRC16.crc16(crcData); + int ttt=((buffer[buffer.length-2]& 0xFF)<<8)|(buffer[buffer.length-1]&0xff); + //Log.e(TAG, "onReceiveData:数据内容:" + byteToStr(buffer)); + if (crc==ttt) {//crc校验成功 + + if (buffer[1] == (byte) 0x0b) {//是电台状态指令 + + long vfoa = ((buffer[5] & 0xFFL) << 24) | + ((buffer[6] & 0xFFL) << 16) | + ((buffer[7] & 0xFFL) << 8) | + ((buffer[8] & 0xFFL)); + long vfob = ((buffer[9] & 0xFFL) << 24) | + ((buffer[10] & 0xFFL) << 16) | + ((buffer[11] & 0xFFL) << 8) | + ((buffer[12] & 0xFFL)); + + if (buffer[13] == (byte) 0x00) { + setFreq(vfoa); + //Log.e(TAG, "onReceiveData: is VFO a"); + } else { + setFreq(vfob); + //Log.e(TAG, "onReceiveData: is VFO b"); + } + //Log.e(TAG, "onReceiveData: vfoa:" + vfoa); + //Log.e(TAG, "onReceiveData: vfob:" + vfob); + + } + } + clearBuffer(); + } + } catch (Exception e) { + Log.e(TAG, "onReceiveData: " + e.getMessage()); + } + } + } + + @Override + public void readFreqFromRig() { + if (getConnector() != null) { + getConnector().sendData(GuoHeRigConstant.setReadOperationFreq()); + } + } + + @Override + public String getName() { + return "GuoHe series"; + } + + public GuoHeQ900Rig() { + readFreqTimer.schedule(readTask(), START_QUERY_FREQ_DELAY, QUERY_FREQ_TIMEOUT); + //readFreqTimer.schedule(readTask(), START_QUERY_FREQ_DELAY, 4000); + } + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/GuoHeRigConstant.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/GuoHeRigConstant.java new file mode 100644 index 00000000..d07a6f16 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/GuoHeRigConstant.java @@ -0,0 +1,112 @@ +package com.bg7yoz.ft8cn.rigs; + +public class GuoHeRigConstant { + private static final String TAG = "Yaesu2RigConstant"; + //LSB:0,USB:1,AM:2,CW:3,RTTY:4,FM:5,WFM:6,CW_R:7,RTTY_R:8,DV:17 + public static final int USB = 0x00; + public static final int LSB = 0x01; + public static final int CW_R = 0x02; + public static final int CW_L = 0x03; + public static final int AM = 0x04; + public static final int WFM = 0x05; + public static final int NFM = 0x06; + public static final int DIGI = 0x07; + public static final int PKT = 0x08; + + //PTT状态 + + //指令集 +// private static final byte[] PTT_ON = {(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x08}; +// private static final byte[] PTT_OFF = {(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x88}; + private static final byte[] PTT_ON = {(byte) 0xA5, (byte) 0xA5, (byte) 0xA5, (byte) 0xA5, (byte) 0x04, (byte) 0x07, (byte) 0x00, (byte) 0x89, (byte) 0xCB}; + private static final byte[] PTT_OFF = {(byte) 0xA5, (byte) 0xA5, (byte) 0xA5, (byte) 0xA5, (byte) 0x04, (byte) 0x07, (byte) 0x01, (byte) 0x99, (byte) 0xEA}; + private static final byte[] USB_MODE = {(byte) 0xA5, (byte) 0xA5, (byte) 0xA5, (byte) 0xA5, (byte) 0x05, (byte) 0x0A, (byte) 0x00, (byte) 0x00, (byte) 0xFF, (byte) 0x44}; + private static final byte[] FT8_MODE = {(byte) 0xA5, (byte) 0xA5, (byte) 0xA5, (byte) 0xA5, (byte) 0x05, (byte) 0x0A, (byte) 0x08, (byte) 0x08, (byte) 0xF7, (byte) 0xE5}; + private static final byte[] READ_FREQ = {(byte) 0xA5, (byte) 0xA5, (byte) 0xA5, (byte) 0xA5, (byte) 0x03, (byte) 0x0B, (byte) 0xF9, (byte) 0x37}; +// private static final byte[] READ_FREQ = {(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x03}; + + + public static String getModeStr(int mode) { + switch (mode) { + case LSB: + return "LSB"; + case USB: + return "USB"; + case CW_R: + return "CW_R"; + case CW_L: + return "CW_L"; + case AM: + return "AM"; + case WFM: + return "WFM"; + case NFM: + return "NFM"; + case DIGI: + return "DIGI"; + case PKT: + return "PKT"; + default: + return "UNKNOWN"; + } + } + + + public static byte[] setPTTState(boolean on) { + if (on) { + return PTT_ON; + } else { + return PTT_OFF; + } + + } + + public static byte[] setOperationUSBMode() { + return USB_MODE; + } + public static byte[] setOperationFT8Mode() { + return FT8_MODE; + } + public static byte[] setOperationFreq(long freq) { + + byte[] data = new byte[]{(byte) 0xA5, (byte) 0xA5, (byte) 0xA5, (byte) 0xA5, (byte) 0x0b, (byte) 0x09 + , (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00//频率VFOA + , (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00//频率VFOB + , (byte) 0x3B, (byte) 0x6B}; + + data[6] = (byte) ((0x0000000000ff000000 & freq) >> 24); + data[7] = (byte) ((0x000000000000ff0000 & freq) >> 16); + data[8] = (byte) ((0x00000000000000ff00 & freq) >> 8); + data[9] = (byte) (0x0000000000000000ff & freq); + data[10] = (byte) ((0x0000000000ff000000 & freq) >> 24); + data[11] = (byte) ((0x000000000000ff0000 & freq) >> 16); + data[12] = (byte) ((0x00000000000000ff00 & freq) >> 8); + data[13] = (byte) (0x0000000000000000ff & freq); + + byte[] crcData=new byte[]{(byte)0x0b,(byte) 0x09 + ,(byte) ((0x0000000000ff000000 & freq) >> 24) + ,(byte) ((0x000000000000ff0000 & freq) >> 16) + ,(byte) ((0x00000000000000ff00 & freq) >> 8) + ,(byte) (0x0000000000000000ff & freq) + ,(byte) ((0x0000000000ff000000 & freq) >> 24) + ,(byte) ((0x000000000000ff0000 & freq) >> 16) + ,(byte) ((0x00000000000000ff00 & freq) >> 8) + ,(byte) (0x0000000000000000ff & freq)}; + + int crc=CRC16.crc16(crcData); + data[14]=(byte) ((crc&0x00ff00)>>8); + data[15]=(byte) (crc&0x0000ff); + + + + return data; + + } + + public static byte[] setReadOperationFreq() { + return READ_FREQ; + } + + + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/IcomCommand.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/IcomCommand.java new file mode 100644 index 00000000..a5502c7f --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/IcomCommand.java @@ -0,0 +1,189 @@ +package com.bg7yoz.ft8cn.rigs; + + +import android.util.Log; + +public class IcomCommand { + private static final String TAG = "RigCommand"; + private byte[] rawData; + + /** + * 获取主命令 + * + * @return 主命令值 + */ + public int getCommandID() {//获取主命令 + if (rawData.length < 5) { + return -1; + } + return rawData[4]; + } + + /** + * 获取子命令,有的指令没有子命令,要注意。 + * + * @return 子命令 + */ + public int getSubCommand() {//获取子命令 + if (rawData.length < 7) { + return -1; + } + return rawData[5]; + } + + /** + * 获取带2字节的子命令,有的指令没有子命令,有的指令只有1个字节,要注意。 + * @return 子指令 + */ + public int getSubCommand2() {//获取子命令 + if (rawData.length < 8) { + return -1; + } + return readShortData(rawData,6); + } + /** + * 获取带3字节的子命令,有的指令没有子命令,有的指令只有1个字节,要注意。 + * @return 子指令 + */ + public int getSubCommand3() {//获取子命令 + if (rawData.length < 9) { + return -1; + } + return ((int) rawData[7] & 0xff) + | ((int) rawData[6] & 0xff) << 8 + | ((int) rawData[5] & 0xff) << 16; + + + } + + /** + * 获取数据区,有的指令有子命令,有的没有子命令,所以要区分出来。子命令占一个字节 + * + * @param hasSubCommand 是否有子命令 + * @return 返回数据区 + */ + public byte[] getData(boolean hasSubCommand) { + int pos; + + if (hasSubCommand) { + pos = 6; + } else { + pos = 5; + } + if (rawData.length < pos + 1) {//没有数据区了 + return null; + } + + byte[] data = new byte[rawData.length - pos]; + + for (int i = 0; i < rawData.length - pos; i++) { + data[i] = rawData[pos + i]; + } + return data; + } + + public byte[] getData2Sub() { + if (rawData.length < 9) {//没有数据区了 + return null; + } + + byte[] data = new byte[rawData.length - 8]; + + System.arraycopy(rawData, 8, data, 0, rawData.length - 8); + return data; + } + //解析接收的指令 + + /** + * 从串口中接到的数据解析出指令的数据:FE FE E0 A4 Cn Sc data FD + * + * @param ctrAddr 控制者地址,默认E0或00 + * @param rigAddr 电台地址,705默认是A4 + * @param buffer 从串口接收到的数据 + * @return 返回电台指令对象,如果不符合指令的格式,返回null。 + */ + public static IcomCommand getCommand(int ctrAddr, int rigAddr, byte[] buffer) { + Log.d(TAG, "getCommand: "+BaseRig.byteToStr(buffer) ); + if (buffer.length <= 5) {//指令的长度不可能小于等5 + return null; + } + int position = -1;//指令的位置 + for (int i = 0; i < buffer.length; i++) { + if (i + 6 > buffer.length) {//说明没找到指令 + return null; + } + if (buffer[i] == (byte) 0xfe + && buffer[i + 1] == (byte) 0xfe//命令头0xfe 0xfe + && (buffer[i + 2] == (byte) ctrAddr || (buffer[i + 2] == (byte) 0x00))//控制者地址默认E0或00 + && buffer[i + 3] == (byte) rigAddr) {//电台地址,705的默认值是A4,协谷是70 + position = i; + break; + } + } + //说明没找到 + if (position == -1) { + return null; + } + + int dataEnd = -1; + //从命令头之后查起。所以i=position + for (int i = position; i < buffer.length; i++) { + if (buffer[i] == (byte) 0xfd) {//是否到结尾了 + dataEnd = i; + break; + } + } + if (dataEnd == -1) {//说明没找到结尾 + return null; + } + + IcomCommand icomCommand = new IcomCommand(); + icomCommand.rawData = new byte[dataEnd - position]; + int pos = 0; + for (int i = position; i < dataEnd; i++) {//把指令数据搬到rawData中 + //icomCommand.rawData[i] = buffer[i]; + icomCommand.rawData[pos] = buffer[i];//定位错误 + pos++; + } + return icomCommand; + } + + + /** + * 从数据区中计算频率BCD码 + * + * @param hasSubCommand 是否含有子命令 + * @return 返回频率值 + */ + public long getFrequency(boolean hasSubCommand) { + byte[] data = getData(hasSubCommand); + if (data.length < 5) { + return -1; + } + return (int) (data[0] & 0x0f)//取个位 1hz + + ((int) (data[0] >> 4) & 0xf) * 10//取十位 10hz + + (int) (data[1] & 0x0f) * 100//百位 100hz + + ((int) (data[1] >> 4) & 0xf) * 1000//千位 1khz + + (int) (data[2] & 0x0f) * 10000//万位 10khz + + ((int) (data[2] >> 4) & 0xf) * 100000//十万位 100khz + + (int) (data[3] & 0x0f) * 1000000//百万位 1Mhz + + ((int) (data[3] >> 4) & 0xf) * 10000000//千万位 10Mhz + + (int) (data[4] & 0x0f) * 100000000//亿位 100Mhz + + ((int) (data[4] >> 4) & 0xf) * 100000000;//十亿位 1Ghz + } + + + /** + * 把字节转换成short,不做小端转换!! + * + * @param data 字节数据 + * @return short + */ + public static short readShortData(byte[] data, int start) { + if (data.length - start < 2) return 0; + return (short) ((short) data[start + 1] & 0xff + | ((short) data[start] & 0xff) << 8); + } + + +} \ No newline at end of file diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/IcomRig.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/IcomRig.java new file mode 100644 index 00000000..9421905a --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/IcomRig.java @@ -0,0 +1,284 @@ +package com.bg7yoz.ft8cn.rigs; + +/** + * IcomRig是通用的Icom电台控制类。对于wifi模式,实际的控制是通过IComWifiConnector(继承于WifiConnector) + * 在IComWifiConnector中,有IComWifiRig具体操作电台 + */ + +import android.util.Log; + +import com.bg7yoz.ft8cn.Ft8Message; +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.connector.ConnectMode; +import com.bg7yoz.ft8cn.database.ControlMode; +import com.bg7yoz.ft8cn.ft8transmit.GenerateFT8; +import com.bg7yoz.ft8cn.icom.IComPacketTypes; +import com.bg7yoz.ft8cn.ui.ToastMessage; + +import java.util.Timer; +import java.util.TimerTask; + +public class IcomRig extends BaseRig { + private static final String TAG = "IcomRig"; + + private final int ctrAddress = 0xE0;//接收地址,默认0xE0;电台回复命令有时也可以是0x00 + private byte[] dataBuffer = new byte[0];//数据缓冲区 + private int alc = 0; + private int swr = 0; + private boolean alcMaxAlert = false; + private boolean swrAlert = false; + private Timer meterTimer;//查询meter的Timer + + private boolean oldVersion = false;//针对老电台,可能不支持SWR查询 + //private boolean isPttOn = false; + + @Override + public void setPTT(boolean on) { + super.setPTT(on); + //isPttOn = on; + alcMaxAlert = false; + swrAlert = false; + if (on) { + //修正连接方式0x03是wlan,01是usb,0x02是usb+mic,确保声音能发送到电台 + if (GeneralVariables.connectMode == ConnectMode.NETWORK) { + sendCivData(IcomRigConstant.setConnectorDataMode(ctrAddress, getCivAddress(), (byte) 0x03)); + } else if (GeneralVariables.connectMode == ConnectMode.USB_CABLE) { + sendCivData(IcomRigConstant.setConnectorDataMode(ctrAddress, getCivAddress(), (byte) 0x01)); + } else { + sendCivData(IcomRigConstant.setConnectorDataMode(ctrAddress, getCivAddress(), (byte) 0x02)); + } + } + + if (getConnector() != null) { + if (GeneralVariables.connectMode == ConnectMode.NETWORK) { + getConnector().setPttOn(on); + return; + } + + switch (getControlMode()) { + case ControlMode.CAT://以CIV指令 + getConnector().setPttOn(IcomRigConstant.setPTTState(ctrAddress, getCivAddress() + , on ? IcomRigConstant.PTT_ON : IcomRigConstant.PTT_OFF)); + break; + //case ControlMode.NETWORK: + case ControlMode.RTS: + case ControlMode.DTR: + + getConnector().setPttOn(on); + break; + } + } + } + + @Override + public boolean isConnected() { + if (getConnector() == null) { + return false; + } + return getConnector().isConnected(); + } + + @Override + public void setUsbModeToRig() { + if (getConnector() != null) { + //因为担心老的ICOM电台不一定支持USB-D,所以,先做个一USB模式,再进入USB-D模式, + // 这样,如果USB-D模式不支持,USB-D的指令就是无效的,电台就停留在USB模式下了 + //getConnector().sendData(IcomRigConstant.setOperationMode(ctrAddress + // , getCivAddress(), IcomRigConstant.USB));//usb + getConnector().sendData(IcomRigConstant.setOperationDataMode(ctrAddress + , getCivAddress(), IcomRigConstant.USB));//usb-d + } + } + + private void sendCivData(byte[] data) { + if (getConnector() != null) { + getConnector().sendData(data); + } + } + + @Override + public void setFreqToRig() { + if (getConnector() != null) { + getConnector().sendData(IcomRigConstant.setOperationFrequency(ctrAddress + , getCivAddress(), getFreq())); + } + } + + /** + * 查找指令的结尾的位置,如果没找到,值是-1。 + * + * @param data 数据 + * @return 位置 + */ + private int getCommandEnd(byte[] data) { + for (int i = 0; i < data.length; i++) { + if (data[i] == (byte) 0xFD) { + return i; + } + } + return -1; + } + + /** + * 查找指令头,没找到返回-1,找到返回FE FE的第一个位置 + * + * @param data 数据 + * @return 位置 + */ + private int getCommandHead(byte[] data) { + if (data.length < 2) return -1; + for (int i = 0; i < data.length - 1; i++) { + if (data[i] == (byte) 0xFE && data[i + 1] == (byte) 0xFE) { + return i; + } + } + return -1; + } + + @Override + public void sendWaveData(Ft8Message message) {//发送音频数据到电台,用于网络方式 + if (getConnector() != null) {//把生成的具体音频数据传递到Connector, + float[] data = GenerateFT8.generateFt8(message, GeneralVariables.getBaseFrequency() + , 12000);//此处icom电台发射音频的采样率是12000 + if (data == null) { + setPTT(false); + return; + } + getConnector().sendWaveData(data); + } + } + + private void analysisCommand(byte[] data) { + int headIndex = getCommandHead(data); + if (headIndex == -1) {//说明没有指令头 + return; + } + IcomCommand icomCommand; + if (headIndex == 0) { + icomCommand = IcomCommand.getCommand(ctrAddress, getCivAddress(), data); + } else { + byte[] temp = new byte[data.length - headIndex]; + System.arraycopy(data, headIndex, temp, 0, temp.length); + icomCommand = IcomCommand.getCommand(ctrAddress, getCivAddress(), temp); + } + if (icomCommand == null) { + return; + } + + //目前只对频率和模式消息作反应 + switch (icomCommand.getCommandID()) { + + case IcomRigConstant.CMD_SEND_FREQUENCY_DATA://获取到的是频率数据 + case IcomRigConstant.CMD_READ_OPERATING_FREQUENCY: + //获取频率 + //ToastMessage.show(byteToStr(icomCommand.getData(false))); + setFreq(icomCommand.getFrequency(false)); + break; + case IcomRigConstant.CMD_SEND_MODE_DATA://获取到的是模式数据 + case IcomRigConstant.CMD_READ_OPERATING_MODE: + break; + case IcomRigConstant.CMD_READ_METER://读meter//此处的指令,只在网络模式实现,以后可能会在串口方面实现 + if (icomCommand.getSubCommand() == IcomRigConstant.CMD_READ_METER_ALC) { + alc = IcomRigConstant.twoByteBcdToInt(icomCommand.getData(true)); + } + if (icomCommand.getSubCommand() == IcomRigConstant.CMD_READ_METER_SWR) { + swr = IcomRigConstant.twoByteBcdToInt(icomCommand.getData(true)); + } + showAlert();//检查meter值是否在告警范围 + break; + case IcomRigConstant.CMD_CONNECTORS: + break; + + } + } + + private void showAlert() { + if ((swr >= IcomRigConstant.swr_alert_max) && GeneralVariables.swr_switch_on) { + if (!swrAlert) { + swrAlert = true; + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.swr_high_alert)); + } + } else { + swrAlert = false; + } + if ((alc > IcomRigConstant.alc_alert_max) && GeneralVariables.alc_switch_on) {//网络模式下不警告ALC + if (!alcMaxAlert) { + alcMaxAlert = true; + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.alc_high_alert)); + } + } else { + alcMaxAlert = false; + } + + } + + @Override + public void onReceiveData(byte[] data) { + //ToastMessage.show(byteToStr(data)); + + int commandEnd = getCommandEnd(data); + if (commandEnd <= -1) {//这是没有指令结尾 + byte[] temp = new byte[dataBuffer.length + data.length]; + System.arraycopy(dataBuffer, 0, temp, 0, dataBuffer.length); + System.arraycopy(data, 0, temp, dataBuffer.length, data.length); + dataBuffer = temp; + } else { + byte[] temp = new byte[dataBuffer.length + commandEnd + 1]; + System.arraycopy(dataBuffer, 0, temp, 0, dataBuffer.length); + dataBuffer = temp; + System.arraycopy(data, 0, dataBuffer, dataBuffer.length - commandEnd - 1, commandEnd + 1); + } + if (commandEnd != -1) { + analysisCommand(dataBuffer); + } + dataBuffer = new byte[0];//清空缓冲区 + if (commandEnd <= -1 || commandEnd < data.length) { + byte[] temp = new byte[data.length - commandEnd + 1]; + for (int i = 0; i < data.length - commandEnd - 1; i++) { + temp[i] = data[commandEnd + i + 1]; + } + dataBuffer = temp; + } + + + } + + @Override + public void readFreqFromRig() { + if (getConnector() != null) { + getConnector().sendData(IcomRigConstant.setReadFreq(ctrAddress, getCivAddress())); + } + } + + @Override + public String getName() { + return "ICOM series"; + } + + public void startMeterTimer() { + meterTimer = new Timer(); + meterTimer.scheduleAtFixedRate(new TimerTask() { + @Override + public void run() { + if (isPttOn() && !oldVersion) {//当Ptt被按下去的时候测量,并且不是老版本的电台 + sendCivData(IcomRigConstant.getSWRState(ctrAddress, getCivAddress())); + sendCivData(IcomRigConstant.getALCState(ctrAddress, getCivAddress())); + } + } + }, 0, IComPacketTypes.METER_TIMER_PERIOD_MS); + } + + + public String getFrequencyStr() { + return BaseRigOperation.getFrequencyStr(getFreq()); + } + + + public IcomRig(int civAddress, boolean newRig) { + Log.d(TAG, "IcomRig: Create."); + this.oldVersion = !newRig;//有的老电台不支持swr查询 + setCivAddress(civAddress); + startMeterTimer(); + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/IcomRigConstant.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/IcomRigConstant.java new file mode 100644 index 00000000..d1161d1d --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/IcomRigConstant.java @@ -0,0 +1,284 @@ +package com.bg7yoz.ft8cn.rigs; + +import android.util.Log; + +public class IcomRigConstant { + private static final String TAG = "IcomRigConstant"; + //LSB:0,USB:1,AM:2,CW:3,RTTY:4,FM:5,WFM:6,CW_R:7,RTTY_R:8,DV:17 + public static final int LSB = 0; + public static final int USB = 1; + public static final int AM = 2; + public static final int CW = 3; + public static final int RTTY = 4; + public static final int FM = 5; + public static final int WFM = 6; + public static final int CW_R = 7; + public static final int RTTY_R = 8; + public static final int DV = 0x17; + public static final int UNKNOWN = -1; + + + public static final int swr_alert_max=120;//相当于3.0 + public static final int alc_alert_max=120;//超过,在表上显示红色 + + //协谷6100的ALC值的原始值(0~255)在127±50都是最佳线性度范围,转换到0~120的线性范围就是36.17到83.19 + public static final int xiegu_alc_alert_max=84;//超过,在表上显示红色 + public static final int xiegu_alc_alert_min=36;//超过,在表上显示红色 + + + + //PTT状态 + public static final int PTT_ON = 1; + public static final int PTT_OFF = 0; + + //指令集 + public static final byte CMD_RESULT_OK = (byte) 0xfb;// + public static final byte CMD_RESULT_FAILED = (byte) 0xfa;// + + public static final byte[] SEND_FREQUENCY_DATA = {0x00};//发送频率数据 + public static final byte CMD_SEND_FREQUENCY_DATA = 0x00;//发送频率数据 + + public static final byte[] SEND_MODE_DATA = {0x01};//发送模式数据 + public static final byte CMD_SEND_MODE_DATA = 0x01;//发送模式数据 + + public static final byte[] READ_BAND_EDGE_DATA = {0x02};//读频率的波段边界 + public static final byte CMD_READ_BAND_EDGE_DATA = 0x02;//读频率的波段边界 + + public static final byte[] READ_OPERATING_FREQUENCY = {0x03};//发送模式数据 + public static final byte CMD_READ_OPERATING_FREQUENCY = 0x03;//发送模式数据 + + public static final byte[] READ_OPERATING_MODE = {0x04};//读取操作模式 + public static final byte CMD_READ_OPERATING_MODE = 0x04;//读取操作模式 + + public static final byte[] SET_OPERATING_FREQUENCY = {0x05};//设置操作的频率 + public static final byte CMD_SET_OPERATING_FREQUENCY = 0x05;//设置操作的频率 + + public static final byte[] SET_OPERATING_MODE = {0x06};//设置操作的模式 + public static final byte CMD_SET_OPERATING_MODE = 0x06;//设置操作的模式 + + public static final byte CMD_READ_METER = 0x15;//读meter + public static final byte CMD_READ_METER_SWR = 0x12;//读meter子命令,驻波表 + public static final byte CMD_READ_METER_ALC = 0x13;//读meter子命令,ALC表 + public static final byte CMD_CONNECTORS = 0x1A;//Connector设置,读取 + public static final byte CMD_CONNECTORS_DATA_MODE = 0x05;//Connector设置,读取 + public static final int CMD_CONNECTORS_DATA_WLAN_LEVEL = 0x050117;//Connector设置,读取 + + + + + + public static final byte CMD_COMMENT_1A = 0x1A;//1A指令 + public static final byte[] SET_READ_PTT_STATE = {0x1A, 0x00, 0x48};//读取或设置PTT状态,不建议使用 + + public static final byte[] READ_TRANSCEIVER_STATE = {0x1A, 0x00, 0x48};//读取电台发射状态 + public static final byte[] SET_TRANSCEIVER_STATE_ON = {0x1C, 0x00, 0x01};//设置电台处于发射状态TX + public static final byte[] SET_TRANSCEIVER_STATE_OFF = {0x1C, 0x00, 0x00};//设置电台关闭发射状态RX + public static final byte[] READ_TRANSMIT_FREQUENCY = {0x1C, 0x03};//读取电台发射时的频率 + + public static String getModeStr(int mode) { + switch (mode) { + case LSB: + return "LSB"; + case USB: + return "USB"; + case AM: + return "AM"; + case CW: + return "CW"; + case RTTY: + return "RTTY"; + case FM: + return "FM"; + case CW_R: + return "CW_R"; + case RTTY_R: + return "RTTY_R"; + case DV: + return "DV"; + default: + return "UNKNOWN"; + } + } + + + public static byte[] setPTTState(int ctrAddr, int rigAddr, int state) { + //1C指令,例如PTT ON:FE FE A1 E0 1C 00 01 FD + byte[] data = new byte[8]; + data[0] = (byte) 0xfe; + data[1] = (byte) 0xfe; + data[2] = (byte) rigAddr; + data[3] = (byte) ctrAddr; + data[4] = (byte) 0x1c;//主指令代码 + data[5] = (byte) 0x00;//子指令代码 + data[6] = (byte) state;//状态 01=tx 00=rx + data[7] = (byte) 0xfd; + return data; + } + + /** + * 读驻波表 + * + * @param ctrAddr 我的地址 + * @param rigAddr 电台地址 + * @return 指令数据包 + */ + public static byte[] getSWRState(int ctrAddr, int rigAddr) { + //1C指令,例如PTT ON:FE FE A1 E0 15 12 FD + byte[] data = new byte[7]; + data[0] = (byte) 0xfe; + data[1] = (byte) 0xfe; + data[2] = (byte) rigAddr; + data[3] = (byte) ctrAddr; + data[4] = (byte) CMD_READ_METER;//主指令代码 + data[5] = (byte) CMD_READ_METER_SWR;//子指令代码SWR + data[6] = (byte) 0xfd; + return data; + } + + /** + * 读ALC表 + * + * @param ctrAddr 我的地址 + * @param rigAddr 电台地址 + * @return 指令数据包 + */ + public static byte[] getALCState(int ctrAddr, int rigAddr) { + //1C指令,例如PTT ON:FE FE A1 E0 15 12 FD + byte[] data = new byte[7]; + data[0] = (byte) 0xfe; + data[1] = (byte) 0xfe; + data[2] = (byte) rigAddr; + data[3] = (byte) ctrAddr; + data[4] = (byte) CMD_READ_METER;//主指令代码 + data[5] = (byte) CMD_READ_METER_ALC;//子指令代码ALC + data[6] = (byte) 0xfd; + return data; + } + + public static byte[] getConnectorWLanLevel(int ctrAddr, int rigAddr){ + //1A指令,例如DATA MODE=WLAN:FE FE A1 E0 1A 05 01 17 FD + byte[] data = new byte[9]; + data[0] = (byte) 0xfe; + data[1] = (byte) 0xfe; + data[2] = (byte) rigAddr; + data[3] = (byte) ctrAddr; + data[4] = (byte) CMD_CONNECTORS;//主指令代码1A + data[5] = (byte) CMD_CONNECTORS_DATA_MODE;//WLan level + data[6] = (byte) 0x01; + data[7] = (byte) 0x17; + data[8] = (byte) 0xfd; + return data; + } + + public static byte[] setConnectorWLanLevel(int ctrAddr, int rigAddr,int level){ + //1A指令,例如DATA MODE=WLAN:FE FE A1 E0 1A 05 01 17 FD + byte[] data = new byte[11]; + data[0] = (byte) 0xfe; + data[1] = (byte) 0xfe; + data[2] = (byte) rigAddr; + data[3] = (byte) ctrAddr; + data[4] = (byte) CMD_CONNECTORS;//主指令代码1A + data[5] = (byte) CMD_CONNECTORS_DATA_MODE;//子指令代码ALC + data[6] = (byte) 0x01; + data[7] = (byte) 0x17; + data[8] = (byte) (level >> 8 & 0xff); + data[9] = (byte) (level &0xff); + data[10] = (byte) 0xfd; + return data; + } + + //设置数据通讯方式 + public static byte[] setConnectorDataMode(int ctrAddr, int rigAddr,byte mode){ + //1A指令,例如DATA MODE=WLAN:FE FE A1 E0 1A 05 01 19 FD + byte[] data = new byte[10]; + data[0] = (byte) 0xfe; + data[1] = (byte) 0xfe; + data[2] = (byte) rigAddr; + data[3] = (byte) ctrAddr; + data[4] = (byte) CMD_CONNECTORS;//主指令代码1A + data[5] = (byte) CMD_CONNECTORS_DATA_MODE;//子指令代码ALC + data[6] = (byte) 0x01;// + data[7] = (byte) 0x19;// + data[8] = (byte) mode;//数据连接的方式 + data[9] = (byte) 0xfd; + return data; + } + public static byte[] setOperationMode(int ctrAddr, int rigAddr, int mode) { + //06指令,例如USB=01:FE FE A1 E0 06 01 FD + byte[] data = new byte[8]; + data[0] = (byte) 0xfe; + data[1] = (byte) 0xfe; + data[2] = (byte) rigAddr; + data[3] = (byte) ctrAddr; + data[4] = (byte) 0x06;//指令代码 + data[5] = (byte) mode;//USB=01 + data[6] = (byte) 0x01;//fil1 + data[7] = (byte) 0xfd; + return data; + } + + public static byte[] setOperationDataMode(int ctrAddr, int rigAddr, int mode) { + //26指令,例如USB-D=01:FE FE A1 E0 26 01 01 01 FD + byte[] data = new byte[10]; + data[0] = (byte) 0xfe; + data[1] = (byte) 0xfe; + data[2] = (byte) rigAddr;//70 + data[3] = (byte) ctrAddr;//E0 + data[4] = (byte) 0x26;//指令代码 + data[5] = (byte) 0x00;//指令代码 + data[6] = (byte) mode;//USB=01 + data[7] = (byte) 0x01;//data模式 + data[8] = (byte) 0x01;//fil1 + data[9] = (byte) 0xfd; + return data; + } + + public static byte[] setReadFreq(int ctrAddr, int rigAddr) { + //06指令,例如USB=01:FE FE A1 E0 06 01 FD + byte[] data = new byte[6]; + data[0] = (byte) 0xfe; + data[1] = (byte) 0xfe; + data[2] = (byte) rigAddr; + data[3] = (byte) ctrAddr; + data[4] = (byte) 0x03;//指令代码 + data[5] = (byte) 0xfd; + return data; + } + + + public static byte[] setOperationFrequency(int ctrAddr, int rigAddr, long freq) { + //05指令,例如14.074M:FE FE A4 E0 05 00 40 07 14 00 FD + byte[] data = new byte[11]; + data[0] = (byte) 0xfe; + data[1] = (byte) 0xfe; + data[2] = (byte) rigAddr; + data[3] = (byte) ctrAddr; + data[4] = (byte) 0x05;//指令代码 + data[5] = (byte) (((byte) (freq % 100 / 10) << 4) + (byte) (freq % 10)); + data[6] = (byte) (((byte) (freq % 10000 / 1000) << 4) + (byte) (freq % 1000 / 100)); + data[7] = (byte) (((byte) (freq % 1000000 / 100000) << 4) + (byte) (freq % 100000 / 10000)); + data[8] = (byte) (((byte) (freq % 100000000 / 10000000) << 4) + (byte) (freq % 10000000 / 1000000)); + data[9] = (byte) (((byte) (freq / 1000000000) << 4) + (byte) (freq % 1000000000 / 100000000)); + data[10] = (byte) 0xfd; + + Log.d(TAG, "setOperationFrequency: " + BaseRig.byteToStr(data)); + return data; + } + + public static int twoByteBcdToInt(byte[] data) { + if (data.length < 2) return 0; + return (int) (data[1] & 0x0f)//取个位 + + ((int) (data[1] >> 4) & 0xf) * 10//取十位 + + (int) (data[0] & 0x0f) * 100//百位 + + ((int) (data[0] >> 4) & 0xf) * 1000;//千位 + + } + public static int twoByteBcdToIntBigEnd(byte[] data) { + if (data.length < 2) return 0; + return (int) (data[0] & 0x0f)//取个位 + + ((int) (data[0] >> 4) & 0xf) * 10//取十位 + + (int) (data[1] & 0x0f) * 100//百位 + + ((int) (data[1] >> 4) & 0xf) * 1000;//千位 + + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/InstructionSet.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/InstructionSet.java new file mode 100644 index 00000000..75ff115c --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/InstructionSet.java @@ -0,0 +1,33 @@ +package com.bg7yoz.ft8cn.rigs; + +public class InstructionSet { + public static final int ICOM=0; + public static final int YAESU_2=1;//5字节数据 817 + public static final int YAESU_3_9=2;//9字节频率 + public static final int YAESU_3_8=3;//8字节频率 + public static final int YAESU_3_450=4;//PTT发射不通 + public static final int KENWOOD_TK90=5;//11字节频率,VFO模式下才可用 + public static final int YAESU_DX10=6;//9字节,DATA-U模式 + public static final int KENWOOD_TS590=7;//11字节频率,VFO模式 + public static final int GUOHE_Q900=8;//国赫Q900,5字节一次性接收,与YAESU2代不同 + public static final int XIEGUG90S=9;//协谷G90S,指令与ICOM兼容,但不会主动发送频率的变化,需要定期获取 + public static final int ELECRAFT=10;//Elecraft k3 + public static final int FLEX_CABLE=11;//FLEX6000; + public static final int FLEX_NETWORK=12;//FLEX网络模式连接; + public static final int XIEGU_6100=13;//协谷X6100; + public static final int KENWOOD_TS2000=14;//建武TS2000,发射指令是TX0; + public static final int WOLF_SDR_DIGU=15;//UA3REO Wolf SDR,DIG-U模式,兼容YAESU 450D; + public static final int WOLF_SDR_USB=16;//UA3REO Wolf SDR,USB模式,兼容YAESU 450D; + + public static final int TRUSDX=17;//(tr)USDX; + public static final int KENWOOD_TS570=18;//KENWOOD TS-570D + public static final int YAESU_3_9_U_DIG=19;//KENWOOD TS-570D + + public static final int XIEGU_6100_FT8CNS=20;//6100的ft8cns版 + public static final int YAESU_847=21;//Ft-847 + public static final int ICOM_756=22;//Ft-847 + + + + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/KenwoodKT90Rig.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/KenwoodKT90Rig.java new file mode 100644 index 00000000..d044da8e --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/KenwoodKT90Rig.java @@ -0,0 +1,144 @@ +package com.bg7yoz.ft8cn.rigs; + +import static com.bg7yoz.ft8cn.GeneralVariables.QUERY_FREQ_TIMEOUT; +import static com.bg7yoz.ft8cn.GeneralVariables.START_QUERY_FREQ_DELAY; + +import android.os.Handler; +import android.util.Log; + +import com.bg7yoz.ft8cn.database.ControlMode; + +import java.util.Timer; +import java.util.TimerTask; + +/** + * 3代的指令,不同电台还有不同,频率长度981,991是9位,其它的长度是8位 + */ +public class KenwoodKT90Rig extends BaseRig { + private static final String TAG = "KenwoodKT90Rig"; + private final StringBuilder buffer = new StringBuilder(); + + private Timer readFreqTimer = new Timer(); + + private TimerTask readTask() { + return new TimerTask() { + @Override + public void run() { + try { + if (!isConnected()) { + readFreqTimer.cancel(); + readFreqTimer.purge(); + readFreqTimer = null; + return; + } + readFreqFromRig(); + } catch (Exception e) { + Log.e(TAG, "readFreq error:" + e.getMessage()); + } + } + }; + } + + /** + * 清空缓存数据 + */ + private void clearBufferData() { + buffer.setLength(0); + } + + @Override + public void setPTT(boolean on) { + super.setPTT(on); + if (getConnector() != null) { + switch (getControlMode()) { + case ControlMode.CAT://以CIV指令 + getConnector().setPttOn(KenwoodTK90RigConstant.setPTTState(on)); + break; + case ControlMode.RTS: + case ControlMode.DTR: + getConnector().setPttOn(on); + break; + } + } + } + + @Override + public boolean isConnected() { + if (getConnector() == null) { + return false; + } + return getConnector().isConnected(); + } + + @Override + public void setUsbModeToRig() { + if (getConnector() != null) { + getConnector().sendData(KenwoodTK90RigConstant.setOperationUSBMode()); + } + } + + @Override + public void setFreqToRig() { + if (getConnector() != null) { + getConnector().sendData(KenwoodTK90RigConstant.setOperationFreq(getFreq())); + } + } + + @Override + public void onReceiveData(byte[] data) { + String s = new String(data); + + if (!s.contains("\r")) + { + buffer.append(s); + if (buffer.length()>1000) clearBufferData(); + //说明数据还没接收完。 + }else { + if (s.indexOf("\r")>0){//说明接到结束的数据了,并且不是第一个字符是; + buffer.append(s.substring(0,s.indexOf("\r"))); + } + //开始分析数据 + Yaesu3Command yaesu3Command = Yaesu3Command.getCommand(buffer.toString()); + clearBufferData();//清一下缓存 + //要把剩下的数据放到缓存里 + buffer.append(s.substring(s.indexOf("\r")+1)); + + if (yaesu3Command == null) { + return; + } + if (yaesu3Command.getCommandID().equalsIgnoreCase("FA")) { + long tempFreq=Yaesu3Command.getFrequency(yaesu3Command); + if (tempFreq!=0) {//如果tempFreq==0,说明频率不正常 + setFreq(Yaesu3Command.getFrequency(yaesu3Command)); + } + } + + } + + } + + @Override + public void readFreqFromRig() { + if (getConnector() != null) { + clearBufferData();//清空一下缓存 + getConnector().sendData(KenwoodTK90RigConstant.setReadOperationFreq()); + } + } + + @Override + public String getName() { + return "KENWOOD TK90"; + } + + public KenwoodKT90Rig() { + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + if (getConnector()!=null){ + getConnector().sendData(KenwoodTK90RigConstant.setVFOMode()); + } + } + },START_QUERY_FREQ_DELAY-500); + readFreqTimer.schedule(readTask(), START_QUERY_FREQ_DELAY,QUERY_FREQ_TIMEOUT); + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/KenwoodTK90RigConstant.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/KenwoodTK90RigConstant.java new file mode 100644 index 00000000..127dd0aa --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/KenwoodTK90RigConstant.java @@ -0,0 +1,178 @@ +package com.bg7yoz.ft8cn.rigs; +/** + * 由DS1UFX 于2023-08-16提交修改(基于0.9版),增加(tr)uSDX audio over cat的支持。 + */ + +import android.annotation.SuppressLint; + +public class KenwoodTK90RigConstant { + private static final String TAG = "KenwoodTK90RigConstant"; + //LSB:0,USB:1,AM:2,CW:3,RTTY:4,FM:5,WFM:6,CW_R:7,RTTY_R:8,DV:17 + public static final int LSB = 0x01; + public static final int USB = 0x02; + public static final int CW = 0x03; + public static final int FSK = 0x04; + public static final int AM = 0x05; + public static final int DATA = 0x06; + + public static final int ts_590_swr_alert_max = 15;//相当于3.0 + public static final int ts_590_alc_alert_max = 15;//超过,在表上显示红色 + + //PTT状态 + + //指令集 + private static final String PTT_ON = "TX\r"; + private static final String PTT_OFF = "RX\r"; + private static final String USB_MODE = "MD2\r"; + private static final String READ_FREQ = "FA\r"; + private static final String READ_METERS = "RM\r"; + private static final String SET_VFO = "FR0\r"; + + + private static final String TS590_VFO_A = "FR0;";//KENWOOD TS590,设置VFO -A + private static final String TS2000_PTT_ON = "TX0;";//KENWOOD TS2000,PTT + private static final String TS590_PTT_ON = "TX1;";//KENWOOD TS590,PTT + private static final String FLEX_6000_PTT_ON = "TX01;";//FLEX_6000,PTT + private static final String TS590_PTT_OFF = "RX;";//KENWOOD TS590,PTT + private static final String FLEX_SET_USB_DATA = "MD9;";//FLEX6000 DIGU + private static final String TS590_SET_USB = "MD2;";//KENWOOD USB MODE + private static final String TS590_READ_FREQ = "FA;";//KENWOOD 读频率 + private static final String TS590_READ_METERS = "RM;";//KENWOOD 读METER + + private static final String TS570_PTT_OFF = "RX;";//KENWOOD TS570,PTT + private static final String TS570_PTT_ON = "TX;";//KENWOOD TS570,PTT + + + // (tr)uSDX extensions + private static final String TRUSDX_STREAMING_OFF = "UA0;"; + private static final String TRUSDX_STREAMING_ON_SPEAKER_ON = "UA1;"; + private static final String TRUSDX_STREAMING_ON_SPEAKER_OFF = "UA2;"; + private static final String TRUSDX_STREAMING_AUDIO = "US"; + + + public static String getModeStr(int mode) { + switch (mode) { + case LSB: + return "LSB"; + case USB: + return "USB"; + case CW: + return "CW"; + case FSK: + return "FSK"; + case AM: + return "AM"; + case DATA: + return "DATA"; + default: + return "UNKNOWN"; + } + } + + + public static byte[] setPTTState(boolean on) { + if (on) { + return PTT_ON.getBytes(); + } else { + return PTT_OFF.getBytes(); + } + + } + + public static byte[] setTS590PTTState(boolean on) { + if (on) { + return TS590_PTT_ON.getBytes(); + } else { + return TS590_PTT_OFF.getBytes(); + } + + } + public static byte[] setTS570PTTState(boolean on) { + if (on) { + return TS570_PTT_ON.getBytes(); + } else { + return TS570_PTT_OFF.getBytes(); + } + + } + public static byte[] setTS2000PTTState(boolean on) { + if (on) { + return TS2000_PTT_ON.getBytes(); + } else { + return TS590_PTT_OFF.getBytes(); + } + + } + + public static byte[] setFLEX6000PTTState(boolean on) { + if (on) { + return FLEX_6000_PTT_ON.getBytes(); + } else { + return TS590_PTT_OFF.getBytes(); + } + + } + + + //设置成VFO模式 + public static byte[] setVFOMode() { + return SET_VFO.getBytes(); + } + + public static byte[] setTS590VFOMode() { + return TS590_VFO_A.getBytes(); + } + + public static byte[] setOperationUSBMode() { + return USB_MODE.getBytes(); + } + + public static byte[] setTS590OperationUSBMode() { + return TS590_SET_USB.getBytes(); + } + + public static byte[] setFLEX6000OperationUSBMode() { + return FLEX_SET_USB_DATA.getBytes(); + } + + @SuppressLint("DefaultLocale") + public static byte[] setOperationFreq(long freq) { + return String.format("FA%011d\r", freq).getBytes(); + } + + @SuppressLint("DefaultLocale") + public static byte[] setTS590OperationFreq(long freq) { + return String.format("FA%011d;", freq).getBytes(); + } + + public static byte[] setReadOperationFreq() { + return READ_FREQ.getBytes(); + } + + public static byte[] setRead590Meters() { + return TS590_READ_METERS.getBytes(); + } + + public static byte[] setTS590ReadOperationFreq() { + return TS590_READ_FREQ.getBytes(); + } + + + //2023-08-16 由DS1UFX提交修改(基于0.9版),增加(tr)uSDX audio over cat的支持。 + public static byte[] setTrUSDXStreaming(boolean on) { + if (on) { + return TRUSDX_STREAMING_ON_SPEAKER_OFF.getBytes(); + } else { + return TRUSDX_STREAMING_OFF.getBytes(); + } + } + + public static byte[] setTrUSDXPTTState(boolean on) { + if (on) { + return ";TX0;".getBytes(); + } else { + return ";RX;".getBytes(); + } + } + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/KenwoodTS2000Rig.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/KenwoodTS2000Rig.java new file mode 100644 index 00000000..eefa0b29 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/KenwoodTS2000Rig.java @@ -0,0 +1,197 @@ +package com.bg7yoz.ft8cn.rigs; + +import static com.bg7yoz.ft8cn.GeneralVariables.QUERY_FREQ_TIMEOUT; +import static com.bg7yoz.ft8cn.GeneralVariables.START_QUERY_FREQ_DELAY; + +import android.os.Handler; +import android.util.Log; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.database.ControlMode; +import com.bg7yoz.ft8cn.ui.ToastMessage; + +import java.util.Timer; +import java.util.TimerTask; + +/** + * KENWOOD TS2000,与YAESU3代指令接近,与TS590基本相同,唯一不同的是,PTT打开指令是TX0;而TS590是用的TX1; + * 命令结构使用Yaesu3Command,指令在KenwoodTK90RigConstant中。 + */ +public class KenwoodTS2000Rig extends BaseRig { + private static final String TAG = "KenwoodTS590Rig"; + private final StringBuilder buffer = new StringBuilder(); + + private Timer readFreqTimer = new Timer(); + private int swr = 0; + private int alc = 0; + private boolean alcMaxAlert = false; + private boolean swrAlert = false; + + private TimerTask readTask() { + return new TimerTask() { + @Override + public void run() { + try { + if (!isConnected()) { + readFreqTimer.cancel(); + readFreqTimer.purge(); + readFreqTimer = null; + return; + } + if (isPttOn()) { + readMeters();//读METER + } else { + readFreqFromRig();//读频率 + } + + } catch (Exception e) { + Log.e(TAG, "readFreq error:" + e.getMessage()); + } + } + }; + } + + /** + * 读取Meter RM; + */ + private void readMeters() { + if (getConnector() != null) { + clearBufferData();//清空一下缓存 + getConnector().sendData(KenwoodTK90RigConstant.setRead590Meters()); + } + } + + /** + * 清空缓存数据 + */ + private void clearBufferData() { + buffer.setLength(0); + } + + @Override + public void setPTT(boolean on) { + super.setPTT(on); + if (getConnector() != null) { + switch (getControlMode()) { + case ControlMode.CAT://以CIV指令 + getConnector().setPttOn(KenwoodTK90RigConstant.setTS2000PTTState(on)); + break; + case ControlMode.RTS: + case ControlMode.DTR: + getConnector().setPttOn(on); + break; + } + } + } + + @Override + public boolean isConnected() { + if (getConnector() == null) { + return false; + } + return getConnector().isConnected(); + } + + @Override + public void setUsbModeToRig() { + if (getConnector() != null) { + getConnector().sendData(KenwoodTK90RigConstant.setTS590OperationUSBMode()); + } + } + + @Override + public void setFreqToRig() { + if (getConnector() != null) { + getConnector().sendData(KenwoodTK90RigConstant.setTS590OperationFreq(getFreq())); + } + } + + @Override + public void onReceiveData(byte[] data) { + String s = new String(data); + + if (!s.contains("\r")) { + buffer.append(s); + if (buffer.length() > 1000) clearBufferData(); + //return;//说明数据还没接收完。 + } else { + if (s.indexOf("\r") > 0) {//说明接到结束的数据了,并且不是第一个字符是; + buffer.append(s.substring(0, s.indexOf("\r"))); + } + //开始分析数据 + Yaesu3Command yaesu3Command = Yaesu3Command.getCommand(buffer.toString()); + clearBufferData();//清一下缓存 + //要把剩下的数据放到缓存里 + buffer.append(s.substring(s.indexOf("\r") + 1)); + + if (yaesu3Command == null) { + return; + } + String cmd = yaesu3Command.getCommandID(); + if (cmd.equalsIgnoreCase("FA")) {//频率 + long tempFreq = Yaesu3Command.getFrequency(yaesu3Command); + if (tempFreq != 0) {//如果tempFreq==0,说明频率不正常 + setFreq(Yaesu3Command.getFrequency(yaesu3Command)); + } + } else if (cmd.equalsIgnoreCase("RM")) {//meter + if (Yaesu3Command.is590MeterSWR(yaesu3Command)) { + swr = Yaesu3Command.get590ALCOrSWR(yaesu3Command); + } + if (Yaesu3Command.is590MeterALC(yaesu3Command)) { + alc = Yaesu3Command.get590ALCOrSWR(yaesu3Command); + } + showAlert(); + } + + } + + } + + private void showAlert() { + if ((swr >= KenwoodTK90RigConstant.ts_590_swr_alert_max) + && GeneralVariables.swr_switch_on) { + if (!swrAlert) { + swrAlert = true; + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.swr_high_alert)); + } + } else { + swrAlert = false; + } + if ((alc > KenwoodTK90RigConstant.ts_590_alc_alert_max) + && GeneralVariables.alc_switch_on) {//网络模式下不警告ALC + if (!alcMaxAlert) { + alcMaxAlert = true; + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.alc_high_alert)); + } + } else { + alcMaxAlert = false; + } + + } + + @Override + public void readFreqFromRig() { + if (getConnector() != null) { + clearBufferData();//清空一下缓存 + getConnector().sendData(KenwoodTK90RigConstant.setTS590ReadOperationFreq()); + } + } + + @Override + public String getName() { + return "KENWOOD TS-2000"; + } + + public KenwoodTS2000Rig() { + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + if (getConnector() != null) { + getConnector().sendData(KenwoodTK90RigConstant.setTS590VFOMode()); + } + } + }, START_QUERY_FREQ_DELAY - 500); + readFreqTimer.schedule(readTask(), START_QUERY_FREQ_DELAY, QUERY_FREQ_TIMEOUT); + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/KenwoodTS570Rig.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/KenwoodTS570Rig.java new file mode 100644 index 00000000..5fa20cbf --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/KenwoodTS570Rig.java @@ -0,0 +1,196 @@ +package com.bg7yoz.ft8cn.rigs; + +import static com.bg7yoz.ft8cn.GeneralVariables.QUERY_FREQ_TIMEOUT; +import static com.bg7yoz.ft8cn.GeneralVariables.START_QUERY_FREQ_DELAY; + +import android.os.Handler; +import android.util.Log; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.database.ControlMode; +import com.bg7yoz.ft8cn.ui.ToastMessage; + +import java.util.Timer; +import java.util.TimerTask; + +/** + * KENWOOD TS590,与YAESU3代指令接近,命令结构使用Yaesu3Command,指令在KenwoodTK90RigConstant中。 + */ +public class KenwoodTS570Rig extends BaseRig { + private static final String TAG = "KenwoodTS570Rig"; + private final StringBuilder buffer = new StringBuilder(); + + private Timer readFreqTimer = new Timer(); + private int swr = 0; + private int alc = 0; + private boolean alcMaxAlert = false; + private boolean swrAlert = false; + + private TimerTask readTask() { + return new TimerTask() { + @Override + public void run() { + try { + if (!isConnected()) { + readFreqTimer.cancel(); + readFreqTimer.purge(); + readFreqTimer = null; + return; + } + if (isPttOn()) { + readMeters();//读METER + } else { + readFreqFromRig();//读频率 + } + + } catch (Exception e) { + Log.e(TAG, "readFreq error:" + e.getMessage()); + } + } + }; + } + + /** + * 读取Meter RM; + */ + private void readMeters() { + if (getConnector() != null) { + clearBufferData();//清空一下缓存 + getConnector().sendData(KenwoodTK90RigConstant.setRead590Meters()); + } + } + + /** + * 清空缓存数据 + */ + private void clearBufferData() { + buffer.setLength(0); + } + + @Override + public void setPTT(boolean on) { + super.setPTT(on); + if (getConnector() != null) { + switch (getControlMode()) { + case ControlMode.CAT://以CIV指令 + getConnector().setPttOn(KenwoodTK90RigConstant.setTS570PTTState(on)); + break; + case ControlMode.RTS: + case ControlMode.DTR: + getConnector().setPttOn(on); + break; + } + } + } + + @Override + public boolean isConnected() { + if (getConnector() == null) { + return false; + } + return getConnector().isConnected(); + } + + @Override + public void setUsbModeToRig() { + if (getConnector() != null) { + getConnector().sendData(KenwoodTK90RigConstant.setTS590OperationUSBMode()); + } + } + + @Override + public void setFreqToRig() { + if (getConnector() != null) { + getConnector().sendData(KenwoodTK90RigConstant.setTS590OperationFreq(getFreq())); + } + } + + @Override + public void onReceiveData(byte[] data) { + String s = new String(data); + + if (!s.contains("\r")) { + buffer.append(s); + if (buffer.length() > 1000) clearBufferData(); + //return;//说明数据还没接收完。 + } else { + if (s.indexOf("\r") > 0) {//说明接到结束的数据了,并且不是第一个字符是; + buffer.append(s.substring(0, s.indexOf("\r"))); + } + //开始分析数据 + Yaesu3Command yaesu3Command = Yaesu3Command.getCommand(buffer.toString()); + clearBufferData();//清一下缓存 + //要把剩下的数据放到缓存里 + buffer.append(s.substring(s.indexOf("\r") + 1)); + + if (yaesu3Command == null) { + return; + } + String cmd = yaesu3Command.getCommandID(); + if (cmd.equalsIgnoreCase("FA")) {//频率 + long tempFreq = Yaesu3Command.getFrequency(yaesu3Command); + if (tempFreq != 0) {//如果tempFreq==0,说明频率不正常 + setFreq(Yaesu3Command.getFrequency(yaesu3Command)); + } + } else if (cmd.equalsIgnoreCase("RM")) {//meter + if (Yaesu3Command.is590MeterSWR(yaesu3Command)) { + swr = Yaesu3Command.get590ALCOrSWR(yaesu3Command); + } + if (Yaesu3Command.is590MeterALC(yaesu3Command)) { + alc = Yaesu3Command.get590ALCOrSWR(yaesu3Command); + } + showAlert(); + } + + } + + } + + private void showAlert() { + if ((swr >= KenwoodTK90RigConstant.ts_590_swr_alert_max) + && GeneralVariables.swr_switch_on) { + if (!swrAlert) { + swrAlert = true; + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.swr_high_alert)); + } + } else { + swrAlert = false; + } + if ((alc > KenwoodTK90RigConstant.ts_590_alc_alert_max) + && GeneralVariables.alc_switch_on) {//网络模式下不警告ALC + if (!alcMaxAlert) { + alcMaxAlert = true; + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.alc_high_alert)); + } + } else { + alcMaxAlert = false; + } + + } + + @Override + public void readFreqFromRig() { + if (getConnector() != null) { + clearBufferData();//清空一下缓存 + getConnector().sendData(KenwoodTK90RigConstant.setTS590ReadOperationFreq()); + } + } + + @Override + public String getName() { + return "KENWOOD TS-570"; + } + + public KenwoodTS570Rig() { + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + if (getConnector() != null) { + getConnector().sendData(KenwoodTK90RigConstant.setTS590VFOMode()); + } + } + }, START_QUERY_FREQ_DELAY - 500); + readFreqTimer.schedule(readTask(), START_QUERY_FREQ_DELAY, QUERY_FREQ_TIMEOUT); + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/KenwoodTS590Rig.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/KenwoodTS590Rig.java new file mode 100644 index 00000000..90889f2f --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/KenwoodTS590Rig.java @@ -0,0 +1,196 @@ +package com.bg7yoz.ft8cn.rigs; + +import static com.bg7yoz.ft8cn.GeneralVariables.QUERY_FREQ_TIMEOUT; +import static com.bg7yoz.ft8cn.GeneralVariables.START_QUERY_FREQ_DELAY; + +import android.os.Handler; +import android.util.Log; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.database.ControlMode; +import com.bg7yoz.ft8cn.ui.ToastMessage; + +import java.util.Timer; +import java.util.TimerTask; + +/** + * KENWOOD TS590,与YAESU3代指令接近,命令结构使用Yaesu3Command,指令在KenwoodTK90RigConstant中。 + */ +public class KenwoodTS590Rig extends BaseRig { + private static final String TAG = "KenwoodTS590Rig"; + private final StringBuilder buffer = new StringBuilder(); + + private Timer readFreqTimer = new Timer(); + private int swr = 0; + private int alc = 0; + private boolean alcMaxAlert = false; + private boolean swrAlert = false; + + private TimerTask readTask() { + return new TimerTask() { + @Override + public void run() { + try { + if (!isConnected()) { + readFreqTimer.cancel(); + readFreqTimer.purge(); + readFreqTimer = null; + return; + } + if (isPttOn()) { + readMeters();//读METER + } else { + readFreqFromRig();//读频率 + } + + } catch (Exception e) { + Log.e(TAG, "readFreq error:" + e.getMessage()); + } + } + }; + } + + /** + * 读取Meter RM; + */ + private void readMeters() { + if (getConnector() != null) { + clearBufferData();//清空一下缓存 + getConnector().sendData(KenwoodTK90RigConstant.setRead590Meters()); + } + } + + /** + * 清空缓存数据 + */ + private void clearBufferData() { + buffer.setLength(0); + } + + @Override + public void setPTT(boolean on) { + super.setPTT(on); + if (getConnector() != null) { + switch (getControlMode()) { + case ControlMode.CAT://以CIV指令 + getConnector().setPttOn(KenwoodTK90RigConstant.setTS590PTTState(on)); + break; + case ControlMode.RTS: + case ControlMode.DTR: + getConnector().setPttOn(on); + break; + } + } + } + + @Override + public boolean isConnected() { + if (getConnector() == null) { + return false; + } + return getConnector().isConnected(); + } + + @Override + public void setUsbModeToRig() { + if (getConnector() != null) { + getConnector().sendData(KenwoodTK90RigConstant.setTS590OperationUSBMode()); + } + } + + @Override + public void setFreqToRig() { + if (getConnector() != null) { + getConnector().sendData(KenwoodTK90RigConstant.setTS590OperationFreq(getFreq())); + } + } + + @Override + public void onReceiveData(byte[] data) { + String s = new String(data); + + if (!s.contains("\r")) { + buffer.append(s); + if (buffer.length() > 1000) clearBufferData(); + //return;//说明数据还没接收完。 + } else { + if (s.indexOf("\r") > 0) {//说明接到结束的数据了,并且不是第一个字符是; + buffer.append(s.substring(0, s.indexOf("\r"))); + } + //开始分析数据 + Yaesu3Command yaesu3Command = Yaesu3Command.getCommand(buffer.toString()); + clearBufferData();//清一下缓存 + //要把剩下的数据放到缓存里 + buffer.append(s.substring(s.indexOf("\r") + 1)); + + if (yaesu3Command == null) { + return; + } + String cmd = yaesu3Command.getCommandID(); + if (cmd.equalsIgnoreCase("FA")) {//频率 + long tempFreq = Yaesu3Command.getFrequency(yaesu3Command); + if (tempFreq != 0) {//如果tempFreq==0,说明频率不正常 + setFreq(Yaesu3Command.getFrequency(yaesu3Command)); + } + } else if (cmd.equalsIgnoreCase("RM")) {//meter + if (Yaesu3Command.is590MeterSWR(yaesu3Command)) { + swr = Yaesu3Command.get590ALCOrSWR(yaesu3Command); + } + if (Yaesu3Command.is590MeterALC(yaesu3Command)) { + alc = Yaesu3Command.get590ALCOrSWR(yaesu3Command); + } + showAlert(); + } + + } + + } + + private void showAlert() { + if ((swr >= KenwoodTK90RigConstant.ts_590_swr_alert_max) + && GeneralVariables.swr_switch_on) { + if (!swrAlert) { + swrAlert = true; + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.swr_high_alert)); + } + } else { + swrAlert = false; + } + if ((alc > KenwoodTK90RigConstant.ts_590_alc_alert_max) + && GeneralVariables.alc_switch_on) {//网络模式下不警告ALC + if (!alcMaxAlert) { + alcMaxAlert = true; + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.alc_high_alert)); + } + } else { + alcMaxAlert = false; + } + + } + + @Override + public void readFreqFromRig() { + if (getConnector() != null) { + clearBufferData();//清空一下缓存 + getConnector().sendData(KenwoodTK90RigConstant.setTS590ReadOperationFreq()); + } + } + + @Override + public String getName() { + return "KENWOOD TS-480/590"; + } + + public KenwoodTS590Rig() { + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + if (getConnector() != null) { + getConnector().sendData(KenwoodTK90RigConstant.setTS590VFOMode()); + } + } + }, START_QUERY_FREQ_DELAY - 500); + readFreqTimer.schedule(readTask(), START_QUERY_FREQ_DELAY, QUERY_FREQ_TIMEOUT); + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/OnConnectReceiveData.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/OnConnectReceiveData.java new file mode 100644 index 00000000..3fc45421 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/OnConnectReceiveData.java @@ -0,0 +1,10 @@ +package com.bg7yoz.ft8cn.rigs; + +/** + * 从电台接收到数据的回调 + * @author BGY70Z + * @date 2023-03-20 + */ +public interface OnConnectReceiveData { + void onData(byte[] data); +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/OnRigStateChanged.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/OnRigStateChanged.java new file mode 100644 index 00000000..4e638cf4 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/OnRigStateChanged.java @@ -0,0 +1,14 @@ +package com.bg7yoz.ft8cn.rigs; + +/** + * 电台状态的回调。 + * @author BGY70Z + * @date 2023-03-20 + */ +public interface OnRigStateChanged { + void onDisconnected(); + void onConnected(); + void onPttChanged(boolean isOn); + void onFreqChanged(long freq); + void onRunError(String message); +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/TrUSDXRig.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/TrUSDXRig.java new file mode 100644 index 00000000..ef7ffd55 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/TrUSDXRig.java @@ -0,0 +1,404 @@ + +/** + * (tr)uSDX, fork from KENWOOD TS590. + * 基于0.9版,增加TrSDXRig的支持。 + * + * @author Sunguk Lee + * 2023-08-16 + */ +package com.bg7yoz.ft8cn.rigs; + +import static com.bg7yoz.ft8cn.GeneralVariables.QUERY_FREQ_TIMEOUT; +import static com.bg7yoz.ft8cn.GeneralVariables.START_QUERY_FREQ_DELAY; + +import android.os.Handler; +import android.util.Log; + +import com.bg7yoz.ft8cn.Ft8Message; +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.database.ControlMode; +import com.bg7yoz.ft8cn.ft8transmit.GenerateFT8; +import com.bg7yoz.ft8cn.ui.ToastMessage; +import com.bg7yoz.ft8cn.wave.FT8Resample; + +import java.io.ByteArrayOutputStream; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.Arrays; +import java.util.Timer; +import java.util.TimerTask; + +/** + * (tr)uSDX, fork from KENWOOD TS590. + * 2023-08-16 由DS1UFX提交修改(基于0.9版),用于对(tr)uSDX audio over cat的支持。 + */ +public class TrUSDXRig extends BaseRig { + private static final String TAG = "TrUSDXRig"; + private static final int rxSampling = 7812; + private static final int txSampling = 11520; + private final StringBuilder buffer = new StringBuilder(); + private final ByteArrayOutputStream rxStreamBuffer = new ByteArrayOutputStream(); + + private Timer readFreqTimer = new Timer(); + private int swr = 0; + private int alc = 0; + private boolean alcMaxAlert = false; + private boolean swrAlert = false; + private boolean rxStreaming = false; + + private TimerTask readTask() { + return new TimerTask() { + @Override + public void run() { + try { + if (!isConnected()) { + readFreqTimer.cancel(); + readFreqTimer.purge(); + readFreqTimer = null; + return; + } + if (isPttOn()) { + clearBufferData(); + } else { + readFreqFromRig();//读频率 + } + + } catch (Exception e) { + Log.e(TAG, "readFreq error:" + e.getMessage()); + } + } + }; + } + + /** + * 清空缓存数据 + */ + private void clearBufferData() { + buffer.setLength(0); + } + + @Override + public void setPTT(boolean on) { + super.setPTT(on); + if (getConnector() != null) { + switch (getControlMode()) { + case ControlMode.CAT: + if (on) { + rxStreaming = false; + } + getConnector().setPttOn(KenwoodTK90RigConstant.setTrUSDXPTTState(on)); + break; + case ControlMode.RTS: + case ControlMode.DTR: + getConnector().setPttOn(on); + break; + } + } + } + + @Override + public boolean isConnected() { + if (getConnector() == null) { + return false; + } + return getConnector().isConnected(); + } + + @Override + public void setUsbModeToRig() { + if (getConnector() != null) { + getConnector().sendData(KenwoodTK90RigConstant.setTS590OperationUSBMode()); + } + } + + @Override + public void setFreqToRig() { + if (getConnector() != null) { + getConnector().sendData(KenwoodTK90RigConstant.setTS590OperationFreq(getFreq())); + } + } + + @Override + public void onReceiveData(byte[] data) { + byte[] remain = data; + String s = new String(data); + while (s.contains(";")) { // ; + // TODO apply effective way + int idx = s.indexOf(";"); + byte[] cutted = Arrays.copyOf(remain, idx); + remain = Arrays.copyOfRange(remain, idx + 1, remain.length); + s = new String(remain); + + if (rxStreaming) { + onReceivedWaveData(cutted, true); + rxStreaming = false; + } else { + buffer.append(new String(cutted)); + //开始分析数据 + Yaesu3Command yaesu3Command = Yaesu3Command.getCommand(buffer.toString()); + clearBufferData();//清一下缓存 + + if (yaesu3Command == null) { + continue; + } + String cmd = yaesu3Command.getCommandID(); + if (cmd.equalsIgnoreCase("FA")) {//频率 + long tempFreq = Yaesu3Command.getFrequency(yaesu3Command); + if (tempFreq != 0) {//如果tempFreq==0,说明频率不正常 + setFreq(Yaesu3Command.getFrequency(yaesu3Command)); + } + } else if (cmd.equalsIgnoreCase("US")) { + rxStreaming = true; + byte[] wave = Arrays.copyOfRange(cutted, 2, cutted.length); + onReceivedWaveData(wave); + } + } + } + if (remain.length <= 0) { + return; + } + if (rxStreaming) { + onReceivedWaveData(remain); + } else if (remain.length >= 2 && remain[0] == 0x55 && remain[1] == 0x53) {// US + clearBufferData(); + rxStreaming = true; + byte[] wave = Arrays.copyOfRange(remain, 2, remain.length); + onReceivedWaveData(wave); + } else { + buffer.append(s); + } + } + + private void showAlert() { + if ((swr >= KenwoodTK90RigConstant.ts_590_swr_alert_max) + && GeneralVariables.swr_switch_on) { + if (!swrAlert) { + swrAlert = true; + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.swr_high_alert)); + } + } else { + swrAlert = false; + } + if ((alc > KenwoodTK90RigConstant.ts_590_alc_alert_max) + && GeneralVariables.alc_switch_on) {//网络模式下不警告ALC + if (!alcMaxAlert) { + alcMaxAlert = true; + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.alc_high_alert)); + } + } else { + alcMaxAlert = false; + } + + } + + @Override + public void readFreqFromRig() { + if (getConnector() != null) { + clearBufferData();//清空一下缓存 + // force reset + getConnector().sendData(KenwoodTK90RigConstant.setTrUSDXPTTState(false)); + getConnector().sendData(KenwoodTK90RigConstant.setTS590ReadOperationFreq()); + } + } + + @Override + public String getName() { + return "(tr)uSDX"; + } + + @Override + public boolean supportWaveOverCAT() { + return true; + } + + @Override + public void onDisconnecting() { + if (getConnector() != null) { + clearBufferData(); + getConnector().sendData(KenwoodTK90RigConstant.setTrUSDXStreaming(false)); + } + } + + + /** + * 当接收到音频数据后,把音频数据的采样率7812Hz转换为12000Hz,发送给Connector。 + * + * @param data 接收到的音频(7812Hz) + */ + public void onReceivedWaveData(byte[] data) { + onReceivedWaveData(data, false); + } + + + /** + * 当接收到音频数据后,把音频数据的采样率7812Hz转换为12000Hz,发送给Connector。 + * + * @param data 接收到的音频(7812Hz) + * @param force 是否强制转换 + */ + public void onReceivedWaveData(byte[] data, boolean force) { + if (data.length == 0) { + return; + } + if (getConnector() == null) { + return; + } + //Resample rxResample = new Resample(Resample.ConverterType.SRC_LINEAR, 1 + // , rxSampling, 12000); + + rxStreamBuffer.write(data, 0, data.length); + if (rxStreamBuffer.size() >= 256 || force) {//8位转16位,7812Hz转12000Hz + //byte[] resampled = rxResample.processCopy(toWaveSamples8To16(rxStreamBuffer.toByteArray())); + float[] resampled = FT8Resample.get32Resample16( + toWaveSamples8To16Int(rxStreamBuffer.toByteArray()), rxSampling, 12000, 1); + rxStreamBuffer.reset(); + getConnector().receiveWaveData(resampled); + } + //rxResample.close(); + } + + @Override + public void sendWaveData(Ft8Message message) { + if (getConnector() == null) { + return; + } + float[] wave = GenerateFT8.generateFt8(message, GeneralVariables.getBaseFrequency() + , 24000); + + if (wave == null) { + setPTT(false); + return; + } + //调整信号强度 + for (int i = 0; i < wave.length; i++) { + wave[i] = wave[i] * GeneralVariables.volumePercent; + } + +// +// byte[] pcm16 = toWaveFloatToPCM16(wave); +// Resample txResample = new Resample(Resample.ConverterType.SRC_SINC_FASTEST, 1 +// , 24000, txSampling); +// byte[] resampled = txResample.processCopy(pcm16); +// txResample.close(); +// byte[] pcm8 = toWaveSamples16To8(resampled); + + byte[] pcm8 = FT8Resample.get8Resample32(wave, 24000, txSampling, 1); + + + for (int i = 0; i < pcm8.length; i++) { + if (pcm8[i] == 0x3B) pcm8[i] = 0x3A; // ; to : + } + while (pcm8.length > 0) { + if (pcm8.length <= 256) { + getConnector().sendData(pcm8); + break; + } else { + getConnector().sendData(Arrays.copyOfRange(pcm8, 0, 256)); + pcm8 = Arrays.copyOfRange(pcm8, 256, pcm8.length); + } + } + } + + /** + * 音频8bit采样转换为16bit采样位深 + * + * @param in 8 bit 数据 + * @return 16 bit数据(byte类型) + */ + private static byte[] toWaveSamples8To16(byte[] in) { + ByteBuffer buf = ByteBuffer.allocate(in.length * 2); + for (int i = 0; i < in.length; i++) { + short v = (short) (((short) in[i] - 128) << 8); + buf.putShort(v); + } + return buf.array(); + } + + /** + * 音频8bitcaiyang转换为16bit采样位深 + * + * @param in 8 bit 数据 + * @return 16 bit 数据(short类型) + */ + private static short[] toWaveSamples8To16Int(byte[] in) { + short[] buf = new short[in.length]; + for (int i = 0; i < in.length; i++) { + buf[i] = (short) (((short) in[i] - 128) << 8); + } + return buf; + } + + private static byte[] toWaveFloatToPCM16(float[] in) { + ByteBuffer buf = ByteBuffer.allocate(in.length * 2); + buf.order(ByteOrder.LITTLE_ENDIAN); + for (int i = 0; i < in.length; i++) { + float x = in[i]; + short v = (short) (x * 32767.0f); + buf.putShort(v); + } + return buf.array(); + } + + private static byte[] toWaveFloatToPCM8(float[] in) { + byte[] out = new byte[in.length]; + for (int i = 0; i < in.length; i++) { + float x = in[i]; + short v = (short) (x * 32767.0f); + out[i] = (byte) ((byte) (v >> 8) + 128); + } + return out; + } + + /** + * 把16 bit 数据转成8 bit + * + * @param in 16 bit 数据(字节) + * @return 8 bit 字节 + */ + private static byte[] toWaveSamples16To8(byte[] in) { + byte[] out = new byte[in.length / 2]; + for (int i = 0; i < out.length; i++) { + short v = readShortBigEndianData(in, i * 2); + out[i] = (byte) (((byte) (v >> 8)) + 128); + } + return out; + } + + private static byte[] toWaveSamples16To8(short[] in) { + byte[] out = new byte[in.length]; + for (int i = 0; i < out.length; i++) { + out[i] = (byte) (((byte) (in[i] >> 8)) + 128); + } + return out; + } + + public TrUSDXRig() { + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + if (getConnector() != null) { + getConnector().sendData(KenwoodTK90RigConstant.setTS590VFOMode()); + //改成设置usb模式 + getConnector().sendData(KenwoodTK90RigConstant.setTS590OperationUSBMode()); + getConnector().sendData(KenwoodTK90RigConstant.setTrUSDXStreaming(true)); + } + } + }, START_QUERY_FREQ_DELAY - 500); + readFreqTimer.schedule(readTask(), START_QUERY_FREQ_DELAY, QUERY_FREQ_TIMEOUT); + } + + /** + * 从流数据中读取小端模式的Short + * + * @param data 流数据 + * @param start 起始点 + * @return Int16 + */ + public static short readShortBigEndianData(byte[] data, int start) { + if (data.length - start < 2) return 0; + return (short) ((short) data[start] & 0xff + | ((short) data[start + 1] & 0xff) << 8); + } + +} \ No newline at end of file diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/Wolf_sdr_450Rig.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/Wolf_sdr_450Rig.java new file mode 100644 index 00000000..defcee38 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/Wolf_sdr_450Rig.java @@ -0,0 +1,204 @@ +package com.bg7yoz.ft8cn.rigs; + +import static com.bg7yoz.ft8cn.GeneralVariables.QUERY_FREQ_TIMEOUT; +import static com.bg7yoz.ft8cn.GeneralVariables.START_QUERY_FREQ_DELAY; + +import android.util.Log; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.database.ControlMode; +import com.bg7yoz.ft8cn.ui.ToastMessage; + +import java.util.Timer; +import java.util.TimerTask; + +/** + * wolf 的cat指令集兼容yaesu 450d,但是有的ham在实际测试中发现,450d默认是dig-u,此模式在wolf上测试无法满功率发射, + * 而采用usb模式就可以满功率发射,故增加一个usb模式的选项 + * 在创建rig时,用布尔参数是否时USB模式 + */ +public class Wolf_sdr_450Rig extends BaseRig { + private static final String TAG = "Wolf_sdr_450Rig"; + private final StringBuilder buffer = new StringBuilder(); + private int swr = 0; + private int alc = 0; + private boolean alcMaxAlert = false; + private boolean swrAlert = false; + + private Timer readFreqTimer = new Timer(); + private boolean isUsbMode = true; + + private TimerTask readTask() { + return new TimerTask() { + @Override + public void run() { + try { + if (!isConnected()) { + readFreqTimer.cancel(); + readFreqTimer.purge(); + readFreqTimer = null; + return; + } + if (isPttOn()) { + readMeters(); + } else { + readFreqFromRig(); + } + } catch (Exception e) { + Log.e(TAG, "readFreq error:" + e.getMessage()); + } + } + }; + } + + /** + * 读取Meter RM; + */ + private void readMeters() { + if (getConnector() != null) { + clearBufferData();//清空一下缓存 + getConnector().sendData(Yaesu3RigConstant.setRead39Meters_ALC()); + getConnector().sendData(Yaesu3RigConstant.setRead39Meters_SWR()); + } + } + + private void showAlert() { + if ((swr >= Yaesu3RigConstant.swr_39_alert_max) + && GeneralVariables.swr_switch_on) { + if (!swrAlert) { + swrAlert = true; + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.swr_high_alert)); + } + } else { + swrAlert = false; + } + if ((alc > Yaesu3RigConstant.alc_39_alert_max) + && GeneralVariables.alc_switch_on) {//网络模式下不警告ALC + if (!alcMaxAlert) { + alcMaxAlert = true; + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.alc_high_alert)); + } + } else { + alcMaxAlert = false; + } + + } + + /** + * 清空缓存数据 + */ + private void clearBufferData() { + buffer.setLength(0); + } + + @Override + public void setPTT(boolean on) { + super.setPTT(on); + if (getConnector() != null) { + switch (getControlMode()) { + case ControlMode.CAT://以CIV指令 + getConnector().setPttOn(Yaesu3RigConstant.setPTT_TX_On(on));//针对YAESU 450指令 + break; + case ControlMode.RTS: + case ControlMode.DTR: + getConnector().setPttOn(on); + break; + } + } + } + + @Override + public boolean isConnected() { + if (getConnector() == null) { + return false; + } + return getConnector().isConnected(); + } + + @Override + public void setUsbModeToRig() { + if (getConnector() != null) { + //getConnector().sendData(Yaesu3RigConstant.setOperationDATA_U_Mode()); + //getConnector().sendData(Yaesu3RigConstant.setOperationUSB_Data_Mode()); + if (isUsbMode) {//usb模式 + getConnector().sendData(Yaesu3RigConstant.setOperationUSBMode()); + } else {//dig-u模式 + getConnector().sendData(Yaesu3RigConstant.setOperationDATA_U_Mode()); + } + } + } + + @Override + public void setFreqToRig() { + if (getConnector() != null) { + getConnector().sendData(Yaesu3RigConstant.setOperationFreq8Byte(getFreq())); + } + } + + @Override + public void onReceiveData(byte[] data) { + String s = new String(data); + //ToastMessage.showDebug("39 YAESU 读数据:"+new String(Yaesu3RigConstant.setReadOperationFreq())); + + if (!s.contains(";")) { + buffer.append(s); + if (buffer.length() > 1000) clearBufferData(); + //return;//说明数据还没接收完。 + } else { + if (s.indexOf(";") > 0) {//说明接到结束的数据了,并且不是第一个字符是; + buffer.append(s.substring(0, s.indexOf(";"))); + } + + //开始分析数据 + Yaesu3Command yaesu3Command = Yaesu3Command.getCommand(buffer.toString()); + clearBufferData();//清一下缓存 + //要把剩下的数据放到缓存里 + buffer.append(s.substring(s.indexOf(";") + 1)); + + if (yaesu3Command == null) { + return; + } + //long tempFreq = Yaesu3Command.getFrequency(yaesu3Command); + //if (tempFreq != 0) {//如果tempFreq==0,说明频率不正常 + // setFreq(Yaesu3Command.getFrequency(yaesu3Command)); + //} + + if (yaesu3Command.getCommandID().equalsIgnoreCase("FA") + || yaesu3Command.getCommandID().equalsIgnoreCase("FB")) { + long tempFreq = Yaesu3Command.getFrequency(yaesu3Command); + if (tempFreq != 0) {//如果tempFreq==0,说明频率不正常 + setFreq(Yaesu3Command.getFrequency(yaesu3Command)); + } + } else if (yaesu3Command.getCommandID().equalsIgnoreCase("RM")) {//METER + if (Yaesu3Command.isSWRMeter38(yaesu3Command)) { + swr = Yaesu3Command.getALCOrSWR38(yaesu3Command); + } + if (Yaesu3Command.isALCMeter38(yaesu3Command)) { + alc = Yaesu3Command.getALCOrSWR38(yaesu3Command); + } + showAlert(); + } + + } + + } + + @Override + public void readFreqFromRig() { + if (getConnector() != null) { + clearBufferData();//清空一下缓存 + getConnector().sendData(Yaesu3RigConstant.setReadOperationFreq()); + } + } + + @Override + public String getName() { + return "WOLF SDR"; + } + + public Wolf_sdr_450Rig(boolean usbMode) { + isUsbMode = usbMode; + readFreqTimer.schedule(readTask(), START_QUERY_FREQ_DELAY, QUERY_FREQ_TIMEOUT); + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/XieGu6100Command.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/XieGu6100Command.java new file mode 100644 index 00000000..411eca6b --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/XieGu6100Command.java @@ -0,0 +1,249 @@ +package com.bg7yoz.ft8cn.rigs; + + +import android.util.Log; + + +/** + * X6100_V1.1.6版新增指令说明 + * + * + * 1. 新增CI-V指令: + * 1A 01 (C1) (C2) + * C1: 波段号, See IC-705 CI-V Command Table + * C2: 寄存器代码(未用), See IC-705 CI-V Command Table + * X6100回发数据 说明 + * FE FE # 2 byte, CI-V header + * E0 XX 1A 01 01 01 # 6 bytes, The command payload, XX is the rig's address + * 00 00 80 01 00 # 5 bytes, Operating frequency setting + * 03 02 # 2 bytes, Operating mode setting + * 00 # 1 byte, Data mode setting + * 00 # 1 byte, Duplex and Tone settings + * 00 # 1 byte, Digital squelch setting + * 00 08 85 # 3 bytes, Repeater tone frequency setting + * 00 08 85 # 3 bytes, Repeater tone frequency setting + * 00 00 23 # 3 bytes, DTCS code setting + * 00 # 1 byte, DV Digital code squelch setting + * 00 50 00 # 3 bytes, Duplex offset frequency setting + * 58 36 31 30 30 20 20 20 # 8 bytes, UR (Destination) call sign setting + * 20 20 20 20 20 20 20 20 # 8 bytes, R1 (Access repeater) call sign setting + * 20 20 20 20 20 20 20 20 # 8 bytes, R2 (Gateway/Link repeater) call sign setting + * FD # 1 byte, CI-V tail + * 2. 新增CI-V指令: + * 1A 06 + * See IC-705 CI-V Command Table + * 3. 新增CI-V指令: + * 21 00 + * 21 01 + * 21 02 + * See IC-705 CI-V Command Table + * 4. 新增CI-V指令: + * 26 (C1) (C2) (C3) (C4) + * C1: VFO序号 (VFO index) + * 0: Foreground VFO + * other: Background VFO + * C2: 工作模式 (Operating mode) + * See IC-705 CI-V Command Table + * C3: 数据模式 (Data mode) + * 0: OFF + * other: ON + * C4: 滤波器号 (Filter setting) + * 1: FILTER1 + * 2: FILTER2 + * 3: FILTER3 + * other: Invalid + * *Note: [LSB/USB mode] with Data mode ON -> L-DIG/U-DIG + * [Other operating mode] with Data mode ON -> No effect + * 5. 新增蓝牙SPP,可以使用FLRIG,Omni-Rig等PC软件无线控制X6100 + * 蓝牙连接计算机后,组合键Win+R,输入bthprops.cpl按回车,在弹出的界面里点击"更多蓝牙设置", + * 在弹出的"蓝牙设置"窗口中点击"COM端口"选项卡,名称为"X6100 Bluetooth 'Serial Port'"的端口即为蓝牙CI-V接口, + * 例子: + * 端口 方向 名称 + * COM3 传出 X6100 Bluetooth 'Serial Port' + */ +public class XieGu6100Command { + private static final String TAG = "6100RigCommand"; + private byte[] rawData; + + /** + * 获取主命令 + * + * @return 主命令值 + */ + public int getCommandID() {//获取主命令 + if (rawData.length < 5) { + return -1; + } + return rawData[4]; + } + + /** + * 获取子命令,有的指令没有子命令,要注意。 + * + * @return 子命令 + */ + public int getSubCommand() {//获取子命令 + if (rawData.length < 7) { + return -1; + } + return rawData[5]; + } + + /** + * 获取带2字节的子命令,有的指令没有子命令,有的指令只有1个字节,要注意。 + * @return 子指令 + */ + public int getSubCommand2() {//获取子命令 + if (rawData.length < 8) { + return -1; + } + return readShortData(rawData,6); + } + /** + * 获取带3字节的子命令,有的指令没有子命令,有的指令只有1个字节,要注意。 + * @return 子指令 + */ + public int getSubCommand3() {//获取子命令 + if (rawData.length < 9) { + return -1; + } + return ((int) rawData[7] & 0xff) + | ((int) rawData[6] & 0xff) << 8 + | ((int) rawData[5] & 0xff) << 16; + + + } + + /** + * 获取数据区,有的指令有子命令,有的没有子命令,所以要区分出来。子命令占一个字节 + * + * @param hasSubCommand 是否有子命令 + * @return 返回数据区 + */ + public byte[] getData(boolean hasSubCommand) { + int pos; + + if (hasSubCommand) { + pos = 6; + } else { + pos = 5; + } + if (rawData.length < pos + 1) {//没有数据区了 + return null; + } + + byte[] data = new byte[rawData.length - pos]; + + for (int i = 0; i < rawData.length - pos; i++) { + data[i] = rawData[pos + i]; + } + return data; + } + + public byte[] getData2Sub() { + if (rawData.length < 9) {//没有数据区了 + return null; + } + + byte[] data = new byte[rawData.length - 8]; + + System.arraycopy(rawData, 8, data, 0, rawData.length - 8); + return data; + } + //解析接收的指令 + + /** + * 从串口中接到的数据解析出指令的数据:FE FE E0 A4 Cn Sc data FD + * + * @param ctrAddr 控制者地址,默认E0或00 + * @param rigAddr 电台地址,705默认是A4 + * @param buffer 从串口接收到的数据 + * @return 返回电台指令对象,如果不符合指令的格式,返回null。 + */ + public static XieGu6100Command getCommand(int ctrAddr, int rigAddr, byte[] buffer) { + Log.d(TAG, "getCommand: "+BaseRig.byteToStr(buffer) ); + if (buffer.length <= 5) {//指令的长度不可能小于等5 + return null; + } + int position = -1;//指令的位置 + for (int i = 0; i < buffer.length; i++) { + if (i + 6 > buffer.length) {//说明没找到指令 + return null; + } + if (buffer[i] == (byte) 0xfe + && buffer[i + 1] == (byte) 0xfe//命令头0xfe 0xfe + && (buffer[i + 2] == (byte) ctrAddr || buffer[i + 2] == (byte) 0x00)//控制者地址默认E0或00 + //&& buffer[i + 3] == (byte) rigAddr + ) {//协谷CIV默认地址是0x70,但是在测试1.1.7固件的时候,发现回复频率地址始终是0xA4,这似乎是个BUG,暂时忽略CIV地址的判断 + position = i; + break; + } + } + //说明没找到 + if (position == -1) { + return null; + } + + int dataEnd = -1; + //从命令头之后查起。所以i=position + for (int i = position; i < buffer.length; i++) { + if (buffer[i] == (byte) 0xfd) {//是否到结尾了 + dataEnd = i; + break; + } + } + if (dataEnd == -1) {//说明没找到结尾 + return null; + } + + XieGu6100Command icomCommand = new XieGu6100Command(); + icomCommand.rawData = new byte[dataEnd - position]; + int pos = 0; + for (int i = position; i < dataEnd; i++) {//把指令数据搬到rawData中 + //icomCommand.rawData[i] = buffer[i]; + icomCommand.rawData[pos] = buffer[i];//定位错误 + pos++; + } + return icomCommand; + } + + + /** + * 从数据区中计算频率BCD码 + * + * @param hasSubCommand 是否含有子命令 + * @return 返回频率值 + */ + public long getFrequency(boolean hasSubCommand) { + byte[] data = getData(hasSubCommand); + if (data == null) return -1; + if (data.length < 5) { + return -1; + } + return (int) (data[0] & 0x0f)//取个位 1hz + + ((int) (data[0] >> 4) & 0xf) * 10//取十位 10hz + + (int) (data[1] & 0x0f) * 100//百位 100hz + + ((int) (data[1] >> 4) & 0xf) * 1000//千位 1khz + + (int) (data[2] & 0x0f) * 10000//万位 10khz + + ((int) (data[2] >> 4) & 0xf) * 100000//十万位 100khz + + (int) (data[3] & 0x0f) * 1000000//百万位 1Mhz + + ((int) (data[3] >> 4) & 0xf) * 10000000//千万位 10Mhz + + (int) (data[4] & 0x0f) * 100000000//亿位 100Mhz + + ((int) (data[4] >> 4) & 0xf) * 100000000;//十亿位 1Ghz + } + + + /** + * 把字节转换成short,不做小端转换!! + * + * @param data 字节数据 + * @return short + */ + public static short readShortData(byte[] data, int start) { + if (data.length - start < 2) return 0; + return (short) ((short) data[start + 1] & 0xff + | ((short) data[start] & 0xff) << 8); + } + + +} \ No newline at end of file diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/XieGu6100NetRig.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/XieGu6100NetRig.java new file mode 100644 index 00000000..31d70e33 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/XieGu6100NetRig.java @@ -0,0 +1,89 @@ +package com.bg7yoz.ft8cn.rigs; + +import android.util.Log; + +import com.bg7yoz.ft8cn.Ft8Message; +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.connector.X6100Connector; +import com.bg7yoz.ft8cn.ft8transmit.GenerateFT8; + +/** + * XieGu6100的ft8cns模式,只支持网络模式,所以在设置baseRig时要做好判断 + */ +public class XieGu6100NetRig extends BaseRig { + private static final String TAG = "x6100RigNet"; + + //private final int ctrAddress = 0xE0;//接收地址,默认0xE0;电台回复命令有时也可以是0x00 + + + + + @Override + public void setPTT(boolean on) { + super.setPTT(on); + if (getConnector() != null) { + getConnector().setPttOn(on); + } + } + + @Override + public boolean isConnected() { + if (getConnector() == null) { + return false; + } + return getConnector().isConnected(); + } + + @Override + public void setUsbModeToRig() { + if (getConnector() != null) { + X6100Connector x6100Connector =(X6100Connector)getConnector(); + x6100Connector.getXieguRadio().commandSetMode("u-dig",1); + } + } + + @Override + public void setFreqToRig() { + if (getConnector() != null) { + X6100Connector x6100Connector =(X6100Connector)getConnector(); + x6100Connector.getXieguRadio().commandTuneFreq(getFreq()); + } + } + + + @Override + public void onReceiveData(byte[] data) { + //命令解析都在X6100Radio中完成了,此处不需要动作了 + } + + @Override + public void sendWaveData(Ft8Message message) {//发送音频数据到电台,用于网络方式 + if (getConnector() != null) {//把生成的具体音频数据传递到Connector, + //判断如果是ft8cns,就传输a19数据包 + if (GeneralVariables.instructionSet == InstructionSet.XIEGU_6100_FT8CNS){ + //Log.e(TAG,"generate A91"); + getConnector().sendFt8A91(GenerateFT8.generateA91(message,true) + ,GeneralVariables.getBaseFrequency()); + }else {//否则正常传输音频数据 + float[] data = GenerateFT8.generateFt8(message, GeneralVariables.getBaseFrequency() + , 12000);//此处电台发射音频的采样率是12000 + getConnector().sendWaveData(data); + } + } + } + + @Override + public void readFreqFromRig() {//通过X6100Radio的状态来获取频率,此处获取频率指令不需要了 + + } + + @Override + public String getName() { + return "XIEGU X6100 series"; + } + + public XieGu6100NetRig(int civAddress) { + Log.d(TAG, "x6100RigNet: Create."); + setCivAddress(civAddress); + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/XieGu6100Rig.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/XieGu6100Rig.java new file mode 100644 index 00000000..618a9de5 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/XieGu6100Rig.java @@ -0,0 +1,309 @@ +package com.bg7yoz.ft8cn.rigs; + +import static com.bg7yoz.ft8cn.GeneralVariables.QUERY_FREQ_TIMEOUT; +import static com.bg7yoz.ft8cn.GeneralVariables.START_QUERY_FREQ_DELAY; + +import android.util.Log; + +import com.bg7yoz.ft8cn.Ft8Message; +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.connector.ConnectMode; +import com.bg7yoz.ft8cn.database.ControlMode; +import com.bg7yoz.ft8cn.ft8transmit.GenerateFT8; +import com.bg7yoz.ft8cn.ui.ToastMessage; + +import java.util.Timer; +import java.util.TimerTask; + +public class XieGu6100Rig extends BaseRig { + private static final String TAG = "x6100Rig"; + + private final int ctrAddress = 0xE0;//接收地址,默认0xE0;电台回复命令有时也可以是0x00 + private byte[] dataBuffer = new byte[0];//数据缓冲区 + private int swr = 0; + private int alc = 0; + private boolean alcMaxAlert = false; + private boolean alcMinAlert = false; + private boolean swrAlert = false; + private Timer readFreqTimer = new Timer(); + + private TimerTask readTask() { + return new TimerTask() { + @Override + public void run() { + try { + if (!isConnected()) { + readFreqTimer.cancel(); + readFreqTimer.purge(); + readFreqTimer = null; + return; + } + if (isPttOn()) { + readSWRMeter(); + } else { + readFreqFromRig(); + } + + } catch (Exception e) { + Log.e(TAG, "readFreq or meter error:" + e.getMessage()); + } + } + }; + } + + + @Override + public void setPTT(boolean on) { + super.setPTT(on); + + if (getConnector() != null) { + + if (GeneralVariables.connectMode == ConnectMode.NETWORK) { + getConnector().setPttOn(on); + return; + } + + switch (getControlMode()) { + case ControlMode.CAT://以CIV指令 + getConnector().setPttOn(IcomRigConstant.setPTTState(ctrAddress, getCivAddress() + , on ? IcomRigConstant.PTT_ON : IcomRigConstant.PTT_OFF)); + break; + case ControlMode.RTS: + case ControlMode.DTR: + getConnector().setPttOn(on); + break; + } + } + } + + @Override + public boolean isConnected() { + if (getConnector() == null) { + return false; + } + return getConnector().isConnected(); + } + + @Override + public void setUsbModeToRig() { + if (getConnector() != null) { +// getConnector().sendData(IcomRigConstant.setOperationMode(ctrAddress +// , getCivAddress(), 1));//usb=1 + getConnector().sendData(IcomRigConstant.setOperationDataMode(ctrAddress + , getCivAddress(), IcomRigConstant.USB));//usb-d + } + } + + @Override + public void setFreqToRig() { + if (getConnector() != null) { + getConnector().sendData(IcomRigConstant.setOperationFrequency(ctrAddress + , getCivAddress(), getFreq())); + } + } + + /** + * 查找指令的结尾的位置,如果没找到,值是-1。 + * + * @param data 数据 + * @return 位置 + */ + private int getCommandEnd(byte[] data) { + for (int i = 0; i < data.length; i++) { + if (data[i] == (byte) 0xFD) { + return i; + } + } + return -1; + } + + /** + * 查找指令头,没找到返回-1,找到返回FE FE的第一个位置 + * + * @param data 数据 + * @return 位置 + */ + private int getCommandHead(byte[] data) { + if (data.length < 2) return -1; + for (int i = 0; i < data.length - 1; i++) { + if (data[i] == (byte) 0xFE && data[i + 1] == (byte) 0xFE) { + return i; + } + } + return -1; + } + + private void analysisCommand(byte[] data) { + int headIndex = getCommandHead(data); + if (headIndex == -1) {//说明没有指令头 + return; + } + XieGu6100Command xieGu6100Command; + if (headIndex == 0) { + xieGu6100Command = XieGu6100Command.getCommand(ctrAddress, getCivAddress(), data); + } else { + byte[] temp = new byte[data.length - headIndex]; + System.arraycopy(data, headIndex, temp, 0, temp.length); + xieGu6100Command = XieGu6100Command.getCommand(ctrAddress, getCivAddress(), temp); + } + if (xieGu6100Command == null) { + return; + } + + //目前只对频率和模式消息作反应 + switch (xieGu6100Command.getCommandID()) { + case IcomRigConstant.CMD_SEND_FREQUENCY_DATA://获取到的是频率数据 + case IcomRigConstant.CMD_READ_OPERATING_FREQUENCY: + //获取频率 + long freqTemp = xieGu6100Command.getFrequency(false); + if (freqTemp >= 500000 && freqTemp <= 250000000) {//协谷的频率范围 + setFreq(freqTemp); + } + break; + case IcomRigConstant.CMD_SEND_MODE_DATA://获取到的是模式数据 + case IcomRigConstant.CMD_READ_OPERATING_MODE: + break; + case IcomRigConstant.CMD_READ_METER://读meter//此处的指令,只在网络模式实现,以后可能会在串口方面实现 + if (xieGu6100Command.getSubCommand() == IcomRigConstant.CMD_READ_METER_SWR) { + //协谷的小端模式 + int temp = IcomRigConstant.twoByteBcdToIntBigEnd(xieGu6100Command.getData(true)); + if (temp != 255) { + swr = temp;// + } + } + + if (xieGu6100Command.getSubCommand() == IcomRigConstant.CMD_READ_METER_ALC) { + //协谷的小端模式 + int temp = IcomRigConstant.twoByteBcdToIntBigEnd(xieGu6100Command.getData(true)); + if (temp != 255) { + alc = temp;// + } + } + showAlert();//检查meter值是否在告警范围 + + break; + } + } + + + private void showAlert() { + if ((swr >= IcomRigConstant.swr_alert_max) + && GeneralVariables.swr_switch_on) { + if (!swrAlert) { + swrAlert = true; + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.swr_high_alert)); + } + } else { + swrAlert = false; + } + + //协谷的alc值,是在指定范围之内 + //alc太高 + if ((alc > IcomRigConstant.xiegu_alc_alert_max) + && GeneralVariables.alc_switch_on) {//网络模式下不警告ALC + if (!alcMaxAlert) { + alcMaxAlert = true; + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.alc_high_alert)); + } + } else { + alcMaxAlert = false; + } + //alc太低 + if ((alc < IcomRigConstant.xiegu_alc_alert_min) + && GeneralVariables.alc_switch_on) {//网络模式下不警告ALC + if (!alcMinAlert) { + alcMinAlert = true; + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.alc_low_alert)); + } + } else { + alcMinAlert = false; + } + + } + + + @Override + public void onReceiveData(byte[] data) { + int commandEnd = getCommandEnd(data); + if (commandEnd <= -1) {//这是没有指令结尾 + byte[] temp = new byte[dataBuffer.length + data.length]; + System.arraycopy(dataBuffer, 0, temp, 0, dataBuffer.length); + System.arraycopy(data, 0, temp, dataBuffer.length, data.length); + dataBuffer = temp; + } else { + byte[] temp = new byte[dataBuffer.length + commandEnd + 1]; + System.arraycopy(dataBuffer, 0, temp, 0, dataBuffer.length); + dataBuffer = temp; + System.arraycopy(data, 0, dataBuffer, dataBuffer.length - commandEnd - 1, commandEnd + 1); + } + if (commandEnd != -1) { + analysisCommand(dataBuffer); + } + dataBuffer = new byte[0];//清空缓冲区 + if (commandEnd <= -1 || commandEnd < data.length) { + byte[] temp = new byte[data.length - commandEnd + 1]; + for (int i = 0; i < data.length - commandEnd - 1; i++) { + temp[i] = data[commandEnd + i + 1]; + } + dataBuffer = temp; + } + + + } + + @Override + public void sendWaveData(Ft8Message message) {//发送音频数据到电台,用于网络方式 + if (getConnector() != null) {//把生成的具体音频数据传递到Connector, + //判断如果是ft8cns,就传输a19数据包 + if (GeneralVariables.instructionSet == InstructionSet.XIEGU_6100_FT8CNS) { + //Log.e(TAG,"generate A91"); + getConnector().sendFt8A91(GenerateFT8.generateA91(message, true) + , GeneralVariables.getBaseFrequency()); + } else {//否则正常传输音频数据 + float[] data = GenerateFT8.generateFt8(message, GeneralVariables.getBaseFrequency() + , 12000);//此处icom电台发射音频的采样率是12000 + if (data == null) { + setPTT(false); + return; + } + getConnector().sendWaveData(data); + } + } + } + + @Override + public void readFreqFromRig() { + if (getConnector() != null) { + getConnector().sendData(IcomRigConstant.setReadFreq(ctrAddress, getCivAddress())); + //getConnector().sendData(IcomRigConstant.setReadFreq(getCivAddress(), getCivAddress())); + } + } + + /** + * 读swr和alc数据 + */ + private void readSWRMeter() { + if (getConnector() != null) { + getConnector().sendData(IcomRigConstant.getSWRState(ctrAddress, getCivAddress())); + getConnector().sendData(IcomRigConstant.getALCState(ctrAddress, getCivAddress())); + } + } + + @Override + public String getName() { + return "XIEGU X6100 series"; + } + + + public String getFrequencyStr() { + return BaseRigOperation.getFrequencyStr(getFreq()); + } + + public XieGu6100Rig(int civAddress) { + Log.d(TAG, "XieGuRig: Create."); + setCivAddress(civAddress); + + readFreqTimer.schedule(readTask(), START_QUERY_FREQ_DELAY, QUERY_FREQ_TIMEOUT); + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/XieGuRig.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/XieGuRig.java new file mode 100644 index 00000000..a6fa02b0 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/XieGuRig.java @@ -0,0 +1,288 @@ +package com.bg7yoz.ft8cn.rigs; + +import static com.bg7yoz.ft8cn.GeneralVariables.QUERY_FREQ_TIMEOUT; +import static com.bg7yoz.ft8cn.GeneralVariables.START_QUERY_FREQ_DELAY; + +import android.util.Log; + +import com.bg7yoz.ft8cn.Ft8Message; +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.database.ControlMode; +import com.bg7yoz.ft8cn.ft8transmit.GenerateFT8; +import com.bg7yoz.ft8cn.ui.ToastMessage; + +import java.util.Timer; +import java.util.TimerTask; + +public class XieGuRig extends BaseRig { + private static final String TAG = "XieGu6100Rig"; + + private final int ctrAddress = 0xE0;//接收地址,默认0xE0;电台回复命令有时也可以是0x00 + private byte[] dataBuffer = new byte[0];//数据缓冲区 + private int swr = 0; + private int alc = 0; + private boolean alcMaxAlert = false; + private boolean alcMinAlert = false; + private boolean swrAlert = false; + private Timer readFreqTimer = new Timer(); + + private TimerTask readTask() { + return new TimerTask() { + @Override + public void run() { + try { + if (!isConnected()) { + readFreqTimer.cancel(); + readFreqTimer.purge(); + readFreqTimer = null; + return; + } + if (isPttOn()) { + readSWRMeter(); + } else { + readFreqFromRig(); + } + + } catch (Exception e) { + Log.e(TAG, "readFreq or meter error:" + e.getMessage()); + } + } + }; + } + + + @Override + public void setPTT(boolean on) { + super.setPTT(on); + + if (getConnector() != null) { + switch (getControlMode()) { + case ControlMode.CAT://以CIV指令 + getConnector().setPttOn(IcomRigConstant.setPTTState(ctrAddress, getCivAddress() + , on ? IcomRigConstant.PTT_ON : IcomRigConstant.PTT_OFF)); + break; + case ControlMode.RTS: + case ControlMode.DTR: + getConnector().setPttOn(on); + break; + } + } + } + + @Override + public boolean isConnected() { + if (getConnector() == null) { + return false; + } + return getConnector().isConnected(); + } + + @Override + public void setUsbModeToRig() { + if (getConnector() != null) { + getConnector().sendData(IcomRigConstant.setOperationMode(ctrAddress + , getCivAddress(), 1));//usb=1 + } + } + + @Override + public void setFreqToRig() { + if (getConnector() != null) { + getConnector().sendData(IcomRigConstant.setOperationFrequency(ctrAddress + , getCivAddress(), getFreq())); + } + } + + /** + * 查找指令的结尾的位置,如果没找到,值是-1。 + * + * @param data 数据 + * @return 位置 + */ + private int getCommandEnd(byte[] data) { + for (int i = 0; i < data.length; i++) { + if (data[i] == (byte) 0xFD) { + return i; + } + } + return -1; + } + + /** + * 查找指令头,没找到返回-1,找到返回FE FE的第一个位置 + * + * @param data 数据 + * @return 位置 + */ + private int getCommandHead(byte[] data) { + if (data.length < 2) return -1; + for (int i = 0; i < data.length - 1; i++) { + if (data[i] == (byte) 0xFE && data[i + 1] == (byte) 0xFE) { + return i; + } + } + return -1; + } + + private void analysisCommand(byte[] data) { + int headIndex = getCommandHead(data); + if (headIndex == -1) {//说明没有指令头 + return; + } + IcomCommand icomCommand; + if (headIndex == 0) { + icomCommand = IcomCommand.getCommand(ctrAddress, getCivAddress(), data); + } else { + byte[] temp = new byte[data.length - headIndex]; + System.arraycopy(data, headIndex, temp, 0, temp.length); + icomCommand = IcomCommand.getCommand(ctrAddress, getCivAddress(), temp); + } + if (icomCommand == null) { + return; + } + + //目前只对频率和模式消息作反应 + switch (icomCommand.getCommandID()) { + case IcomRigConstant.CMD_SEND_FREQUENCY_DATA://获取到的是频率数据 + case IcomRigConstant.CMD_READ_OPERATING_FREQUENCY: + //获取频率 + long freqTemp = icomCommand.getFrequency(false); + if (freqTemp >= 500000 && freqTemp <= 250000000) {//协谷的频率范围 + setFreq(freqTemp); + } + break; + case IcomRigConstant.CMD_SEND_MODE_DATA://获取到的是模式数据 + case IcomRigConstant.CMD_READ_OPERATING_MODE: + break; + case IcomRigConstant.CMD_READ_METER://读meter//此处的指令,只在网络模式实现,以后可能会在串口方面实现 + if (icomCommand.getSubCommand() == IcomRigConstant.CMD_READ_METER_SWR) { + //协谷的小端模式 + int temp = IcomRigConstant.twoByteBcdToIntBigEnd(icomCommand.getData(true)); + if (temp != 255) { + swr = temp;// + } + } + if (icomCommand.getSubCommand() == IcomRigConstant.CMD_READ_METER_ALC) { + //协谷的小端模式 + int temp = IcomRigConstant.twoByteBcdToIntBigEnd(icomCommand.getData(true)); + if (temp != 255) { + alc = temp;// + } + } + showAlert();//检查meter值是否在告警范围 + + break; + } + } + + + private void showAlert() { + if ((swr >= IcomRigConstant.swr_alert_max) + && GeneralVariables.swr_switch_on) { + if (!swrAlert) { + swrAlert = true; + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.swr_high_alert)); + } + } else { + swrAlert = false; + } + + //协谷的alc值,是在指定范围之内 + //alc太高 + if ((alc > IcomRigConstant.xiegu_alc_alert_max) + && GeneralVariables.alc_switch_on) {//网络模式下不警告ALC + if (!alcMaxAlert) { + alcMaxAlert = true; + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.alc_high_alert)); + } + } else { + alcMaxAlert = false; + } + //alc太低 + if ((alc < IcomRigConstant.xiegu_alc_alert_min) + && GeneralVariables.alc_switch_on) {//网络模式下不警告ALC + if (!alcMinAlert) { + alcMinAlert = true; + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.alc_low_alert)); + } + } else { + alcMinAlert = false; + } + } + + + @Override + public void onReceiveData(byte[] data) { + int commandEnd = getCommandEnd(data); + if (commandEnd <= -1) {//这是没有指令结尾 + byte[] temp = new byte[dataBuffer.length + data.length]; + System.arraycopy(dataBuffer, 0, temp, 0, dataBuffer.length); + System.arraycopy(data, 0, temp, dataBuffer.length, data.length); + dataBuffer = temp; + } else { + byte[] temp = new byte[dataBuffer.length + commandEnd + 1]; + System.arraycopy(dataBuffer, 0, temp, 0, dataBuffer.length); + dataBuffer = temp; + System.arraycopy(data, 0, dataBuffer, dataBuffer.length - commandEnd - 1, commandEnd + 1); + } + if (commandEnd != -1) { + analysisCommand(dataBuffer); + } + dataBuffer = new byte[0];//清空缓冲区 + if (commandEnd <= -1 || commandEnd < data.length) { + byte[] temp = new byte[data.length - commandEnd + 1]; + for (int i = 0; i < data.length - commandEnd - 1; i++) { + temp[i] = data[commandEnd + i + 1]; + } + dataBuffer = temp; + } + + + } + + @Override + public void readFreqFromRig() { + if (getConnector() != null) { + getConnector().sendData(IcomRigConstant.setReadFreq(ctrAddress, getCivAddress())); + } + } + + private void readSWRMeter() { + if (getConnector() != null) { + getConnector().sendData(IcomRigConstant.getSWRState(ctrAddress, getCivAddress())); + getConnector().sendData(IcomRigConstant.getALCState(ctrAddress, getCivAddress())); + } + } + + @Override + public String getName() { + return "XIEGU 6100 series"; + } + + @Override + public void sendWaveData(Ft8Message message) {//发送音频数据到电台,用于网络方式 + if (getConnector() != null) {//把生成的具体音频数据传递到Connector, + float[] data = GenerateFT8.generateFt8(message, GeneralVariables.getBaseFrequency() + , 12000);//此处icom电台发射音频的采样率是12000 + if (data == null) { + setPTT(false); + return; + } + getConnector().sendWaveData(data); + } + } + + + public String getFrequencyStr() { + return BaseRigOperation.getFrequencyStr(getFreq()); + } + + public XieGuRig(int civAddress) { + Log.d(TAG, "XieGuRig 6100: Create."); + setCivAddress(civAddress); + + readFreqTimer.schedule(readTask(), START_QUERY_FREQ_DELAY, QUERY_FREQ_TIMEOUT); + //readFreqTimer.schedule(readTask(),START_QUERY_FREQ_DELAY,1000); + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/Yaesu2Command.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/Yaesu2Command.java new file mode 100644 index 00000000..d8e18a44 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/Yaesu2Command.java @@ -0,0 +1,22 @@ +package com.bg7yoz.ft8cn.rigs; + +public class Yaesu2Command { + private static final String TAG="Yaesu 2 Command"; + + public static long getFrequency(byte[] rawData){ + if (rawData.length==5){ + return ((int) (rawData[0] >> 4) & 0xf) * 100000000 + +(int) (rawData[0] & 0x0f) * 10000000 + +((int) (rawData[1] >> 4) & 0xf) * 1000000 + +(int) (rawData[1] & 0x0f) * 100000 + +((int) (rawData[2] >> 4) & 0xf) * 10000 + +(int) (rawData[2] & 0x0f) * 1000 + +((int) (rawData[3] >> 4) & 0xf) * 10000 + +(int) (rawData[3] & 0x0f) * 1000; + }else { + return -1; + } + } + + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/Yaesu2Rig.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/Yaesu2Rig.java new file mode 100644 index 00000000..8c58b82d --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/Yaesu2Rig.java @@ -0,0 +1,157 @@ +package com.bg7yoz.ft8cn.rigs; + +import static com.bg7yoz.ft8cn.GeneralVariables.QUERY_FREQ_TIMEOUT; +import static com.bg7yoz.ft8cn.GeneralVariables.START_QUERY_FREQ_DELAY; + +import android.util.Log; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.database.ControlMode; +import com.bg7yoz.ft8cn.ui.ToastMessage; + +import java.util.Timer; +import java.util.TimerTask; + +/** + * YAESU的部分电台,回送的数据不是连续的,所以,要做一个缓冲区,接受5字节长度。满了就复位。或发送指令时,就复位。 + */ +public class Yaesu2Rig extends BaseRig { + private static final String TAG = "Yaesu2Rig"; + private Timer readFreqTimer = new Timer(); + + private int swr = 0; + private int alc = 0; + private boolean alcMaxAlert = false; + private boolean swrAlert = false; + + private TimerTask readTask() { + return new TimerTask() { + @Override + public void run() { + try { + if (!isConnected()) { + readFreqTimer.cancel(); + readFreqTimer.purge(); + readFreqTimer = null; + return; + } + if (isPttOn()) { + readMeters(); + } else { + readFreqFromRig(); + } + } catch (Exception e) { + Log.e(TAG, "readFreq error:" + e.getMessage()); + } + } + }; + } + + + @Override + public void setPTT(boolean on) { + super.setPTT(on); + + if (getConnector() != null) { + switch (getControlMode()) { + case ControlMode.CAT://以CIV指令 + getConnector().setPttOn(Yaesu2RigConstant.setPTTState(on)); + break; + case ControlMode.RTS: + case ControlMode.DTR: + getConnector().setPttOn(on); + break; + } + } + } + + + @Override + public boolean isConnected() { + if (getConnector() == null) { + return false; + } + return getConnector().isConnected(); + } + + @Override + public void setUsbModeToRig() { + if (getConnector() != null) { + getConnector().sendData(Yaesu2RigConstant.setOperationUSBMode()); + } + } + + @Override + public void setFreqToRig() { + if (getConnector() != null) { + getConnector().sendData(Yaesu2RigConstant.setOperationFreq(getFreq())); + } + } + + @Override + public void onReceiveData(byte[] data) { + //YAESU 817的指令,返回频率是5字节的,METER是2字节的。 + //Meter是2字节的,第一字节高位功率,0-A,低位ALC 0-9,第二字节高位驻波比,0-C,0为高驻波,低位音频输入0-8 + if (data.length == 5) {//频率 + long freq = Yaesu2Command.getFrequency(data); + if (freq > -1) { + setFreq(freq); + } + } else if (data.length == 2) {//METERS + alc = (data[0] & 0x0f); + swr = (data[1] & 0x0f0) >> 4; + showAlert(); + } + + } + + /** + * 读取Meter RM; + */ + private void readMeters() { + if (getConnector() != null) { + getConnector().sendData(Yaesu2RigConstant.readMeter()); + } + } + + private void showAlert() { + if ((swr > Yaesu2RigConstant.swr_817_alert_min) + && GeneralVariables.swr_switch_on) { + if (!swrAlert) { + swrAlert = true; + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.swr_high_alert)); + } + } else { + swrAlert = false; + } + if ((alc >= Yaesu2RigConstant.alc_817_alert_max) + && GeneralVariables.alc_switch_on) {//网络模式下不警告ALC + if (!alcMaxAlert) { + alcMaxAlert = true; + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.alc_high_alert)); + } + } else { + alcMaxAlert = false; + } + + } + + @Override + public void readFreqFromRig() { + if (getConnector() != null) { + //clearBuffer();//清除一下缓冲区 + getConnector().sendData(Yaesu2RigConstant.setReadOperationFreq()); + } + } + + @Override + public String getName() { + return "YAESU 817 series"; + } + + public Yaesu2Rig() { + readFreqTimer.schedule(readTask(), START_QUERY_FREQ_DELAY, QUERY_FREQ_TIMEOUT); + } + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/Yaesu2RigConstant.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/Yaesu2RigConstant.java new file mode 100644 index 00000000..fe400fc8 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/Yaesu2RigConstant.java @@ -0,0 +1,94 @@ +package com.bg7yoz.ft8cn.rigs; + +public class Yaesu2RigConstant { + private static final String TAG = "Yaesu2RigConstant"; + //LSB:0,USB:1,AM:2,CW:3,RTTY:4,FM:5,WFM:6,CW_R:7,RTTY_R:8,DV:17 + public static final int LSB = 0x00; + public static final int USB = 0x01; + public static final int CW = 0x02; + public static final int CW_R = 0x03; + public static final int AM = 0x04; + public static final int FM = 0x05; + public static final int DIG = 0x0A; + public static final int PKT = 0x0C; + public static final int swr_817_alert_min=6;//相当于3.0, + public static final int alc_817_alert_max=7;//取值时0-9,合适值是7 + //PTT状态 + + //指令集 + private static final byte[] PTT_ON = {(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x08}; + private static final byte[] PTT_OFF = {(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x88}; + private static final byte[] GET_METER = {(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0xBD}; + private static final byte[] GET_CONNECT = {(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00}; + private static final byte[] GET_DISCONNECT = {(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x80}; + //USB模式 + private static final byte[] USB_MODE = {(byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x07}; + //DIG模式 + private static final byte[] DIG_MODE = {(byte) 0x0A, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x07}; + private static final byte[] READ_FREQ = {(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x03}; + + + public static String getModeStr(int mode) { + switch (mode) { + case LSB: + return "LSB"; + case USB: + return "USB"; + case AM: + return "AM"; + case CW: + return "CW"; + case FM: + return "FM"; + case CW_R: + return "CW_R"; + case DIG: + return "DIG"; + case PKT: + return "PKT"; + default: + return "UNKNOWN"; + } + } + + + public static byte[] setPTTState(boolean on) { + if (on) { + return PTT_ON; + } else { + return PTT_OFF; + } + + } + public static byte[] setOperationUSBMode() { + return DIG_MODE; + } + public static byte[] setOperationUSB847Mode() { + return USB_MODE; + } + public static byte[] readMeter() { + return GET_METER; + } + + public static byte[] sendConnectData() { + return GET_CONNECT; + } + public static byte[] sendDisconnectData() { + return GET_DISCONNECT; + } + public static byte[] setOperationFreq(long freq) { + byte[] data = new byte[]{ + (byte) (((byte) (freq % 1000000000 / 100000000) << 4) + (byte) (freq % 100000000 / 10000000)) + , (byte) (((byte) (freq % 10000000 / 1000000) << 4) + (byte) (freq % 1000000 / 100000)) + , (byte) (((byte) (freq % 100000 / 10000) << 4) + (byte) (freq % 10000 / 1000)) + , (byte) (((byte) (freq % 1000 / 100) << 4) + (byte) (freq % 100)) + ,(byte) 0x01 + }; + return data; + } + public static byte[] setReadOperationFreq(){ + return READ_FREQ; + } + + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/Yaesu2_847Rig.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/Yaesu2_847Rig.java new file mode 100644 index 00000000..b39d886a --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/Yaesu2_847Rig.java @@ -0,0 +1,178 @@ +package com.bg7yoz.ft8cn.rigs; + +import static com.bg7yoz.ft8cn.GeneralVariables.QUERY_FREQ_TIMEOUT; +import static com.bg7yoz.ft8cn.GeneralVariables.START_QUERY_FREQ_DELAY; + +import android.util.Log; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.database.ControlMode; +import com.bg7yoz.ft8cn.ui.ToastMessage; + +import java.util.Timer; +import java.util.TimerTask; + +/** + * YAESU的部分电台,回送的数据不是连续的,所以,要做一个缓冲区,接受5字节长度。满了就复位。或发送指令时,就复位。 + * ft848在连接成功后,必须发送5个0,结束后发送4个0加80 + */ +public class Yaesu2_847Rig extends BaseRig { + private static final String TAG = "Yaesu2_847Rig"; + private Timer readFreqTimer = new Timer(); + + private int swr = 0; + private int alc = 0; + private boolean alcMaxAlert = false; + private boolean swrAlert = false; + private boolean sentConnect = false; + + private TimerTask readTask() { + return new TimerTask() { + @Override + public void run() { + try { + if (!isConnected()) { + readFreqTimer.cancel(); + readFreqTimer.purge(); + readFreqTimer = null; + return; + } + if (!sentConnect) {//发送连接头数据,5个0,只发送1次 + sendConnectData(); + sentConnect = !sentConnect; + } + + if (isPttOn()) { + readMeters(); + } else { + readFreqFromRig(); + } + } catch (Exception e) { + Log.e(TAG, "readFreq error:" + e.getMessage()); + } + } + }; + } + + + @Override + public void setPTT(boolean on) { + super.setPTT(on); + + if (getConnector() != null) { + switch (getControlMode()) { + case ControlMode.CAT://以CIV指令 + getConnector().setPttOn(Yaesu2RigConstant.setPTTState(on)); + break; + case ControlMode.RTS: + case ControlMode.DTR: + getConnector().setPttOn(on); + break; + } + } + } + + + @Override + public boolean isConnected() { + if (getConnector() == null) { + return false; + } + return getConnector().isConnected(); + } + + @Override + public void setUsbModeToRig() { + if (getConnector() != null) { + getConnector().sendData(Yaesu2RigConstant.setOperationUSB847Mode()); + } + } + + @Override + public void setFreqToRig() { + if (getConnector() != null) { + getConnector().sendData(Yaesu2RigConstant.setOperationFreq(getFreq())); + } + } + + @Override + public void onReceiveData(byte[] data) { + //YAESU 817的指令,返回频率是5字节的,METER是2字节的。 + //Meter是2字节的,第一字节高位功率,0-A,低位ALC 0-9,第二字节高位驻波比,0-C,0为高驻波,低位音频输入0-8 + if (data.length == 5) {//频率 + long freq = Yaesu2Command.getFrequency(data); + if (freq > -1) { + setFreq(freq); + } + } else if (data.length == 2) {//METERS + alc = (data[0] & 0x0f); + swr = (data[1] & 0x0f0) >> 4; + showAlert(); + } + + } + + /** + * 读取Meter RM; + */ + private void readMeters() { + if (getConnector() != null) { + getConnector().sendData(Yaesu2RigConstant.readMeter()); + } + } + + private void sendConnectData() {//连接电台后,要发送5个0 + if (getConnector() != null) { + getConnector().sendData(Yaesu2RigConstant.sendConnectData()); + } + } + + @Override + public void onDisconnecting() {//断开电台前,要发送4个0加80 + if (getConnector() != null) { + getConnector().sendData(Yaesu2RigConstant.sendDisconnectData()); + } + super.onDisconnecting(); + } + + private void showAlert() { + if ((swr > Yaesu2RigConstant.swr_817_alert_min) + && GeneralVariables.swr_switch_on) { + if (!swrAlert) { + swrAlert = true; + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.swr_high_alert)); + } + } else { + swrAlert = false; + } + if ((alc >= Yaesu2RigConstant.alc_817_alert_max) + && GeneralVariables.alc_switch_on) {//网络模式下不警告ALC + if (!alcMaxAlert) { + alcMaxAlert = true; + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.alc_high_alert)); + } + } else { + alcMaxAlert = false; + } + + } + + @Override + public void readFreqFromRig() { + if (getConnector() != null) { + //clearBuffer();//清除一下缓冲区 + getConnector().sendData(Yaesu2RigConstant.setReadOperationFreq()); + } + } + + @Override + public String getName() { + return "YAESU 847 series"; + } + + public Yaesu2_847Rig() { + readFreqTimer.schedule(readTask(), START_QUERY_FREQ_DELAY, QUERY_FREQ_TIMEOUT); + } + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/Yaesu38Rig.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/Yaesu38Rig.java new file mode 100644 index 00000000..5df29a41 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/Yaesu38Rig.java @@ -0,0 +1,192 @@ +package com.bg7yoz.ft8cn.rigs; + +import static com.bg7yoz.ft8cn.GeneralVariables.QUERY_FREQ_TIMEOUT; +import static com.bg7yoz.ft8cn.GeneralVariables.START_QUERY_FREQ_DELAY; + +import android.util.Log; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.database.ControlMode; +import com.bg7yoz.ft8cn.ui.ToastMessage; + +import java.util.Timer; +import java.util.TimerTask; + +public class Yaesu38Rig extends BaseRig { + private static final String TAG = "Yaesu3Rig"; + private final StringBuilder buffer = new StringBuilder(); + + private int swr = 0; + private int alc = 0; + private boolean alcMaxAlert = false; + private boolean swrAlert = false; + + private Timer readFreqTimer = new Timer(); + + private TimerTask readTask() { + return new TimerTask() { + @Override + public void run() { + try { + if (!isConnected()) { + readFreqTimer.cancel(); + readFreqTimer.purge(); + readFreqTimer = null; + return; + } + if (isPttOn()) { + readMeters(); + } else { + readFreqFromRig(); + } + } catch (Exception e) { + Log.e(TAG, "readFreq error:" + e.getMessage()); + } + } + }; + } + + /** + * 读取Meter RM; + */ + private void readMeters() { + if (getConnector() != null) { + clearBufferData();//清空一下缓存 + getConnector().sendData(Yaesu3RigConstant.setRead39Meters_ALC()); + getConnector().sendData(Yaesu3RigConstant.setRead39Meters_SWR()); + } + } + + private void showAlert() { + if ((swr >= Yaesu3RigConstant.swr_39_alert_max) + && GeneralVariables.swr_switch_on) { + if (!swrAlert) { + swrAlert = true; + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.swr_high_alert)); + } + } else { + swrAlert = false; + } + if ((alc > Yaesu3RigConstant.alc_39_alert_max) + && GeneralVariables.alc_switch_on) {//网络模式下不警告ALC + if (!alcMaxAlert) { + alcMaxAlert = true; + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.alc_high_alert)); + } + } else { + alcMaxAlert = false; + } + + } + + /** + * 清空缓存数据 + */ + private void clearBufferData() { + buffer.setLength(0); + } + + @Override + public void setPTT(boolean on) { + super.setPTT(on); + if (getConnector() != null) { + switch (getControlMode()) { + case ControlMode.CAT://以CIV指令 + getConnector().setPttOn(Yaesu3RigConstant.setPTTState(on)); + break; + case ControlMode.RTS: + case ControlMode.DTR: + getConnector().setPttOn(on); + break; + } + } + } + + @Override + public boolean isConnected() { + if (getConnector() == null) { + return false; + } + return getConnector().isConnected(); + } + + @Override + public void setUsbModeToRig() { + if (getConnector() != null) { + getConnector().sendData(Yaesu3RigConstant.setOperationUSBMode()); + } + } + + @Override + public void setFreqToRig() { + if (getConnector() != null) { + getConnector().sendData(Yaesu3RigConstant.setOperationFreq8Byte(getFreq())); + } + } + + @Override + public void onReceiveData(byte[] data) { + String s = new String(data); + if (!s.contains(";")) { + buffer.append(s); + if (buffer.length() > 1000) clearBufferData(); + return;//说明数据还没接收完。 + } else { + if (s.indexOf(";") > 0) {//说明接到结束的数据了,并且不是第一个字符是; + buffer.append(s.substring(0, s.indexOf(";"))); + } + + //开始分析数据 + Yaesu3Command yaesu3Command = Yaesu3Command.getCommand(buffer.toString()); + clearBufferData();//清一下缓存 + //要把剩下的数据放到缓存里 + buffer.append(s.substring(s.indexOf(";") + 1)); + + if (yaesu3Command == null) { + return; + } + //long tempFreq = Yaesu3Command.getFrequency(yaesu3Command); + //if (tempFreq != 0) {//如果tempFreq==0,说明频率不正常 + // setFreq(Yaesu3Command.getFrequency(yaesu3Command)); + //} + + + if (yaesu3Command.getCommandID().equalsIgnoreCase("FA") + || yaesu3Command.getCommandID().equalsIgnoreCase("FB")) { + long tempFreq = Yaesu3Command.getFrequency(yaesu3Command); + if (tempFreq != 0) {//如果tempFreq==0,说明频率不正常 + setFreq(Yaesu3Command.getFrequency(yaesu3Command)); + } + } else if (yaesu3Command.getCommandID().equalsIgnoreCase("RM")) {//METER + if (Yaesu3Command.isSWRMeter38(yaesu3Command)) { + swr = Yaesu3Command.getALCOrSWR38(yaesu3Command); + } + if (Yaesu3Command.isALCMeter38(yaesu3Command)) { + alc = Yaesu3Command.getALCOrSWR38(yaesu3Command); + } + showAlert(); + } + + + } + + } + + @Override + public void readFreqFromRig() { + if (getConnector() != null) { + clearBufferData();//清空一下缓存 + getConnector().sendData(Yaesu3RigConstant.setReadOperationFreq()); + } + } + + @Override + public String getName() { + return "YAESU FT-2000 series"; + } + + public Yaesu38Rig() { + readFreqTimer.schedule(readTask(), START_QUERY_FREQ_DELAY, QUERY_FREQ_TIMEOUT); + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/Yaesu38_450Rig.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/Yaesu38_450Rig.java new file mode 100644 index 00000000..c1fd96d1 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/Yaesu38_450Rig.java @@ -0,0 +1,193 @@ +package com.bg7yoz.ft8cn.rigs; + +import static com.bg7yoz.ft8cn.GeneralVariables.QUERY_FREQ_TIMEOUT; +import static com.bg7yoz.ft8cn.GeneralVariables.START_QUERY_FREQ_DELAY; + +import android.util.Log; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.database.ControlMode; +import com.bg7yoz.ft8cn.ui.ToastMessage; + +import java.util.Timer; +import java.util.TimerTask; + +public class Yaesu38_450Rig extends BaseRig { + private static final String TAG = "Yaesu38_450Rig"; + private final StringBuilder buffer = new StringBuilder(); + private int swr = 0; + private int alc = 0; + private boolean alcMaxAlert = false; + private boolean swrAlert = false; + + private Timer readFreqTimer = new Timer(); + + private TimerTask readTask() { + return new TimerTask() { + @Override + public void run() { + try { + if (!isConnected()) { + readFreqTimer.cancel(); + readFreqTimer.purge(); + readFreqTimer = null; + return; + } + if (isPttOn()) { + readMeters(); + } else { + readFreqFromRig(); + } + } catch (Exception e) { + Log.e(TAG, "readFreq error:" + e.getMessage()); + } + } + }; + } + + /** + * 读取Meter RM; + */ + private void readMeters() { + if (getConnector() != null) { + clearBufferData();//清空一下缓存 + getConnector().sendData(Yaesu3RigConstant.setRead39Meters_ALC()); + getConnector().sendData(Yaesu3RigConstant.setRead39Meters_SWR()); + } + } + + private void showAlert() { + if ((swr >= Yaesu3RigConstant.swr_39_alert_max) + && GeneralVariables.swr_switch_on) { + if (!swrAlert) { + swrAlert = true; + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.swr_high_alert)); + } + } else { + swrAlert = false; + } + if ((alc > Yaesu3RigConstant.alc_39_alert_max) + && GeneralVariables.alc_switch_on) {//网络模式下不警告ALC + if (!alcMaxAlert) { + alcMaxAlert = true; + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.alc_high_alert)); + } + } else { + alcMaxAlert = false; + } + + } + + /** + * 清空缓存数据 + */ + private void clearBufferData() { + buffer.setLength(0); + } + + @Override + public void setPTT(boolean on) { + super.setPTT(on); + if (getConnector() != null) { + switch (getControlMode()) { + case ControlMode.CAT://以CIV指令 + getConnector().setPttOn(Yaesu3RigConstant.setPTT_TX_On(on));//针对YAESU 450指令 + break; + case ControlMode.RTS: + case ControlMode.DTR: + getConnector().setPttOn(on); + break; + } + } + } + + @Override + public boolean isConnected() { + if (getConnector() == null) { + return false; + } + return getConnector().isConnected(); + } + + @Override + public void setUsbModeToRig() { + if (getConnector() != null) { + getConnector().sendData(Yaesu3RigConstant.setOperationDATA_U_Mode()); + //getConnector().sendData(Yaesu3RigConstant.setOperationUSB_Data_Mode()); + //getConnector().sendData(Yaesu3RigConstant.setOperationUSBMode()); + } + } + + @Override + public void setFreqToRig() { + if (getConnector() != null) { + getConnector().sendData(Yaesu3RigConstant.setOperationFreq8Byte(getFreq())); + } + } + + @Override + public void onReceiveData(byte[] data) { + String s = new String(data); + //ToastMessage.showDebug("39 YAESU 读数据:"+new String(Yaesu3RigConstant.setReadOperationFreq())); + + if (!s.contains(";")) { + buffer.append(s); + if (buffer.length() > 1000) clearBufferData(); + //return;//说明数据还没接收完。 + } else { + if (s.indexOf(";") > 0) {//说明接到结束的数据了,并且不是第一个字符是; + buffer.append(s.substring(0, s.indexOf(";"))); + } + + //开始分析数据 + Yaesu3Command yaesu3Command = Yaesu3Command.getCommand(buffer.toString()); + clearBufferData();//清一下缓存 + //要把剩下的数据放到缓存里 + buffer.append(s.substring(s.indexOf(";") + 1)); + + if (yaesu3Command == null) { + return; + } + //long tempFreq = Yaesu3Command.getFrequency(yaesu3Command); + //if (tempFreq != 0) {//如果tempFreq==0,说明频率不正常 + // setFreq(Yaesu3Command.getFrequency(yaesu3Command)); + //} + + if (yaesu3Command.getCommandID().equalsIgnoreCase("FA") + || yaesu3Command.getCommandID().equalsIgnoreCase("FB")) { + long tempFreq = Yaesu3Command.getFrequency(yaesu3Command); + if (tempFreq != 0) {//如果tempFreq==0,说明频率不正常 + setFreq(Yaesu3Command.getFrequency(yaesu3Command)); + } + } else if (yaesu3Command.getCommandID().equalsIgnoreCase("RM")) {//METER + if (Yaesu3Command.isSWRMeter38(yaesu3Command)) { + swr = Yaesu3Command.getALCOrSWR38(yaesu3Command); + } + if (Yaesu3Command.isALCMeter38(yaesu3Command)) { + alc = Yaesu3Command.getALCOrSWR38(yaesu3Command); + } + showAlert(); + } + + } + + } + + @Override + public void readFreqFromRig() { + if (getConnector() != null) { + clearBufferData();//清空一下缓存 + getConnector().sendData(Yaesu3RigConstant.setReadOperationFreq()); + } + } + + @Override + public String getName() { + return "YAESU FT-450"; + } + + public Yaesu38_450Rig() { + readFreqTimer.schedule(readTask(), START_QUERY_FREQ_DELAY, QUERY_FREQ_TIMEOUT); + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/Yaesu39Rig.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/Yaesu39Rig.java new file mode 100644 index 00000000..4e8bff33 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/Yaesu39Rig.java @@ -0,0 +1,195 @@ +package com.bg7yoz.ft8cn.rigs; + +import static com.bg7yoz.ft8cn.GeneralVariables.QUERY_FREQ_TIMEOUT; +import static com.bg7yoz.ft8cn.GeneralVariables.START_QUERY_FREQ_DELAY; + +import android.util.Log; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.database.ControlMode; +import com.bg7yoz.ft8cn.ui.ToastMessage; + +import java.util.Timer; +import java.util.TimerTask; + +/** + * 3代的指令,不同电台还有不同,频率长度981,991是9位,其它的长度是8位 + */ +public class Yaesu39Rig extends BaseRig { + private static final String TAG = "Yaesu3Rig"; + private final StringBuilder buffer = new StringBuilder(); + private int swr = 0; + private int alc = 0; + private boolean alcMaxAlert = false; + private boolean swrAlert = false; + + private boolean isDataUsb = false;//是不是DATA-USB模式 + + private Timer readFreqTimer = new Timer(); + + private TimerTask readTask() { + return new TimerTask() { + @Override + public void run() { + try { + if (!isConnected()) { + readFreqTimer.cancel(); + readFreqTimer.purge(); + readFreqTimer = null; + return; + } + if (isPttOn()) { + readMeters(); + } else { + readFreqFromRig(); + } + } catch (Exception e) { + Log.e(TAG, "readFreq error:" + e.getMessage()); + } + } + }; + } + + /** + * 读取Meter RM; + */ + private void readMeters() { + if (getConnector() != null) { + clearBufferData();//清空一下缓存 + getConnector().sendData(Yaesu3RigConstant.setRead39Meters_ALC()); + getConnector().sendData(Yaesu3RigConstant.setRead39Meters_SWR()); + } + } + + private void showAlert() { + if ((swr >= Yaesu3RigConstant.swr_39_alert_max) + && GeneralVariables.swr_switch_on) { + if (!swrAlert) { + swrAlert = true; + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.swr_high_alert)); + } + } else { + swrAlert = false; + } + if ((alc > Yaesu3RigConstant.alc_39_alert_max) + && GeneralVariables.alc_switch_on) {//网络模式下不警告ALC + if (!alcMaxAlert) { + alcMaxAlert = true; + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.alc_high_alert)); + } + } else { + alcMaxAlert = false; + } + + } + + /** + * 清空缓存数据 + */ + private void clearBufferData() { + buffer.setLength(0); + } + + @Override + public void setPTT(boolean on) { + super.setPTT(on); + if (getConnector() != null) { + switch (getControlMode()) { + case ControlMode.CAT://以CIV指令 + getConnector().setPttOn(Yaesu3RigConstant.setPTTState(on)); + break; + case ControlMode.RTS: + case ControlMode.DTR: + getConnector().setPttOn(on); + break; + } + } + } + + @Override + public boolean isConnected() { + if (getConnector() == null) { + return false; + } + return getConnector().isConnected(); + } + + @Override + public void setUsbModeToRig() { + if (getConnector() != null) { + if (isDataUsb) {//使用DATA-USB模式 + getConnector().sendData(Yaesu3RigConstant.setOperationUSB_Data_Mode()); + } else { + getConnector().sendData(Yaesu3RigConstant.setOperationUSBMode()); + } + } + } + + @Override + public void setFreqToRig() { + if (getConnector() != null) { + getConnector().sendData(Yaesu3RigConstant.setOperationFreq9Byte(getFreq())); + } + } + + @Override + public void onReceiveData(byte[] data) { + String s = new String(data); + + if (!s.contains(";")) { + buffer.append(s); + if (buffer.length() > 1000) clearBufferData(); + // return;//说明数据还没接收完。 + } else { + if (s.indexOf(";") > 0) {//说明接到结束的数据了,并且不是第一个字符是; + buffer.append(s.substring(0, s.indexOf(";"))); + } + + //开始分析数据 + Yaesu3Command yaesu3Command = Yaesu3Command.getCommand(buffer.toString()); + clearBufferData();//清一下缓存 + //要把剩下的数据放到缓存里 + buffer.append(s.substring(s.indexOf(";") + 1)); + + if (yaesu3Command == null) { + return; + } + if (yaesu3Command.getCommandID().equalsIgnoreCase("FA") + || yaesu3Command.getCommandID().equalsIgnoreCase("FB")) { + long tempFreq = Yaesu3Command.getFrequency(yaesu3Command); + if (tempFreq != 0) {//如果tempFreq==0,说明频率不正常 + setFreq(Yaesu3Command.getFrequency(yaesu3Command)); + } + } else if (yaesu3Command.getCommandID().equalsIgnoreCase("RM")) {//METER + if (Yaesu3Command.isSWRMeter39(yaesu3Command)) { + swr = Yaesu3Command.getSWROrALC39(yaesu3Command); + } + if (Yaesu3Command.isALCMeter39(yaesu3Command)) { + alc = Yaesu3Command.getSWROrALC39(yaesu3Command); + } + showAlert(); + } + + } + + } + + @Override + public void readFreqFromRig() { + if (getConnector() != null) { + clearBufferData();//清空一下缓存 + getConnector().sendData(Yaesu3RigConstant.setReadOperationFreq()); + } + } + + @Override + public String getName() { + return "YAESU FT-891"; + } + + public Yaesu39Rig(boolean isDataUsb) { + this.isDataUsb = isDataUsb; + readFreqTimer.schedule(readTask(), START_QUERY_FREQ_DELAY, QUERY_FREQ_TIMEOUT); + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/Yaesu3Command.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/Yaesu3Command.java new file mode 100644 index 00000000..976b787e --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/Yaesu3Command.java @@ -0,0 +1,136 @@ +package com.bg7yoz.ft8cn.rigs; + + +import android.util.Log; + +public class Yaesu3Command { + private static final String TAG = "Yaesu3Command"; + private final String commandID; + private final String data; + + /** + * 获取命令(两字节字符串) + * + * @return 主命令值 + */ + public String getCommandID() {//获取主命令 + return commandID; + } + + /** + * 获取命令数据,字符串,没有分号 + * + * @return 命令数据 + */ + public String getData() {//获取命令数据 + return data; + } + + public Yaesu3Command(String commandID, String data) { + this.commandID = commandID; + this.data = data; + } + //解析接收的指令 + + /** + * 从串口中接到的数据解析出指令的数据:指令头+内容+分号 + * + * @param buffer 从串口接收到的数据 + * @return 返回电台指令对象,如果不符合指令的格式,返回null。 + */ + public static Yaesu3Command getCommand(String buffer) { + if (buffer.length() < 2) {//指令的长度必须大于等于2 + return null; + } + if (buffer.substring(0, 2).matches("[a-zA-Z][a-zA-Z]")) { + return new Yaesu3Command(buffer.substring(0, 2), buffer.substring(2)); + } + return null; + } + + + /** + * 计算频率 + * + * @param command 指令 + * @return 频率 + */ + public static long getFrequency(Yaesu3Command command) { + try { + if (command.getCommandID().equals("FA") || command.getCommandID().equals("FB")) { + return Long.parseLong(command.getData()); + } else { + return 0; + } + } catch (Exception e) { + Log.e(TAG, "获取频率失败: " + command.getData() + "\n" + e.getMessage()); + } + return 0; + } + + + /** + * 获取SWR_YAESU 950 + * + * @param command 指令 + * @return 值 + */ + public static int getALCOrSWR38(Yaesu3Command command) { + if (command.data.length() < 7) return 0; + return Integer.parseInt(command.data.substring(1, 4)); + } + + public static boolean isSWRMeter38(Yaesu3Command command) { + if (command.data.length() < 7) return false; + return (command.data.charAt(0) == '6'); + } + + public static boolean isALCMeter38(Yaesu3Command command) { + if (command.data.length() < 7) return false; + return (command.data.charAt(0) == '4'); + } + + + /** + * 获取SWR_YAESU 891 + * + * @param command 指令 + * @return 值 + */ + public static int getSWROrALC39(Yaesu3Command command) { + if (command.data.length() < 4) return 0; + return Integer.parseInt(command.data.substring(1, 4)); + } + + public static boolean isSWRMeter39(Yaesu3Command command) { + if (command.data.length() < 4) return false; + return (command.data.charAt(0) == '6'); + } + + public static boolean isALCMeter39(Yaesu3Command command) { + if (command.data.length() < 4) return false; + return (command.data.charAt(0) == '4'); + } + + /** + * 获取ts-590的ALC,SWR + * + * @param command 指令 + * @return 值 + */ + public static int get590ALCOrSWR(Yaesu3Command command) { + return Integer.parseInt(command.data.substring(1, 5)); + } + + public static boolean is590MeterALC(Yaesu3Command command){ + if (command.data.length() < 5) return false; + return command.data.charAt(2) == '3'; + } + public static boolean is590MeterSWR(Yaesu3Command command){ + if (command.data.length() < 5) return false; + return command.data.charAt(2) == '1'; + } + + + +} \ No newline at end of file diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/Yaesu3RigConstant.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/Yaesu3RigConstant.java new file mode 100644 index 00000000..3aa700f9 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/Yaesu3RigConstant.java @@ -0,0 +1,132 @@ +package com.bg7yoz.ft8cn.rigs; + +import android.annotation.SuppressLint; + +public class Yaesu3RigConstant { + private static final String TAG = "Yaesu3RigConstant"; + //LSB:0,USB:1,AM:2,CW:3,RTTY:4,FM:5,WFM:6,CW_R:7,RTTY_R:8,DV:17 + public static final int LSB = 0x01; + public static final int USB = 0x02; + public static final int CW = 0x03; + public static final int FM = 0x04; + public static final int AM = 0x05; + public static final int RTTY = 0x06; + public static final int CW_R = 0x07; + public static final int DATA = 0x08; + public static final int RTTY_R = 0x09; + public static final int NONE = 0x0A; + public static final int FM_N = 0x0B; + public static final int DATA_R = 0x0C; + public static final int AM_N = 0x0D; + + + public static final int swr_39_alert_max=125;//相当于3.0 + public static final int alc_39_alert_max=125;//超过,在表上显示红色 + //PTT状态 + + //指令集 + private static final String PTT_ON = "MX1;"; + private static final String PTT_OFF = "MX0;"; + private static final String USB_MODE = "MD02;"; + private static final String USB_MODE_DATA = "MD09;"; + private static final String DATA_U_MODE = "MD0C;"; + private static final String READ_FREQ = "FA;"; + private static final String READ_39METER_ALC = "RM4;";//38,39的指令都是一样的 + private static final String READ_39METER_SWR = "RM6;";//38,39的指令都是一样的 + + private static final String TX_ON = "TX1;";//用于FT450 ptt + private static final String TX_OFF = "TX0;";//用于FT450 ptt + + + + + + + public static String getModeStr(int mode) { + switch (mode) { + case LSB: + return "LSB"; + case USB: + return "USB"; + case CW: + return "CW"; + case FM: + return "FM"; + case AM: + return "AM"; + case RTTY: + return "RTTY"; + case CW_R: + return "CW_R"; + case DATA: + return "DATA"; + case RTTY_R: + return "RTTY_R"; + case NONE: + return "NONE"; + case FM_N: + return "FM_N"; + case DATA_R: + return "DATA_R"; + case AM_N: + return "AM_N"; + default: + return "UNKNOWN"; + } + } + + + public static byte[] setPTTState(boolean on) { + if (on) { + return PTT_ON.getBytes(); + } else { + return PTT_OFF.getBytes(); + } + + } + //针对YAESU 450的发射指令 + public static byte[] setPTT_TX_On(boolean on) {//用于FT450 + if (on) { + return TX_ON.getBytes(); + } else { + return TX_OFF.getBytes(); + } + + } + public static byte[] setOperationUSBMode() { + return USB_MODE.getBytes(); + } + public static byte[] setOperationUSB_Data_Mode() { + return DATA_U_MODE.getBytes(); + } + + public static byte[] setOperationDATA_U_Mode() { + return DATA_U_MODE.getBytes(); + } + + @SuppressLint("DefaultLocale") + public static byte[] setOperationFreq11Byte(long freq) {//用于KENWOOD TS590 + return String.format("FA%011d;",freq).getBytes(); + } + + @SuppressLint("DefaultLocale") + public static byte[] setOperationFreq9Byte(long freq) { + return String.format("FA%09d;",freq).getBytes(); + } + @SuppressLint("DefaultLocale") + public static byte[] setOperationFreq8Byte(long freq) { + return String.format("FA%08d;",freq).getBytes(); + } + public static byte[] setReadOperationFreq(){ + return READ_FREQ.getBytes(); + } + + public static byte[] setRead39Meters_ALC(){ + return READ_39METER_ALC.getBytes(); + } + public static byte[] setRead39Meters_SWR(){ + return READ_39METER_SWR.getBytes(); + } + + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/YaesuDX10Rig.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/YaesuDX10Rig.java new file mode 100644 index 00000000..a0f26397 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/rigs/YaesuDX10Rig.java @@ -0,0 +1,194 @@ +package com.bg7yoz.ft8cn.rigs; + +import static com.bg7yoz.ft8cn.GeneralVariables.QUERY_FREQ_TIMEOUT; +import static com.bg7yoz.ft8cn.GeneralVariables.START_QUERY_FREQ_DELAY; + +import android.util.Log; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.database.ControlMode; +import com.bg7yoz.ft8cn.ui.ToastMessage; + +import java.util.Timer; +import java.util.TimerTask; + +/** + * 3代的指令,不同电台还有不同,频率长度981,991是9位,其它的长度是8位 + */ +public class YaesuDX10Rig extends BaseRig { + private static final String TAG = "YaesuDX10Rig"; + private final StringBuilder buffer = new StringBuilder(); + private int swr = 0; + private int alc = 0; + private boolean alcMaxAlert = false; + private boolean swrAlert = false; + + private Timer readFreqTimer = new Timer(); + + private TimerTask readTask() { + return new TimerTask() { + @Override + public void run() { + try { + if (!isConnected()) { + readFreqTimer.cancel(); + readFreqTimer.purge(); + readFreqTimer = null; + return; + } + if (isPttOn()) { + readMeters(); + } else { + readFreqFromRig(); + } + } catch (Exception e) { + Log.e(TAG, "readFreq error:" + e.getMessage()); + } + } + }; + } + + /** + * 读取Meter RM; + */ + private void readMeters() { + if (getConnector() != null) { + clearBufferData();//清空一下缓存 + getConnector().sendData(Yaesu3RigConstant.setRead39Meters_ALC()); + getConnector().sendData(Yaesu3RigConstant.setRead39Meters_SWR()); + } + } + + private void showAlert() { + if ((swr >= Yaesu3RigConstant.swr_39_alert_max) + && GeneralVariables.swr_switch_on) { + if (!swrAlert) { + swrAlert = true; + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.swr_high_alert)); + } + } else { + swrAlert = false; + } + if ((alc > Yaesu3RigConstant.alc_39_alert_max) + && GeneralVariables.alc_switch_on) {//网络模式下不警告ALC + if (!alcMaxAlert) { + alcMaxAlert = true; + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.alc_high_alert)); + } + } else { + alcMaxAlert = false; + } + + } + + /** + * 清空缓存数据 + */ + private void clearBufferData() { + buffer.setLength(0); + } + + @Override + public void setPTT(boolean on) { + super.setPTT(on); + if (getConnector() != null) { + switch (getControlMode()) { + case ControlMode.CAT://以CIV指令 + getConnector().setPttOn(Yaesu3RigConstant.setPTTState(on)); + break; + case ControlMode.RTS: + case ControlMode.DTR: + getConnector().setPttOn(on); + break; + } + } + } + + @Override + public boolean isConnected() { + if (getConnector() == null) { + return false; + } + return getConnector().isConnected(); + } + + @Override + public void setUsbModeToRig() { + if (getConnector() != null) { + getConnector().sendData(Yaesu3RigConstant.setOperationDATA_U_Mode()); + } + } + + @Override + public void setFreqToRig() { + if (getConnector() != null) { + getConnector().sendData(Yaesu3RigConstant.setOperationFreq9Byte(getFreq())); + } + } + + @Override + public void onReceiveData(byte[] data) { + String s = new String(data); + if (!s.contains(";")) { + buffer.append(s); + if (buffer.length() > 1000) clearBufferData(); + return;//说明数据还没接收完。 + } else { + if (s.indexOf(";") > 0) {//说明接到结束的数据了,并且不是第一个字符是; + buffer.append(s.substring(0, s.indexOf(";"))); + } + //开始分析数据 + Yaesu3Command yaesu3Command = Yaesu3Command.getCommand(buffer.toString()); + clearBufferData();//清一下缓存 + //要把剩下的数据放到缓存里 + buffer.append(s.substring(s.indexOf(";") + 1)); + + if (yaesu3Command == null) { + return; + } + //if (yaesu3Command.getCommandID().equalsIgnoreCase("FA") + // || yaesu3Command.getCommandID().toLowerCase().equals("FB")) { + // long tempFreq=Yaesu3Command.getFrequency(yaesu3Command); + // if (tempFreq!=0) {//如果tempFreq==0,说明频率不正常 + // setFreq(Yaesu3Command.getFrequency(yaesu3Command)); + // } + //} + if (yaesu3Command.getCommandID().equalsIgnoreCase("FA") + || yaesu3Command.getCommandID().equalsIgnoreCase("FB")) { + long tempFreq = Yaesu3Command.getFrequency(yaesu3Command); + if (tempFreq != 0) {//如果tempFreq==0,说明频率不正常 + setFreq(Yaesu3Command.getFrequency(yaesu3Command)); + } + } else if (yaesu3Command.getCommandID().equalsIgnoreCase("RM")) {//METER + if (Yaesu3Command.isSWRMeter38(yaesu3Command)) { + swr = Yaesu3Command.getALCOrSWR38(yaesu3Command); + } + if (Yaesu3Command.isALCMeter38(yaesu3Command)) { + alc = Yaesu3Command.getALCOrSWR38(yaesu3Command); + } + showAlert(); + } + + } + + } + + @Override + public void readFreqFromRig() { + if (getConnector() != null) { + clearBufferData();//清空一下缓存 + + getConnector().sendData(Yaesu3RigConstant.setReadOperationFreq()); + } + } + + @Override + public String getName() { + return "YAESU DX10 series"; + } + + public YaesuDX10Rig() { + readFreqTimer.schedule(readTask(), START_QUERY_FREQ_DELAY, QUERY_FREQ_TIMEOUT); + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/serialport/CdcAcmSerialDriver.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/serialport/CdcAcmSerialDriver.java new file mode 100644 index 00000000..be22673a --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/serialport/CdcAcmSerialDriver.java @@ -0,0 +1,353 @@ +/* Copyright 2011-2013 Google Inc. + * Copyright 2013 mike wakerly + * + * Project home page: https://github.com/mik3y/usb-serial-for-android + */ + +package com.bg7yoz.ft8cn.serialport; + +import android.hardware.usb.UsbConstants; +import android.hardware.usb.UsbDevice; +import android.hardware.usb.UsbDeviceConnection; +import android.hardware.usb.UsbEndpoint; +import android.hardware.usb.UsbInterface; +import android.util.Log; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.EnumSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * USB CDC/ACM serial driver implementation. + * + * @author mike wakerly (opensource@hoho.com) + * @see Universal + * Serial Bus Class Definitions for Communication Devices, v1.1 + */ +public class CdcAcmSerialDriver implements UsbSerialDriver { + + private final String TAG = CdcAcmSerialDriver.class.getSimpleName(); + + private final UsbDevice mDevice; + private final List mPorts; + + public CdcAcmSerialDriver(UsbDevice device) { + mDevice = device; + mPorts = new ArrayList<>(); + + int controlInterfaceCount = 0; + int dataInterfaceCount = 0; + for( int i = 0; i < device.getInterfaceCount(); i++) { + if(device.getInterface(i).getInterfaceClass() == UsbConstants.USB_CLASS_COMM) + controlInterfaceCount++; + if(device.getInterface(i).getInterfaceClass() == UsbConstants.USB_CLASS_CDC_DATA) + dataInterfaceCount++; + } + for( int port = 0; port < Math.min(controlInterfaceCount, dataInterfaceCount); port++) { + mPorts.add(new CdcAcmSerialPort(mDevice, port)); + } + if(mPorts.size() == 0) { + mPorts.add(new CdcAcmSerialPort(mDevice, -1)); + } + } + + @Override + public UsbDevice getDevice() { + return mDevice; + } + + @Override + public List getPorts() { + return mPorts; + } + + public class CdcAcmSerialPort extends CommonUsbSerialPort { + + private UsbInterface mControlInterface; + private UsbInterface mDataInterface; + + private UsbEndpoint mControlEndpoint; + + private int mControlIndex; + + private boolean mRts = false; + private boolean mDtr = false; + + private static final int USB_RECIP_INTERFACE = 0x01; + private static final int USB_RT_ACM = UsbConstants.USB_TYPE_CLASS | USB_RECIP_INTERFACE; + + private static final int SET_LINE_CODING = 0x20; // USB CDC 1.1 section 6.2 + private static final int GET_LINE_CODING = 0x21; + private static final int SET_CONTROL_LINE_STATE = 0x22; + private static final int SEND_BREAK = 0x23; + + public CdcAcmSerialPort(UsbDevice device, int portNumber) { + super(device, portNumber); + } + + @Override + public UsbSerialDriver getDriver() { + return CdcAcmSerialDriver.this; + } + + @Override + protected void openInt(UsbDeviceConnection connection) throws IOException { + if (mPortNumber == -1) { + Log.d(TAG,"device might be castrated ACM device, trying single interface logic"); + openSingleInterface(); + } else { + Log.d(TAG,"trying default interface logic"); + openInterface(); + } + } + + private void openSingleInterface() throws IOException { + // the following code is inspired by the cdc-acm driver in the linux kernel + + mControlIndex = 0; + mControlInterface = mDevice.getInterface(0); + mDataInterface = mDevice.getInterface(0); + if (!mConnection.claimInterface(mControlInterface, true)) { + throw new IOException("Could not claim shared control/data interface"); + } + + for (int i = 0; i < mControlInterface.getEndpointCount(); ++i) { + UsbEndpoint ep = mControlInterface.getEndpoint(i); + if ((ep.getDirection() == UsbConstants.USB_DIR_IN) && (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_INT)) { + mControlEndpoint = ep; + } else if ((ep.getDirection() == UsbConstants.USB_DIR_IN) && (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK)) { + mReadEndpoint = ep; + } else if ((ep.getDirection() == UsbConstants.USB_DIR_OUT) && (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK)) { + mWriteEndpoint = ep; + } + } + if (mControlEndpoint == null) { + throw new IOException("No control endpoint"); + } + } + + private void openInterface() throws IOException { + Log.d(TAG, "claiming interfaces, count=" + mDevice.getInterfaceCount()); + + int controlInterfaceCount = 0; + int dataInterfaceCount = 0; + mControlInterface = null; + mDataInterface = null; + for (int i = 0; i < mDevice.getInterfaceCount(); i++) { + UsbInterface usbInterface = mDevice.getInterface(i); + if (usbInterface.getInterfaceClass() == UsbConstants.USB_CLASS_COMM) { + if(controlInterfaceCount == mPortNumber) { + mControlIndex = i; + mControlInterface = usbInterface; + } + controlInterfaceCount++; + } + if (usbInterface.getInterfaceClass() == UsbConstants.USB_CLASS_CDC_DATA) { + if(dataInterfaceCount == mPortNumber) { + mDataInterface = usbInterface; + } + dataInterfaceCount++; + } + } + + if(mControlInterface == null) { + throw new IOException("No control interface"); + } + Log.d(TAG, "Control iface=" + mControlInterface); + + if (!mConnection.claimInterface(mControlInterface, true)) { + throw new IOException("Could not claim control interface"); + } + + mControlEndpoint = mControlInterface.getEndpoint(0); + if (mControlEndpoint.getDirection() != UsbConstants.USB_DIR_IN || mControlEndpoint.getType() != UsbConstants.USB_ENDPOINT_XFER_INT) { + throw new IOException("Invalid control endpoint"); + } + + if(mDataInterface == null) { + throw new IOException("No data interface"); + } + Log.d(TAG, "data iface=" + mDataInterface); + + if (!mConnection.claimInterface(mDataInterface, true)) { + throw new IOException("Could not claim data interface"); + } + + for (int i = 0; i < mDataInterface.getEndpointCount(); i++) { + UsbEndpoint ep = mDataInterface.getEndpoint(i); + if (ep.getDirection() == UsbConstants.USB_DIR_IN && ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) + mReadEndpoint = ep; + if (ep.getDirection() == UsbConstants.USB_DIR_OUT && ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) + mWriteEndpoint = ep; + } + } + + private int sendAcmControlMessage(int request, int value, byte[] buf) throws IOException { + int len = mConnection.controlTransfer( + USB_RT_ACM, request, value, mControlIndex, buf, buf != null ? buf.length : 0, 5000); + if(len < 0) { + throw new IOException("controlTransfer failed"); + } + return len; + } + + @Override + protected void closeInt() { + try { + mConnection.releaseInterface(mControlInterface); + mConnection.releaseInterface(mDataInterface); + } catch(Exception ignored) {} + } + + @Override + public void setParameters(int baudRate, int dataBits, int stopBits, @Parity int parity) throws IOException { + if(baudRate <= 0) { + throw new IllegalArgumentException("Invalid baud rate: " + baudRate); + } + if(dataBits < DATABITS_5 || dataBits > DATABITS_8) { + throw new IllegalArgumentException("Invalid data bits: " + dataBits); + } + byte stopBitsByte; + switch (stopBits) { + case STOPBITS_1: stopBitsByte = 0; break; + case STOPBITS_1_5: stopBitsByte = 1; break; + case STOPBITS_2: stopBitsByte = 2; break; + default: throw new IllegalArgumentException("Invalid stop bits: " + stopBits); + } + + byte parityBitesByte; + switch (parity) { + case PARITY_NONE: parityBitesByte = 0; break; + case PARITY_ODD: parityBitesByte = 1; break; + case PARITY_EVEN: parityBitesByte = 2; break; + case PARITY_MARK: parityBitesByte = 3; break; + case PARITY_SPACE: parityBitesByte = 4; break; + default: throw new IllegalArgumentException("Invalid parity: " + parity); + } + byte[] msg = { + (byte) ( baudRate & 0xff), + (byte) ((baudRate >> 8 ) & 0xff), + (byte) ((baudRate >> 16) & 0xff), + (byte) ((baudRate >> 24) & 0xff), + stopBitsByte, + parityBitesByte, + (byte) dataBits}; + sendAcmControlMessage(SET_LINE_CODING, 0, msg); + } + + @Override + public boolean getDTR() throws IOException { + return mDtr; + } + + @Override + public void setDTR(boolean value) throws IOException { + mDtr = value; + setDtrRts(); + } + + @Override + public boolean getRTS() throws IOException { + return mRts; + } + + @Override + public void setRTS(boolean value) throws IOException { + mRts = value; + setDtrRts(); + } + + private void setDtrRts() throws IOException { + int value = (mRts ? 0x2 : 0) | (mDtr ? 0x1 : 0); + sendAcmControlMessage(SET_CONTROL_LINE_STATE, value, null); + } + + @Override + public EnumSet getControlLines() throws IOException { + EnumSet set = EnumSet.noneOf(ControlLine.class); + if(mRts) set.add(ControlLine.RTS); + if(mDtr) set.add(ControlLine.DTR); + return set; + } + + @Override + public EnumSet getSupportedControlLines() throws IOException { + return EnumSet.of(ControlLine.RTS, ControlLine.DTR); + } + + @Override + public void setBreak(boolean value) throws IOException { + sendAcmControlMessage(SEND_BREAK, value ? 0xffff : 0, null); + } + + } + + public static Map getSupportedDevices() { + final Map supportedDevices = new LinkedHashMap<>(); + supportedDevices.put(UsbId.VENDOR_ARDUINO, + new int[] { + UsbId.ARDUINO_UNO, + UsbId.ARDUINO_UNO_R3, + UsbId.ARDUINO_MEGA_2560, + UsbId.ARDUINO_MEGA_2560_R3, + UsbId.ARDUINO_SERIAL_ADAPTER, + UsbId.ARDUINO_SERIAL_ADAPTER_R3, + UsbId.ARDUINO_MEGA_ADK, + UsbId.ARDUINO_MEGA_ADK_R3, + UsbId.ARDUINO_LEONARDO, + UsbId.ARDUINO_MICRO, + }); + supportedDevices.put(UsbId.VENDOR_VAN_OOIJEN_TECH, + new int[] { + UsbId.VAN_OOIJEN_TECH_TEENSYDUINO_SERIAL, + }); + + + supportedDevices.put(UsbId.VENDOR_ATMEL, + new int[] { + UsbId.ATMEL_LUFA_CDC_DEMO_APP, + }); + supportedDevices.put(UsbId.VENDOR_LEAFLABS, + new int[] { + UsbId.LEAFLABS_MAPLE, + }); + supportedDevices.put(UsbId.VENDOR_ARM, + new int[] { + UsbId.ARM_MBED, + }); + supportedDevices.put(UsbId.VENDOR_ST, + new int[] { + UsbId.ST_CDC, + UsbId.ST_CDC2, + UsbId.ST_CDC3, + UsbId.CDC_WOLF_PID + }); + supportedDevices.put(UsbId.VENDOR_RASPBERRY_PI, + new int[] { + UsbId.RASPBERRY_PI_PICO_MICROPYTHON, + }); + + //国赫1带的USB口 + supportedDevices.put(UsbId.VENDOR_GUOHE1, + new int[] { + UsbId.PID_GUOHE1, + }); + + + supportedDevices.put(UsbId.VENDOR_ICOM, + new int[]{ + UsbId.IC_R30, + UsbId.IC_705, + UsbId.ICOM_USB_SERIAL_CONTROL + }); + supportedDevices.put(UsbId.VENDOR_QINHENG, new int[]{ + UsbId.XIEGU_X6100,//协谷X6100 + }); + return supportedDevices; + } + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/serialport/Ch34xSerialDriver.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/serialport/Ch34xSerialDriver.java new file mode 100644 index 00000000..20299822 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/serialport/Ch34xSerialDriver.java @@ -0,0 +1,388 @@ +/* Copyright 2014 Andreas Butti + * + * Project home page: https://github.com/mik3y/usb-serial-for-android + */ + +package com.bg7yoz.ft8cn.serialport; + +import android.hardware.usb.UsbConstants; +import android.hardware.usb.UsbDevice; +import android.hardware.usb.UsbDeviceConnection; +import android.hardware.usb.UsbEndpoint; +import android.hardware.usb.UsbInterface; +import android.util.Log; + +import com.bg7yoz.ft8cn.BuildConfig; + +import java.io.IOException; +import java.util.Collections; +import java.util.EnumSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +public class Ch34xSerialDriver implements UsbSerialDriver { + + private static final String TAG = Ch34xSerialDriver.class.getSimpleName(); + + private final UsbDevice mDevice; + private final UsbSerialPort mPort; + + private static final int LCR_ENABLE_RX = 0x80; + private static final int LCR_ENABLE_TX = 0x40; + private static final int LCR_MARK_SPACE = 0x20; + private static final int LCR_PAR_EVEN = 0x10; + private static final int LCR_ENABLE_PAR = 0x08; + private static final int LCR_STOP_BITS_2 = 0x04; + private static final int LCR_CS8 = 0x03; + private static final int LCR_CS7 = 0x02; + private static final int LCR_CS6 = 0x01; + private static final int LCR_CS5 = 0x00; + + private static final int GCL_CTS = 0x01; + private static final int GCL_DSR = 0x02; + private static final int GCL_RI = 0x04; + private static final int GCL_CD = 0x08; + private static final int SCL_DTR = 0x20; + private static final int SCL_RTS = 0x40; + + public Ch34xSerialDriver(UsbDevice device) { + mDevice = device; + mPort = new Ch340SerialPort(mDevice, 0); + } + + @Override + public UsbDevice getDevice() { + return mDevice; + } + + @Override + public List getPorts() { + return Collections.singletonList(mPort); + } + + public class Ch340SerialPort extends CommonUsbSerialPort { + + private static final int USB_TIMEOUT_MILLIS = 5000; + + private final int DEFAULT_BAUD_RATE = 9600; + + private boolean dtr = false; + private boolean rts = false; + + public Ch340SerialPort(UsbDevice device, int portNumber) { + super(device, portNumber); + } + + @Override + public UsbSerialDriver getDriver() { + return Ch34xSerialDriver.this; + } + + @Override + protected void openInt(UsbDeviceConnection connection) throws IOException { + for (int i = 0; i < mDevice.getInterfaceCount(); i++) { + UsbInterface usbIface = mDevice.getInterface(i); + if (!mConnection.claimInterface(usbIface, true)) { + throw new IOException("Could not claim data interface"); + } + } + + UsbInterface dataIface = mDevice.getInterface(mDevice.getInterfaceCount() - 1); + for (int i = 0; i < dataIface.getEndpointCount(); i++) { + UsbEndpoint ep = dataIface.getEndpoint(i); + if (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) { + if (ep.getDirection() == UsbConstants.USB_DIR_IN) { + mReadEndpoint = ep; + } else { + mWriteEndpoint = ep; + } + } + } + + initialize(); + setBaudRate(DEFAULT_BAUD_RATE); + } + + @Override + protected void closeInt() { + try { + for (int i = 0; i < mDevice.getInterfaceCount(); i++) + mConnection.releaseInterface(mDevice.getInterface(i)); + } catch(Exception ignored) {} + } + + private int controlOut(int request, int value, int index) { + final int REQTYPE_HOST_TO_DEVICE = UsbConstants.USB_TYPE_VENDOR | UsbConstants.USB_DIR_OUT; + return mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, request, + value, index, null, 0, USB_TIMEOUT_MILLIS); + } + + + private int controlIn(int request, int value, int index, byte[] buffer) { + final int REQTYPE_DEVICE_TO_HOST = UsbConstants.USB_TYPE_VENDOR | UsbConstants.USB_DIR_IN; + return mConnection.controlTransfer(REQTYPE_DEVICE_TO_HOST, request, + value, index, buffer, buffer.length, USB_TIMEOUT_MILLIS); + } + + + private void checkState(String msg, int request, int value, int[] expected) throws IOException { + byte[] buffer = new byte[expected.length]; + int ret = controlIn(request, value, 0, buffer); + + if (ret < 0) { + throw new IOException("Failed send cmd [" + msg + "]"); + } + + if (ret != expected.length) { + throw new IOException("Expected " + expected.length + " bytes, but get " + ret + " [" + msg + "]"); + } + + for (int i = 0; i < expected.length; i++) { + if (expected[i] == -1) { + continue; + } + + int current = buffer[i] & 0xff; + if (expected[i] != current) { + throw new IOException("Expected 0x" + Integer.toHexString(expected[i]) + " byte, but get 0x" + Integer.toHexString(current) + " [" + msg + "]"); + } + } + } + + private void setControlLines() throws IOException { + if (controlOut(0xa4, ~((dtr ? SCL_DTR : 0) | (rts ? SCL_RTS : 0)), 0) < 0) { + throw new IOException("Failed to set control lines"); + } + } + + private byte getStatus() throws IOException { + byte[] buffer = new byte[2]; + int ret = controlIn(0x95, 0x0706, 0, buffer); + if (ret < 0) + throw new IOException("Error getting control lines"); + return buffer[0]; + } + + private void initialize() throws IOException { + checkState("init #1", 0x5f, 0, new int[]{-1 /* 0x27, 0x30 */, 0x00}); + + if (controlOut(0xa1, 0, 0) < 0) { + throw new IOException("Init failed: #2"); + } + + setBaudRate(DEFAULT_BAUD_RATE); + + checkState("init #4", 0x95, 0x2518, new int[]{-1 /* 0x56, c3*/, 0x00}); + + if (controlOut(0x9a, 0x2518, LCR_ENABLE_RX | LCR_ENABLE_TX | LCR_CS8) < 0) { + throw new IOException("Init failed: #5"); + } + + checkState("init #6", 0x95, 0x0706, new int[]{-1/*0xf?*/, -1/*0xec,0xee*/}); + + if (controlOut(0xa1, 0x501f, 0xd90a) < 0) { + throw new IOException("Init failed: #7"); + } + + setBaudRate(DEFAULT_BAUD_RATE); + + setControlLines(); + + checkState("init #10", 0x95, 0x0706, new int[]{-1/* 0x9f, 0xff*/, -1/*0xec,0xee*/}); + } + + + private void setBaudRate(int baudRate) throws IOException { + long factor; + long divisor; + + if (baudRate == 921600) { + divisor = 7; + factor = 0xf300; + } else { + final long BAUDBASE_FACTOR = 1532620800; + final int BAUDBASE_DIVMAX = 3; + + if(BuildConfig.DEBUG && (baudRate & (3<<29)) == (1<<29)) + baudRate &= ~(1<<29); // for testing purpose bypass dedicated baud rate handling + factor = BAUDBASE_FACTOR / baudRate; + divisor = BAUDBASE_DIVMAX; + while ((factor > 0xfff0) && divisor > 0) { + factor >>= 3; + divisor--; + } + if (factor > 0xfff0) { + throw new UnsupportedOperationException("Unsupported baud rate: " + baudRate); + } + factor = 0x10000 - factor; + } + + divisor |= 0x0080; // else ch341a waits until buffer full + int val1 = (int) ((factor & 0xff00) | divisor); + int val2 = (int) (factor & 0xff); + Log.d(TAG, String.format("baud rate=%d, 0x1312=0x%04x, 0x0f2c=0x%04x", baudRate, val1, val2)); + int ret = controlOut(0x9a, 0x1312, val1); + if (ret < 0) { + throw new IOException("Error setting baud rate: #1)"); + } + ret = controlOut(0x9a, 0x0f2c, val2); + if (ret < 0) { + throw new IOException("Error setting baud rate: #2"); + } + } + + @Override + public void setParameters(int baudRate, int dataBits, int stopBits, @Parity int parity) throws IOException { + if(baudRate <= 0) { + throw new IllegalArgumentException("Invalid baud rate: " + baudRate); + } + setBaudRate(baudRate); + + int lcr = LCR_ENABLE_RX | LCR_ENABLE_TX; + + switch (dataBits) { + case DATABITS_5: + lcr |= LCR_CS5; + break; + case DATABITS_6: + lcr |= LCR_CS6; + break; + case DATABITS_7: + lcr |= LCR_CS7; + break; + case DATABITS_8: + lcr |= LCR_CS8; + break; + default: + throw new IllegalArgumentException("Invalid data bits: " + dataBits); + } + + switch (parity) { + case PARITY_NONE: + break; + case PARITY_ODD: + lcr |= LCR_ENABLE_PAR; + break; + case PARITY_EVEN: + lcr |= LCR_ENABLE_PAR | LCR_PAR_EVEN; + break; + case PARITY_MARK: + lcr |= LCR_ENABLE_PAR | LCR_MARK_SPACE; + break; + case PARITY_SPACE: + lcr |= LCR_ENABLE_PAR | LCR_MARK_SPACE | LCR_PAR_EVEN; + break; + default: + throw new IllegalArgumentException("Invalid parity: " + parity); + } + + switch (stopBits) { + case STOPBITS_1: + break; + case STOPBITS_1_5: + throw new UnsupportedOperationException("Unsupported stop bits: 1.5"); + case STOPBITS_2: + lcr |= LCR_STOP_BITS_2; + break; + default: + throw new IllegalArgumentException("Invalid stop bits: " + stopBits); + } + + int ret = controlOut(0x9a, 0x2518, lcr); + if (ret < 0) { + throw new IOException("Error setting control byte"); + } + } + + @Override + public boolean getCD() throws IOException { + return (getStatus() & GCL_CD) == 0; + } + + @Override + public boolean getCTS() throws IOException { + return (getStatus() & GCL_CTS) == 0; + } + + @Override + public boolean getDSR() throws IOException { + return (getStatus() & GCL_DSR) == 0; + } + + @Override + public boolean getDTR() throws IOException { + return dtr; + } + + @Override + public void setDTR(boolean value) throws IOException { + dtr = value; + setControlLines(); + } + + @Override + public boolean getRI() throws IOException { + return (getStatus() & GCL_RI) == 0; + } + + @Override + public boolean getRTS() throws IOException { + return rts; + } + + @Override + public void setRTS(boolean value) throws IOException { + rts = value; + setControlLines(); + } + + @Override + public EnumSet getControlLines() throws IOException { + int status = getStatus(); + EnumSet set = EnumSet.noneOf(ControlLine.class); + if(rts) set.add(ControlLine.RTS); + if((status & GCL_CTS) == 0) set.add(ControlLine.CTS); + if(dtr) set.add(ControlLine.DTR); + if((status & GCL_DSR) == 0) set.add(ControlLine.DSR); + if((status & GCL_CD) == 0) set.add(ControlLine.CD); + if((status & GCL_RI) == 0) set.add(ControlLine.RI); + return set; + } + + @Override + public EnumSet getSupportedControlLines() throws IOException { + return EnumSet.allOf(ControlLine.class); + } + + @Override + public void setBreak(boolean value) throws IOException { + byte[] req = new byte[2]; + if(controlIn(0x95, 0x1805, 0, req) < 0) { + throw new IOException("Error getting BREAK condition"); + } + if(value) { + req[0] &= ~1; + req[1] &= ~0x40; + } else { + req[0] |= 1; + req[1] |= 0x40; + } + int val = (req[1] & 0xff) << 8 | (req[0] & 0xff); + if(controlOut(0x9a, 0x1805, val) < 0) { + throw new IOException("Error setting BREAK condition"); + } + } + } + + public static Map getSupportedDevices() { + final Map supportedDevices = new LinkedHashMap<>(); + supportedDevices.put(UsbId.VENDOR_QINHENG, new int[]{ + UsbId.QINHENG_CH340, + UsbId.QINHENG_CH341A, + UsbId.QINHENG_CH341K + }); + return supportedDevices; + } + +} \ No newline at end of file diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/serialport/CommonUsbSerialPort.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/serialport/CommonUsbSerialPort.java new file mode 100644 index 00000000..73f36d6c --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/serialport/CommonUsbSerialPort.java @@ -0,0 +1,318 @@ +/* Copyright 2011-2013 Google Inc. + * Copyright 2013 mike wakerly + * + * Project home page: https://github.com/mik3y/usb-serial-for-android + */ + +package com.bg7yoz.ft8cn.serialport; + +import android.hardware.usb.UsbDevice; +import android.hardware.usb.UsbDeviceConnection; +import android.hardware.usb.UsbEndpoint; +import android.hardware.usb.UsbRequest; +import android.util.Log; + +import com.bg7yoz.ft8cn.serialport.util.MonotonicClock; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.EnumSet; + +/** + * A base class shared by several driver implementations. + * + * @author mike wakerly (opensource@hoho.com) + */ +public abstract class CommonUsbSerialPort implements UsbSerialPort { + + public static boolean DEBUG = false; + + private static final String TAG = CommonUsbSerialPort.class.getSimpleName(); + private static final int MAX_READ_SIZE = 16 * 1024; // = old bulkTransfer limit + + protected final UsbDevice mDevice; + protected final int mPortNumber; + + // non-null when open() + protected UsbDeviceConnection mConnection = null; + protected UsbEndpoint mReadEndpoint; + protected UsbEndpoint mWriteEndpoint; + protected UsbRequest mUsbRequest; + + /** + * Internal write buffer. + * Guarded by {@link #mWriteBufferLock}. + * Default length = mReadEndpoint.getMaxPacketSize() + **/ + protected byte[] mWriteBuffer; + protected final Object mWriteBufferLock = new Object(); + + + public CommonUsbSerialPort(UsbDevice device, int portNumber) { + mDevice = device; + mPortNumber = portNumber; + } + + @Override + public String toString() { + return String.format("<%s device_name=%s device_id=%s port_number=%s>", + getClass().getSimpleName(), mDevice.getDeviceName(), + mDevice.getDeviceId(), mPortNumber); + } + + @Override + public UsbDevice getDevice() { + return mDevice; + } + + @Override + public int getPortNumber() { + return mPortNumber; + } + + @Override + public UsbEndpoint getWriteEndpoint() { return mWriteEndpoint; } + + @Override + public UsbEndpoint getReadEndpoint() { return mReadEndpoint; } + + /** + * Returns the device serial number + * @return serial number + */ + @Override + public String getSerial() { + return mConnection.getSerial(); + } + + /** + * Sets the size of the internal buffer used to exchange data with the USB + * stack for write operations. Most users should not need to change this. + * + * @param bufferSize the size in bytes, <= 0 resets original size + */ + public final void setWriteBufferSize(int bufferSize) { + synchronized (mWriteBufferLock) { + if (bufferSize <= 0) { + if (mWriteEndpoint != null) { + bufferSize = mWriteEndpoint.getMaxPacketSize(); + } else { + mWriteBuffer = null; + return; + } + } + if (mWriteBuffer != null && bufferSize == mWriteBuffer.length) { + return; + } + mWriteBuffer = new byte[bufferSize]; + } + } + + @Override + public void open(UsbDeviceConnection connection) throws IOException { + if (mConnection != null) { + throw new IOException("Already open"); + } + if(connection == null) { + throw new IllegalArgumentException("Connection is null"); + } + mConnection = connection; + try { + openInt(connection); + if (mReadEndpoint == null || mWriteEndpoint == null) { + throw new IOException("Could not get read & write endpoints"); + } + mUsbRequest = new UsbRequest(); + mUsbRequest.initialize(mConnection, mReadEndpoint); + } catch(Exception e) { + try { + close(); + } catch(Exception ignored) {} + throw e; + } + } + + protected abstract void openInt(UsbDeviceConnection connection) throws IOException; + + @Override + public void close() throws IOException { + if (mConnection == null) { + throw new IOException("Already closed"); + } + try { + mUsbRequest.cancel(); + } catch(Exception ignored) {} + mUsbRequest = null; + try { + closeInt(); + } catch(Exception ignored) {} + try { + mConnection.close(); + } catch(Exception ignored) {} + mConnection = null; + } + + protected abstract void closeInt(); + + /** + * use simple USB request supported by all devices to test if connection is still valid + */ + protected void testConnection() throws IOException { + byte[] buf = new byte[2]; + int len = mConnection.controlTransfer(0x80 /*DEVICE*/, 0 /*GET_STATUS*/, 0, 0, buf, buf.length, 200); + if(len < 0) + throw new IOException("USB get_status request failed"); + } + + @Override + public int read(final byte[] dest, final int timeout) throws IOException { + return read(dest, timeout, true); + } + + protected int read(final byte[] dest, final int timeout, boolean testConnection) throws IOException { + if(mConnection == null) { + throw new IOException("Connection closed"); + } + if(dest.length <= 0) { + throw new IllegalArgumentException("Read buffer to small"); + } + final int nread; + if (timeout != 0) { + // bulkTransfer will cause data loss with short timeout + high baud rates + continuous transfer + // https://stackoverflow.com/questions/9108548/android-usb-host-bulktransfer-is-losing-data + // but mConnection.requestWait(timeout) available since Android 8.0 es even worse, + // as it crashes with short timeout, e.g. + // A/libc: Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x276a in tid 29846 (pool-2-thread-1), pid 29618 (.usbserial.test) + // /system/lib64/libusbhost.so (usb_request_wait+192) + // /system/lib64/libandroid_runtime.so (android_hardware_UsbDeviceConnection_request_wait(_JNIEnv*, _jobject*, long)+84) + // data loss / crashes were observed with timeout up to 200 msec + long endTime = testConnection ? MonotonicClock.millis() + timeout : 0; + int readMax = Math.min(dest.length, MAX_READ_SIZE); + nread = mConnection.bulkTransfer(mReadEndpoint, dest, readMax, timeout); + // Android error propagation is improvable: + // nread == -1 can be: timeout, connection lost, buffer to small, ??? + if(nread == -1 && testConnection && MonotonicClock.millis() < endTime) + testConnection(); + + } else { + final ByteBuffer buf = ByteBuffer.wrap(dest); + if (!mUsbRequest.queue(buf, dest.length)) { + throw new IOException("Queueing USB request failed"); + } + final UsbRequest response = mConnection.requestWait(); + if (response == null) { + throw new IOException("Waiting for USB request failed"); + } + nread = buf.position(); + // Android error propagation is improvable: + // response != null & nread == 0 can be: connection lost, buffer to small, ??? + if(nread == 0) { + testConnection(); + } + } + return Math.max(nread, 0); + } + + @Override + public void write(final byte[] src, final int timeout) throws IOException { + int offset = 0; + final long endTime = (timeout == 0) ? 0 : (MonotonicClock.millis() + timeout); + + if(mConnection == null) { + throw new IOException("Connection closed"); + } + while (offset < src.length) { + int requestTimeout; + final int requestLength; + final int actualLength; + + synchronized (mWriteBufferLock) { + final byte[] writeBuffer; + + if (mWriteBuffer == null) { + mWriteBuffer = new byte[mWriteEndpoint.getMaxPacketSize()]; + } + requestLength = Math.min(src.length - offset, mWriteBuffer.length); + if (offset == 0) { + writeBuffer = src; + } else { + // bulkTransfer does not support offsets, make a copy. + System.arraycopy(src, offset, mWriteBuffer, 0, requestLength); + writeBuffer = mWriteBuffer; + } + if (timeout == 0 || offset == 0) { + requestTimeout = timeout; + } else { + requestTimeout = (int)(endTime - MonotonicClock.millis()); + if(requestTimeout == 0) + requestTimeout = -1; + } + if (requestTimeout < 0) { + actualLength = -2; + } else { + actualLength = mConnection.bulkTransfer(mWriteEndpoint, writeBuffer, requestLength, requestTimeout); + } + } + if (DEBUG) { + Log.d(TAG, "Wrote " + actualLength + "/" + requestLength + " offset " + offset + "/" + src.length + " timeout " + requestTimeout); + } + if (actualLength <= 0) { + if (timeout != 0 && MonotonicClock.millis() >= endTime) { + SerialTimeoutException ex = new SerialTimeoutException("Error writing " + requestLength + " bytes at offset " + offset + " of total " + src.length + ", rc=" + actualLength); + ex.bytesTransferred = offset; + throw ex; + } else { + throw new IOException("Error writing " + requestLength + " bytes at offset " + offset + " of total " + src.length); + } + } + offset += actualLength; + } + } + + @Override + public boolean isOpen() { + return mConnection != null; + } + + @Override + public abstract void setParameters(int baudRate, int dataBits, int stopBits, @Parity int parity) throws IOException; + + @Override + public boolean getCD() throws IOException { throw new UnsupportedOperationException(); } + + @Override + public boolean getCTS() throws IOException { throw new UnsupportedOperationException(); } + + @Override + public boolean getDSR() throws IOException { throw new UnsupportedOperationException(); } + + @Override + public boolean getDTR() throws IOException { throw new UnsupportedOperationException(); } + + @Override + public void setDTR(boolean value) throws IOException { throw new UnsupportedOperationException(); } + + @Override + public boolean getRI() throws IOException { throw new UnsupportedOperationException(); } + + @Override + public boolean getRTS() throws IOException { throw new UnsupportedOperationException(); } + + @Override + public void setRTS(boolean value) throws IOException { throw new UnsupportedOperationException(); } + + @Override + public abstract EnumSet getControlLines() throws IOException; + + @Override + public abstract EnumSet getSupportedControlLines() throws IOException; + + @Override + public void purgeHwBuffers(boolean purgeWriteBuffers, boolean purgeReadBuffers) throws IOException { + throw new UnsupportedOperationException(); + } + + @Override + public void setBreak(boolean value) throws IOException { throw new UnsupportedOperationException(); } + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/serialport/Cp21xxSerialDriver.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/serialport/Cp21xxSerialDriver.java new file mode 100644 index 00000000..0d8009b0 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/serialport/Cp21xxSerialDriver.java @@ -0,0 +1,335 @@ +/* Copyright 2011-2013 Google Inc. + * Copyright 2013 mike wakerly + * + * Project home page: https://github.com/mik3y/usb-serial-for-android + */ + +package com.bg7yoz.ft8cn.serialport; + +import android.hardware.usb.UsbConstants; +import android.hardware.usb.UsbDevice; +import android.hardware.usb.UsbDeviceConnection; +import android.hardware.usb.UsbEndpoint; +import android.hardware.usb.UsbInterface; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.EnumSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +public class Cp21xxSerialDriver implements UsbSerialDriver { + + private static final String TAG = Cp21xxSerialDriver.class.getSimpleName(); + + private final UsbDevice mDevice; + private final List mPorts; + + public Cp21xxSerialDriver(UsbDevice device) { + mDevice = device; + mPorts = new ArrayList<>(); + for( int port = 0; port < device.getInterfaceCount(); port++) { + mPorts.add(new Cp21xxSerialPort(mDevice, port)); + } + } + + @Override + public UsbDevice getDevice() { + return mDevice; + } + + @Override + public List getPorts() { + return mPorts; + } + + public class Cp21xxSerialPort extends CommonUsbSerialPort { + + private static final int USB_WRITE_TIMEOUT_MILLIS = 5000; + + /* + * Configuration Request Types + */ + private static final int REQTYPE_HOST_TO_DEVICE = 0x41; + private static final int REQTYPE_DEVICE_TO_HOST = 0xc1; + + /* + * Configuration Request Codes + */ + private static final int SILABSER_IFC_ENABLE_REQUEST_CODE = 0x00; + private static final int SILABSER_SET_LINE_CTL_REQUEST_CODE = 0x03; + private static final int SILABSER_SET_BREAK_REQUEST_CODE = 0x05; + private static final int SILABSER_SET_MHS_REQUEST_CODE = 0x07; + private static final int SILABSER_SET_BAUDRATE = 0x1E; + private static final int SILABSER_FLUSH_REQUEST_CODE = 0x12; + private static final int SILABSER_GET_MDMSTS_REQUEST_CODE = 0x08; + + private static final int FLUSH_READ_CODE = 0x0a; + private static final int FLUSH_WRITE_CODE = 0x05; + + /* + * SILABSER_IFC_ENABLE_REQUEST_CODE + */ + private static final int UART_ENABLE = 0x0001; + private static final int UART_DISABLE = 0x0000; + + /* + * SILABSER_SET_MHS_REQUEST_CODE + */ + private static final int DTR_ENABLE = 0x101; + private static final int DTR_DISABLE = 0x100; + private static final int RTS_ENABLE = 0x202; + private static final int RTS_DISABLE = 0x200; + + /* + * SILABSER_GET_MDMSTS_REQUEST_CODE + */ + private static final int STATUS_CTS = 0x10; + private static final int STATUS_DSR = 0x20; + private static final int STATUS_RI = 0x40; + private static final int STATUS_CD = 0x80; + + + private boolean dtr = false; + private boolean rts = false; + + // second port of Cp2105 has limited baudRate, dataBits, stopBits, parity + // unsupported baudrate returns error at controlTransfer(), other parameters are silently ignored + private boolean mIsRestrictedPort; + + public Cp21xxSerialPort(UsbDevice device, int portNumber) { + super(device, portNumber); + } + + @Override + public UsbSerialDriver getDriver() { + return Cp21xxSerialDriver.this; + } + + private void setConfigSingle(int request, int value) throws IOException { + int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, request, value, + mPortNumber, null, 0, USB_WRITE_TIMEOUT_MILLIS); + if (result != 0) { + throw new IOException("Control transfer failed: " + request + " / " + value + " -> " + result); + } + } + + private byte getStatus() throws IOException { + byte[] buffer = new byte[1]; + int result = mConnection.controlTransfer(REQTYPE_DEVICE_TO_HOST, SILABSER_GET_MDMSTS_REQUEST_CODE, 0, + mPortNumber, buffer, buffer.length, USB_WRITE_TIMEOUT_MILLIS); + if (result != 1) { + throw new IOException("Control transfer failed: " + SILABSER_GET_MDMSTS_REQUEST_CODE + " / " + 0 + " -> " + result); + } + return buffer[0]; + } + + @Override + protected void openInt(UsbDeviceConnection connection) throws IOException { + mIsRestrictedPort = mDevice.getInterfaceCount() == 2 && mPortNumber == 1; + if(mPortNumber >= mDevice.getInterfaceCount()) { + throw new IOException("Unknown port number"); + } + UsbInterface dataIface = mDevice.getInterface(mPortNumber); + if (!mConnection.claimInterface(dataIface, true)) { + throw new IOException("Could not claim interface " + mPortNumber); + } + for (int i = 0; i < dataIface.getEndpointCount(); i++) { + UsbEndpoint ep = dataIface.getEndpoint(i); + if (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) { + if (ep.getDirection() == UsbConstants.USB_DIR_IN) { + mReadEndpoint = ep; + } else { + mWriteEndpoint = ep; + } + } + } + + setConfigSingle(SILABSER_IFC_ENABLE_REQUEST_CODE, UART_ENABLE); + setConfigSingle(SILABSER_SET_MHS_REQUEST_CODE, (dtr ? DTR_ENABLE : DTR_DISABLE) | (rts ? RTS_ENABLE : RTS_DISABLE)); + } + + @Override + protected void closeInt() { + try { + setConfigSingle(SILABSER_IFC_ENABLE_REQUEST_CODE, UART_DISABLE); + } catch (Exception ignored) {} + try { + mConnection.releaseInterface(mDevice.getInterface(mPortNumber)); + } catch(Exception ignored) {} + } + + private void setBaudRate(int baudRate) throws IOException { + byte[] data = new byte[] { + (byte) ( baudRate & 0xff), + (byte) ((baudRate >> 8 ) & 0xff), + (byte) ((baudRate >> 16) & 0xff), + (byte) ((baudRate >> 24) & 0xff) + }; + int ret = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, SILABSER_SET_BAUDRATE, + 0, mPortNumber, data, 4, USB_WRITE_TIMEOUT_MILLIS); + if (ret < 0) { + throw new IOException("Error setting baud rate"); + } + } + + @Override + public void setParameters(int baudRate, int dataBits, int stopBits, @Parity int parity) throws IOException { + if(baudRate <= 0) { + throw new IllegalArgumentException("Invalid baud rate: " + baudRate); + } + setBaudRate(baudRate); + + int configDataBits = 0; + switch (dataBits) { + case DATABITS_5: + if(mIsRestrictedPort) + throw new UnsupportedOperationException("Unsupported data bits: " + dataBits); + configDataBits |= 0x0500; + break; + case DATABITS_6: + if(mIsRestrictedPort) + throw new UnsupportedOperationException("Unsupported data bits: " + dataBits); + configDataBits |= 0x0600; + break; + case DATABITS_7: + if(mIsRestrictedPort) + throw new UnsupportedOperationException("Unsupported data bits: " + dataBits); + configDataBits |= 0x0700; + break; + case DATABITS_8: + configDataBits |= 0x0800; + break; + default: + throw new IllegalArgumentException("Invalid data bits: " + dataBits); + } + + switch (parity) { + case PARITY_NONE: + break; + case PARITY_ODD: + configDataBits |= 0x0010; + break; + case PARITY_EVEN: + configDataBits |= 0x0020; + break; + case PARITY_MARK: + if(mIsRestrictedPort) + throw new UnsupportedOperationException("Unsupported parity: mark"); + configDataBits |= 0x0030; + break; + case PARITY_SPACE: + if(mIsRestrictedPort) + throw new UnsupportedOperationException("Unsupported parity: space"); + configDataBits |= 0x0040; + break; + default: + throw new IllegalArgumentException("Invalid parity: " + parity); + } + + switch (stopBits) { + case STOPBITS_1: + break; + case STOPBITS_1_5: + throw new UnsupportedOperationException("Unsupported stop bits: 1.5"); + case STOPBITS_2: + if(mIsRestrictedPort) + throw new UnsupportedOperationException("Unsupported stop bits: 2"); + configDataBits |= 2; + break; + default: + throw new IllegalArgumentException("Invalid stop bits: " + stopBits); + } + setConfigSingle(SILABSER_SET_LINE_CTL_REQUEST_CODE, configDataBits); + } + + @Override + public boolean getCD() throws IOException { + return (getStatus() & STATUS_CD) != 0; + } + + @Override + public boolean getCTS() throws IOException { + return (getStatus() & STATUS_CTS) != 0; + } + + @Override + public boolean getDSR() throws IOException { + return (getStatus() & STATUS_DSR) != 0; + } + + @Override + public boolean getDTR() throws IOException { + return dtr; + } + + @Override + public void setDTR(boolean value) throws IOException { + dtr = value; + setConfigSingle(SILABSER_SET_MHS_REQUEST_CODE, dtr ? DTR_ENABLE : DTR_DISABLE); + } + + @Override + public boolean getRI() throws IOException { + return (getStatus() & STATUS_RI) != 0; + } + + @Override + public boolean getRTS() throws IOException { + return rts; + } + + @Override + public void setRTS(boolean value) throws IOException { + rts = value; + setConfigSingle(SILABSER_SET_MHS_REQUEST_CODE, rts ? RTS_ENABLE : RTS_DISABLE); + } + + @Override + public EnumSet getControlLines() throws IOException { + byte status = getStatus(); + EnumSet set = EnumSet.noneOf(ControlLine.class); + if(rts) set.add(ControlLine.RTS); + if((status & STATUS_CTS) != 0) set.add(ControlLine.CTS); + if(dtr) set.add(ControlLine.DTR); + if((status & STATUS_DSR) != 0) set.add(ControlLine.DSR); + if((status & STATUS_CD) != 0) set.add(ControlLine.CD); + if((status & STATUS_RI) != 0) set.add(ControlLine.RI); + return set; + } + + @Override + public EnumSet getSupportedControlLines() throws IOException { + return EnumSet.allOf(ControlLine.class); + } + + @Override + // note: only working on some devices, on other devices ignored w/o error + public void purgeHwBuffers(boolean purgeWriteBuffers, boolean purgeReadBuffers) throws IOException { + int value = (purgeReadBuffers ? FLUSH_READ_CODE : 0) + | (purgeWriteBuffers ? FLUSH_WRITE_CODE : 0); + + if (value != 0) { + setConfigSingle(SILABSER_FLUSH_REQUEST_CODE, value); + } + } + + @Override + public void setBreak(boolean value) throws IOException { + setConfigSingle(SILABSER_SET_BREAK_REQUEST_CODE, value ? 1 : 0); + } + } + + public static Map getSupportedDevices() { + final Map supportedDevices = new LinkedHashMap<>(); + supportedDevices.put(UsbId.VENDOR_SILABS, + new int[] { + UsbId.SILABS_CP2102, // same ID for CP2101, CP2103, CP2104, CP2109 + UsbId.SILABS_CP2105, + UsbId.SILABS_CP2108, + }); + return supportedDevices; + } + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/serialport/FtdiSerialDriver.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/serialport/FtdiSerialDriver.java new file mode 100644 index 00000000..6fc44797 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/serialport/FtdiSerialDriver.java @@ -0,0 +1,432 @@ +/* Copyright 2011-2013 Google Inc. + * Copyright 2013 mike wakerly + * Copyright 2020 kai morich + * + * Project home page: https://github.com/mik3y/usb-serial-for-android + */ + +package com.bg7yoz.ft8cn.serialport; + +import android.hardware.usb.UsbConstants; +import android.hardware.usb.UsbDevice; +import android.hardware.usb.UsbDeviceConnection; +import android.util.Log; + +import com.bg7yoz.ft8cn.serialport.util.MonotonicClock; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.EnumSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/* + * driver is implemented from various information scattered over FTDI documentation + * + * baud rate calculation https://www.ftdichip.com/Support/Documents/AppNotes/AN232B-05_BaudRates.pdf + * control bits https://www.ftdichip.com/Firmware/Precompiled/UM_VinculumFirmware_V205.pdf + * device type https://www.ftdichip.com/Support/Documents/AppNotes/AN_233_Java_D2XX_for_Android_API_User_Manual.pdf -> bvdDevice + * + */ + +public class FtdiSerialDriver implements UsbSerialDriver { + + private static final String TAG = FtdiSerialPort.class.getSimpleName(); + + private final UsbDevice mDevice; + private final List mPorts; + + public FtdiSerialDriver(UsbDevice device) { + mDevice = device; + mPorts = new ArrayList<>(); + for( int port = 0; port < device.getInterfaceCount(); port++) { + mPorts.add(new FtdiSerialPort(mDevice, port)); + } + } + + @Override + public UsbDevice getDevice() { + return mDevice; + } + + @Override + public List getPorts() { + return mPorts; + } + + public class FtdiSerialPort extends CommonUsbSerialPort { + + private static final int USB_WRITE_TIMEOUT_MILLIS = 5000; + private static final int READ_HEADER_LENGTH = 2; // contains MODEM_STATUS + + private static final int REQTYPE_HOST_TO_DEVICE = UsbConstants.USB_TYPE_VENDOR | UsbConstants.USB_DIR_OUT; + private static final int REQTYPE_DEVICE_TO_HOST = UsbConstants.USB_TYPE_VENDOR | UsbConstants.USB_DIR_IN; + + private static final int RESET_REQUEST = 0; + private static final int MODEM_CONTROL_REQUEST = 1; + private static final int SET_BAUD_RATE_REQUEST = 3; + private static final int SET_DATA_REQUEST = 4; + private static final int GET_MODEM_STATUS_REQUEST = 5; + private static final int SET_LATENCY_TIMER_REQUEST = 9; + private static final int GET_LATENCY_TIMER_REQUEST = 10; + + private static final int MODEM_CONTROL_DTR_ENABLE = 0x0101; + private static final int MODEM_CONTROL_DTR_DISABLE = 0x0100; + private static final int MODEM_CONTROL_RTS_ENABLE = 0x0202; + private static final int MODEM_CONTROL_RTS_DISABLE = 0x0200; + private static final int MODEM_STATUS_CTS = 0x10; + private static final int MODEM_STATUS_DSR = 0x20; + private static final int MODEM_STATUS_RI = 0x40; + private static final int MODEM_STATUS_CD = 0x80; + private static final int RESET_ALL = 0; + private static final int RESET_PURGE_RX = 1; + private static final int RESET_PURGE_TX = 2; + + private boolean baudRateWithPort = false; + private boolean dtr = false; + private boolean rts = false; + private int breakConfig = 0; + + public FtdiSerialPort(UsbDevice device, int portNumber) { + super(device, portNumber); + } + + @Override + public UsbSerialDriver getDriver() { + return FtdiSerialDriver.this; + } + + + @Override + protected void openInt(UsbDeviceConnection connection) throws IOException { + if (!connection.claimInterface(mDevice.getInterface(mPortNumber), true)) { + throw new IOException("Could not claim interface " + mPortNumber); + } + if (mDevice.getInterface(mPortNumber).getEndpointCount() < 2) { + throw new IOException("Not enough endpoints"); + } + mReadEndpoint = mDevice.getInterface(mPortNumber).getEndpoint(0); + mWriteEndpoint = mDevice.getInterface(mPortNumber).getEndpoint(1); + + int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, RESET_REQUEST, + RESET_ALL, mPortNumber+1, null, 0, USB_WRITE_TIMEOUT_MILLIS); + if (result != 0) { + throw new IOException("Reset failed: result=" + result); + } + result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, MODEM_CONTROL_REQUEST, + (dtr ? MODEM_CONTROL_DTR_ENABLE : MODEM_CONTROL_DTR_DISABLE) | + (rts ? MODEM_CONTROL_RTS_ENABLE : MODEM_CONTROL_RTS_DISABLE), + mPortNumber+1, null, 0, USB_WRITE_TIMEOUT_MILLIS); + if (result != 0) { + throw new IOException("Init RTS,DTR failed: result=" + result); + } + + // mDevice.getVersion() would require API 23 + byte[] rawDescriptors = connection.getRawDescriptors(); + if(rawDescriptors == null || rawDescriptors.length < 14) { + throw new IOException("Could not get device descriptors"); + } + int deviceType = rawDescriptors[13]; + baudRateWithPort = deviceType == 7 || deviceType == 8 || deviceType == 9 // ...H devices + || mDevice.getInterfaceCount() > 1; // FT2232C + } + + @Override + protected void closeInt() { + try { + mConnection.releaseInterface(mDevice.getInterface(mPortNumber)); + } catch(Exception ignored) {} + } + + @Override + public int read(final byte[] dest, final int timeout) throws IOException { + if(dest.length <= READ_HEADER_LENGTH) { + throw new IllegalArgumentException("Read buffer to small"); + // could allocate larger buffer, including space for 2 header bytes, but this would + // result in buffers not being 64 byte aligned any more, causing data loss at continuous + // data transfer at high baud rates when buffers are fully filled. + } + int nread; + if (timeout != 0) { + long endTime = MonotonicClock.millis() + timeout; + do { + nread = super.read(dest, Math.max(1, (int)(endTime - MonotonicClock.millis())), false); + } while (nread == READ_HEADER_LENGTH && MonotonicClock.millis() < endTime); + if(nread <= 0 && MonotonicClock.millis() < endTime) + testConnection(); + } else { + do { + nread = super.read(dest, timeout, false); + } while (nread == READ_HEADER_LENGTH); + } + return readFilter(dest, nread); + } + + protected int readFilter(byte[] buffer, int totalBytesRead) throws IOException { + final int maxPacketSize = mReadEndpoint.getMaxPacketSize(); + int destPos = 0; + for(int srcPos = 0; srcPos < totalBytesRead; srcPos += maxPacketSize) { + int length = Math.min(srcPos + maxPacketSize, totalBytesRead) - (srcPos + READ_HEADER_LENGTH); + if (length < 0) + throw new IOException("Expected at least " + READ_HEADER_LENGTH + " bytes"); + System.arraycopy(buffer, srcPos + READ_HEADER_LENGTH, buffer, destPos, length); + destPos += length; + } + //Log.d(TAG, "read filter " + totalBytesRead + " -> " + destPos); + return destPos; + } + + private void setBaudrate(int baudRate) throws IOException { + int divisor, subdivisor, effectiveBaudRate; + if (baudRate > 3500000) { + throw new UnsupportedOperationException("Baud rate to high"); + } else if(baudRate >= 2500000) { + divisor = 0; + subdivisor = 0; + effectiveBaudRate = 3000000; + } else if(baudRate >= 1750000) { + divisor = 1; + subdivisor = 0; + effectiveBaudRate = 2000000; + } else { + divisor = (24000000 << 1) / baudRate; + divisor = (divisor + 1) >> 1; // round + subdivisor = divisor & 0x07; + divisor >>= 3; + if (divisor > 0x3fff) // exceeds bit 13 at 183 baud + throw new UnsupportedOperationException("Baud rate to low"); + effectiveBaudRate = (24000000 << 1) / ((divisor << 3) + subdivisor); + effectiveBaudRate = (effectiveBaudRate +1) >> 1; + } + double baudRateError = Math.abs(1.0 - (effectiveBaudRate / (double)baudRate)); + if(baudRateError >= 0.031) // can happen only > 1.5Mbaud + throw new UnsupportedOperationException(String.format("Baud rate deviation %.1f%% is higher than allowed 3%%", baudRateError*100)); + int value = divisor; + int index = 0; + switch(subdivisor) { + case 0: break; // 16,15,14 = 000 - sub-integer divisor = 0 + case 4: value |= 0x4000; break; // 16,15,14 = 001 - sub-integer divisor = 0.5 + case 2: value |= 0x8000; break; // 16,15,14 = 010 - sub-integer divisor = 0.25 + case 1: value |= 0xc000; break; // 16,15,14 = 011 - sub-integer divisor = 0.125 + case 3: value |= 0x0000; index |= 1; break; // 16,15,14 = 100 - sub-integer divisor = 0.375 + case 5: value |= 0x4000; index |= 1; break; // 16,15,14 = 101 - sub-integer divisor = 0.625 + case 6: value |= 0x8000; index |= 1; break; // 16,15,14 = 110 - sub-integer divisor = 0.75 + case 7: value |= 0xc000; index |= 1; break; // 16,15,14 = 111 - sub-integer divisor = 0.875 + } + if(baudRateWithPort) { + index <<= 8; + index |= mPortNumber+1; + } + Log.d(TAG, String.format("baud rate=%d, effective=%d, error=%.1f%%, value=0x%04x, index=0x%04x, divisor=%d, subdivisor=%d", + baudRate, effectiveBaudRate, baudRateError*100, value, index, divisor, subdivisor)); + + int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, SET_BAUD_RATE_REQUEST, + value, index, null, 0, USB_WRITE_TIMEOUT_MILLIS); + if (result != 0) { + throw new IOException("Setting baudrate failed: result=" + result); + } + } + + @Override + public void setParameters(int baudRate, int dataBits, int stopBits, @Parity int parity) throws IOException { + if(baudRate <= 0) { + throw new IllegalArgumentException("Invalid baud rate: " + baudRate); + } + setBaudrate(baudRate); + + int config = 0; + switch (dataBits) { + case DATABITS_5: + case DATABITS_6: + throw new UnsupportedOperationException("Unsupported data bits: " + dataBits); + case DATABITS_7: + case DATABITS_8: + config |= dataBits; + break; + default: + throw new IllegalArgumentException("Invalid data bits: " + dataBits); + } + + switch (parity) { + case PARITY_NONE: + break; + case PARITY_ODD: + config |= 0x100; + break; + case PARITY_EVEN: + config |= 0x200; + break; + case PARITY_MARK: + config |= 0x300; + break; + case PARITY_SPACE: + config |= 0x400; + break; + default: + throw new IllegalArgumentException("Invalid parity: " + parity); + } + + switch (stopBits) { + case STOPBITS_1: + break; + case STOPBITS_1_5: + throw new UnsupportedOperationException("Unsupported stop bits: 1.5"); + case STOPBITS_2: + config |= 0x1000; + break; + default: + throw new IllegalArgumentException("Invalid stop bits: " + stopBits); + } + + int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, SET_DATA_REQUEST, + config, mPortNumber+1,null, 0, USB_WRITE_TIMEOUT_MILLIS); + if (result != 0) { + throw new IOException("Setting parameters failed: result=" + result); + } + breakConfig = config; + } + + private int getStatus() throws IOException { + byte[] data = new byte[2]; + int result = mConnection.controlTransfer(REQTYPE_DEVICE_TO_HOST, GET_MODEM_STATUS_REQUEST, + 0, mPortNumber+1, data, data.length, USB_WRITE_TIMEOUT_MILLIS); + if (result != 2) { + throw new IOException("Get modem status failed: result=" + result); + } + return data[0]; + } + + @Override + public boolean getCD() throws IOException { + return (getStatus() & MODEM_STATUS_CD) != 0; + } + + @Override + public boolean getCTS() throws IOException { + return (getStatus() & MODEM_STATUS_CTS) != 0; + } + + @Override + public boolean getDSR() throws IOException { + return (getStatus() & MODEM_STATUS_DSR) != 0; + } + + @Override + public boolean getDTR() throws IOException { + return dtr; + } + + @Override + public void setDTR(boolean value) throws IOException { + int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, MODEM_CONTROL_REQUEST, + value ? MODEM_CONTROL_DTR_ENABLE : MODEM_CONTROL_DTR_DISABLE, mPortNumber+1, null, 0, USB_WRITE_TIMEOUT_MILLIS); + if (result != 0) { + throw new IOException("Set DTR failed: result=" + result); + } + dtr = value; + } + + @Override + public boolean getRI() throws IOException { + return (getStatus() & MODEM_STATUS_RI) != 0; + } + + @Override + public boolean getRTS() throws IOException { + return rts; + } + + @Override + public void setRTS(boolean value) throws IOException { + int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, MODEM_CONTROL_REQUEST, + value ? MODEM_CONTROL_RTS_ENABLE : MODEM_CONTROL_RTS_DISABLE, mPortNumber+1, null, 0, USB_WRITE_TIMEOUT_MILLIS); + if (result != 0) { + throw new IOException("Set DTR failed: result=" + result); + } + rts = value; + } + + @Override + public EnumSet getControlLines() throws IOException { + int status = getStatus(); + EnumSet set = EnumSet.noneOf(ControlLine.class); + if(rts) set.add(ControlLine.RTS); + if((status & MODEM_STATUS_CTS) != 0) set.add(ControlLine.CTS); + if(dtr) set.add(ControlLine.DTR); + if((status & MODEM_STATUS_DSR) != 0) set.add(ControlLine.DSR); + if((status & MODEM_STATUS_CD) != 0) set.add(ControlLine.CD); + if((status & MODEM_STATUS_RI) != 0) set.add(ControlLine.RI); + return set; + } + + @Override + public EnumSet getSupportedControlLines() throws IOException { + return EnumSet.allOf(ControlLine.class); + } + + @Override + public void purgeHwBuffers(boolean purgeWriteBuffers, boolean purgeReadBuffers) throws IOException { + if (purgeWriteBuffers) { + int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, RESET_REQUEST, + RESET_PURGE_RX, mPortNumber+1, null, 0, USB_WRITE_TIMEOUT_MILLIS); + if (result != 0) { + throw new IOException("Purge write buffer failed: result=" + result); + } + } + + if (purgeReadBuffers) { + int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, RESET_REQUEST, + RESET_PURGE_TX, mPortNumber+1, null, 0, USB_WRITE_TIMEOUT_MILLIS); + if (result != 0) { + throw new IOException("Purge read buffer failed: result=" + result); + } + } + } + + @Override + public void setBreak(boolean value) throws IOException { + int config = breakConfig; + if(value) config |= 0x4000; + int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, SET_DATA_REQUEST, + config, mPortNumber+1,null, 0, USB_WRITE_TIMEOUT_MILLIS); + if (result != 0) { + throw new IOException("Setting BREAK failed: result=" + result); + } + } + + public void setLatencyTimer(int latencyTime) throws IOException { + int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, SET_LATENCY_TIMER_REQUEST, + latencyTime, mPortNumber+1, null, 0, USB_WRITE_TIMEOUT_MILLIS); + if (result != 0) { + throw new IOException("Set latency timer failed: result=" + result); + } + } + + public int getLatencyTimer() throws IOException { + byte[] data = new byte[1]; + int result = mConnection.controlTransfer(REQTYPE_DEVICE_TO_HOST, GET_LATENCY_TIMER_REQUEST, + 0, mPortNumber+1, data, data.length, USB_WRITE_TIMEOUT_MILLIS); + if (result != 1) { + throw new IOException("Get latency timer failed: result=" + result); + } + return data[0]; + } + + } + + public static Map getSupportedDevices() { + final Map supportedDevices = new LinkedHashMap<>(); + supportedDevices.put(UsbId.VENDOR_FTDI, + new int[] { + UsbId.FTDI_FT232R, + UsbId.FTDI_ZERO, + UsbId.FTDI_FT232H, + UsbId.FTDI_FT2232H, + UsbId.FTDI_FT4232H, + UsbId.FTDI_FT231X, // same ID for FT230X, FT231X, FT234XD + }); + return supportedDevices; + } + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/serialport/ProbeTable.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/serialport/ProbeTable.java new file mode 100644 index 00000000..4174729d --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/serialport/ProbeTable.java @@ -0,0 +1,87 @@ +/* Copyright 2011-2013 Google Inc. + * Copyright 2013 mike wakerly + * + * Project home page: https://github.com/mik3y/usb-serial-for-android + */ + +package com.bg7yoz.ft8cn.serialport; + +import android.util.Pair; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * Maps (vendor id, product id) pairs to the corresponding serial driver. + * + * @author mike wakerly (opensource@hoho.com) + */ +public class ProbeTable { + + private final Map, Class> mProbeTable = + new LinkedHashMap<>(); + + /** + * Adds or updates a (vendor, product) pair in the table. + * + * @param vendorId the USB vendor id + * @param productId the USB product id + * @param driverClass the driver class responsible for this pair + * @return {@code this}, for chaining + */ + public ProbeTable addProduct(int vendorId, int productId, + Class driverClass) { + mProbeTable.put(Pair.create(vendorId, productId), driverClass); + return this; + } + + /** + * Internal method to add all supported products from + * {@code getSupportedProducts} static method. + * + * @param driverClass + * @return + */ + @SuppressWarnings("unchecked") + ProbeTable addDriver(Class driverClass) { + final Method method; + + try { + method = driverClass.getMethod("getSupportedDevices"); + } catch (SecurityException | NoSuchMethodException e) { + throw new RuntimeException(e); + } + + final Map devices; + try { + devices = (Map) method.invoke(null); + } catch (IllegalArgumentException | IllegalAccessException | InvocationTargetException e) { + throw new RuntimeException(e); + } + + for (Map.Entry entry : devices.entrySet()) { + final int vendorId = entry.getKey(); + for (int productId : entry.getValue()) { + addProduct(vendorId, productId, driverClass); + } + } + + return this; + } + + /** + * Returns the driver for the given (vendor, product) pair, or {@code null} + * if no match. + * + * @param vendorId the USB vendor id + * @param productId the USB product id + * @return the driver class matching this pair, or {@code null} + */ + public Class findDriver(int vendorId, int productId) { + final Pair pair = Pair.create(vendorId, productId); + return mProbeTable.get(pair); + } + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/serialport/ProlificSerialDriver.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/serialport/ProlificSerialDriver.java new file mode 100644 index 00000000..531fc0ce --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/serialport/ProlificSerialDriver.java @@ -0,0 +1,582 @@ +/* + * Ported to usb-serial-for-android by Felix Hädicke + * + * Based on the pyprolific driver written by Emmanuel Blot + * See https://github.com/eblot/pyftdi + * + * Project home page: https://github.com/mik3y/usb-serial-for-android + */ + +package com.bg7yoz.ft8cn.serialport; + +import android.hardware.usb.UsbConstants; +import android.hardware.usb.UsbDevice; +import android.hardware.usb.UsbDeviceConnection; +import android.hardware.usb.UsbEndpoint; +import android.hardware.usb.UsbInterface; +import android.util.Log; + +import com.bg7yoz.ft8cn.BuildConfig; +import com.bg7yoz.ft8cn.serialport.util.MonotonicClock; + +import java.io.IOException; +import java.util.Collections; +import java.util.EnumSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +public class ProlificSerialDriver implements UsbSerialDriver { + + private final String TAG = ProlificSerialDriver.class.getSimpleName(); + + private final static int[] standardBaudRates = { + 75, 150, 300, 600, 1200, 1800, 2400, 3600, 4800, 7200, 9600, 14400, 19200, + 28800, 38400, 57600, 115200, 128000, 134400, 161280, 201600, 230400, 268800, + 403200, 460800, 614400, 806400, 921600, 1228800, 2457600, 3000000, 6000000 + }; + protected enum DeviceType { DEVICE_TYPE_01, DEVICE_TYPE_T, DEVICE_TYPE_HX, DEVICE_TYPE_HXN } + + private final UsbDevice mDevice; + private final UsbSerialPort mPort; + + public ProlificSerialDriver(UsbDevice device) { + mDevice = device; + mPort = new ProlificSerialPort(mDevice, 0); + } + + @Override + public List getPorts() { + return Collections.singletonList(mPort); + } + + @Override + public UsbDevice getDevice() { + return mDevice; + } + + class ProlificSerialPort extends CommonUsbSerialPort { + + private static final int USB_READ_TIMEOUT_MILLIS = 1000; + private static final int USB_WRITE_TIMEOUT_MILLIS = 5000; + + private static final int USB_RECIP_INTERFACE = 0x01; + + private static final int VENDOR_READ_REQUEST = 0x01; + private static final int VENDOR_WRITE_REQUEST = 0x01; + private static final int VENDOR_READ_HXN_REQUEST = 0x81; + private static final int VENDOR_WRITE_HXN_REQUEST = 0x80; + + private static final int VENDOR_OUT_REQTYPE = UsbConstants.USB_DIR_OUT | UsbConstants.USB_TYPE_VENDOR; + private static final int VENDOR_IN_REQTYPE = UsbConstants.USB_DIR_IN | UsbConstants.USB_TYPE_VENDOR; + private static final int CTRL_OUT_REQTYPE = UsbConstants.USB_DIR_OUT | UsbConstants.USB_TYPE_CLASS | USB_RECIP_INTERFACE; + + private static final int WRITE_ENDPOINT = 0x02; + private static final int READ_ENDPOINT = 0x83; + private static final int INTERRUPT_ENDPOINT = 0x81; + + private static final int RESET_HXN_REQUEST = 0x07; + private static final int FLUSH_RX_REQUEST = 0x08; + private static final int FLUSH_TX_REQUEST = 0x09; + private static final int SET_LINE_REQUEST = 0x20; // same as CDC SET_LINE_CODING + private static final int SET_CONTROL_REQUEST = 0x22; // same as CDC SET_CONTROL_LINE_STATE + private static final int SEND_BREAK_REQUEST = 0x23; // same as CDC SEND_BREAK + private static final int GET_CONTROL_HXN_REQUEST = 0x80; + private static final int GET_CONTROL_REQUEST = 0x87; + private static final int STATUS_NOTIFICATION = 0xa1; // similar to CDC SERIAL_STATE but different length + + /* RESET_HXN_REQUEST */ + private static final int RESET_HXN_RX_PIPE = 1; + private static final int RESET_HXN_TX_PIPE = 2; + + /* SET_CONTROL_REQUEST */ + private static final int CONTROL_DTR = 0x01; + private static final int CONTROL_RTS = 0x02; + + /* GET_CONTROL_REQUEST */ + private static final int GET_CONTROL_FLAG_CD = 0x02; + private static final int GET_CONTROL_FLAG_DSR = 0x04; + private static final int GET_CONTROL_FLAG_RI = 0x01; + private static final int GET_CONTROL_FLAG_CTS = 0x08; + + /* GET_CONTROL_HXN_REQUEST */ + private static final int GET_CONTROL_HXN_FLAG_CD = 0x40; + private static final int GET_CONTROL_HXN_FLAG_DSR = 0x20; + private static final int GET_CONTROL_HXN_FLAG_RI = 0x80; + private static final int GET_CONTROL_HXN_FLAG_CTS = 0x08; + + /* interrupt endpoint read */ + private static final int STATUS_FLAG_CD = 0x01; + private static final int STATUS_FLAG_DSR = 0x02; + private static final int STATUS_FLAG_RI = 0x08; + private static final int STATUS_FLAG_CTS = 0x80; + + private static final int STATUS_BUFFER_SIZE = 10; + private static final int STATUS_BYTE_IDX = 8; + + protected DeviceType mDeviceType = DeviceType.DEVICE_TYPE_HX; + private UsbEndpoint mInterruptEndpoint; + private int mControlLinesValue = 0; + private int mBaudRate = -1, mDataBits = -1, mStopBits = -1, mParity = -1; + + private int mStatus = 0; + private volatile Thread mReadStatusThread = null; + private final Object mReadStatusThreadLock = new Object(); + private boolean mStopReadStatusThread = false; + private IOException mReadStatusException = null; + + + public ProlificSerialPort(UsbDevice device, int portNumber) { + super(device, portNumber); + } + + @Override + public UsbSerialDriver getDriver() { + return ProlificSerialDriver.this; + } + + private byte[] inControlTransfer(int requestType, int request, int value, int index, int length) throws IOException { + byte[] buffer = new byte[length]; + int result = mConnection.controlTransfer(requestType, request, value, index, buffer, length, USB_READ_TIMEOUT_MILLIS); + if (result != length) { + throw new IOException(String.format("ControlTransfer %s 0x%x failed: %d",mDeviceType.name(), value, result)); + } + return buffer; + } + + private void outControlTransfer(int requestType, int request, int value, int index, byte[] data) throws IOException { + int length = (data == null) ? 0 : data.length; + int result = mConnection.controlTransfer(requestType, request, value, index, data, length, USB_WRITE_TIMEOUT_MILLIS); + if (result != length) { + throw new IOException( String.format("ControlTransfer %s 0x%x failed: %d", mDeviceType.name(), value, result)); + } + } + + private byte[] vendorIn(int value, int index, int length) throws IOException { + int request = (mDeviceType == DeviceType.DEVICE_TYPE_HXN) ? VENDOR_READ_HXN_REQUEST : VENDOR_READ_REQUEST; + return inControlTransfer(VENDOR_IN_REQTYPE, request, value, index, length); + } + + private void vendorOut(int value, int index, byte[] data) throws IOException { + int request = (mDeviceType == DeviceType.DEVICE_TYPE_HXN) ? VENDOR_WRITE_HXN_REQUEST : VENDOR_WRITE_REQUEST; + outControlTransfer(VENDOR_OUT_REQTYPE, request, value, index, data); + } + + private void resetDevice() throws IOException { + purgeHwBuffers(true, true); + } + + private void ctrlOut(int request, int value, int index, byte[] data) throws IOException { + outControlTransfer(CTRL_OUT_REQTYPE, request, value, index, data); + } + + private boolean testHxStatus() { + try { + inControlTransfer(VENDOR_IN_REQTYPE, VENDOR_READ_REQUEST, 0x8080, 0, 1); + return true; + } catch(IOException ignored) { + return false; + } + } + + private void doBlackMagic() throws IOException { + if (mDeviceType == DeviceType.DEVICE_TYPE_HXN) + return; + vendorIn(0x8484, 0, 1); + vendorOut(0x0404, 0, null); + vendorIn(0x8484, 0, 1); + vendorIn(0x8383, 0, 1); + vendorIn(0x8484, 0, 1); + vendorOut(0x0404, 1, null); + vendorIn(0x8484, 0, 1); + vendorIn(0x8383, 0, 1); + vendorOut(0, 1, null); + vendorOut(1, 0, null); + vendorOut(2, (mDeviceType == DeviceType.DEVICE_TYPE_01) ? 0x24 : 0x44, null); + } + + private void setControlLines(int newControlLinesValue) throws IOException { + ctrlOut(SET_CONTROL_REQUEST, newControlLinesValue, 0, null); + mControlLinesValue = newControlLinesValue; + } + + private void readStatusThreadFunction() { + try { + while (!mStopReadStatusThread) { + byte[] buffer = new byte[STATUS_BUFFER_SIZE]; + long endTime = MonotonicClock.millis() + 500; + int readBytesCount = mConnection.bulkTransfer(mInterruptEndpoint, buffer, STATUS_BUFFER_SIZE, 500); + if(readBytesCount == -1 && MonotonicClock.millis() < endTime) + testConnection(); + if (readBytesCount > 0) { + if (readBytesCount != STATUS_BUFFER_SIZE) { + throw new IOException("Invalid status notification, expected " + STATUS_BUFFER_SIZE + " bytes, got " + readBytesCount); + } else if(buffer[0] != (byte)STATUS_NOTIFICATION ) { + throw new IOException("Invalid status notification, expected " + STATUS_NOTIFICATION + " request, got " + buffer[0]); + } else { + mStatus = buffer[STATUS_BYTE_IDX] & 0xff; + } + } + } + } catch (IOException e) { + mReadStatusException = e; + } + //Log.d(TAG, "end control line status thread " + mStopReadStatusThread + " " + (mReadStatusException == null ? "-" : mReadStatusException.getMessage())); + } + + private int getStatus() throws IOException { + if ((mReadStatusThread == null) && (mReadStatusException == null)) { + synchronized (mReadStatusThreadLock) { + if (mReadStatusThread == null) { + mStatus = 0; + if(mDeviceType == DeviceType.DEVICE_TYPE_HXN) { + byte[] data = vendorIn(GET_CONTROL_HXN_REQUEST, 0, 1); + if ((data[0] & GET_CONTROL_HXN_FLAG_CTS) == 0) mStatus |= STATUS_FLAG_CTS; + if ((data[0] & GET_CONTROL_HXN_FLAG_DSR) == 0) mStatus |= STATUS_FLAG_DSR; + if ((data[0] & GET_CONTROL_HXN_FLAG_CD) == 0) mStatus |= STATUS_FLAG_CD; + if ((data[0] & GET_CONTROL_HXN_FLAG_RI) == 0) mStatus |= STATUS_FLAG_RI; + } else { + byte[] data = vendorIn(GET_CONTROL_REQUEST, 0, 1); + if ((data[0] & GET_CONTROL_FLAG_CTS) == 0) mStatus |= STATUS_FLAG_CTS; + if ((data[0] & GET_CONTROL_FLAG_DSR) == 0) mStatus |= STATUS_FLAG_DSR; + if ((data[0] & GET_CONTROL_FLAG_CD) == 0) mStatus |= STATUS_FLAG_CD; + if ((data[0] & GET_CONTROL_FLAG_RI) == 0) mStatus |= STATUS_FLAG_RI; + } + //Log.d(TAG, "start control line status thread " + mStatus); + mReadStatusThread = new Thread(this::readStatusThreadFunction); + mReadStatusThread.setDaemon(true); + mReadStatusThread.start(); + } + } + } + + /* throw and clear an exception which occured in the status read thread */ + IOException readStatusException = mReadStatusException; + if (mReadStatusException != null) { + mReadStatusException = null; + throw new IOException(readStatusException); + } + + return mStatus; + } + + private boolean testStatusFlag(int flag) throws IOException { + return ((getStatus() & flag) == flag); + } + + @Override + public void openInt(UsbDeviceConnection connection) throws IOException { + UsbInterface usbInterface = mDevice.getInterface(0); + + if (!connection.claimInterface(usbInterface, true)) { + throw new IOException("Error claiming Prolific interface 0"); + } + + for (int i = 0; i < usbInterface.getEndpointCount(); ++i) { + UsbEndpoint currentEndpoint = usbInterface.getEndpoint(i); + + switch (currentEndpoint.getAddress()) { + case READ_ENDPOINT: + mReadEndpoint = currentEndpoint; + break; + + case WRITE_ENDPOINT: + mWriteEndpoint = currentEndpoint; + break; + + case INTERRUPT_ENDPOINT: + mInterruptEndpoint = currentEndpoint; + break; + } + } + + byte[] rawDescriptors = connection.getRawDescriptors(); + if(rawDescriptors == null || rawDescriptors.length < 14) { + throw new IOException("Could not get device descriptors"); + } + int usbVersion = (rawDescriptors[3] << 8) + rawDescriptors[2]; + int deviceVersion = (rawDescriptors[13] << 8) + rawDescriptors[12]; + byte maxPacketSize0 = rawDescriptors[7]; + if (mDevice.getDeviceClass() == 0x02 || maxPacketSize0 != 64) { + mDeviceType = DeviceType.DEVICE_TYPE_01; + } else if(deviceVersion == 0x300 && usbVersion == 0x200) { + mDeviceType = DeviceType.DEVICE_TYPE_T; // TA + } else if(deviceVersion == 0x500) { + mDeviceType = DeviceType.DEVICE_TYPE_T; // TB + } else if(usbVersion == 0x200 && !testHxStatus()) { + mDeviceType = DeviceType.DEVICE_TYPE_HXN; + } else { + mDeviceType = DeviceType.DEVICE_TYPE_HX; + } + Log.d(TAG, String.format("usbVersion=%x, deviceVersion=%x, deviceClass=%d, packetSize=%d => deviceType=%s", + usbVersion, deviceVersion, mDevice.getDeviceClass(), maxPacketSize0, mDeviceType.name())); + resetDevice(); + doBlackMagic(); + setControlLines(mControlLinesValue); + } + + @Override + public void closeInt() { + try { + synchronized (mReadStatusThreadLock) { + if (mReadStatusThread != null) { + try { + mStopReadStatusThread = true; + mReadStatusThread.join(); + } catch (Exception e) { + Log.w(TAG, "An error occured while waiting for status read thread", e); + } + mStopReadStatusThread = false; + mReadStatusThread = null; + mReadStatusException = null; + } + } + resetDevice(); + } catch(Exception ignored) {} + try { + mConnection.releaseInterface(mDevice.getInterface(0)); + } catch(Exception ignored) {} + } + + private int filterBaudRate(int baudRate) { + if(BuildConfig.DEBUG && (baudRate & (3<<29)) == (1<<29)) { + return baudRate & ~(1<<29); // for testing purposes accept without further checks + } + if (baudRate <= 0) { + throw new IllegalArgumentException("Invalid baud rate: " + baudRate); + } + if (mDeviceType == DeviceType.DEVICE_TYPE_HXN) { + return baudRate; + } + for(int br : standardBaudRates) { + if (br == baudRate) { + return baudRate; + } + } + /* + * Formula taken from Linux + FreeBSD. + * + * For TA+TB devices + * baudrate = baseline / (mantissa * 2^exponent) + * where + * mantissa = buf[10:0] + * exponent = buf[15:13 16] + * + * For other devices + * baudrate = baseline / (mantissa * 4^exponent) + * where + * mantissa = buf[8:0] + * exponent = buf[11:9] + * + */ + int baseline, mantissa, exponent, buf, effectiveBaudRate; + baseline = 12000000 * 32; + mantissa = baseline / baudRate; + if (mantissa == 0) { // > unrealistic 384 MBaud + throw new UnsupportedOperationException("Baud rate to high"); + } + exponent = 0; + if (mDeviceType == DeviceType.DEVICE_TYPE_T) { + while (mantissa >= 2048) { + if (exponent < 15) { + mantissa >>= 1; /* divide by 2 */ + exponent++; + } else { // < 7 baud + throw new UnsupportedOperationException("Baud rate to low"); + } + } + buf = mantissa + ((exponent & ~1) << 12) + ((exponent & 1) << 16) + (1 << 31); + effectiveBaudRate = (baseline / mantissa) >> exponent; + } else { + while (mantissa >= 512) { + if (exponent < 7) { + mantissa >>= 2; /* divide by 4 */ + exponent++; + } else { // < 45.8 baud + throw new UnsupportedOperationException("Baud rate to low"); + } + } + buf = mantissa + (exponent << 9) + (1 << 31); + effectiveBaudRate = (baseline / mantissa) >> (exponent << 1); + } + double baudRateError = Math.abs(1.0 - (effectiveBaudRate / (double)baudRate)); + if(baudRateError >= 0.031) // > unrealistic 11.6 Mbaud + throw new UnsupportedOperationException(String.format("Baud rate deviation %.1f%% is higher than allowed 3%%", baudRateError*100)); + + Log.d(TAG, String.format("baud rate=%d, effective=%d, error=%.1f%%, value=0x%08x, mantissa=%d, exponent=%d", + baudRate, effectiveBaudRate, baudRateError*100, buf, mantissa, exponent)); + return buf; + } + + @Override + public void setParameters(int baudRate, int dataBits, int stopBits, @Parity int parity) throws IOException { + baudRate = filterBaudRate(baudRate); + if ((mBaudRate == baudRate) && (mDataBits == dataBits) + && (mStopBits == stopBits) && (mParity == parity)) { + // Make sure no action is performed if there is nothing to change + return; + } + + byte[] lineRequestData = new byte[7]; + lineRequestData[0] = (byte) (baudRate & 0xff); + lineRequestData[1] = (byte) ((baudRate >> 8) & 0xff); + lineRequestData[2] = (byte) ((baudRate >> 16) & 0xff); + lineRequestData[3] = (byte) ((baudRate >> 24) & 0xff); + + switch (stopBits) { + case STOPBITS_1: + lineRequestData[4] = 0; + break; + case STOPBITS_1_5: + lineRequestData[4] = 1; + break; + case STOPBITS_2: + lineRequestData[4] = 2; + break; + default: + throw new IllegalArgumentException("Invalid stop bits: " + stopBits); + } + + switch (parity) { + case PARITY_NONE: + lineRequestData[5] = 0; + break; + case PARITY_ODD: + lineRequestData[5] = 1; + break; + case PARITY_EVEN: + lineRequestData[5] = 2; + break; + case PARITY_MARK: + lineRequestData[5] = 3; + break; + case PARITY_SPACE: + lineRequestData[5] = 4; + break; + default: + throw new IllegalArgumentException("Invalid parity: " + parity); + } + + if(dataBits < DATABITS_5 || dataBits > DATABITS_8) { + throw new IllegalArgumentException("Invalid data bits: " + dataBits); + } + lineRequestData[6] = (byte) dataBits; + + ctrlOut(SET_LINE_REQUEST, 0, 0, lineRequestData); + + resetDevice(); + + mBaudRate = baudRate; + mDataBits = dataBits; + mStopBits = stopBits; + mParity = parity; + } + + @Override + public boolean getCD() throws IOException { + return testStatusFlag(STATUS_FLAG_CD); + } + + @Override + public boolean getCTS() throws IOException { + return testStatusFlag(STATUS_FLAG_CTS); + } + + @Override + public boolean getDSR() throws IOException { + return testStatusFlag(STATUS_FLAG_DSR); + } + + @Override + public boolean getDTR() throws IOException { + return (mControlLinesValue & CONTROL_DTR) != 0; + } + + @Override + public void setDTR(boolean value) throws IOException { + int newControlLinesValue; + if (value) { + newControlLinesValue = mControlLinesValue | CONTROL_DTR; + } else { + newControlLinesValue = mControlLinesValue & ~CONTROL_DTR; + } + setControlLines(newControlLinesValue); + } + + @Override + public boolean getRI() throws IOException { + return testStatusFlag(STATUS_FLAG_RI); + } + + @Override + public boolean getRTS() throws IOException { + return (mControlLinesValue & CONTROL_RTS) != 0; + } + + @Override + public void setRTS(boolean value) throws IOException { + int newControlLinesValue; + if (value) { + newControlLinesValue = mControlLinesValue | CONTROL_RTS; + } else { + newControlLinesValue = mControlLinesValue & ~CONTROL_RTS; + } + setControlLines(newControlLinesValue); + } + + + @Override + public EnumSet getControlLines() throws IOException { + int status = getStatus(); + EnumSet set = EnumSet.noneOf(ControlLine.class); + if((mControlLinesValue & CONTROL_RTS) != 0) set.add(ControlLine.RTS); + if((status & STATUS_FLAG_CTS) != 0) set.add(ControlLine.CTS); + if((mControlLinesValue & CONTROL_DTR) != 0) set.add(ControlLine.DTR); + if((status & STATUS_FLAG_DSR) != 0) set.add(ControlLine.DSR); + if((status & STATUS_FLAG_CD) != 0) set.add(ControlLine.CD); + if((status & STATUS_FLAG_RI) != 0) set.add(ControlLine.RI); + return set; + } + + @Override + public EnumSet getSupportedControlLines() throws IOException { + return EnumSet.allOf(ControlLine.class); + } + + @Override + public void purgeHwBuffers(boolean purgeWriteBuffers, boolean purgeReadBuffers) throws IOException { + if (mDeviceType == DeviceType.DEVICE_TYPE_HXN) { + int index = 0; + if(purgeWriteBuffers) index |= RESET_HXN_RX_PIPE; + if(purgeReadBuffers) index |= RESET_HXN_TX_PIPE; + if(index != 0) + vendorOut(RESET_HXN_REQUEST, index, null); + } else { + if (purgeWriteBuffers) + vendorOut(FLUSH_RX_REQUEST, 0, null); + if (purgeReadBuffers) + vendorOut(FLUSH_TX_REQUEST, 0, null); + } + } + + @Override + public void setBreak(boolean value) throws IOException { + ctrlOut(SEND_BREAK_REQUEST, value ? 0xffff : 0, 0, null); + } + } + + public static Map getSupportedDevices() { + final Map supportedDevices = new LinkedHashMap<>(); + supportedDevices.put(UsbId.VENDOR_PROLIFIC, + new int[] { + UsbId.PROLIFIC_PL2303, + UsbId.PROLIFIC_PL2303GC, + UsbId.PROLIFIC_PL2303GB, + UsbId.PROLIFIC_PL2303GT, + UsbId.PROLIFIC_PL2303GL, + UsbId.PROLIFIC_PL2303GE, + UsbId.PROLIFIC_PL2303GS, + }); + return supportedDevices; + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/serialport/SerialTimeoutException.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/serialport/SerialTimeoutException.java new file mode 100644 index 00000000..271ea511 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/serialport/SerialTimeoutException.java @@ -0,0 +1,15 @@ +package com.bg7yoz.ft8cn.serialport; + +import java.io.InterruptedIOException; + +/** + * Signals that a timeout has occurred on serial write. + * Similar to SocketTimeoutException. + * + * {@see InterruptedIOException#bytesTransferred} may contain bytes transferred + */ +public class SerialTimeoutException extends InterruptedIOException { + public SerialTimeoutException(String s) { + super(s); + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/serialport/UsbId.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/serialport/UsbId.java new file mode 100644 index 00000000..73ab2a22 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/serialport/UsbId.java @@ -0,0 +1,95 @@ +/* Copyright 2011-2013 Google Inc. + * Copyright 2013 mike wakerly + * + * Project home page: https://github.com/mik3y/usb-serial-for-android + */ + +package com.bg7yoz.ft8cn.serialport; + +/** + * Registry of USB vendor/product ID constants. + * + * Culled from various sources; see + * usb.ids for one listing. + * + * @author mike wakerly (opensource@hoho.com) + */ +public final class UsbId { + + public static final int VENDOR_FTDI = 0x0403; + public static final int FTDI_FT232R = 0x6001; + public static final int FTDI_ZERO = 0x0; + public static final int FTDI_FT2232H = 0x6010; + public static final int FTDI_FT4232H = 0x6011; + public static final int FTDI_FT232H = 0x6014; + public static final int FTDI_FT231X = 0x6015; // same ID for FT230X, FT231X, FT234XD + + public static final int VENDOR_ATMEL = 0x03EB; + public static final int ATMEL_LUFA_CDC_DEMO_APP = 0x2044; + + public static final int VENDOR_ARDUINO = 0x2341; + public static final int ARDUINO_UNO = 0x0001; + public static final int ARDUINO_MEGA_2560 = 0x0010; + public static final int ARDUINO_SERIAL_ADAPTER = 0x003b; + public static final int ARDUINO_MEGA_ADK = 0x003f; + public static final int ARDUINO_MEGA_2560_R3 = 0x0042; + public static final int ARDUINO_UNO_R3 = 0x0043; + public static final int ARDUINO_MEGA_ADK_R3 = 0x0044; + public static final int ARDUINO_SERIAL_ADAPTER_R3 = 0x0044; + public static final int ARDUINO_LEONARDO = 0x8036; + public static final int ARDUINO_MICRO = 0x8037; + + public static final int VENDOR_VAN_OOIJEN_TECH = 0x16c0; + public static final int VAN_OOIJEN_TECH_TEENSYDUINO_SERIAL = 0x0483; + + public static final int CDC_WOLF_PID= 0xF001;// ST CDC WOLF RIG + + public static final int VENDOR_LEAFLABS = 0x1eaf; + public static final int LEAFLABS_MAPLE = 0x0004; + + public static final int VENDOR_SILABS = 0x10c4; + public static final int SILABS_CP2102 = 0xea60; // same ID for CP2101, CP2103, CP2104, CP2109 + public static final int SILABS_CP2105 = 0xea70; + public static final int SILABS_CP2108 = 0xea71; + + public static final int VENDOR_PROLIFIC = 0x067b; + public static final int PROLIFIC_PL2303 = 0x2303; // device type 01, T, HX + public static final int PROLIFIC_PL2303GC = 0x23a3; // device type HXN + public static final int PROLIFIC_PL2303GB = 0x23b3; // " + public static final int PROLIFIC_PL2303GT = 0x23c3; // " + public static final int PROLIFIC_PL2303GL = 0x23d3; // " + public static final int PROLIFIC_PL2303GE = 0x23e3; // " + public static final int PROLIFIC_PL2303GS = 0x23f3; // " + + public static final int VENDOR_QINHENG = 0x1a86; + public static final int QINHENG_CH340 = 0x7523; + public static final int QINHENG_CH341A = 0x5523; + public static final int QINHENG_CH341K = 29986; + + + // at www.linux-usb.org/usb.ids listed for NXP/LPC1768, but all processors supported by ARM mbed DAPLink firmware report these ids + public static final int VENDOR_ARM = 0x0d28; + public static final int ARM_MBED = 0x0204; + + public static final int VENDOR_ST = 0x0483; + public static final int ST_CDC = 0x5740; + public static final int ST_CDC2 = 0xA34C; + public static final int ST_CDC3 = 0x5732; + + public static final int VENDOR_RASPBERRY_PI = 0x2e8a; + public static final int RASPBERRY_PI_PICO_MICROPYTHON = 0x0005; + + public static final int VENDOR_GUOHE1 = 0x5678; + public static final int PID_GUOHE1 = 0x6789; + + public static final int VENDOR_ICOM = 0x0c26; + public static final int IC_R30 = 0x002b; + public static final int IC_705 = 0x0036; + public static final int ICOM_USB_SERIAL_CONTROL = 0x0018; + public static final int XIEGU_X6100 = 0x55D2;//xiegu + + private UsbId() { + throw new IllegalAccessError("Non-instantiable class"); + } + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/serialport/UsbSerialDriver.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/serialport/UsbSerialDriver.java new file mode 100644 index 00000000..49b1690a --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/serialport/UsbSerialDriver.java @@ -0,0 +1,33 @@ +/* Copyright 2011-2013 Google Inc. + * Copyright 2013 mike wakerly + * + * Project home page: https://github.com/mik3y/usb-serial-for-android + */ + +package com.bg7yoz.ft8cn.serialport; + +import android.hardware.usb.UsbDevice; + +import java.util.List; + +/** + * + * @author mike wakerly (opensource@hoho.com) + */ +public interface UsbSerialDriver { + + /** + * Returns the raw {@link UsbDevice} backing this port. + * + * @return the device + */ + UsbDevice getDevice(); + + /** + * Returns all available ports for this device. This list must have at least + * one entry. + * + * @return the ports + */ + List getPorts(); +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/serialport/UsbSerialPort.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/serialport/UsbSerialPort.java new file mode 100644 index 00000000..e83fd2fd --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/serialport/UsbSerialPort.java @@ -0,0 +1,263 @@ +/* Copyright 2011-2013 Google Inc. + * Copyright 2013 mike wakerly + * + * Project home page: https://github.com/mik3y/usb-serial-for-android + */ + +package com.bg7yoz.ft8cn.serialport; + +import android.hardware.usb.UsbDevice; +import android.hardware.usb.UsbDeviceConnection; +import android.hardware.usb.UsbEndpoint; +import android.hardware.usb.UsbManager; + +import androidx.annotation.IntDef; + +import java.io.Closeable; +import java.io.IOException; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.util.EnumSet; + +/** + * Interface for a single serial port. + * + * @author mike wakerly (opensource@hoho.com) + */ +public interface UsbSerialPort extends Closeable { + + /** 5 data bits. */ + //数据位 + int DATABITS_5 = 5; + /** 6 data bits. */ + int DATABITS_6 = 6; + /** 7 data bits. */ + int DATABITS_7 = 7; + /** 8 data bits. */ + int DATABITS_8 = 8; + + /** Values for setParameters(..., parity) */ + @Retention(RetentionPolicy.SOURCE) + @IntDef({PARITY_NONE, PARITY_ODD, PARITY_EVEN, PARITY_MARK, PARITY_SPACE}) + @interface Parity {} + //奇偶校验位 + /** No parity. */ + int PARITY_NONE = 0; + /** Odd parity. */ + int PARITY_ODD = 1; + /** Even parity. */ + int PARITY_EVEN = 2; + /** Mark parity. */ + int PARITY_MARK = 3; + /** Space parity. */ + int PARITY_SPACE = 4; + + /** 1 stop bit. */ + int STOPBITS_1 = 1; + /** 1.5 stop bits. */ + int STOPBITS_1_5 = 3; + /** 2 stop bits. */ + int STOPBITS_2 = 2; + + /** Values for get[Supported]ControlLines() */ + enum ControlLine { RTS, CTS, DTR, DSR, CD, RI } + + /** + * Returns the driver used by this port. + */ + UsbSerialDriver getDriver(); + + /** + * Returns the currently-bound USB device. + */ + UsbDevice getDevice(); + + /** + * Port number within driver. + */ + int getPortNumber(); + + /** + * Returns the write endpoint. + * @return write endpoint + */ + UsbEndpoint getWriteEndpoint(); + + /** + * Returns the read endpoint. + * @return read endpoint + */ + UsbEndpoint getReadEndpoint(); + + /** + * The serial number of the underlying UsbDeviceConnection, or {@code null}. + * + * @return value from {@link UsbDeviceConnection#getSerial()} + * @throws SecurityException starting with target SDK 29 (Android 10) if permission for USB device is not granted + */ + String getSerial(); + + /** + * Opens and initializes the port. Upon success, caller must ensure that + * {@link #close()} is eventually called. + * + * @param connection an open device connection, acquired with + * {@link UsbManager#openDevice(UsbDevice)} + * @throws IOException on error opening or initializing the port. + */ + void open(UsbDeviceConnection connection) throws IOException; + + /** + * Closes the port and {@link UsbDeviceConnection} + * + * @throws IOException on error closing the port. + */ + void close() throws IOException; + + /** + * Reads as many bytes as possible into the destination buffer. + * + * @param dest the destination byte buffer + * @param timeout the timeout for reading in milliseconds, 0 is infinite + * @return the actual number of bytes read + * @throws IOException if an error occurred during reading + */ + int read(final byte[] dest, final int timeout) throws IOException; + + /** + * Writes as many bytes as possible from the source buffer. + * + * @param src the source byte buffer + * @param timeout the timeout for writing in milliseconds, 0 is infinite + * @throws SerialTimeoutException if timeout reached before sending all data. + * ex.bytesTransferred may contain bytes transferred + * @throws IOException if an error occurred during writing + */ + void write(final byte[] src, final int timeout) throws IOException; + + /** + * Sets various serial port parameters. + * + * @param baudRate baud rate as an integer, for example {@code 115200}. + * @param dataBits one of {@link #DATABITS_5}, {@link #DATABITS_6}, + * {@link #DATABITS_7}, or {@link #DATABITS_8}. + * @param stopBits one of {@link #STOPBITS_1}, {@link #STOPBITS_1_5}, or {@link #STOPBITS_2}. + * @param parity one of {@link #PARITY_NONE}, {@link #PARITY_ODD}, + * {@link #PARITY_EVEN}, {@link #PARITY_MARK}, or {@link #PARITY_SPACE}. + * @throws IOException on error setting the port parameters + * @throws UnsupportedOperationException if values are not supported by a specific device + */ + void setParameters(int baudRate, int dataBits, int stopBits, @Parity int parity) throws IOException; + + /** + * Gets the CD (Carrier Detect) bit from the underlying UART. + * + * @return the current state + * @throws IOException if an error occurred during reading + * @throws UnsupportedOperationException if not supported + */ + boolean getCD() throws IOException; + + /** + * Gets the CTS (Clear To Send) bit from the underlying UART. + * + * @return the current state + * @throws IOException if an error occurred during reading + * @throws UnsupportedOperationException if not supported + */ + boolean getCTS() throws IOException; + + /** + * Gets the DSR (Data Set Ready) bit from the underlying UART. + * + * @return the current state + * @throws IOException if an error occurred during reading + * @throws UnsupportedOperationException if not supported + */ + boolean getDSR() throws IOException; + + /** + * Gets the DTR (Data Terminal Ready) bit from the underlying UART. + * + * @return the current state + * @throws IOException if an error occurred during reading + * @throws UnsupportedOperationException if not supported + */ + boolean getDTR() throws IOException; + + /** + * Sets the DTR (Data Terminal Ready) bit on the underlying UART, if supported. + * + * @param value the value to set + * @throws IOException if an error occurred during writing + * @throws UnsupportedOperationException if not supported + */ + void setDTR(boolean value) throws IOException; + + /** + * Gets the RI (Ring Indicator) bit from the underlying UART. + * + * @return the current state + * @throws IOException if an error occurred during reading + * @throws UnsupportedOperationException if not supported + */ + boolean getRI() throws IOException; + + /** + * Gets the RTS (Request To Send) bit from the underlying UART. + * + * @return the current state + * @throws IOException if an error occurred during reading + * @throws UnsupportedOperationException if not supported + */ + boolean getRTS() throws IOException; + + /** + * Sets the RTS (Request To Send) bit on the underlying UART, if supported. + * + * @param value the value to set + * @throws IOException if an error occurred during writing + * @throws UnsupportedOperationException if not supported + */ + void setRTS(boolean value) throws IOException; + + /** + * Gets all control line values from the underlying UART, if supported. + * Requires less USB calls than calling getRTS() + ... + getRI() individually. + * + * @return EnumSet.contains(...) is {@code true} if set, else {@code false} + * @throws IOException if an error occurred during reading + */ + EnumSet getControlLines() throws IOException; + + /** + * Gets all control line supported flags. + * + * @return EnumSet.contains(...) is {@code true} if supported, else {@code false} + * @throws IOException if an error occurred during reading + */ + EnumSet getSupportedControlLines() throws IOException; + + /** + * Purge non-transmitted output data and / or non-read input data. + * + * @param purgeWriteBuffers {@code true} to discard non-transmitted output data + * @param purgeReadBuffers {@code true} to discard non-read input data + * @throws IOException if an error occurred during flush + * @throws UnsupportedOperationException if not supported + */ + void purgeHwBuffers(boolean purgeWriteBuffers, boolean purgeReadBuffers) throws IOException; + + /** + * send BREAK condition. + * + * @param value set/reset + */ + void setBreak(boolean value) throws IOException; + + /** + * Returns the current state of the connection. + */ + boolean isOpen(); + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/serialport/UsbSerialProber.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/serialport/UsbSerialProber.java new file mode 100644 index 00000000..9189997b --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/serialport/UsbSerialProber.java @@ -0,0 +1,92 @@ +/* Copyright 2011-2013 Google Inc. + * Copyright 2013 mike wakerly + * + * Project home page: https://github.com/mik3y/usb-serial-for-android + */ + +package com.bg7yoz.ft8cn.serialport; + +import android.hardware.usb.UsbDevice; +import android.hardware.usb.UsbManager; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.List; + +/** + * + * @author mike wakerly (opensource@hoho.com) + */ +public class UsbSerialProber { + + private final ProbeTable mProbeTable; + + public UsbSerialProber(ProbeTable probeTable) { + mProbeTable = probeTable; + } + + public static UsbSerialProber getDefaultProber() { + return new UsbSerialProber(getDefaultProbeTable()); + } + + public static ProbeTable getDefaultProbeTable() { + final ProbeTable probeTable = new ProbeTable(); + probeTable.addDriver(CdcAcmSerialDriver.class); + probeTable.addDriver(Cp21xxSerialDriver.class); + probeTable.addDriver(FtdiSerialDriver.class); + probeTable.addDriver(ProlificSerialDriver.class); + probeTable.addDriver(Ch34xSerialDriver.class); + return probeTable; + } + + /** + * Finds and builds all possible {@link UsbSerialDriver UsbSerialDrivers} + * from the currently-attached {@link UsbDevice} hierarchy. This method does + * not require permission from the Android USB system, since it does not + * open any of the devices. + * + * @param usbManager usb manager + * @return a list, possibly empty, of all compatible drivers + */ + public List findAllDrivers(final UsbManager usbManager) { + final List result = new ArrayList<>(); + + for (final UsbDevice usbDevice : usbManager.getDeviceList().values()) { + final UsbSerialDriver driver = probeDevice(usbDevice); + if (driver != null) { + result.add(driver); + } + } + return result; + } + + /** + * Probes a single device for a compatible driver. + * + * @param usbDevice the usb device to probe + * @return a new {@link UsbSerialDriver} compatible with this device, or + * {@code null} if none available. + */ + public UsbSerialDriver probeDevice(final UsbDevice usbDevice) { + final int vendorId = usbDevice.getVendorId(); + final int productId = usbDevice.getProductId(); + + final Class driverClass = + mProbeTable.findDriver(vendorId, productId); + if (driverClass != null) { + final UsbSerialDriver driver; + try { + final Constructor ctor = + driverClass.getConstructor(UsbDevice.class); + driver = ctor.newInstance(usbDevice); + } catch (NoSuchMethodException | IllegalArgumentException | InstantiationException | + IllegalAccessException | InvocationTargetException e) { + throw new RuntimeException(e); + } + return driver; + } + return null; + } + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/serialport/util/MonotonicClock.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/serialport/util/MonotonicClock.java new file mode 100644 index 00000000..1fd8688b --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/serialport/util/MonotonicClock.java @@ -0,0 +1,14 @@ +package com.bg7yoz.ft8cn.serialport.util; + +public final class MonotonicClock { + + private static final long NS_PER_MS = 1_000_000; + + private MonotonicClock() { + } + + public static long millis() { + return System.nanoTime() / NS_PER_MS; + } + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/serialport/util/SerialInputOutputManager.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/serialport/util/SerialInputOutputManager.java new file mode 100644 index 00000000..9c014d98 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/serialport/util/SerialInputOutputManager.java @@ -0,0 +1,257 @@ +/* Copyright 2011-2013 Google Inc. + * Copyright 2013 mike wakerly + * + * Project home page: https://github.com/mik3y/usb-serial-for-android + */ + +package com.bg7yoz.ft8cn.serialport.util; + +import android.os.Process; +import android.util.Log; + +import com.bg7yoz.ft8cn.serialport.UsbSerialPort; + +import java.io.IOException; +import java.nio.ByteBuffer; + +/** + * Utility class which services a {@link ../UsbSerialPort} in its {@link #run()} method. + * + * @author mike wakerly (opensource@hoho.com) + */ +public class SerialInputOutputManager implements Runnable { + + public enum State { + STOPPED, + RUNNING, + STOPPING + } + + public static boolean DEBUG = false; + + private static final String TAG = SerialInputOutputManager.class.getSimpleName(); + private static final int BUFSIZ = 4096; + + /** + * default read timeout is infinite, to avoid data loss with bulkTransfer API + */ + private int mReadTimeout = 0; + private int mWriteTimeout = 0; + + private final Object mReadBufferLock = new Object(); + private final Object mWriteBufferLock = new Object(); + + private ByteBuffer mReadBuffer; // default size = getReadEndpoint().getMaxPacketSize() + private ByteBuffer mWriteBuffer = ByteBuffer.allocate(BUFSIZ); + + private int mThreadPriority = Process.THREAD_PRIORITY_URGENT_AUDIO; + private State mState = State.STOPPED; // Synchronized by 'this' + private Listener mListener; // Synchronized by 'this' + private final UsbSerialPort mSerialPort; + + public interface Listener { + /** + * Called when new incoming data is available. + */ + void onNewData(byte[] data); + + /** + * Called when {@link SerialInputOutputManager#run()} aborts due to an error. + */ + void onRunError(Exception e); + } + + public SerialInputOutputManager(UsbSerialPort serialPort) { + mSerialPort = serialPort; + mReadBuffer = ByteBuffer.allocate(serialPort.getReadEndpoint().getMaxPacketSize()); + } + + public SerialInputOutputManager(UsbSerialPort serialPort, Listener listener) { + mSerialPort = serialPort; + mListener = listener; + mReadBuffer = ByteBuffer.allocate(serialPort.getReadEndpoint().getMaxPacketSize()); + } + + public synchronized void setListener(Listener listener) { + mListener = listener; + } + + public synchronized Listener getListener() { + return mListener; + } + + /** + * setThreadPriority. By default a higher priority than UI thread is used to prevent data loss + * + * @param threadPriority see {@link Process#setThreadPriority(int)} + * */ + public void setThreadPriority(int threadPriority) { + if (mState != State.STOPPED) + throw new IllegalStateException("threadPriority only configurable before SerialInputOutputManager is started"); + mThreadPriority = threadPriority; + } + + /** + * read/write timeout + */ + public void setReadTimeout(int timeout) { + // when set if already running, read already blocks and the new value will not become effective now + if(mReadTimeout == 0 && timeout != 0 && mState != State.STOPPED) + throw new IllegalStateException("readTimeout only configurable before SerialInputOutputManager is started"); + mReadTimeout = timeout; + } + + public int getReadTimeout() { + return mReadTimeout; + } + + public void setWriteTimeout(int timeout) { + mWriteTimeout = timeout; + } + + public int getWriteTimeout() { + return mWriteTimeout; + } + + /** + * read/write buffer size + */ + public void setReadBufferSize(int bufferSize) { + if (getReadBufferSize() == bufferSize) + return; + synchronized (mReadBufferLock) { + mReadBuffer = ByteBuffer.allocate(bufferSize); + } + } + + public int getReadBufferSize() { + return mReadBuffer.capacity(); + } + + public void setWriteBufferSize(int bufferSize) { + if(getWriteBufferSize() == bufferSize) + return; + synchronized (mWriteBufferLock) { + ByteBuffer newWriteBuffer = ByteBuffer.allocate(bufferSize); + if(mWriteBuffer.position() > 0) + newWriteBuffer.put(mWriteBuffer.array(), 0, mWriteBuffer.position()); + mWriteBuffer = newWriteBuffer; + } + } + + public int getWriteBufferSize() { + return mWriteBuffer.capacity(); + } + + /** + * when using writeAsync, it is recommended to use readTimeout != 0, + * else the write will be delayed until read data is available + */ + public void writeAsync(byte[] data) { + synchronized (mWriteBufferLock) { + mWriteBuffer.put(data); + } + } + + /** + * start SerialInputOutputManager in separate thread + */ + public void start() { + if(mState != State.STOPPED) + throw new IllegalStateException("already started"); + new Thread(this, this.getClass().getSimpleName()).start(); + } + + /** + * stop SerialInputOutputManager thread + * + * when using readTimeout == 0 (default), additionally use usbSerialPort.close() to + * interrupt blocking read + */ + public synchronized void stop() { + if (getState() == State.RUNNING) { + Log.i(TAG, "Stop requested"); + mState = State.STOPPING; + } + } + + public synchronized State getState() { + return mState; + } + + /** + * Continuously services the read and write buffers until {@link #stop()} is + * called, or until a driver exception is raised. + */ + @Override + public void run() { + synchronized (this) { + if (getState() != State.STOPPED) { + throw new IllegalStateException("Already running"); + } + mState = State.RUNNING; + } + Log.i(TAG, "Running ..."); + try { + if(mThreadPriority != Process.THREAD_PRIORITY_DEFAULT) + Process.setThreadPriority(mThreadPriority); + while (true) { + if (getState() != State.RUNNING) { + Log.i(TAG, "Stopping mState=" + getState()); + break; + } + step(); + } + } catch (Exception e) { + Log.w(TAG, "Run ending due to exception: " + e.getMessage(), e); + final Listener listener = getListener(); + if (listener != null) { + listener.onRunError(e); + } + } finally { + synchronized (this) { + mState = State.STOPPED; + Log.i(TAG, "Stopped"); + } + } + } + + private void step() throws IOException { + // Handle incoming data. + byte[] buffer; + synchronized (mReadBufferLock) { + buffer = mReadBuffer.array(); + } + int len = mSerialPort.read(buffer, mReadTimeout); + if (len > 0) { + if (DEBUG) { + Log.d(TAG, "Read data len=" + len); + } + final Listener listener = getListener(); + if (listener != null) { + final byte[] data = new byte[len]; + System.arraycopy(buffer, 0, data, 0, len); + listener.onNewData(data); + } + } + + // Handle outgoing data. + buffer = null; + synchronized (mWriteBufferLock) { + len = mWriteBuffer.position(); + if (len > 0) { + buffer = new byte[len]; + mWriteBuffer.rewind(); + mWriteBuffer.get(buffer, 0, len); + mWriteBuffer.clear(); + } + } + if (buffer != null) { + if (DEBUG) { + Log.d(TAG, "Writing data len=" + len); + } + mSerialPort.write(buffer, mWriteTimeout); + } + } + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/spectrum/SpectrumListener.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/spectrum/SpectrumListener.java new file mode 100644 index 00000000..1637c92a --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/spectrum/SpectrumListener.java @@ -0,0 +1,41 @@ +package com.bg7yoz.ft8cn.spectrum; +/** + * 用于瀑布图的音频接收。以一个FT8符号为颗粒度。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import androidx.lifecycle.MutableLiveData; + +import com.bg7yoz.ft8cn.wave.HamRecorder; +import com.bg7yoz.ft8cn.wave.OnGetVoiceDataDone; + +public class SpectrumListener { + private static final String TAG = "SpectrumListener"; + private HamRecorder hamRecorder; + + private float[] dataBuffer=new float[0]; + public MutableLiveData mutableDataBuffer = new MutableLiveData<>(); + + + private final OnGetVoiceDataDone onGetVoiceDataDone=new OnGetVoiceDataDone() { + @Override + public void onGetDone(float[] data) { + mutableDataBuffer.postValue(data); + } + }; + + public SpectrumListener(HamRecorder hamRecorder) { + this.hamRecorder = hamRecorder; + doReceiveData(); + } + + + private void doReceiveData(){ + hamRecorder.getVoiceData(160,false,onGetVoiceDataDone); + } + + public float[] getDataBuffer() { + return dataBuffer; + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/timer/OnUtcTimer.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/timer/OnUtcTimer.java new file mode 100644 index 00000000..813b4586 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/timer/OnUtcTimer.java @@ -0,0 +1,14 @@ +package com.bg7yoz.ft8cn.timer; +/** + * UtcTimer类的一个接口,用于UtcTimer的回调。 + * UtcTimer是一个动作触发器,在一个时钟周期到来时触发动作,触发动作的回调函数是DoOnSecTimer。 + * UtcTimer在以一个固定的频率循环(目前默认时100毫秒),在每一个频率下的回调函数是doHeartBeatTimer。 + * 注意!!!! doHeartBeatTimer不要执行耗时的操作,一定要在心跳间隔内完成,否则可能会造成线程的积压,影响性能。 + * + * @author BG7YOZ + * @date 2022.5.6 + */ +public interface OnUtcTimer { + void doHeartBeatTimer(long utc);//心跳回调,在触发器每一个循环时触发,心跳的只处理简单事务,不要过多占用CPU,防止线程叠加 + void doOnSecTimer(long utc);//当指定的时间间隔时触发 +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/timer/UtcTimer.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/timer/UtcTimer.java new file mode 100644 index 00000000..85eab930 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/timer/UtcTimer.java @@ -0,0 +1,301 @@ +package com.bg7yoz.ft8cn.timer; +/** + * UtcTimer类,用于实现FT8在各通联周期开始时触发的动作。FT8的通联因为需要时钟同步,以UTC时间为基准,每15秒一个周期(FT4为7.5秒)。 + * 该类采用Timer和TimerTask来实现定时触发动作。 + * 由于FT8需要时钟同步(精度为秒),在每一个周期开始触发动作,所以,目前以100毫秒为心跳,检测是否处于周期(对UTC时间以周期的秒数取模)的开始, + * 如果是,则回调doHeartBeatTimer函数,为防止重复动作,触发后会等待1秒钟后再进入新的心跳周期(因为是以秒数取模)。 + * 注意!!为防止回调动作占用时间过长,影响下一个动作的触发,所以,回调都是以多线程的方式调用,在使用时要注意线程安全。 + *

+ * @author BG7YOZ + * @date 2022.5.7 + */ + +import android.annotation.SuppressLint; + +import com.bg7yoz.ft8cn.ui.ToastMessage; + +import org.apache.commons.net.ntp.NTPUDPClient; +import org.apache.commons.net.ntp.TimeInfo; + +import java.io.IOException; +import java.net.InetAddress; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.TimeZone; +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + + +public class UtcTimer { + private final int sec; + private final boolean doOnce; + private final OnUtcTimer onUtcTimer; + + + private long utc; + public static int delay = 0;//时钟总的延时,(毫秒) + private boolean running = false;//用来判断是否触发周期的动作 + + private final Timer secTimer = new Timer(); + private final Timer heartBeatTimer = new Timer(); + private int time_sec = 0;//时间的偏移量; + private final ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); + private final Runnable doSomething = new Runnable() { + @Override + public void run() { + onUtcTimer.doOnSecTimer(utc); + } + }; + private final ExecutorService heartBeatThreadPool = Executors.newCachedThreadPool(); + private final Runnable doHeartBeat = new Runnable() { + @Override + public void run() { + onUtcTimer.doHeartBeatTimer(utc); + } + }; + + /** + * 类方法。获得UTC时间的字符串表示结果。 + * + * @param time 时间。 + * @return String 以字符串方式显示UTC时间。 + */ + @SuppressLint("DefaultLocale") + public static String getTimeStr(long time) { + long curtime = time / 1000; + long hour = ((curtime) / (60 * 60)) % 24;//小时 + long sec = (curtime) % 60;//秒 + long min = ((curtime) % 3600) / 60;//分 + return String.format("UTC : %02d:%02d:%02d", hour, min, sec); + } + + /** + * 以HHMMSS格式显示UTC时间 + * + * @param time + * @return + */ + @SuppressLint("DefaultLocale") + public static String getTimeHHMMSS(long time) { + long curtime = time / 1000; + long hour = ((curtime) / (60 * 60)) % 24;//小时 + long sec = (curtime) % 60;//秒 + long min = ((curtime) % 3600) / 60;//分 + return String.format("%02d%02d%02d", hour, min, sec); + } + + public static String getYYYYMMDD(long time) { + @SuppressLint("SimpleDateFormat") + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd"); + simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); + return simpleDateFormat.format(new Date(time)); + } + + public static String getDatetimeStr(long time) { + @SuppressLint("SimpleDateFormat") + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); + return simpleDateFormat.format(new Date(time)); + } + + public static String getDatetimeYYYYMMDD_HHMMSS(long time) { + @SuppressLint("SimpleDateFormat") + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd-HHmmss"); + simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); + return simpleDateFormat.format(new Date(time)); + } + + /** + * 时钟触发器的构建方法。需要确定时钟的周期,周期一般是15秒或7.5秒,因为周期的参数是int,所以参数的单位是十分之一秒。 + * 由于心跳频率较快(暂时定为100毫秒),心跳的动作越简练越好,要在下一个心跳开始之前处理完,防止造成线程叠加,影响性能。 + * 心跳动作不会因周期动作不触发(running==false)而影响,只要UtcTimer的实例存在,心跳动作就运行(方便显示时钟数据)。 + * 该触发器需要调用delete函数彻底停止(心跳动作也停止了)。 + * + * @param sec 时钟的周期,单位是十分之一秒,如:15秒,值150,7.5秒,值75。 + * @param doOnce 是否只触发一次。 + * @param onUtcTimer 回调函数,包括心跳回调,和周期起始触发动作的回调。 + */ + public UtcTimer(int sec, boolean doOnce, OnUtcTimer onUtcTimer) { + this.sec = sec; + this.doOnce = doOnce; + this.onUtcTimer = onUtcTimer; + + //初始化Timer的任务。 + //TimerTask timerTask = initTask(); + //执行timer,延时0执行,周期100毫秒 + + secTimer.schedule(secTask(), 0, 10); + heartBeatTimer.schedule(heartBeatTask(), 0, 1000); + } + + /** + * 定义时钟触发的动作。 + * 时钟触发器的构建方法。需要确定时钟的周期,周期一般是15秒或7.5秒,因为周期的参数是int,所以参数的单位是十分之一秒。 + * 由于心跳频率较快(暂时定为100毫秒),心跳的动作越简练越好,要在下一个心跳开始之前处理完,防止造成线程叠加,影响性能。 + * 心跳动作不会因周期动作不触发(running==false)而影响,只要UtcTimer的实例存在,心跳动作就运行(方便显示时钟数据)。 + * + * @return TimerTask 返回动作的实例。 + */ + + + private TimerTask heartBeatTask() { + return new TimerTask() { + @Override + public void run() { + //心跳动作 + doHeartBeatEvent(onUtcTimer); + } + }; + } + + private TimerTask secTask() { + return new TimerTask() { + + + @Override + public void run() { + + try { + utc = getSystemTime();//获取当前的UTC时间 + //utc/100是取十分之一秒为单位,所以取模应该是600,而非60,切记! + //running是判断是否需要触发周期动作。 + //+80是因为触发后一些动作影响,补偿的时间 + //time_sec是时间的偏移量 + if (running && (((utc - time_sec) / 100) % 600) % sec == 0) { + //周期动作 + //注意!!!! doHeartBeatTimer不要执行耗时的操作,一定要在心跳间隔内完成,否则可能会造成线程的积压,影响性能。 + cachedThreadPool.execute(doSomething);//用线程池的方式调用,减少系统消耗 + //thread.run(); + + //如果只执行一次触发动作 + if (doOnce) { + running = false; + return; + } + + //等待1秒钟,防止重复触发动作。 + Thread.sleep(1000); + } + + + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + }; + } + + /** + * 触发心跳时的动作。由Timer调用,写此函数是方便阅读。动作是在新创建的线程中执行。 + * + * @param onUtcTimer 触发时钟的回调函数。 + */ + private void doHeartBeatEvent(OnUtcTimer onUtcTimer) { + //心跳动作 + heartBeatThreadPool.execute(doHeartBeat); +// new Thread(new Runnable() { +// @Override +// public void run() { +// //注意!!!! doHeartBeatTimer不要执行耗时的操作,一定要在心跳间隔内完成,否则可能会造成线程的积压,影响性能。 +// onUtcTimer.doHeartBeatTimer(utc); +// } +// }).start(); + } + + + public void stop() { + running = false; + } + + public void start() { + running = true; + } + + public boolean isRunning() { + return running; + } + + public void delete() { + secTimer.cancel(); + heartBeatTimer.cancel(); + } + + /** + * 设置时间偏移量,正值是向后偏移 + * + * @param time_sec 向前的偏移量 + */ + public void setTime_sec(int time_sec) { + this.time_sec = time_sec; + } + + /** + * 获取时间偏移 + * + * @return 时间偏移值(毫秒) + */ + public int getTime_sec() { + return time_sec; + } + + public long getUtc() { + return utc; + } + + /** + * 根据UTC时间计算时序 + * + * @param utc UTC时间 + * @return 时序:0,1 + */ + public static int sequential(long utc) { + return (int) ((((utc) / 1000) / 15) % 2); + } + + public static int getNowSequential() { + return sequential(getSystemTime()); + } + + public static long getSystemTime() { + return delay + System.currentTimeMillis(); + } + + /** + * 使用微软的时间服务器同步时间 + */ + public static void syncTime(AfterSyncTime afterSyncTime) { + new Thread(new Runnable() { + @Override + public void run() { + NTPUDPClient timeClient = new NTPUDPClient(); + InetAddress inetAddress = null; + TimeInfo timeInfo = null; + try { + inetAddress = InetAddress.getByName("time.windows.com"); + timeInfo = timeClient.getTime(inetAddress); + long serverTime = timeInfo.getMessage().getTransmitTimeStamp().getTime(); + int trueDelay = (int) ((serverTime - System.currentTimeMillis())); + UtcTimer.delay = trueDelay % 15000;//延迟的周期 + if (afterSyncTime != null) { + afterSyncTime.doAfterSyncTimer(trueDelay); + } + } catch (IOException e) { + if (afterSyncTime != null) { + afterSyncTime.syncFailed(e); + } + } + + //long localDeviceTime = timeInfo.getReturnTime(); + + } + }).start(); + } + + public interface AfterSyncTime { + void doAfterSyncTimer(int secTime); + + void syncFailed(IOException e); + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/BandsSpinnerAdapter.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/BandsSpinnerAdapter.java new file mode 100644 index 00000000..44925c48 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/BandsSpinnerAdapter.java @@ -0,0 +1,54 @@ +package com.bg7yoz.ft8cn.ui; +/** + * 频段列表界面 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.annotation.SuppressLint; +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.TextView; + +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.database.OperationBand; + +public class BandsSpinnerAdapter extends BaseAdapter { + private final Context mContext; + //private final OperationBand operationBand; + public BandsSpinnerAdapter(Context context) { + //operationBand= + OperationBand.getInstance(context); + mContext=context; + } + + @Override + public int getCount() { + return OperationBand.bandList.size(); + } + + @Override + public Object getItem(int i) { + return OperationBand.bandList.get(i); + } + + @Override + public long getItemId(int i) { + return i; + } + + @SuppressLint({"ViewHolder", "InflateParams"}) + @Override + public View getView(int i, View view, ViewGroup viewGroup) { + LayoutInflater _LayoutInflater=LayoutInflater.from(mContext); + view=_LayoutInflater.inflate(R.layout.operation_band_spinner_item, null); + if (view!=null){ + TextView textView=view.findViewById(R.id.operationBandItemTextView); + textView.setText(OperationBand.getBandInfo(i)); + } + return view; + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/BauRateSpinnerAdapter.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/BauRateSpinnerAdapter.java new file mode 100644 index 00000000..bf48f652 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/BauRateSpinnerAdapter.java @@ -0,0 +1,63 @@ +package com.bg7yoz.ft8cn.ui; +/** + * 波特率列表界面 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.annotation.SuppressLint; +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.TextView; + +import com.bg7yoz.ft8cn.R; + + +public class BauRateSpinnerAdapter extends BaseAdapter { + private final Context mContext; + private final int[] bauRates= {4800,9600,14400,19200,38400,43000,56000,57600,115200}; + public BauRateSpinnerAdapter(Context context) { + mContext=context; + } + + @Override + public int getCount() { + return bauRates.length; + } + + @Override + public Object getItem(int i) { + return bauRates[i]; + } + + @Override + public long getItemId(int i) { + return i; + } + + @SuppressLint({"ViewHolder", "InflateParams"}) + @Override + public View getView(int i, View view, ViewGroup viewGroup) { + LayoutInflater _LayoutInflater=LayoutInflater.from(mContext); + view=_LayoutInflater.inflate(R.layout.bau_rate_spinner_item, null); + if (view!=null){ + TextView textView=(TextView)view.findViewById(R.id.bauRateItemTextView); + textView.setText(String.valueOf(bauRates[i])); + } + return view; + } + public int getPosition(int i){ + for (int j = 0; j < bauRates.length; j++) { + if (bauRates[j]==i){ + return j; + } + } + return 2; + } + public int getValue(int position){ + return bauRates[position]; + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/CallingListAdapter.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/CallingListAdapter.java new file mode 100644 index 00000000..d7228ce2 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/CallingListAdapter.java @@ -0,0 +1,449 @@ +package com.bg7yoz.ft8cn.ui; +/** + * 消息列表Adapter。使用此Adapter有解码界面、呼叫界面、网格追踪界面。 + * 不同周期背景不同。为了区分,共有4种背景颜色。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.Paint; +import android.opengl.Visibility; +import android.view.ContextMenu; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.recyclerview.widget.RecyclerView; + +import com.bg7yoz.ft8cn.Ft8Message; +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.MainViewModel; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.maidenhead.MaidenheadGrid; +import com.bg7yoz.ft8cn.rigs.BaseRigOperation; +import com.bg7yoz.ft8cn.timer.UtcTimer; + +import java.util.ArrayList; + +public class CallingListAdapter extends RecyclerView.Adapter { + public enum ShowMode{CALLING_LIST,MY_CALLING,TRACKER} + private static final String TAG = "CallingListAdapter"; + private final MainViewModel mainViewModel; + private final ArrayList ft8MessageArrayList; + private final Context context; + + private final ShowMode showMode; + private View.OnClickListener onItemClickListener; + + private final View.OnCreateContextMenuListener menuListener=new View.OnCreateContextMenuListener() { + @Override + public void onCreateContextMenu(ContextMenu contextMenu, View view, ContextMenu.ContextMenuInfo contextMenuInfo) { + + //view.setTag(ft8Message);//把消息对象传递给上一级界面 + int postion= (int) view.getTag(); + if (postion==-1) return; + if (postion>ft8MessageArrayList.size()-1) return; + Ft8Message ft8Message=ft8MessageArrayList.get(postion); + + //添加菜单的参数i1:组,i2:id值,i3:显示顺序 + if (!ft8Message.getCallsignTo().contains("...")//目标不能是自己 + //&& !ft8Message.getCallsignTo().equals(GeneralVariables.myCallsign) + && !GeneralVariables.checkIsMyCallsign(ft8Message.getCallsignTo()) + && !(ft8Message.i3==0&&ft8Message.n3==0)) { + if (!ft8Message.checkIsCQ()) { + if (showMode==ShowMode.CALLING_LIST) {//在消息列表中就可以显示这个菜单了 + contextMenu.add(0, 0, 0, String.format( + GeneralVariables.getStringFromResource(R.string.tracking_receiver) + , ft8Message.getCallsignTo(), ft8Message.toWhere)) + .setActionView(view); + } + if (!mainViewModel.ft8TransmitSignal.isSynFrequency()) {//如果同频率的话,会与发送者同频,会影响发送者!!! + contextMenu.add(0, 1, 0, String.format( + GeneralVariables.getStringFromResource(R.string.calling_receiver) + , ft8Message.getCallsignTo(), ft8Message.toWhere)) + .setActionView(view); + } + //说明是对我呼叫,加上回复菜单 + //if (ft8Message.getCallsignTo().equals(GeneralVariables.myCallsign)) { + if (GeneralVariables.checkIsMyCallsign(ft8Message.getCallsignTo())) { + contextMenu.add(0, 4, 0, String.format( + GeneralVariables.getStringFromResource(R.string.reply_to) + , ft8Message.getCallsignFrom(), ft8Message.fromWhere)) + .setActionView(view); + + } + if (showMode!=ShowMode.TRACKER) { + contextMenu.add(0, 5, 0 + , String.format(GeneralVariables.getStringFromResource(R.string.qsl_qrz_confirmation_s) + , ft8Message.getCallsignTo())).setActionView(view); + } + + //增加查询日志 + contextMenu.add(0, 7, 0 + , String.format(GeneralVariables.getStringFromResource(R.string.qsl_query_log_menu) + , ft8Message.getCallsignTo())).setActionView(view); + + } + } + + if (!ft8Message.getCallsignFrom().contains("...") + //&& !ft8Message.getCallsignFrom().equals(GeneralVariables.myCallsign) + && !GeneralVariables.checkIsMyCallsign(ft8Message.getCallsignFrom()) + && !(ft8Message.i3==0&&ft8Message.n3==0)) { + if (showMode==ShowMode.CALLING_LIST) {//在消息列表中就可以显示这个菜单了 + contextMenu.add(1, 2, 0, String.format( + GeneralVariables.getStringFromResource(R.string.tracking) + , ft8Message.getCallsignFrom(), ft8Message.fromWhere)) + .setActionView(view); + } + contextMenu.add(1, 3, 0, String.format( + GeneralVariables.getStringFromResource(R.string.calling) + , ft8Message.getCallsignFrom(), ft8Message.fromWhere)) + .setActionView(view); + if (showMode!=ShowMode.TRACKER) { + contextMenu.add(1, 6, 0 + , String.format(GeneralVariables.getStringFromResource(R.string.qsl_qrz_confirmation_s) + , ft8Message.getCallsignFrom())).setActionView(view); + } + + //增加查询日志 + contextMenu.add(0, 8, 0 + , String.format(GeneralVariables.getStringFromResource(R.string.qsl_query_log_menu) + , ft8Message.getCallsignFrom())).setActionView(view); + } + + } + }; + + + + public CallingListAdapter(Context context, MainViewModel mainViewModel + , ArrayList messages, ShowMode showMode) { + this.mainViewModel = mainViewModel; + this.context = context; + this.showMode=showMode; + ft8MessageArrayList = messages; + } + + @NonNull + @Override + public CallingListItemHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext()); + View view ; + if (GeneralVariables.simpleCallItemMode) { + view = layoutInflater.inflate(R.layout.call_list_holder_simple_item, parent, false); + }else { + view = layoutInflater.inflate(R.layout.call_list_holder_item, parent, false); + } + return new CallingListItemHolder(view,onItemClickListener,menuListener); + } + + /** + * 删除消息 + * + * @param position 在列表中的位置 + */ + public void deleteMessage(int position) { + if (position >= 0) { + ft8MessageArrayList.remove(position); + } + } + + public Ft8Message getMessageByPosition(int position){ + if (ft8MessageArrayList==null) return null; + if (position<0) return null; + if (position>ft8MessageArrayList.size()-1) return null; + return ft8MessageArrayList.get(position); + } + + /** + * 通过holder获取消息 + * + * @param holder holder + * @return ft8message + */ + public Ft8Message getMessageByViewHolder(RecyclerView.ViewHolder holder) { + if (holder.getAdapterPosition() == -1) { + return null; + } + return ft8MessageArrayList.get(holder.getAdapterPosition()); + } + + @SuppressLint("ResourceAsColor") + @Override + public void onBindViewHolder(@NonNull CallingListItemHolder holder, int position) { + holder.callListHolderConstraintLayout.setTag(position);//设置layout的tag,为了识别消息的定位 + holder.ft8Message = ft8MessageArrayList.get(position); + holder.showMode = showMode;//确定是消息列表还是关注消息的列表 + holder.isSyncFreq = mainViewModel.ft8TransmitSignal.isSynFrequency();//如果同频发射,就不显示呼叫接收者 + + holder.callingUtcTextView.setText(UtcTimer.getTimeHHMMSS(holder.ft8Message.utcTime)); + //时序,包括颜色, + holder.callingListSequenceTextView.setText(holder.ft8Message.getSequence() == 0 ? "0" : "1"); + holder.isWeakSignalImageView.setVisibility(holder.ft8Message.isWeakSignal ? View.VISIBLE:View.INVISIBLE); + + if (showMode==ShowMode.MY_CALLING) {//在呼叫界面 + holder.callingListSequenceTextView.setTextColor(context.getColor(R.color.follow_call_text_color)); + } + + //根据1分钟内的4个时序区分颜色 + switch (holder.ft8Message.getSequence4()) { + case 0: + holder.callListHolderConstraintLayout.setBackgroundResource(R.drawable.calling_list_cell_0_style); + break; + case 1: + holder.callListHolderConstraintLayout.setBackgroundResource(R.drawable.calling_list_cell_1_style); + break; + case 2: + holder.callListHolderConstraintLayout.setBackgroundResource(R.drawable.calling_list_cell_2_style); + break; + case 3: + holder.callListHolderConstraintLayout.setBackgroundResource(R.drawable.calling_list_cell_3_style); + break; + } + + holder.callingListIdBTextView.setText(holder.ft8Message.getdB()); + //时间偏移,如果超过1.0秒,-0.05秒,红色提示 + holder.callListDtTextView.setText(holder.ft8Message.getDt()); + if (holder.ft8Message.time_sec > 1.0f || holder.ft8Message.time_sec < -0.05) { + holder.callListDtTextView.setTextColor(context.getResources().getColor( + R.color.message_in_my_call_text_color)); + } else { + holder.callListDtTextView.setTextColor(context.getResources().getColor( + R.color.text_view_color)); + } + + + holder.callingListFreqTextView.setText(holder.ft8Message.getFreq_hz()); + + //查是不是通联过的呼号,获取是否存在holder.otherBandIsQso中 + setQueryHolderQSL_Callsign(holder); + + //是否有与我呼号有关的消息 + if (holder.ft8Message.inMyCall()) { + holder.callListMessageTextView.setTextColor(context.getResources().getColor( + R.color.message_in_my_call_text_color)); + } else if (holder.otherBandIsQso) { + //设置在别的波段通联过的消息颜色 + holder.callListMessageTextView.setTextColor(context.getResources().getColor( + R.color.fromcall_is_qso_text_color)); + } else { + holder.callListMessageTextView.setTextColor(context.getResources().getColor( + R.color.message_text_color)); + } + + + holder.callListMessageTextView.setText(holder.ft8Message.getMessageText(true)); + + //载波频率 + holder.bandItemTextView.setText(BaseRigOperation.getFrequencyStr(holder.ft8Message.band)); + //计算距离 + holder.callingListDistTextView.setText(MaidenheadGrid.getDistStr( + GeneralVariables.getMyMaidenheadGrid() + , holder.ft8Message.getMaidenheadGrid(mainViewModel.databaseOpr))); + holder.callingListCallsignToTextView.setText("");//被呼叫者 + holder.callingListCallsignFromTextView.setText("");//呼叫者 + + //消息类型 + holder.callingListCommandIInfoTextView.setText(holder.ft8Message.getCommandInfo()); + if (holder.ft8Message.i3 == 1 || holder.ft8Message.i3 == 2) { + holder.callingListCommandIInfoTextView.setTextColor(context.getResources().getColor( + R.color.text_view_color)); + } else { + holder.callingListCommandIInfoTextView.setTextColor(context.getResources().getColor( + R.color.message_in_my_call_text_color)); + } + + //设置是否CQ的颜色 + if (holder.ft8Message.checkIsCQ()) { + holder.callListMessageTextView.setBackgroundResource(R.color.textview_cq_color); + holder.ft8Message.toWhere = ""; + } else { + holder.callListMessageTextView.setBackgroundResource(R.color.textview_none_color); + } + + + if (holder.ft8Message.fromWhere != null) { + holder.callingListCallsignFromTextView.setText(holder.ft8Message.fromWhere); + } else { + holder.callingListCallsignFromTextView.setText(""); + } + + if (holder.ft8Message.toWhere != null) { + holder.callingListCallsignToTextView.setText(holder.ft8Message.toWhere); + } else { + holder.callingListCallsignToTextView.setText(""); + } + + //给没有通联过的分区打标记 + setToDxcc(holder); + setFromDxcc(holder); + + + //查询呼号归属地,为防止占用太多运算资源,当from为空是再做查询的工作 +// if (holder.ft8Message.fromWhere == null) { +// setQueryHolderCallsign(holder);//查询呼号归属地 +// } + + if (holder.ft8Message.freq_hz <= 0.01f) {//这是发射界面 + holder.callingListIdBTextView.setVisibility(View.GONE); + holder.callListDtTextView.setVisibility(View.GONE); + holder.callingListFreqTextView.setText("TX"); + holder.bandItemTextView.setVisibility(View.GONE); + holder.callingListDistTextView.setVisibility(View.GONE); + holder.callingListCommandIInfoTextView.setVisibility(View.GONE); + holder.callingUtcTextView.setVisibility(View.GONE); + holder.callingListCallsignToTextView.setVisibility(View.GONE); + holder.callingListCallsignFromTextView.setVisibility(View.GONE); + holder.dxccToImageView.setVisibility(View.GONE); + holder.ituToImageView.setVisibility(View.GONE); + holder.cqToImageView.setVisibility(View.GONE); + holder.dxccFromImageView.setVisibility(View.GONE); + holder.ituFromImageView.setVisibility(View.GONE); + holder.cqFromImageView.setVisibility(View.GONE); + } else if (GeneralVariables.simpleCallItemMode){//简单列表模式 + holder.bandItemTextView.setVisibility(View.GONE); + holder.callingListDistTextView.setVisibility(View.GONE); + holder.callingListCommandIInfoTextView.setVisibility(View.GONE); + holder.callingUtcTextView.setVisibility(View.GONE); + holder.callingListCallsignToTextView.setVisibility(View.GONE); + holder.dxccToImageView.setVisibility(View.GONE); + holder.ituToImageView.setVisibility(View.GONE); + holder.cqToImageView.setVisibility(View.GONE); + }else {//标准列表模式 + holder.callingListIdBTextView.setVisibility(View.VISIBLE); + holder.callListDtTextView.setVisibility(View.VISIBLE); + holder.bandItemTextView.setVisibility(View.VISIBLE); + holder.callingListDistTextView.setVisibility(View.VISIBLE); + holder.callingListCommandIInfoTextView.setVisibility(View.VISIBLE); + holder.callingUtcTextView.setVisibility(View.VISIBLE); + holder.callingListCallsignToTextView.setVisibility(View.VISIBLE); + holder.callingListCallsignFromTextView.setVisibility(View.VISIBLE); + } + } + + private void setFromDxcc(@NonNull CallingListItemHolder holder) { + + if (holder.ft8Message.fromDxcc && holder.ft8Message.freq_hz > 0.01f) { + holder.dxccFromImageView.setVisibility(View.VISIBLE); + } else { + holder.dxccFromImageView.setVisibility(View.GONE); + } + + if (holder.ft8Message.fromCq && holder.ft8Message.freq_hz > 0.01f) { + holder.cqFromImageView.setVisibility(View.VISIBLE); + } else { + holder.cqFromImageView.setVisibility(View.GONE); + } + + if (holder.ft8Message.fromItu && holder.ft8Message.freq_hz > 0.01f) { + holder.ituFromImageView.setVisibility(View.VISIBLE); + } else { + holder.ituFromImageView.setVisibility(View.GONE); + } + } + + private void setToDxcc(@NonNull CallingListItemHolder holder) { + if (holder.ft8Message.toDxcc && holder.ft8Message.freq_hz > 0.01f) { + holder.dxccToImageView.setVisibility(View.VISIBLE); + } else { + holder.dxccToImageView.setVisibility(View.GONE); + } + + if (holder.ft8Message.toCq && holder.ft8Message.freq_hz > 0.01f) { + holder.cqToImageView.setVisibility(View.VISIBLE); + } else { + holder.cqToImageView.setVisibility(View.GONE); + } + + if (holder.ft8Message.toItu && holder.ft8Message.freq_hz > 0.01f) { + holder.ituToImageView.setVisibility(View.VISIBLE); + } else { + holder.ituToImageView.setVisibility(View.GONE); + } + } + + //检查是不是通联过的呼号 + private void setQueryHolderQSL_Callsign(@NonNull CallingListItemHolder holder) { + //查是不是在本波段内通联成功过的呼号 + if (GeneralVariables.checkQSLCallsign(holder.ft8Message.getCallsignFrom())) {//如果在数据库中,划线 + holder.callListMessageTextView.setPaintFlags( + holder.callListMessageTextView.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); + } else {//如果不在数据库中,去掉划线 + holder.callListMessageTextView.setPaintFlags( + holder.callListMessageTextView.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG)); + } + holder.otherBandIsQso = GeneralVariables.checkQSLCallsign_OtherBand(holder.ft8Message.getCallsignFrom()); + } + + @Override + public int getItemCount() { + return ft8MessageArrayList.size(); + } + + public void setOnItemClickListener(View.OnClickListener onItemClickListener) { + this.onItemClickListener = onItemClickListener; + } + + static class CallingListItemHolder extends RecyclerView.ViewHolder { + private static final String TAG = "CallingListItemHolder"; + ConstraintLayout callListHolderConstraintLayout; + TextView callingListIdBTextView, callListDtTextView, callingListFreqTextView, + callListMessageTextView, callingListDistTextView, callingListSequenceTextView, + callingListCallsignFromTextView, callingListCallsignToTextView + , callingListCommandIInfoTextView, + bandItemTextView, callingUtcTextView; + ImageView dxccToImageView, ituToImageView, cqToImageView, dxccFromImageView + , ituFromImageView, cqFromImageView,isWeakSignalImageView; + public Ft8Message ft8Message; + //boolean showFollow; + ShowMode showMode; + boolean isSyncFreq; + boolean otherBandIsQso = false; + + + public CallingListItemHolder(@NonNull View itemView, View.OnClickListener listener + ,View.OnCreateContextMenuListener menuListener) { + super(itemView); + callListHolderConstraintLayout = itemView.findViewById(R.id.callListHolderConstraintLayout); + callingListIdBTextView = itemView.findViewById(R.id.callingListIdBTextView); + callListDtTextView = itemView.findViewById(R.id.callListDtTextView); + callingListFreqTextView = itemView.findViewById(R.id.callingListFreqTextView); + callListMessageTextView = itemView.findViewById(R.id.callListMessageTextView); + callingListDistTextView = itemView.findViewById(R.id.callingListDistTextView); + callingListSequenceTextView = itemView.findViewById(R.id.callingListSequenceTextView); + callingListCallsignFromTextView = itemView.findViewById(R.id.callingListCallsignFromTextView); + callingListCallsignToTextView = itemView.findViewById(R.id.callToItemTextView); + callingListCommandIInfoTextView = itemView.findViewById(R.id.callingListCommandIInfoTextView); + bandItemTextView = itemView.findViewById(R.id.bandItemTextView); + callingUtcTextView = itemView.findViewById(R.id.callingUtcTextView); + + dxccToImageView = itemView.findViewById(R.id.dxccToImageView); + ituToImageView = itemView.findViewById(R.id.ituToImageView); + cqToImageView = itemView.findViewById(R.id.cqToImageView); + dxccFromImageView = itemView.findViewById(R.id.dxccFromImageView); + ituFromImageView = itemView.findViewById(R.id.ituFromImageView); + cqFromImageView = itemView.findViewById(R.id.cqFromImageView); + isWeakSignalImageView=itemView.findViewById(R.id.isWeakSignalImageView); + + dxccToImageView.setVisibility(View.GONE); + ituToImageView.setVisibility(View.GONE); + cqToImageView.setVisibility(View.GONE); + dxccFromImageView.setVisibility(View.GONE); + ituFromImageView.setVisibility(View.GONE); + cqFromImageView.setVisibility(View.GONE); + itemView.setTag(-1); + itemView.setOnClickListener(listener); + itemView.setOnCreateContextMenuListener(menuListener); + + } + + + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/CallingListFragment.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/CallingListFragment.java new file mode 100644 index 00000000..368aefa5 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/CallingListFragment.java @@ -0,0 +1,450 @@ +package com.bg7yoz.ft8cn.ui; +/** + * 解码界面 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.annotation.SuppressLint; +import android.content.res.Configuration; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.AnimationUtils; + +import androidx.annotation.NonNull; +import androidx.core.content.ContextCompat; +import androidx.fragment.app.Fragment; +import androidx.lifecycle.Observer; +import androidx.navigation.NavController; +import androidx.navigation.Navigation; +import androidx.navigation.fragment.NavHostFragment; +import androidx.recyclerview.widget.ItemTouchHelper; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.bg7yoz.ft8cn.Ft8Message; +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.MainViewModel; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.databinding.FragmentCallingListBinding; +import com.bg7yoz.ft8cn.timer.UtcTimer; + +import java.util.ArrayList; + +public class CallingListFragment extends Fragment { + private static final String TAG = "CallingListFragment"; + + private FragmentCallingListBinding binding; + private RecyclerView callListRecyclerView; + private CallingListAdapter callingListAdapter; + private MainViewModel mainViewModel; + + + @SuppressLint("NotifyDataSetChanged") + @Override + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + mainViewModel = MainViewModel.getInstance(this); + binding = FragmentCallingListBinding.inflate(inflater, container, false); + callListRecyclerView = binding.callingListRecyclerView; + + callingListAdapter = new CallingListAdapter(this.getContext(), mainViewModel + , mainViewModel.ft8Messages, CallingListAdapter.ShowMode.CALLING_LIST); + callListRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext())); + callListRecyclerView.setAdapter(callingListAdapter); + callingListAdapter.notifyDataSetChanged(); + callListRecyclerView.scrollToPosition(callingListAdapter.getItemCount() - 1); + + + requireActivity().registerForContextMenu(callListRecyclerView);//注册菜单 + + //当横屏时显示频谱图 + if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { + assert binding.spectrumView != null; + binding.spectrumView.run(mainViewModel, this); + } + //设置呼号滑动,用于快速呼叫 + initRecyclerViewAction(); + + //监听按钮 + binding.timerImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (mainViewModel.hamRecorder.isRunning()) { + mainViewModel.hamRecorder.stopRecord(); + mainViewModel.ft8TransmitSignal.setActivated(false); + } else { + mainViewModel.hamRecorder.startRecord(); + } + } + }); + //清除按钮 + binding.clearCallingListImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + mainViewModel.clearFt8MessageList(); + callingListAdapter.notifyDataSetChanged(); + mainViewModel.mutable_Decoded_Counter.setValue(0); + } + }); + //观察解码数量 + mainViewModel.mutable_Decoded_Counter.observe(getViewLifecycleOwner(), new Observer() { + @SuppressLint("DefaultLocale") + @Override + public void onChanged(Integer integer) { + binding.decoderCounterTextView.setText( + String.format(GeneralVariables.getStringFromResource(R.string.message_count_count) + , mainViewModel.currentDecodeCount, mainViewModel.ft8Messages.size())); + + + } + }); + + mainViewModel.mutableFt8MessageList.observe(getViewLifecycleOwner(), new Observer>() { + @Override + public void onChanged(ArrayList messages) { + callingListAdapter.notifyDataSetChanged(); + //当列表下部稍微多出一些,自动上移 + if (callListRecyclerView.computeVerticalScrollRange() + - callListRecyclerView.computeVerticalScrollExtent() + - callListRecyclerView.computeVerticalScrollOffset() < 500) { + callListRecyclerView.scrollToPosition(callingListAdapter.getItemCount() - 1); + } + } + }); + + //观察UTC时间 + mainViewModel.timerSec.observe(getViewLifecycleOwner(), new Observer() { + @Override + public void onChanged(Long aLong) { + binding.timerTextView.setText(UtcTimer.getTimeStr(aLong)); + } + }); + + //观察时间偏移 + mainViewModel.mutableTimerOffset.observe(getViewLifecycleOwner(), new Observer() { + @SuppressLint("DefaultLocale") + @Override + public void onChanged(Float aFloat) { + binding.timeOffsetTextView.setText(String.format( + getString(R.string.average_offset_seconds), aFloat)); + } + }); + + //显示梅登海德网格 + GeneralVariables.mutableMyMaidenheadGrid.observe(getViewLifecycleOwner(), new Observer() { + @Override + public void onChanged(String s) { + binding.maidenheadTextView.setText(String.format( + getString(R.string.my_grid), s)); + } + }); + + //观察是否处于解码状态 + mainViewModel.mutableIsDecoding.observe(getViewLifecycleOwner(), new Observer() { + @Override + public void onChanged(Boolean aBoolean) { + if (aBoolean) { + binding.isDecodingTextView.setText(getString(R.string.decoding)); + } + } + }); + + //观察解码的时长 + mainViewModel.ft8SignalListener.decodeTimeSec.observe(getViewLifecycleOwner(), new Observer() { + @SuppressLint("DefaultLocale") + @Override + public void onChanged(Long aLong) { + binding.isDecodingTextView.setText(String.format( + getString(R.string.decoding_takes_milliseconds), aLong)); + } + }); + + //以闪烁动画的方式显示录音状态 + mainViewModel.mutableIsRecording.observe(getViewLifecycleOwner(), new Observer() { + @Override + public void onChanged(Boolean aBoolean) { + if (aBoolean) { + binding.timerImageButton.setImageResource(R.drawable.ic_baseline_mic_red_48); + binding.timerImageButton.setAnimation(AnimationUtils.loadAnimation(getContext() + , R.anim.view_blink)); + } else { + if (mainViewModel.hamRecorder.isRunning()) { + binding.timerImageButton.setImageResource(R.drawable.ic_baseline_mic_48); + } else { + binding.timerImageButton.setImageResource(R.drawable.ic_baseline_mic_off_48); + } + binding.timerImageButton.setAnimation(null); + } + } + }); + + //切换精简模式和标准模式 + binding.callingListToolsBar.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + GeneralVariables.simpleCallItemMode=!GeneralVariables.simpleCallItemMode; + callListRecyclerView.setAdapter(callingListAdapter); + callingListAdapter.notifyDataSetChanged(); + callListRecyclerView.scrollToPosition(callingListAdapter.getItemCount() - 1); + if (GeneralVariables.simpleCallItemMode){ + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.message_list_simple_mode)); + }else { + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.message_list_standard_mode)); + } + } + }); + + return binding.getRoot(); + } + + /** + * 设置列表滑动动作 + */ + private void initRecyclerViewAction() { + new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(ItemTouchHelper.ANIMATION_TYPE_DRAG + , ItemTouchHelper.START | ItemTouchHelper.END) { + @Override + public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder + , @NonNull RecyclerView.ViewHolder target) { + return false; + } + + //@RequiresApi(api = Build.VERSION_CODES.N) + @SuppressLint("NotifyDataSetChanged") + @Override + public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) { + if (direction == ItemTouchHelper.START) {//呼叫 + Ft8Message message = callingListAdapter.getMessageByViewHolder(viewHolder); + if (message != null) { + //呼叫的目标不能是自己 + if (!message.getCallsignFrom().equals("<...>") + //&& !message.getCallsignFrom().equals(GeneralVariables.myCallsign) + && !GeneralVariables.checkIsMyCallsign(message.getCallsignFrom()) + && !(message.i3 == 0 && (message.n3 == 0 || message.n3 == 5))) {//遥测和自由文本不能呼叫 + doCallNow(message); + } else { + callingListAdapter.notifyItemChanged(viewHolder.getAdapterPosition()); + } + } + } + if (direction == ItemTouchHelper.END) {//删除 + callingListAdapter.deleteMessage(viewHolder.getAdapterPosition()); + callingListAdapter.notifyItemRemoved(viewHolder.getAdapterPosition()); + } + + + } + + @Override + public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView + , @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY + , int actionState, boolean isCurrentlyActive) { + super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive); + //制作呼叫背景的图标显示 + final Drawable callIcon = ContextCompat.getDrawable(requireActivity() + , R.drawable.ic_baseline_send_red_48); + final Drawable delIcon = ContextCompat.getDrawable(requireActivity() + , R.drawable.log_item_delete_icon); + final Drawable background = new ColorDrawable(Color.LTGRAY); + Ft8Message message = callingListAdapter.getMessageByViewHolder(viewHolder); + if (message == null) { + return; + } + if (message.getCallsignFrom().equals("<...>")) {//如果属于不能呼叫的消息,就不显示图标 + return; + } + Drawable icon; + if (dX > 0) { + icon = delIcon; + } else { + icon = callIcon; + } + View itemView = viewHolder.itemView; + int iconMargin = (itemView.getHeight() - icon.getIntrinsicHeight()) / 2; + int iconLeft, iconRight, iconTop, iconBottom; + int backTop, backBottom, backLeft, backRight; + backTop = itemView.getTop(); + backBottom = itemView.getBottom(); + iconTop = itemView.getTop() + (itemView.getHeight() - icon.getIntrinsicHeight()) / 2; + iconBottom = iconTop + icon.getIntrinsicHeight(); + if (dX > 0) { + backLeft = itemView.getLeft(); + backRight = itemView.getLeft() + (int) dX; + background.setBounds(backLeft, backTop, backRight, backBottom); + iconLeft = itemView.getLeft() + iconMargin; + iconRight = iconLeft + icon.getIntrinsicWidth(); + icon.setBounds(iconLeft, iconTop, iconRight, iconBottom); + } else if (dX < 0) { + backRight = itemView.getRight(); + backLeft = itemView.getRight() + (int) dX; + background.setBounds(backLeft, backTop, backRight, backBottom); + iconRight = itemView.getRight() - iconMargin; + iconLeft = iconRight - icon.getIntrinsicWidth(); + icon.setBounds(iconLeft, iconTop, iconRight, iconBottom); + } else { + background.setBounds(0, 0, 0, 0); + icon.setBounds(0, 0, 0, 0); + } + background.draw(c); + icon.draw(c); + + } + }).attachToRecyclerView(binding.callingListRecyclerView); + } + + /** + * 马上对发起者呼叫 + * + * @param message 消息 + */ + //@RequiresApi(api = Build.VERSION_CODES.N) + private boolean doCallNow(Ft8Message message) { + + mainViewModel.addFollowCallsign(message.getCallsignFrom()); + if (!mainViewModel.ft8TransmitSignal.isActivated()) { + mainViewModel.ft8TransmitSignal.setActivated(true); + GeneralVariables.transmitMessages.add(message);//把消息添加到关注列表中 + } + //呼叫发启者 + mainViewModel.ft8TransmitSignal.setTransmit(message.getFromCallTransmitCallsign() + , 1, message.extraInfo); + mainViewModel.ft8TransmitSignal.transmitNow(); + GeneralVariables.resetLaunchSupervision();//复位自动监管 + navigateToMyCallFragment();//跳转到发射界面 + return true; + } + + /** + * 跳转到日志查询界面 + * @param callsign 呼号 + */ + private void navigateToLogFragment(String callsign){ + mainViewModel.queryKey=callsign;//把呼号作为关键字提交 + NavController navController = Navigation.findNavController(requireActivity() + , R.id.fragmentContainerView); + navController.navigate(R.id.action_menu_nav_calling_list_to_menu_nav_history);//跳转到日志 + } + + /** + * 跳转到发射界面 + */ + private void navigateToMyCallFragment() { + NavController navController = Navigation.findNavController(requireActivity() + , R.id.fragmentContainerView); + navController.navigate(R.id.action_menu_nav_calling_list_to_menu_nav_mycalling);//跳转到发射界面 + } + + /** + * 菜单选项 + * + * @param item 菜单 + * @return 是否 + */ + //@RequiresApi(api = Build.VERSION_CODES.N) + @Override + public boolean onContextItemSelected(@NonNull MenuItem item) { + + //Ft8Message ft8Message = (Ft8Message) item.getActionView().getTag(); + int position = (int) item.getActionView().getTag(); + Ft8Message ft8Message = callingListAdapter.getMessageByPosition(position); + if (ft8Message == null) return super.onContextItemSelected(item); + ; + switch (item.getItemId()) { + case 0: + Log.d(TAG, "关注:" + ft8Message.getCallsignTo()); + mainViewModel.addFollowCallsign(ft8Message.getCallsignTo()); + GeneralVariables.transmitMessages.add(ft8Message);//把消息添加到关注列表中 + break; + case 1://时序与发送者相反!!! + Log.d(TAG, "呼叫:" + ft8Message.getCallsignTo()); + mainViewModel.addFollowCallsign(ft8Message.getCallsignTo()); + if (!mainViewModel.ft8TransmitSignal.isActivated()) { + mainViewModel.ft8TransmitSignal.setActivated(true); + GeneralVariables.transmitMessages.add(ft8Message);//把消息添加到关注列表中 + GeneralVariables.resetLaunchSupervision();//复位自动监管 + } + //呼叫被呼叫对象 + mainViewModel.ft8TransmitSignal.setTransmit(ft8Message.getToCallTransmitCallsign() + , 1, ft8Message.extraInfo); + mainViewModel.ft8TransmitSignal.transmitNow(); + + navigateToMyCallFragment();//跳转到发射界面 + break; + case 2: + Log.d(TAG, "关注:" + ft8Message.getCallsignFrom()); + mainViewModel.addFollowCallsign(ft8Message.getCallsignFrom()); + GeneralVariables.transmitMessages.add(ft8Message);//把消息添加到关注列表中 + break; + case 3: + Log.d(TAG, "呼叫:" + ft8Message.getCallsignFrom()); + doCallNow(ft8Message); + break; + + case 4://回复 + Log.d(TAG, "回复:" + ft8Message.getCallsignFrom()); + mainViewModel.addFollowCallsign(ft8Message.getCallsignFrom()); + if (!mainViewModel.ft8TransmitSignal.isActivated()) { + mainViewModel.ft8TransmitSignal.setActivated(true); + GeneralVariables.transmitMessages.add(ft8Message);//把消息添加到关注列表中 + } + //呼叫发启者 + mainViewModel.ft8TransmitSignal.setTransmit(ft8Message.getFromCallTransmitCallsign() + , -1, ft8Message.extraInfo); + mainViewModel.ft8TransmitSignal.transmitNow(); + GeneralVariables.resetLaunchSupervision();//复位自动监管 + navigateToMyCallFragment();//跳转到发射界面 + break; + case 5://to 的QRZ + showQrzFragment(ft8Message.getCallsignTo()); + break; + case 6://from 的QRZ + showQrzFragment(ft8Message.getCallsignFrom()); + break; + case 7://查to的日志 + navigateToLogFragment(ft8Message.getCallsignTo()); + break; + case 8://查from的日志 + navigateToLogFragment(ft8Message.getCallsignFrom()); + break; + + } + + return super.onContextItemSelected(item); + } + + /** + * 显示QRZ查询界面 + * + * @param callsign 呼号 + */ + private void showQrzFragment(String callsign) { + NavHostFragment navHostFragment = (NavHostFragment) requireActivity().getSupportFragmentManager().findFragmentById(R.id.fragmentContainerView); + assert navHostFragment != null;//断言不为空 + Bundle bundle = new Bundle(); + bundle.putString(QRZ_Fragment.CALLSIGN_PARAM, callsign); + navHostFragment.getNavController().navigate(R.id.QRZ_Fragment, bundle); + } + + @Override + public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { + super.onCreateOptionsMenu(menu, inflater); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + binding = null; + } +} \ No newline at end of file diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/ClearCacheDataDialog.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/ClearCacheDataDialog.java new file mode 100644 index 00000000..86ec2edf --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/ClearCacheDataDialog.java @@ -0,0 +1,234 @@ +package com.bg7yoz.ft8cn.ui; +/** + * 清除缓存的对话框。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.app.Activity; +import android.app.Dialog; +import android.content.Context; +import android.content.Intent; +import android.content.res.AssetManager; +import android.net.Uri; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.view.WindowManager; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.ScrollView; +import android.widget.TextView; + +import androidx.annotation.NonNull; + +import com.bg7yoz.ft8cn.BuildConfig; +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.database.DatabaseOpr; +import com.bg7yoz.ft8cn.database.OnAfterQueryFollowCallsigns; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Timer; +import java.util.TimerTask; + +public class ClearCacheDataDialog extends Dialog { + public static enum CACHE_MODE {FOLLOW_DATA, SWL_MSG,SWL_QSO} + + private static final String TAG = "HelpDialog"; + private final Context context; + private final Activity activity; + private ImageView upImageView; + private ImageView downImageView; + private ScrollView scrollView; + private TextView cacheHelpMessage; + private TextView appNameTextView; + private TextView buildVersionTextView; + private CACHE_MODE cache_mode; + private DatabaseOpr db; + private final Timer timer = new Timer(); + + private TimerTask timeEvent() { + return new TimerTask() { + @Override + public void run() { + //心跳动作 + //doHeartBeatEvent(onUtcTimer); + activity.runOnUiThread(new Runnable() { + @Override + public void run() { + setImageVisible(); + } + }); + + } + }; + } + + + public ClearCacheDataDialog(@NonNull Context context, Activity activity, DatabaseOpr db, CACHE_MODE cache_mode) { + super(context, R.style.HelpDialog); + this.context = context; + this.activity = activity; + this.cache_mode = cache_mode; + this.db=db; + } + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.clear_cache_dialog_layout); + cacheHelpMessage = (TextView) findViewById(R.id.cacheHelpMessage); + appNameTextView = (TextView) findViewById(R.id.appNameTextView); + buildVersionTextView = (TextView) findViewById(R.id.buildVersionTextView); + //cacheHelpMessage.setText(msg); + upImageView = (ImageView) findViewById(R.id.scrollUpImageView); + downImageView = (ImageView) findViewById(R.id.scrollDownImageView); + scrollView = (ScrollView) findViewById(R.id.helpScrollView); + upImageView.setVisibility(View.INVISIBLE); + downImageView.setVisibility(View.INVISIBLE); + appNameTextView.setText(GeneralVariables.getStringFromResource(R.string.app_name)); + buildVersionTextView.setText(BuildConfig.VERSION_NAME); + + Button cancelButton=(Button) findViewById(R.id.cancelClearButton); + cancelButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + dismiss(); + } + }); + + StringBuilder msg = new StringBuilder(); + if (cache_mode == CACHE_MODE.FOLLOW_DATA) { + msg.append(GeneralVariables.getStringFromResource(R.string.html_tracking_callsign)); + for (int i = 0; i < GeneralVariables.followCallsign.size(); i++) { + msg.append("\n" + GeneralVariables.followCallsign.get(i)); + } + cacheHelpMessage.setText(msg.toString()); + } + //解码的消息 + if (cache_mode==CACHE_MODE.SWL_MSG){ + db.getMessageLogTotal(new OnAfterQueryFollowCallsigns() { + @Override + public void doOnAfterQueryFollowCallsigns(ArrayList callsigns) { + StringBuilder msg=new StringBuilder(); + msg.append(GeneralVariables.getStringFromResource(R.string.log_statistics_decode_msg)); + for (int i = 0; i callsigns) { + StringBuilder msg=new StringBuilder(); + msg.append(GeneralVariables.getStringFromResource(R.string.log_statistics_swl_qso)); + for (int i = 0; i height) { + params.width = (int) (width * 0.6); + params.height = (int) (height * 0.9); + } else { + params.width = (int) (width * 0.8); + params.height = (int) (height * 0.5); + } + getWindow().setAttributes(params); + + } + + + public String getTextFromAssets(String fileName) { + AssetManager assetManager = context.getAssets(); + try { + InputStream inputStream = assetManager.open(fileName); + byte[] bytes = new byte[inputStream.available()]; + inputStream.read(bytes); + inputStream.close(); + + return new String(bytes); + + } catch (IOException e) { + e.printStackTrace(); + return null; + } + } + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/ColumnarView.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/ColumnarView.java new file mode 100644 index 00000000..470feb54 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/ColumnarView.java @@ -0,0 +1,164 @@ +package com.bg7yoz.ft8cn.ui; + +import static android.graphics.Bitmap.Config.ARGB_8888; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.LinearGradient; +import android.graphics.Paint; +import android.graphics.PorterDuff; +import android.graphics.Rect; +import android.graphics.Shader; +import android.util.AttributeSet; +import android.view.View; + +import java.util.ArrayList; +import java.util.List; + +/** + * 柱状频谱图。 + * @author BGY70Z + * @date 2023-03-20 + */ +public class ColumnarView extends View { + private static final String TAG = "ColumnarView"; + //每一个能量柱的宽度 + private int width; + //每一个能量柱之间的间距 + private final int spacing = 1; + //能量块高度 + private final int blockHeight = 5; + //能量块下将速度 + private int blockSpeed = 5; + //能量块与能量柱之间的距离 + private final int distance = 2; + + private boolean drawblock = false; + private final Paint paint = new Paint(); + private final List newData = new ArrayList<>(); + private final List blockData = new ArrayList<>(); + + private Bitmap lastBitMap=null; + private Canvas _canvas; + private Paint linePaint; + private int touch_x = -1; + private Paint touchPaint; + private int freq_hz=-1; + + public void setBlockSpeed(int blockSpeed) { + this.blockSpeed = blockSpeed; + } + + public ColumnarView(Context context) { + super(context); + + } + + public ColumnarView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public ColumnarView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + public void setShowBlock(boolean showBlock) { + drawblock = showBlock; + } + + public void setWaveData(int[] data) { + if (data == null) { + return; + } + if (data.length <= 0) { + return; + } + width = getWidth() / (data.length / 2);// 960/2=480,480比较合理,906无法显示了。 + if (drawblock) {//是否显示能量块 + if (newData.size() > 0) { + if (blockData.size() == 0 || newData.size() != blockData.size()) { + blockData.clear(); + for (int i = 0; i < data.length / 2; i++) { + Rect blockRect = new Rect(); + blockRect.top =getHeight()- blockHeight; + blockRect.bottom = getHeight(); + blockData.add(blockRect); + } + } + for (int i = 0; i < blockData.size(); i++) { + blockData.get(i).left = newData.get(i).left; + blockData.get(i).right = newData.get(i).right; + if (newData.get(i).top < blockData.get(i).top) { + blockData.get(i).top = newData.get(i).top - blockHeight - distance; + } else { + blockData.get(i).top = blockData.get(i).top + blockSpeed; + } + blockData.get(i).bottom = blockData.get(i).top + blockHeight; + } + } + } + newData.clear(); + float rateHeight = 0.95f * getHeight() / 256;//0.95是比率,柱形的最大高度不超过95% + for (int i = 0; i < data.length / 2; i++) { + Rect colRect = new Rect(); + if (newData.size() == 0) { + colRect.left = 0; + } else { + colRect.left = i * getWidth() / (data.length / 2); + } + colRect.top = getHeight() - Math.round(Math.max(data[i], data[i + 1]) * rateHeight); + colRect.right = colRect.left + width - spacing; + colRect.bottom = getHeight(); + newData.add(colRect); + } + } + + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + setClickable(true); + super.onSizeChanged(w, h, oldw, oldh); + + lastBitMap= Bitmap.createBitmap(w,h, ARGB_8888); + _canvas=new Canvas(lastBitMap); + LinearGradient linearGradient=new LinearGradient(0f, 0f, 0f, getHeight(), + new int[]{0xff00ffff,0xff00ffff, Color.BLUE} + , new float[]{0f, 0.6f, 1f}, Shader.TileMode.CLAMP); + paint.setShader(linearGradient); + linePaint = new Paint(); + linePaint.setColor(0xff990000); + touchPaint = new Paint(); + touchPaint.setColor(0xff00ffff); + touchPaint.setStrokeWidth(2); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + _canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); + for (int i = 0; i < newData.size(); i++) { + _canvas.drawRect(newData.get(i), paint); + } + if (drawblock) { + for (int i = 0; i < blockData.size(); i++) { + _canvas.drawRect(blockData.get(i), paint); + } + } + canvas.drawBitmap(lastBitMap,0,0,null); + if (touch_x>0) { + //计算频率 + freq_hz = Math.round(3000f * (float) touch_x / (float) getWidth()); + canvas.drawLine(touch_x, 0, touch_x, getHeight(), touchPaint); + } + invalidate(); + } + public void setTouch_x(int touch_x) { + this.touch_x = touch_x; + } + + public int getFreq_hz() { + return freq_hz; + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/ConfigFragment.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/ConfigFragment.java new file mode 100644 index 00000000..eb9aee72 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/ConfigFragment.java @@ -0,0 +1,1710 @@ +package com.bg7yoz.ft8cn.ui; +/** + * 设置界面。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.annotation.SuppressLint; +import android.content.Intent; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.text.Editable; +import android.text.TextWatcher; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.CompoundButton; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.lifecycle.Observer; + +import com.bg7yoz.ft8cn.FAQActivity; +import com.bg7yoz.ft8cn.Ft8Message; +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.MainViewModel; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.connector.ConnectMode; +import com.bg7yoz.ft8cn.database.ControlMode; +import com.bg7yoz.ft8cn.database.OperationBand; +import com.bg7yoz.ft8cn.database.RigNameList; +import com.bg7yoz.ft8cn.databinding.FragmentConfigBinding; +import com.bg7yoz.ft8cn.ft8signal.FT8Package; +import com.bg7yoz.ft8cn.log.ThirdPartyService; +import com.bg7yoz.ft8cn.maidenhead.MaidenheadGrid; +import com.bg7yoz.ft8cn.rigs.InstructionSet; +import com.bg7yoz.ft8cn.timer.UtcTimer; + +import java.io.IOException; + +/** + * A simple {@link Fragment} subclass. + * create an instance of this fragment. + */ +public class ConfigFragment extends Fragment { + private static final String TAG = "ConfigFragment"; + private MainViewModel mainViewModel; + private FragmentConfigBinding binding; + private BandsSpinnerAdapter bandsSpinnerAdapter; + private BauRateSpinnerAdapter bauRateSpinnerAdapter; + private SerialDataBitsSpinnerAdapter dataBitsSpinnerAdapter; + private SerialParityBitsSpinnerAdapter parityBitsSpinnerAdapter; + private SerialStopBitsSpinnerAdapter stopBitsSpinnerAdapter; + private RigNameSpinnerAdapter rigNameSpinnerAdapter; + private LaunchSupervisionSpinnerAdapter launchSupervisionSpinnerAdapter; + private PttDelaySpinnerAdapter pttDelaySpinnerAdapter; + private NoReplyLimitSpinnerAdapter noReplyLimitSpinnerAdapter; + //private SerialPortSpinnerAdapter serialPortSpinnerAdapter; + + public ConfigFragment() { + // Required empty public constructor + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + + //我的网格位置 + private final TextWatcher onGridEditorChanged = new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + //String s = ""; + StringBuilder s=new StringBuilder(); + for (int j = 0; j < binding.inputMyGridEdit.getText().length(); j++) { + if (j < 2) { + //s = s + Character.toUpperCase(binding.inputMyGridEdit.getText().charAt(j)); + s.append(Character.toUpperCase(binding.inputMyGridEdit.getText().charAt(j))); + } else { + //s = s + Character.toLowerCase(binding.inputMyGridEdit.getText().charAt(j)); + s.append(Character.toLowerCase(binding.inputMyGridEdit.getText().charAt(j))); + } + } + writeConfig("grid", s.toString()); + GeneralVariables.setMyMaidenheadGrid(s.toString()); + } + }; + //我的呼号 + private final TextWatcher onMyCallEditorChanged = new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + writeConfig("callsign", editable.toString().toUpperCase().trim()); + String callsign = editable.toString().toUpperCase().trim(); + if (callsign.length() > 0) { + Ft8Message.hashList.addHash(FT8Package.getHash22(callsign), callsign); + Ft8Message.hashList.addHash(FT8Package.getHash12(callsign), callsign); + Ft8Message.hashList.addHash(FT8Package.getHash10(callsign), callsign); + } + GeneralVariables.myCallsign = (editable.toString().toUpperCase().trim()); + } + }; + //发射频率 + private final TextWatcher onFreqEditorChanged = new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + setfreq(editable.toString()); + } + }; + //发射延迟时间 + private final TextWatcher onTransDelayEditorChanged = new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + int transDelay = 1000; + if (editable.toString().matches("^\\d{1,4}$")) { + transDelay = Integer.parseInt(editable.toString()); + } + GeneralVariables.transmitDelay = transDelay; + mainViewModel.ft8TransmitSignal.setTimer_sec(GeneralVariables.transmitDelay); + writeConfig("transDelay", Integer.toString(transDelay)); + } + }; + + + // Cloudlog地址 + private final TextWatcher onCloudlogAddressChanged=new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + GeneralVariables.cloudlogServerAddress = editable.toString(); + writeConfig("cloudlogServerAddress", GeneralVariables.getCloudlogServerAddress()); + } + }; + + // Cloudlog APIKEY + private final TextWatcher onCloudlogApiKeyChanged=new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + GeneralVariables.cloudlogApiKey = editable.toString(); + writeConfig("cloudlogApiKey", GeneralVariables.getCloudlogServerApiKey()); + } + }; + + // Cloudlog地址 + private final TextWatcher onCloudlogStationIDChanged=new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + GeneralVariables.cloudlogStationID = editable.toString(); + writeConfig("cloudlogStationID", GeneralVariables.getCloudlogStationID()); + } + }; + + // qrz的api + private final TextWatcher onQrzApiKeyChanged=new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + GeneralVariables.qrzApiKey = editable.toString(); + writeConfig("qrzApiKey", GeneralVariables.getQrzApiKey()); + } + }; + + + //排除的呼号前缀 + private final TextWatcher onExcludedCallsigns=new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + GeneralVariables.addExcludedCallsigns(editable.toString()); + writeConfig("excludedCallsigns", GeneralVariables.getExcludeCallsigns()); + } + }; + + //修饰符 + private final TextWatcher onModifierEditorChanged = new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + if (editable.toString().toUpperCase().trim().matches("[0-9]{3}|[A-Z]{1,4}") + ||editable.toString().trim().length()==0){ + binding.modifierEdit.setTextColor(requireContext().getColor(R.color.text_view_color)); + GeneralVariables.toModifier=editable.toString().toUpperCase().trim(); + writeConfig("toModifier", GeneralVariables.toModifier); + }else{ + binding.modifierEdit.setTextColor(requireContext().getColor(R.color.text_view_error_color)); + } + } + }; + + //CI-V地址 + private final TextWatcher onCIVAddressEditorChanged = new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + if (editable.toString().length() < 2) { + return; + } + String s = "0x" + editable.toString(); + if (s.matches("\\b0[xX][0-9a-fA-F]+\\b")) {//匹配十六进制 + String temp = editable.toString().substring(0, 2).toUpperCase(); + writeConfig("civ", temp); + GeneralVariables.civAddress = Integer.parseInt(temp, 16); + mainViewModel.setCivAddress(); + } + } + }; + + + @SuppressLint("DefaultLocale") + private void setfreq(String sFreq) { + float freq; + try { + freq = Float.parseFloat(sFreq); + if (freq < 100) { + freq = 100; + } + if (freq > 2900) { + freq = 2900; + } + } catch (Exception e + ) { + freq = 1000; + } + + + writeConfig("freq", String.format("%.0f", freq)); + GeneralVariables.setBaseFrequency(freq); + } + + @SuppressLint("SetTextI18n") + @Override + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + mainViewModel = MainViewModel.getInstance(this); + binding = FragmentConfigBinding.inflate(inflater, container, false); + + + //设置时间偏移 + setUtcTimeOffsetSpinner(); + + //设置PTT延时 + setPttDelaySpinner(); + + //设置操作频段 + setBandsSpinner(); + + //设置波特率列表 + setBauRateSpinner(); + + //设置数据位列表 + setDataBitsSpinner(); + + //设置校验位 + setParityBitsSpinner(); + + //设置停止位 + setStopBitsSpinner(); + + //设置电台名称,参数列表 + setRigNameSpinner(); + + //设置解码模式 + setDecodeMode(); + + //设置音频输出的位数 + setAudioOutputBitsMode(); + + //设置音频输出采样率 + setAudioOutputRateMode(); + + //设置显示消息模式 + setMessageMode(); + + //设置控制模式 VOX CAT + setControlMode(); + + //设置连线的方式 + setConnectMode(); + + //设置发射监管列表 + setLaunchSupervision(); + + //设置帮助对话框 + setHelpDialog(); + + //设置无回应次数中断 + setNoReplyLimitSpinner(); + + //设置各个spinner的OnItemSelected事件 + setSpinnerOnItemSelected(); + + //显示滚动箭头 + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + setScrollImageVisible(); + } + }, 1000); + binding.scrollView3.setOnScrollChangeListener(new View.OnScrollChangeListener() { + @Override + public void onScrollChange(View view, int i, int i1, int i2, int i3) { + setScrollImageVisible(); + } + }); + + //FAQ按钮的onClick + binding.faqButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Intent intent = new Intent(requireContext(), FAQActivity.class); + startActivity(intent); + } + }); + + //梅登海德网格 + binding.inputMyGridEdit.removeTextChangedListener(onGridEditorChanged); + binding.inputMyGridEdit.setText(GeneralVariables.getMyMaidenheadGrid()); + binding.inputMyGridEdit.addTextChangedListener(onGridEditorChanged); + + //我的呼号 + binding.inputMycallEdit.removeTextChangedListener(onMyCallEditorChanged); + binding.inputMycallEdit.setText(GeneralVariables.myCallsign); + binding.inputMycallEdit.addTextChangedListener(onMyCallEditorChanged); + + //修饰符 + binding.modifierEdit.removeTextChangedListener(onModifierEditorChanged); + binding.modifierEdit.setText(GeneralVariables.toModifier); + binding.modifierEdit.addTextChangedListener(onModifierEditorChanged); + + //发射频率 + binding.inputFreqEditor.removeTextChangedListener(onFreqEditorChanged); + binding.inputFreqEditor.setText(GeneralVariables.getBaseFrequencyStr()); + binding.inputFreqEditor.addTextChangedListener(onFreqEditorChanged); + + + + //CIV地址 + binding.civAddressEdit.removeTextChangedListener(onCIVAddressEditorChanged); + binding.civAddressEdit.setText(GeneralVariables.getCivAddressStr()); + binding.civAddressEdit.addTextChangedListener(onCIVAddressEditorChanged); + + //发射延迟 + binding.inputTransDelayEdit.removeTextChangedListener(onTransDelayEditorChanged); + binding.inputTransDelayEdit.setText(GeneralVariables.getTransmitDelayStr()); + binding.inputTransDelayEdit.addTextChangedListener(onTransDelayEditorChanged); + + binding.excludedCallsignEdit.removeTextChangedListener(onExcludedCallsigns); + binding.excludedCallsignEdit.setText(GeneralVariables.getExcludeCallsigns()); + binding.excludedCallsignEdit.addTextChangedListener(onExcludedCallsigns); + + // cloudlog相关配置 + binding.cloudlogServerAddressEdit.removeTextChangedListener(onCloudlogAddressChanged); + binding.cloudlogServerAddressEdit.setText(GeneralVariables.getCloudlogServerAddress()); + binding.cloudlogServerAddressEdit.addTextChangedListener(onCloudlogAddressChanged); + + binding.cloudlogServerApiKeyEdit.removeTextChangedListener(onCloudlogApiKeyChanged); + binding.cloudlogServerApiKeyEdit.setText(GeneralVariables.getCloudlogServerApiKey()); + binding.cloudlogServerApiKeyEdit.addTextChangedListener(onCloudlogApiKeyChanged); + + binding.cloudlogStationIdEdit.removeTextChangedListener(onCloudlogStationIDChanged); + binding.cloudlogStationIdEdit.setText(GeneralVariables.getCloudlogStationID()); + binding.cloudlogStationIdEdit.addTextChangedListener(onCloudlogStationIDChanged); + + // qrz相关配置 + binding.qrzApiKeyTextEdit.removeTextChangedListener(onQrzApiKeyChanged); + binding.qrzApiKeyTextEdit.setText(GeneralVariables.getQrzApiKey()); + binding.qrzApiKeyTextEdit.addTextChangedListener(onQrzApiKeyChanged); + + + //设置同频发射开关 + binding.synFrequencySwitch.setOnCheckedChangeListener(null); + binding.synFrequencySwitch.setChecked(GeneralVariables.synFrequency); + setSyncFreqText();//设置开关的文本 + binding.synFrequencySwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean b) { + if (binding.synFrequencySwitch.isChecked()) { + mainViewModel.databaseOpr.writeConfig("synFreq", "1", null); + } else { + mainViewModel.databaseOpr.writeConfig("synFreq", "0", null); + setfreq(binding.inputFreqEditor.getText().toString()); + } + GeneralVariables.synFrequency = binding.synFrequencySwitch.isChecked(); + setSyncFreqText(); + binding.inputFreqEditor.setEnabled(!binding.synFrequencySwitch.isChecked()); + } + }); + + //设置PTT延迟 + binding.pttDelayOffsetSpinner.setSelection(GeneralVariables.pttDelay / 10); + //获取操作的波段 + binding.operationBandSpinner.setSelection(GeneralVariables.bandListIndex); + //获取电台型号 + binding.rigNameSpinner.setSelection(GeneralVariables.modelNo); + //串口数据位 + binding.dataBitsSpinner.setSelection(dataBitsSpinnerAdapter.getPosition(GeneralVariables.serialDataBits)); + //串口停止位 + binding.stopBitsSpinner.setSelection(stopBitsSpinnerAdapter.getPosition(GeneralVariables.serialStopBits)); + binding.parityBitsSpinner.setSelection(parityBitsSpinnerAdapter.getPosition(GeneralVariables.serialParity)); + //获取波特率 + binding.baudRateSpinner.setSelection(bauRateSpinnerAdapter.getPosition( + GeneralVariables.baudRate)); + //设置发射监管 + binding.launchSupervisionSpinner.setSelection(launchSupervisionSpinnerAdapter + .getPosition(GeneralVariables.launchSupervision)); + //设置无回应中断 + binding.noResponseCountSpinner.setSelection(GeneralVariables.noReplyLimit); + + + //设置自动关注CQ + binding.followCQSwitch.setOnCheckedChangeListener(null); + binding.followCQSwitch.setChecked(GeneralVariables.autoFollowCQ); + setAutoFollowCQText(); + binding.followCQSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean b) { + GeneralVariables.autoFollowCQ = binding.followCQSwitch.isChecked(); + if (binding.followCQSwitch.isChecked()) { + mainViewModel.databaseOpr.writeConfig("autoFollowCQ", "1", null); + } else { + mainViewModel.databaseOpr.writeConfig("autoFollowCQ", "0", null); + } + setAutoFollowCQText(); + } + }); + + //设置swr告警开关 + binding.swrAlarmSwitch.setOnCheckedChangeListener(null); + binding.swrAlarmSwitch.setChecked(GeneralVariables.swr_switch_on); + setSwrAlarmSwitchText(); + binding.swrAlarmSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean b) { + GeneralVariables.swr_switch_on = binding.swrAlarmSwitch.isChecked(); + if (binding.swrAlarmSwitch.isChecked()) { + mainViewModel.databaseOpr.writeConfig("swrSwitch", "1", null); + } else { + mainViewModel.databaseOpr.writeConfig("swrSwitch", "0", null); + } + setSwrAlarmSwitchText(); + } + }); + + //设置alc告警开关 + binding.alcAlarmSwitch.setOnCheckedChangeListener(null); + binding.alcAlarmSwitch.setChecked(GeneralVariables.alc_switch_on); + setAlcAlarmSwitchText(); + binding.alcAlarmSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean b) { + GeneralVariables.alc_switch_on = binding.alcAlarmSwitch.isChecked(); + if (binding.alcAlarmSwitch.isChecked()) { + mainViewModel.databaseOpr.writeConfig("alcSwitch", "1", null); + } else { + mainViewModel.databaseOpr.writeConfig("alcSwitch", "0", null); + } + setAlcAlarmSwitchText(); + } + }); + + + + //设置自动呼叫关注的呼号 + binding.autoCallfollowSwitch.setOnCheckedChangeListener(null); + binding.autoCallfollowSwitch.setChecked(GeneralVariables.autoCallFollow); + setAutoCallFollow(); + binding.autoCallfollowSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean b) { + GeneralVariables.autoCallFollow = binding.autoCallfollowSwitch.isChecked(); + if (binding.autoCallfollowSwitch.isChecked()) { + mainViewModel.databaseOpr.writeConfig("autoCallFollow", "1", null); + } else { + mainViewModel.databaseOpr.writeConfig("autoCallFollow", "0", null); + } + setAutoCallFollow(); + } + }); + + //设置保存SWL选项 + binding.saveSWLSwitch.setOnCheckedChangeListener(null); + binding.saveSWLSwitch.setChecked(GeneralVariables.saveSWLMessage); + setSaveSwl(); + binding.saveSWLSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean b) { + GeneralVariables.saveSWLMessage = binding.saveSWLSwitch.isChecked(); + if (binding.saveSWLSwitch.isChecked()) { + mainViewModel.databaseOpr.writeConfig("saveSWL", "1", null); + } else { + mainViewModel.databaseOpr.writeConfig("saveSWL", "0", null); + } + setSaveSwl(); + } + }); + + //设置保存SWL选项 + binding.saveSWLQSOSwitch.setOnCheckedChangeListener(null); + binding.saveSWLQSOSwitch.setChecked(GeneralVariables.saveSWLMessage); + setSaveSwlQSO(); + binding.saveSWLQSOSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean b) { + GeneralVariables.saveSWL_QSO = binding.saveSWLQSOSwitch.isChecked(); + if (binding.saveSWLQSOSwitch.isChecked()) { + mainViewModel.databaseOpr.writeConfig("saveSWLQSO", "1", null); + } else { + mainViewModel.databaseOpr.writeConfig("saveSWLQSO", "0", null); + } + setSaveSwlQSO(); + } + }); + + //设置保存Cloudlog选项 + binding.enableCloudlogSwitch.setOnCheckedChangeListener(null); + binding.enableCloudlogSwitch.setChecked(GeneralVariables.enableCloudlog); + binding.enableCloudlogSwitch.setText(GeneralVariables.getStringFromResource( + R.string.config_enable_cloudlog) + +(GeneralVariables.enableCloudlog?"(On)":"(Off)")); + binding.enableCloudlogSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean b) { + GeneralVariables.enableCloudlog = binding.enableCloudlogSwitch.isChecked(); + if (binding.enableCloudlogSwitch.isChecked()) { + mainViewModel.databaseOpr.writeConfig("enableCloudlog", "1", null); + } else { + mainViewModel.databaseOpr.writeConfig("enableCloudlog", "0", null); + } + binding.enableCloudlogSwitch.setText(GeneralVariables.getStringFromResource( + R.string.config_enable_cloudlog) + +(GeneralVariables.enableCloudlog?"(On)":"(Off)")); + } + }); + + //设置保存QRZ选项 + binding.enableQrzSwitch.setOnCheckedChangeListener(null); + binding.enableQrzSwitch.setChecked(GeneralVariables.enableQRZ); + binding.enableQrzSwitch.setText( + GeneralVariables.getStringFromResource(R.string.config_enable_qrz) + +(GeneralVariables.enableQRZ?"(On)":"(Off)")); + binding.enableQrzSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean b) { + GeneralVariables.enableQRZ = binding.enableQrzSwitch.isChecked(); + if (binding.enableQrzSwitch.isChecked()) { + mainViewModel.databaseOpr.writeConfig("enableQRZ", "1", null); + } else { + mainViewModel.databaseOpr.writeConfig("enableQRZ", "0", null); + } + binding.enableQrzSwitch.setText( + GeneralVariables.getStringFromResource(R.string.config_enable_qrz) + +(GeneralVariables.enableQRZ?"(On)":"(Off)")); + } + }); + + + //获取梅登海德网格 + binding.configGetGridImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + String grid = MaidenheadGrid.getMyMaidenheadGrid(getContext()); + if (!grid.equals("")) { + binding.inputMyGridEdit.setText(grid); + } + } + }); + + //串口默认值设置复位键 + binding.serialDefaultButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + GeneralVariables.serialParity = 0; + GeneralVariables.serialDataBits = 8; + GeneralVariables.serialStopBits = 1; + requireActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + binding.parityBitsSpinner.setSelection( + parityBitsSpinnerAdapter.getPosition(GeneralVariables.serialParity)); + binding.dataBitsSpinner.setSelection( + dataBitsSpinnerAdapter.getPosition(GeneralVariables.serialDataBits)); + binding.stopBitsSpinner.setSelection( + stopBitsSpinnerAdapter.getPosition(GeneralVariables.serialStopBits)); + } + }); + + } + }); + + + return binding.getRoot(); + } + + /** + * 设置各个spinner的OnItemSelected事件,防止在进入主界面时,重复向数据库写入配置信息 + */ + private void setSpinnerOnItemSelected(){ + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + binding.pttDelayOffsetSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView adapterView, View view, int i, long l) { + GeneralVariables.pttDelay = i * 10; + writeConfig("pttDelay", String.valueOf(GeneralVariables.pttDelay)); + } + + @Override + public void onNothingSelected(AdapterView adapterView) { + + } + }); + + binding.operationBandSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView adapterView, View view, int i, long l) { + GeneralVariables.bandListIndex = i; + GeneralVariables.band = OperationBand.getBandFreq(i);//把当前的频段保存下来 + + mainViewModel.databaseOpr.getAllQSLCallsigns();//通联成功的呼号读出来 + writeConfig("bandFreq", String.valueOf(GeneralVariables.band)); + if (GeneralVariables.controlMode == ControlMode.CAT//CAT、RTS、DTR模式下控制电台 + || GeneralVariables.controlMode == ControlMode.RTS + || GeneralVariables.controlMode == ControlMode.DTR) { + //如果在CAT、RTS模式下,修改电台的频率 + mainViewModel.setOperationBand(); + } + } + + @Override + public void onNothingSelected(AdapterView adapterView) { + + } + }); + + binding.rigNameSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView adapterView, View view, int i, long l) { + GeneralVariables.modelNo = i; + writeConfig("model", String.valueOf(i)); + setAddrAndBauRate(rigNameSpinnerAdapter.getRigName(i)); + + //指令集 + GeneralVariables.instructionSet = rigNameSpinnerAdapter.getRigName(i).instructionSet; + writeConfig("instruction", String.valueOf(GeneralVariables.instructionSet)); + } + + @Override + public void onNothingSelected(AdapterView adapterView) { + } + }); + + + binding.baudRateSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView adapterView, View view, int i, long l) { + GeneralVariables.baudRate = bauRateSpinnerAdapter.getValue(i); + writeConfig("baudRate", String.valueOf(GeneralVariables.baudRate)); + } + + @Override + public void onNothingSelected(AdapterView adapterView) { + } + }); + + + binding.launchSupervisionSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView adapterView, View view, int i, long l) { + GeneralVariables.launchSupervision = LaunchSupervisionSpinnerAdapter.getTimeOut(i); + writeConfig("launchSupervision", String.valueOf(GeneralVariables.launchSupervision)); + } + + @Override + public void onNothingSelected(AdapterView adapterView) { + + } + }); + + + binding.noResponseCountSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView adapterView, View view, int i, long l) { + GeneralVariables.noReplyLimit = i; + writeConfig("noReplyLimit", String.valueOf(GeneralVariables.noReplyLimit)); + } + + @Override + public void onNothingSelected(AdapterView adapterView) { + + } + }); + //串口数据位 + binding.dataBitsSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView adapterView, View view, int i, long l) { + GeneralVariables.serialDataBits = dataBitsSpinnerAdapter.getValue(i); + writeConfig("dataBits", String.valueOf(GeneralVariables.serialDataBits)); + } + + @Override + public void onNothingSelected(AdapterView adapterView) { + + } + }); + + //串口停止位 + binding.stopBitsSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView adapterView, View view, int i, long l) { + GeneralVariables.serialStopBits = stopBitsSpinnerAdapter.getValue(i); + writeConfig("stopBits", String.valueOf(GeneralVariables.serialStopBits)); + } + + @Override + public void onNothingSelected(AdapterView adapterView) { + + } + }); + + //校验位 + binding.parityBitsSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView adapterView, View view, int i, long l) { + GeneralVariables.serialParity = parityBitsSpinnerAdapter.getValue(i); + writeConfig("parityBits", String.valueOf(GeneralVariables.serialParity)); + } + + @Override + public void onNothingSelected(AdapterView adapterView) { + + } + }); + + } + }, 1000); + } + + /** + * 设置地址和波特率,指令集 + * + * @param rigName 电台型号 + */ + private void setAddrAndBauRate(RigNameList.RigName rigName) { + GeneralVariables.civAddress = rigName.address; + mainViewModel.setCivAddress(); + GeneralVariables.baudRate = rigName.bauRate; + binding.civAddressEdit.setText(String.format("%X", rigName.address)); + binding.baudRateSpinner.setSelection( + bauRateSpinnerAdapter.getPosition(rigName.bauRate)); + } + + + /** + * 设置同频发射开关的显示文本 + */ + private void setSyncFreqText() { + if (binding.synFrequencySwitch.isChecked()) { + binding.synFrequencySwitch.setText(getString(R.string.freq_syn)); + } else { + binding.synFrequencySwitch.setText(getString(R.string.freq_asyn)); + } + } + + /** + * 设置自动关注CQ开关的文本 + */ + private void setAutoFollowCQText() { + if (binding.followCQSwitch.isChecked()) { + binding.followCQSwitch.setText(getString(R.string.auto_follow_cq)); + } else { + binding.followCQSwitch.setText(getString(R.string.not_concerned_about_CQ)); + } + } + + /** + * 设置swr告警开关文本 + */ + private void setSwrAlarmSwitchText(){ + if (binding.swrAlarmSwitch.isChecked()){ + binding.swrAlarmSwitch.setText(R.string.swr_switch_on); + }else { + binding.swrAlarmSwitch.setText(R.string.swr_switch_off); + } + } + + /** + * 设置alc告警开关文本 + */ + private void setAlcAlarmSwitchText(){ + if (binding.alcAlarmSwitch.isChecked()){ + binding.alcAlarmSwitch.setText(R.string.alc_switch_on); + }else { + binding.alcAlarmSwitch.setText(R.string.alc_switch_off); + } + } + + //设置自动呼叫关注的呼号 + private void setAutoCallFollow() { + if (binding.autoCallfollowSwitch.isChecked()) { + binding.autoCallfollowSwitch.setText(getString(R.string.automatic_call_following)); + } else { + binding.autoCallfollowSwitch.setText(getString(R.string.do_not_call_the_following_callsign)); + } + } + private void setSaveSwl() { + if (binding.saveSWLSwitch.isChecked()) { + binding.saveSWLSwitch.setText(getString(R.string.config_save_swl)); + } else { + binding.saveSWLSwitch.setText(getString(R.string.config_donot_save_swl)); + } + } + private void setSaveSwlQSO() { + if (binding.saveSWLQSOSwitch.isChecked()) { + binding.saveSWLQSOSwitch.setText(getString(R.string.config_save_swl_qso)); + } else { + binding.saveSWLQSOSwitch.setText(getString(R.string.config_donot_save_swl_qso)); + } + } + /** + * 设置UTC时间偏移的spinner + */ + private void setUtcTimeOffsetSpinner() { + UtcOffsetSpinnerAdapter adapter = new UtcOffsetSpinnerAdapter(requireContext()); + + requireActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + binding.utcTimeOffsetSpinner.setAdapter(adapter); + adapter.notifyDataSetChanged(); + binding.utcTimeOffsetSpinner.setSelection((UtcTimer.delay / 100 + 75) / 5); + } + }); + binding.utcTimeOffsetSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView adapterView, View view, int i, long l) { + UtcTimer.delay = i * 500 - 7500;//设置延迟 + } + + @Override + public void onNothingSelected(AdapterView adapterView) { + + } + }); + } + + /** + * 设置操作频段的spinner + */ + private void setBandsSpinner() { + GeneralVariables.mutableBandChange.observe(getViewLifecycleOwner(), new Observer() { + @Override + public void onChanged(Integer integer) { + binding.operationBandSpinner.setSelection(integer); + } + }); + + + bandsSpinnerAdapter = new BandsSpinnerAdapter(requireContext()); + binding.operationBandSpinner.setAdapter(bandsSpinnerAdapter); + requireActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + bandsSpinnerAdapter.notifyDataSetChanged(); + } + }); + + } + + /** + * 设置波特率列表 + */ + private void setBauRateSpinner() { + bauRateSpinnerAdapter = new BauRateSpinnerAdapter(requireContext()); + binding.baudRateSpinner.setAdapter(bauRateSpinnerAdapter); + requireActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + bauRateSpinnerAdapter.notifyDataSetChanged(); + } + }); + } + + /** + * 设置数据位列表 + */ + private void setDataBitsSpinner(){ + dataBitsSpinnerAdapter = new SerialDataBitsSpinnerAdapter(requireContext()); + binding.dataBitsSpinner.setAdapter(dataBitsSpinnerAdapter); + requireActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + dataBitsSpinnerAdapter.notifyDataSetChanged(); + } + }); + } + + /** + * 设置校验位列表 + */ + private void setParityBitsSpinner(){ + parityBitsSpinnerAdapter = new SerialParityBitsSpinnerAdapter(requireContext()); + binding.parityBitsSpinner.setAdapter(parityBitsSpinnerAdapter); + requireActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + parityBitsSpinnerAdapter.notifyDataSetChanged(); + } + }); + } + /** + * 设置停止位列表 + */ + private void setStopBitsSpinner(){ + stopBitsSpinnerAdapter = new SerialStopBitsSpinnerAdapter(requireContext()); + binding.stopBitsSpinner.setAdapter(stopBitsSpinnerAdapter); + requireActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + stopBitsSpinnerAdapter.notifyDataSetChanged(); + } + }); + } + + + + /** + * 设置无回应次数中断 + */ + private void setNoReplyLimitSpinner() { + noReplyLimitSpinnerAdapter = new NoReplyLimitSpinnerAdapter(requireContext()); + binding.noResponseCountSpinner.setAdapter(noReplyLimitSpinnerAdapter); + requireActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + noReplyLimitSpinnerAdapter.notifyDataSetChanged(); + } + }); + } + + /** + * 设置发射监管列表 + */ + private void setLaunchSupervision() { + launchSupervisionSpinnerAdapter = new LaunchSupervisionSpinnerAdapter(requireContext()); + binding.launchSupervisionSpinner.setAdapter(launchSupervisionSpinnerAdapter); + requireActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + launchSupervisionSpinnerAdapter.notifyDataSetChanged(); + } + }); + } + + /** + * 设置电台名称,参数列表 + */ + private void setRigNameSpinner() { + rigNameSpinnerAdapter = new RigNameSpinnerAdapter(requireContext()); + binding.rigNameSpinner.setAdapter(rigNameSpinnerAdapter); + requireActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + rigNameSpinnerAdapter.notifyDataSetChanged(); + } + }); + + } + + /** + * 设置PTT延时 + */ + private void setPttDelaySpinner() { + pttDelaySpinnerAdapter = new PttDelaySpinnerAdapter(requireContext()); + binding.pttDelayOffsetSpinner.setAdapter(pttDelaySpinnerAdapter); + requireActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + pttDelaySpinnerAdapter.notifyDataSetChanged(); + binding.pttDelayOffsetSpinner.setSelection(GeneralVariables.pttDelay / 10); + } + }); + + + } + + + private void setDecodeMode() { + binding.decodeModeRadioGroup.clearCheck(); + binding.fastDecodeRadioButton.setChecked(!GeneralVariables.deepDecodeMode); + binding.deepDecodeRadioButton.setChecked(GeneralVariables.deepDecodeMode); + + View.OnClickListener listener = new View.OnClickListener() { + @Override + public void onClick(View view) { + int buttonId = binding.decodeModeRadioGroup.getCheckedRadioButtonId(); + GeneralVariables.deepDecodeMode= buttonId ==binding.deepDecodeRadioButton.getId(); + writeConfig("deepMode", GeneralVariables.deepDecodeMode? "1" : "0"); + } + }; + + binding.fastDecodeRadioButton.setOnClickListener(listener); + binding.deepDecodeRadioButton.setOnClickListener(listener); + + } + + + /** + * 设置音频输出的位数 + */ + private void setAudioOutputBitsMode() { + //binding.controlModeRadioGroup.setOnCheckedChangeListener(null); + binding.audioBitsRadioGroup.clearCheck(); + binding.audio32BitsRadioButton.setChecked(GeneralVariables.audioOutput32Bit); + binding.audio16BitsRadioButton.setChecked(!GeneralVariables.audioOutput32Bit); + + + + View.OnClickListener listener = new View.OnClickListener() { + @Override + public void onClick(View view) { + int buttonId = binding.audioBitsRadioGroup.getCheckedRadioButtonId(); + GeneralVariables.audioOutput32Bit= buttonId ==binding.audio32BitsRadioButton.getId(); + writeConfig("audioBits", GeneralVariables.audioOutput32Bit? "1" : "0"); + } + }; + + binding.audio32BitsRadioButton.setOnClickListener(listener); + binding.audio16BitsRadioButton.setOnClickListener(listener); + + } + + /** + * 输出音频的采样率设置 + */ + private void setAudioOutputRateMode() { + binding.audioRateRadioGroup.clearCheck(); + binding.audio12kRadioButton.setChecked(GeneralVariables.audioSampleRate==12000); + binding.audio24kRadioButton.setChecked(GeneralVariables.audioSampleRate==24000); + binding.audio48kRadioButton.setChecked(GeneralVariables.audioSampleRate==48000); + + + + View.OnClickListener listener = new View.OnClickListener() { + @Override + public void onClick(View view) { + if (binding.audio12kRadioButton.isChecked()) GeneralVariables.audioSampleRate=12000; + if (binding.audio24kRadioButton.isChecked()) GeneralVariables.audioSampleRate=24000; + if (binding.audio48kRadioButton.isChecked()) GeneralVariables.audioSampleRate=48000; + writeConfig("audioRate", String.valueOf(GeneralVariables.audioSampleRate)); + } + }; + + binding.audio12kRadioButton.setOnClickListener(listener); + binding.audio24kRadioButton.setOnClickListener(listener); + binding.audio48kRadioButton.setOnClickListener(listener); + + } + + + + /** + * 设置消息列表显示模式 + */ + private void setMessageMode() { + binding.messageModeRadioGroup.clearCheck(); + if (GeneralVariables.simpleCallItemMode){ + binding.msgSimpleRadioButton.setChecked(true); + }else { + binding.msgStandardRadioButton.setChecked(true); + } + + + + View.OnClickListener listener = new View.OnClickListener() { + @Override + public void onClick(View view) { + int buttonId = binding.messageModeRadioGroup.getCheckedRadioButtonId(); + GeneralVariables.simpleCallItemMode= + binding.messageModeRadioGroup.getCheckedRadioButtonId() + ==binding.msgSimpleRadioButton.getId(); + + writeConfig("msgMode", GeneralVariables.simpleCallItemMode?"1":"0"); + } + }; + + binding.msgStandardRadioButton.setOnClickListener(listener); + binding.msgSimpleRadioButton.setOnClickListener(listener); + } + + + + + /** + * 设置控制模式VOX CAT + */ + private void setControlMode() { + //binding.controlModeRadioGroup.setOnCheckedChangeListener(null); + binding.controlModeRadioGroup.clearCheck(); + + switch (GeneralVariables.controlMode) { + case ControlMode.CAT: + case ConnectMode.NETWORK: + binding.ctrCATradioButton.setChecked(true); + break; + case ControlMode.RTS: + binding.ctrRTSradioButton.setChecked(true); + break; + case ControlMode.DTR: + binding.ctrDTRradioButton.setChecked(true); + break; + default: + binding.ctrVOXradioButton.setChecked(true); + } + + + View.OnClickListener listener = new View.OnClickListener() { + @Override + public void onClick(View view) { + int buttonId = binding.controlModeRadioGroup.getCheckedRadioButtonId(); + + if (buttonId == binding.ctrVOXradioButton.getId()) { + GeneralVariables.controlMode = ControlMode.VOX; + } else if (buttonId == binding.ctrCATradioButton.getId()) {//CAT模式 + GeneralVariables.controlMode = ControlMode.CAT; + } else if (buttonId == binding.ctrRTSradioButton.getId()) {//RTS模式 + GeneralVariables.controlMode = ControlMode.RTS; + } else if (buttonId == binding.ctrDTRradioButton.getId()) {//RTS模式 + GeneralVariables.controlMode = ControlMode.DTR; + } + mainViewModel.setControlMode();//通知一下电台控制模式改变 + //无论CAT还是RTS,CI-V指令还是有效的,都是串口 + if (GeneralVariables.controlMode == ControlMode.CAT + || GeneralVariables.controlMode == ControlMode.RTS + || GeneralVariables.controlMode == ControlMode.DTR) { + if (!mainViewModel.isRigConnected()) { + mainViewModel.getUsbDevice(); + } else { + mainViewModel.setOperationBand(); + } + } + writeConfig("ctrMode", String.valueOf(GeneralVariables.controlMode)); + setConnectMode(); + } + }; + + binding.ctrCATradioButton.setOnClickListener(listener); + binding.ctrVOXradioButton.setOnClickListener(listener); + binding.ctrRTSradioButton.setOnClickListener(listener); + binding.ctrDTRradioButton.setOnClickListener(listener); + } + + /** + * 设置连线的方式,可以是USB,也可以是BLUE_TOOTH + */ + private void setConnectMode() { + if ((GeneralVariables.controlMode == ControlMode.CAT) + //&& BluetoothConstants.checkBluetoothIsOpen() + ) { + //此处要改成VISIBLE + binding.connectModeLayout.setVisibility(View.VISIBLE); + binding.serialLayout.setVisibility(View.VISIBLE); + } else { + binding.connectModeLayout.setVisibility(View.GONE); + binding.serialLayout.setVisibility(View.GONE); + } + binding.connectModeRadioGroup.clearCheck(); + switch (GeneralVariables.connectMode) { + case ConnectMode.USB_CABLE: + binding.cableConnectRadioButton.setChecked(true); + break; + case ConnectMode.BLUE_TOOTH: + binding.bluetoothConnectRadioButton.setChecked(true); + break; + case ConnectMode.NETWORK: + binding.networkConnectRadioButton.setChecked(true); + break; + } + View.OnClickListener listener = new View.OnClickListener() { + @Override + public void onClick(View view) { + int buttonId = binding.connectModeRadioGroup.getCheckedRadioButtonId(); + if (buttonId == binding.cableConnectRadioButton.getId()) { + GeneralVariables.connectMode = ConnectMode.USB_CABLE; + } else if (buttonId == binding.bluetoothConnectRadioButton.getId()) { + GeneralVariables.connectMode = ConnectMode.BLUE_TOOTH; + }else if (buttonId==binding.networkConnectRadioButton.getId()){ + GeneralVariables.connectMode=ConnectMode.NETWORK; + } + //------显示蓝牙列表,并选择,然后建立蓝牙连接 + if (GeneralVariables.connectMode == ConnectMode.BLUE_TOOTH) { + //根据安卓12,要判断一下蓝牙权限: + new SelectBluetoothDialog(requireContext(), mainViewModel).show(); + } + + //-----显示网络上的电台,目前是flex电台,------------------- + if (GeneralVariables.connectMode==ConnectMode.NETWORK){ + //打开网络电台列表对话框 + if (GeneralVariables.instructionSet== InstructionSet.FLEX_NETWORK) { + new SelectFlexRadioDialog(requireContext(), mainViewModel).show(); + }else if (GeneralVariables.instructionSet== InstructionSet.XIEGU_6100_FT8CNS) { + new SelectXieguRadioDialog(requireContext(), mainViewModel).show(); + } + else if(GeneralVariables.instructionSet== InstructionSet.ICOM + ||GeneralVariables.instructionSet== InstructionSet.XIEGU_6100 + ||GeneralVariables.instructionSet== InstructionSet.XIEGUG90S) { + new LoginIcomRadioDialog(requireContext(), mainViewModel).show(); + }else { + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.only_flex_supported)); + } + } + + } + }; + binding.cableConnectRadioButton.setOnClickListener(listener); + binding.bluetoothConnectRadioButton.setOnClickListener(listener); + binding.networkConnectRadioButton.setOnClickListener(listener); + } + + + /** + * 把配置信息写到数据库 + * + * @param KeyName 关键词 + * @param Value 值 + */ + private void writeConfig(String KeyName, String Value) { + mainViewModel.databaseOpr.writeConfig(KeyName, Value, null); + } + + private void setHelpDialog() { + //呼号帮助 + binding.callsignHelpImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(), requireActivity() + , GeneralVariables.getStringFromResource(R.string.callsign_help) + , true).show(); + } + }); + + //cloudlog帮助 + binding.cloudlogSettingsImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(), requireActivity() + , GeneralVariables.getStringFromResource(R.string.cloudlog_help) + , true).show(); + } + }); + //qrz帮助 + binding.qrzSettingsImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(), requireActivity() + , GeneralVariables.getStringFromResource(R.string.qrz_help) + , true).show(); + } + }); + + //梅登海德网格的帮助 + binding.maidenGridImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(), requireActivity() + , GeneralVariables.getStringFromResource(R.string.maidenhead_help) + , true).show(); + } + }); + //发射频率的帮助 + binding.frequencyImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(), requireActivity() + , GeneralVariables.getStringFromResource(R.string.frequency_help) + , true).show(); + } + }); + //延迟发射帮助 + binding.transDelayImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(), requireActivity() + , GeneralVariables.getStringFromResource(R.string.transDelay_help) + , true).show(); + } + }); + //时间偏移帮助 + binding.timeOffsetImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(), requireActivity() + , GeneralVariables.getStringFromResource(R.string.timeoffset_help) + , true).show(); + } + }); + //PTT延时帮助 + binding.pttDelayImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(), requireActivity() + , GeneralVariables.getStringFromResource(R.string.pttdelay_help) + , true).show(); + } + }); + //设置串口参数帮助 + binding.serialHelpImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(), requireActivity() + , GeneralVariables.getStringFromResource(R.string.serial_setting_help) + , true).show(); + } + }); + + //显示列表方式 + binding.messageModeeHelpImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(),requireActivity() + ,GeneralVariables.getStringFromResource(R.string.message_mode_help) + ,true).show(); + } + }); + + //设置ABOUT + binding.aboutButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(), requireActivity(), "readme.txt", true).show(); + } + }); + //设置操作频段 + binding.operationHelpImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(), requireActivity() + , GeneralVariables.getStringFromResource(R.string.operationBand_help) + , true).show(); + } + }); + //设置操作模式 + binding.controlModeHelpImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(), requireActivity() + , GeneralVariables.getStringFromResource(R.string.controlMode_help) + , true).show(); + } + }); + //设置CI-V地址和波特率帮助 + binding.baudRateHelpImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(), requireActivity() + , GeneralVariables.getStringFromResource(R.string.civ_help) + , true).show(); + } + }); + //电台型号列表 + binding.rigNameHelpImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(), requireActivity() + , GeneralVariables.getStringFromResource(R.string.rig_model_help) + , true).show(); + } + }); + //发射监管 + binding.launchSupervisionImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(), requireActivity() + , GeneralVariables.getStringFromResource(R.string.launch_supervision_help) + , true).show(); + } + }); + //无回应次数 + binding.noResponseCountButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(), requireActivity() + , GeneralVariables.getStringFromResource(R.string.no_response_help) + , true).show(); + } + }); + //自动呼叫 + binding.autoFollowCountButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(), requireActivity() + , GeneralVariables.getStringFromResource(R.string.auto_follow_help) + , true).show(); + } + }); + //连接模式 + binding.connectModeHelpImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(), requireActivity() + , GeneralVariables.getStringFromResource(R.string.connectMode_help) + , true).show(); + } + }); + //排除选项 + binding.excludedHelpButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(), requireActivity() + , GeneralVariables.getStringFromResource(R.string.excludeCallsign_help) + , true).show(); + } + }); + + binding.swlHelpButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(), requireActivity() + , GeneralVariables.getStringFromResource(R.string.swlMode_help) + , true).show(); + } + }); + + //解码模式 + binding.decodeModeHelpButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(),requireActivity() + ,GeneralVariables.getStringFromResource(R.string.deep_mode_help) + ,true).show(); + } + }); + + //音频输出帮助 + binding.audioOutputImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(), requireActivity() + , GeneralVariables.getStringFromResource(R.string.audio_output_help) + , true).show(); + } + }); + + //清除缓存 + binding.clearCacheHelpButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new HelpDialog(requireContext(), requireActivity() + , GeneralVariables.getStringFromResource(R.string.clear_cache_data_help) + , true).show(); + } + }); + + //cloudlog测试... + binding.testCloudlogButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + binding.testCloudlogButton.setEnabled(false); + binding.testCloudlogButton.setText(getResources().getString(R.string.testing)); + new Thread(new Runnable() { + @Override + public void run() { + boolean result = ThirdPartyService.CheckCloudlogConnection(); + new Handler(Looper.getMainLooper()).post(new Runnable() { + @Override + public void run() { + if (result) { + binding.testCloudlogButton.setText(getResources().getString(R.string.pass)); + } else { + binding.testCloudlogButton.setText(getResources().getString(R.string.fail)); + } + // 清空文本 + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + binding.testCloudlogButton.setEnabled(true); + binding.testCloudlogButton.setText(getResources().getString(R.string.test)); + } + }, 3000); + } + }); + } + }).start();} + }); + // QRZ测试... + binding.testQrzButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + binding.testQrzButton.setEnabled(false); + binding.testQrzButton.setText(getResources().getString(R.string.testing)); + new Thread(new Runnable() { + @Override + public void run() { + boolean result = ThirdPartyService.CheckQRZConnection(); + new Handler(Looper.getMainLooper()).post(new Runnable() { + @Override + public void run() { + if (result) { + binding.testQrzButton.setText(getResources().getString(R.string.pass)); + } else { + binding.testQrzButton.setText(getResources().getString(R.string.fail)); + } + // 清空文本 + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + binding.testQrzButton.setEnabled(true); + binding.testQrzButton.setText(getResources().getString(R.string.test)); + } + }, 3000); + } + }); + } + }).start();} + }); + + binding.clearFollowButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new ClearCacheDataDialog(requireContext(), requireActivity() + ,mainViewModel.databaseOpr + ,ClearCacheDataDialog.CACHE_MODE.FOLLOW_DATA).show(); + } + }); + binding.clearLogCacheButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new ClearCacheDataDialog(requireContext(), requireActivity() + ,mainViewModel.databaseOpr + ,ClearCacheDataDialog.CACHE_MODE.SWL_MSG).show(); + } + }); + binding.clearSWlQsoButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new ClearCacheDataDialog(requireContext(), requireActivity() + ,mainViewModel.databaseOpr + ,ClearCacheDataDialog.CACHE_MODE.SWL_QSO).show(); + } + }); + //删除共享的临时文件 + binding.clearShareDataButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new Thread(new Runnable() { + @Override + public void run() { + GeneralVariables.clearCache(binding.getRoot().getContext()); + } + }).start(); + } + }); + + binding.synTImeButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + UtcTimer.syncTime(new UtcTimer.AfterSyncTime() { + @Override + public void doAfterSyncTimer(int secTime) { + setUtcTimeOffsetSpinner(); + if (secTime>100) {//正数时慢了 + ToastMessage.show(String.format(GeneralVariables + .getStringFromResource(R.string.utc_time_sync_delay_slow), secTime)); + }else if (secTime<-100){ + ToastMessage.show(String.format(GeneralVariables + .getStringFromResource(R.string.utc_time_sync_delay_faster), -secTime)); + }else { + ToastMessage.show(GeneralVariables + .getStringFromResource(R.string.config_clock_is_accurate)); + } + } + + @Override + public void syncFailed(IOException e) { + ToastMessage.show(e.getMessage()); + } + }); + + } + }); + + } + + /** + * 设置界面的上下滚动的图标 + */ + private void setScrollImageVisible() { + + if (binding.scrollView3.getScrollY() == 0) { + binding.configScrollUpImageView.setVisibility(View.GONE); + } else { + binding.configScrollUpImageView.setVisibility(View.VISIBLE); + } + + if (binding.scrollView3.getHeight() + binding.scrollView3.getScrollY() + < binding.scrollLinearLayout.getMeasuredHeight()) { + binding.configScrollDownImageView.setVisibility(View.VISIBLE); + } else { + binding.configScrollDownImageView.setVisibility(View.GONE); + } + } + + +} \ No newline at end of file diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/FilterDialog.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/FilterDialog.java new file mode 100644 index 00000000..917bc4f7 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/FilterDialog.java @@ -0,0 +1,95 @@ +package com.bg7yoz.ft8cn.ui; +/** + * 日志查询的过滤对话框。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.view.View; +import android.view.WindowManager; +import android.widget.RadioButton; + +import com.bg7yoz.ft8cn.MainViewModel; +import com.bg7yoz.ft8cn.R; + +public class FilterDialog extends Dialog { + private static final String TAG = "FilterDialog"; + + private MainViewModel mainViewModel; + private RadioButton filterAllButton,filterIsQslButton,filterNoneQslButton; + + public FilterDialog(Context context,MainViewModel mainViewModel) { + super(context, R.style.HelpDialog); + this.mainViewModel=mainViewModel; + + } + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.filter_dialog_layout); + filterAllButton= (RadioButton) findViewById(R.id.filterAllRadioButton); + filterIsQslButton= (RadioButton) findViewById(R.id.filterIsQSLRadioButton); + filterNoneQslButton= (RadioButton) findViewById(R.id.filterNoneQSLRadioButton); + + View.OnClickListener onClickListener=new View.OnClickListener() { + @Override + public void onClick(View view) { + //Log.e(TAG, "onClick: ---------------->" ); + if (filterAllButton.isChecked()){ + mainViewModel.queryFilter=0; + mainViewModel.mutableQueryFilter.postValue(0); + } + if (filterIsQslButton.isChecked()){ + mainViewModel.queryFilter=1; + mainViewModel.mutableQueryFilter.postValue(1); + } + if (filterNoneQslButton.isChecked()){ + mainViewModel.queryFilter=2; + mainViewModel.mutableQueryFilter.postValue(2); + } + FilterDialog.this.dismiss(); + } + }; + filterAllButton.setOnClickListener(onClickListener); + filterIsQslButton.setOnClickListener(onClickListener); + filterNoneQslButton.setOnClickListener(onClickListener); + } + + + @Override + public void show() { + super.show(); + WindowManager.LayoutParams params = getWindow().getAttributes(); + //设置对话框的大小,以百分比0.6 + int height=getWindow().getWindowManager().getDefaultDisplay().getHeight(); + int width=getWindow().getWindowManager().getDefaultDisplay().getWidth(); + params.height = (int) (height * 0.6); + if (width>height) { + params.width = (int) (width * 0.6); + params.height = (int) (height * 0.6); + }else { + params.width= (int) (width * 0.8); + params.height = (int) (height * 0.5); + } + getWindow().setAttributes(params); + switch (mainViewModel.queryFilter){ + case 1: + filterIsQslButton.setChecked(true);//只显示QSL的 + break; + case 2: + filterNoneQslButton.setChecked(true);//只显示没有QSL的 + break; + default: + filterAllButton.setChecked(true);//显示全部 + } + } + + + + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/FlexMeterRulerView.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/FlexMeterRulerView.java new file mode 100644 index 00000000..2d49146d --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/FlexMeterRulerView.java @@ -0,0 +1,201 @@ +package com.bg7yoz.ft8cn.ui; +/** + * flexRadio仪表的自定义控件。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.LinearGradient; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.Shader; +import android.util.AttributeSet; +import android.util.TypedValue; +import android.view.View; + +import androidx.annotation.Nullable; + +public class FlexMeterRulerView extends View { + private static final String TAG = "FlexMeterRulerView"; + + private String label="S/Po"; + private String unit="dBm"; + private String valueLabel="5dBm"; + private float lowVal=-150f; + private float highVal=-72f; + private float maxVal=10f; + private int normalCount=9; + private int highCount=3; + private String[] normalLabels=new String[]{"0","1","2","3","4","5","6","7","8","9"}; + private String[] highLabels=new String[]{"20","40","50"}; + private float value=5f; + + + private final int labelDp=12;//标签字体大小dp + private Rect rulerRect = new Rect(); + private Rect valueRect =new Rect(); + private Paint fontPaint = new Paint(); + private Paint rulerPaint = new Paint(); + private Paint valuePaint = new Paint(); + private Paint labelPaint=new Paint(); + private int rulerWidth = getWidth(); + private int labelWidth=dpToPixel(40);//标签宽度 + private int valueWidth=dpToPixel(65);//值标签宽度 + + @SuppressLint("DefaultLocale") + public void setValue(float value,OnSetValue onSetValue) { + if (onSetValue!=null){ + valueLabel = onSetValue.setLabel(value); + }else { + valueLabel = String.format("%.1f%s", value, unit); + } + if (value>maxVal) { + this.value = maxVal; + }else if(value() { + @Override + public void onChanged(FlexMeterList meters) { + //binding.flexInfoTextView.setText(String.format("%f",meters.alcVal)); + binding.sMeterRulerView.setValue(meters.sMeterVal,null); + binding.alcMeterRulerView.setValue(meters.alcVal,null); + binding.swrMeterRulerView.setValue(meters.swrVal,null); + binding.powerMeterRulerView.setValue(meters.pwrVal,null); + binding.tempMeterRulerView.setValue(meters.tempCVal,null); + + binding.flexInfoTextView.setText(meters.getMeters()); + } + }); + } + + + binding.sMeterRulerView.initVal(-150f, -72f, 10f, 9, 3); + binding.sMeterRulerView.initLabels("S.Po", "dBm" + , new String[]{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"} + , new String[]{"20", "40", ""}); + + binding.swrMeterRulerView.initVal(1f, 3f, 20f, 4, 4); + binding.swrMeterRulerView.initLabels("SWR", "" + , new String[]{"1", "1.5", "2", "2.5", "3"} + , new String[]{"", "", "", "∞"}); + + binding.alcMeterRulerView.initVal(-150f, 0f, 20f, 3, 3); + binding.alcMeterRulerView.initLabels("ALC", "dBm" + , new String[]{"", "", ""} + , new String[]{"", "", ""}); + + binding.powerMeterRulerView.initVal(-0f, 50f, 100f, 5, 5); + binding.powerMeterRulerView.initLabels("PWR", "W" + , new String[]{"0", "10", "20", "30", "40", "50"} + , new String[]{"60", "70", "80", "90", "100"}); + + binding.tempMeterRulerView.initVal(-0f, 80f, 100f, 8, 2); + binding.tempMeterRulerView.initLabels("Temp", "°c" + , new String[]{"0", "10", "20", "30", "40", "50", "60", "70", "80"} + , new String[]{"90", "100"}); + + + binding.maxPowerProgress.setValueColor(getContext().getColor(R.color.power_progress_value)); + binding.tunePowerProgress.setValueColor(getContext().getColor(R.color.power_progress_value)); + binding.maxPowerProgress.setRadarColor(getContext().getColor(R.color.power_progress_radar_value)); + binding.tunePowerProgress.setRadarColor(getContext().getColor(R.color.power_progress_radar_value)); + + binding.maxPowerProgress.setAlarmValue(0.51f); + + + binding.maxPowerProgress.setPercent(((float) connector.maxRfPower) / 100f); + binding.maxPowerSeekBar.setProgress(connector.maxRfPower); + binding.maxTxPowerTextView.setText(String.format( + GeneralVariables.getStringFromResource(R.string.flex_max_tx_power), connector.maxRfPower)); + + binding.tunePowerProgress.setPercent(((float) connector.maxTunePower) / 100f); + binding.tunePowerSeekBar.setProgress(connector.maxTunePower); + binding.tunePowerProgress.setAlarmValue((connector.maxTunePower / 100f) + 0.01f); + binding.tunePowerTextView.setText(String.format( + GeneralVariables.getStringFromResource(R.string.flex_tune_power), connector.maxTunePower)); + + binding.maxPowerSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + @Override + public void onProgressChanged(SeekBar seekBar, int i, boolean b) { + binding.maxPowerProgress.setPercent(i * 1.0f / 100); + connector.maxRfPower = i; + connector.setMaxRfPower(i); + binding.maxTxPowerTextView.setText(String.format( + GeneralVariables.getStringFromResource(R.string.flex_max_tx_power), i)); + + binding.tunePowerProgress.setAlarmValue((i / 100f) + 0.02f); + setTuneProgress(); + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + + } + + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + + } + }); + binding.tunePowerSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + @Override + public void onProgressChanged(SeekBar seekBar, int i, boolean b) { + connector.maxTunePower=i; + binding.tunePowerProgress.setPercent(seekBar.getProgress() * 1.0f / 100); + binding.tunePowerTextView.setText(String.format( + GeneralVariables.getStringFromResource(R.string.flex_tune_power) + , connector.maxTunePower)); + + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + + } + + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + setTuneProgress(); + } + }); + + + binding.autStartButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + connector.startATU(); + } + }); + binding.pttOnButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + connector.tuneOnOff(true); + } + }); + binding.pttOffButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + connector.tuneOnOff(false); + } + }); + + return binding.getRoot(); + } + + private void setTuneProgress() { + //binding.tunePowerSeekBar.setProgress(connector.maxRfPower); + if (connector.maxTunePower>connector.maxRfPower) { + connector.maxTunePower =connector.maxRfPower; + } + binding.tunePowerTextView.setText(String.format( + GeneralVariables.getStringFromResource(R.string.flex_tune_power) + , connector.maxTunePower)); + binding.tunePowerProgress.setPercent(connector.maxTunePower * 1.0f / 100); + + binding.tunePowerSeekBar.setProgress(connector.maxTunePower); + connector.setMaxTunePower(connector.maxTunePower); + + mainViewModel.databaseOpr.writeConfig("flexMaxRfPower" + ,String.valueOf(connector.maxRfPower),null); + mainViewModel.databaseOpr.writeConfig("flexMaxTunePower" + ,String.valueOf(connector.maxTunePower),null); + } + +} \ No newline at end of file diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/FreqDialog.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/FreqDialog.java new file mode 100644 index 00000000..7fc6f0c5 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/FreqDialog.java @@ -0,0 +1,150 @@ +package com.bg7yoz.ft8cn.ui; +/** + * 快速切换频率的对话框。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.MainViewModel; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.database.ControlMode; +import com.bg7yoz.ft8cn.database.OperationBand; + +public class FreqDialog extends Dialog { + private static final String TAG = "FreqDialog"; + + private MainViewModel mainViewModel; + private RecyclerView freqRecyclerView; + private FreqAdapter freqAdapter; + //private BandsSpinnerAdapter bandsSpinnerAdapter; + + + public FreqDialog(Context context, MainViewModel mainViewModel) { + super(context, R.style.HelpDialog); + this.mainViewModel=mainViewModel; + + } + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.freq_dialog_layout); + freqRecyclerView=(RecyclerView) findViewById(R.id.freqDialogRecyclerView); + freqRecyclerView.setLayoutManager(new LinearLayoutManager(getContext())); + + freqAdapter = new FreqAdapter(); + freqRecyclerView.setAdapter(freqAdapter); + + freqRecyclerView.scrollToPosition(OperationBand.getIndexByFreq(GeneralVariables.band)); +// +// View.OnClickListener onClickListener=new View.OnClickListener() { +// @Override +// public void onClick(View view) { +// FreqDialog.this.dismiss(); +// } +// }; + + } + + + @Override + public void show() { + super.show(); + WindowManager.LayoutParams params = getWindow().getAttributes(); + //设置对话框的大小,以百分比0.6 + int height=getWindow().getWindowManager().getDefaultDisplay().getHeight(); + int width=getWindow().getWindowManager().getDefaultDisplay().getWidth(); + params.height = (int) (height * 0.6); + if (width>height) { + params.width = (int) (width * 0.5); + params.height = (int) (height * 0.6); + }else { + params.width= (int) (width * 0.6); + params.height = (int) (height * 0.5); + } + getWindow().setAttributes(params); + + } + + public class FreqAdapter extends RecyclerView.Adapter{ + + + @NonNull + @Override + public FreqHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext()); + View view = layoutInflater.inflate(R.layout.operation_band_dialog_item, parent, false); + final FreqHolder freqHolder=new FreqHolder(view); + return freqHolder; + } + + @Override + public void onBindViewHolder(@NonNull FreqHolder holder, int position) { + holder.band=OperationBand.getBandFreq(position); + //holder.index=position; + holder.operationDialogBandItemTextView.setText(OperationBand.getBandInfo(position)); + if (holder.band==GeneralVariables.band){ + holder.operationDialogBandConstraintLayout.setBackgroundResource(R.drawable.calling_list_cell_3_style); + }else { + holder.operationDialogBandConstraintLayout.setBackgroundResource(R.drawable.calling_list_cell_style); + } + holder.operationDialogBandConstraintLayout.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + GeneralVariables.bandListIndex = OperationBand.getIndexByFreq(holder.band); + GeneralVariables.band = holder.band; + + mainViewModel.databaseOpr.getAllQSLCallsigns();//通联成功的呼号读出来 + mainViewModel.databaseOpr.writeConfig("bandFreq" + , String.valueOf(GeneralVariables.band) + , null); + if (GeneralVariables.controlMode == ControlMode.CAT//CAT、RTS、DTR模式下控制电台 + || GeneralVariables.controlMode == ControlMode.RTS + || GeneralVariables.controlMode == ControlMode.DTR) { + //如果在CAT、RTS模式下,修改电台的频率 + mainViewModel.setOperationBand(); + } + dismiss(); + } + }); + + + //OperationBand.bandList.get(i) + } + + @Override + public int getItemCount() { + return OperationBand.bandList.size(); + } + + class FreqHolder extends RecyclerView.ViewHolder{ + long band; + + TextView operationDialogBandItemTextView; + ConstraintLayout operationDialogBandConstraintLayout; + public FreqHolder(@NonNull View itemView) { + super(itemView); + operationDialogBandItemTextView=itemView.findViewById(R.id.operationDialogBandItemTextView); + operationDialogBandConstraintLayout=itemView.findViewById(R.id.operationDialogBandConstraintLayout); + } + } + } + + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/FunctionOrderSpinnerAdapter.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/FunctionOrderSpinnerAdapter.java new file mode 100644 index 00000000..21443e94 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/FunctionOrderSpinnerAdapter.java @@ -0,0 +1,78 @@ +package com.bg7yoz.ft8cn.ui; +/** + * FT8通联的6步列表。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.annotation.SuppressLint; +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.TextView; + +import com.bg7yoz.ft8cn.MainViewModel; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.ft8transmit.FunctionOfTransmit; + +public class FunctionOrderSpinnerAdapter extends BaseAdapter { + private Context mContext; + private MainViewModel mainViewModel; + + public FunctionOrderSpinnerAdapter(Context context, MainViewModel mainViewModel) { + this.mainViewModel = mainViewModel; + mContext = context; + } + + @Override + public int getCount() { + return mainViewModel.ft8TransmitSignal.functionList.size(); + } + + @Override + public Object getItem(int i) { + return mainViewModel.ft8TransmitSignal.functionList.get(i); + } + + @Override + public long getItemId(int i) { + return i; + } + + @SuppressLint({"ViewHolder", "InflateParams"}) + @Override + public View getView(int i, View view, ViewGroup viewGroup) { + LayoutInflater _LayoutInflater = LayoutInflater.from(mContext); + FunctionOfTransmit function; + function = mainViewModel.ft8TransmitSignal.functionList.get(i); + + view = _LayoutInflater.inflate(R.layout.function_order_spinner_item, null); + if (view != null) { + TextView messageTextView = (TextView) view.findViewById(R.id.functionOrderItemTextView); + messageTextView.setText(function.getFunctionMessage()); + TextView numTextView = (TextView) view.findViewById(R.id.functionNumItemTextView); + numTextView.setText(String.valueOf(function.getFunctionOrder())); + +// ImageView completedImageView = (ImageView) view.findViewById(R.id.functionCompletedImageView); + + ImageView currentImageView=(ImageView) view.findViewById(R.id.currentOrderImageView); + if (function.isCurrentOrder()){ + currentImageView.setVisibility(View.VISIBLE); + }else { + currentImageView.setVisibility(View.INVISIBLE); + } + +// if (function.isCompleted()) { +// completedImageView.setVisibility(View.VISIBLE); +// } else { +// completedImageView.setVisibility(View.GONE); +// } + + } + return view; + } + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/HelpDialog.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/HelpDialog.java new file mode 100644 index 00000000..24bc1bf2 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/HelpDialog.java @@ -0,0 +1,176 @@ +package com.bg7yoz.ft8cn.ui; +/** + * 帮助信息的对话框。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.app.Activity; +import android.app.Dialog; +import android.content.Context; +import android.content.Intent; +import android.content.res.AssetManager; +import android.net.Uri; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.view.WindowManager; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.ScrollView; +import android.widget.TextView; + +import androidx.annotation.NonNull; + +import com.bg7yoz.ft8cn.BuildConfig; +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Timer; +import java.util.TimerTask; + +public class HelpDialog extends Dialog { + private static final String TAG = "HelpDialog"; + private final Context context; + private final Activity activity; + private final String msg; + private ImageView upImageView; + private ImageView downImageView; + private ScrollView scrollView; + private TextView messageTextView; + private TextView appNameTextView; + private TextView buildVersionTextView; + private final Timer timer=new Timer(); + private TimerTask timeEvent() { + return new TimerTask() { + @Override + public void run() { + //心跳动作 + //doHeartBeatEvent(onUtcTimer); + activity.runOnUiThread(new Runnable() { + @Override + public void run() { + setImageVisible(); + } + }); + + } + }; + } + + + + + public HelpDialog(@NonNull Context context,Activity activity,String str, boolean fromFile) { + super(context, R.style.HelpDialog); + this.context = context; + this.activity=activity; + if (fromFile) { + msg = getTextFromAssets(str); + } else { + msg = str; + } + + } + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.help_dialog_layout); + messageTextView = (TextView) findViewById(R.id.helpMessage); + appNameTextView = (TextView) findViewById(R.id.appNameTextView); + buildVersionTextView = (TextView) findViewById(R.id.buildVersionTextView); + messageTextView.setText(msg); + upImageView = (ImageView) findViewById(R.id.scrollUpImageView); + downImageView = (ImageView) findViewById(R.id.scrollDownImageView); + scrollView = (ScrollView) findViewById(R.id.helpScrollView); + upImageView.setVisibility(View.INVISIBLE); + downImageView.setVisibility(View.INVISIBLE); + appNameTextView.setText(GeneralVariables.getStringFromResource(R.string.app_name)); + buildVersionTextView.setText(BuildConfig.VERSION_NAME); + + scrollView.setOnScrollChangeListener(new View.OnScrollChangeListener() { + @Override + public void onScrollChange(View view, int i, int i1, int i2, int i3) { + Log.d(TAG, String.format("onCreate: getMeasuredHeight:%d, getHeight:%d scroll height:%d" + , messageTextView.getMeasuredHeight(), messageTextView.getHeight(),scrollView.getHeight())); + + + } + }); + + Button getNewButton=(Button) findViewById(R.id.getNewVersionButton); + getNewButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + jumpUriToBrowser(context,"https://github.com/N0BOY/FT8CN/releases"); + } + }); + + timer.schedule(timeEvent(), 10, 500); + } + + private void jumpUriToBrowser(Context context,String url){ + Intent intent=new Intent(); + intent.setAction(Intent.ACTION_VIEW); + Uri uri=Uri.parse(url); + intent.setData(uri); + context.startActivity(intent); + } + + private void setImageVisible(){ + if (scrollView.getScrollY() == 0) { + upImageView.setVisibility(View.INVISIBLE); + } else { + upImageView.setVisibility(View.VISIBLE); + } + + if (scrollView.getMeasuredHeight() <= messageTextView.getMeasuredHeight()-scrollView.getScrollY()) { + downImageView.setVisibility(View.VISIBLE); + } else { + downImageView.setVisibility(View.INVISIBLE); + } + } + + + @Override + public void show() { + super.show(); + WindowManager.LayoutParams params = getWindow().getAttributes(); + //设置对话框的大小,以百分比0.6 + int height=getWindow().getWindowManager().getDefaultDisplay().getHeight(); + int width=getWindow().getWindowManager().getDefaultDisplay().getWidth(); + params.height = (int) (height * 0.6); + if (width>height) { + params.width = (int) (width * 0.6); + params.height = (int) (height * 0.9); + }else { + params.width= (int) (width * 0.8); + params.height = (int) (height * 0.5); + } + getWindow().setAttributes(params); + + } + + + + public String getTextFromAssets(String fileName) { + AssetManager assetManager = context.getAssets(); + try { + InputStream inputStream = assetManager.open(fileName); + byte[] bytes = new byte[inputStream.available()]; + inputStream.read(bytes); + inputStream.close(); + + return new String(bytes); + + } catch (IOException e) { + e.printStackTrace(); + return null; + } + } + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/LaunchSupervisionSpinnerAdapter.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/LaunchSupervisionSpinnerAdapter.java new file mode 100644 index 00000000..5b1b1aa6 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/LaunchSupervisionSpinnerAdapter.java @@ -0,0 +1,81 @@ +package com.bg7yoz.ft8cn.ui; +/** + * 发射监管的列表。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.annotation.SuppressLint; +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.TextView; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; + +import java.util.ArrayList; +import java.util.List; + +public class LaunchSupervisionSpinnerAdapter extends BaseAdapter { + private final List timeOutList=new ArrayList<>(); + private final Context mContext; + + public LaunchSupervisionSpinnerAdapter(Context context) { + mContext=context; + timeOutList.add(0); + for (int i = 1; i <= 10; i++) { + timeOutList.add(i*10-5); + } + } + public static int getTimeOut(int index){ + if (index==0) return 0; + return ((index) * 10-5) * 60 * 1000; + } + + @Override + public int getCount() { + return timeOutList.size(); + } + + @Override + public Object getItem(int i) { + return timeOutList.get(i); + } + + @Override + public long getItemId(int i) { + return i; + } + + @SuppressLint({"DefaultLocale", "ViewHolder", "InflateParams"}) + @Override + public View getView(int i, View view, ViewGroup viewGroup) { + LayoutInflater _LayoutInflater=LayoutInflater.from(mContext); + view=_LayoutInflater.inflate(R.layout.launch_supervision_spinner_item, null); + if (view!=null){ + TextView textView=(TextView)view.findViewById(R.id.timeOutTextView); + if (i==0){ + textView.setText( + GeneralVariables.getStringFromResource(R.string.launch_supervision_ignore)); + }else { + textView.setText(String.format( + GeneralVariables.getStringFromResource(R.string.minutes), timeOutList.get(i))); + } + } + return view; + } + + public int getPosition(int timeOut){ + if (timeOut==0){ + return 0; + }else if (timeOut<5*60*1000) { + return 1; + }else { + return ((timeOut-5*60*1000)/60/1000/10); + } + + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/LogFragment.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/LogFragment.java new file mode 100644 index 00000000..ec3b71fd --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/LogFragment.java @@ -0,0 +1,613 @@ +package com.bg7yoz.ft8cn.ui; +/** + * 通联纪录的主界面。 + * + * @author BGY70Z + * @date 2023-03-20 + */ + +import static android.widget.AbsListView.OnScrollListener.SCROLL_STATE_IDLE; + +import android.annotation.SuppressLint; +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; +import android.graphics.drawable.Drawable; +import android.net.wifi.WifiInfo; +import android.net.wifi.WifiManager; +import android.os.Bundle; +import android.text.Editable; +import android.text.TextWatcher; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; +import androidx.fragment.app.Fragment; +import androidx.lifecycle.Observer; +import androidx.navigation.fragment.NavHostFragment; +import androidx.recyclerview.widget.ItemTouchHelper; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.MainViewModel; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.log.ShareLogs; +import com.bg7yoz.ft8cn.databinding.FragmentLogBinding; +import com.bg7yoz.ft8cn.grid_tracker.GridTrackerMainActivity; +import com.bg7yoz.ft8cn.html.LogHttpServer; +import com.bg7yoz.ft8cn.log.LogCallsignAdapter; +import com.bg7yoz.ft8cn.log.LogQSLAdapter; +import com.bg7yoz.ft8cn.log.OnQueryQSLCallsign; +import com.bg7yoz.ft8cn.log.OnQueryQSLRecordCallsign; +import com.bg7yoz.ft8cn.log.QSLCallsignRecord; +import com.bg7yoz.ft8cn.log.QSLRecordStr; +import com.bg7yoz.ft8cn.log.OnShareLogEvents; + +import java.io.File; +import java.util.ArrayList; + + +public class LogFragment extends Fragment { + private static final String TAG = "LogFragment"; + private FragmentLogBinding binding; + private MainViewModel mainViewModel; + + private LogCallsignAdapter logCallsignAdapter; + private LogQSLAdapter logQSLAdapter; + private boolean loading = false;//防止滑动触发多次查询 + private int lastItemPosition; + private ShareLogsProgressDialog dialog = null;//生成共享log的对话框 + + + public LogFragment() { + // Required empty public constructor + } + + + + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mainViewModel = MainViewModel.getInstance(this); + + } + + @SuppressLint({"DefaultLocale", "NotifyDataSetChanged"}) + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + binding = FragmentLogBinding.inflate(getLayoutInflater()); + + logCallsignAdapter = new LogCallsignAdapter(requireContext(), mainViewModel); + logQSLAdapter = new LogQSLAdapter(requireContext(), mainViewModel); + binding.logRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext())); + + + setShowStyle();//设置显模式 + + + initRecyclerViewAction();//设置列表滑动动作 + + + //设置显示统计页面按钮 + binding.countImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + showCountFragment(); + } + }); + + binding.inputMycallEdit.setText(mainViewModel.queryKey); + queryByCallsign(mainViewModel.queryKey, 0); + + mainViewModel.mutableQueryFilter.observe(getViewLifecycleOwner(), new Observer() { + @Override + public void onChanged(Integer integer) { + queryByCallsign(mainViewModel.queryKey, 0); + } + }); + + //输入条件监听 + binding.inputMycallEdit.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + mainViewModel.queryKey = editable.toString(); + queryByCallsign(mainViewModel.queryKey, 0); + } + }); + + //过滤条件按钮 + binding.filterImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new FilterDialog(requireContext(), mainViewModel).show(); + } + }); + + //导出按钮 + binding.exportImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (getLocalIp() == null) { + new HelpDialog(requireContext(), requireActivity() + , GeneralVariables.getStringFromResource(R.string.export_null) + , false).show(); + } else { + new HelpDialog(requireContext(), requireActivity() + , String.format(GeneralVariables.getStringFromResource(R.string.export_info) + , getLocalIp(), LogHttpServer.DEFAULT_PORT) + , false).show(); + } + + } + }); + + //分享日志按钮 + binding.shareLogImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + buildShareLogs(); + } + }); + + binding.logViewStyleimageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + mainViewModel.logListShowCallsign = !mainViewModel.logListShowCallsign; + setShowStyle(); + queryByCallsign(binding.inputMycallEdit.getText().toString(), 0);//偏移量0,就是重新查询 + } + }); + + //定位按钮的动作 + binding.locationInMapImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Intent intent = new Intent(requireContext(), GridTrackerMainActivity.class); + intent.putExtra("qslAll", mainViewModel.queryKey); + intent.putExtra("queryFilter", mainViewModel.queryFilter); + startActivity(intent); + } + }); + + //判断生成共享log文件的工作线程还在,如果在,就显示对话框 + if (Boolean.TRUE.equals(mainViewModel.mutableShareRunning.getValue())) { + showShareDialog(); + } + + return binding.getRoot(); + } + + + /** + * 显示生成log的对话框 + */ + private void showShareDialog() { + mainViewModel.mutableShareRunning.setValue(true); + dialog = new ShareLogsProgressDialog( + binding.getRoot().getContext() + , mainViewModel,false); + + dialog.show(); + mainViewModel.mutableSharePosition.postValue(0); + mainViewModel.mutableShareInfo.postValue(""); + mainViewModel.mutableShareCount.postValue(0); + } + + + /** + * 创建共享日志的数据文件 + */ + private void buildShareLogs() { + + //先显示生成log的对话框 + showShareDialog(); + + new Thread(new Runnable() { + @Override + public void run() { + + File adiFile = GeneralVariables.writeToTempFile(requireContext() + , "FT8CN" + , ".txt" + , ""); + + + new ShareLogs().doShareLogs(requireContext(), adiFile + , GeneralVariables.getStringFromResource(R.string.share_logs) + , mainViewModel.databaseOpr.getDb() + , mainViewModel.queryKey + , mainViewModel.queryFilter + , adiFile + , false + , new OnShareLogEvents() { + @Override + public void onPreparing(String info) { + mainViewModel.mutableShareInfo.postValue(info); + } + + @Override + public void onShareStart(int count, String info) { + mainViewModel.mutableSharePosition.postValue(0); + mainViewModel.mutableShareInfo.postValue(info); + mainViewModel.mutableShareRunning.postValue(true); + mainViewModel.mutableShareCount.postValue(count); + } + + @Override + public boolean onShareProgress(int count, int position, String info) { + mainViewModel.mutableSharePosition.postValue(position); + mainViewModel.mutableShareInfo.postValue(info); + mainViewModel.mutableShareCount.postValue(count); + return Boolean.TRUE.equals(mainViewModel.mutableShareRunning.getValue()); + } + + @Override + public void afterGet(int count, String info) { + mainViewModel.mutableShareInfo.postValue(info); + mainViewModel.mutableShareRunning.postValue(false); + } + + @Override + public void onShareFailed(String info) { + mainViewModel.mutableShareInfo.postValue(info); + } + }); + } + }).start(); + } + + /** + * 弹出菜单选项 + * + * @param item item + * @return item + */ + @Override + public boolean onContextItemSelected(@NonNull MenuItem item) { + int position = (Integer) item.getActionView().getTag(); + if (!mainViewModel.logListShowCallsign) { + switch (item.getItemId()) { + case 0: + logQSLAdapter.setRecordIsQSL(position, false); + logQSLAdapter.notifyItemChanged(position); + break; + case 1: + logQSLAdapter.setRecordIsQSL(position, true); + logQSLAdapter.notifyItemChanged(position); + break; + case 2: + showQrzFragment(logQSLAdapter.getRecord(position).getCall()); + break; + case 3: + Intent intent = new Intent(requireContext(), GridTrackerMainActivity.class); + intent.putExtra("qslList", logQSLAdapter.getRecord(position)); + startActivity(intent); + break; + + } + } else { + if (item.getItemId() == 2) { + showQrzFragment(logCallsignAdapter.getRecord(position).getCallsign()); + } + } + + return super.onContextItemSelected(item); + } + +// private boolean itemIsOnScreen(View view) { +// if (view != null) { +// int width = view.getWidth(); +// int height = view.getHeight(); +// Rect rect = new Rect(0, 0, width, height); +// return view.getLocalVisibleRect(rect); +// } +// return false; +// } + + private void loadQueryData() { + if ((!loading)) { + if (mainViewModel.logListShowCallsign) { + queryByCallsign(mainViewModel.queryKey, logCallsignAdapter.getItemCount()); + } else { + queryByCallsign(mainViewModel.queryKey, logQSLAdapter.getItemCount()); + } + } + } + + /** + * 设置列表滑动动作 + */ + private void initRecyclerViewAction() { + + binding.logRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { + super.onScrollStateChanged(recyclerView, newState); + + int itemCount; + if (mainViewModel.logListShowCallsign) { + itemCount = logCallsignAdapter.getItemCount(); + } else { + itemCount = logQSLAdapter.getItemCount(); + } + if (newState == SCROLL_STATE_IDLE && + lastItemPosition == itemCount) { + loadQueryData(); + + } + } + + @Override + public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { + super.onScrolled(recyclerView, dx, dy); + RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager(); + if (layoutManager instanceof LinearLayoutManager) { + LinearLayoutManager manager = (LinearLayoutManager) layoutManager; + int firstVisibleItem = manager.findFirstVisibleItemPosition(); + int l = manager.findLastCompletelyVisibleItemPosition(); + lastItemPosition = firstVisibleItem + (l - firstVisibleItem) + 1; + } + } + }); + + new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(ItemTouchHelper.ANIMATION_TYPE_DRAG + , ItemTouchHelper.END | ItemTouchHelper.START) { + @Override + public boolean onMove(@NonNull RecyclerView recyclerView + , @NonNull RecyclerView.ViewHolder viewHolder + , @NonNull RecyclerView.ViewHolder target) { + return false; + } + + @SuppressLint("NotifyDataSetChanged") + @Override + public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) { + if (direction == ItemTouchHelper.END) { + //做一个是否删除确认对话框 + AlertDialog.Builder builder = new AlertDialog.Builder(requireContext()); + builder.setIcon(null); + builder.setTitle(GeneralVariables.getStringFromResource(R.string.delete_confirmation)); + builder.setMessage(GeneralVariables.getStringFromResource(R.string.are_you_sure_delete)); + builder.setPositiveButton(GeneralVariables.getStringFromResource(R.string.ok_confirmed) + , new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + logQSLAdapter.deleteRecord(viewHolder.getAdapterPosition());//删除日志 + logQSLAdapter.notifyItemRemoved(viewHolder.getAdapterPosition()); + } + }); + builder.setOnCancelListener(new DialogInterface.OnCancelListener() { + @Override + public void onCancel(DialogInterface dialogInterface) { + logQSLAdapter.notifyDataSetChanged(); + } + }); + builder.setNegativeButton(GeneralVariables.getStringFromResource(R.string.cancel) + , new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + logQSLAdapter.notifyDataSetChanged(); + } + }).show(); + + } + + if (direction == ItemTouchHelper.START) { + logQSLAdapter.setRecordIsQSL(viewHolder.getAdapterPosition() + , !logQSLAdapter.getRecord(viewHolder.getAdapterPosition()).isQSL); + logQSLAdapter.notifyItemChanged(viewHolder.getAdapterPosition()); + } + } + + //判断列表格式,呼号列表 + @Override + public int getMovementFlags(@NonNull RecyclerView recyclerView + , @NonNull RecyclerView.ViewHolder viewHolder) { + int swipeFlag; + if (mainViewModel.logListShowCallsign) { + swipeFlag = 0; + } else { + swipeFlag = ItemTouchHelper.START | ItemTouchHelper.END; + } + return makeMovementFlags(0, swipeFlag); + } + + //制作删除背景的图标显示 + final Drawable delIcon = ContextCompat.getDrawable(requireActivity() + , R.drawable.log_item_delete_icon); + final Drawable qslIcon = ContextCompat.getDrawable(requireActivity() + , R.drawable.ic_baseline_library_add_check_24); + final Drawable background = new ColorDrawable(Color.LTGRAY); + + @Override + public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView + , @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY + , int actionState, boolean isCurrentlyActive) { + super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive); + Drawable icon; + View itemView = viewHolder.itemView; + if (dX > 0) { + icon = delIcon; + } else { + icon = qslIcon; + } + + int iconMargin = (itemView.getHeight() - icon.getIntrinsicHeight()) / 2; + int iconLeft, iconRight, iconTop, iconBottom; + int backTop, backBottom, backLeft, backRight; + backTop = itemView.getTop(); + backBottom = itemView.getBottom(); + iconTop = itemView.getTop() + (itemView.getHeight() - icon.getIntrinsicHeight()) / 2; + iconBottom = iconTop + icon.getIntrinsicHeight(); + if (dX > 0) { + backLeft = itemView.getLeft(); + backRight = itemView.getLeft() + (int) dX; + background.setBounds(backLeft, backTop, backRight, backBottom); + iconLeft = itemView.getLeft() + iconMargin; + iconRight = iconLeft + icon.getIntrinsicWidth(); + icon.setBounds(iconLeft, iconTop, iconRight, iconBottom); + } else if (dX < 0) { + backRight = itemView.getRight(); + backLeft = itemView.getRight() + (int) dX; + background.setBounds(backLeft, backTop, backRight, backBottom); + iconRight = itemView.getRight() - iconMargin; + iconLeft = iconRight - icon.getIntrinsicWidth(); + icon.setBounds(iconLeft, iconTop, iconRight, iconBottom); + } else { + background.setBounds(0, 0, 0, 0); + icon.setBounds(0, 0, 0, 0); + } + background.draw(c); + icon.draw(c); + + } + }).attachToRecyclerView(binding.logRecyclerView); + } + + + /** + * 设置显示模式。通联的呼号和日志两种表现方式 + */ + @SuppressLint("NotifyDataSetChanged") + private void setShowStyle() { + + if (mainViewModel.logListShowCallsign) { + binding.logViewStyleimageButton.setImageResource(R.drawable.ic_baseline_assignment_ind_24); + binding.logRecyclerView.setAdapter(logCallsignAdapter); + logCallsignAdapter.notifyDataSetChanged(); + binding.locationInMapImageButton.setVisibility(View.GONE);//隐藏定位按钮 + } else { + binding.logViewStyleimageButton.setImageResource(R.drawable.ic_baseline_assignment_24); + binding.logRecyclerView.setAdapter(logQSLAdapter); + logQSLAdapter.notifyDataSetChanged(); + binding.locationInMapImageButton.setVisibility(View.VISIBLE);//显示定位按钮 + } + + } + + /** + * 查询日志 + * + * @param callsign 呼号 + */ + private void queryByCallsign(String callsign, int offset) { + loading = true;//开始读数据 + //分两种查询 + if (mainViewModel.logListShowCallsign) { + if (offset == 0) {//说明是新增记录 + logCallsignAdapter.clearRecords();//清空记录 + } + + mainViewModel.databaseOpr.getQSLCallsignsByCallsign(false, offset, callsign, mainViewModel.queryFilter + , new OnQueryQSLCallsign() { + @Override + public void afterQuery(ArrayList records) { + requireActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + logCallsignAdapter.setQSLCallsignList(records); + loading = false; + } + }); + } + }); + } else { + if (offset == 0) {//说明是新增记录 + logQSLAdapter.clearRecords(); + } + mainViewModel.databaseOpr.getQSLRecordByCallsign(false, offset, callsign, mainViewModel.queryFilter + , new OnQueryQSLRecordCallsign() { + @Override + public void afterQuery(ArrayList records) { + requireActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + logQSLAdapter.setQSLList(records); + loading = false; + } + }); + } + }); + + } + } + + + /** + * 显示统计页面 + */ + private void showCountFragment() { + //用于Fragment的导航。 + NavHostFragment navHostFragment = (NavHostFragment) requireActivity() + .getSupportFragmentManager().findFragmentById(R.id.fragmentContainerView); + assert navHostFragment != null;//断言不为空 + navHostFragment.getNavController().navigate(R.id.countFragment); + } + + /** + * 显示QRZ查询界面 + * + * @param callsign 呼号 + */ + private void showQrzFragment(String callsign) { + NavHostFragment navHostFragment = (NavHostFragment) requireActivity() + .getSupportFragmentManager().findFragmentById(R.id.fragmentContainerView); + assert navHostFragment != null;//断言不为空 + Bundle bundle = new Bundle(); + bundle.putString(QRZ_Fragment.CALLSIGN_PARAM, callsign); + navHostFragment.getNavController().navigate(R.id.QRZ_Fragment, bundle); + } + + + /** + * 获取本机IP地址 + * + * @return IP 地址 + */ + @Nullable + private String getLocalIp() { + WifiManager wifiManager = (WifiManager) requireContext().getApplicationContext() + .getSystemService(Context.WIFI_SERVICE); + WifiInfo wifiInfo = wifiManager.getConnectionInfo(); + int ipAddress = wifiInfo.getIpAddress(); + if (ipAddress == 0) { + return null; + } + return ((ipAddress & 0xff) + "." + (ipAddress >> 8 & 0xff) + "." + (ipAddress >> 16 & 0xff) + + "." + (ipAddress >> 24 & 0xff)); + } + + @Override + public void onDestroy() { + //判断生成共享log线程是否还在工作,如果还在工作,要销毁对话框,防止出现not attached to window manager错误 + if (Boolean.TRUE.equals(mainViewModel.mutableShareRunning.getValue())) { + if (dialog != null) { + dialog.dismiss(); + dialog = null; + } + } + + super.onDestroy(); + } +} \ No newline at end of file diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/LoginIcomRadioDialog.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/LoginIcomRadioDialog.java new file mode 100644 index 00000000..a9f0e6c0 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/LoginIcomRadioDialog.java @@ -0,0 +1,222 @@ +package com.bg7yoz.ft8cn.ui; +/** + * 网络模式登录ICOM的对话框。 + * + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.annotation.SuppressLint; +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.Editable; +import android.text.TextWatcher; +import android.text.method.HideReturnsTransformationMethod; +import android.text.method.PasswordTransformationMethod; +import android.view.View; +import android.view.WindowManager; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ImageButton; + +import androidx.annotation.NonNull; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.MainViewModel; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.icom.IComWifiRig; +import com.bg7yoz.ft8cn.icom.XieGuWifiRig; +import com.bg7yoz.ft8cn.rigs.InstructionSet; + +public class LoginIcomRadioDialog extends Dialog { + private static final String TAG = "LoginIcomRadioDialog"; + private final MainViewModel mainViewModel; + private EditText inputIcomAddressEdit; + private EditText inputIcomPortEdit; + private EditText inputIcomUserNameEdit; + private EditText inputIcomPasswordEdit; + private Button icomLoginButton; + private boolean passVisible = false; + + + public LoginIcomRadioDialog(@NonNull Context context, MainViewModel mainViewModel) { + super(context); + this.mainViewModel = mainViewModel; + } + + @SuppressLint("NotifyDataSetChanged") + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.login_icom_dialog_layout); + inputIcomAddressEdit = (EditText) findViewById(R.id.inputIcomAddressEdit); + inputIcomPortEdit = (EditText) findViewById(R.id.inputIcomPortEdit); + inputIcomUserNameEdit = (EditText) findViewById(R.id.inputIcomUserNameEdit); + inputIcomPasswordEdit = (EditText) findViewById(R.id.inputIcomPasswordEdit); + icomLoginButton = (Button) findViewById(R.id.icomLoginButton); + ImageButton showPassImageButton = (ImageButton) findViewById(R.id.showPassImageButton); + + inputIcomAddressEdit.setText(GeneralVariables.icomIp); + inputIcomPortEdit.setText(String.valueOf(GeneralVariables.icomUdpPort)); + inputIcomUserNameEdit.setText(GeneralVariables.icomUserName); + inputIcomPasswordEdit.setText(GeneralVariables.icomPassword); + checkInput(); + icomLoginButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + + + if (GeneralVariables.instructionSet == InstructionSet.ICOM) {//icom 电台 + ToastMessage.show(String.format( + GeneralVariables.getStringFromResource(R.string.connect_icom_ip) + , inputIcomAddressEdit.getText())); + mainViewModel.connectWifiRig(new IComWifiRig(GeneralVariables.icomIp + , GeneralVariables.icomUdpPort + , GeneralVariables.icomUserName + , GeneralVariables.icomPassword)); + } else if (GeneralVariables.instructionSet == InstructionSet.XIEGU_6100) {//协谷x6100 + ToastMessage.show(String.format( + GeneralVariables.getStringFromResource(R.string.connect_xiegu_ip) + , inputIcomAddressEdit.getText())); + mainViewModel.connectWifiRig(new XieGuWifiRig(GeneralVariables.icomIp + , GeneralVariables.icomUdpPort + , GeneralVariables.icomUserName + , GeneralVariables.icomPassword)); + } + dismiss(); + } + }); + + + inputIcomAddressEdit.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + checkInput(); + GeneralVariables.icomIp = inputIcomAddressEdit.getText().toString().trim(); + writeConfig("icomIp", inputIcomAddressEdit.getText().toString().trim()); + } + }); + + inputIcomPortEdit.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + checkInput(); + if (GeneralVariables.isInteger(inputIcomPortEdit.getText().toString().trim())) { + writeConfig("icomPort", inputIcomPortEdit.getText().toString().trim()); + GeneralVariables.icomUdpPort = Integer.parseInt(inputIcomPortEdit.getText().toString().trim()); + } + } + }); + inputIcomUserNameEdit.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + checkInput(); + writeConfig("icomUserName", inputIcomUserNameEdit.getText().toString().trim()); + GeneralVariables.icomUserName = inputIcomUserNameEdit.getText().toString().trim(); + } + }); + inputIcomPasswordEdit.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + checkInput(); + writeConfig("icomPassword", inputIcomPasswordEdit.getText().toString()); + GeneralVariables.icomPassword = inputIcomPasswordEdit.getText().toString(); + } + }); + + showPassImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + passVisible = !passVisible; + if (passVisible) { + inputIcomPasswordEdit.setTransformationMethod( + HideReturnsTransformationMethod.getInstance()); + } else { + inputIcomPasswordEdit.setTransformationMethod( + PasswordTransformationMethod.getInstance()); + } + } + }); + } + + + public void checkInput() { + icomLoginButton.setEnabled(!inputIcomAddressEdit.getText().toString().isEmpty() + && !inputIcomPortEdit.getText().toString().isEmpty() + && !inputIcomUserNameEdit.getText().toString().isEmpty() + && !inputIcomPasswordEdit.getText().toString().isEmpty() + && GeneralVariables.isInteger(inputIcomPortEdit.getText().toString().trim()) + ); + } + + /** + * 把配置信息写到数据库 + * + * @param KeyName 关键词 + * @param Value 值 + */ + private void writeConfig(String KeyName, String Value) { + mainViewModel.databaseOpr.writeConfig(KeyName, Value, null); + } + + @Override + public void show() { + super.show(); + WindowManager.LayoutParams params = getWindow().getAttributes(); + //设置对话框的大小,以百分比0.6 + int height = getWindow().getWindowManager().getDefaultDisplay().getHeight(); + int width = getWindow().getWindowManager().getDefaultDisplay().getWidth(); +// params.height = (int) (height * 0.6); + if (width > height) { + params.width = (int) (width * 0.6); + //params.height = (int) (height * 0.6); + } else { + params.width = (int) (width * 0.8); + //params.height = (int) (height * 0.5); + } + getWindow().setAttributes(params); + } + + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/MyCallingFragment.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/MyCallingFragment.java new file mode 100644 index 00000000..4bd92fe8 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/MyCallingFragment.java @@ -0,0 +1,537 @@ +package com.bg7yoz.ft8cn.ui; +/** + * 呼叫界面。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.annotation.SuppressLint; +import android.content.res.Configuration; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.text.Editable; +import android.text.TextWatcher; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.AnimationUtils; +import android.widget.AdapterView; + +import androidx.annotation.NonNull; +import androidx.core.content.ContextCompat; +import androidx.fragment.app.Fragment; +import androidx.lifecycle.Observer; +import androidx.navigation.NavController; +import androidx.navigation.Navigation; +import androidx.navigation.fragment.NavHostFragment; +import androidx.recyclerview.widget.ItemTouchHelper; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.bg7yoz.ft8cn.Ft8Message; +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.MainViewModel; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.databinding.FragmentMyCallingBinding; +import com.bg7yoz.ft8cn.ft8transmit.FunctionOfTransmit; +import com.bg7yoz.ft8cn.ft8transmit.TransmitCallsign; +import com.bg7yoz.ft8cn.timer.UtcTimer; + +import java.util.ArrayList; + + +public class MyCallingFragment extends Fragment { + private static final String TAG = "MyCallingFragment"; + private FragmentMyCallingBinding binding; + private MainViewModel mainViewModel; + + private RecyclerView transmitRecycleView; + + private CallingListAdapter transmitCallListAdapter; + + private FunctionOrderSpinnerAdapter functionOrderSpinnerAdapter; + + + static { + System.loadLibrary("ft8cn"); + } + + + /** + * 马上对发起者呼叫 + * + * @param message 消息 + */ + //@RequiresApi(api = Build.VERSION_CODES.N) + private void doCallNow(Ft8Message message) { + mainViewModel.addFollowCallsign(message.getCallsignFrom()); + if (!mainViewModel.ft8TransmitSignal.isActivated()) { + mainViewModel.ft8TransmitSignal.setActivated(true); + GeneralVariables.transmitMessages.add(message);//把消息添加到关注列表中 + } + //呼叫发启者 + mainViewModel.ft8TransmitSignal.setTransmit(message.getFromCallTransmitCallsign() + , 1, message.extraInfo); + mainViewModel.ft8TransmitSignal.transmitNow(); + + GeneralVariables.resetLaunchSupervision();//复位自动监管 + } + + + /** + * 菜单选项 + * + * @param item 菜单 + * @return 是否选择 + */ + //@RequiresApi(api = Build.VERSION_CODES.N) + @Override + public boolean onContextItemSelected(@NonNull MenuItem item) { + //Ft8Message ft8Message = (Ft8Message) item.getActionView().getTag(); + + int position = (int) item.getActionView().getTag(); + Ft8Message ft8Message = transmitCallListAdapter.getMessageByPosition(position); + if (ft8Message == null) return super.onContextItemSelected(item); + ; + + GeneralVariables.resetLaunchSupervision();//复位自动监管 + switch (item.getItemId()) { + case 1://时序与发送者相反!!! + Log.d(TAG, "呼叫:" + ft8Message.getCallsignTo()); + if (!mainViewModel.ft8TransmitSignal.isActivated()) { + mainViewModel.ft8TransmitSignal.setActivated(true); + } + mainViewModel.ft8TransmitSignal.setTransmit(ft8Message.getToCallTransmitCallsign() + , 1, ft8Message.extraInfo); + mainViewModel.ft8TransmitSignal.transmitNow(); + break; + + case 3: + Log.d(TAG, "呼叫:" + ft8Message.getCallsignFrom()); + doCallNow(ft8Message); + //if (!mainViewModel.ft8TransmitSignal.isActivated()) { + // mainViewModel.ft8TransmitSignal.setActivated(true); + // } + // mainViewModel.ft8TransmitSignal.setTransmit(ft8Message.getFromCallTransmitCallsign() + // , 1, ft8Message.extraInfo); + //mainViewModel.ft8TransmitSignal.transmitNow(); + break; + + case 4://回复 + Log.d(TAG, "回复:" + ft8Message.getCallsignFrom()); + mainViewModel.addFollowCallsign(ft8Message.getCallsignFrom()); + if (!mainViewModel.ft8TransmitSignal.isActivated()) { + mainViewModel.ft8TransmitSignal.setActivated(true); + GeneralVariables.transmitMessages.add(ft8Message);//把消息添加到关注列表中 + } + //呼叫发启者 + mainViewModel.ft8TransmitSignal.setTransmit(ft8Message.getFromCallTransmitCallsign() + , -1, ft8Message.extraInfo); + mainViewModel.ft8TransmitSignal.transmitNow(); + break; + + case 5://to 的QRZ + showQrzFragment(ft8Message.getCallsignTo()); + break; + case 6://from 的QRZ + showQrzFragment(ft8Message.getCallsignFrom()); + break; + case 7://查to的日志 + navigateToLogFragment(ft8Message.getCallsignTo()); + break; + case 8://查from的日志 + navigateToLogFragment(ft8Message.getCallsignFrom()); + break; + + + } + + return super.onContextItemSelected(item); + } + /** + * 跳转到日志查询界面 + * @param callsign 呼号 + */ + private void navigateToLogFragment(String callsign){ + mainViewModel.queryKey=callsign;//把呼号作为关键字提交 + NavController navController = Navigation.findNavController(requireActivity() + , R.id.fragmentContainerView); + navController.navigate(R.id.action_menu_nav_mycalling_to_menu_nav_history);//跳转到日志 + } + /** + * 查询QRZ信息 + * + * @param callsign 呼号 + */ + private void showQrzFragment(String callsign) { + NavHostFragment navHostFragment = (NavHostFragment) requireActivity().getSupportFragmentManager().findFragmentById(R.id.fragmentContainerView); + assert navHostFragment != null;//断言不为空 + Bundle bundle = new Bundle(); + bundle.putString(QRZ_Fragment.CALLSIGN_PARAM, callsign); + navHostFragment.getNavController().navigate(R.id.QRZ_Fragment, bundle); + } + + @SuppressLint("NotifyDataSetChanged") + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + mainViewModel = MainViewModel.getInstance(this); + binding = FragmentMyCallingBinding.inflate(inflater, container, false); + + //当横屏时显示频谱图 + if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { + binding.messageSpectrumView.run(mainViewModel, this); + } + + + //发射消息的列表 + functionOrderSpinnerAdapter = new FunctionOrderSpinnerAdapter(requireContext(), mainViewModel); + binding.functionOrderSpinner.setAdapter(functionOrderSpinnerAdapter); + functionOrderSpinnerAdapter.notifyDataSetChanged(); + + + //关注的消息列表 + transmitRecycleView = binding.transmitRecycleView; + transmitCallListAdapter = new CallingListAdapter(this.getContext(), mainViewModel + , GeneralVariables.transmitMessages, CallingListAdapter.ShowMode.MY_CALLING); + transmitRecycleView.setLayoutManager(new LinearLayoutManager(requireContext())); + transmitRecycleView.setAdapter(transmitCallListAdapter); + + + transmitCallListAdapter.notifyDataSetChanged(); + + + //设置消息列表滑动,用于快速呼叫 + initRecyclerViewAction(); + //菜单 + requireActivity().registerForContextMenu(transmitRecycleView); + + //显示UTC时间 + mainViewModel.timerSec.observe(getViewLifecycleOwner(), new Observer() { + @Override + public void onChanged(Long aLong) { + binding.timerTextView.setText(UtcTimer.getTimeStr(aLong)); + } + }); + //显示发射频率 + GeneralVariables.mutableBaseFrequency.observe(getViewLifecycleOwner(), new Observer() { + @SuppressLint("DefaultLocale") + @Override + public void onChanged(Float aFloat) { + binding.baseFrequencyTextView.setText(String.format( + GeneralVariables.getStringFromResource(R.string.sound_frequency_is), aFloat)); + } + }); + + + //观察发射状态按钮的变化 + Observer transmittingObserver = new Observer() { + @Override + public void onChanged(Boolean aBoolean) { + if (mainViewModel.ft8TransmitSignal.isTransmitting()) { + binding.setTransmitImageButton.setImageResource(R.drawable.ic_baseline_send_red_48); + binding.setTransmitImageButton.setAnimation(AnimationUtils.loadAnimation(getContext(), R.anim.view_blink)); + } else { + //录音对象也要处于启动状态才可以有发射的状态 + if (mainViewModel.ft8TransmitSignal.isActivated() && mainViewModel.hamRecorder.isRunning()) { + binding.setTransmitImageButton.setImageResource(R.drawable.ic_baseline_send_white_48); + } else { + binding.setTransmitImageButton.setImageResource(R.drawable.ic_baseline_cancel_schedule_send_off); + } + binding.setTransmitImageButton.setAnimation(null); + } + + //暂停播放按键 + if (mainViewModel.ft8TransmitSignal.isTransmitting()) { + binding.pauseTransmittingImageButton.setImageResource(R.drawable.ic_baseline_pause_circle_outline_24); + binding.pauseTransmittingImageButton.setVisibility(View.VISIBLE); + } else { + binding.pauseTransmittingImageButton.setVisibility(View.GONE); + binding.pauseTransmittingImageButton.setImageResource(R.drawable.ic_baseline_pause_disable_circle_outline_24); + } + } + }; + //显示发射状态 + mainViewModel.ft8TransmitSignal.mutableIsTransmitting.observe(getViewLifecycleOwner(), transmittingObserver); + mainViewModel.ft8TransmitSignal.mutableIsActivated.observe(getViewLifecycleOwner(), transmittingObserver); + + //暂停按钮 + binding.pauseTransmittingImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + mainViewModel.ft8TransmitSignal.setTransmitting(false); + GeneralVariables.resetLaunchSupervision();//复位自动监管 + } + }); + + //监视命令程序 + mainViewModel.ft8TransmitSignal.mutableFunctions.observe(getViewLifecycleOwner() + , new Observer>() { + @Override + public void onChanged(ArrayList functionOfTransmits) { + functionOrderSpinnerAdapter.notifyDataSetChanged(); + } + }); + + //观察指令序号的变化 + mainViewModel.ft8TransmitSignal.mutableFunctionOrder.observe(getViewLifecycleOwner(), new Observer() { + @Override + public void onChanged(Integer integer) { + if (mainViewModel.ft8TransmitSignal.functionList.size() < 6) { + binding.functionOrderSpinner.setSelection(0); + } else { + binding.functionOrderSpinner.setSelection(integer - 1); + } + } + }); + + //设置当指令序号被选择的事件 + binding.functionOrderSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView adapterView, View view, int i, long l) { + if (mainViewModel.ft8TransmitSignal.functionList.size() > 1) { + mainViewModel.ft8TransmitSignal.setCurrentFunctionOrder(i + 1); + } + } + + @Override + public void onNothingSelected(AdapterView adapterView) { + + } + }); + + + //显示当前目标呼号 + mainViewModel.ft8TransmitSignal.mutableToCallsign.observe(getViewLifecycleOwner(), new Observer() { + @Override + public void onChanged(TransmitCallsign transmitCallsign) { + if (GeneralVariables.toModifier!=null) { + binding.toCallsignTextView.setText(String.format( + GeneralVariables.getStringFromResource(R.string.target_callsign) + , transmitCallsign.callsign+" "+GeneralVariables.toModifier)); + }else { + binding.toCallsignTextView.setText(String.format( + GeneralVariables.getStringFromResource(R.string.target_callsign) + , transmitCallsign.callsign)); + } + } + }); + + //显示当前发射的时序 + mainViewModel.ft8TransmitSignal.mutableSequential.observe(getViewLifecycleOwner(), new Observer() { + @SuppressLint("DefaultLocale") + @Override + public void onChanged(Integer integer) { + binding.transmittingSequentialTextView.setText( + String.format(GeneralVariables.getStringFromResource(R.string.transmission_sequence) + , integer)); + } + }); + + //设置发射按钮 + binding.setTransmitImageButton.setOnClickListener(new View.OnClickListener() { + //@RequiresApi(api = Build.VERSION_CODES.N) + @Override + public void onClick(View view) { + //如果 + if (!mainViewModel.ft8TransmitSignal.isActivated()) { + mainViewModel.ft8TransmitSignal.restTransmitting(); + } + mainViewModel.ft8TransmitSignal.setActivated(!mainViewModel.ft8TransmitSignal.isActivated()); + GeneralVariables.resetLaunchSupervision();//复位自动监管 + } + }); + + //观察传输消息列表的变化 + //mainViewModel.mutableTransmitMessages.observe(getViewLifecycleOwner(), new Observer>() { + mainViewModel.mutableTransmitMessagesCount.observe(getViewLifecycleOwner(), new Observer() { + @SuppressLint("DefaultLocale") + @Override + public void onChanged(Integer count) { + binding.decoderCounterTextView.setText(String.format( + GeneralVariables.getStringFromResource(R.string.message_count) + , GeneralVariables.transmitMessages.size())); + //if (count == 0) { + transmitCallListAdapter.notifyDataSetChanged(); + //} else { + // transmitCallListAdapter.notifyItemInserted( + // GeneralVariables.transmitMessages.size() - count); + //} + + //当列表下部稍微多出一些,自动上移 + if (transmitRecycleView.computeVerticalScrollRange() + - transmitRecycleView.computeVerticalScrollExtent() + - transmitRecycleView.computeVerticalScrollOffset() < 300) { + transmitRecycleView.scrollToPosition(transmitCallListAdapter.getItemCount() - 1); + } + } + }); + + //清除传输消息列表 + binding.clearMycallListImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + mainViewModel.clearTransmittingMessage(); + } + }); + + //复位到CQ按键 + binding.resetToCQImageView.setOnClickListener(new View.OnClickListener() { + //@RequiresApi(api = Build.VERSION_CODES.N) + @Override + public void onClick(View view) { + mainViewModel.ft8TransmitSignal.resetToCQ(); + GeneralVariables.resetLaunchSupervision();//复位自动监管 + } + }); + //自由文本输入框的限定操作 + binding.transFreeTextEdit.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + mainViewModel.ft8TransmitSignal.setFreeText(editable.toString().toUpperCase()); + } + }); + binding.resetToCQImageView.setLongClickable(true); + binding.resetToCQImageView.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View view) { + mainViewModel.setTransmitIsFreeText(!mainViewModel.getTransitIsFreeText()); + showFreeTextEdit(); + return true; + } + }); + + binding.mycallToolsBar.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + GeneralVariables.simpleCallItemMode=!GeneralVariables.simpleCallItemMode; + transmitRecycleView.setAdapter(transmitCallListAdapter); + transmitCallListAdapter.notifyDataSetChanged(); + transmitRecycleView.scrollToPosition(transmitCallListAdapter.getItemCount() - 1); + if (GeneralVariables.simpleCallItemMode){ + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.message_list_simple_mode)); + }else { + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.message_list_standard_mode)); + } + } + }); + + + showFreeTextEdit(); + return binding.getRoot(); + } + + private void showFreeTextEdit() { + if (mainViewModel.getTransitIsFreeText()) { + binding.transFreeTextEdit.setVisibility(View.VISIBLE); + binding.functionOrderSpinner.setVisibility(View.GONE); + } else { + binding.transFreeTextEdit.setVisibility(View.GONE); + binding.functionOrderSpinner.setVisibility(View.VISIBLE); + } + } + + /** + * 设置列表滑动动作 + */ + private void initRecyclerViewAction() { + new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(ItemTouchHelper.ANIMATION_TYPE_DRAG + , ItemTouchHelper.START | ItemTouchHelper.END) { + @Override + public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder + , @NonNull RecyclerView.ViewHolder target) { + return false; + } + + //@RequiresApi(api = Build.VERSION_CODES.N) + @SuppressLint("NotifyDataSetChanged") + @Override + public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) { + if (direction == ItemTouchHelper.START) { + Ft8Message message = transmitCallListAdapter.getMessageByViewHolder(viewHolder); + if (message != null) { + //呼叫的目标不能是自己 + if (!message.getCallsignFrom().equals("<...>") + //&& !message.getCallsignFrom().equals(GeneralVariables.myCallsign) + && !GeneralVariables.checkIsMyCallsign(message.getCallsignFrom()) + && !(message.i3 == 0 && message.n3 == 0)) { + doCallNow(message); + } + } + transmitCallListAdapter.notifyItemChanged(viewHolder.getAdapterPosition()); + } + if (direction == ItemTouchHelper.END) {//删除 + transmitCallListAdapter.deleteMessage(viewHolder.getAdapterPosition()); + transmitCallListAdapter.notifyItemRemoved(viewHolder.getAdapterPosition()); + } + } + + + @Override + public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) { + super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive); + //制作呼叫背景的图标显示 + Drawable callIcon = ContextCompat.getDrawable(requireActivity(), R.drawable.ic_baseline_send_red_48); + Drawable delIcon = ContextCompat.getDrawable(requireActivity(), R.drawable.log_item_delete_icon); + Drawable background = new ColorDrawable(Color.LTGRAY); + Ft8Message message = transmitCallListAdapter.getMessageByViewHolder(viewHolder); + if (message == null) { + return; + } + if (message.getCallsignFrom().equals("<...>")) {//如果属于不能呼叫的消息,就不显示图标 + return; + } + Drawable icon; + if (dX > 0) { + icon = delIcon; + } else { + icon = callIcon; + } + View itemView = viewHolder.itemView; + int iconMargin = (itemView.getHeight() - icon.getIntrinsicHeight()) / 2; + int iconLeft, iconRight, iconTop, iconBottom; + int backTop, backBottom, backLeft, backRight; + backTop = itemView.getTop(); + backBottom = itemView.getBottom(); + iconTop = itemView.getTop() + (itemView.getHeight() - icon.getIntrinsicHeight()) / 2; + iconBottom = iconTop + icon.getIntrinsicHeight(); + if (dX > 0) { + backLeft = itemView.getLeft(); + backRight = itemView.getLeft() + (int) dX; + background.setBounds(backLeft, backTop, backRight, backBottom); + iconLeft = itemView.getLeft() + iconMargin; + iconRight = iconLeft + icon.getIntrinsicWidth(); + icon.setBounds(iconLeft, iconTop, iconRight, iconBottom); + } else if (dX < 0) { + backRight = itemView.getRight(); + backLeft = itemView.getRight() + (int) dX; + background.setBounds(backLeft, backTop, backRight, backBottom); + iconRight = itemView.getRight() - iconMargin; + iconLeft = iconRight - icon.getIntrinsicWidth(); + icon.setBounds(iconLeft, iconTop, iconRight, iconBottom); + } else { + background.setBounds(0, 0, 0, 0); + icon.setBounds(0, 0, 0, 0); + } + background.draw(c); + icon.draw(c); + + } + }).attachToRecyclerView(binding.transmitRecycleView); + } +} \ No newline at end of file diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/NoReplyLimitSpinnerAdapter.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/NoReplyLimitSpinnerAdapter.java new file mode 100644 index 00000000..8c13f5de --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/NoReplyLimitSpinnerAdapter.java @@ -0,0 +1,64 @@ +package com.bg7yoz.ft8cn.ui; +/** + * 未回答时间列表。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.annotation.SuppressLint; +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.TextView; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; + +import java.util.ArrayList; +import java.util.List; + +public class NoReplyLimitSpinnerAdapter extends BaseAdapter { + private final List noReplyCount=new ArrayList<>(); + private final Context mContext; + + public NoReplyLimitSpinnerAdapter(Context context) { + mContext=context; + for (int i = 0; i <= 30; i++) { + noReplyCount.add(i); + } + } + + @Override + public int getCount() { + return noReplyCount.size(); + } + + @Override + public Object getItem(int i) { + return noReplyCount.get(i); + } + + @Override + public long getItemId(int i) { + return i; + } + + @SuppressLint({"DefaultLocale", "ViewHolder", "InflateParams"}) + @Override + public View getView(int i, View view, ViewGroup viewGroup) { + LayoutInflater _LayoutInflater=LayoutInflater.from(mContext); + view=_LayoutInflater.inflate(R.layout.no_reply_limit_spinner_item, null); + if (view!=null){ + TextView textView=(TextView)view.findViewById(R.id.noReplyLimitCountItemTextView); + if (i==0){ + textView.setText(GeneralVariables.getStringFromResource(R.string.ignore)); + } + else { + textView.setText(String.format(GeneralVariables.getStringFromResource(R.string.times), i)); + } + } + return view; + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/PttDelaySpinnerAdapter.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/PttDelaySpinnerAdapter.java new file mode 100644 index 00000000..36ef0eb9 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/PttDelaySpinnerAdapter.java @@ -0,0 +1,60 @@ +package com.bg7yoz.ft8cn.ui; +/** + * PTT延迟发射列表。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.annotation.SuppressLint; +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.TextView; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; + +import java.util.ArrayList; +import java.util.List; + +public class PttDelaySpinnerAdapter extends BaseAdapter { + private final List delayTime=new ArrayList<>(); + private final Context mContext; + + public PttDelaySpinnerAdapter(Context context) { + mContext=context; + for (int i = 0; i < 20; i++) { + delayTime.add(i*10); + } + } + + @Override + public int getCount() { + return delayTime.size(); + } + + @Override + public Object getItem(int i) { + return delayTime.get(i); + } + + @Override + public long getItemId(int i) { + return i; + } + + @SuppressLint({"DefaultLocale", "ViewHolder", "InflateParams"}) + @Override + public View getView(int i, View view, ViewGroup viewGroup) { + LayoutInflater _LayoutInflater=LayoutInflater.from(mContext); + view=_LayoutInflater.inflate(R.layout.ptt_delay_spinner_item, null); + if (view!=null){ + TextView textView=(TextView)view.findViewById(R.id.pttDelayItemTextView); + textView.setText(String.format( + GeneralVariables.getStringFromResource(R.string.milliseconds),delayTime.get(i))); + } + return view; + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/QRZ_Fragment.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/QRZ_Fragment.java new file mode 100644 index 00000000..021f5124 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/QRZ_Fragment.java @@ -0,0 +1,68 @@ +package com.bg7yoz.ft8cn.ui; +/** + * 查QRZ的web View。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.annotation.SuppressLint; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; + +import androidx.fragment.app.Fragment; + +import com.bg7yoz.ft8cn.databinding.FragmentQrzBinding; + + +public class QRZ_Fragment extends Fragment { + private FragmentQrzBinding binding; + + public static final String CALLSIGN_PARAM = "callsign"; + + private String qrzParam; + + + + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (getArguments() != null) { + qrzParam = getArguments().getString(CALLSIGN_PARAM); + } + } + + @SuppressLint("SetJavaScriptEnabled") + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + binding=FragmentQrzBinding.inflate(inflater, container, false); + binding.qrzWebView.getSettings().setJavaScriptEnabled(true); + //binding.qrzWebView.getSettings().setDomStorageEnabled(true); // 这个要加上 + binding.qrzWebView.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); + binding.qrzWebView.getSettings().setUseWideViewPort(true); + + binding.qrzWebView.getSettings().setLoadWithOverviewMode(true); + binding.qrzWebView.getSettings().setSupportZoom(true); + binding.qrzWebView.getSettings().setBuiltInZoomControls(true); + String url = String.format("https://www.qrz.com/db/%s",qrzParam); + WebViewClient webViewClient = new WebViewClient() { + @Override + public boolean shouldOverrideUrlLoading(WebView view, String url) { + super.shouldOverrideUrlLoading(view, url); + view.loadUrl(url); + return true; + } + }; + binding.qrzWebView.setWebViewClient(webViewClient); + + + binding.qrzWebView.loadUrl(url); + return binding.getRoot(); + } +} \ No newline at end of file diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/RadioGroupFt8cn.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/RadioGroupFt8cn.java new file mode 100644 index 00000000..450e4ec4 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/RadioGroupFt8cn.java @@ -0,0 +1,125 @@ +package com.bg7yoz.ft8cn.ui; +/** + * 用于可以自动换行的RadioGroup控件 + * 原生RadioGroup控件在布局不够宽度时,无法把RadioButton自动换行,此控件可以自动换行 + * @author BGY70Z + * @date 2023-08-30 + */ +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; +import android.widget.RadioGroup; + +public class RadioGroupFt8cn extends RadioGroup { + public RadioGroupFt8cn(Context context) { + super(context); + } + + public RadioGroupFt8cn(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int widthSize = MeasureSpec.getSize(widthMeasureSpec); + int widthMode = MeasureSpec.getMode(widthMeasureSpec); + int heightSize = MeasureSpec.getSize(heightMeasureSpec); + int heightMode = MeasureSpec.getMode(heightMeasureSpec); + + //调用ViewGroup的方法,测量子view + measureChildren(widthMeasureSpec, heightMeasureSpec); + + //最大的宽 + int maxWidth = 0; + //累计的高 + int totalHeight = 0; + + //当前这一行的累计行宽 + int lineWidth = 0; + //当前这行的最大行高 + int maxLineHeight = 0; + //用于记录换行前的行宽和行高 + int oldHeight; + int oldWidth; + + int count = getChildCount(); + //假设 widthMode和heightMode都是AT_MOST + for (int i = 0; i < count; i++) { + View child = getChildAt(i); + MarginLayoutParams params = (MarginLayoutParams) child.getLayoutParams(); + //得到这一行的最高 + oldHeight = maxLineHeight; + //当前最大宽度 + oldWidth = maxWidth; + + int deltaX = child.getMeasuredWidth() + params.leftMargin + params.rightMargin; + if (lineWidth + deltaX + getPaddingLeft() + getPaddingRight() > widthSize) {//如果折行,height增加 + //和目前最大的宽度比较,得到最宽。不能加上当前的child的宽,所以用的是oldWidth + maxWidth = Math.max(lineWidth, oldWidth); + //重置宽度 + lineWidth = deltaX; + //累加高度 + totalHeight += oldHeight; + //重置行高,当前这个View,属于下一行,因此当前最大行高为这个child的高度加上margin + maxLineHeight = child.getMeasuredHeight() + params.topMargin + params.bottomMargin; + + } else { + //不换行,累加宽度 + lineWidth += deltaX; + //不换行,计算行最高 + int deltaY = child.getMeasuredHeight() + params.topMargin + params.bottomMargin; + maxLineHeight = Math.max(maxLineHeight, deltaY); + } + if (i == count - 1) { + //前面没有加上下一行的搞,如果是最后一行,还要再叠加上最后一行的最高的值 + totalHeight += maxLineHeight; + //计算最后一行和前面的最宽的一行比较 + maxWidth = Math.max(lineWidth, oldWidth); + } + } + + //加上当前容器的padding值 + maxWidth += getPaddingLeft() + getPaddingRight(); + totalHeight += getPaddingTop() + getPaddingBottom(); + setMeasuredDimension(widthMode == MeasureSpec.EXACTLY ? widthSize : maxWidth, + heightMode == MeasureSpec.EXACTLY ? heightSize : totalHeight); + + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + int count = getChildCount(); + //pre为前面所有的child的相加后的位置 + int preLeft = getPaddingLeft(); + int preTop = getPaddingTop(); + //记录每一行的最高值 + int maxHeight = 0; + for (int i = 0; i < count; i++) { + View child = getChildAt(i); + MarginLayoutParams params = (MarginLayoutParams) child.getLayoutParams(); + //r-l为当前容器的宽度。如果子view的累积宽度大于容器宽度,就换行。 + if (preLeft + params.leftMargin + child.getMeasuredWidth() + params.rightMargin + getPaddingRight() > (r - l)) { + //重置 + preLeft = getPaddingLeft(); + //要选择child的height最大的作为设置 + preTop = preTop + maxHeight; + maxHeight = getChildAt(i).getMeasuredHeight() + params.topMargin + params.bottomMargin; + } else { //不换行,计算最大高度 + maxHeight = Math.max(maxHeight, child.getMeasuredHeight() + params.topMargin + params.bottomMargin); + } + //left坐标 + int left = preLeft + params.leftMargin; + //top坐标 + int top = preTop + params.topMargin; + int right = left + child.getMeasuredWidth(); + int bottom = top + child.getMeasuredHeight(); + //为子view布局 + child.layout(left, top, right, bottom); + //计算布局结束后,preLeft的值 + preLeft += params.leftMargin + child.getMeasuredWidth() + params.rightMargin; + + } + + + } +} \ No newline at end of file diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/RigNameSpinnerAdapter.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/RigNameSpinnerAdapter.java new file mode 100644 index 00000000..508f3274 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/RigNameSpinnerAdapter.java @@ -0,0 +1,71 @@ +package com.bg7yoz.ft8cn.ui; +/** + * 电台型号列表。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.annotation.SuppressLint; +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.TextView; + +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.database.RigNameList; + +public class RigNameSpinnerAdapter extends BaseAdapter { + private final Context mContext; + private final RigNameList rigNameList; + public RigNameSpinnerAdapter(Context context) { + rigNameList=RigNameList.getInstance(context); + mContext=context; + } + + public RigNameList.RigName getRigName(int index){ + return rigNameList.getRigNameByIndex(index); + } + @Override + public int getCount() { + return rigNameList.rigList.size(); + } + + @Override + public Object getItem(int i) { + return rigNameList.rigList.get(i); + } + + @Override + public long getItemId(int i) { + return i; + } + + @SuppressLint({"ViewHolder", "InflateParams", "UseCompatLoadingForDrawables"}) + @Override + public View getView(int i, View view, ViewGroup viewGroup) { + LayoutInflater _LayoutInflater=LayoutInflater.from(mContext); + view=_LayoutInflater.inflate(R.layout.rig_name_spinner_item, null); + if (view!=null){ + TextView textView=view.findViewById(R.id.rigNameItemTextView); + if (rigNameList.getRigNameInfo(i).startsWith("#")) { + view.setVisibility(View.GONE); + } + ImageView imageView=view.findViewById(R.id.rigLogoImageView); + if (rigNameList.getRigNameInfo(i).toUpperCase().contains("GUOHE")){ + imageView.setImageDrawable(mContext.getDrawable(R.drawable.guohe_logo)); + imageView.setVisibility(View.VISIBLE); + }else if (rigNameList.getRigNameInfo(i).toUpperCase().contains("XIEGU")){ + imageView.setImageDrawable(mContext.getDrawable(R.drawable.xiegulogo)); + imageView.setVisibility(View.VISIBLE); + }else { + imageView.setVisibility(View.GONE); + imageView.setImageDrawable(null); + } + textView.setText(rigNameList.getRigNameInfo(i)); + } + return view; + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/RulerFrequencyView.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/RulerFrequencyView.java new file mode 100644 index 00000000..bda78983 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/RulerFrequencyView.java @@ -0,0 +1,123 @@ +package com.bg7yoz.ft8cn.ui; +/** + * 频率标尺,自定义控件。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; +import android.util.AttributeSet; +import android.util.TypedValue; +import android.view.View; + +import androidx.annotation.Nullable; + +public class RulerFrequencyView extends View { + private static final String TAG = "RulerFrequencyView"; + private int rulerWidth = getWidth(); + private int freq = 1000; + + public RulerFrequencyView(Context context) { + super(context); + } + + public RulerFrequencyView(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + public RulerFrequencyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + @Override + protected void onDraw(Canvas canvas) { + //Log.d(TAG, String.format("onDraw: rulerWidth:%d,getWidth:%d", rulerWidth, getWidth())); + drawRuler(canvas); + super.onDraw(canvas); + } + + /** + * 把dp值转换为像素点 + * + * @param dp dp值 + * @return 像素点 + */ + private int dpToPixel(int dp) { + return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp + , getResources().getDisplayMetrics()); + } + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + //Log.d(TAG, String.format("onSizeChanged: rulerWidth:%d,getWidth:%d", w, getWidth())); + rulerWidth = w; + super.onSizeChanged(w, h, oldw, oldh); + } + + @SuppressLint({"DefaultLocale", "ResourceAsColor"}) + public void drawRuler(Canvas canvas) { + int top = 1; + //rulerWidth=getRight(); + int width_rate = Math.round((float) rulerWidth / 30f); + int lineWidth = (int) (getResources().getDisplayMetrics().density); + int lineHeight = (int) (2 * getResources().getDisplayMetrics().density); + Rect rect = new Rect(); + Paint paint = new Paint(); + paint.setColor(0xff00ffff); + for (int i = 0; i <= 300; i++) { + if (i % 1 == 0) { + rect.top = top; + rect.left = Math.round((float) i * width_rate); + rect.right = rect.left + lineWidth; + if (i % 5 == 0) { + rect.bottom = top + lineHeight * 3; + Paint fontPaint = new Paint(); + fontPaint.setTextSize(dpToPixel(8)); + fontPaint.setColor(0xff00ffff); + fontPaint.setAntiAlias(true); + fontPaint.setDither(true); + if (i == 0) { + fontPaint.setTextAlign(Paint.Align.LEFT); + } else if (i == 300) { + fontPaint.setTextAlign(Paint.Align.RIGHT); + } else { + fontPaint.setTextAlign(Paint.Align.CENTER); + } + canvas.drawText(String.format("%dHz", i * 100), rect.left + , rect.bottom + 8 * getResources().getDisplayMetrics().density + , fontPaint); + + } else { + rect.bottom = top + lineHeight; + } + canvas.drawRect(rect, paint); + + } + } + //主线 + rect.top = 1; + rect.left = 0; + rect.right = rulerWidth; + rect.bottom = (int) (rect.top + 2*getResources().getDisplayMetrics().density); + canvas.drawRect(rect, paint); + + //当前频率范围标记。红色块 + Rect mark = new Rect(); + paint.setColor(0xffff0000); + mark.top = 1; + mark.left = width_rate * (freq - 50) / 100; + mark.right = width_rate * (freq + 50) / 100; + mark.bottom = (int) (mark.top + 3*getResources().getDisplayMetrics().density); + canvas.drawRect(mark, paint); + + } + + public void setFreq(int freq) { + this.freq = freq; + this.postInvalidate(); + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/SelectBluetoothDialog.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/SelectBluetoothDialog.java new file mode 100644 index 00000000..c3a2dbe6 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/SelectBluetoothDialog.java @@ -0,0 +1,220 @@ +package com.bg7yoz.ft8cn.ui; +/** + * 蓝牙设备选择对话框。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.annotation.SuppressLint; +import android.app.Dialog; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.content.Context; +import android.os.Bundle; +import android.os.Handler; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.MainViewModel; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.bluetooth.BluetoothConstants; + +import java.util.ArrayList; + +public class SelectBluetoothDialog extends Dialog { + class BluetoothDeviceInfo { + BluetoothDevice device; + boolean isSPP; + boolean isHeadSet; + + public BluetoothDeviceInfo(BluetoothDevice device, boolean isSPP,boolean isHeadSet) { + this.device = device; + this.isSPP = isSPP; + this.isHeadSet=isHeadSet; + } + } + + private MainViewModel mainViewModel; + private BluetoothAdapter bluetoothAdapter; + private final ArrayList devices = new ArrayList<>(); + private RecyclerView devicesRecyclerView; + private BluetoothDevicesAdapter blueToothListAdapter; + + private ImageView upImage; + private ImageView downImage; + + + public SelectBluetoothDialog(@NonNull Context context, MainViewModel mainViewModel) { + super(context); + this.mainViewModel = mainViewModel; + + } + + + + @SuppressLint({"MissingPermission", "NotifyDataSetChanged"}) + private void getBluetoothDevice() { + devices.clear(); + if (bluetoothAdapter == null) { + return; + } + for (BluetoothDevice device : bluetoothAdapter.getBondedDevices()) { + if (BluetoothConstants.checkIsSpp(device)){//spp设备放前面 + devices.add(0,new BluetoothDeviceInfo(device,true,BluetoothConstants.checkIsHeadSet(device))); + continue; + } + if (BluetoothConstants.checkIsHeadSet(device)){//headset设备放后面 + devices.add(new BluetoothDeviceInfo(device, false,BluetoothConstants.checkIsHeadSet(device))); + continue; + } + } + + blueToothListAdapter.notifyDataSetChanged(); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.select_bluetooth_dialog_layout); + devicesRecyclerView = (RecyclerView) findViewById(R.id.bluetoothListRecyclerView); + bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); + blueToothListAdapter = new BluetoothDevicesAdapter(); + devicesRecyclerView.setLayoutManager(new LinearLayoutManager(getContext())); + devicesRecyclerView.setAdapter(blueToothListAdapter); + upImage=(ImageView) findViewById(R.id.bluetoothScrollUpImageView); + downImage=(ImageView)findViewById(R.id.bluetoothScrollDownImageView); + getBluetoothDevice(); + + //显示滚动箭头 + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + setScrollImageVisible(); + } + }, 1000); + devicesRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { + super.onScrolled(recyclerView, dx, dy); + setScrollImageVisible(); + } + }); + + } + + @Override + public void show() { + super.show(); + WindowManager.LayoutParams params = getWindow().getAttributes(); + //设置对话框的大小,以百分比0.6 + int height = getWindow().getWindowManager().getDefaultDisplay().getHeight(); + int width = getWindow().getWindowManager().getDefaultDisplay().getWidth(); +// params.height = (int) (height * 0.6); + if (width > height) { + params.width = (int) (width * 0.6); + params.height = (int) (height * 0.6); + } else { + params.width = (int) (width * 0.8); + params.height = (int) (height * 0.5); + } + getWindow().setAttributes(params); + + } + /** + * 设置界面的上下滚动的图标 + */ + private void setScrollImageVisible() { + + if (devicesRecyclerView.canScrollVertically(1)) { + upImage.setVisibility(View.VISIBLE); + } else { + upImage.setVisibility(View.GONE); + } + + if (devicesRecyclerView.canScrollVertically(-1)) { + downImage.setVisibility(View.VISIBLE); + } else { + downImage.setVisibility(View.GONE); + } + } + + class BluetoothDevicesAdapter extends RecyclerView.Adapter { + + @NonNull + @Override + public BluetoothHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext()); + View view = layoutInflater.inflate(R.layout.bluetooth_device_list_item, parent, false); + final BluetoothDevicesAdapter.BluetoothHolder holder = new BluetoothDevicesAdapter.BluetoothHolder(view); + return holder; + } + + @SuppressLint("MissingPermission") + @Override + public void onBindViewHolder(@NonNull BluetoothHolder holder, int position) { + holder.device = devices.get(position); + holder.bluetoothNameTextView.setText(holder.device.device.getName()); + if (holder.device.isSPP){ + holder.bluetoothNameTextView.setTextColor(getContext().getResources().getColor( + R.color.bluetooth_device_enable_color)); + }else { + holder.bluetoothNameTextView.setTextColor(getContext().getResources().getColor( + R.color.bluetooth_device_disable_color)); + } + if (BluetoothConstants.checkIsHeadSet(holder.device.device)){ + holder.headsetImageView.setVisibility(View.VISIBLE); + }else { + holder.headsetImageView.setVisibility(View.GONE); + } + if (BluetoothConstants.checkIsSpp(holder.device.device)){ + holder.sppDeviceImageView.setVisibility(View.VISIBLE); + }else { + holder.sppDeviceImageView.setVisibility(View.GONE); + } + holder.bluetoothAddressTextView.setText(holder.device.device.getAddress()); + + holder.bluetoothListConstraintLayout.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + ToastMessage.show(String.format( + GeneralVariables.getStringFromResource(R.string.select_bluetooth_device) + ,holder.device.device.getName())); + mainViewModel.connectBluetoothRig(GeneralVariables.getMainContext(), holder.device.device); + + dismiss(); + } + }); + } + + @Override + public int getItemCount() { + return devices.size(); + } + + class BluetoothHolder extends RecyclerView.ViewHolder { + public BluetoothDeviceInfo device; + TextView bluetoothNameTextView, bluetoothAddressTextView; + ConstraintLayout bluetoothListConstraintLayout; + ImageView headsetImageView,sppDeviceImageView; + public BluetoothHolder(@NonNull View itemView) { + super(itemView); + bluetoothNameTextView = itemView.findViewById(R.id.bluetoothNameTextView); + bluetoothAddressTextView = itemView.findViewById(R.id.bluetoothAddressTextView); + bluetoothListConstraintLayout = itemView.findViewById(R.id.bluetoothListConstraintLayout); + headsetImageView = itemView.findViewById(R.id.headsetImageView); + sppDeviceImageView = itemView.findViewById(R.id.sppDeviceImageView); + } + } + } + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/SelectFlexRadioDialog.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/SelectFlexRadioDialog.java new file mode 100644 index 00000000..209f1853 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/SelectFlexRadioDialog.java @@ -0,0 +1,244 @@ +package com.bg7yoz.ft8cn.ui; +/** + * FlexRadio选择对话框。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.annotation.SuppressLint; +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.os.Handler; +import android.text.Editable; +import android.text.TextWatcher; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.widget.EditText; +import android.widget.ImageButton; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.MainViewModel; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.flex.FlexRadio; +import com.bg7yoz.ft8cn.flex.FlexRadioFactory; + +public class SelectFlexRadioDialog extends Dialog { + private static final String TAG="SelectFlexRadioDialog"; + private final MainViewModel mainViewModel; + private RecyclerView flexRecyclerView; + private ImageView upImage; + private ImageView downImage; + private FlexRadioFactory flexRadioFactory; + private FlexRadioAdapter flexRadioAdapter; + private ImageButton connectFlexImageButton; + private EditText inputFlexAddressEdit; + + + + public SelectFlexRadioDialog(@NonNull Context context, MainViewModel mainViewModel){ + super(context); + this.mainViewModel = mainViewModel; + } + + @SuppressLint("NotifyDataSetChanged") + @Override + protected void onCreate(Bundle savedInstanceState){ + super.onCreate(savedInstanceState); + setContentView(R.layout.select_flex_dialog_layout); + flexRecyclerView=(RecyclerView) findViewById(R.id.flexRadioListRecyclerView); + flexRecyclerView.setLayoutManager(new LinearLayoutManager(getContext())); + upImage=(ImageView) findViewById(R.id.flexRadioScrollUpImageView); + downImage=(ImageView)findViewById(R.id.flexRadioScrollDownImageView); + inputFlexAddressEdit=(EditText)findViewById(R.id.inputFlexAddressEdit); + connectFlexImageButton=(ImageButton) findViewById(R.id.connectFlexImageButton); + connectFlexImageButton.setEnabled(false); + connectFlexImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + ToastMessage.show(String.format( + GeneralVariables.getStringFromResource(R.string.connect_flex_ip) + ,inputFlexAddressEdit.getText())); + FlexRadio flexRadio=new FlexRadio(); + Log.e(TAG, "onClick: "+inputFlexAddressEdit.getText().toString()); + flexRadio.setIp(inputFlexAddressEdit.getText().toString()); + flexRadio.setModel("FlexRadio"); + mainViewModel.connectFlexRadioRig(GeneralVariables.getMainContext(),flexRadio); + + dismiss(); + } + }); + + inputFlexAddressEdit.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + connectFlexImageButton.setEnabled(!inputFlexAddressEdit.getText().toString().isEmpty()); + } + }); + + + + + flexRadioAdapter=new FlexRadioAdapter(); + flexRecyclerView.setAdapter(flexRadioAdapter); + + flexRadioFactory = FlexRadioFactory.getInstance(); + + + flexRadioFactory.setOnFlexRadioEvents(new FlexRadioFactory.OnFlexRadioEvents() { + + @Override + public void OnFlexRadioAdded(FlexRadio flexRadio) { + flexRecyclerView.post(new Runnable() { + @Override + public void run() { + flexRadioAdapter.notifyDataSetChanged(); + } + }); + } + + @Override + public void OnFlexRadioInvalid(FlexRadio flexRadio) { + flexRecyclerView.post(new Runnable() { + @Override + public void run() { + flexRadioAdapter.notifyDataSetChanged(); + } + }); + } + }); + + + + //显示滚动箭头 + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + setScrollImageVisible(); + } + }, 1000); + flexRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { + super.onScrolled(recyclerView, dx, dy); + setScrollImageVisible(); + } + }); + } + + + @Override + public void show() { + super.show(); + WindowManager.LayoutParams params = getWindow().getAttributes(); + //设置对话框的大小,以百分比0.6 + int height = getWindow().getWindowManager().getDefaultDisplay().getHeight(); + int width = getWindow().getWindowManager().getDefaultDisplay().getWidth(); +// params.height = (int) (height * 0.6); + if (width > height) { + params.width = (int) (width * 0.6); + params.height = (int) (height * 0.6); + } else { + params.width = (int) (width * 0.8); + params.height = (int) (height * 0.5); + } + getWindow().setAttributes(params); + } + + /** + * 设置界面的上下滚动的图标 + */ + private void setScrollImageVisible() { + + if (flexRecyclerView.canScrollVertically(1)) { + upImage.setVisibility(View.VISIBLE); + } else { + upImage.setVisibility(View.GONE); + } + + if (flexRecyclerView.canScrollVertically(-1)) { + downImage.setVisibility(View.VISIBLE); + } else { + downImage.setVisibility(View.GONE); + } + } + + class FlexRadioAdapter extends RecyclerView.Adapter{ + + + @NonNull + @Override + public FlexViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext()); + View view = layoutInflater.inflate(R.layout.flex_device_list_item, parent, false); + final FlexRadioAdapter.FlexViewHolder holder = new FlexRadioAdapter.FlexViewHolder(view); + return holder; + } + + @Override + public void onBindViewHolder(@NonNull FlexViewHolder holder, int position) { + holder.flexRadio=flexRadioFactory.flexRadios.get(position); + holder.flexRadioIpTextView.setText(holder.flexRadio.getIp()); + holder.flexRadioSerialNumTextView.setText(holder.flexRadio.getSerial()); + holder.flexRadioNameTextView.setText(holder.flexRadio.getModel()); + + holder.flexRadioListConstraintLayout.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + ToastMessage.show(String.format( + GeneralVariables.getStringFromResource(R.string.select_flex_device) + ,holder.flexRadio.getModel())); + + //此处添加连接flex电台的动作 + //mainViewModel.connectBluetoothRig(GeneralVariables.getMainContext(), holder.device.device); + mainViewModel.connectFlexRadioRig(GeneralVariables.getMainContext(),holder.flexRadio); + dismiss(); + } + }); + + } + + @Override + public int getItemCount() { + return flexRadioFactory.flexRadios.size(); + } + + + + class FlexViewHolder extends RecyclerView.ViewHolder{ + public FlexRadio flexRadio; + TextView flexRadioNameTextView,flexRadioIpTextView,flexRadioSerialNumTextView; + ConstraintLayout flexRadioListConstraintLayout; + public FlexViewHolder(@NonNull View itemView) { + super(itemView); + flexRadioNameTextView=itemView.findViewById(R.id.flexRadioNameTextView); + flexRadioIpTextView=itemView.findViewById(R.id.flexRadioIpTextView); + flexRadioSerialNumTextView=itemView.findViewById(R.id.flexRadioSerialNumTextView); + flexRadioListConstraintLayout=itemView.findViewById(R.id.flexRadioListConstraintLayout); + } + + } + } + + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/SelectXieguRadioDialog.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/SelectXieguRadioDialog.java new file mode 100644 index 00000000..6e1feef9 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/SelectXieguRadioDialog.java @@ -0,0 +1,246 @@ +package com.bg7yoz.ft8cn.ui; +/** + * FlexRadio选择对话框。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.annotation.SuppressLint; +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.os.Handler; +import android.text.Editable; +import android.text.TextWatcher; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.widget.EditText; +import android.widget.ImageButton; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.MainViewModel; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.flex.FlexRadio; +import com.bg7yoz.ft8cn.flex.FlexRadioFactory; +import com.bg7yoz.ft8cn.x6100.X6100Radio; +import com.bg7yoz.ft8cn.x6100.XieguRadioFactory; + +public class SelectXieguRadioDialog extends Dialog { + private static final String TAG="SelectXieguRadioDialog"; + private final MainViewModel mainViewModel; + private RecyclerView xieguRecyclerView; + private ImageView upImage; + private ImageView downImage; + private XieguRadioFactory xieguRadioFactory; + private XieguRadioAdapter xieguRadioAdapter; + private ImageButton connectXieguImageButton; + private EditText inputXieguAddressEdit; + + + + public SelectXieguRadioDialog(@NonNull Context context, MainViewModel mainViewModel){ + super(context); + this.mainViewModel = mainViewModel; + } + + @SuppressLint("NotifyDataSetChanged") + @Override + protected void onCreate(Bundle savedInstanceState){ + super.onCreate(savedInstanceState); + setContentView(R.layout.select_xiegu_dialog_layout); + xieguRecyclerView=(RecyclerView) findViewById(R.id.xieguRadioListRecyclerView); + xieguRecyclerView.setLayoutManager(new LinearLayoutManager(getContext())); + upImage=(ImageView) findViewById(R.id.xieguRadioScrollUpImageView); + downImage=(ImageView)findViewById(R.id.xieguRadioScrollDownImageView); + inputXieguAddressEdit=(EditText)findViewById(R.id.inputXieguAddressEdit); + connectXieguImageButton=(ImageButton) findViewById(R.id.connectXieguImageButton); + connectXieguImageButton.setEnabled(false); + connectXieguImageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + ToastMessage.show(String.format( + GeneralVariables.getStringFromResource(R.string.select_xiegu_device) + ,inputXieguAddressEdit.getText())); + X6100Radio xieguRadio = new X6100Radio(); + xieguRadio.setRig_ip(inputXieguAddressEdit.getText().toString()); + xieguRadio.setModelName("Xiegu Rig"); + ToastMessage.show(xieguRadio.getRig_ip()); + //此处添加连接6100电台的动作 + mainViewModel.connectXieguRadioRig(GeneralVariables.getMainContext(),xieguRadio); + + dismiss(); + } + }); + + inputXieguAddressEdit.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + connectXieguImageButton.setEnabled(!inputXieguAddressEdit.getText().toString().isEmpty()); + } + }); + + + + + xieguRadioAdapter=new XieguRadioAdapter(); + xieguRecyclerView.setAdapter(xieguRadioAdapter); + + xieguRadioFactory = XieguRadioFactory.getInstance(); + + + xieguRadioFactory.setOnXieguRadioEvents(new XieguRadioFactory.OnXieguRadioEvents() { + + @Override + public void onXieguRadioAdded(X6100Radio xieguRadio) { + xieguRecyclerView.post(new Runnable() { + @Override + public void run() { + xieguRadioAdapter.notifyDataSetChanged(); + } + }); + } + + @Override + public void onXieguRadioInvalid(X6100Radio flexRadio) { + xieguRecyclerView.post(new Runnable() { + @Override + public void run() { + xieguRadioAdapter.notifyDataSetChanged(); + } + }); + } + }); + + + + //显示滚动箭头 + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + setScrollImageVisible(); + } + }, 1000); + xieguRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { + super.onScrolled(recyclerView, dx, dy); + setScrollImageVisible(); + } + }); + } + + + @Override + public void show() { + super.show(); + WindowManager.LayoutParams params = getWindow().getAttributes(); + //设置对话框的大小,以百分比0.6 + int height = getWindow().getWindowManager().getDefaultDisplay().getHeight(); + int width = getWindow().getWindowManager().getDefaultDisplay().getWidth(); +// params.height = (int) (height * 0.6); + if (width > height) { + params.width = (int) (width * 0.6); + params.height = (int) (height * 0.6); + } else { + params.width = (int) (width * 0.8); + params.height = (int) (height * 0.5); + } + getWindow().setAttributes(params); + } + + /** + * 设置界面的上下滚动的图标 + */ + private void setScrollImageVisible() { + + if (xieguRecyclerView.canScrollVertically(1)) { + upImage.setVisibility(View.VISIBLE); + } else { + upImage.setVisibility(View.GONE); + } + + if (xieguRecyclerView.canScrollVertically(-1)) { + downImage.setVisibility(View.VISIBLE); + } else { + downImage.setVisibility(View.GONE); + } + } + + class XieguRadioAdapter extends RecyclerView.Adapter{ + + + @NonNull + @Override + public XieguViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext()); + View view = layoutInflater.inflate(R.layout.xiegu_device_list_item, parent, false); + final XieguViewHolder holder = new XieguViewHolder(view); + return holder; + } + + @Override + public void onBindViewHolder(@NonNull XieguViewHolder holder, int position) { + holder.xieguRadio=xieguRadioFactory.xieguRadios.get(position); + holder.xieguRadioIpTextView.setText(holder.xieguRadio.getRig_ip()); + holder.xieguInfoTextView.setText(holder.xieguRadio.getMac()); + holder.xieguRadioNameTextView.setText(holder.xieguRadio.getModelName()); + + holder.xieguRadioListConstraintLayout.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + ToastMessage.show(String.format( + GeneralVariables.getStringFromResource(R.string.select_xiegu_device) + ,holder.xieguRadio.getModelName())); + ToastMessage.show(holder.xieguRadio.getRig_ip()); + //此处添加连接6100电台的动作 + mainViewModel.connectXieguRadioRig(GeneralVariables.getMainContext(),holder.xieguRadio); + dismiss(); + } + }); + + } + + @Override + public int getItemCount() { + return xieguRadioFactory.xieguRadios.size(); + } + + + + class XieguViewHolder extends RecyclerView.ViewHolder{ + public X6100Radio xieguRadio; + TextView xieguRadioNameTextView,xieguRadioIpTextView,xieguInfoTextView; + ConstraintLayout xieguRadioListConstraintLayout; + public XieguViewHolder(@NonNull View itemView) { + super(itemView); + xieguRadioNameTextView=itemView.findViewById(R.id.xieguRadioNameTextView); + xieguRadioIpTextView=itemView.findViewById(R.id.xieguRadioIpTextView); + xieguInfoTextView=itemView.findViewById(R.id.xieguInfoTextView); + xieguRadioListConstraintLayout=itemView.findViewById(R.id.xieguRadioListConstraintLayout); + } + + } + } + + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/SerialDataBitsSpinnerAdapter.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/SerialDataBitsSpinnerAdapter.java new file mode 100644 index 00000000..0cf86c33 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/SerialDataBitsSpinnerAdapter.java @@ -0,0 +1,63 @@ +package com.bg7yoz.ft8cn.ui; +/** + * 串口数据位列表界面 + * @author BGY70Z + * @date 2024-01-03 + */ + +import android.annotation.SuppressLint; +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.TextView; + +import com.bg7yoz.ft8cn.R; + + +public class SerialDataBitsSpinnerAdapter extends BaseAdapter { + private final Context mContext; + private final int[] dataBits= {8,7,6,5}; + public SerialDataBitsSpinnerAdapter(Context context) { + mContext=context; + } + + @Override + public int getCount() { + return dataBits.length; + } + + @Override + public Object getItem(int i) { + return dataBits[i]; + } + + @Override + public long getItemId(int i) { + return i; + } + + @SuppressLint({"ViewHolder", "InflateParams"}) + @Override + public View getView(int i, View view, ViewGroup viewGroup) { + LayoutInflater _LayoutInflater=LayoutInflater.from(mContext); + view=_LayoutInflater.inflate(R.layout.serial_data_bits_spinner_item, null); + if (view!=null){ + TextView textView=(TextView)view.findViewById(R.id.serialDataBitsItemTextView); + textView.setText(String.valueOf(dataBits[i])); + } + return view; + } + public int getPosition(int i){ + for (int j = 0; j < dataBits.length; j++) { + if (dataBits[j]==i){ + return j; + } + } + return 0; + } + public int getValue(int position){ + return dataBits[position]; + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/SerialParityBitsSpinnerAdapter.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/SerialParityBitsSpinnerAdapter.java new file mode 100644 index 00000000..441e628f --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/SerialParityBitsSpinnerAdapter.java @@ -0,0 +1,71 @@ +package com.bg7yoz.ft8cn.ui; +/** + * 串口校验位列表界面 + * @author BGY70Z + * @date 2024-01-03 + */ + +import android.annotation.SuppressLint; +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.TextView; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; + + +public class SerialParityBitsSpinnerAdapter extends BaseAdapter { + private final Context mContext; + private final int[] parityBits= {0,1,2,3,4}; + private final String[] parityStr={GeneralVariables.getStringFromResource(R.string.serial_parity_none) + ,GeneralVariables.getStringFromResource(R.string.serial_parity_odd) + ,GeneralVariables.getStringFromResource(R.string.serial_parity_even) + ,GeneralVariables.getStringFromResource(R.string.serial_parity_mark) + ,GeneralVariables.getStringFromResource(R.string.serial_parity_space) + }; + public SerialParityBitsSpinnerAdapter(Context context) { + mContext=context; + } + + @Override + public int getCount() { + return parityBits.length; + } + + @Override + public Object getItem(int i) { + return parityBits[i]; + } + + @Override + public long getItemId(int i) { + return i; + } + + @SuppressLint({"ViewHolder", "InflateParams"}) + @Override + public View getView(int i, View view, ViewGroup viewGroup) { + LayoutInflater _LayoutInflater=LayoutInflater.from(mContext); + view=_LayoutInflater.inflate(R.layout.serial_parity_bits_spinner_item, null); + if (view!=null){ + TextView textView=(TextView)view.findViewById(R.id.serialParityBitsItemTextView); + //textView.setText(String.valueOf(parityBits[i])); + textView.setText(parityStr[i]); + } + return view; + } + public int getPosition(int i){ + for (int j = 0; j < parityBits.length; j++) { + if (parityBits[j]==i){ + return j; + } + } + return 2; + } + public int getValue(int position){ + return parityBits[position]; + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/SerialStopBitsSpinnerAdapter.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/SerialStopBitsSpinnerAdapter.java new file mode 100644 index 00000000..7fa2279f --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/SerialStopBitsSpinnerAdapter.java @@ -0,0 +1,64 @@ +package com.bg7yoz.ft8cn.ui; +/** + * 串口停止位列表界面 + * @author BGY70Z + * @date 2024-01-03 + */ + +import android.annotation.SuppressLint; +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.TextView; + +import com.bg7yoz.ft8cn.R; + + +public class SerialStopBitsSpinnerAdapter extends BaseAdapter { + private final Context mContext; + private final int[] stopBits= {1,3,2}; + private final String[] stopBitsStr= {"1","1.5","2"}; + public SerialStopBitsSpinnerAdapter(Context context) { + mContext=context; + } + + @Override + public int getCount() { + return stopBits.length; + } + + @Override + public Object getItem(int i) { + return stopBits[i]; + } + + @Override + public long getItemId(int i) { + return i; + } + + @SuppressLint({"ViewHolder", "InflateParams"}) + @Override + public View getView(int i, View view, ViewGroup viewGroup) { + LayoutInflater _LayoutInflater=LayoutInflater.from(mContext); + view=_LayoutInflater.inflate(R.layout.serial_stop_bits_spinner_item, null); + if (view!=null){ + TextView textView=(TextView)view.findViewById(R.id.serialStopBitsItemTextView); + textView.setText(stopBitsStr[i]); + } + return view; + } + public int getPosition(int i){ + for (int j = 0; j < stopBits.length; j++) { + if (stopBits[j]==i){ + return j; + } + } + return 0; + } + public int getValue(int position){ + return stopBits[position]; + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/SetVolumeDialog.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/SetVolumeDialog.java new file mode 100644 index 00000000..039bd1a5 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/SetVolumeDialog.java @@ -0,0 +1,120 @@ +package com.bg7yoz.ft8cn.ui; +/** + * 设置信号输出强度的对话框。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.annotation.SuppressLint; +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; +import android.view.WindowManager; +import android.widget.SeekBar; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.lifecycle.Observer; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.MainViewModel; +import com.bg7yoz.ft8cn.R; + +public class SetVolumeDialog extends Dialog { + private static final String TAG = "SetVolumeDialog"; + private TextView volumeValueMessage; + private SeekBar volumeSeekBar; + private final MainViewModel mainViewModel; + private VolumeProgress volumeProgress; + + public SetVolumeDialog(@NonNull Context context, MainViewModel mainViewModel) { + super(context); + this.mainViewModel = mainViewModel; + } + + + @SuppressLint({"NotifyDataSetChanged", "MissingInflatedId"}) + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.set_volume_dialog); + volumeValueMessage = (TextView) findViewById(R.id.volumeValueMessage); + volumeSeekBar = (SeekBar) findViewById(R.id.volumeSeekBar); + volumeProgress=(VolumeProgress) findViewById(R.id.volumeProgress); + volumeProgress.setAlarmValue(1.1f); + volumeProgress.setValueColor(getContext().getColor(R.color.volume_progress_value));//白色 + setVolumeText(GeneralVariables.volumePercent); + volumeSeekBar.setProgress((int) (GeneralVariables.volumePercent*100)); + + GeneralVariables.mutableVolumePercent.observeForever(new Observer() { + @Override + public void onChanged(Float aFloat) { + setVolumeText(aFloat); + } + }); + + + volumeSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + @Override + public void onProgressChanged(SeekBar seekBar, int i, boolean b) { + GeneralVariables.volumePercent=i/100f; + GeneralVariables.mutableVolumePercent.postValue(i/100f); + mainViewModel.databaseOpr.writeConfig("volumeValue",String.valueOf(i),null); + if (mainViewModel.baseRig!=null){ + if (mainViewModel.baseRig.getConnector()!=null) { + mainViewModel.baseRig.getConnector().setRFVolume(i); + Log.e(TAG,String.format("set volume:%d",i)); + } + } + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + + } + + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + + } + }); + + } + + private void setVolumeText(float vol){ + volumeValueMessage.setText(String.format( + GeneralVariables.getStringFromResource(R.string.volume_percent) + , vol*100f)); + volumeProgress.setPercent(vol); + + } + + /** + * 把配置信息写到数据库 + * + * @param Value 值 + */ + private void writeConfig(String Value) { + mainViewModel.databaseOpr.writeConfig("volumeValue", Value, null); + } + + @Override + public void show() { + super.show(); + WindowManager.LayoutParams params = getWindow().getAttributes(); + //设置对话框的大小,以百分比0.6 + int height = getWindow().getWindowManager().getDefaultDisplay().getHeight(); + int width = getWindow().getWindowManager().getDefaultDisplay().getWidth(); + if (width > height) { + params.width = (int) (width * 0.7); + //params.height = (int) (height * 0.6); + } else { + params.width = (int) (width * 0.95); + //params.height = (int) (height * 0.5); + } + getWindow().setAttributes(params); + } + + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/ShareLogsProgressDialog.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/ShareLogsProgressDialog.java new file mode 100644 index 00000000..41596856 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/ShareLogsProgressDialog.java @@ -0,0 +1,105 @@ +package com.bg7yoz.ft8cn.ui; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.ProgressBar; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.lifecycle.Observer; + +import com.bg7yoz.ft8cn.MainViewModel; +import com.bg7yoz.ft8cn.R; + +public class ShareLogsProgressDialog extends Dialog { + private static final String TAG = "ShareLogsProgressDialog"; + + private final MainViewModel mainViewModel; + private TextView shareDataInfoTextView,shareProgressTextView; + private ProgressBar shareFileDataProgressBar; + private final boolean isImportMode; + //private final int progressMax; + + + public ShareLogsProgressDialog(@NonNull Context context + , MainViewModel projectsViewModel, boolean isImportMode) { + super(context, R.style.ShareProgressDialog); + this.mainViewModel = projectsViewModel; + this.isImportMode = isImportMode; + //this.progressMax =progressMax; + } + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.share_file_progress_dialog); + setCancelable(false);//禁止点击旁边退出 + shareDataInfoTextView = findViewById(R.id.shareDataInfoTextView); + shareProgressTextView = findViewById(R.id.shareProgressTextView); + if (isImportMode){ + shareProgressTextView.setText(R.string.share_import_log_data); + }else { + shareProgressTextView.setText(R.string.preparing_log_data); + } + + shareFileDataProgressBar = findViewById(R.id.shareFileDataProgressBar); + Button cancelShareButton = findViewById(R.id.cancelShareButton); + + + mainViewModel.mutableShareInfo.observeForever(new Observer() { + @Override + public void onChanged(String s) { + shareDataInfoTextView.setText(s); + } + }); + mainViewModel.mutableSharePosition.observeForever(new Observer() { + @Override + public void onChanged(Integer integer) { + shareFileDataProgressBar.setProgress(integer); + } + }); + + mainViewModel.mutableImportShareRunning.observeForever(new Observer() { + @Override + public void onChanged(Boolean aBoolean) { + if (!aBoolean) { + dismiss(); + } + } + }); + + mainViewModel.mutableShareRunning.observeForever(new Observer() { + @Override + public void onChanged(Boolean aBoolean) { + if (!aBoolean) { + dismiss(); + } + } + }); + + + mainViewModel.mutableShareCount.observeForever(new Observer() { + @Override + public void onChanged(Integer integer) { + shareFileDataProgressBar.setMax(integer); + } + }); + + cancelShareButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (isImportMode) { + mainViewModel.mutableImportShareRunning.postValue(false); + } else { + mainViewModel.mutableShareRunning.postValue(false); + } + } + }); + + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/SpectrumFragment.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/SpectrumFragment.java new file mode 100644 index 00000000..2498bb51 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/SpectrumFragment.java @@ -0,0 +1,219 @@ +package com.bg7yoz.ft8cn.ui; +/** + * 频谱图的主界面。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import static android.view.MotionEvent.ACTION_UP; + +import android.annotation.SuppressLint; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.widget.CompoundButton; + +import androidx.fragment.app.Fragment; +import androidx.lifecycle.Observer; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.MainViewModel; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.databinding.FragmentSpectrumBinding; +import com.bg7yoz.ft8cn.timer.UtcTimer; + +/** + * A simple {@link Fragment} subclass. + * create an instance of this fragment. + */ +public class SpectrumFragment extends Fragment { + private static final String TAG = "SpectrumFragment"; + private FragmentSpectrumBinding binding; + private MainViewModel mainViewModel; + + + private int frequencyLineTimeOut = 0;//画频率线的时间量 + + + static { + System.loadLibrary("ft8cn"); + } + + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + + @SuppressLint("ClickableViewAccessibility") + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + mainViewModel = MainViewModel.getInstance(this); + binding = FragmentSpectrumBinding.inflate(inflater, container, false); + binding.columnarView.setShowBlock(true); + binding.deNoiseSwitch.setChecked(mainViewModel.deNoise);//噪声抑制 + binding.waterfallView.setDrawMessage(false); + setDeNoiseSwitchState(); + setMarkMessageSwitchState(); + + binding.rulerFrequencyView.setFreq(Math.round(GeneralVariables.getBaseFrequency())); + mainViewModel.currentMessages=null; + + + //原始频谱开关 + binding.deNoiseSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean b) { + mainViewModel.deNoise = b; + setDeNoiseSwitchState(); + mainViewModel.currentMessages=null; + } + }); + //标记消息开关 + binding.showMessageSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean b) { + mainViewModel.markMessage = b; + setMarkMessageSwitchState(); + } + }); + + //当声音变化,画频谱 + mainViewModel.spectrumListener.mutableDataBuffer.observe(getViewLifecycleOwner(), new Observer() { + @Override + public void onChanged(float[] floats) { + drawSpectrum(floats); + } + }); + + + + //观察解码的时长 + mainViewModel.ft8SignalListener.decodeTimeSec.observe(getViewLifecycleOwner(), new Observer() { + @SuppressLint("DefaultLocale") + @Override + public void onChanged(Long aLong) { + binding.decodeDurationTextView.setText(String.format( + GeneralVariables.getStringFromResource(R.string.decoding_takes_milliseconds), aLong)); + } + }); + //观察解码的变化 + mainViewModel.mutableIsDecoding.observe(getViewLifecycleOwner(), new Observer() { + @Override + public void onChanged(Boolean aBoolean) { + binding.waterfallView.setDrawMessage(!aBoolean);//false说明解码完毕 + } + }); + + + //显示UTC时间 + mainViewModel.timerSec.observe(getViewLifecycleOwner(), new Observer() { + @Override + public void onChanged(Long aLong) { + binding.timersTextView.setText(UtcTimer.getTimeStr(aLong)); + binding.freqBandTextView.setText(GeneralVariables.getBandString()); + } + }); + + + //触摸频谱时的动作 + View.OnTouchListener touchListener = new View.OnTouchListener() { + @SuppressLint("DefaultLocale") + @Override + public boolean onTouch(View view, MotionEvent motionEvent) { + + frequencyLineTimeOut = 60;//显示频率线的时长:60*0.16 + + binding.waterfallView.setTouch_x(Math.round(motionEvent.getX())); + binding.columnarView.setTouch_x(Math.round(motionEvent.getX())); + + + + if (!mainViewModel.ft8TransmitSignal.isSynFrequency() + && (binding.waterfallView.getFreq_hz() > 0) + && (motionEvent.getAction() == ACTION_UP) + ) {//如果时异频发射 + mainViewModel.databaseOpr.writeConfig("freq", + String.valueOf(binding.waterfallView.getFreq_hz()), + null); + mainViewModel.ft8TransmitSignal.setBaseFrequency( + (float) binding.waterfallView.getFreq_hz()); + + binding.rulerFrequencyView.setFreq(binding.waterfallView.getFreq_hz()); + + requireActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + ToastMessage.show(String.format( + GeneralVariables.getStringFromResource(R.string.sound_frequency_is_set_to) + , binding.waterfallView.getFreq_hz()),true); + } + }); + } + return false; + } + }; + + binding.waterfallView.setOnTouchListener(touchListener); + binding.columnarView.setOnTouchListener(touchListener); + + return binding.getRoot(); + } + + + + public void drawSpectrum(float[] buffer) { + if (buffer.length <= 0) { + return; + } + int[] fft = new int[buffer.length / 2]; + if (mainViewModel.deNoise) { + getFFTDataFloat(buffer, fft); + } else { + getFFTDataRawFloat(buffer, fft); + } + frequencyLineTimeOut--; + if (frequencyLineTimeOut < 0) { + frequencyLineTimeOut = 0; + } + //达到显示的时长,就取取消掉频率线 + if (frequencyLineTimeOut == 0) { + binding.waterfallView.setTouch_x(-1); + binding.columnarView.setTouch_x(-1); + } + binding.columnarView.setWaveData(fft); + if (mainViewModel.markMessage) {//是否标记消息 + binding.waterfallView.setWaveData(fft, UtcTimer.getNowSequential(), mainViewModel.currentMessages); + } else { + binding.waterfallView.setWaveData(fft, UtcTimer.getNowSequential(), null); + } + } + + private void setDeNoiseSwitchState() { + if (mainViewModel.deNoise) { + binding.deNoiseSwitch.setText(getString(R.string.de_noise)); + } else { + binding.deNoiseSwitch.setText(getString(R.string.raw_spectrum_data)); + } + } + private void setMarkMessageSwitchState(){ + if (mainViewModel.markMessage) { + binding.showMessageSwitch.setText(getString(R.string.markMessage)); + } else { + binding.showMessageSwitch.setText(getString(R.string.unMarkMessage)); + } + } + + public native void getFFTData(int[] data, int fftData[]); + + public native void getFFTDataFloat(float[] data ,int fftData[]); + + + + public native void getFFTDataRaw(int[] data, int fftData[]); + public native void getFFTDataRawFloat(float[] data,int fftData[]); + +} \ No newline at end of file diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/SpectrumView.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/SpectrumView.java new file mode 100644 index 00000000..6dbd23cd --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/SpectrumView.java @@ -0,0 +1,207 @@ +package com.bg7yoz.ft8cn.ui; +/** + * 包含瀑布图、频率柱状图、标尺的自定义控件。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import static android.view.MotionEvent.ACTION_UP; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.View; +import android.widget.CompoundButton; +import android.widget.Switch; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.fragment.app.Fragment; +import androidx.lifecycle.Observer; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.MainViewModel; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.timer.UtcTimer; + +public class SpectrumView extends ConstraintLayout { + private MainViewModel mainViewModel; + private ColumnarView columnarView; + private Switch controlDeNoiseSwitch; + private Switch controlShowMessageSwitch; + private WaterfallView waterfallView; + private RulerFrequencyView rulerFrequencyView; + private Fragment fragment; + + + private int frequencyLineTimeOut = 0;//画频率线的时间量 + + static { + System.loadLibrary("ft8cn"); + } + + + + public SpectrumView(@NonNull Context context) { + super(context); + } + + public SpectrumView(@NonNull Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + View view = (View) View.inflate(context, R.layout.spectrum_layout,this); + } + + + @SuppressLint("ClickableViewAccessibility") + public void run(MainViewModel mainViewModel , Fragment fragment){ + this.mainViewModel = MainViewModel.getInstance(null); + this.fragment=fragment; + columnarView=findViewById(R.id.controlColumnarView); + controlDeNoiseSwitch=findViewById(R.id.controlDeNoiseSwitch); + waterfallView=findViewById(R.id.controlWaterfallView); + rulerFrequencyView=findViewById(R.id.controlRulerFrequencyView); + controlShowMessageSwitch=findViewById(R.id.controlShowMessageSwitch); + + + setDeNoiseSwitchState(); + setMarkMessageSwitchState(); + + rulerFrequencyView.setFreq(Math.round(GeneralVariables.getBaseFrequency())); + mainViewModel.currentMessages=null; + + + //原始频谱开关 + controlDeNoiseSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean b) { + mainViewModel.deNoise = b; + setDeNoiseSwitchState(); + mainViewModel.currentMessages=null; + } + }); + //标记消息开关 + controlShowMessageSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean b) { + mainViewModel.markMessage = b; + setMarkMessageSwitchState(); + } + }); + + //当声音变化,画频谱 + mainViewModel.spectrumListener.mutableDataBuffer.observe(fragment.getViewLifecycleOwner(), new Observer() { + @Override + public void onChanged(float[] ints) { + drawSpectrum(ints); + } + }); + + + //观察解码的变化 + mainViewModel.mutableIsDecoding.observe(fragment.getViewLifecycleOwner(), new Observer() { + @Override + public void onChanged(Boolean aBoolean) { + waterfallView.setDrawMessage(!aBoolean);//aBoolean==false说明解码完毕 + } + }); + + //触摸频谱时的动作 + View.OnTouchListener touchListener = new View.OnTouchListener() { + @SuppressLint("DefaultLocale") + @Override + public boolean onTouch(View view, MotionEvent motionEvent) { + + frequencyLineTimeOut = 60;//显示频率线的时长:60*0.16 + + waterfallView.setTouch_x(Math.round(motionEvent.getX())); + columnarView.setTouch_x(Math.round(motionEvent.getX())); + + + if (!mainViewModel.ft8TransmitSignal.isSynFrequency() + && (waterfallView.getFreq_hz() > 0) + && (motionEvent.getAction() == ACTION_UP) + ) {//如果时异频发射 + mainViewModel.databaseOpr.writeConfig("freq", + String.valueOf(waterfallView.getFreq_hz()), + null); + mainViewModel.ft8TransmitSignal.setBaseFrequency( + (float) waterfallView.getFreq_hz()); + + rulerFrequencyView.setFreq(waterfallView.getFreq_hz()); + + fragment.requireActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + ToastMessage.show(String.format( + GeneralVariables.getStringFromResource(R.string.sound_frequency_is_set_to) + , waterfallView.getFreq_hz()),true); + } + }); + } + return false; + } + }; + + waterfallView.setOnTouchListener(touchListener); + columnarView.setOnTouchListener(touchListener); + + + } + private void setDeNoiseSwitchState() { + if (mainViewModel==null) return; + controlDeNoiseSwitch.setChecked(mainViewModel.deNoise); + if (mainViewModel.deNoise) { + controlDeNoiseSwitch.setText(GeneralVariables.getStringFromResource(R.string.de_noise)); + } else { + controlDeNoiseSwitch.setText(GeneralVariables.getStringFromResource(R.string.raw_spectrum_data)); + } + } + private void setMarkMessageSwitchState(){ + if (mainViewModel.markMessage) { + controlShowMessageSwitch.setText(GeneralVariables.getStringFromResource(R.string.markMessage)); + } else { + controlShowMessageSwitch.setText(GeneralVariables.getStringFromResource(R.string.unMarkMessage)); + } + } + + + + + public void drawSpectrum(float[] buffer) { + if (buffer.length <= 0) { + return; + } + int[] fft = new int[buffer.length / 2]; + if (mainViewModel.deNoise) { + getFFTDataFloat(buffer, fft); + } else { + getFFTDataRawFloat(buffer, fft); + } + frequencyLineTimeOut--; + if (frequencyLineTimeOut < 0) { + frequencyLineTimeOut = 0; + } + //达到显示的时长,就取取消掉频率线 + if (frequencyLineTimeOut == 0) { + waterfallView.setTouch_x(-1); + columnarView.setTouch_x(-1); + } + columnarView.setWaveData(fft); + if (mainViewModel.markMessage) {//是否标记消息 + waterfallView.setWaveData(fft, UtcTimer.getNowSequential(), mainViewModel.currentMessages); + } else { + waterfallView.setWaveData(fft, UtcTimer.getNowSequential(), null); + } + } + + + public native void getFFTData(int[] data, int fftData[]); + public native void getFFTDataFloat(float[] data, int fftData[]); + + public native void getFFTDataRaw(int[] data, int fftData[]); + public native void getFFTDataRawFloat(float[] data, int fftData[]); + + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/ToastMessage.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/ToastMessage.java new file mode 100644 index 00000000..6232c347 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/ToastMessage.java @@ -0,0 +1,79 @@ +package com.bg7yoz.ft8cn.ui; +/** + * 提示消息。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.annotation.SuppressLint; +import android.os.Handler; +import android.os.Looper; + +import com.bg7yoz.ft8cn.GeneralVariables; + +import java.util.ArrayList; + +public class ToastMessage { + private static final String TAG="ToastMessage"; + //private static Activity activity; + private static ToastMessage toastMessage=null; + private static final ArrayList debugList=new ArrayList<>(); + public static ToastMessage getInstance(){ + if (toastMessage==null){ + toastMessage=new ToastMessage(); + } + return toastMessage; + } + + public ToastMessage() { + //this.activity = activity; + } + + public static void show(String message){ + addDebugInfo(message); + } + public static synchronized void show(String message,boolean clearMessage){ + if (clearMessage) { + debugList.clear(); + } + show(message); + } + @SuppressLint("DefaultLocale") + private static synchronized void addDebugInfo(String s){ + if (debugList.size()>5){ + //if (debugList.size()>20){ + debugList.remove(0); + } + final String info=s; + debugList.add(info); + GeneralVariables.mutableDebugMessage.postValue(getDebugMessage()); + + new Handler(Looper.getMainLooper()).postDelayed(new Runnable() { + @Override + public void run() { + for (int i = 0; i offsetTime=new ArrayList<>(); + private Context mContext; + + public UtcOffsetSpinnerAdapter(Context context) { + mContext=context; + for (int i = 0; i < 30; i++) { + offsetTime.add(i*5-75); + } + } + + @Override + public int getCount() { + return offsetTime.size(); + } + + @Override + public Object getItem(int i) { + return offsetTime.get(i); + } + + @Override + public long getItemId(int i) { + return i; + } + + @SuppressLint({"DefaultLocale", "ViewHolder", "InflateParams"}) + @Override + public View getView(int i, View view, ViewGroup viewGroup) { + LayoutInflater _LayoutInflater=LayoutInflater.from(mContext); + view=_LayoutInflater.inflate(R.layout.utc_time_offset_spinner_item, null); + if (view!=null){ + TextView textView=(TextView)view.findViewById(R.id.serialPortItemTextView); + textView.setText(String.format(GeneralVariables.getStringFromResource(R.string.offset_time_sec) + ,(offsetTime.get(i) /10f))); + } + return view; + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/VolumeProgress.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/VolumeProgress.java new file mode 100644 index 00000000..2e0d0131 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/VolumeProgress.java @@ -0,0 +1,165 @@ +package com.bg7yoz.ft8cn.ui; +/** + * 自定义音频强度的图形控件。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.LinearGradient; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.Shader; +import android.util.AttributeSet; +import android.view.View; + +import androidx.annotation.Nullable; + +public class VolumeProgress extends View { + private Paint mRadarPaint; + private Paint mValuePaint; + + private Path mLinePath;//外部容器形状 + private Path mValuePath;//内部填充的形状 + private float mPercent=0.45f; + private int width,high; + + private int radarColor=Color.WHITE; + private int valueColor=Color.WHITE; + private int alarmColor=Color.RED; + private float alarmValue=0.5f; + + public VolumeProgress(Context context) { + super(context); + } + + public VolumeProgress(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + init(); + } + + public VolumeProgress(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + private int dpToPixel(int dp) { + return (int) (dp * getResources().getDisplayMetrics().density); + } + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + width=w; + high=h; + postInvalidate(); + super.onSizeChanged(w, h, oldw, oldh); + } + + public void setPercent(float percent) { + mPercent = percent; + + init(); + invalidate(); + } + public float getPercent(){ + return mPercent; + } + public void reDraw(){ + setPercent(mPercent); + } + + public void init() { + //绘制外部容器 + mRadarPaint = new Paint(); + mRadarPaint.setAntiAlias(true); + mRadarPaint.setStrokeWidth(dpToPixel(2)); + mRadarPaint.setStyle(Paint.Style.STROKE); + mRadarPaint.setColor(radarColor); + + //绘制填充的内容 + mValuePaint = new Paint(); + mValuePaint.setStrokeWidth(dpToPixel(2)); + mValuePaint.setStyle(Paint.Style.FILL_AND_STROKE); + + + //绘制外部容器路径 + mLinePath = new Path(); + mValuePath = new Path(); + + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + //绘制外部容器 + drawLines(canvas); + //绘制每部填充 + drawRegion(canvas,mPercent); + } + + //绘制外部容器,顺时针,O-A-B-C + public void drawLines(Canvas canvas) { + mRadarPaint.setColor(radarColor); + mLinePath.reset(); + + float xa = 0;//(float) (mCenterX + width); + float ya = 0;//(float) (mCenterY); + mLinePath.moveTo(xa,ya); + + float xb = width; + float yb = high; + mLinePath.lineTo(xb, yb); + + float xc =0; + float yc = high; + mLinePath.lineTo(xc, yc); + + mLinePath.close(); + canvas.drawPath(mLinePath, mRadarPaint); + } + + //绘制覆盖图层,顺时针,O-Q-P-C + public void drawRegion(Canvas canvas, float percent) { + if (alarmValue>mPercent) { + mValuePaint.setColor(valueColor); + }else { + mValuePaint.setColor(alarmColor); + } + + //直线CB与QH,求出交点坐标P, + //其中H点=(是以B点的Y坐标,Q点的X坐标),起始就是QP的延长线 + float xa=(1f-percent)*width; + float ya=(1f-percent)*high; + float xb=width; + float yb=high; + float xc=(1f-percent)*width; + float yc=high; + + mValuePath.moveTo(xa, ya); + mValuePath.lineTo(xb, yb); + mValuePath.lineTo(xc, yc); + + + mValuePath.close(); + canvas.drawPath(mValuePath, mValuePaint); + } + + //求两直线相交的坐标 + + public void setRadarColor(int radarColor) { + this.radarColor = radarColor; + } + + public void setValueColor(int valueColor) { + this.valueColor = valueColor; + } + + public void setAlarmColor(int alarmColor) { + this.alarmColor = alarmColor; + } + + public void setAlarmValue(float alarmValue) { + this.alarmValue = alarmValue; + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/WaterfallView.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/WaterfallView.java new file mode 100644 index 00000000..5f1cfd27 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/WaterfallView.java @@ -0,0 +1,309 @@ +package com.bg7yoz.ft8cn.ui; +/** + * 瀑布图自定义控件。 + * + * @author BGY70Z + * @date 2023-03-20 + */ + +import static android.graphics.Bitmap.Config.ARGB_8888; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.LinearGradient; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.Rect; +import android.graphics.Shader; +import android.util.AttributeSet; +import android.util.TypedValue; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.bg7yoz.ft8cn.Ft8Message; +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.timer.UtcTimer; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; + +public class WaterfallView extends View { + private int blockHeight = 2;//色块高度 + private float freq_width = 1;//频率的宽度 + private final int cycle = 2; + private final int symbols = 93; + private int lastSequential = 0; + private Bitmap lastBitMap = null; + private Canvas _canvas; + private final Paint linePaint = new Paint(); + private Paint touchPaint = new Paint(); + private final Paint fontPaint = new Paint(); + private final Paint messagePaint = new Paint(); + private final Paint textLinePaint = new Paint(); +// private final Paint messagePaintBack = new Paint();//消息背景 + private final Paint utcPaint = new Paint(); + Paint linearPaint = new Paint(); + private final Paint utcPainBack = new Paint(); + private float pathStart = 0; + private float pathEnd = 0; + + private int touch_x = -1; + private int freq_hz = -1; + private boolean drawMessage = false;//是否画消息内容 + + public WaterfallView(Context context) { + super(context); + } + + public WaterfallView(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + public WaterfallView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + ArrayList messages= new ArrayList<>(); + + + /** + * 把dp值转换为像素点 + * + * @param dp dp值 + * @return 像素点 + */ + private int dpToPixel(int dp) { + return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp + , getResources().getDisplayMetrics()); + } + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + setClickable(true); + blockHeight = getHeight() / (symbols * cycle); + freq_width = (float) getWidth() / 3000f; + lastBitMap = Bitmap.createBitmap(w, h, ARGB_8888); + _canvas = new Canvas(lastBitMap); + Paint blackPaint = new Paint(); + blackPaint.setColor(0xFF000000); + _canvas.drawRect(0, 0, w, h, blackPaint);//先把背景画黑,防止文字重叠 + + //linePaint = new Paint(); + linePaint.setColor(0xff990000); + touchPaint = new Paint(); + touchPaint.setColor(0xff00ffff); + touchPaint.setStrokeWidth(getResources().getDisplayMetrics().density); + + + //fontPaint = new Paint(); + fontPaint.setTextSize(dpToPixel(10)); + fontPaint.setColor(0xff00ffff); + fontPaint.setAntiAlias(true); + fontPaint.setDither(true); + fontPaint.setTextAlign(Paint.Align.LEFT); + + + textLinePaint.setColor(0xff00ffff); + textLinePaint.setAntiAlias(true); + textLinePaint.setDither(true); + textLinePaint.setStrokeWidth(2); + textLinePaint.setStyle(Paint.Style.FILL_AND_STROKE); + + + // messagePaint = new Paint(); + messagePaint.setTextSize(dpToPixel(11)); + messagePaint.setColor(0xff00ffff); + messagePaint.setAntiAlias(true); + messagePaint.setDither(true); + messagePaint.setStrokeWidth(0); + messagePaint.setStyle(Paint.Style.FILL_AND_STROKE); + messagePaint.setTextAlign(Paint.Align.CENTER); + messagePaint.setShadowLayer(10,5,5,Color.BLACK); + + //messagePaintBack = new Paint(); +// messagePaintBack.setTextSize(dpToPixel(11)); +// messagePaintBack.setColor(0xff000000);//背景不透明 +// messagePaintBack.setAntiAlias(true); +// messagePaintBack.setDither(true); +// messagePaintBack.setStrokeWidth(dpToPixel(3)); +// messagePaintBack.setFakeBoldText(true); +// messagePaintBack.setStyle(Paint.Style.FILL_AND_STROKE); +// messagePaintBack.setTextAlign(Paint.Align.CENTER); + + //utcPaint = new Paint(); + utcPaint.setTextSize(dpToPixel(10)); + utcPaint.setColor(0xff00ffff);// + utcPaint.setAntiAlias(true); + utcPaint.setDither(true); + utcPaint.setStrokeWidth(0); + utcPaint.setStyle(Paint.Style.FILL_AND_STROKE); + utcPaint.setTextAlign(Paint.Align.LEFT); + + + //utcPainBack = new Paint(); + utcPainBack.setTextSize(dpToPixel(10)); + utcPainBack.setColor(0xff000000);//背景不透明 + utcPainBack.setAntiAlias(true); + utcPainBack.setDither(true); + utcPainBack.setStrokeWidth(dpToPixel(4)); + utcPainBack.setStyle(Paint.Style.FILL_AND_STROKE); + utcPainBack.setTextAlign(Paint.Align.LEFT); + + + pathStart = blockHeight * 2; + pathEnd = blockHeight * 90; + if (pathEnd < 130 * getResources().getDisplayMetrics().density) {//为了保证能写的下 + pathEnd = 130 * getResources().getDisplayMetrics().density; + } + + super.onSizeChanged(w, h, oldw, oldh); + + } + + @SuppressLint("DefaultLocale") + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + canvas.drawBitmap(lastBitMap, 0, 0, null); + + //计算频率 + if (touch_x > 0) {//画触摸线 + freq_hz = Math.round(3000f * (float) touch_x / (float) getWidth()); + if (freq_hz > 2900) { + freq_hz = 2900; + } + if (freq_hz < 100) { + freq_hz = 100; + } + + if (touch_x > getWidth() / 2) { + fontPaint.setTextAlign(Paint.Align.RIGHT); + canvas.drawText(String.format("%dHz", freq_hz) + , touch_x - 10, 250, fontPaint); + } else { + fontPaint.setTextAlign(Paint.Align.LEFT); + canvas.drawText(String.format("%dHz", freq_hz) + , touch_x + 10, 250, fontPaint); + } + canvas.drawLine(touch_x, 0, touch_x, getHeight(), touchPaint); + + } + invalidate(); + } + + public void setWaveData(int[] data, int sequential, List msgs) { + if (drawMessage&& msgs!=null){//把需要画的消息复制出来防止多线程访问冲突 + messages=new ArrayList<>(msgs); + }else { + messages.clear();//当设定不标记消息时,要清空原来的消息 + } + + if (data == null) { + return; + } + if (data.length <= 0) { + return; + } + if (lastBitMap == null) { + return; + } + + int[] colors = new int[data.length]; + + //画分割线 + if (sequential != lastSequential) { + Bitmap bitmap = Bitmap.createBitmap(lastBitMap, 0, 0, getWidth(), getHeight() - blockHeight); + _canvas.drawBitmap(bitmap, 0, blockHeight, linePaint); + bitmap.recycle(); + _canvas.drawRect(0, 0, getWidth(), getResources().getDisplayMetrics().density + , linePaint); + _canvas.drawText(UtcTimer.getTimeStr(UtcTimer.getSystemTime()), 50 + , 15 * getResources().getDisplayMetrics().density, utcPainBack); + _canvas.drawText(UtcTimer.getTimeStr(UtcTimer.getSystemTime()), 50 + , 15 * getResources().getDisplayMetrics().density, utcPaint); + } + lastSequential = sequential; + + //色块分布 + for (int i = 0; i < data.length; i++) { + + + if (data[i] < 128) {//低于一半的音量,用蓝色0~256 + colors[i] = 0xff000000 | (data[i] << 1); + } else if (data[i] < 192) { + colors[i] = 0xff0000ff | (((data[i] - 127)) << 10);//放大4倍 +// colors[i] = 0xff000000 | (data[i] * 2 * 256 + 255); + } else { + colors[i] = 0xff00ffff | (((data[i] - 127)) << 18);//放大4倍 + } + } + LinearGradient linearGradient = new LinearGradient(0, 0, getWidth() * 2, 0, colors + , null, Shader.TileMode.CLAMP); + //Paint linearPaint = new Paint(); + linearPaint.setShader(linearGradient); + Bitmap bitmap = Bitmap.createBitmap(lastBitMap, 0, 0, getWidth(), getHeight() - blockHeight); + _canvas.drawBitmap(bitmap, 0, blockHeight, linearPaint); + bitmap.recycle(); + _canvas.drawRect(0, 0, getWidth(), blockHeight, linearPaint); + + //消息有3种:普通、CQ、有我 + if (drawMessage && messages != null) { + drawMessage = false;//只画一遍 + //fontPaint.setTextAlign(Paint.Align.LEFT); + //fontPaint.setStrikeThruText(true); + for (Ft8Message msg : messages) { + + if (msg.inMyCall()) {//与我有关 + messagePaint.setColor(0xffffb2b2); + textLinePaint.setColor(0xffffb2b2); + } else if (msg.checkIsCQ()) {//CQ + messagePaint.setColor(0xffeeee00); + textLinePaint.setColor(0xffeeee00); + } else { + messagePaint.setColor(0xff00ffff); + textLinePaint.setColor(0xff00ffff); + } + + Path path = new Path(); + + path.moveTo(msg.freq_hz * freq_width, pathStart); + path.lineTo(msg.freq_hz * freq_width, pathEnd); + + + +// _canvas.drawTextOnPath(msg.getMessageText(true), path +// , 0, 0, messagePaintBack);//消息背景 + _canvas.drawTextOnPath(msg.getMessageText(true), path + , 0, 0, messagePaint);//消息 + if (GeneralVariables.checkQSLCallsign(msg.getCallsignFrom())) {//画删除线 + float text_len = messagePaint.measureText(msg.getMessageText(true)); + float text_start = ((pathEnd- pathStart)-text_len)/2; + float text_high =dpToPixel(4);//messagePaint.getFontSpacing()/2; + _canvas.drawLine(msg.freq_hz * freq_width + text_high , text_start + , msg.freq_hz * freq_width + text_high, text_len + text_start, textLinePaint); + } + } + } + + + } + + public void setTouch_x(int touch_x) { + this.touch_x = touch_x; + } + + public void setDrawMessage(boolean drawMessage) { + this.drawMessage = drawMessage; + } + + public int getFreq_hz() { + return freq_hz; + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/XieguInfoFragment.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/XieguInfoFragment.java new file mode 100644 index 00000000..9c515573 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/ui/XieguInfoFragment.java @@ -0,0 +1,194 @@ +package com.bg7yoz.ft8cn.ui; + +import android.annotation.SuppressLint; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.SeekBar; + +import androidx.fragment.app.Fragment; +import androidx.lifecycle.Observer; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.MainViewModel; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.connector.X6100Connector; +import com.bg7yoz.ft8cn.databinding.FragmentXieguInfoBinding; +import com.bg7yoz.ft8cn.x6100.X6100Meters; +import com.bg7yoz.ft8cn.x6100.X6100Radio; + + +public class XieguInfoFragment extends Fragment { + private static final String TAG = "XieguInfoFragment"; + private MainViewModel mainViewModel; + private X6100Connector connector; + private FragmentXieguInfoBinding binding; + private X6100Radio xieguRadio; + private SeekBar.OnSeekBarChangeListener onSeekBarChangeListener = null; + + private final FlexMeterRulerView.OnSetValue onSetSMeterLabel = new FlexMeterRulerView.OnSetValue() { + @SuppressLint("DefaultLocale") + @Override + public String setLabel(float val) { + return String.format("%.0fdBm", X6100Meters.getMeter_dBm(val)); + } + }; + + + public XieguInfoFragment() { + // Required empty public constructor + } + + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mainViewModel = MainViewModel.getInstance(this); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + binding = FragmentXieguInfoBinding.inflate(getLayoutInflater()); + if (mainViewModel.baseRig != null) { + connector = (X6100Connector) mainViewModel.baseRig.getConnector(); + xieguRadio = connector.getXieguRadio(); + binding.xieguInfoTextView.setText(xieguRadio.getModelName()); + + //ping 值 + xieguRadio.mutablePing.observe(getViewLifecycleOwner(), new Observer() { + @Override + public void onChanged(Long aLong) { + binding.xieguPingValueTextView.setText( + String.format(GeneralVariables.getStringFromResource(R.string.xiegu_ping_value) + , aLong)); + } + }); + //丢包数量 + xieguRadio.mutableLossPackets.observe(getViewLifecycleOwner(), new Observer() { + @Override + public void onChanged(Integer integer) { + binding.xieguLossValueTextView.setText(String.format( + GeneralVariables.getStringFromResource(R.string.x6100_packet_lost) + , integer)); + } + }); + mainViewModel.baseRig.mutableFrequency.observe(getViewLifecycleOwner(), new Observer() { + @Override + public void onChanged(Long aLong) { + binding.xieguFreqValueTextView.setText(String.format( + GeneralVariables.getStringFromResource(R.string.xiegu_band_str) + , GeneralVariables.getBandString())); + } + }); + xieguRadio.mutableMeters.observe(getViewLifecycleOwner(), new Observer() { + @Override + public void onChanged(X6100Meters x6100Meters) { + binding.xieguMetersValueTextView.setText(x6100Meters.toString()); + binding.xieguSMeterRulerView.setValue(x6100Meters.sMeter, onSetSMeterLabel); + binding.xieguSwrMeterRulerView.setValue(x6100Meters.swr, null); + binding.xieguPowerMeterRulerView.setValue(x6100Meters.power, null); + binding.xieguAlcMeterRulerView.setValue(x6100Meters.alc, null); + binding.xieguVoltMeterRulerView.setValue(x6100Meters.volt, null); + } + }); + + } + //binding.xieguSMeterRulerView.initVal(-150f, -75f, 0f, 9, 3); + binding.xieguSMeterRulerView.initVal(0f, 120f, 242f, 9, 3); + binding.xieguSMeterRulerView.initLabels("S.Po", "dBm" + , new String[]{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"} + , new String[]{"+20", "+40", "+60"}); + //6100的swr,分为4段,1~1.5,1.5~2.0,2.0~3.0,3.0~无穷大(实际值是25.5) + binding.xieguSwrMeterRulerView.initVal(1f, 3f, 25.5f, 4, 4); + binding.xieguSwrMeterRulerView.initLabels("SWR", "" + , new String[]{"1", "1.5", "2", "2.5", "3"} + , new String[]{"", "", "", "∞"}); + + //ALC值的原始值(0~255)在127±50都是最佳线性度范围,转换到0~120的线性范围就是36.17到83.19 + binding.xieguAlcMeterRulerView.initVal(0f, 100f, 120f, 8, 2); + binding.xieguAlcMeterRulerView.initLabels("ALC", "" + , new String[]{"0", "10", "20", "30", "40", "50", "60","70","80"} + , new String[]{"100", "120"}); + + binding.xieguPowerMeterRulerView.initVal(-0f, 5f, 10f, 5, 5); + binding.xieguPowerMeterRulerView.initLabels("PWR", "W" + , new String[]{"0", "1", "2", "3", "4", "5"} + , new String[]{"6", "7", "8", "9", "10"}); + binding.xieguVoltMeterRulerView.initVal(0f, 13.8f, 16f, 6, 2); + binding.xieguVoltMeterRulerView.initLabels("Volt", "V" + , new String[]{"0", "2", "4", "6", "8", "10", "12"} + , new String[]{"14", "16"}); + + binding.xieguMaxPwrProgress.setValueColor(getContext().getColor(R.color.power_progress_value)); + binding.xieguMaxPwrProgress.setRadarColor(getContext().getColor(R.color.power_progress_radar_value)); + binding.xieguMaxPwrProgress.setAlarmValue(0.99f); + + + connector.mutableMaxTxPower.observe(getViewLifecycleOwner(), new Observer() { + @Override + public void onChanged(Float aFloat) { + binding.xieguMaxPwrProgress.setPercent(aFloat / 10f); + binding.xiegumaxPowerSeekBar.setOnSeekBarChangeListener(null); + binding.xiegumaxPowerSeekBar.setProgress(Math.round(aFloat * 10)); + binding.xiegumaxPowerSeekBar.setOnSeekBarChangeListener(onSeekBarChangeListener); + binding.xieguMaxTxPowertextView.setText(String.format( + GeneralVariables.getStringFromResource(R.string.flex_max_tx_power), Math.round(aFloat))); + } + }); + + + binding.xieguSMeterRulerView.setValue(0f, onSetSMeterLabel); + binding.xieguSwrMeterRulerView.setValue(1.1f, null); + binding.xieguAlcMeterRulerView.setValue(30f, null); + binding.xieguPowerMeterRulerView.setValue(8f, null); + binding.xieguVoltMeterRulerView.setValue(12.5f, null); + + + binding.xieguAtuOnButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + xieguRadio.commandAtuOn(); + } + }); + binding.xieguAtuOffButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + xieguRadio.commandAtuOff(); + } + }); + binding.xieguStartAtuButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + xieguRadio.commandAtuStart(); + } + }); + + onSeekBarChangeListener = new SeekBar.OnSeekBarChangeListener() { + @Override + public void onProgressChanged(SeekBar seekBar, int i, boolean b) { + binding.xieguMaxPwrProgress.setPercent(i * 1.0f / 100); + + connector.setMaxTXPower(i / 10); + binding.xieguMaxTxPowertextView.setText(String.format( + GeneralVariables.getStringFromResource(R.string.flex_max_tx_power), i / 10)); + + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + + } + + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + + } + }; + binding.xiegumaxPowerSeekBar.setOnSeekBarChangeListener(onSeekBarChangeListener); + + + return binding.getRoot(); + } +} \ No newline at end of file diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/wave/FT8Resample.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/wave/FT8Resample.java new file mode 100644 index 00000000..4af629d9 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/wave/FT8Resample.java @@ -0,0 +1,30 @@ +package com.bg7yoz.ft8cn.wave; + +/** + * 用于重采样的库。 + * @author bg7yoz + * @date 2023-09-09 + */ +public class FT8Resample { + + static { + System.loadLibrary("ft8cn"); + } + + public static native short[] get16Resample16(short[] inputData, int inputRate + , int outputRate,int channels); + + public static native float[] get32Resample16(short[] inputData, int inputRate + , int outputRate,int channels); + public static native short[] get16Resample32(float[] inputData, int inputRate + , int outputRate,int channels); + public static native float[] get32Resample32(float[] inputData, int inputRate + , int outputRate,int channels); + + public static native byte[] get8Resample16(short[] inputData, int inputRate + , int outputRate,int channels); + + public static native byte[] get8Resample32(float[] inputData, int inputRate + , int outputRate,int channels); + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/wave/HamRecorder.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/wave/HamRecorder.java new file mode 100644 index 00000000..47f762a2 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/wave/HamRecorder.java @@ -0,0 +1,308 @@ +package com.bg7yoz.ft8cn.wave; + +import android.annotation.SuppressLint; +import android.media.AudioFormat; +import android.util.Log; + +import java.io.BufferedOutputStream; +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; +/** + * 录音类。通过AudioRecord对象来实现录音。 + * HamRecorder录音的数据通过监听类GetVoiceData来实现。HamRecorder实例中有一个监听器列表onGetVoiceList。 + * 当有录音数据后,HamRecorder会触发监听器列表中各监听器的OnReceiveData回调。 + * 制作此类的目的,是防止FT8各录音时序因录音启动时间的问题,造成重叠创建录音对象或录音的时长达不到一个时序的时长(15秒) + *

+ * @author BG7YOZ + * @date 2022-05-31 + */ + +public class HamRecorder { + private static final String TAG = "HamRecorder"; + //private int bufferSize = 0;//最小缓冲区大小 + private static final int sampleRateInHz = 12000;//采样率 + private static final int channelConfig = AudioFormat.CHANNEL_IN_MONO; //单声道 + //private static final int audioFormat = AudioFormat.ENCODING_PCM_16BIT; //量化位数 + private static final int audioFormat = AudioFormat.ENCODING_PCM_FLOAT; //量化位数 + + //private AudioRecord audioRecord = null;//AudioRecord对象 + private boolean isRunning = false;//是否处于录音的状态。 + + private final ArrayList voiceDataMonitorList = new ArrayList<>();//监听回调列表,在监听回调中获取数据。 + private OnVoiceMonitorChanged onVoiceMonitorChanged=null; + + private boolean isMicRecord=true; + private MicRecorder micRecorder=new MicRecorder(); + + + public HamRecorder(OnVoiceMonitorChanged onVoiceMonitorChanged){ + this.onVoiceMonitorChanged=onVoiceMonitorChanged; + } + + + public void setDataFromMic(){ + isMicRecord=true; + startRecord(); + } + public void setDataFromLan(){ + isMicRecord=false; + micRecorder.stopRecord(); + } + + /** + * 当接收到音频数据,所要处理的事情 + * @param bufferLen 数据的长度 + * @param buffer 数据缓冲区 + */ + public void doOnWaveDataReceived(int bufferLen,float[] buffer){ + if (!isRunning) return; + for (int i = 0; i < voiceDataMonitorList.size(); i++) { + //逐个监听器调用回调,把数据提供给回调函数 + if (voiceDataMonitorList.get(i)!=null) { + voiceDataMonitorList.get(i).onHamRecord.OnReceiveData(buffer, bufferLen); + } + } + + //doDataMonitorChanged(); + } + + + /** + * 是否处于录音状态 + * + * @return boolean,是否处于录音状态 + */ + public boolean isRunning() { + return isRunning; + } + + /** + * 开始录音,此方法使设备一直处于录音状态,录音数据的获取通过监听器类GetVoiceData来实现。 + * 录音对象在读取到数据(audioRecord.read)后,把监听器列表中的所有监听器的OnReceiveData回调都调用一次。 + * 录音的状态在isRecording中。 + */ + @SuppressLint("MissingPermission") + public void startRecord() { + if (isMicRecord){//如果是用MIC采集声音 + micRecorder.start(); + micRecorder.setOnDataListener(new MicRecorder.OnDataListener() { + @Override + public void onDataReceived(float[] data, int len) { + doOnWaveDataReceived(len,data); + } + }); + } + isRunning=true; + + } + + private void doDataMonitorChanged(){ + if (onVoiceMonitorChanged!=null){ + onVoiceMonitorChanged.onMonitorChanged(voiceDataMonitorList.size()); + } + } + /** + * 删除数据监听器 + * @param monitor 数据监听器 + */ + public void deleteVoiceDataMonitor(VoiceDataMonitor monitor) { + voiceDataMonitorList.remove(monitor); + doDataMonitorChanged(); + } + + /** + * 获取监听器的数量 + * @return 返回数量 + */ + public int getVoiceMonitorCount(){ + return voiceDataMonitorList.size(); + } + + /** + * 获取监听器的列表 + * @return 监听器列表 + */ + public ArrayList getVoiceDataMonitors(){ + return this.voiceDataMonitorList; + } + + /** + * 停止录音。当录音停止后,监听列表中的监听器全部删除。 + */ + public void stopRecord() { + micRecorder.stopRecord(); + isRunning = false; + } + + /** + * 获取录音数据的方法,通过加载数据监听器(VoiceDataMonitor)的方法实现。 + * 录音数据在OnGetVoiceDataDone回调中,当录音达到指定的时长(毫秒)触发。 + * 获取录音,是给录音对象加载一个监听器对象,在监听器的OnReceiveData回调中获取数据,当数据达到预期的数量时, + * 触发OnGetVoiceDataDone回调。该回调动作在另一个线程中,要注意UI的处理。 + * 监听有两种模式:一次性、循环。 + * 一次性:获取数据后,此监听器自动删除,不再触发。 + * 循环,监听器始终存在,获取数据后,重新复位数据,进入下一次监听状态。直到录音停止,监听器才被删除。 + * duration毫秒 + * + * @param duration 录音数据的时长(毫秒) + * @param afterDoneRemove 获取录音后是否删除监听器,false:循环获取录音数据。 + * @param getVoiceDataDone 当录音数据达到指定的时长后,触发此回调 + */ + public VoiceDataMonitor getVoiceData(int duration, boolean afterDoneRemove, OnGetVoiceDataDone getVoiceDataDone) { + if (isRunning) { + VoiceDataMonitor dataMonitor = new VoiceDataMonitor(duration, this + , afterDoneRemove, getVoiceDataDone); + dataMonitor.voiceDataMonitor = dataMonitor;//用于监听器删除自己用。 + voiceDataMonitorList.add(dataMonitor); + doDataMonitorChanged(); + return dataMonitor; + } else { + return null; + } + } + + /** + * 监听器类,用于录音数据的获取。 + * 当监听类,需要设定录音的时长(毫秒),当达到指定的时长后,会产生一个OnGetVoiceDataDone回调,在此回调中,可以获得 + * 该时长的录音数据。可以设定此监听是一次性的(afterDoneRemove=true),还是循环往复的(afterDoneRemove=false)。 + * 一次性的,就是监听达到指定时长后,就不继续监听了,录音实例会把该监听删除。 + * 循环往复,就是监听到指定时长后,复位,继续重新监听。此模式方便形成波表数据。 + */ + static class VoiceDataMonitor { + private final String TAG = "GetVoiceData"; + private final float[] voiceData;//录音数据。大小由时长、采样率、采样位决定的。 + private int dataCount;//计数器,当前数据的获取量 + + //onHamRecord是当录音对象有数据时触发的回调,通过该回调填充voiceData缓冲区,当缓冲区满时,触发OnGetVoiceDataDone回调。 + public OnHamRecord onHamRecord; + //getVoiceData是本监听器的地址,用于在录音对象的监听列表中删除本监听器。 + // 在GetVoiceData构建后,注意!!!一定要对该变量赋值!否则无法删除本监听器。 + public VoiceDataMonitor voiceDataMonitor = null; + + /** + * 监听类,用于录音数据的获取 + * GetVoiceData类的构建方法。此类是用于添加到录音类HamRecorder中onGetVoiceList,当有录音数据返回时,产生回调。 + * 此类的目的就是录音时,可以有多个对象从录音中获取数据,而不产生冲突。 + * + * @param duration 获取录音数据的时长(毫秒)。 + * @param hamRecorder 录音类的实例。方便删除本监听器等操作。 + * @param afterDoneRemove 当达到录音的时长后,是否移除本监听实例,true:移除,false:不移除,循环监听 + * @param onGetVoiceDataDone 达到录音的时长后,触发此回调。为了防止占用太多录音的时间,此回调在另一个线程。 + */ + public VoiceDataMonitor(int duration, HamRecorder hamRecorder, boolean afterDoneRemove + , OnGetVoiceDataDone onGetVoiceDataDone) { + //时长,毫秒 + //宿主对象,方便用词对象调用删除数据获取动作列表中的本实例 + + dataCount = 0;//当前的数据获取量 + //生成预期大小中的数据缓冲区。 + //因为是16Bit采样,所以byte*2。 + //voiceData = new byte[duration * HamRecorder.sampleRateInHz * 2 / 1000]; + voiceData = new float[duration * HamRecorder.sampleRateInHz / 1000]; + + //当有录音数据时触发的回调函数。 + onHamRecord = new OnHamRecord() { + @Override + public void OnReceiveData(float[] data, int size) { + int remainingSize = size+dataCount-voiceData.length;//如果大于0,就是剩余的数据量, + + for (int i = 0; (i < size) && (dataCount < voiceData.length); i++) { + voiceData[dataCount] = data[i];//把录音缓冲区的数据搬运到本监听器中来 + dataCount++; + } + + if (dataCount >= (voiceData.length)) {//当数据量达到所需要的。发起回调。 + onGetVoiceDataDone.onGetDone(voiceData); + if (afterDoneRemove) {//如果是一次性的获取数据,则在录音对象中的监听列表中删除此监听回调。 + hamRecorder.deleteVoiceDataMonitor(voiceDataMonitor); + } else { + dataCount = 0;//如果是循环录音,则复位计数器。 + if (remainingSize>0) {//把剩余的数据补发到后续事件上 + float[] remainingData = new float[remainingSize]; + System.arraycopy(data, size - remainingSize, remainingData, 0, remainingSize); + OnReceiveData(remainingData,remainingSize); + } + } + } + } + }; + + } + + } + + /** + * 类方法,把数据保存到文件中去,是临时文件名。 + * @param data 数据 + * @return 返回生成的临时文件名。 + */ + public static String saveDataToFile(byte[] data) { + String audioFileName = null; + File recordingFile; + try { + //生成临时文件名 + recordingFile = File.createTempFile("Audio", ".wav", null); + audioFileName = recordingFile.getPath(); + + //数据流文件 + DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(audioFileName))); + //写Wav文件头 + new WriteWavHeader(data.length, sampleRateInHz, channelConfig, audioFormat).writeHeader(dos); + for (int i = 0; i < data.length; i++) { + dos.write(data[i]); + } + Log.d(TAG, String.format("生成文件结束(%d字节,%.2f秒),文件:%s", data.length + 44 + , ((float) data.length / 2 / sampleRateInHz), audioFileName)); + dos.close();//关闭文件流 + + + } catch (IOException e) { + Log.e(TAG, String.format("生成临时文件出错!%s", e.getMessage())); + } + + return audioFileName; + } + + /** + * 把原始的声音数据转换成16位的数组数据。 + * @param buffer 原始的声音数据(8位) + * @return 返回16位的int格式数组 + */ + public static int[] byteDataTo16BitData(byte[] buffer){ + int[] data=new int[buffer.length /2]; + for (int i = 0; i < buffer.length/2; i++) { + int res = (buffer[i*2] & 0x000000FF) | (((int) buffer[i*2+1]) << 8); + data[i]=res; + } + return data; + } + + /** + * 把原始的声音数据转换成浮点数组数据 + * @param bytes 原始的声音数据(float) + * @return 转换成float数组 + */ + public static float[] getFloatFromBytes(byte[] bytes) { + float[] floats = new float[bytes.length / 4]; + DataInputStream dis = new DataInputStream(new ByteArrayInputStream(bytes)); + for (int i = 0; i < floats.length; i++) { + try { + floats[i] = dis.readFloat(); + } catch (IOException e) { + e.printStackTrace(); + break; + } + } + try { + dis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + return floats; + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/wave/MicRecorder.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/wave/MicRecorder.java new file mode 100644 index 00000000..d47d79ae --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/wave/MicRecorder.java @@ -0,0 +1,102 @@ +package com.bg7yoz.ft8cn.wave; +/** + * 使用Mic录音的操作。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.annotation.SuppressLint; +import android.media.AudioFormat; +import android.media.AudioRecord; +import android.media.MediaRecorder; +import android.util.Log; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.ui.ToastMessage; + +public class MicRecorder { + private static final String TAG = "MicRecorder"; + private int bufferSize = 0;//最小缓冲区大小 + private static final int sampleRateInHz = 12000;//采样率 + private static final int channelConfig = AudioFormat.CHANNEL_IN_MONO; //单声道 + //private static final int audioFormat = AudioFormat.ENCODING_PCM_16BIT; //量化位数 + private static final int audioFormat = AudioFormat.ENCODING_PCM_FLOAT; //量化位数 + + private AudioRecord audioRecord = null;//AudioRecord对象 + private boolean isRunning = false;//是否处于录音的状态。 + private OnDataListener onDataListener; + + public interface OnDataListener{ + void onDataReceived(float[] data,int len); + } + + @SuppressLint("MissingPermission") + public MicRecorder(){ + //计算最小缓冲区 + bufferSize = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat); +// audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRateInHz + audioRecord = new AudioRecord(MediaRecorder.AudioSource.DEFAULT, sampleRateInHz + , channelConfig, audioFormat, bufferSize);//创建AudioRecorder对象 + } + + public void start(){ + if (isRunning) return; + + float[] buffer = new float[bufferSize]; + try { + audioRecord.startRecording();//开始录音 + }catch (Exception e){ + ToastMessage.show(String.format(GeneralVariables.getStringFromResource( + R.string.recorder_cannot_record),e.getMessage())); + Log.d(TAG, "startRecord: "+e.getMessage() ); + } + + isRunning = true; + + new Thread(new Runnable() { + @Override + public void run() { + while (isRunning) { + //判断是否处于录音状态,state!=3,说明没有处于录音的状态 + if (audioRecord.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING) { + isRunning = false; + Log.d(TAG, String.format("录音失败,状态码:%d", audioRecord.getRecordingState())); + break; + } + + //读录音的数据 + int bufferReadResult = audioRecord.read(buffer, 0, bufferSize,AudioRecord.READ_BLOCKING); + + if (onDataListener!=null){ + onDataListener.onDataReceived(buffer,bufferReadResult); + } + } + try { + if (audioRecord.getRecordingState() == AudioRecord.RECORDSTATE_RECORDING) { + audioRecord.stop();//停止录音 + } + }catch (Exception e){ + ToastMessage.show(String.format(GeneralVariables.getStringFromResource( + R.string.recorder_stop_record_error),e.getMessage())); + Log.d(TAG, "startRecord: "+e.getMessage() ); + } + } + }).start(); + } + + /** + * 停止录音。当录音停止后,监听列表中的监听器全部删除。 + */ + public void stopRecord() { + isRunning = false; + } + + public OnDataListener getOnDataListener() { + return onDataListener; + } + + public void setOnDataListener(OnDataListener onDataListener) { + this.onDataListener = onDataListener; + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/wave/OnAudioRecorded.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/wave/OnAudioRecorded.java new file mode 100644 index 00000000..350e75b2 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/wave/OnAudioRecorded.java @@ -0,0 +1,26 @@ +package com.bg7yoz.ft8cn.wave; + +/** + *定义音频录音结束后的回调接口。 + *回调接口主要有2个,录音开始前,录音开始后。 + * 注意!!!录音采用多线程的方式,此处的回调不在主线程中,如果回调中有UI操作的话,要使用runOnUiThread方法,防止界面锁死。 + * + * @author BG7YOZ + * @date 2022.5.7 + */ + +public interface OnAudioRecorded { + /** + * 录音开始前的回调函数。 + * @param audioFileName 生成的Wav文件名 + */ + void beginAudioRecord(String audioFileName); + + /** + * 录音结束后的回调函数。 + * @param audioFileName Wav文件名 + * @param dataSize 录音数据的大小,byte[]格式,不包括wav文件头的长度,如果要算wav文件长度,在此基础上+44。 + * @param duration 实际录音的时长(秒) + */ + void endAudioRecorded(String audioFileName,long dataSize,float duration); +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/wave/OnGetVoiceDataDone.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/wave/OnGetVoiceDataDone.java new file mode 100644 index 00000000..5f95c2ab --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/wave/OnGetVoiceDataDone.java @@ -0,0 +1,10 @@ +package com.bg7yoz.ft8cn.wave; + +/** + * 获取音频的回调 + * @author BGY70Z + * @date 2023-03-20 + */ +public interface OnGetVoiceDataDone { + void onGetDone(float[] data); +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/wave/OnHamRecord.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/wave/OnHamRecord.java new file mode 100644 index 00000000..1d714f86 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/wave/OnHamRecord.java @@ -0,0 +1,10 @@ +package com.bg7yoz.ft8cn.wave; + +/** + * 接收到音频的回调。 + * @author BGY70Z + * @date 2023-03-20 + */ +public interface OnHamRecord { + void OnReceiveData(float[] data,int size); +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/wave/OnVoiceMonitorChanged.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/wave/OnVoiceMonitorChanged.java new file mode 100644 index 00000000..938dc96a --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/wave/OnVoiceMonitorChanged.java @@ -0,0 +1,5 @@ +package com.bg7yoz.ft8cn.wave; + +public interface OnVoiceMonitorChanged { + void onMonitorChanged(int count); +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/wave/WaveAccess.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/wave/WaveAccess.java new file mode 100644 index 00000000..a80ac1de --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/wave/WaveAccess.java @@ -0,0 +1,11 @@ +package com.bg7yoz.ft8cn.wave; + +/** + * 波形文件(.wav)的读写操作,支持16bit和8bitPCM编码的单双声道文件操作 + * 已经弃用,FT8CN目前不采用文件的方式。 + * @author BGY70Z + * @date 2023-03-20 + */ +public class WaveAccess { + public static final String VERSION = "1.1"; +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/wave/WaveConstants.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/wave/WaveConstants.java new file mode 100644 index 00000000..19a7243a --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/wave/WaveConstants.java @@ -0,0 +1,28 @@ +package com.bg7yoz.ft8cn.wave; + +/** + * Wave文件操作所用的常量。 + * 已经弃用。FT8CN目前不采用文件方式处理音频。 + * @author BGY70Z + * @date 2023-03-20 + */ +public final class WaveConstants { + static public int LENCHUNKDESCRIPTOR = 4; + static public int LENCHUNKSIZE = 4; + static public int LENWAVEFLAG = 4; + static public int LENFMTSUBCHUNK = 4; + static public int LENSUBCHUNK1SIZE = 4; + static public int LENAUDIOFORMAT = 2; + static public int LENNUMCHANNELS = 2; + static public int LENSAMPLERATE = 2; + static public int LENBYTERATE = 4; + static public int LENBLOCKLING = 2; + static public int LENBITSPERSAMPLE = 2; + static public int LENDATASUBCHUNK = 4; + static public int LENSUBCHUNK2SIZE = 4; + + public static String CHUNKDESCRIPTOR = "RIFF"; + public static String WAVEFLAG = "WAVE"; + public static String FMTSUBCHUNK = "fmt "; + public static String DATASUBCHUNK = "data"; +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/wave/WaveFileReader.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/wave/WaveFileReader.java new file mode 100644 index 00000000..8bda1126 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/wave/WaveFileReader.java @@ -0,0 +1,202 @@ +package com.bg7yoz.ft8cn.wave; +/** + * 读取Wave文件的操作。 + * 已经弃用,FT8CN不采用音频文件的方法。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import java.io.BufferedInputStream; +import java.io.FileInputStream; +import java.io.IOException; + +@SuppressWarnings("unused") +public class WaveFileReader { + private String filename = null; + private int[][] data = null; + + private int len = 0; + + private String chunkdescriptor = null; + private long chunksize = 0; + private String waveflag = null; + private String fmtsubchunk = null; + private long subchunk1size = 0; + private int audioformat = 0; + private int numchannels = 0; + private long samplerate = 0; + private long byterate = 0; + private int blockalign = 0; + private int bitspersample = 0; + private String datasubchunk = null; + private long subchunk2size = 0; + private FileInputStream fis = null; + private BufferedInputStream bis = null; + + private boolean issuccess = false; + + public WaveFileReader(String filename) { + + this.initReader(filename); + } + + // 判断是否创建wav读取器成功 + public boolean isSuccess() { + return issuccess; + } + + // 获取每个采样的编码长度,8bit或者16bit + public int getBitPerSample() { + return this.bitspersample; + } + + // 获取采样率 + public long getSampleRate() { + return this.samplerate; + } + + // 获取声道个数,1代表单声道 2代表立体声 + public int getNumChannels() { + return this.numchannels; + } + + // 获取数据长度,也就是一共采样多少个 + public int getDataLen() { + return this.len; + } + + // 获取数据 + // 数据是一个二维数组,[n][m]代表第n个声道的第m个采样值 + public int[][] getData() { + return this.data; + } + + private void initReader(String filename) { + this.filename = filename; + + try { + fis = new FileInputStream(this.filename); + bis = new BufferedInputStream(fis); + + this.chunkdescriptor = readString(WaveConstants.LENCHUNKDESCRIPTOR); + if (!chunkdescriptor.endsWith("RIFF")) + throw new IllegalArgumentException("RIFF miss, " + filename + " is not a wave file."); + + this.chunksize = readLong(); + this.waveflag = readString(WaveConstants.LENWAVEFLAG); + if (!waveflag.endsWith("WAVE")) + throw new IllegalArgumentException("WAVE miss, " + filename + " is not a wave file."); + + this.fmtsubchunk = readString(WaveConstants.LENFMTSUBCHUNK); + if (!fmtsubchunk.endsWith("fmt ")) + throw new IllegalArgumentException("fmt miss, " + filename + " is not a wave file."); + + this.subchunk1size = readLong(); + this.audioformat = readInt(); + this.numchannels = readInt(); + this.samplerate = readLong(); + this.byterate = readLong(); + this.blockalign = readInt(); + this.bitspersample = readInt(); + + this.datasubchunk = readString(WaveConstants.LENDATASUBCHUNK); + if (!datasubchunk.endsWith("data")) + throw new IllegalArgumentException("data miss, " + filename + " is not a wave file."); + this.subchunk2size = readLong(); + + this.len = (int) (this.subchunk2size / (this.bitspersample / 8) / this.numchannels); + + this.data = new int[this.numchannels][this.len]; + + // 读取数据 + for (int i = 0; i < this.len; ++i) { + for (int n = 0; n < this.numchannels; ++n) { + if (this.bitspersample == 8) { + this.data[n][i] = bis.read(); + } else if (this.bitspersample == 16) { + this.data[n][i] = this.readInt(); + } + } + } + + issuccess = true; + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (bis != null) + bis.close(); + if (fis != null) + fis.close(); + } catch (Exception e1) { + e1.printStackTrace(); + } + } + } + + private String readString(int len) { + byte[] buf = new byte[len]; + try { + if (bis.read(buf) != len) + throw new IOException("no more data!!!"); + } catch (IOException e) { + e.printStackTrace(); + } + return new String(buf); + } + + private int readInt() { + byte[] buf = new byte[2]; + int res = 0; + try { + if (bis.read(buf) != 2) + throw new IOException("no more data!!!"); + res = (buf[0] & 0x000000FF) | (((int) buf[1]) << 8); + } catch (IOException e) { + e.printStackTrace(); + } + return res; + } + + private long readLong() { + long res = 0; + try { + long[] l = new long[4]; + for (int i = 0; i < 4; ++i) { + l[i] = bis.read(); + if (l[i] == -1) { + throw new IOException("no more data!!!"); + } + } + res = l[0] | (l[1] << 8) | (l[2] << 16) | (l[3] << 24); + } catch (IOException e) { + e.printStackTrace(); + } + return res; + } + + private byte[] readBytes(int len) { + byte[] buf = new byte[len]; + try { + if (bis.read(buf) != len) + throw new IOException("no more data!!!"); + } catch (IOException e) { + e.printStackTrace(); + } + return buf; + } + + public static int[] readSingleChannel(String filename) { + if (filename == null || filename.length() == 0) { + return null; + } + try { + WaveFileReader reader = new WaveFileReader(filename); + int[] res = reader.getData()[0]; + return res; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/wave/WaveFileWriter.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/wave/WaveFileWriter.java new file mode 100644 index 00000000..dcc46bd9 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/wave/WaveFileWriter.java @@ -0,0 +1,144 @@ +package com.bg7yoz.ft8cn.wave; +/** + * 把音频保存成wave文件的操作。 + * 已经弃用,FT8CN目前不做音频的保存操作。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import java.io.BufferedOutputStream; +import java.io.FileOutputStream; +import java.io.IOException; + +public class WaveFileWriter { + private String filename = null; + private FileOutputStream fos = null; + private BufferedOutputStream bos = null; + + private long chunksize = 0; + private long subchunk1size = 0; + private int audioformat = 0; + private int numchannels = 0; + private long samplerate = 0; + private long byterate = 0; + private int blockalign = 0; + private int bitspersample = 0; + private long subchunk2size = 0; + + public WaveFileWriter(String filename, int[][] data, long samplerate,int bitspersample) { + this.initWriter(filename, data, 0, data[0].length, samplerate,bitspersample); + } + + public WaveFileWriter(String filename, int[][] data, int offset, int len, long samplerate,int bitspersample) { + this.initWriter(filename, data, offset, len, samplerate,bitspersample); + } + + public void initWriter(String filename, int[][] data, int offset, int len, long samplerate,int bitspersample) { + this.filename = filename; + + try { + fos = new FileOutputStream(this.filename); + bos = new BufferedOutputStream(fos); + + // int datalen = data[0].length; + int datalen = len; + + this.samplerate = samplerate; + // this.bitspersample = bitspersample; + this.bitspersample = bitspersample; + this.numchannels = data.length; + this.subchunk2size = this.numchannels * (this.bitspersample / 8) * datalen; + this.subchunk1size = 16; + this.audioformat = 1; // PCM + this.byterate = this.samplerate * this.bitspersample * this.numchannels / 8; + this.blockalign = this.numchannels * this.bitspersample / 8; + + this.chunksize = this.subchunk2size + 8 + this.subchunk1size + 8 + 4; + + writeString(WaveConstants.CHUNKDESCRIPTOR, WaveConstants.LENCHUNKDESCRIPTOR); + writeLong(this.chunksize); + writeString(WaveConstants.WAVEFLAG, WaveConstants.LENWAVEFLAG); + writeString(WaveConstants.FMTSUBCHUNK, WaveConstants.LENFMTSUBCHUNK); + writeLong(this.subchunk1size); + writeInt(this.audioformat); + writeInt(this.numchannels); + writeLong(this.samplerate); + writeLong(this.byterate); + writeInt(this.blockalign); + writeInt(this.bitspersample); + writeString(WaveConstants.DATASUBCHUNK, WaveConstants.LENDATASUBCHUNK); + writeLong(this.subchunk2size); + for (int i = 0; i < datalen; ++i) { + for (int n = 0; n < this.numchannels; ++n) { + if (this.bitspersample == 16) { + writeInt(data[n][i + offset]); + } else { + writeByte((byte) data[n][i + offset]); + } + } + } + bos.flush(); + fos.flush(); + bos.close(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void close() { + + } + + private void writeString(String str, int len) { + if (str.length() != len) { + throw new IllegalArgumentException("length not match!!!"); + } + byte[] bt = str.getBytes(); + try { + bos.write(bt); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private void writeByte(byte data) { + try { + bos.write(new byte[] { data }, 0, 1); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private void writeInt(int data) { + byte[] buf = new byte[2]; + buf[1] = (byte) (data >>> 8); + buf[0] = (byte) (data & 0xFF); + try { + bos.write(buf); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private void writeLong(long data) { + byte[] buf = new byte[4]; + buf[0] = (byte) (data & 0x00ff); + buf[1] = (byte) ((data >> 8) & 0x00ff); + buf[2] = (byte) ((data >> 16) & 0x00ff); + buf[3] = (byte) ((data >> 24) & 0x00ff); + try { + bos.write(buf); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public static boolean saveSingleChannel(String filename, int[] data, long samplerate,int bitspersample) { + int[][] datar = new int[1][]; + datar[0] = data; + WaveFileWriter writer = new WaveFileWriter(filename, datar, samplerate,bitspersample); + writer.close(); + return true; + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/wave/WriteWavHeader.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/wave/WriteWavHeader.java new file mode 100644 index 00000000..243a47cc --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/wave/WriteWavHeader.java @@ -0,0 +1,128 @@ +package com.bg7yoz.ft8cn.wave; +/** + * 写WAVE文件的头。 + * 已经弃用。FT8CN不做音频文件的操作。 + * @author BGY70Z + * @date 2023-03-20 + */ + +import android.media.AudioFormat; +import android.util.Log; + +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.RandomAccessFile; + +public class WriteWavHeader { + private int samplesBits; + private final int channels; + private final int totalAudioLen; + private final int longSampleRate; + String TAG = "HamAudioRecorder";//调试用标志 + + public WriteWavHeader( int totalAudioLen, int longSampleRate, int channels, int samplesBits) { + if (samplesBits == AudioFormat.ENCODING_PCM_16BIT) + this.samplesBits = 16; + else if (samplesBits == AudioFormat.ENCODING_PCM_8BIT) + this.samplesBits = 8; + + if (channels == AudioFormat.CHANNEL_IN_STEREO) + this.channels = 2; + else + this.channels = 1; + this.totalAudioLen = totalAudioLen; + this.longSampleRate = longSampleRate; + + } + + private byte[] makeWaveHeader(){ + int file_size = totalAudioLen + 44 - 8;//文件大小,刨除前面RIFF和file_size + byte[] header = new byte[44]; + header[0] = 'R'; // RIFF/WAVE header + header[1] = 'I'; + header[2] = 'F'; + header[3] = 'F'; + header[4] = (byte) (file_size & 0xff); + header[5] = (byte) ((file_size >> 8) & 0xff); + header[6] = (byte) ((file_size >> 16) & 0xff); + header[7] = (byte) ((file_size >> 24) & 0xff); + header[8] = 'W'; + header[9] = 'A'; + header[10] = 'V'; + header[11] = 'E'; + header[12] = 'f'; // 'fmt ' chunk + header[13] = 'm'; + header[14] = 't'; + header[15] = ' '; + header[16] = 16; // 4 bytes: size of 'fmt ' chunk + header[17] = 0; + header[18] = 0; + header[19] = 0; + header[20] = 1; // format = 1表示PCM编码 + header[21] = 0; + header[22] = (byte) channels;//1为单声道,2是双声道 + header[23] = 0; + header[24] = (byte) (longSampleRate & 0xff); + header[25] = (byte) ((longSampleRate >> 8) & 0xff); + header[26] = (byte) ((longSampleRate >> 16) & 0xff); + header[27] = (byte) ((longSampleRate >> 24) & 0xff); + + header[28] = (byte) (samplesBits & 0xff); + header[29] = (byte) ((samplesBits >> 8) & 0xff); + header[30] = (byte) ((samplesBits >> 16) & 0xff); + header[31] = (byte) ((samplesBits >> 24) & 0xff); + + //2字节数据块长度(每个样本的字节数=通道数*每次采样得到的样本位数/8) + if (samplesBits==AudioFormat.ENCODING_PCM_16BIT) { + header[32] = (byte) (channels * samplesBits); + header[33] = 0; + header[34] = 16; // 每个采样点的位数 + header[35] = 0; + }else if (samplesBits==AudioFormat.ENCODING_PCM_8BIT){ + header[32] = (byte) (channels ); + header[33] = 0; + header[34] = 8; // 每个采样点的位数 + header[35] = 0; + }else { + header[32] = (byte) (channels * samplesBits / 8); + header[33] = 0; + header[34] = (byte) samplesBits; //每个采样点的位数 + header[35] = 0; + } + + + header[36] = 'd'; + header[37] = 'a'; + header[38] = 't'; + header[39] = 'a'; + //pcm音频数据大小 + header[40] = (byte) (totalAudioLen & 0xff); + header[41] = (byte) ((totalAudioLen >> 8) & 0xff); + header[42] = (byte) ((totalAudioLen >> 16) & 0xff); + header[43] = (byte) ((totalAudioLen >> 24) & 0xff); + return header; + } + + public void writeHeader(DataOutputStream dos) { + + try { + dos.write(makeWaveHeader()); + } catch (IOException e) { + Log.e(TAG, String.format("创建wav文件头(WriteWavHeader)错误!%s", e.getMessage())); + } + + } + public void modifyHeader(String fileName) { + + try { + RandomAccessFile raf=new RandomAccessFile(fileName,"rw"); + raf.seek(0); + raf.write(makeWaveHeader()); + raf.close(); + } catch (IOException e) { + Log.e(TAG, String.format("修改wav文件头(modifyHeader)错误!%s", e.getMessage())); + } + + } + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/x6100/X6100Meters.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/x6100/X6100Meters.java new file mode 100644 index 00000000..5b2ded02 --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/x6100/X6100Meters.java @@ -0,0 +1,196 @@ +package com.bg7yoz.ft8cn.x6100; + +import android.annotation.SuppressLint; +import android.util.Log; + +import androidx.annotation.NonNull; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.flex.VITA; + +public class X6100Meters { + private final String TAG = "X6100Meters"; + public float sMeter; + public float power; + public float swr; + public float alc; + public float volt; + public float max_power; + public short tx_volume; + public short af_level;//电台的音量 + + /* + 新版6100的计数方式 + S-Meter: + 0000=S0,0120=S9,0242=S9+60dB + SWR-Meter: + 0000=1.0,0048=1.5,0080=2.0,0120=3.0 + Volt-Meter: + 0000=0V,0075=5V,0241=16V + */ + + public X6100Meters() { + + } + + public synchronized void update(byte[] meterData) { + for (int i = 0; i < meterData.length / 4; i++) { + short index = VITA.readShortDataBigEnd(meterData, i * 4); + short value = VITA.readShortDataBigEnd(meterData, i * 4 + 2); + setValues(index, value); + } + } + + /** + * 把x6100传递过来的S.Meter值转换为dBm值 + * + * @param value 值 + * @return dBm值 + */ + public static float getMeter_dBm(float value) { + if (value <= 0) { + return -150f; + } else if (value <= 120f) { + return (value * 54f / 120f - 129f); + } else if (value < 242) { + return (value * 60f) / (242f - 120f) - 120f * 60f / (242f - 120f); + + } else { + return 0; + } + } + + /** + * 计算电源的电压,0~16V + * + * @param value 值 + * @return 电压 + */ + public static float getMeter_volt(float value) { + if (value <= 75) { + return value / 25f; + } else { + return (value - 75f) * 11 / 166f + 5; + } + } + + /** + * 把信号强度dBm值转换为仪表S.Meter值 + * + * @param fval dBm + * @return 仪表值 + */ + private static float getMeters(float fval) { + float val; + if (fval < -123.0) { + val = 0; + } else if (fval <= -75.0f) { // S1~S9 + val = (129.0f + fval) * 120.0f / 54.0f; + } else if (fval <= -15.0f) { // S9+10~60 + val = 120.0f + (75.0f + fval) * (242.0f - 120.0f) / 60.0f; + } else { + val = 242f;// max + } + return val; + } + + /** + * X6100按照1~∞(25.5)对应计算出0~255值的算法 + * + * @param fval 原始swr + * @return 转换后的值 + */ + private static float get6100SWR(float fval) { + int val; + if (fval <= 1.5f) {//swr小于1.5的情况(转换后0~48) + val = Math.round((fval - 1.0f) * (48.0f / 0.5f)); + } else if (fval <= 2.0f) {//swr在1.5~2.0之间(转换后49~80) + val = Math.round((fval - 1.5f) * (80.0f - 48.0f) / 0.5f + 48.0f); + } else if (fval <= 3.0) {//swr在2.0~3.0之间(转换后81~120) + val = Math.round((fval - 2.0f) * (120.0f - 80.0f) + 80.0f); + } else {//swr大于3.0~∞(转换后121~255) + val = Math.round((fval - 3.0f) * (255.0f - 120.0f) / (25.5f - 3.0f) + 120.0f); + } + //限定数值范围 + if (val > 255) { + val = 255; + } else if (val < 0) { + val = 0; + } + return val; + } + + /** + * 把6100的swr(0~255)转换成真正的swr值 + * 6100的值为0~255,分为4段,对应的范围是:1~1.5,1.5~2.0,2.0~3.0,3.0~无穷大(实际值是25.5) + * 1~1.5(0~48),1.5~2.0(48~80),2.0~3.0(80~120),3.0~无穷大(实际是25.5)(120~255) + * @param fval 转换值 + * @return 真正的swr值 + */ + private static float getSWR(float fval) { + float val; + if (fval <= 48.0f) {//1~1.5 + val = fval / 96.0f + 1; + } else if (fval <= 80.0f) {//1.5~2.0 + val = (fval - 48.0f) / 64.0f + 1.5f; + } else if (fval < 120.0f) {//2.0~3.0 + val = (fval - 80.0f) / 40.0f + 2.0f; + } else {//3.0~∞(25.5) + val = (fval - 120.0f) / 125.0f * (25.5f - 3.0f) + 3.0f; + } + return val; + } + + + private void setValues(short index, short value) { + switch (index) { + case 0://sMeter + sMeter = value; + break; + case 1://power + power = (25 / 255f) * value * 10; + break; + case 2://swr + //6100的值为0~255,分为4段,对应的范围是:1~1.5,1.5~2.0,2.0~3.0,3.0~无穷大(实际值是25.5) + //1~1.5(0~48),1.5~2.0(48~80),2.0~3.0(80~120),3.0~无穷大(120~255) + swr = getSWR(value * 1.0f); + break; + case 3://alc原始值是0~255,发送过来的是转换后的值0~120 + alc = 120-value * 1.0f; + //Log.e(TAG,String.format("alc:%d",value)); + break; + case 4: + volt = getMeter_volt(value); + break; + case 5: + max_power = value / 25.5f; + //Log.e(TAG,String.format("max power:%d",value)); + break; + case 6: + tx_volume = value; + break; + case 7: + af_level = value; + break; + default: + } + } + + @SuppressLint("DefaultLocale") + @NonNull + @Override + public String toString() { + //return String.format("S.Meter: %.1f dBm\nSWR: %s\nALC: %.1f\nVolt: %.1fV\nTX power: %.1f W\nMax tx power: %.1f\nTX volume:%d%%" + return String.format(GeneralVariables.getStringFromResource(R.string.xiegu_meter_info) + , getMeter_dBm(sMeter) + , swr > 8 ? "∞" : String.format("%.1f", swr) + , alc + , volt + , power + , max_power + , tx_volume + ); + //"信号强度: %.1f dBm\n驻波: %s\nALC: %.1f\n电压: %.1fV\n发射功率: %.1f W\n最大发射功率: %.1f\n发射音量:%d%%" + } +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/x6100/X6100Radio.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/x6100/X6100Radio.java new file mode 100644 index 00000000..3b821fad --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/x6100/X6100Radio.java @@ -0,0 +1,978 @@ +package com.bg7yoz.ft8cn.x6100; + +import static com.bg7yoz.ft8cn.flex.VITA.XIEGU_METER_CLASS_ID; +import static com.bg7yoz.ft8cn.flex.VITA.XIEGU_METER_Stream_Id; +import static com.bg7yoz.ft8cn.flex.VITA.XIEGU_PING_CLASS_ID; +import static com.bg7yoz.ft8cn.flex.VITA.XIEGU_PING_Stream_Id; +import static com.bg7yoz.ft8cn.x6100.X6100Radio.XieguResponseStyle.RESPONSE; + +import android.annotation.SuppressLint; +import android.media.AudioAttributes; +import android.media.AudioFormat; +import android.media.AudioTrack; +import android.util.Log; + +import androidx.lifecycle.MutableLiveData; + +import com.bg7yoz.ft8cn.GeneralVariables; +import com.bg7yoz.ft8cn.R; +import com.bg7yoz.ft8cn.flex.RadioTcpClient; +import com.bg7yoz.ft8cn.flex.RadioUdpClient; +import com.bg7yoz.ft8cn.flex.VITA; +import com.bg7yoz.ft8cn.flex.VitaPacketType; +import com.bg7yoz.ft8cn.flex.VitaTSF; +import com.bg7yoz.ft8cn.flex.VitaTSI; +import com.bg7yoz.ft8cn.rigs.BaseRig; +import com.bg7yoz.ft8cn.rigs.IcomRigConstant; +import com.bg7yoz.ft8cn.ui.ToastMessage; + +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.SocketException; +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.Timer; +import java.util.TimerTask; + +public class X6100Radio { + public enum XieguCommand { + UNKNOW,//未知指令 + AUDIO,//音频指令 + STREAM,//数据流指令 + SUB,//订阅仪表 + UNSUB,//取消订阅仪表 + A91,//ft8符号 + ATU,//自动天调 + TUNE,//设置频率 + MODE,//操作模式 + PTT,//PTT操作 + SET//设置操作 + } + + public enum XieguResponseStyle { + STATUS,//状态信息,S+HANDLE + RESPONSE,//命令的响应,R+客户端命令序列号 + HANDLE,//电台给定的句柄,H+句柄(32位的16进制表示) + VERSION,//版本号,V+版本号 + COMMAND,//发送命令,C+序列号|命令 + UNKNOW//未知的回复类型 + } + + private static final String TAG = "X6100Radio"; + private static int lossCount = 0; + private static int currentCount = -1; + + private String modelName;//电台型号 + private String version;//电台版本号 + private String rig_ip;//电台的IP + private String mac;//mac地址 + public boolean isPttOn = false; + private int control_port = 7002;//电台的控制端口 + private int stream_port = 7003;//电台端流数据的端口 + private int discovery_port = 7001;//发现协议的端口 + private long lastSeen;//最后一次消息的时间 + private boolean isAvailable = true;//电台是不是有效 + private final StringBuilder buffer = new StringBuilder();//指令的缓存 + private final RadioTcpClient tcpClient = new RadioTcpClient(); + private RadioUdpClient streamClient; + private int commandSeq = 1;//指令的序列 + private XieguCommand xieguCommand; + private int handle = 0; + private String commandStr; + private int frames = 768;//每个周期的帧数 + private int period = 64;//每个周期的时长,毫秒 + + + //************************事件处理接口******************************* + private OnReceiveDataListener onReceiveDataListener;//当前接收到的数据事件 + private OnTcpConnectStatus onTcpConnectStatus;//当TCP连接状态变化的事件 + private OnReceiveStreamData onReceiveStreamData;//当接收到流数据后的处理事件 + private OnCommandListener onCommandListener;//触发命令事件 + private OnStatusListener onStatusListener;//触发状态事件 + //***************************************************************** + private AudioTrack audioTrack = null; + + + ///******************用于仪表信息显示************* + public MutableLiveData mutablePing = new MutableLiveData<>();//ping值 + public MutableLiveData mutableLossPackets = new MutableLiveData<>();//丢失的包数量 + public MutableLiveData mutableMeters = new MutableLiveData<>(); + private X6100Meters meters = new X6100Meters(); + + private boolean swrAlert = false; + private boolean alcAlert = false; + + + + + private Timer pingTimer = new Timer(); + + private TimerTask pingTask() { + return new TimerTask() { + @Override + public void run() { + + try { + if (!streamClient.isActivated() || !isConnect()) { + pingTimer.cancel(); + pingTimer.purge(); + pingTimer = null; + return; + } + VITA vita = new VITA(VitaPacketType.EXT_DATA_WITH_STREAM + , VitaTSI.TSI_OTHER + , VitaTSF.TSF_REALTIME + , 0 + , XIEGU_PING_Stream_Id + , XIEGU_PING_CLASS_ID); + + vita.packetCount = 0; + vita.packetSize = 7; + vita.integerTimestamp = 0;//0是发送包,1是接收包 + vita.fracTimeStamp = System.currentTimeMillis(); + streamClient.sendData(vita.pingDataToVita(), rig_ip, stream_port); + + } catch (Exception e) { + Log.e(TAG, "ping timer error:" + e.getMessage()); + } + } + }; + } + + /** + * 更新最后看到的时间 + */ + public void updateLastSeen() { + this.lastSeen = System.currentTimeMillis(); + } + + public X6100Radio() { + updateLastSeen(); + } + + public X6100Radio(String s, String ip) { + mutableLossPackets.postValue(0); + update(s, ip); + } + + public void update(String discoverStr, String ip) { + Log.d(TAG, discoverStr); + rig_ip = ip; + + String[] paras = discoverStr.replace("\0", " ").split(" "); + version = getParameterStr(paras, "ft8cn_server_version"); + modelName = getParameterStr(paras, "model"); + mac = getParameterStr(paras, "mac"); + control_port = getParameterInt(paras, "control_port"); + stream_port = getParameterInt(paras, "stream_port"); + discovery_port = getParameterInt(paras, "discovery_port"); + + updateLastSeen(); + } + + /** + * 到参数列表中找指定的字符类型参数 + * + * @param parameters 参数列表 + * @param prefix 参数名前缀 + * @return 参数 + */ + private String getParameterStr(String[] parameters, String prefix) { + for (int i = 0; i < parameters.length; i++) { + if (parameters[i].toLowerCase().startsWith(prefix.toLowerCase() + "=")) { + return parameters[i].substring(prefix.length() + 1); + } + } + //如果没找到,返回空字符串 + return ""; + } + + /** + * 到参数列表中找指定的int类型参数 + * + * @param parameters 参数列表 + * @param prefix 参数名前缀 + * @return 参数 + */ + private int getParameterInt(String[] parameters, String prefix) { + for (int i = 0; i < parameters.length; i++) { + if (parameters[i].toLowerCase().startsWith(prefix.toLowerCase() + "=")) { + try { + return Integer.parseInt(parameters[i].substring(prefix.length() + 1)); + } catch (NumberFormatException e) { + e.printStackTrace(); + Log.e(TAG, "getParameterInt exception: " + e.getMessage()); + return 0; + } + } + } + //如果没找到,返回0 + return 0; + + } + + /** + * 检查是不是 刚刚 离线,离线条件:5秒内没有收到电台的广播数据包 + * + * @return 是否 + */ + public boolean isInvalidNow() { + if (isAvailable) {//如果标记在线,而大于5秒的时间没有收到数据包,就视为刚刚离线。 + isAvailable = System.currentTimeMillis() - lastSeen < 1000 * 5;//小于5秒,就视为在线 + return !isAvailable; + } else {//如果已经标记不在线了,就不是刚刚离线的。 + return false; + } + } + + public String getModelName() { + return modelName; + } + + public void setModelName(String modelName) { + this.modelName = modelName; + } + + public String getVersion() { + return version; + } + + public String getRig_ip() { + return rig_ip; + } + + public void setRig_ip(String rig_ip) { + this.rig_ip = rig_ip; + } + + public String getMac() { + return mac; + } + + public boolean isEqual(String madAddress) { + return this.mac.equalsIgnoreCase(madAddress); + } + + /** + * 连接到控制电台 + */ + public void connect() { + this.connect(this.rig_ip, this.control_port); + } + + /** + * 连接控制到电台,TCP + * + * @param ip 地址 + * @param port 端口 + */ + public void connect(String ip, int port) { + if (tcpClient.isConnect()) { + tcpClient.disconnect(); + } + //Tcp连接触发的事件 + tcpClient.setOnDataReceiveListener(new RadioTcpClient.OnDataReceiveListener() { + @Override + public void onConnectSuccess() { + if (onTcpConnectStatus != null) { + onTcpConnectStatus.onConnectSuccess(tcpClient); + } + } + + @Override + public void onConnectFail() { + if (onTcpConnectStatus != null) { + onTcpConnectStatus.onConnectFail(tcpClient); + } + } + + @Override + public void onDataReceive(byte[] buffer) { + if (onReceiveDataListener != null) {//此处把数据传递给XieGu6100NetRig + onReceiveDataListener.onDataReceive(buffer); + } + onReceiveData(buffer); + } + + @Override + public void onConnectionClosed() { + tcpClient.disconnect(); + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.tcp_connect_closed)); + if (onTcpConnectStatus != null) { + onTcpConnectStatus.onConnectionClosed(tcpClient); + } + } + }); + clearBufferData();//清除一下缓存的指令数据 + tcpClient.connect(ip, port);//连接TCP + + } + + /** + * 关闭接收数据流的端口 + */ + public synchronized void closeStreamPort() { + if (streamClient != null) { + if (streamClient.isActivated()) { + try { + streamClient.setActivated(false); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + streamClient = null; + } + + @SuppressLint("DefaultLocale") + public synchronized void commandAtuOn() { + sendCommand(XieguCommand.ATU, "atu on"); + } + + @SuppressLint("DefaultLocale") + public synchronized void commandAtuOff() { + sendCommand(XieguCommand.ATU, "atu off"); + } + + @SuppressLint("DefaultLocale") + public synchronized void commandAtuStart() { + sendCommand(XieguCommand.ATU, "atu start"); + } + + @SuppressLint("DefaultLocale") + public synchronized void commandOpenStream() { + sendCommand(XieguCommand.STREAM, String.format("stream on %d", stream_port)); + } + + @SuppressLint("DefaultLocale") + public synchronized void commandSendA91(byte[] a91, float vol, float freq) { + sendCommand(XieguCommand.A91, String.format("a91 %.2f %.0f %s", vol, freq, BaseRig.byteToStr(a91))); + } + + @SuppressLint("DefaultLocale") + public synchronized void commandGetAudioInfo() { + sendCommand(XieguCommand.AUDIO, "audio get all"); + } + + @SuppressLint("DefaultLocale") + public synchronized void commandGetStreamInfo() { + sendCommand(XieguCommand.STREAM, "stream get"); + } + + @SuppressLint("DefaultLocale") + public synchronized void commandSubAllMeter() { + sendCommand(XieguCommand.SUB, "sub all"); + } + + @SuppressLint("DefaultLocale") + public synchronized void commandSubGetMeter() { + sendCommand(XieguCommand.SUB, "sub get"); + } + + @SuppressLint("DefaultLocale") + public synchronized void commandUnubMeter() { + sendCommand(XieguCommand.UNSUB, "unsub"); + } + + @SuppressLint("DefaultLocale") + public synchronized void commandTuneFreq(long freq) { + sendCommand(XieguCommand.TUNE, String.format("tune %d", freq)); + } + + @SuppressLint("DefaultLocale") + public synchronized void commandSetMode(String mode, int filter) { + sendCommand(XieguCommand.TUNE, String.format("mode %s %d", mode, filter)); + } + + @SuppressLint("DefaultLocale") + public synchronized void commandSetTxPower(int power) { + sendCommand(XieguCommand.SET, String.format("set tx %d", power)); + } + + @SuppressLint("DefaultLocale") + public synchronized void commandSetTxVol(int volume) { + sendCommand(XieguCommand.SET, String.format("set tx_vol %d", volume)); + } + + private void showAlert() { + Log.e(TAG, String.format("ALC:%f", meters.alc)); + if ((meters.swr >= 3) && GeneralVariables.swr_switch_on) { + if (!swrAlert) { + swrAlert = true; + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.swr_high_alert)); + } + } else { + swrAlert = false; + } + + + if ((meters.alc > IcomRigConstant.xiegu_alc_alert_max + || meters.alc < IcomRigConstant.xiegu_alc_alert_min) + && GeneralVariables.alc_switch_on) { + if (!alcAlert) { + alcAlert = true; + if (meters.alc > IcomRigConstant.xiegu_alc_alert_max) { + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.alc_high_alert)); + } else { + ToastMessage.show(GeneralVariables.getStringFromResource(R.string.alc_low_alert)); + } + } + } else { + alcAlert = false; + } + } + + /** + * 打开接收数据流的端口 + */ + public void openStreamPort() { + if (streamClient != null) { + if (streamClient.isActivated()) { + try { + streamClient.setActivated(false); + } catch (Exception e) { + ToastMessage.show(e.getMessage()); + e.printStackTrace(); + } + + } + } + + + RadioUdpClient.OnUdpEvents onUdpEvents = new RadioUdpClient.OnUdpEvents() { + @SuppressLint("DefaultLocale") + @Override + public void OnReceiveData(DatagramSocket socket, DatagramPacket packet, byte[] data) { + VITA vita = new VITA(data); + if (vita.classId64 == VITA.XIEGU_AUDIO_CLASS_ID) {//音频数据 + + //判断数据包丢失情况 + int temp = lossCount; + if (currentCount <= -1) {//初始化当前包的计数器 + currentCount = vita.packetCount; + } + if (currentCount > vita.packetCount) {//说明丢失的数据包超过16个了 + lossCount = lossCount + vita.packetCount + 16 - currentCount - 1; + } else if (currentCount < vita.packetCount) {//说明丢失的数据包少于16个 + lossCount = lossCount + vita.packetCount - currentCount - 1; + } + + currentCount = vita.packetCount;//复位包计数器 + if (lossCount > temp) { + Log.e(TAG, String.format("丢包数量:%d", lossCount)); + for (int i = 0; i < (lossCount - temp); i++) { + Log.d(TAG, String.format("补发数据,%d,size:%d", i, vita.payload.length)); + sendReceivedAudio(vita.payload);//把当前的数据补发给录音对象 + } + mutableLossPackets.postValue(lossCount); + } + //copyVoiceData(vita.payload);// + sendReceivedAudio(vita.payload);//把音频发给录音对象 + playReceiveAudio(vita.payload);//发送当前的音频数据 + + } else if (vita.classId64 == XIEGU_PING_CLASS_ID//ping数据 + && vita.streamId == XIEGU_PING_Stream_Id + && vita.integerTimestamp == 1) {//ping的回包 + mutablePing.postValue(System.currentTimeMillis() - vita.fracTimeStamp); + } else if (vita.classId64 == XIEGU_METER_CLASS_ID//仪表数据 + && vita.streamId == XIEGU_METER_Stream_Id) { + new Thread(new Runnable() { + @Override + public void run() { + meters.update(vita.payload); + mutableMeters.postValue(meters); + if (isPttOn) { + showAlert(); + } else { + alcAlert = false; + swrAlert = false; + } + if (onReceiveStreamData != null) { + onReceiveStreamData.onReceiveMeter(meters); + } + } + }).start(); + + } + + + } + }; + + //此处要确定stream的udp端口 + streamClient = new RadioUdpClient(stream_port); + streamClient.setOnUdpEvents(onUdpEvents); + try { + streamClient.setActivated(true); + pingTimer.schedule(pingTask(), 1000, 1000);//启动ping计时器 + + } catch (SocketException e) { + ToastMessage.show(e.getMessage()); + e.printStackTrace(); + Log.d(TAG, "streamClient: " + e.getMessage()); + } + + + } + + /** + * 当接收到音频数据后,发送给录音对象的操作 + * + * @param data 音频数据 + */ + private void sendReceivedAudio(byte[] data) { + if (onReceiveStreamData != null) { + onReceiveStreamData.onReceiveAudio(data); + } + } + + /** + * 当接收到音频数据时的处理 + * + * @param data 音频数据 + */ + private void playReceiveAudio(byte[] data) { + if (audioTrack != null) {//如果音频播放已经打开,就写音频流数据 + audioTrack.write(data, 0, data.length, AudioTrack.WRITE_NON_BLOCKING); + } + } + + /** + * 断开与电台的连接 + */ + public synchronized void disConnect() { + if (tcpClient.isConnect()) { + tcpClient.disconnect(); + } + if (pingTimer != null) { + pingTimer.cancel(); + pingTimer.purge(); + pingTimer = null; + } + } + + /** + * 电台是否连接 + * + * @return 是否 + */ + public boolean isConnect() { + return tcpClient.isConnect(); + } + + /** + * 关闭音频 + */ + public void closeAudio() { + if (audioTrack != null) { + audioTrack.stop(); + audioTrack = null; + } + } + + + /** + * 当接收到数据时触发的事件,此处是TCP连接得到的数据 + * + * @param data 数据 + */ + private void onReceiveData(byte[] data) { + + if (data.length > 4) {//判断是不是老式的icom指令 + if ((data[0] == (byte) 0xfe) && (data[1] == (byte) 0xfe) + && ((data[2] == (byte) 0xe0) || data[3] == (byte) 0xe0)) { + clearBufferData(); + return; + } + } + String s = new String(data); + if (!s.contains("\n")) {//不包含换行符,说明命令行没有接受完。 + buffer.append(s); + } else {//说明已经有命令行了。可能不止一个哦。在此部分要触发OnReceiveLine + String[] commands = s.split("\n"); + if (commands.length > 0) {//把收到数据的第一行,追加到之前接收的命令数据上 + buffer.append(commands[0]); + } + + //先把缓存中的数据触发出来 + doReceiveLineEvent(buffer.toString()); + clearBufferData(); + //从第二行开始触发,最后一行不触发,最后一行要看是不是换行结尾 + for (int i = 1; i < commands.length - 1; i++) { + doReceiveLineEvent(commands[i]); + } + + if (commands.length > 1) {//当数据是多行的时候,最后一行的处理 + if (s.endsWith("\n")) {//如果是以换行结尾,或者缓冲区没满(接收完全了),就触发事件 + doReceiveLineEvent(commands[commands.length - 1]); + } else {//如果不是以换行结尾,说明指令没有接收完全 + buffer.append(commands[commands.length - 1]); + } + } + } + } + + + /** + * 当接收到数据行时,触发的事件。可以触发两种事件: + * 1.行数据事件onReceiveLineListener; + * 2.命令事件onCommandListener。 + *

+ * //* @param line 数据行 + */ + private void doReceiveLineEvent(String line) { + + XieguResponse response = new XieguResponse(line); + //更新一下句柄 + switch (response.responseStyle) { + case VERSION: + this.version = response.head.substring(1); + break; + case HANDLE: + this.handle = Integer.parseInt(response.head.substring(1), 16); + break; + case RESPONSE: + if (XieguCommand.AUDIO == response.xieguCommand) {//是音频指令回复的信息 + setAudioInfo(response.resultContent); + } + if (onCommandListener != null) { + onCommandListener.onResponse(response); + } + break; + case STATUS: + + if (response.resultCode == 0) {//说明是电台状态变化了 + String status[] = response.resultContent.split(" "); + for (int i = 0; i < status.length; i++) {//找出ptt的状体,设置ptt + if (status[i].startsWith("ptt")) {//判断PTT + String temp[] = status[i].split("="); + isPttOn = temp[1].equalsIgnoreCase("on"); + } + + if (status[i].startsWith("play_volume")) {//判断PTT + String temp[] = status[i].split("="); + float vol = Integer.parseInt(temp[1].trim()) * 1.0f / 100f; + GeneralVariables.volumePercent = vol; + GeneralVariables.mutableVolumePercent.postValue(vol); + } + } + } + + if (onStatusListener != null) { + onStatusListener.onStatus(response); + } + break; + } + + } + + /** + * 获取电台的音频信息 + * + * @param result 返回信息 + */ + private void setAudioInfo(String result) { + String[] keys = result.split(" "); + for (int i = 0; i < keys.length; i++) { + String[] val = keys[i].split("="); + if (val[0].equalsIgnoreCase("period")) period = Integer.parseInt(val[1]) / 1000; + if (val[0].equalsIgnoreCase("frames")) frames = Integer.parseInt(val[1]); + } + Log.d(TAG, String.format("set audio para:frames=%d,period=%d", frames, period)); + } + + public synchronized void sendData(byte[] data) { + tcpClient.sendByte(data); + } + + /** + * 制作命令,命令序号规则:后3位是命令的种类,序号除1000,是命令的真正序号 + * + * @param command 命令的种类 + * @param cmdContent 命令的具体内容 + */ + @SuppressLint("DefaultLocale") + public void sendCommand(XieguCommand command, String cmdContent) { + if (tcpClient.isConnect()) { + commandSeq++; + xieguCommand = command; + commandStr = String.format("C%05d%03d|%s\n", commandSeq, command.ordinal() + , cmdContent); + tcpClient.sendByte(commandStr.getBytes()); + Log.d(TAG, "sendCommand: " + commandStr); + } + } + + public synchronized void commandPTTOnOff(boolean on) { + if (on) { + sendCommand(XieguCommand.PTT, "ptt on"); + } else { + sendCommand(XieguCommand.PTT, "ptt off"); + } + } + + /** + * 发射的采样率为12000采样率,单声道,16位 + * + * @param data 音频 + */ + public void sendWaveData(float[] data) { + Log.d(TAG, String.format("send wav data,len:%d....", data.length)); + short[] temp = new short[data.length]; + //传递过来的音频是LPCM,32 float,12000Hz + //x6100的音频格式是LPCM 16 Int,12000Hz + //要做一下浮点到16位int的转换 + for (int i = 0; i < data.length; i++) { + float x = data[i]; + if (x > 1.0) + x = 1.0f; + else if (x < -1.0) + x = -1.0f; + temp[i] = (short) (x * 32767.0); + } + short[] payload = new short[frames]; + + VITA vita = new VITA(VitaPacketType.EXT_DATA_WITH_STREAM + , VitaTSI.TSI_OTHER + , VitaTSF.TSF_SAMPLE_COUNT + , 0 + , 0x84000001 + , 0x584945475500A1L); + + vita.packetCount = 0; + vita.integerTimestamp = 0; + vita.fracTimeStamp = payload.length * 2L; + + + try { + int count = 0; + int a = 0; + while (count < temp.length) { + long now = System.currentTimeMillis();//获取当前时间 + Arrays.fill(payload, (short) 0);//数组清零 + + if (!isPttOn) break; + if (data.length - count > frames) { + System.arraycopy(temp, count, payload, 0, frames); + count = count + frames; + } else { + System.arraycopy(temp, count, payload, 0, temp.length - count); + count = temp.length; + } + streamClient.sendData(vita.audioShortDataToVita(vita.packetCount, payload), rig_ip, stream_port); + while (isPttOn) { + if (System.currentTimeMillis() - now >= period) {//64毫秒一个周期 + break; + } + } + a++; + } + + + } catch (UnknownHostException e) { + throw new RuntimeException(e); + } + } + + /** + * 清空缓存数据 + */ + private void clearBufferData() { + buffer.setLength(0); + } + + /** + * 打开音频,流方式。当收到音频流的时候,播放数据 + */ + public void openAudio() { + AudioAttributes attributes = new AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_MEDIA) + .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) + .build(); + AudioFormat myFormat = new AudioFormat.Builder().setSampleRate(12000) + .setEncoding(AudioFormat.ENCODING_PCM_16BIT) + .setChannelMask(AudioFormat.CHANNEL_OUT_MONO).build(); + int mySession = 0; + audioTrack = new AudioTrack(attributes, myFormat + //, 12000 * 4, AudioTrack.MODE_STREAM + , 768 * 2 * 4, AudioTrack.MODE_STREAM//x6100一个声音周期是64毫秒,共计768*2个字节 + , mySession); + audioTrack.play(); + } + + public OnTcpConnectStatus getOnTcpConnectStatus() { + return onTcpConnectStatus; + } + + public void setOnTcpConnectStatus(OnTcpConnectStatus onTcpConnectStatus) { + this.onTcpConnectStatus = onTcpConnectStatus; + } + + public OnReceiveStreamData getOnReceiveStreamData() { + return onReceiveStreamData; + } + + public void setOnReceiveStreamData(OnReceiveStreamData onReceiveStreamData) { + this.onReceiveStreamData = onReceiveStreamData; + } + + public OnStatusListener getOnStatusListener() { + return onStatusListener; + } + + public void setOnStatusListener(OnStatusListener onStatusListener) { + this.onStatusListener = onStatusListener; + } + + public OnCommandListener getOnCommandListener() { + return onCommandListener; + } + + public void setOnCommandListener(OnCommandListener onCommandListener) { + this.onCommandListener = onCommandListener; + } + + public OnReceiveDataListener getOnReceiveDataListener() { + return onReceiveDataListener; + } + + public void setOnReceiveDataListener(OnReceiveDataListener onReceiveDataListener) { + this.onReceiveDataListener = onReceiveDataListener; + } + + +//**************各种接口********************** + + /** + * 当TCP接收到数据 + */ + public interface OnReceiveDataListener { + void onDataReceive(byte[] data); + } + + /** + * 当TCP连接状态变化 + */ + public interface OnTcpConnectStatus { + void onConnectSuccess(RadioTcpClient tcpClient); + + void onConnectFail(RadioTcpClient tcpClient); + + void onConnectionClosed(RadioTcpClient tcpClient); + } + + /** + * 当接收到流数据时的事件 + */ + public interface OnReceiveStreamData { + void onReceiveAudio(byte[] data);//音频数据 + + void onReceiveIQ(byte[] data);//IQ数据 + + void onReceiveFFT(VITA vita);//频谱数据 + + void onReceiveMeter(X6100Meters meters);//仪表数据 + + void onReceiveUnKnow(byte[] data);//未知数据 + } + + /** + * 当接收到指令回复 + */ + public interface OnCommandListener { + void onResponse(XieguResponse response); + } + + public interface OnStatusListener { + void onStatus(XieguResponse response); + } + //******************************************* + + + /** + * 电台TCP回复数据的基础类 + */ + public static class XieguResponse { + private static final String TAG = "XieguResponse"; + public XieguResponseStyle responseStyle; + public String head;//消息头 + public int resultCode;//消息代码 + public String resultContent;//扩展消息,有的返回消息分为3段,取第3段消息 + public String rawData;//原始数据 + public int seq_number;//32位int,指令序号 + + public XieguCommand xieguCommand = XieguCommand.UNKNOW; + + + public XieguResponse(String line) { + rawData = line; + char header; + if (line.length() > 0) { + header = line.toUpperCase().charAt(0); + } else { + header = 0; + } + switch (header) { + case 'S': + responseStyle = XieguResponseStyle.STATUS; + getHeadAndContent(line, "\\|");//获取指令的头、值、内容 + + break; + case 'R': + responseStyle = RESPONSE; + getHeadAndContent(line, "\\|"); + try { + seq_number = Integer.parseInt(head.substring(1));//解析指令序号 + xieguCommand = XieguCommand.values()[seq_number % 1000]; + } catch (NumberFormatException e) { + e.printStackTrace(); + Log.e(TAG, "XieguResponse parseInt seq_number exception: " + e.getMessage()); + } + break; + case 'H': + responseStyle = XieguResponseStyle.HANDLE; + head = line; + resultContent = line; + Log.d(TAG, "XieguResponse: handle:" + line.substring(1)); + + break; + case 'V': + responseStyle = XieguResponseStyle.VERSION; + head = line; + resultContent = line; + break; + + case 0: + default: + responseStyle = XieguResponseStyle.UNKNOW; + break; + } + } + + + /** + * 分割消息的头和内容,并分别负值给head和content + * + * @param line 消息 + * @param split 分隔符 + */ + private void getHeadAndContent(String line, String split) { + String[] temp = line.split(split); + if (temp.length > 1) { + head = temp[0]; + + resultCode = Integer.parseInt(temp[1]); + + } else { + head = ""; + } + + if (temp.length > 2) { + resultContent = temp[2]; + } else { + resultContent = ""; + } + } + } + +} diff --git a/feature/ft8/src/main/java/com/bg7yoz/ft8cn/x6100/XieguRadioFactory.java b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/x6100/XieguRadioFactory.java new file mode 100644 index 00000000..fd3a950d --- /dev/null +++ b/feature/ft8/src/main/java/com/bg7yoz/ft8cn/x6100/XieguRadioFactory.java @@ -0,0 +1,187 @@ +package com.bg7yoz.ft8cn.x6100; + +/** + * XieguRadioFactory 当前发现的所有收音机。 + * RadioFactory: 实例化这个类来创建一个 Radio Factory,通过它发现在相同局域网内地协谷电台。 + * + * 通过Upd协议,在7001端口的广播数据中获取vita协议数据,并解析电台信息。 + * + * @author BGY70Z + * @date 2023-11-29 + */ + + +import android.util.Log; + +import com.bg7yoz.ft8cn.flex.FlexRadio; +import com.bg7yoz.ft8cn.flex.RadioUdpClient; +import com.bg7yoz.ft8cn.flex.VITA; + + +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.net.SocketException; +import java.util.ArrayList; +import java.util.Timer; +import java.util.TimerTask; + + + + +public class XieguRadioFactory { + private static final String TAG="XieguRadioFactory"; + private static final int XIEGU_DISCOVERY_PORT =7001; + private static XieguRadioFactory instance=null; + private final RadioUdpClient broadcastClient ; + private OnXieguRadioEvents onXieguRadioEvents; + + private Timer refreshTimer=null; + private TimerTask refreshTask=null; + + public ArrayList xieguRadios=new ArrayList<>(); + + /** + * 获取电台列表实例 + * @return 电台列表实例 + */ + public static XieguRadioFactory getInstance(){ + if (instance==null){ + instance= new XieguRadioFactory(); + } + instance.xieguRadios.clear(); + return instance; + } + + + + public XieguRadioFactory() { + broadcastClient = new RadioUdpClient(XIEGU_DISCOVERY_PORT); + + + broadcastClient.setOnUdpEvents(new RadioUdpClient.OnUdpEvents() { + @Override + public void OnReceiveData(DatagramSocket socket, DatagramPacket packet, byte[] data) { + VITA vita = new VITA(data); + + if (vita.isAvailable//如果数据包有效 + &&vita.classId64 == VITA.XIEGU_Discovery_Class_Id + &&vita.streamId==VITA.XIEGU_Discovery_Stream_Id){ + InetAddress address = packet.getAddress();//获取ip地址 + updateXieguRadioList(new String(vita.payload),address.getHostAddress()); + } + } + }); + try { + broadcastClient.setActivated(true); + } catch (SocketException e) { + e.printStackTrace(); + Log.e(TAG, "XieguRadioFactory: "+e.getMessage()); + } + + } + + + public void startRefreshTimer(){ + if (refreshTimer==null) { + refreshTask=new TimerTask() { + @Override + public void run() { + Log.e(TAG, "run: 检查离线" ); + checkOffLineRadios(); + } + }; + refreshTimer=new Timer(); + refreshTimer.schedule(refreshTask, 1000, 1000);//检查电台列表中的电台是否在线(每一秒) + } + } + public void cancelRefreshTimer(){ + if (refreshTimer!=null){ + refreshTimer.cancel(); + refreshTimer=null; + refreshTask.cancel(); + refreshTask=null; + } + } + + /** + * 从数据中查找电台的MAC地址 + * @param s 数据 + * @return mac地址 + */ + private String getMacAddress(String s){ + String[] strings=s.split(" "); + for (int i = 0; i + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/anim/view_blink.xml b/feature/ft8/src/main/res/anim/view_blink.xml new file mode 100644 index 00000000..76e09a70 --- /dev/null +++ b/feature/ft8/src/main/res/anim/view_blink.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/color/imagebutton_click_selector.xml b/feature/ft8/src/main/res/color/imagebutton_click_selector.xml new file mode 100644 index 00000000..fa719080 --- /dev/null +++ b/feature/ft8/src/main/res/color/imagebutton_click_selector.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/color/switch_color_style.xml b/feature/ft8/src/main/res/color/switch_color_style.xml new file mode 100644 index 00000000..76465208 --- /dev/null +++ b/feature/ft8/src/main/res/color/switch_color_style.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/drawable-night/baseline_location_on_24.xml b/feature/ft8/src/main/res/drawable-night/baseline_location_on_24.xml new file mode 100644 index 00000000..33bda2ea --- /dev/null +++ b/feature/ft8/src/main/res/drawable-night/baseline_location_on_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable-night/clear_calling_list_image_48.xml b/feature/ft8/src/main/res/drawable-night/clear_calling_list_image_48.xml new file mode 100644 index 00000000..46b3d832 --- /dev/null +++ b/feature/ft8/src/main/res/drawable-night/clear_calling_list_image_48.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable-night/config_ic_baseline_keyboard_arrow_down_24.xml b/feature/ft8/src/main/res/drawable-night/config_ic_baseline_keyboard_arrow_down_24.xml new file mode 100644 index 00000000..32ebe768 --- /dev/null +++ b/feature/ft8/src/main/res/drawable-night/config_ic_baseline_keyboard_arrow_down_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable-night/config_ic_baseline_keyboard_arrow_up_24.xml b/feature/ft8/src/main/res/drawable-night/config_ic_baseline_keyboard_arrow_up_24.xml new file mode 100644 index 00000000..a893e20c --- /dev/null +++ b/feature/ft8/src/main/res/drawable-night/config_ic_baseline_keyboard_arrow_up_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable-night/cqzone.png b/feature/ft8/src/main/res/drawable-night/cqzone.png new file mode 100644 index 00000000..f7adae8c Binary files /dev/null and b/feature/ft8/src/main/res/drawable-night/cqzone.png differ diff --git a/feature/ft8/src/main/res/drawable-night/cqzone_b.png b/feature/ft8/src/main/res/drawable-night/cqzone_b.png new file mode 100644 index 00000000..b4a4dfec Binary files /dev/null and b/feature/ft8/src/main/res/drawable-night/cqzone_b.png differ diff --git a/feature/ft8/src/main/res/drawable-night/dxcc.png b/feature/ft8/src/main/res/drawable-night/dxcc.png new file mode 100644 index 00000000..6aa14e86 Binary files /dev/null and b/feature/ft8/src/main/res/drawable-night/dxcc.png differ diff --git a/feature/ft8/src/main/res/drawable-night/dxcc_b.png b/feature/ft8/src/main/res/drawable-night/dxcc_b.png new file mode 100644 index 00000000..f436b64d Binary files /dev/null and b/feature/ft8/src/main/res/drawable-night/dxcc_b.png differ diff --git a/feature/ft8/src/main/res/drawable-night/guohe_logo.png b/feature/ft8/src/main/res/drawable-night/guohe_logo.png new file mode 100644 index 00000000..a80382fe Binary files /dev/null and b/feature/ft8/src/main/res/drawable-night/guohe_logo.png differ diff --git a/feature/ft8/src/main/res/drawable-night/ic_baseline_assignment_24.xml b/feature/ft8/src/main/res/drawable-night/ic_baseline_assignment_24.xml new file mode 100644 index 00000000..84527a70 --- /dev/null +++ b/feature/ft8/src/main/res/drawable-night/ic_baseline_assignment_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable-night/ic_baseline_assignment_ind_24.xml b/feature/ft8/src/main/res/drawable-night/ic_baseline_assignment_ind_24.xml new file mode 100644 index 00000000..f753515a --- /dev/null +++ b/feature/ft8/src/main/res/drawable-night/ic_baseline_assignment_ind_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable-night/ic_baseline_cancel_schedule_send_off.xml b/feature/ft8/src/main/res/drawable-night/ic_baseline_cancel_schedule_send_off.xml new file mode 100644 index 00000000..f926e9a5 --- /dev/null +++ b/feature/ft8/src/main/res/drawable-night/ic_baseline_cancel_schedule_send_off.xml @@ -0,0 +1,6 @@ + + + + diff --git a/feature/ft8/src/main/res/drawable-night/ic_baseline_check_48.xml b/feature/ft8/src/main/res/drawable-night/ic_baseline_check_48.xml new file mode 100644 index 00000000..76faa78f --- /dev/null +++ b/feature/ft8/src/main/res/drawable-night/ic_baseline_check_48.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable-night/ic_baseline_close_32.xml b/feature/ft8/src/main/res/drawable-night/ic_baseline_close_32.xml new file mode 100644 index 00000000..a8800880 --- /dev/null +++ b/feature/ft8/src/main/res/drawable-night/ic_baseline_close_32.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable-night/ic_baseline_headset_mic_24.xml b/feature/ft8/src/main/res/drawable-night/ic_baseline_headset_mic_24.xml new file mode 100644 index 00000000..a99f4b15 --- /dev/null +++ b/feature/ft8/src/main/res/drawable-night/ic_baseline_headset_mic_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable-night/ic_baseline_info_32.xml b/feature/ft8/src/main/res/drawable-night/ic_baseline_info_32.xml new file mode 100644 index 00000000..a9a8b03f --- /dev/null +++ b/feature/ft8/src/main/res/drawable-night/ic_baseline_info_32.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable-night/ic_baseline_insert_chart_outlined_24.xml b/feature/ft8/src/main/res/drawable-night/ic_baseline_insert_chart_outlined_24.xml new file mode 100644 index 00000000..6e812b0c --- /dev/null +++ b/feature/ft8/src/main/res/drawable-night/ic_baseline_insert_chart_outlined_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable-night/ic_baseline_link_24.xml b/feature/ft8/src/main/res/drawable-night/ic_baseline_link_24.xml new file mode 100644 index 00000000..57f63f79 --- /dev/null +++ b/feature/ft8/src/main/res/drawable-night/ic_baseline_link_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable-night/ic_baseline_list_alt_24.xml b/feature/ft8/src/main/res/drawable-night/ic_baseline_list_alt_24.xml new file mode 100644 index 00000000..a8087d4f --- /dev/null +++ b/feature/ft8/src/main/res/drawable-night/ic_baseline_list_alt_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable-night/ic_baseline_mic_off_48.xml b/feature/ft8/src/main/res/drawable-night/ic_baseline_mic_off_48.xml new file mode 100644 index 00000000..e3fd085c --- /dev/null +++ b/feature/ft8/src/main/res/drawable-night/ic_baseline_mic_off_48.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable-night/ic_baseline_not_listed_location_32.xml b/feature/ft8/src/main/res/drawable-night/ic_baseline_not_listed_location_32.xml new file mode 100644 index 00000000..02412082 --- /dev/null +++ b/feature/ft8/src/main/res/drawable-night/ic_baseline_not_listed_location_32.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable-night/ic_baseline_pause_circle_outline_24.xml b/feature/ft8/src/main/res/drawable-night/ic_baseline_pause_circle_outline_24.xml new file mode 100644 index 00000000..416ee35b --- /dev/null +++ b/feature/ft8/src/main/res/drawable-night/ic_baseline_pause_circle_outline_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable-night/ic_baseline_save_alt_24.xml b/feature/ft8/src/main/res/drawable-night/ic_baseline_save_alt_24.xml new file mode 100644 index 00000000..a534888a --- /dev/null +++ b/feature/ft8/src/main/res/drawable-night/ic_baseline_save_alt_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable-night/ic_baseline_send_white_48.xml b/feature/ft8/src/main/res/drawable-night/ic_baseline_send_white_48.xml new file mode 100644 index 00000000..461a25ce --- /dev/null +++ b/feature/ft8/src/main/res/drawable-night/ic_baseline_send_white_48.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable-night/ic_baseline_settings_bluetooth_24.xml b/feature/ft8/src/main/res/drawable-night/ic_baseline_settings_bluetooth_24.xml new file mode 100644 index 00000000..b4e5f23a --- /dev/null +++ b/feature/ft8/src/main/res/drawable-night/ic_baseline_settings_bluetooth_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable-night/itu.png b/feature/ft8/src/main/res/drawable-night/itu.png new file mode 100644 index 00000000..d76a030a Binary files /dev/null and b/feature/ft8/src/main/res/drawable-night/itu.png differ diff --git a/feature/ft8/src/main/res/drawable-night/itu_b.png b/feature/ft8/src/main/res/drawable-night/itu_b.png new file mode 100644 index 00000000..1bce90bf Binary files /dev/null and b/feature/ft8/src/main/res/drawable-night/itu_b.png differ diff --git a/feature/ft8/src/main/res/drawable-night/share_button_icon_24.xml b/feature/ft8/src/main/res/drawable-night/share_button_icon_24.xml new file mode 100644 index 00000000..d4d51566 --- /dev/null +++ b/feature/ft8/src/main/res/drawable-night/share_button_icon_24.xml @@ -0,0 +1,6 @@ + + + diff --git a/feature/ft8/src/main/res/drawable-night/spinner_style.xml b/feature/ft8/src/main/res/drawable-night/spinner_style.xml new file mode 100644 index 00000000..f3e99f00 --- /dev/null +++ b/feature/ft8/src/main/res/drawable-night/spinner_style.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/drawable-night/xiegulogo.png b/feature/ft8/src/main/res/drawable-night/xiegulogo.png new file mode 100644 index 00000000..46be7e8b Binary files /dev/null and b/feature/ft8/src/main/res/drawable-night/xiegulogo.png differ diff --git a/feature/ft8/src/main/res/drawable/baseline_location_on_24.xml b/feature/ft8/src/main/res/drawable/baseline_location_on_24.xml new file mode 100644 index 00000000..de120896 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/baseline_location_on_24.xml @@ -0,0 +1,9 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/calling_list_cell_0_style.xml b/feature/ft8/src/main/res/drawable/calling_list_cell_0_style.xml new file mode 100644 index 00000000..7dec76a2 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/calling_list_cell_0_style.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/drawable/calling_list_cell_1_style.xml b/feature/ft8/src/main/res/drawable/calling_list_cell_1_style.xml new file mode 100644 index 00000000..d036125b --- /dev/null +++ b/feature/ft8/src/main/res/drawable/calling_list_cell_1_style.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/drawable/calling_list_cell_2_style.xml b/feature/ft8/src/main/res/drawable/calling_list_cell_2_style.xml new file mode 100644 index 00000000..a0becdb1 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/calling_list_cell_2_style.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/drawable/calling_list_cell_3_style.xml b/feature/ft8/src/main/res/drawable/calling_list_cell_3_style.xml new file mode 100644 index 00000000..52f92710 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/calling_list_cell_3_style.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/drawable/calling_list_cell_style.xml b/feature/ft8/src/main/res/drawable/calling_list_cell_style.xml new file mode 100644 index 00000000..60e23e38 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/calling_list_cell_style.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/drawable/clear_calling_list_image_48.xml b/feature/ft8/src/main/res/drawable/clear_calling_list_image_48.xml new file mode 100644 index 00000000..aaa5fcb3 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/clear_calling_list_image_48.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/config_ic_baseline_keyboard_arrow_down_24.xml b/feature/ft8/src/main/res/drawable/config_ic_baseline_keyboard_arrow_down_24.xml new file mode 100644 index 00000000..624eebf6 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/config_ic_baseline_keyboard_arrow_down_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/config_ic_baseline_keyboard_arrow_up_24.xml b/feature/ft8/src/main/res/drawable/config_ic_baseline_keyboard_arrow_up_24.xml new file mode 100644 index 00000000..82110fba --- /dev/null +++ b/feature/ft8/src/main/res/drawable/config_ic_baseline_keyboard_arrow_up_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/count_detail_item_0_style.xml b/feature/ft8/src/main/res/drawable/count_detail_item_0_style.xml new file mode 100644 index 00000000..94359ffb --- /dev/null +++ b/feature/ft8/src/main/res/drawable/count_detail_item_0_style.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/drawable/count_detail_item_1_style.xml b/feature/ft8/src/main/res/drawable/count_detail_item_1_style.xml new file mode 100644 index 00000000..db0276a8 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/count_detail_item_1_style.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/drawable/cq.png b/feature/ft8/src/main/res/drawable/cq.png new file mode 100644 index 00000000..2776561a Binary files /dev/null and b/feature/ft8/src/main/res/drawable/cq.png differ diff --git a/feature/ft8/src/main/res/drawable/cqzone.png b/feature/ft8/src/main/res/drawable/cqzone.png new file mode 100644 index 00000000..b649b0a6 Binary files /dev/null and b/feature/ft8/src/main/res/drawable/cqzone.png differ diff --git a/feature/ft8/src/main/res/drawable/cqzone_b.png b/feature/ft8/src/main/res/drawable/cqzone_b.png new file mode 100644 index 00000000..c3564e5c Binary files /dev/null and b/feature/ft8/src/main/res/drawable/cqzone_b.png differ diff --git a/feature/ft8/src/main/res/drawable/debug_message_style.xml b/feature/ft8/src/main/res/drawable/debug_message_style.xml new file mode 100644 index 00000000..32bec23d --- /dev/null +++ b/feature/ft8/src/main/res/drawable/debug_message_style.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/drawable/dialog_style.xml b/feature/ft8/src/main/res/drawable/dialog_style.xml new file mode 100644 index 00000000..3ee091dc --- /dev/null +++ b/feature/ft8/src/main/res/drawable/dialog_style.xml @@ -0,0 +1,16 @@ + + + + + + + + + + diff --git a/feature/ft8/src/main/res/drawable/dxcc.png b/feature/ft8/src/main/res/drawable/dxcc.png new file mode 100644 index 00000000..de33f807 Binary files /dev/null and b/feature/ft8/src/main/res/drawable/dxcc.png differ diff --git a/feature/ft8/src/main/res/drawable/dxcc_b.png b/feature/ft8/src/main/res/drawable/dxcc_b.png new file mode 100644 index 00000000..f19b5851 Binary files /dev/null and b/feature/ft8/src/main/res/drawable/dxcc_b.png differ diff --git a/feature/ft8/src/main/res/drawable/editor_layout_background_style.xml b/feature/ft8/src/main/res/drawable/editor_layout_background_style.xml new file mode 100644 index 00000000..ef6bbbf3 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/editor_layout_background_style.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/drawable/editor_layout_style.xml b/feature/ft8/src/main/res/drawable/editor_layout_style.xml new file mode 100644 index 00000000..ea0de63f --- /dev/null +++ b/feature/ft8/src/main/res/drawable/editor_layout_style.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/drawable/editor_style.xml b/feature/ft8/src/main/res/drawable/editor_style.xml new file mode 100644 index 00000000..1130c9a3 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/editor_style.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/drawable/error_editor_style.xml b/feature/ft8/src/main/res/drawable/error_editor_style.xml new file mode 100644 index 00000000..1130c9a3 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/error_editor_style.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/drawable/flex_config_style.xml b/feature/ft8/src/main/res/drawable/flex_config_style.xml new file mode 100644 index 00000000..7dec76a2 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/flex_config_style.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/drawable/flex_icon.png b/feature/ft8/src/main/res/drawable/flex_icon.png new file mode 100644 index 00000000..0e24f4f7 Binary files /dev/null and b/feature/ft8/src/main/res/drawable/flex_icon.png differ diff --git a/feature/ft8/src/main/res/drawable/flex_meter_ruler_style.xml b/feature/ft8/src/main/res/drawable/flex_meter_ruler_style.xml new file mode 100644 index 00000000..f6ff4262 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/flex_meter_ruler_style.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/drawable/flex_meter_style.xml b/feature/ft8/src/main/res/drawable/flex_meter_style.xml new file mode 100644 index 00000000..7dec76a2 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/flex_meter_style.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/drawable/flexradio.png b/feature/ft8/src/main/res/drawable/flexradio.png new file mode 100644 index 00000000..c3d6b388 Binary files /dev/null and b/feature/ft8/src/main/res/drawable/flexradio.png differ diff --git a/feature/ft8/src/main/res/drawable/float_button_style.xml b/feature/ft8/src/main/res/drawable/float_button_style.xml new file mode 100644 index 00000000..fdd5485c --- /dev/null +++ b/feature/ft8/src/main/res/drawable/float_button_style.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/drawable/ft8cn_icon.png b/feature/ft8/src/main/res/drawable/ft8cn_icon.png new file mode 100644 index 00000000..eb80a237 Binary files /dev/null and b/feature/ft8/src/main/res/drawable/ft8cn_icon.png differ diff --git a/feature/ft8/src/main/res/drawable/guohe_logo.png b/feature/ft8/src/main/res/drawable/guohe_logo.png new file mode 100644 index 00000000..0024d946 Binary files /dev/null and b/feature/ft8/src/main/res/drawable/guohe_logo.png differ diff --git a/feature/ft8/src/main/res/drawable/help_dialog_style.xml b/feature/ft8/src/main/res/drawable/help_dialog_style.xml new file mode 100644 index 00000000..bce63dcb --- /dev/null +++ b/feature/ft8/src/main/res/drawable/help_dialog_style.xml @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_arrow_forward_24.xml b/feature/ft8/src/main/res/drawable/ic_baseline_arrow_forward_24.xml new file mode 100644 index 00000000..b6fec661 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_arrow_forward_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_assignment_24.xml b/feature/ft8/src/main/res/drawable/ic_baseline_assignment_24.xml new file mode 100644 index 00000000..cd3b6580 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_assignment_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_assignment_ind_24.xml b/feature/ft8/src/main/res/drawable/ic_baseline_assignment_ind_24.xml new file mode 100644 index 00000000..a9eba765 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_assignment_ind_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_campaign_transmitting_red_24.xml b/feature/ft8/src/main/res/drawable/ic_baseline_campaign_transmitting_red_24.xml new file mode 100644 index 00000000..0440f001 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_campaign_transmitting_red_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_cancel_schedule_send_off.xml b/feature/ft8/src/main/res/drawable/ic_baseline_cancel_schedule_send_off.xml new file mode 100644 index 00000000..c3d186e6 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_cancel_schedule_send_off.xml @@ -0,0 +1,6 @@ + + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_check_24.xml b/feature/ft8/src/main/res/drawable/ic_baseline_check_24.xml new file mode 100644 index 00000000..b98d4f99 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_check_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_check_48.xml b/feature/ft8/src/main/res/drawable/ic_baseline_check_48.xml new file mode 100644 index 00000000..bf13aaa3 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_check_48.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_chevron_left_24.xml b/feature/ft8/src/main/res/drawable/ic_baseline_chevron_left_24.xml new file mode 100644 index 00000000..6eb3dc00 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_chevron_left_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_chevron_right_24.xml b/feature/ft8/src/main/res/drawable/ic_baseline_chevron_right_24.xml new file mode 100644 index 00000000..de4fae42 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_chevron_right_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_close_32.xml b/feature/ft8/src/main/res/drawable/ic_baseline_close_32.xml new file mode 100644 index 00000000..0d7728f2 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_close_32.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_cq_24.xml b/feature/ft8/src/main/res/drawable/ic_baseline_cq_24.xml new file mode 100644 index 00000000..add67b6c --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_cq_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_cq_qso_24.xml b/feature/ft8/src/main/res/drawable/ic_baseline_cq_qso_24.xml new file mode 100644 index 00000000..9822aa19 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_cq_qso_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_freq_24.xml b/feature/ft8/src/main/res/drawable/ic_baseline_freq_24.xml new file mode 100644 index 00000000..78144674 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_freq_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_fullscreen_24.xml b/feature/ft8/src/main/res/drawable/ic_baseline_fullscreen_24.xml new file mode 100644 index 00000000..fd887152 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_fullscreen_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_fullscreen_exit_24.xml b/feature/ft8/src/main/res/drawable/ic_baseline_fullscreen_exit_24.xml new file mode 100644 index 00000000..9213cc74 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_fullscreen_exit_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_grid_tracker_24.xml b/feature/ft8/src/main/res/drawable/ic_baseline_grid_tracker_24.xml new file mode 100644 index 00000000..9775bd03 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_grid_tracker_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_headset_mic_24.xml b/feature/ft8/src/main/res/drawable/ic_baseline_headset_mic_24.xml new file mode 100644 index 00000000..3b473a32 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_headset_mic_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_help_outline_32.xml b/feature/ft8/src/main/res/drawable/ic_baseline_help_outline_32.xml new file mode 100644 index 00000000..25f46706 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_help_outline_32.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_history_24.xml b/feature/ft8/src/main/res/drawable/ic_baseline_history_24.xml new file mode 100644 index 00000000..9bc1fc38 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_history_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_info_24.xml b/feature/ft8/src/main/res/drawable/ic_baseline_info_24.xml new file mode 100644 index 00000000..17590d3a --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_info_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_info_32.xml b/feature/ft8/src/main/res/drawable/ic_baseline_info_32.xml new file mode 100644 index 00000000..4f475e7a --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_info_32.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_info_white_32.xml b/feature/ft8/src/main/res/drawable/ic_baseline_info_white_32.xml new file mode 100644 index 00000000..a14fc2e3 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_info_white_32.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_insert_chart_outlined_24.xml b/feature/ft8/src/main/res/drawable/ic_baseline_insert_chart_outlined_24.xml new file mode 100644 index 00000000..a84df60c --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_insert_chart_outlined_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_keyboard_arrow_down_24.xml b/feature/ft8/src/main/res/drawable/ic_baseline_keyboard_arrow_down_24.xml new file mode 100644 index 00000000..1aeaa998 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_keyboard_arrow_down_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_keyboard_arrow_up_24.xml b/feature/ft8/src/main/res/drawable/ic_baseline_keyboard_arrow_up_24.xml new file mode 100644 index 00000000..1d112693 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_keyboard_arrow_up_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_library_add_check_24.xml b/feature/ft8/src/main/res/drawable/ic_baseline_library_add_check_24.xml new file mode 100644 index 00000000..8be259fe --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_library_add_check_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_link_24.xml b/feature/ft8/src/main/res/drawable/ic_baseline_link_24.xml new file mode 100644 index 00000000..56d6fb67 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_link_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_list_alt_24.xml b/feature/ft8/src/main/res/drawable/ic_baseline_list_alt_24.xml new file mode 100644 index 00000000..7ff9d035 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_list_alt_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_mic_48.xml b/feature/ft8/src/main/res/drawable/ic_baseline_mic_48.xml new file mode 100644 index 00000000..5e530042 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_mic_48.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_mic_off_48.xml b/feature/ft8/src/main/res/drawable/ic_baseline_mic_off_48.xml new file mode 100644 index 00000000..0c94822e --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_mic_off_48.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_mic_red_48.xml b/feature/ft8/src/main/res/drawable/ic_baseline_mic_red_48.xml new file mode 100644 index 00000000..a4029fab --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_mic_red_48.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_nav_24.xml b/feature/ft8/src/main/res/drawable/ic_baseline_nav_24.xml new file mode 100644 index 00000000..d902e3c8 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_nav_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_not_listed_location_32.xml b/feature/ft8/src/main/res/drawable/ic_baseline_not_listed_location_32.xml new file mode 100644 index 00000000..c581d3e9 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_not_listed_location_32.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_pause_circle_outline_24.xml b/feature/ft8/src/main/res/drawable/ic_baseline_pause_circle_outline_24.xml new file mode 100644 index 00000000..189e598a --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_pause_circle_outline_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_pause_disable_circle_outline_24.xml b/feature/ft8/src/main/res/drawable/ic_baseline_pause_disable_circle_outline_24.xml new file mode 100644 index 00000000..086e4c4b --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_pause_disable_circle_outline_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_save_alt_24.xml b/feature/ft8/src/main/res/drawable/ic_baseline_save_alt_24.xml new file mode 100644 index 00000000..0546d8e1 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_save_alt_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_send_48.xml b/feature/ft8/src/main/res/drawable/ic_baseline_send_48.xml new file mode 100644 index 00000000..d1a4c469 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_send_48.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_send_red_48.xml b/feature/ft8/src/main/res/drawable/ic_baseline_send_red_48.xml new file mode 100644 index 00000000..dde8c20b --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_send_red_48.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_send_white_48.xml b/feature/ft8/src/main/res/drawable/ic_baseline_send_white_48.xml new file mode 100644 index 00000000..2a5587b2 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_send_white_48.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_settings_24.xml b/feature/ft8/src/main/res/drawable/ic_baseline_settings_24.xml new file mode 100644 index 00000000..41a82ede --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_settings_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_settings_bluetooth_24.xml b/feature/ft8/src/main/res/drawable/ic_baseline_settings_bluetooth_24.xml new file mode 100644 index 00000000..f783b096 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_settings_bluetooth_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_signal_cellular_4_bar_24.xml b/feature/ft8/src/main/res/drawable/ic_baseline_signal_cellular_4_bar_24.xml new file mode 100644 index 00000000..f70d8501 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_signal_cellular_4_bar_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_tracker_close_24.xml b/feature/ft8/src/main/res/drawable/ic_baseline_tracker_close_24.xml new file mode 100644 index 00000000..6534d34d --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_tracker_close_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_tracker_settings_24.xml b/feature/ft8/src/main/res/drawable/ic_baseline_tracker_settings_24.xml new file mode 100644 index 00000000..25c62747 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_tracker_settings_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_visibility_24.xml b/feature/ft8/src/main/res/drawable/ic_baseline_visibility_24.xml new file mode 100644 index 00000000..1432c334 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_visibility_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_volume_up_24.xml b/feature/ft8/src/main/res/drawable/ic_baseline_volume_up_24.xml new file mode 100644 index 00000000..45bf404e --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_volume_up_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_baseline_wifi_tethering_16.xml b/feature/ft8/src/main/res/drawable/ic_baseline_wifi_tethering_16.xml new file mode 100644 index 00000000..fdc0f32d --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_baseline_wifi_tethering_16.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/ic_launcher_background.xml b/feature/ft8/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 00000000..07d5da9c --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/feature/ft8/src/main/res/drawable/ic_launcher_foreground.xml b/feature/ft8/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 00000000..2b068d11 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/drawable/ic_nav_spectrum_24.xml b/feature/ft8/src/main/res/drawable/ic_nav_spectrum_24.xml new file mode 100644 index 00000000..8173c1f0 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/ic_nav_spectrum_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/icon_background_style.xml b/feature/ft8/src/main/res/drawable/icon_background_style.xml new file mode 100644 index 00000000..ec012f6f --- /dev/null +++ b/feature/ft8/src/main/res/drawable/icon_background_style.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/drawable/imagebutton_selected_style.xml b/feature/ft8/src/main/res/drawable/imagebutton_selected_style.xml new file mode 100644 index 00000000..1e461d44 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/imagebutton_selected_style.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/drawable/imagebutton_style.xml b/feature/ft8/src/main/res/drawable/imagebutton_style.xml new file mode 100644 index 00000000..a36df339 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/imagebutton_style.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/drawable/imagebutton_transparent_style.xml b/feature/ft8/src/main/res/drawable/imagebutton_transparent_style.xml new file mode 100644 index 00000000..24ff5306 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/imagebutton_transparent_style.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/drawable/is_weak_signal_24.xml b/feature/ft8/src/main/res/drawable/is_weak_signal_24.xml new file mode 100644 index 00000000..1872318c --- /dev/null +++ b/feature/ft8/src/main/res/drawable/is_weak_signal_24.xml @@ -0,0 +1,6 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/itu.png b/feature/ft8/src/main/res/drawable/itu.png new file mode 100644 index 00000000..7b348597 Binary files /dev/null and b/feature/ft8/src/main/res/drawable/itu.png differ diff --git a/feature/ft8/src/main/res/drawable/itu_b.png b/feature/ft8/src/main/res/drawable/itu_b.png new file mode 100644 index 00000000..42eef3bc Binary files /dev/null and b/feature/ft8/src/main/res/drawable/itu_b.png differ diff --git a/feature/ft8/src/main/res/drawable/log_callsign_editor_style.xml b/feature/ft8/src/main/res/drawable/log_callsign_editor_style.xml new file mode 100644 index 00000000..1130c9a3 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/log_callsign_editor_style.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/drawable/log_item_delete_icon.xml b/feature/ft8/src/main/res/drawable/log_item_delete_icon.xml new file mode 100644 index 00000000..a2206bed --- /dev/null +++ b/feature/ft8/src/main/res/drawable/log_item_delete_icon.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/logo_background_style.xml b/feature/ft8/src/main/res/drawable/logo_background_style.xml new file mode 100644 index 00000000..d7be1697 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/logo_background_style.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/drawable/nav_calling_list_image.xml b/feature/ft8/src/main/res/drawable/nav_calling_list_image.xml new file mode 100644 index 00000000..0b662810 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/nav_calling_list_image.xml @@ -0,0 +1,10 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/nav_my_calling_image.xml b/feature/ft8/src/main/res/drawable/nav_my_calling_image.xml new file mode 100644 index 00000000..00a0d8a1 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/nav_my_calling_image.xml @@ -0,0 +1,10 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/newyear.png b/feature/ft8/src/main/res/drawable/newyear.png new file mode 100644 index 00000000..1f5a60a7 Binary files /dev/null and b/feature/ft8/src/main/res/drawable/newyear.png differ diff --git a/feature/ft8/src/main/res/drawable/run_decode_image_48.xml b/feature/ft8/src/main/res/drawable/run_decode_image_48.xml new file mode 100644 index 00000000..3565e3e8 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/run_decode_image_48.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/select_bluetooth_dialog_style.xml b/feature/ft8/src/main/res/drawable/select_bluetooth_dialog_style.xml new file mode 100644 index 00000000..0ad6070e --- /dev/null +++ b/feature/ft8/src/main/res/drawable/select_bluetooth_dialog_style.xml @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/feature/ft8/src/main/res/drawable/select_serial_port_item_style.xml b/feature/ft8/src/main/res/drawable/select_serial_port_item_style.xml new file mode 100644 index 00000000..5e6d5107 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/select_serial_port_item_style.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/drawable/select_serial_port_layout_style.xml b/feature/ft8/src/main/res/drawable/select_serial_port_layout_style.xml new file mode 100644 index 00000000..c9fbb8d7 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/select_serial_port_layout_style.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/drawable/share_button_icon_24.xml b/feature/ft8/src/main/res/drawable/share_button_icon_24.xml new file mode 100644 index 00000000..7549d72d --- /dev/null +++ b/feature/ft8/src/main/res/drawable/share_button_icon_24.xml @@ -0,0 +1,6 @@ + + + diff --git a/feature/ft8/src/main/res/drawable/speaker.xml b/feature/ft8/src/main/res/drawable/speaker.xml new file mode 100644 index 00000000..0e4e9481 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/speaker.xml @@ -0,0 +1,6 @@ + + + + diff --git a/feature/ft8/src/main/res/drawable/spectrum_text_back_ground.xml b/feature/ft8/src/main/res/drawable/spectrum_text_back_ground.xml new file mode 100644 index 00000000..99686f15 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/spectrum_text_back_ground.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/drawable/spinner_style.xml b/feature/ft8/src/main/res/drawable/spinner_style.xml new file mode 100644 index 00000000..7e9cc98a --- /dev/null +++ b/feature/ft8/src/main/res/drawable/spinner_style.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/drawable/tracker_calling_list_background.xml b/feature/ft8/src/main/res/drawable/tracker_calling_list_background.xml new file mode 100644 index 00000000..efdbdd22 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/tracker_calling_list_background.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/drawable/tracker_config_bar_style.xml b/feature/ft8/src/main/res/drawable/tracker_config_bar_style.xml new file mode 100644 index 00000000..671f7899 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/tracker_config_bar_style.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/drawable/tracker_grid_info_win_style.xml b/feature/ft8/src/main/res/drawable/tracker_grid_info_win_style.xml new file mode 100644 index 00000000..0657aedd --- /dev/null +++ b/feature/ft8/src/main/res/drawable/tracker_grid_info_win_style.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/drawable/tracker_new_cq_info_win_style.xml b/feature/ft8/src/main/res/drawable/tracker_new_cq_info_win_style.xml new file mode 100644 index 00000000..9d53663a --- /dev/null +++ b/feature/ft8/src/main/res/drawable/tracker_new_cq_info_win_style.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/drawable/tracker_qsl_sample_style.xml b/feature/ft8/src/main/res/drawable/tracker_qsl_sample_style.xml new file mode 100644 index 00000000..791e8363 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/tracker_qsl_sample_style.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/drawable/tracker_qso_sample_style.xml b/feature/ft8/src/main/res/drawable/tracker_qso_sample_style.xml new file mode 100644 index 00000000..b24e0355 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/tracker_qso_sample_style.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/drawable/tracker_qsx_sample_style.xml b/feature/ft8/src/main/res/drawable/tracker_qsx_sample_style.xml new file mode 100644 index 00000000..6f0b7419 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/tracker_qsx_sample_style.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/drawable/tracker_sample_cq_bar_style.xml b/feature/ft8/src/main/res/drawable/tracker_sample_cq_bar_style.xml new file mode 100644 index 00000000..c2001147 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/tracker_sample_cq_bar_style.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/drawable/tracker_tips_radio_style.xml b/feature/ft8/src/main/res/drawable/tracker_tips_radio_style.xml new file mode 100644 index 00000000..4d39bc57 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/tracker_tips_radio_style.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/drawable/welcom_layout_style.xml b/feature/ft8/src/main/res/drawable/welcom_layout_style.xml new file mode 100644 index 00000000..139fba41 --- /dev/null +++ b/feature/ft8/src/main/res/drawable/welcom_layout_style.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/drawable/xiegu_logo_style.xml b/feature/ft8/src/main/res/drawable/xiegu_logo_style.xml new file mode 100644 index 00000000..5c784a6a --- /dev/null +++ b/feature/ft8/src/main/res/drawable/xiegu_logo_style.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/drawable/xiegulogo.png b/feature/ft8/src/main/res/drawable/xiegulogo.png new file mode 100644 index 00000000..1ab44b7c Binary files /dev/null and b/feature/ft8/src/main/res/drawable/xiegulogo.png differ diff --git a/feature/ft8/src/main/res/drawable/xiegulogo32.png b/feature/ft8/src/main/res/drawable/xiegulogo32.png new file mode 100644 index 00000000..22ff4d08 Binary files /dev/null and b/feature/ft8/src/main/res/drawable/xiegulogo32.png differ diff --git a/feature/ft8/src/main/res/layout-land/fragment_calling_list.xml b/feature/ft8/src/main/res/layout-land/fragment_calling_list.xml new file mode 100644 index 00000000..5663cfb3 --- /dev/null +++ b/feature/ft8/src/main/res/layout-land/fragment_calling_list.xml @@ -0,0 +1,244 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/feature/ft8/src/main/res/layout-land/fragment_flex_radio_info.xml b/feature/ft8/src/main/res/layout-land/fragment_flex_radio_info.xml new file mode 100644 index 00000000..287041ae --- /dev/null +++ b/feature/ft8/src/main/res/layout-land/fragment_flex_radio_info.xml @@ -0,0 +1,294 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +