diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7066857..083bf9c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,6 +4,7 @@ on: push: branches: - main + - Dev pull_request: branches: - main @@ -145,11 +146,10 @@ jobs: with: path: all_builds - # - name: Prepare config files for packaging - # run: | - # mkdir -p plugins/NeoSTAND - # cp src/config/config.json plugins/NeoSTAND/ - # cp src/config/AircraftData.json plugins/NeoSTAND/ + - name: Prepare config files for packaging + run: | + mkdir -p plugins/NeoSTAND + cp src/config/config.json plugins/NeoSTAND/ - name: List downloaded files run: ls -R all_builds diff --git a/CMakeLists.txt b/CMakeLists.txt index aeef6ad..0684b1b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.14) set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_SOURCE_DIR}/vcpkg/scripts/buildsystems/vcpkg.cmake) -project(NeoSTAND VERSION "0.0.1") +project(NeoSTAND VERSION "1.0.1") set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) diff --git a/CMakeSettings.json b/CMakeSettings.json index 88e5a22..04223fc 100644 --- a/CMakeSettings.json +++ b/CMakeSettings.json @@ -20,8 +20,7 @@ "cmakeCommandArgs": "-DDEV=1", "buildCommandArgs": "", "ctestCommandArgs": "", - "inheritEnvironments": [ "msvc_x64" ], - "variables": [] + "inheritEnvironments": [ "msvc_x64" ] } ] } \ No newline at end of file diff --git a/src/NeoSTAND.cpp b/src/NeoSTAND.cpp index 7b68524..0d730d2 100644 --- a/src/NeoSTAND.cpp +++ b/src/NeoSTAND.cpp @@ -33,6 +33,8 @@ void NeoSTAND::Initialize(const PluginMetadata &metadata, CoreAPI *coreAPI, Clie logger_ = &lcoreAPI->logger(); tagInterface_ = lcoreAPI->tag().getInterface(); dataManager_ = std::make_unique(this); + dataManager_->PopulateActiveAirports(); + configVersion = getLatestConfigVersion(); #ifndef DEV std::pair updateAvailable = newVersionAvailable(); @@ -91,6 +93,92 @@ std::pair stand::NeoSTAND::newVersionAvailable() } } +bool stand::NeoSTAND::downloadAirportConfig(std::string icao) +{ + std::transform(icao.begin(), icao.end(), icao.begin(), ::toupper); + + httplib::SSLClient cli("raw.githubusercontent.com"); + cli.set_follow_location(true); + cli.set_connection_timeout(5, 0); + cli.set_read_timeout(5, 0); + + httplib::Headers headers = { {"User-Agent", "NEOSTANDconfigDownloader"}, {"Accept", "application/json"} }; + std::string repoUrl = dataManager_->getConfigUrl(); // OWNER/REPO/BRANCH + + if (repoUrl.empty()) { + logger_->error("Configuration URL is not set."); + return false; + } + + std::string apiEndpoint = "/" + repoUrl + "/NeoSTAND/" + icao + ".json"; + + bool success = false; + + if (auto res = cli.Get(apiEndpoint.c_str(), headers); res && res->status == 200) { + try { + nlohmann::ordered_json json = nlohmann::ordered_json::parse(res->body); + success = dataManager_->saveDownloadedAirportConfig(json, icao); + } + catch (const std::exception& e) { + logger_->error(std::string("Failed to parse airport configuration from GitHub: ") + e.what()); + } + } + else { + int status = res ? res->status : 0; + std::string extra; + if (res && (status == 301 || status == 302 || status == 307 || status == 308)) { + auto it = res->headers.find("Location"); + if (it != res->headers.end()) { + extra = " Redirect Location: " + it->second; + } + } + logger_->error("Failed to download airport configuration. HTTP status: " + std::to_string(status) + extra); + } + + return success; +} + +std::string stand::NeoSTAND::getLatestConfigVersion() +{ + httplib::SSLClient cli("raw.githubusercontent.com"); + cli.set_follow_location(true); + cli.set_connection_timeout(5, 0); + cli.set_read_timeout(5, 0); + + httplib::Headers headers = { {"User-Agent", "NEOSTANDconfigDownloader"} }; + std::string repoUrl = dataManager_->getConfigUrl(); // OWNER/REPO/BRANCH + + if (repoUrl.empty()) { + logger_->error("Configuration URL is not set."); + return ""; + } + + std::string apiEndpoint = "/" + repoUrl + "/version.json"; + + if (auto res = cli.Get(apiEndpoint.c_str(), headers); res && res->status == 200) { + try { + nlohmann::ordered_json json = nlohmann::ordered_json::parse(res->body); + return json["version"].get(); + } + catch (const std::exception& e) { + logger_->error(std::string("Failed to parse version information from GitHub: ") + e.what()); + return ""; + } + } + else { + int status = res ? res->status : 0; + std::string extra; + if (res && (status == 301 || status == 302 || status == 307 || status == 308)) { + auto it = res->headers.find("Location"); + if (it != res->headers.end()) { + extra = " Redirect Location: " + it->second; + } + } + logger_->error("Failed to check for latest configuration version. HTTP status: " + std::to_string(status) + extra); + return ""; + } +} + void NeoSTAND::Shutdown() { if (initialized_) @@ -133,23 +221,31 @@ void NeoSTAND::DisplayMessage(const std::string &message, const std::string &sen } void NeoSTAND::runScopeUpdate() { + updateStandMenuButtons("LFPG"); // need to find a way to get the current pilot ICAO + if (!dataManager_) return; dataManager_->updateAllPilots(); std::vector pilots = dataManager_->getAllPilots(); - for (auto& pilot : pilots) { - if (pilot.stand.empty()) dataManager_->assignStands(pilot); + if (!dataManager_->isArrival(pilot.callsign)) { + std::optional distance = aircraftAPI_->getDistanceFromOrigin(pilot.callsign); + if (distance.has_value() && distance.value() > 5.0) { + dataManager_->removePilot(pilot.callsign); + } + } + if (pilot.stand.empty()) dataManager_->assignStands(pilot.callsign); this->UpdateTagItems(pilot.callsign); } } void NeoSTAND::OnTimer(int Counter) { - if (Counter % 5 == 0 && autoMode) this->runScopeUpdate(); + if (Counter % dataManager_->getUpdateInterval() == 0 && autoMode) this->runScopeUpdate(); } void stand::NeoSTAND::OnAirportConfigurationsUpdated(const Airport::AirportConfigurationsUpdatedEvent* event) { + LOG_DEBUG(Logger::LogLevel::Info, "Airport configurations updated, reloading data."); ClearAllTagCache(); dataManager_->removeAllPilots(); dataManager_->PopulateActiveAirports(); @@ -160,40 +256,84 @@ void stand::NeoSTAND::OnPositionUpdate(const Aircraft::PositionUpdateEvent* even for (const auto& aircraft : event->aircrafts) { if (aircraft.callsign.empty()) continue; + std::optional fp = flightplanAPI_->getByCallsign(aircraft.callsign); + + if (ignoredCallsigns_.contains(aircraft.callsign)) { + continue; + } + + if (aircraft.position.groundSpeed > 3) { + if (!dataManager_->isArrival(aircraft.callsign)) { + dataManager_->removePilot(aircraft.callsign); + continue; + } + } + if (!fp.has_value()) { + // static & no flightplan -> check against all Stands + std::vector activeAirports = dataManager_->getAllActiveAirports(); + for (const auto& icao : activeAirports) { + std::string currentStand = dataManager_->isAircraftOnStand(aircraft.callsign, icao); + if (!currentStand.empty()) { + std::string icao = currentStand.substr(currentStand.length() - 4, 4); + currentStand = currentStand.substr(0, currentStand.length() - 5); + DataManager::Stand stand; + stand.name = currentStand; + stand.callsign = aircraft.callsign; + stand.icao = icao; + dataManager_->addStandToOccupied(stand); + break; + } + } + ignoredCallsigns_.insert(aircraft.callsign); + continue; + } + + std::string currentStand = dataManager_->isAircraftOnStand(aircraft.callsign); + if (!currentStand.empty()) { + std::string icao = currentStand.substr(currentStand.length() - 4, 4); + currentStand = currentStand.substr(0, currentStand.length() - 5); + + DataManager::Stand stand; + stand.name = currentStand; + stand.callsign = aircraft.callsign; + stand.icao = icao; + dataManager_->addStandToOccupied(stand); - UpdateTagItems(aircraft.callsign); + } } } void stand::NeoSTAND::OnFlightplanUpdated(const Flightplan::FlightplanUpdatedEvent* event) { dataManager_->removePilot(event->callsign); // Force recompute + ignoredCallsigns_.erase(event->callsign); ClearTagCache(event->callsign); - UpdateTagItems(event->callsign); + dataManager_->updatePilot(event->callsign); } void stand::NeoSTAND::OnFlightplanRemoved(const Flightplan::FlightplanRemovedEvent* event) { dataManager_->removePilot(event->callsign); + ignoredCallsigns_.insert(event->callsign); ClearTagCache(event->callsign); } void stand::NeoSTAND::OnAircraftDisconnected(const Aircraft::AircraftDisconnectedEvent* event) { dataManager_->removePilot(event->callsign); + ignoredCallsigns_.erase(event->callsign); ClearTagCache(event->callsign); } void NeoSTAND::UpdateTagItems(std::string callsign) { - dataManager_->updatePilot(callsign); - DataManager::Pilot pilot = dataManager_->getPilotByCallsign(callsign); - if (pilot.empty()) return; + DataManager::Pilot* pilot = dataManager_->getPilotByCallsign(callsign); + if (!pilot || pilot->empty()) return; Tag::TagContext tagContext; tagContext.callsign = callsign; tagContext.colour = ColorizeStand(); - std::string stand = pilot.stand.empty() ? "N/A" : pilot.stand; + std::string stand = pilot->stand.empty() ? "N/A" : pilot->stand; updateTagValueIfChanged(callsign, standItemId_, stand, tagContext); } @@ -218,6 +358,9 @@ bool NeoSTAND::updateTagValueIfChanged(const std::string& callsign, const std::s if (!needsUpdate) return false; + if (!tagInterface_) + return false; + tagInterface_->UpdateTagValue(tagId, value, context); { @@ -241,6 +384,12 @@ void NeoSTAND::ClearAllTagCache() tagCache_.clear(); } +bool NeoSTAND::toggleAutoMode() +{ + autoMode = !autoMode; + return autoMode; +} + PluginSDK::PluginMetadata NeoSTAND::GetMetadata() const { return {"NeoSTAND", PLUGIN_VERSION, "French vACC"}; diff --git a/src/NeoSTAND.h b/src/NeoSTAND.h index c672097..33d11b9 100644 --- a/src/NeoSTAND.h +++ b/src/NeoSTAND.h @@ -8,7 +8,7 @@ #include "core/DataManager.h" #include "utils/Color.h" -constexpr const char* NEOSTAND_VERSION = "v0.0.1"; +constexpr const char* NEOSTAND_VERSION = "v1.0.1"; using namespace PluginSDK; @@ -25,6 +25,8 @@ namespace stand { // Plugin lifecycle methods void Initialize(const PluginMetadata& metadata, CoreAPI* coreAPI, ClientInformation info) override; std::pair newVersionAvailable(); + bool downloadAirportConfig(std::string icao); + std::string getLatestConfigVersion(); void Shutdown() override; void Reset(); PluginMetadata GetMetadata() const override; @@ -53,7 +55,12 @@ namespace stand { Fsd::FsdAPI* GetFsdAPI() const { return fsdAPI_; } PluginSDK::ControllerData::ControllerDataAPI* GetControllerDataAPI() const { return controllerDataAPI_; } Tag::TagInterface* GetTagInterface() const { return tagInterface_; } + ClientInformation GetClientInfo() const { return clientInfo_; }; DataManager* GetDataManager() const { return dataManager_.get(); } + std::unordered_set GetIgnoredCallsigns() const { return ignoredCallsigns_; } + + // Getters + std::string getConfigVersion() const { return configVersion; } private: void runScopeUpdate(); @@ -71,21 +78,27 @@ namespace stand { std::string airportsCommandId_; std::string occupiedCommandId_; std::string blockedCommandId_; + std::string pilotCommandId_; + std::string dumpCommandId_; private: - // Plugin state - bool initialized_ = false; - std::thread m_worker; - bool m_stop; - bool autoMode = true; struct TagRenderState { std::string value; Color colour; Color background; }; + + // Plugin state + bool initialized_ = false; + std::thread m_worker; + bool m_stop; + bool autoMode = true; std::unordered_map> tagCache_; std::mutex tagCacheMutex_; + std::string configVersion; + std::unordered_set ignoredCallsigns_; + // APIs PluginMetadata metadata_; @@ -110,6 +123,7 @@ namespace stand { void OnTagDropdownAction(const Tag::DropdownActionEvent* event) override; void UpdateTagItems(std::string Callsign); Color ColorizeStand(); + void updateStandMenuButtons(const std::string& icao); // TAG Items IDs std::string standItemId_; diff --git a/src/Version.h.in b/src/Version.h.in index 035ff2a..4a7b42e 100644 --- a/src/Version.h.in +++ b/src/Version.h.in @@ -1,17 +1,19 @@ #pragma once -// clang-format off -// prevents C2018 during compilation +#include + namespace { -const char *NeoSTAND{ "NeoSTAND" }; -#if DEV -const char *PLUGIN_VERSION{ "@CMAKE_PROJECT_VERSION@-dev"}; +constexpr const char *NeoSTAND = "NeoSTAND"; + +#if defined(DEV) +constexpr const char *PLUGIN_VERSION = "@CMAKE_PROJECT_VERSION@-dev"; #else -const char *PLUGIN_VERSION{ "@CMAKE_PROJECT_VERSION@" }; +constexpr const char *PLUGIN_VERSION = "@CMAKE_PROJECT_VERSION@"; #endif -const char *PLUGIN_AUTHOR{ "vSID Team+vACC-FR" }; -const char *PLUGIN_LICENSE{ "GPLv3" }; -static constexpr std::uint8_t PLUGIN_VERSION_MAJOR = @CMAKE_PROJECT_VERSION_MAJOR@; -static constexpr std::uint8_t PLUGIN_VERSION_MINOR = @CMAKE_PROJECT_VERSION_MINOR@; -static constexpr std::uint8_t PLUGIN_VERSION_PATCH = @CMAKE_PROJECT_VERSION_PATCH@; +constexpr const char *PLUGIN_AUTHOR = "vSID Team+vACC-FR"; +constexpr const char *PLUGIN_LICENSE = "GPLv3"; + +constexpr std::uint8_t PLUGIN_VERSION_MAJOR = @CMAKE_PROJECT_VERSION_MAJOR@; +constexpr std::uint8_t PLUGIN_VERSION_MINOR = @CMAKE_PROJECT_VERSION_MINOR@; +constexpr std::uint8_t PLUGIN_VERSION_PATCH = @CMAKE_PROJECT_VERSION_PATCH@; } diff --git a/src/config/LFBO.json b/src/config/LFBO.json index e0c9630..70ec8d2 100644 --- a/src/config/LFBO.json +++ b/src/config/LFBO.json @@ -1,253 +1,374 @@ { - "ICAO": "LFBO", - "STAND": { - "V10": { - "coordinates": "N043.37.59.110:E001.22.09.990:25", - "use": "A", - "schengen": true, - "callsign": [ "RYR", "RAM", "BEE", "KLM" ], - "code": "E", - "priority": 1 - }, - "U42": { - "coordinates": "N043.37.58.273:E001.22.08.319:25", - "use": "A", - "schengen": false, - "callsign": [ "RYR", "RAM", "BEE", "KLM" ], - "code": "E", - "priority": 1 - }, - "U41": { - "coordinates": "N043.37.57.638:E001.22.07.835:25", - "use": "A", - "schengen": false, - "callsign": [ "RYR", "RAM", "BEE", "KLM" ], - "code": "E", - "priority": 1 - }, - "U40": { - "coordinates": "N043.37.56.312:E001.22.08.627:25", - "use": "A", - "schengen": false, - "callsign": [ "RYR", "RAM", "BEE", "KLM" ], - "code": "E", - "priority": 1 - }, - "U32": { - "coordinates": "N043.37.55.504:E001.22.09.155:25", - "use": "A", - "schengen": false, - "callsign": [ "RYR", "RAM", "BEE", "KLM" ], - "code": "E", - "priority": 1 - }, - "U31": { - "coordinates": "N043.37.54.552:E001.22.10.078:25", - "use": "A", - "schengen": false, - "callsign": [ "RYR", "RAM", "BEE", "KLM" ], - "code": "E", - "priority": 1 - }, - "U30": { - "coordinates": "N043.37.53.687:E001.22.10.826:25", - "use": "A", - "schengen": false, - "callsign": [ "RYR", "RAM", "BEE", "KLM" ], - "code": "E", - "priority": 1 - }, - "U22": { - "coordinates": "N043.37.53.341:E001.22.12.145:25", - "use": "A", - "schengen": false, - "callsign": [ "RYR", "RAM", "BEE", "KLM" ], - "code": "E", - "priority": 1 - }, - "U21": { - "coordinates": "N043.37.52.879:E001.22.13.332:25", - "use": "A", - "schengen": false, - "callsign": [ "RYR", "RAM", "BEE", "KLM" ], - "code": "E", - "priority": 1 - }, - "U20": { - "coordinates": "N043.37.52.706:E001.22.14.256:25", - "use": "A", - "schengen": false, - "callsign": [ "RYR", "RAM", "BEE", "KLM" ], - "code": "E", - "priority": 1 - }, - "U12": { - "coordinates": "N043.37.52.677:E001.22.15.487:25", - "use": "A", - "schengen": false, - "callsign": [ "RYR", "RAM", "BEE", "KLM" ], - "code": "E", - "priority": 1 - }, - "U11": { - "coordinates": "N043.37.52.533:E001.22.16.851:25", - "use": "A", - "schengen": false, - "callsign": [ "RYR", "RAM", "BEE", "KLM" ], - "code": "E", - "priority": 1 - }, - "U10": { - "coordinates": "N043.37.52.562:E001.22.18.258:25", - "use": "A", - "schengen": false, - "callsign": [ "RYR", "RAM", "BEE", "KLM" ], - "code": "E", - "priority": 1 - }, - "E62": { - "coordinates": "N043.37.50.081:E001.22.19.797:25", - "use": "A", - "schengen": true, - "callsign": [ "AFR", "BAW" ], - "code": "C", - "priority": 1 - }, - "E60": { - "coordinates": "N043.37.49.071:E001.22.21.072:25", - "use": "A", - "schengen": true, - "callsign": [ "AFR", "BAW" ], - "code": "C", - "priority": 1 - }, - "E52": { - "coordinates": "N043.37.48.379:E001.22.21.556:25", - "use": "A", - "schengen": true, - "callsign": [ "AFR", "BAW" ], - "code": "C", - "priority": 1 - }, - "E54": { - "coordinates": "N043.37.47.860:E001.22.22.216:25", - "use": "A", - "schengen": true, - "callsign": [ "AFR", "BAW" ], - "code": "C", - "priority": 1 - }, - "E50": { - "coordinates": "N043.37.46.677:E001.22.23.491:25", - "use": "A", - "schengen": true, - "callsign": [ "AFR", "BAW" ], - "code": "C", - "priority": 1 - }, - "E42": { - "coordinates": "N043.37.45.322:E001.22.24.766:25", - "use": "A", - "schengen": true, - "callsign": [ "AFR", "BAW" ], - "code": "C", - "priority": 1 - }, - "E40": { - "coordinates": "N043.37.44.225:E001.22.26.130:25", - "use": "A", - "schengen": true, - "callsign": [ "AFR", "BAW" ], - "code": "C", - "priority": 1 - }, - "E30": { - "coordinates": "N043.37.43.869:E001.22.28.025:25", - "use": "A", - "schengen": true, - "callsign": [ "AFR", "BAW" ], - "code": "C", - "priority": 1 - }, - "E20": { - "coordinates": "N043.37.44.377:E001.22.30.171:25", - "use": "A", - "schengen": true, - "callsign": [ "AFR", "BAW" ], - "code": "C", - "priority": 1 - }, - "E10": { - "coordinates": "N043.37.44.723:E001.22.31.895:25", - "use": "A", - "schengen": true, - "callsign": [ "AFR", "BAW" ], - "code": "C", - "priority": 1 - }, - "F10": { - "coordinates": "N043.37.43.800:E001.22.33.232:25", - "use": "A", - "schengen": true, - "callsign": [ "EZY", "EJU", "EZS", "VOE" ], - "code": "C", - "priority": 3 - }, - "F20": { - "coordinates": "N043.37.42.485:E001.22.34.499:25", - "use": "A", - "schengen": true, - "callsign": [ "EZY", "EJU", "EZS", "VOE" ], - "code": "C", - "priority": 3 - }, - "F30": { - "coordinates": "N043.37.41.215:E001.22.35.800:25", - "use": "A", - "schengen": true, - "callsign": [ "EZY", "EJU", "EZS", "VOE" ], - "code": "C", - "priority": 3 - }, - "F40": { - "coordinates": "N043.37.39.946:E001.22.37.032:25", - "use": "A", - "schengen": true, - "callsign": [ "EZY", "EJU", "EZS", "VOE" ], - "code": "C", - "priority": 3 - }, - "F50": { - "coordinates": "N043.37.38.746:E001.22.38.298:25", - "use": "A", - "schengen": true, - "callsign": [ "EZY", "EJU", "EZS", "VOE" ], - "code": "C", - "priority": 1 - }, - "K32": { - "coordinates": "N043.37.37.685:E001.22.32.282:25", - "use": "A", - "schengen": true, - "atyp": "AT42", - "code": "E", - "priority": 1 - }, - "K22": { - "coordinates": "N043.37.38.769:E001.22.31.297:25", - "use": "A", - "schengen": true, - "atyp": "AT42", - "code": "E", - "priority": 1 - }, - "K12": { - "coordinates": "N043.37.40.015:E001.22.30.031:25", - "use": "A", - "schengen": true, - "atyp": "AT42", - "code": "E", - "priority": 1 + "version": "v0.0.1", + "ICAO": "LFBO", + "Stands": { + "V10": { + "Coordinates": "43.633086:1.369442:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "RYR", + "RAM", + "BEE", + "KLM" + ], + "WTC": "LM", + "Priority": 1 + }, + "U42": { + "Coordinates": "43.632854:1.368977:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "RYR", + "RAM", + "BEE", + "KLM" + ], + "WTC": "LM", + "Priority": 1 + }, + "U41": { + "Coordinates": "43.632677:1.368843:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "RYR", + "RAM", + "BEE", + "KLM" + ], + "WTC": "LM", + "Priority": 1 + }, + "U40": { + "Coordinates": "43.632309:1.369063:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "RYR", + "RAM", + "BEE", + "KLM" + ], + "WTC": "LM", + "Priority": 1 + }, + "U32": { + "Coordinates": "43.632084:1.369210:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "RYR", + "RAM", + "BEE", + "KLM" + ], + "WTC": "LM", + "Priority": 1 + }, + "U31": { + "Coordinates": "43.631820:1.369466:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "RYR", + "RAM", + "BEE", + "KLM" + ], + "WTC": "LM", + "Priority": 1 + }, + "U30": { + "Coordinates": "43.631580:1.369674:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "RYR", + "RAM", + "BEE", + "KLM" + ], + "WTC": "LM", + "Priority": 1 + }, + "U22": { + "Coordinates": "43.631484:1.370040:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "RYR", + "RAM", + "BEE", + "KLM" + ], + "WTC": "LM", + "Priority": 1 + }, + "U21": { + "Coordinates": "43.631355:1.370370:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "RYR", + "RAM", + "BEE", + "KLM" + ], + "WTC": "LM", + "Priority": 1 + }, + "U20": { + "Coordinates": "43.631307:1.370627:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "RYR", + "RAM", + "BEE", + "KLM" + ], + "WTC": "LM", + "Priority": 1 + }, + "U12": { + "Coordinates": "43.631299:1.370969:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "RYR", + "RAM", + "BEE", + "KLM" + ], + "WTC": "LM", + "Priority": 1 + }, + "U11": { + "Coordinates": "43.631259:1.371347:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "RYR", + "RAM", + "BEE", + "KLM" + ], + "WTC": "LM", + "Priority": 1 + }, + "U10": { + "Coordinates": "43.631267:1.371738:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "RYR", + "RAM", + "BEE", + "KLM" + ], + "WTC": "LM", + "Priority": 1 + }, + "E62": { + "Coordinates": "43.630578:1.372166:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AFR", + "BAW" + ], + "WTC": "LMH", + "Priority": 1 + }, + "E60": { + "Coordinates": "43.630297:1.372520:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AFR", + "BAW" + ], + "WTC": "LMH", + "Priority": 1 + }, + "E52": { + "Coordinates": "43.630105:1.372654:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AFR", + "BAW" + ], + "WTC": "LMH", + "Priority": 1 + }, + "E54": { + "Coordinates": "43.629961:1.372838:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AFR", + "BAW" + ], + "WTC": "LMH", + "Priority": 1 + }, + "E50": { + "Coordinates": "43.629632:1.373192:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AFR", + "BAW" + ], + "WTC": "LMH", + "Priority": 1 + }, + "E42": { + "Coordinates": "43.629256:1.373546:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AFR", + "BAW" + ], + "WTC": "LMH", + "Priority": 1 + }, + "E40": { + "Coordinates": "43.628951:1.373925:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AFR", + "BAW" + ], + "WTC": "LMH", + "Priority": 1 + }, + "E30": { + "Coordinates": "43.628853:1.374451:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AFR", + "BAW" + ], + "WTC": "LMH", + "Priority": 1 + }, + "E20": { + "Coordinates": "43.628994:1.375047:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AFR", + "BAW" + ], + "WTC": "LMH", + "Priority": 1 + }, + "E10": { + "Coordinates": "43.629090:1.375526:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AFR", + "BAW" + ], + "WTC": "LMH", + "Priority": 1 + }, + "F10": { + "Coordinates": "43.628833:1.375898:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "EZY", + "EJU", + "EZS", + "VOE" + ], + "WTC": "LMH", + "Priority": 3 + }, + "F20": { + "Coordinates": "43.628468:1.376250:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "EZY", + "EJU", + "EZS", + "VOE" + ], + "WTC": "LMH", + "Priority": 3 + }, + "F30": { + "Coordinates": "43.628115:1.376611:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "EZY", + "EJU", + "EZS", + "VOE" + ], + "WTC": "LMH", + "Priority": 3 + }, + "F40": { + "Coordinates": "43.627763:1.376953:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "EZY", + "EJU", + "EZS", + "VOE" + ], + "WTC": "LMH", + "Priority": 3 + }, + "F50": { + "Coordinates": "43.627429:1.377305:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "EZY", + "EJU", + "EZS", + "VOE" + ], + "WTC": "LMH", + "Priority": 1 + }, + "K32": { + "Coordinates": "43.627135:1.375634:25", + "Use": "A", + "Schengen": true, + "Callsigns": [], + "WTC": "LM", + "Priority": 1 + }, + "K22": { + "Coordinates": "43.627436:1.375360:25", + "Use": "A", + "Schengen": true, + "Callsigns": [], + "WTC": "LM", + "Priority": 1 + }, + "K12": { + "Coordinates": "43.627782:1.375009:25", + "Use": "A", + "schengen": true, + "Callsigns": [], + "WTC": "LM", + "Priority": 1 + } } - } } \ No newline at end of file diff --git a/src/config/LFMN.json b/src/config/LFMN.json new file mode 100644 index 0000000..8395e4d --- /dev/null +++ b/src/config/LFMN.json @@ -0,0 +1,2187 @@ +{ + "version": "v0.0.1", + "ICAO": "LFMN", + "Stands": { + "2A": { + "Coordinates": "43.666359:7.216941:20", + "Use": "B", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LMH", + "Priority": 2 + }, + "2B": { + "Coordinates": "43.666156:7.21675:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LM", + "Priority": 2 + }, + "2C": { + "Coordinates": "43.66591:7.216262\t:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "L", + "Priority": 2 + }, + "6A": { + "Coordinates": "43.665602:7.215821:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LMH", + "Priority": 3 + }, + "6B": { + "Coordinates": "43.665618:7.215892:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LM", + "Priority": 3 + }, + "6C": { + "Coordinates": "43.665342:7.215459:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LMH", + "Priority": 3 + }, + "8A": { + "Coordinates": "43.665005:7.215405:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LMH", + "Priority": 3 + }, + "8C": { + "Coordinates": "43.664844:7.214769:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LMH", + "Priority": 3 + }, + "10A": { + "Coordinates": "43.66444:7.214508:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LMH", + "Priority": 3 + }, + "10B": { + "Coordinates": "43.664379:7.213244:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LM", + "Priority": 3 + }, + "10C": { + "Coordinates": "43.664241:7.212885:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LMH", + "Priority": 3 + }, + "12A": { + "Coordinates": "43.664379:7.213244:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LMH", + "Priority": 3 + }, + "12B": { + "Coordinates": "43.66441:7.213346:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LM", + "Priority": 3 + }, + "12C": { + "Coordinates": "43.664296:7.212808:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LMH", + "Priority": 3 + }, + "14A": { + "Coordinates": "43.664279:7.212337:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LMH", + "Priority": 3 + }, + "14B": { + "Coordinates": "43.664279:7.212337:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LM", + "Priority": 3 + }, + "14C": { + "Coordinates": "43.664223:7.211726:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LMH", + "Priority": 3 + }, + "16A": { + "Coordinates": "43.663929:7.210741:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LMH", + "Priority": 1 + }, + "16B": { + "Coordinates": "43.663929:7.210741:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LM", + "Priority": 1 + }, + "16C": { + "Coordinates": "43.663929:7.210741:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LMH", + "Priority": 1 + }, + "16D": { + "Coordinates": "43.663929:7.210741:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LMH", + "Priority": 1 + }, + "16E": { + "Coordinates": "43.663929:7.210741:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LMH", + "Priority": 1 + }, + "18": { + "Coordinates": "43.664059:7.209781:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LMH", + "Priority": 1 + }, + "20": { + "Coordinates": "43.663917:7.208556:20", + "Use": "B", + "Schengen": false, + "Callsigns": [], + "WTC": "LMH", + "Priority": 1 + }, + "22": { + "Coordinates": "43.663872:7.207926:20", + "Use": "C", + "Schengen": false, + "Callsigns": [], + "WTC": "LMH", + "Priority": 1 + }, + "24A": { + "Coordinates": "43.663807:7.207332:20", + "Use": "C", + "Schengen": false, + "Callsigns": [], + "WTC": "LMH", + "Priority": 1 + }, + "24C": { + "Coordinates": "43.663702:7.206445:20", + "Use": "C", + "Schengen": false, + "Callsigns": [], + "WTC": "LMH", + "Priority": 1 + }, + "24D": { + "Coordinates": "43.663917:7.208556:20", + "Use": "C", + "Schengen": false, + "Callsigns": [], + "WTC": "LMH", + "Priority": 1 + }, + "26": { + "Coordinates": "43.663368:7.205301:20", + "Use": "C", + "Schengen": false, + "Callsigns": [], + "WTC": "LM", + "Priority": 3 + }, + "26A": { + "Coordinates": "43.663368:7.205301:20", + "Use": "C", + "Schengen": false, + "Callsigns": [], + "WTC": "LMH", + "Priority": 2 + }, + "26R": { + "Coordinates": "43.663368:7.205301:20", + "Use": "C", + "Schengen": false, + "Callsigns": [], + "WTC": "L", + "Priority": 2 + }, + "28": { + "Coordinates": "43.662587:7.205427:20", + "Use": "C", + "Schengen": false, + "Callsigns": [], + "WTC": "LMH", + "Priority": 3 + }, + "28A": { + "Coordinates": "43.663368:7.205301:20", + "Use": "C", + "Schengen": false, + "Callsigns": [], + "WTC": "LMH", + "Priority": 2 + }, + "40A": { + "Coordinates": "43.66231:7.205871:20", + "Use": "A", + "Schengen": true, + "Callsigns": [], + "WTC": "LMH", + "Priority": 1 + }, + "40B": { + "Coordinates": "43.66231:7.205871:20", + "Use": "A", + "Schengen": true, + "Callsigns": [], + "WTC": "LM", + "Priority": 1 + }, + "40C": { + "Coordinates": "43.662249:7.206646:20", + "Use": "A", + "Schengen": true, + "Callsigns": [], + "WTC": "LM", + "Priority": 1 + }, + "5A": { + "Coordinates": "43.661989:7.211723:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LMH", + "Priority": 1 + }, + "5C": { + "Coordinates": "43.661552:7.210754:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LMH", + "Priority": 1 + }, + "9": { + "Coordinates": "43.663124:7.212309:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LMH", + "Priority": 1 + }, + "11": { + "Coordinates": "43.663108:7.211967:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LMH", + "Priority": 1 + }, + "13": { + "Coordinates": "43.663074:7.211576:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LMH", + "Priority": 1 + }, + "15": { + "Coordinates": "43.663026:7.211186:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LMH", + "Priority": 1 + }, + "17": { + "Coordinates": "43.662977:7.210795:20", + "Use": "A", + "Schengen": false, + "Callsigns": [], + "WTC": "L", + "Priority": 1 + }, + "19A": { + "Coordinates": "43.662518:7.209351:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LMH", + "Priority": 2 + }, + "19D": { + "Coordinates": "43.662518:7.209351:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LM", + "Priority": 2 + }, + "19C": { + "Coordinates": "43.662518:7.209351:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LMH", + "Priority": 2 + }, + "21": { + "Coordinates": "43.661801:7.209448:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LMH", + "Priority": 2 + }, + "23D": { + "Coordinates": "43.661118:7.209529:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LM", + "Priority": 2 + }, + "23A": { + "Coordinates": "43.661118:7.209529:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LMH", + "Priority": 2 + }, + "23C": { + "Coordinates": "43.661118:7.209529:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LMH", + "Priority": 2 + }, + "42": { + "Coordinates": "43.661704:7.206735:20", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "EZY", + "EZS", + "EJU", + "VOE", + "AFR", + "KLM", + "AEA", + "AFL", + "DAL", + "AZA", + "ITY" + ], + "WTC": "LM", + "Priority": 1 + }, + "44": { + "Coordinates": "43.661266:7.206739:20", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "EZY", + "EZS", + "EJU", + "VOE", + "AFR", + "KLM", + "AEA", + "AFL", + "DAL", + "AZA", + "ITY" + ], + "WTC": "LMH", + "Priority": 1 + }, + "46A": { + "Coordinates": "43.660873:7.207044:20", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "EZY", + "EZS", + "EJU", + "VOE", + "AFR", + "KLM", + "AEA", + "AFL", + "DAL", + "AZA", + "ITY" + ], + "WTC": "LMH", + "Priority": 1 + }, + "46C": { + "Coordinates": "43.660499:7.20719:20", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "EZY", + "EZS", + "EJU", + "VOE", + "AFR", + "KLM", + "AEA", + "AFL", + "DAL", + "AZA", + "ITY" + ], + "WTC": "LMH", + "Priority": 1 + }, + "46B": { + "Coordinates": "43.660499:7.20719:20", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "EZY", + "EZS", + "EJU", + "VOE", + "AFR", + "KLM", + "AEA", + "AFL", + "DAL", + "AZA", + "ITY" + ], + "WTC": "LM", + "Priority": 1 + }, + "48A": { + "Coordinates": "43.660011:7.20708:20", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "EZY", + "EZS", + "EJU", + "VOE", + "AFR", + "KLM", + "AEA", + "AFL", + "DAL", + "AZA", + "ITY" + ], + "WTC": "LMH", + "Priority": 2 + }, + "48B": { + "Coordinates": "43.660011:7.20708:20", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "EZY", + "EZS", + "EJU", + "VOE", + "AFR", + "KLM", + "AEA", + "AFL", + "DAL", + "AZA", + "ITY" + ], + "WTC": "LM", + "Priority": 1 + }, + "48C": { + "Coordinates": "43.659607:7.20723:20", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "EZY", + "EZS", + "EJU", + "VOE", + "AFR", + "KLM", + "AEA", + "AFL", + "DAL", + "AZA", + "ITY" + ], + "WTC": "LMH", + "Priority": 2 + }, + "50A": { + "Coordinates": "43.659249:7.207011:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "EZY", + "EZS", + "EJU", + "VOE", + "AFR", + "KLM", + "AEA", + "AFL", + "DAL", + "AZA", + "ITY" + ], + "WTC": "LMH", + "Priority": 2 + }, + "50B": { + "Coordinates": "43.659249:7.207011:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "EZY", + "EZS", + "EJU", + "VOE", + "AFR", + "KLM", + "AEA", + "AFL", + "DAL", + "AZA", + "ITY" + ], + "WTC": "LM", + "Priority": 1 + }, + "50C": { + "Coordinates": "43.658931:7.206747:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "EZY", + "EZS", + "EJU", + "VOE", + "AFR", + "KLM", + "AEA", + "AFL", + "DAL", + "AZA", + "ITY" + ], + "WTC": "LMH", + "Priority": 2 + }, + "52A": { + "Coordinates": "43.658714:7.206239:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "EZY", + "EZS", + "EJU", + "VOE", + "AFR", + "KLM", + "AEA", + "AFL", + "DAL", + "AZA", + "ITY" + ], + "WTC": "LMH", + "Priority": 2 + }, + "52B": { + "Coordinates": "43.658714:7.206239:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "EZY", + "EZS", + "EJU", + "VOE", + "AFR", + "KLM", + "AEA", + "AFL", + "DAL", + "AZA", + "ITY" + ], + "WTC": "L", + "Priority": 1 + }, + "52C": { + "Coordinates": "43.658487:7.205989:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "EZY", + "EZS", + "EJU", + "VOE", + "AFR", + "KLM", + "AEA", + "AFL", + "DAL", + "AZA", + "ITY" + ], + "WTC": "LMH", + "Priority": 2 + }, + "54A": { + "Coordinates": "43.658033:7.205216:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "EZY", + "EZS", + "EJU", + "VOE", + "AFR", + "KLM", + "AEA", + "AFL", + "DAL", + "AZA", + "ITY" + ], + "WTC": "LMH", + "Priority": 1 + }, + "54B": { + "Coordinates": "43.658033:7.205216:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "EZY", + "EZS", + "EJU", + "VOE", + "AFR", + "KLM", + "AEA", + "AFL", + "DAL", + "AZA", + "ITY" + ], + "WTC": "L", + "Priority": 1 + }, + "54C": { + "Coordinates": "43.658033:7.205216:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "EZY", + "EZS", + "EJU", + "VOE", + "AFR", + "KLM", + "AEA", + "AFL", + "DAL", + "AZA", + "ITY" + ], + "WTC": "LMH", + "Priority": 1 + }, + "56A": { + "Coordinates": "43.658033:7.205216:20", + "Use": "A", + "Schengen": false, + "Callsigns": [], + "WTC": "LMH", + "Priority": 1 + }, + "56B": { + "Coordinates": "43.658033:7.205216:20", + "Use": "A", + "Schengen": false, + "Callsigns": [], + "WTC": "L", + "Priority": 1 + }, + "56C": { + "Coordinates": "43.658033:7.205216:20", + "Use": "A", + "Schengen": false, + "Callsigns": [], + "WTC": "LMH", + "Priority": 1 + }, + "58A": { + "Coordinates": "43.658033:7.205216:20", + "Use": "A", + "Schengen": false, + "Callsigns": [], + "WTC": "LMH", + "Priority": 1 + }, + "58B": { + "Coordinates": "43.658033:7.205216:20", + "Use": "A", + "Schengen": false, + "Callsigns": [], + "WTC": "L", + "Priority": 1 + }, + "58C": { + "Coordinates": "43.658033:7.205216:20", + "Use": "A", + "Schengen": false, + "Callsigns": [], + "WTC": "LMH", + "Priority": 1 + }, + "60": { + "Coordinates": "43.658033:7.205216:20", + "Use": "A", + "Schengen": false, + "Callsigns": [], + "WTC": "LM", + "Priority": 1 + }, + "62": { + "Coordinates": "43.658033:7.205216:20", + "Use": "A", + "Schengen": false, + "Callsigns": [], + "WTC": "LM", + "Priority": 1 + }, + "41B": { + "Coordinates": "43.662585:7.208247:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LMH", + "Priority": 2 + }, + "43B": { + "Coordinates": "43.662153:7.208369:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LMH", + "Priority": 2 + }, + "45B": { + "Coordinates": "43.661641:7.208492:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LMH", + "Priority": 2 + }, + "47B": { + "Coordinates": "43.661128:7.208614:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LMH", + "Priority": 2 + }, + "49A": { + "Coordinates": "43.659324:7.210095:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LMH", + "Priority": 1 + }, + "49C": { + "Coordinates": "43.658973:7.209541:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LMH", + "Priority": 1 + }, + "51B": { + "Coordinates": "43.657686:7.207393:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LMH", + "Priority": 1 + }, + "53A": { + "Coordinates": "43.657272:7.206929:20", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LMH", + "Priority": 1 + }, + "53B": { + "Coordinates": "43.656947:7.206448:20", + "Use": "A", + "schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "BTI", + "ROU", + "CCA", + "AUA", + "BAW", + "BEL", + "ELY", + "EWG", + "IBE", + "IBS", + "LAU", + "LOT", + "LHA", + "DLH", + "LGL", + "NAX", + "IBK", + "RYR", + "SAS", + "QTR", + "SBI", + "SWR", + "TAP", + "TRA", + "UIA", + "VLG" + ], + "WTC": "LMH", + "Priority": 1 + } + } +} diff --git a/src/config/LFPG.json b/src/config/LFPG.json index 27a50d3..d372d18 100644 --- a/src/config/LFPG.json +++ b/src/config/LFPG.json @@ -1,2085 +1,5759 @@ -STAND:LFPG:Y06:49.014006:2.538408:25 -USE:A -NON-SCHENGEN -CALLSIGN:AEE,EIN,CCA,ANA,AAR,TCV,CRC,9BQ,MSR,EVA,KAC,DJT,NAX,PIA,QTR,RAM,SIA,ALK,TAM,DTH,THA,THY,UAL,SVR -CODE:C -PRIORITY:+3 - -STAND:LFPG:A01:48.999836:2.560711:25 -USE:A -NON-SCHENGEN -CALLSIGN:DAH,KZR,ACA,SEY,THT,AAL,BAW,CPA,ETD,ETH,CHH,OMA,RJA,XLF -CODE:E -PRIORITY:+1 - -STAND:LFPG:Y07:49.014131:2.539136:25 -USE:A -NON-SCHENGEN -CALLSIGN:AEE,EIN,CCA,ANA,AAR,TCV,CRC,9BQ,MSR,EVA,KAC,DJT,NAX,PIA,QTR,RAM,SIA,ALK,TAM,DTH,THA,THY,UAL,SVR -CODE:C -PRIORITY:+3 - -STAND:LFPG:A02:49.001942:2.560117:25 -USE:A -NON-SCHENGEN -CALLSIGN:DAH,KZR,ACA,SEY,THT,AAL,BAW,CPA,ETD,ETH,CHH,OMA,RJA,XLF -CODE:C -PRIORITY:+3 - -STAND:LFPG:Y08:49.014028:2.538544:25 -USE:A -NON-SCHENGEN -CALLSIGN:AEE,EIN,CCA,ANA,AAR,TCV,CRC,9BQ,MSR,EVA,KAC,DJT,NAX,PIA,QTR,RAM,SIA,ALK,TAM,DTH,THA,THY,UAL,SVR -CODE:E -PRIORITY:+3 - -STAND:LFPG:A03:48.999881:2.561539:25 -USE:A -NON-SCHENGEN -CALLSIGN:DAH,KZR,ACA,SEY,THT,AAL,BAW,CPA,ETD,ETH,CHH,OMA,RJA,XLF -CODE:E -PRIORITY:+1 - -STAND:LFPG:Y09:49.014061:2.53805:25 -USE:A -NON-SCHENGEN -CALLSIGN:AEE,EIN,CCA,ANA,AAR,TCV,CRC,9BQ,MSR,EVA,KAC,DJT,NAX,PIA,QTR,RAM,SIA,ALK,TAM,DTH,THA,THY,UAL,SVR -CODE:F -PRIORITY:+3 - -STAND:LFPG:A04:49.002006:2.560472:25 -USE:A -NON-SCHENGEN -CALLSIGN:DAH,KZR,ACA,SEY,THT,AAL,BAW,CPA,ETD,ETH,CHH,OMA,RJA,XLF -CODE:C -PRIORITY:+3 - -STAND:LFPG:Y49:49.014875:2.537658:25 -USE:A -NON-SCHENGEN - -CODE:C -PRIORITY:+1 - -STAND:LFPG:A05:48.999931:2.562447:25 -USE:A -NON-SCHENGEN -CALLSIGN:DAH,KZR,ACA,SEY,THT,AAL,BAW,CPA,ETD,ETH,CHH,OMA,RJA,XLF -CODE:E -PRIORITY:+1 - -STAND:LFPG:Z01:49.013681:2.538803:25 -USE:A -NON-SCHENGEN -CALLSIGN:AEE,EIN,CCA,ANA,AAR,TCV,CRC,9BQ,MSR,EVA,KAC,DJT,NAX,PIA,QTR,RAM,SIA,ALK,TAM,DTH,THA,THY,UAL,SVR -CODE:C -PRIORITY:+3 - -STAND:LFPG:A06:49.00195:2.560528:25 -USE:A -NON-SCHENGEN -CALLSIGN:DAH,KZR,ACA,SEY,THT,AAL,BAW,CPA,ETD,ETH,CHH,OMA,RJA,XLF -CODE:C -PRIORITY:+3 - -STAND:LFPG:Z02:49.013542:2.537986:25 -USE:A -NON-SCHENGEN -CALLSIGN:AEE,EIN,CCA,ANA,AAR,TCV,CRC,9BQ,MSR,EVA,KAC,DJT,NAX,PIA,QTR,RAM,SIA,ALK,TAM,DTH,THA,THY,UAL,SVR -CODE:C -PRIORITY:+3 - -STAND:LFPG:A07:48.999981:2.563367:25 -USE:A -NON-SCHENGEN -CALLSIGN:DAH,KZR,ACA,SEY,THT,AAL,BAW,CPA,ETD,ETH,CHH,OMA,RJA,XLF -CODE:E -PRIORITY:+1 - -STAND:LFPG:Z03:49.013633:2.53865:25 -USE:A -NON-SCHENGEN -CALLSIGN:AEE,EIN,CCA,ANA,AAR,TCV,CRC,9BQ,MSR,EVA,KAC,DJT,NAX,PIA,QTR,RAM,SIA,ALK,TAM,DTH,THA,THY,UAL,SVR -CODE:C -PRIORITY:+3 - -STAND:LFPG:A08:49.001931:2.561214:25 -USE:A -NON-SCHENGEN -CALLSIGN:DAH,KZR,ACA,SEY,THT,AAL,BAW,CPA,ETD,ETH,CHH,OMA,RJA,XLF -CODE:C -PRIORITY:+3 - -STAND:LFPG:Z04:49.012939:2.538333:25 -USE:A -NON-SCHENGEN -CALLSIGN:AEE,EIN,CCA,ANA,AAR,TCV,CRC,9BQ,MSR,EVA,KAC,DJT,NAX,PIA,QTR,RAM,SIA,ALK,TAM,DTH,THA,THY,UAL,SVR -CODE:E -PRIORITY:+3 - -STAND:LFPG:A09:49.000028:2.564286:25 -USE:A -NON-SCHENGEN -CALLSIGN:DAH,KZR,ACA,SEY,THT,AAL,BAW,CPA,ETD,ETH,CHH,OMA,RJA,XLF -CODE:C -PRIORITY:+1 - -STAND:LFPG:Z05:49.012511:2.538939:25 -USE:A -NON-SCHENGEN -CALLSIGN:AEE,EIN,CCA,ANA,AAR,TCV,CRC,9BQ,MSR,EVA,KAC,DJT,NAX,PIA,QTR,RAM,SIA,ALK,TAM,DTH,THA,THY,UAL,SVR -CODE:C -PRIORITY:+3 - -STAND:LFPG:A10:49.001842:2.561978:25 -USE:A -NON-SCHENGEN -CALLSIGN:DAH,KZR,ACA,SEY,THT,AAL,BAW,CPA,ETD,ETH,CHH,OMA,RJA,XLF -CODE:C -PRIORITY:+3 - -STAND:LFPG:Z06:49.01255:2.539739:25 -USE:A -NON-SCHENGEN -CALLSIGN:AEE,EIN,CCA,ANA,AAR,TCV,CRC,9BQ,MSR,EVA,KAC,DJT,NAX,PIA,QTR,RAM,SIA,ALK,TAM,DTH,THA,THY,UAL,SVR -CODE:C -PRIORITY:+3 - -STAND:LFPG:A12:49.001872:2.562706:25 -USE:A -NON-SCHENGEN -CALLSIGN:DAH,KZR,ACA,SEY,THT,AAL,BAW,CPA,ETD,ETH,CHH,OMA,RJA,XLF -CODE:C -PRIORITY:+3 - -STAND:LFPG:Z07:49.012725:2.540006:25 -USE:A -NON-SCHENGEN -CALLSIGN:AEE,EIN,CCA,ANA,AAR,TCV,CRC,9BQ,MSR,EVA,KAC,DJT,NAX,PIA,QTR,RAM,SIA,ALK,TAM,DTH,THA,THY,UAL,SVR -CODE:E -PRIORITY:+3 - -STAND:LFPG:A14:49.001975:2.563453:25 -USE:A -NON-SCHENGEN -CALLSIGN:DAH,KZR,ACA,SEY,THT,AAL,BAW,CPA,ETD,ETH,CHH,OMA,RJA,XLF -CODE:E -PRIORITY:+3 - -STAND:LFPG:Z08:49.013064:2.540022:25 -USE:A -NON-SCHENGEN -CALLSIGN:AEE,EIN,CCA,ANA,AAR,TCV,CRC,9BQ,MSR,EVA,KAC,DJT,NAX,PIA,QTR,RAM,SIA,ALK,TAM,DTH,THA,THY,UAL,SVR -CODE:C -PRIORITY:+3 - -STAND:LFPG:A30:49.0023:2.558264:25 -USE:A -NON-SCHENGEN -CALLSIGN:DAH,KZR,ACA,SEY,THT,AAL,BAW,CPA,ETD,ETH,CHH,OMA,RJA,XLF -CODE:C -PRIORITY:+3 - -STAND:LFPG:Z09:49.012875:2.539858:25 -USE:A -NON-SCHENGEN -CALLSIGN:AEE,EIN,CCA,ANA,AAR,TCV,CRC,9BQ,MSR,EVA,KAC,DJT,NAX,PIA,QTR,RAM,SIA,ALK,TAM,DTH,THA,THY,UAL,SVR -CODE:E -PRIORITY:+3 - -STAND:LFPG:A32:49.001922:2.558197:25 -USE:A -NON-SCHENGEN -CALLSIGN:DAH,KZR,ACA,SEY,THT,AAL,BAW,CPA,ETD,ETH,CHH,OMA,RJA,XLF -CODE:C -PRIORITY:+3 - -STAND:LFPG:M06:49.000386:2.546044:25 -USE:C -NON-SCHENGEN - -CODE:E -PRIORITY:+3 - -STAND:LFPG:A34:49.001883:2.558569:25 -USE:A -NON-SCHENGEN -CALLSIGN:DAH,KZR,ACA,SEY,THT,AAL,BAW,CPA,ETD,ETH,CHH,OMA,RJA,XLF -CODE:C -PRIORITY:+3 - -STAND:LFPG:M07:49.000347:2.544931:25 -USE:C -NON-SCHENGEN - -CODE:E -PRIORITY:+3 - -STAND:LFPG:A36:49.001831:2.55855:25 -USE:A -NON-SCHENGEN -CALLSIGN:DAH,KZR,ACA,SEY,THT,AAL,BAW,CPA,ETD,ETH,CHH,OMA,RJA,XLF -CODE:C -PRIORITY:+3 - -STAND:LFPG:M08:49.000294:2.543944:25 -USE:C -NON-SCHENGEN - -CODE:E -PRIORITY:+3 - -STAND:LFPG:A38:49.001697:2.559081:25 -USE:A -NON-SCHENGEN -CALLSIGN:DAH,KZR,ACA,SEY,THT,AAL,BAW,CPA,ETD,ETH,CHH,OMA,RJA,XLF -CODE:C -PRIORITY:+3 - -STAND:LFPG:M09:49.000189:2.542961:25 -USE:C -NON-SCHENGEN - -CODE:E -PRIORITY:+3 - -STAND:LFPG:C02:49.002047:2.565761:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFL,REU,AIC,MDG,UAE,ETD,GFA,JAI,KQA,SVA,UZB -CODE:F -PRIORITY:+3 - -STAND:LFPG:M10:49.00015:2.541969:25 -USE:C -NON-SCHENGEN - -CODE:E -PRIORITY:+3 - -STAND:LFPG:C02:49.002125:2.565903:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFL,REU,AIC,MDG,UAE,ETD,GFA,JAI,KQA,SVA,UZB -CODE:C -PRIORITY:+3 - -STAND:LFPG:M11:49.000097:2.540978:25 -USE:C -NON-SCHENGEN - -CODE:E -PRIORITY:+3 - -STAND:LFPG:C03:49.000294:2.566942:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFL,REU,AIC,MDG,UAE,ETD,GFA,JAI,KQA,SVA,UZB -CODE:E -PRIORITY:+1 - -STAND:LFPG:M12:49.000028:2.539825:25 -USE:C -NON-SCHENGEN -CALLSIGN:CLX -CODE:E -PRIORITY:+3 - -STAND:LFPG:C04:49.0021:2.566683:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFL,REU,AIC,MDG,UAE,ETD,GFA,JAI,KQA,SVA,UZB -CODE:E -PRIORITY:+3 - -STAND:LFPG:M13:49.000003:2.539067:25 -USE:C -NON-SCHENGEN - -CODE:E -PRIORITY:+3 - -STAND:LFPG:C04:49.0021:2.566683:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFL,REU,AIC,MDG,UAE,ETD,GFA,JAI,KQA,SVA,UZB -CODE:C -PRIORITY:+3 - -STAND:LFPG:M14:48.999944:2.538008:25 -USE:C -NON-SCHENGEN - -CODE:E -PRIORITY:+3 - -STAND:LFPG:C05:49.000206:2.567861:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFL,REU,AIC,MDG,UAE,ETD,GFA,JAI,KQA,SVA,UZB -CODE:E -PRIORITY:+1 - -STAND:LFPG:M15:48.999894:2.537044:25 -USE:C -NON-SCHENGEN - -CODE:E -PRIORITY:+3 - -STAND:LFPG:C06:49.002028:2.567372:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFL,REU,AIC,MDG,UAE,ETD,GFA,JAI,KQA,SVA,UZB -CODE:C -PRIORITY:+3 - -STAND:LFPG:N01:48.996722:2.531294:25 -USE:C -NON-SCHENGEN - -CODE:E -PRIORITY:+3 - -STAND:LFPG:C07:49.00025:2.568675:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFL,REU,AIC,MDG,UAE,ETD,GFA,JAI,KQA,SVA,UZB -CODE:E -PRIORITY:+1 - -STAND:LFPG:N02:48.996158:2.531322:25 -USE:C -NON-SCHENGEN - -CODE:E -PRIORITY:+3 - -STAND:LFPG:C08:49.002189:2.568208:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFL,REU,AIC,MDG,UAE,ETD,GFA,JAI,KQA,SVA,UZB -CODE:E -PRIORITY:+3 - -STAND:LFPG:N03:48.995606:2.531447:25 -USE:C -NON-SCHENGEN - -CODE:E -PRIORITY:+3 - -STAND:LFPG:C09:49.000258:2.568031:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFL,REU,AIC,MDG,UAE,ETD,GFA,JAI,KQA,SVA,UZB -CODE:C -PRIORITY:+1 - -STAND:LFPG:N31:48.995756:2.531481:25 -USE:C -NON-SCHENGEN - -CODE:E -PRIORITY:+2 - -STAND:LFPG:C10:49.002261:2.569625:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFL,REU,AIC,MDG,UAE,ETD,GFA,JAI,KQA,SVA,UZB -CODE:C -PRIORITY:+3 - -STAND:LFPG:N33:48.995442:2.531519:25 -USE:C -NON-SCHENGEN - -CODE:E -PRIORITY:+2 - -STAND:LFPG:C12:49.002261:2.568989:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFL,REU,AIC,MDG,UAE,ETD,GFA,JAI,KQA,SVA,UZB -CODE:E -PRIORITY:+3 - -STAND:LFPG:N04:48.995014:2.531714:25 -USE:C -NON-SCHENGEN - -CODE:E -PRIORITY:+3 - -STAND:LFPG:C16:49.002594:2.569625:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFL,REU,AIC,MDG,UAE,ETD,GFA,JAI,KQA,SVA,UZB -CODE:C -PRIORITY:+3 - -STAND:LFPG:N41:48.995114:2.531561:25 -USE:C -NON-SCHENGEN - -CODE:E -PRIORITY:+2 - -STAND:LFPG:D02:49.005339:2.569358:25 -USE:A -NON-SCHENGEN -CALLSIGN:ADR,AAF,ASL,AHY,BRU,LZB,CTN,EZY,EJU,TGZ,MGX,TUA,AUI,ADR,AAF,BTI,AMC,AUA,CSA,EZY,FIN -CODE:C -PRIORITY:+3 - -STAND:LFPG:N43:48.994808:2.531858:25 -USE:C -NON-SCHENGEN - -CODE:E -PRIORITY:+2 - -STAND:LFPG:D03:49.007367:2.568419:25 -USE:A -NON-SCHENGEN -CALLSIGN:ADR,AAF,ASL,AHY,BRU,LZB,CTN,EZY,EJU,TGZ,MGX,TUA,AUI,ADR,AAF,BTI,AMC,AUA,CSA,EZY,FIN -CODE:C -PRIORITY:+1 - -STAND:LFPG:N05:48.994325:2.531819:25 -USE:C -NON-SCHENGEN - -CODE:E -PRIORITY:+3 - -STAND:LFPG:D04:49.005431:2.569031:25 -USE:A -NON-SCHENGEN -CALLSIGN:ADR,AAF,ASL,AHY,BRU,LZB,CTN,EZY,EJU,TGZ,MGX,TUA,AUI,ADR,AAF,BTI,AMC,AUA,CSA,EZY,FIN -CODE:E -PRIORITY:+3 - -STAND:LFPG:N51:48.994444:2.531889:25 -USE:C -NON-SCHENGEN - -CODE:E -PRIORITY:+2 - -STAND:LFPG:D05:49.007306:2.567858:25 -USE:A -NON-SCHENGEN -CALLSIGN:ADR,AAF,ASL,AHY,BRU,LZB,CTN,EZY,EJU,TGZ,MGX,TUA,AUI,ADR,AAF,BTI,AMC,AUA,CSA,EZY,FIN -CODE:C -PRIORITY:+1 - -STAND:LFPG:N53:48.993908:2.531933:25 -USE:C -NON-SCHENGEN - -CODE:E -PRIORITY:+2 - -STAND:LFPG:D06:49.0054:2.568919:25 -USE:A -NON-SCHENGEN -CALLSIGN:ADR,AAF,ASL,AHY,BRU,LZB,CTN,EZY,EJU,TGZ,MGX,TUA,AUI,ADR,AAF,BTI,AMC,AUA,CSA,EZY,FIN -CODE:C -PRIORITY:+3 - -STAND:LFPG:D07:49.007281:2.567367:25 -USE:A -NON-SCHENGEN -CALLSIGN:ADR,AAF,ASL,AHY,BRU,LZB,CTN,EZY,EJU,TGZ,MGX,TUA,AUI,ADR,AAF,BTI,AMC,AUA,CSA,EZY,FIN -CODE:E -PRIORITY:+1 - -STAND:LFPG:D08:49.005589:2.568422:25 -USE:A -NON-SCHENGEN -CALLSIGN:ADR,AAF,ASL,AHY,BRU,LZB,CTN,EZY,EJU,TGZ,MGX,TUA,AUI,ADR,AAF,BTI,AMC,AUA,CSA,EZY,FIN -CODE:C -PRIORITY:+3 - -STAND:LFPG:D09:49.007281:2.567292:25 -USE:A -NON-SCHENGEN -CALLSIGN:ADR,AAF,ASL,AHY,BRU,LZB,CTN,EZY,TGZ,MGX,TUA,AUI,ADR,AAF,BTI,AMC,AUA,CSA,EZY,FIN,EJU -CODE:C -PRIORITY:+1 - -STAND:LFPG:D10:49.005483:2.568053:25 -USE:A -NON-SCHENGEN -CALLSIGN:ADR,AAF,ASL,AHY,BRU,LZB,CTN,EZY,TGZ,MGX,TUA,AUI,ADR,AAF,BTI,AMC,AUA,CSA,EZY,FIN,EJU -CODE:E -PRIORITY:+3 - -STAND:LFPG:D11:49.00725:2.566728:25 -USE:A -NON-SCHENGEN -CALLSIGN:ADR,AAF,ASL,AHY,BRU,LZB,CTN,EZY,TGZ,MGX,TUA,AUI,ADR,AAF,BTI,AMC,AUA,CSA,EZY,FIN,EJU -CODE:C -PRIORITY:+1 - -STAND:LFPG:D12:49.005528:2.568072:25 -USE:A -NON-SCHENGEN -CALLSIGN:ADR,AAF,ASL,AHY,BRU,LZB,CTN,EZY,TGZ,MGX,TUA,AUI,ADR,AAF,BTI,AMC,AUA,CSA,EZY,FIN,EJU -CODE:C -PRIORITY:+3 - -STAND:LFPG:D13:49.007239:2.566619:25 -USE:A -NON-SCHENGEN -CALLSIGN:ADR,AAF,ASL,AHY,BRU,LZB,CTN,EZY,TGZ,MGX,TUA,AUI,ADR,AAF,BTI,AMC,AUA,CSA,EZY,FIN,EJU -CODE:E -PRIORITY:+1 - -STAND:LFPG:D14:49.005561:2.567394:25 -USE:A -NON-SCHENGEN -CALLSIGN:ADR,AAF,ASL,AHY,BRU,LZB,CTN,EZY,TGZ,MGX,TUA,AUI,ADR,AAF,BTI,AMC,AUA,CSA,EZY,FIN,EJU -CODE:C -PRIORITY:+3 - -STAND:LFPG:D15:49.007219:2.566161:25 -USE:A -SCHENGEN - -CALLSIGN:ADR,AAF,ASL,AHY,BRU,LZB,CTN,EZY,TGZ,MGX,TUA,AUI,ADR,AAF,BTI,AMC,AUA,CSA,EZY,FIN,EJU -CODE:C -PRIORITY:+1 - -STAND:LFPG:D16:49.005556:2.56665:25 -USE:A -SCHENGEN - -CALLSIGN:ADR,AAF,ASL,AHY,BRU,LZB,CTN,EZY,TGZ,MGX,TUA,AUI,ADR,AAF,BTI,AMC,AUA,CSA,EZY,FIN,EJU -CODE:C -PRIORITY:+3 - -STAND:LFPG:D17:49.0072:2.565869:25 -USE:A -SCHENGEN - -CALLSIGN:ADR,AAF,ASL,AHY,BRU,LZB,CTN,EZY,TGZ,MGX,TUA,AUI,ADR,AAF,BTI,AMC,AUA,CSA,EZY,FIN,EJU -CODE:E -PRIORITY:+1 - -STAND:LFPG:D18:49.005481:2.565953:25 -USE:A -SCHENGEN - -CALLSIGN:ADR,AAF,ASL,AHY,BRU,LZB,CTN,EZY,TGZ,MGX,TUA,AUI,ADR,AAF,BTI,AMC,AUA,CSA,EZY,FIN,EJU -CODE:C -PRIORITY:+3 - -STAND:LFPG:D19:49.007189:2.565597:25 -USE:A -SCHENGEN - -CALLSIGN:ADR,AAF,ASL,AHY,BRU,LZB,CTN,EZY,TGZ,MGX,TUA,AUI,ADR,AAF,BTI,AMC,AUA,CSA,EZY,FIN,EJU -CODE:C -PRIORITY:+1 - -STAND:LFPG:D20:49.005417:2.565283:25 -USE:A -SCHENGEN - -CALLSIGN:ADR,AAF,ASL,AHY,BRU,LZB,CTN,EZY,TGZ,MGX,TUA,AUI,ADR,AAF,BTI,AMC,AUA,CSA,EZY,FIN,EJU -CODE:C -PRIORITY:+3 - -STAND:LFPG:D22:49.005211:2.565064:25 -USE:A -SCHENGEN - -CALLSIGN:ADR,AAF,ASL,AHY,BRU,LZB,CTN,EZY,TGZ,MGX,TUA,AUI,ADR,AAF,BTI,AMC,AUA,CSA,EZY,FIN,EJU -CODE:E -PRIORITY:+3 - -STAND:LFPG:D24:49.005183:2.565036:25 -USE:A -SCHENGEN - -CALLSIGN:ADR,AAF,ASL,AHY,BRU,LZB,CTN,EZY,TGZ,MGX,TUA,AUI,ADR,AAF,BTI,AMC,AUA,CSA,EZY,FIN,EJU -CODE:C -PRIORITY:+3 - -STAND:LFPG:E01:49.003667:2.584069:25 -USE:A -NON-SCHENGEN - -CODE:C -PRIORITY:+1 - -STAND:LFPG:E05:49.003283:2.584119:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN -CODE:C -PRIORITY:+3 - -STAND:LFPG:E09:49.002906:2.584206:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN -CODE:C -PRIORITY:+3 - -STAND:LFPG:E10:49.001214:2.573658:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN,ELY -CODE:C -PRIORITY:+3 - -STAND:LFPG:E12:49.001231:2.573881:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN,ELY -CODE:E -PRIORITY:+3 - -STAND:LFPG:E13:49.002525:2.584253:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN,ELY -CODE:C -PRIORITY:+3 - -STAND:LFPG:E14:49.001406:2.574419:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN,ELY -CODE:E -PRIORITY:+3 - -STAND:LFPG:E16:49.001347:2.574367:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN,ELY -CODE:C -PRIORITY:+3 - -STAND:LFPG:E17:49.002039:2.584311:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN,ELY -CODE:C -PRIORITY:+3 - -STAND:LFPG:E18:49.001506:2.575222:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN -CODE:E -PRIORITY:+3 - -STAND:LFPG:E20:49.001567:2.576206:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN -CODE:E -PRIORITY:+3 - -STAND:LFPG:E21:49.001658:2.584358:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN -CODE:C -PRIORITY:+3 - -STAND:LFPG:E22:49.00165:2.577192:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN -CODE:E -PRIORITY:+3 - -STAND:LFPG:E24:49.001711:2.578178:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN -CODE:E -PRIORITY:+3 - -STAND:LFPG:E25:49.001278:2.584406:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN -CODE:C -PRIORITY:+3 - -STAND:LFPG:E26:49.001747:2.579167:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN -CODE:E -PRIORITY:+3 - -STAND:LFPG:E29:49.000897:2.584453:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN -CODE:C -PRIORITY:+3 - -STAND:LFPG:E30:49.001742:2.580164:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN -CODE:E -PRIORITY:+3 - -STAND:LFPG:E32:49.001719:2.581128:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN -CODE:E -PRIORITY:+3 - -STAND:LFPG:E34:49.001703:2.5822:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN -CODE:E -PRIORITY:+3 - -STAND:LFPG:E38:49.002478:2.581344:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN -CODE:E -PRIORITY:+3 - -STAND:LFPG:E40:49.002625:2.580581:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN -CODE:E -PRIORITY:+3 - -STAND:LFPG:E42:49.002422:2.580289:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN -CODE:E -PRIORITY:+3 - -STAND:LFPG:E44:49.002586:2.579425:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN -CODE:E -PRIORITY:+3 - -STAND:LFPG:F02:49.005481:2.573622:25 -USE:A -SCHENGEN - -CALLSIGN:AFR,CCM,AEA,AZA,KLM,ITY -CODE:C -PRIORITY:+3 - -STAND:LFPG:F03:49.007436:2.583831:25 -USE:A -SCHENGEN - -CALLSIGN:AFR,CCM,AEA,AZA,KLM,ITY -CODE:E -PRIORITY:+3 - -STAND:LFPG:F04:49.005811:2.573536:25 -USE:A -SCHENGEN - -CALLSIGN:AFR,CCM,AEA,AZA,KLM,ITY -CODE:C -PRIORITY:+3 - -STAND:LFPG:F07:49.006814:2.583681:25 -USE:A -NON-SCHENGEN - -CODE:C -PRIORITY:+1 - -STAND:LFPG:F08:49.006181:2.573372:25 -USE:A -SCHENGEN - -CALLSIGN:AFR,CCM,AEA,AZA,KLM,ITY -CODE:C -PRIORITY:+3 - -STAND:LFPG:F09:49.006683:2.583922:25 -USE:A -SCHENGEN - -CALLSIGN:AFR,CCM,AEA,AZA,KLM -CODE:E -PRIORITY:+3 - -STAND:LFPG:F10:49.006497:2.573244:25 -USE:A -SCHENGEN - -CALLSIGN:AFR,CCM,AEA,AZA,KLM,ITY -CODE:C -PRIORITY:+3 - -STAND:LFPG:F13:49.006053:2.583775:25 -USE:A -NON-SCHENGEN - -CODE:C -PRIORITY:+1 - -STAND:LFPG:F14:49.006747:2.573286:25 -USE:A -SCHENGEN - -CALLSIGN:AFR,CCM,AEA,AZA,KLM,ITY -CODE:C -PRIORITY:+3 - -STAND:LFPG:F15:49.005911:2.584017:25 -USE:A -SCHENGEN - -CALLSIGN:AFR,CCM,AEA,AZA,KLM -CODE:E -PRIORITY:+3 - -STAND:LFPG:F16:49.006958:2.573594:25 -USE:A -SCHENGEN - -CALLSIGN:AFR,CCM,AEA,AZA,KLM,ITY -CODE:C -PRIORITY:+3 - -STAND:LFPG:F18:49.006933:2.573664:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,CCM,AEA,AZA,KLM,ITY -CODE:C -PRIORITY:+1 - -STAND:LFPG:F20:49.007089:2.573986:25 -USE:A -SCHENGEN - -CALLSIGN:AFR,CCM,AEA,AZA,KLM,ITY -CODE:C -PRIORITY:+3 - -STAND:LFPG:F22:49.007133:2.574433:25 -USE:A -SCHENGEN - -CALLSIGN:AFR,CCM,AEA,AZA,KLM,ITY -CODE:C -PRIORITY:+3 - -STAND:LFPG:F26:49.007075:2.575136:25 -USE:A -SCHENGEN - -CALLSIGN:AFR,CCM,AEA,AZA,KLM,ITY -CODE:C -PRIORITY:+3 - -STAND:LFPG:F28:49.007036:2.575261:25 -USE:A -SCHENGEN - -CALLSIGN:AFR,CCM,AEA,AZA,KLM,ITY -CODE:E -PRIORITY:+3 - -STAND:LFPG:F30:49.006883:2.575528:25 -USE:A -SCHENGEN - -CALLSIGN:AFR,CCM,AEA,AZA,KLM,ITY -CODE:C -PRIORITY:+3 - -STAND:LFPG:F32:49.006567:2.575617:25 -USE:A -SCHENGEN - -CALLSIGN:AFR,CCM,AEA,AZA,KLM,ITY -CODE:C -PRIORITY:+3 - -STAND:LFPG:F34:49.006269:2.575844:25 -USE:A -SCHENGEN - -CALLSIGN:AFR,CCM,AEA,AZA,KLM,ITY -CODE:C -PRIORITY:+3 - -STAND:LFPG:F66:49.006308:2.577717:25 -USE:A -SCHENGEN - -CALLSIGN:AFR,CCM,AEA,AZA,KLM,ITY -CODE:C -PRIORITY:+3 - -STAND:LFPG:F68:49.006619:2.577719:25 -USE:A -SCHENGEN - -CALLSIGN:AFR,CCM,AEA,AZA,KLM,ITY -CODE:C -PRIORITY:+3 - -STAND:LFPG:F70:49.007:2.577772:25 -USE:A -SCHENGEN - -CALLSIGN:AFR,CCM,AEA,AZA,KLM,ITY -CODE:C -PRIORITY:+3 - -STAND:LFPG:F72:49.007022:2.577742:25 -USE:A -SCHENGEN - -CALLSIGN:AFR,CCM,AEA,AZA,KLM,ITY -CODE:C -PRIORITY:+3 - -STAND:LFPG:F74:49.006956:2.577761:25 -USE:A -SCHENGEN - -CALLSIGN:AFR,CCM,AEA,AZA,KLM,ITY -CODE:E -PRIORITY:+3 - -STAND:LFPG:F76:49.007197:2.577961:25 -USE:A -SCHENGEN - -CALLSIGN:AFR,CCM,AEA,AZA,KLM,ITY -CODE:C -PRIORITY:+3 - -STAND:LFPG:F80:49.007325:2.578461:25 -USE:A -SCHENGEN - -CALLSIGN:AFR,CCM,AEA,AZA,KLM,ITY -CODE:C -PRIORITY:+3 - -STAND:LFPG:F82:49.007336:2.579128:25 -USE:A -SCHENGEN - -CALLSIGN:AFR,CCM,AEA,AZA,KLM,ITY -CODE:C -PRIORITY:+3 - -STAND:LFPG:F84:49.007333:2.579525:25 -USE:A -SCHENGEN - -CALLSIGN:AFR,CCM,AEA,AZA,KLM,ITY -CODE:C -PRIORITY:+3 - -STAND:LFPG:F86:49.007114:2.579925:25 -USE:A -SCHENGEN - -CALLSIGN:AFR,CCM,AEA,AZA,KLM,ITY -CODE:C -PRIORITY:+3 - -STAND:LFPG:F90:49.006831:2.580017:25 -USE:A -SCHENGEN - -CALLSIGN:AFR,CCM,AEA,AZA,KLM,ITY -CODE:C -PRIORITY:+3 - -STAND:LFPG:F92:49.006503:2.579967:25 -USE:A -SCHENGEN - -CALLSIGN:AFR,CCM,AEA,AZA,KLM,ITY -CODE:C -PRIORITY:+3 - -STAND:LFPG:F94:49.006158:2.580097:25 -USE:A -SCHENGEN - -CALLSIGN:AFR,CCM,AEA,AZA,KLM,ITY -CODE:C -PRIORITY:+3 - -STAND:LFPG:F96:49.005836:2.580056:25 -USE:A -SCHENGEN - -CALLSIGN:AFR,CCM,AEA,AZA,KLM,ITY -CODE:C -PRIORITY:+3 - -STAND:LFPG:J01:49.004172:2.597847:25 -USE:A -SCHENGEN - -CALLSIGN:AFR,LGL,HOP -CODE:B -PRIORITY:+1 - -STAND:LFPG:J02:49.003911:2.597886:25 -USE:A -SCHENGEN - -CALLSIGN:AFR,LGL,HOP -CODE:B -PRIORITY:+1 - -STAND:LFPG:J03:49.0036:2.597925:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,LGL,HOP -CODE:B -PRIORITY:+1 - -STAND:LFPG:J04:49.003622:2.598339:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,LGL,HOP -CODE:B -PRIORITY:+1 - -STAND:LFPG:J05:49.004042:2.598328:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,LGL,HOP -CODE:B -PRIORITY:+1 - -STAND:LFPG:J06:49.004339:2.598317:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,LGL,HOP -CODE:B -PRIORITY:+1 - -STAND:LFPG:J10:49.004844:2.600075:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,LGL,HOP -CODE:B -PRIORITY:+3 - -STAND:LFPG:J11:49.004464:2.600122:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,LGL,HOP -CODE:B -PRIORITY:+3 - -STAND:LFPG:J12:49.004131:2.600164:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,LGL,HOP -CODE:B -PRIORITY:+3 - -STAND:LFPG:J13:49.003869:2.600069:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,LGL,HOP -CODE:B -PRIORITY:+3 - -STAND:LFPG:J14:49.003908:2.600356:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,LGL,HOP -CODE:B -PRIORITY:+3 - -STAND:LFPG:J16:49.003969:2.600808:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,LGL,HOP -CODE:B -PRIORITY:+3 - -STAND:LFPG:J17:49.003964:2.601117:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,LGL,HOP -CODE:C -PRIORITY:+1 - -STAND:LFPG:J18:49.004142:2.601014:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,LGL,HOP -CODE:B -PRIORITY:+3 - -STAND:LFPG:J19:49.004336:2.600978:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,LGL,HOP -CODE:C -PRIORITY:+1 - -STAND:LFPG:J20:49.004447:2.600942:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,LGL,HOP -CODE:B -PRIORITY:+3 - -STAND:LFPG:J21:49.004744:2.600925:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,LGL,HOP -CODE:B -PRIORITY:+3 - -STAND:LFPG:J30:49.004847:2.602822:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,LGL,HOP -CODE:B -PRIORITY:+3 - -STAND:LFPG:J31:49.004558:2.602883:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,LGL,HOP -CODE:B -PRIORITY:+3 - -STAND:LFPG:J32:49.004439:2.602881:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,LGL,HOP -CODE:B -PRIORITY:+3 - -STAND:LFPG:J33:49.004175:2.602878:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,LGL,HOP -CODE:B -PRIORITY:+3 - -STAND:LFPG:J34:49.003903:2.60285:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,LGL,HOP -CODE:B -PRIORITY:+3 - -STAND:LFPG:J35:49.004056:2.603108:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,LGL,HOP -CODE:B -PRIORITY:+3 - -STAND:LFPG:J37:49.004117:2.603586:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,LGL,HOP -CODE:B -PRIORITY:+3 - -STAND:LFPG:J38:49.003908:2.603931:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,LGL,HOP -CODE:B -PRIORITY:+3 - -STAND:LFPG:J39:49.004311:2.603775:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,LGL,HOP -CODE:B -PRIORITY:+3 - -STAND:LFPG:J40:49.004625:2.603622:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,LGL,HOP -CODE:B -PRIORITY:+3 - -STAND:LFPG:J41:49.004994:2.603647:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,LGL,HOP -CODE:B -PRIORITY:+3 - -STAND:LFPG:I14:49.011508:2.505825:25 -USE:C -NON-SCHENGEN -CALLSIGN:FDX -CODE:E -PRIORITY:+3 - -STAND:LFPG:I15:49.010972:2.505811:25 -USE:C -NON-SCHENGEN -CALLSIGN:FDX -CODE:E -PRIORITY:+3 - -STAND:LFPG:I16:49.010861:2.505892:25 -USE:C -NON-SCHENGEN -CALLSIGN:FDX -CODE:E -PRIORITY:+3 - -STAND:LFPG:I17:49.010439:2.505878:25 -USE:C -NON-SCHENGEN -CALLSIGN:FDX -CODE:E -PRIORITY:+3 - -STAND:LFPG:I18:49.010214:2.505972:25 -USE:C -NON-SCHENGEN -CALLSIGN:FDX -CODE:E -PRIORITY:+3 - -STAND:LFPG:I19:49.009906:2.505944:25 -USE:C -NON-SCHENGEN -CALLSIGN:FDX -CODE:E -PRIORITY:+3 - -STAND:LFPG:I20:49.013128:2.502617:25 -USE:C -NON-SCHENGEN -CALLSIGN:FDX -CODE:E -PRIORITY:+3 - -STAND:LFPG:I21:49.012511:2.502306:25 -USE:C -NON-SCHENGEN -CALLSIGN:FDX -CODE:E -PRIORITY:+3 - -STAND:LFPG:I22:49.012331:2.502125:25 -USE:C -NON-SCHENGEN -CALLSIGN:FDX -CODE:E -PRIORITY:+3 - -STAND:LFPG:I23:49.011978:2.502372:25 -USE:C -NON-SCHENGEN -CALLSIGN:FDX -CODE:E -PRIORITY:+3 - -STAND:LFPG:I24:49.011444:2.502442:25 -USE:C -NON-SCHENGEN -CALLSIGN:FDX -CODE:E -PRIORITY:+3 - -STAND:LFPG:I25:49.010911:2.502508:25 -USE:C -NON-SCHENGEN -CALLSIGN:FDX -CODE:E -PRIORITY:+3 - -STAND:LFPG:I26:49.010536:2.502347:25 -USE:C -NON-SCHENGEN -CALLSIGN:FDX -CODE:E -PRIORITY:+3 - -STAND:LFPG:I27:49.010367:2.502367:25 -USE:C -NON-SCHENGEN -CALLSIGN:FDX -CODE:E -PRIORITY:+3 - -STAND:LFPG:I30:49.015075:2.503206:25 -USE:C -NON-SCHENGEN -CALLSIGN:FDX -CODE:E -PRIORITY:+1 - -STAND:LFPG:I31:49.015036:2.502492:25 -USE:C -NON-SCHENGEN -CALLSIGN:FDX -CODE:E -PRIORITY:+1 - -STAND:LFPG:I32:49.014997:2.501775:25 -USE:C -NON-SCHENGEN -CALLSIGN:FDX -CODE:E -PRIORITY:+1 - -STAND:LFPG:I33:49.014947:2.500825:25 -USE:C -NON-SCHENGEN -CALLSIGN:FDX -CODE:E -PRIORITY:+1 - -STAND:LFPG:I34:49.014908:2.500111:25 -USE:C -NON-SCHENGEN -CALLSIGN:FDX -CODE:E -PRIORITY:+1 - -STAND:LFPG:I41:49.013383:2.502853:25 -USE:C -NON-SCHENGEN -CALLSIGN:FDX -CODE:E -PRIORITY:+3 - -STAND:LFPG:I42:49.013183:2.502228:25 -USE:C -NON-SCHENGEN -CALLSIGN:FDX -CODE:E -PRIORITY:+3 - -STAND:LFPG:I43:49.013128:2.501197:25 -USE:C -NON-SCHENGEN -CALLSIGN:FDX -CODE:E -PRIORITY:+3 - -STAND:LFPG:I44:49.013083:2.500389:25 -USE:C -NON-SCHENGEN -CALLSIGN:FDX -CODE:E -PRIORITY:+3 - -STAND:LFPG:I45:49.013042:2.499578:25 -USE:C -NON-SCHENGEN -CALLSIGN:FDX -CODE:E -PRIORITY:+3 - -STAND:LFPG:I46:49.012994:2.498767:25 -USE:C -NON-SCHENGEN -CALLSIGN:FDX -CODE:E -PRIORITY:+3 - -STAND:LFPG:I47:49.012953:2.497956:25 -USE:C -NON-SCHENGEN -CALLSIGN:FDX -CODE:E -PRIORITY:+3 - -STAND:LFPG:I48:49.0129:2.496983:25 -USE:C -NON-SCHENGEN -CALLSIGN:FDX -CODE:E -PRIORITY:+3 - -STAND:LFPG:I49:49.012856:2.496172:25 -USE:C -NON-SCHENGEN -CALLSIGN:FDX -CODE:E -PRIORITY:+3 - -STAND:LFPG:I50:49.012722:2.495375:25 -USE:C -NON-SCHENGEN -CALLSIGN:FDX -CODE:E -PRIORITY:+3 - -STAND:LFPG:I51:49.012461:2.494597:25 -USE:C -NON-SCHENGEN -CALLSIGN:FDX -CODE:E -PRIORITY:+3 - -STAND:LFPG:I52:49.012231:2.494703:25 -USE:C -NON-SCHENGEN -CALLSIGN:FDX -CODE:E -PRIORITY:+3 - -STAND:LFPG:I53:49.011925:2.494594:25 -USE:C -NON-SCHENGEN -CALLSIGN:FDX -CODE:E -PRIORITY:+3 - -STAND:LFPG:I54:49.011581:2.494783:25 -USE:C -NON-SCHENGEN -CALLSIGN:FDX -CODE:E -PRIORITY:+3 - -STAND:LFPG:I55:49.011392:2.494656:25 -USE:C -NON-SCHENGEN -CALLSIGN:FDX -CODE:E -PRIORITY:+3 - -STAND:LFPG:Q01:49.011536:2.5529:25 -USE:A -NON-SCHENGEN -CALLSIGN:TSC,AIZ,KKK,BMR,CRL,IBS,JAF,EXS,ISS,NLY,LBT,OHY,PGT,SXS,TUX,VLG,AEE,MSC,AMV,FPO,AZI,CAI,ENT,FHY, -CODE:C -PRIORITY:+3 - -STAND:LFPG:Q02:49.011581:2.553769:25 -USE:A -NON-SCHENGEN -CALLSIGN:TSC,AIZ,KKK,BMR,CRL,IBS,JAF,EXS,ISS,NLY,LBT,OHY,PGT,SXS,TUX,VLG,AEE,MSC,AMV,FPO,AZI,CAI,ENT,FHY, -CODE:C -PRIORITY:+3 - -STAND:LFPG:Q03:49.0116:2.554022:25 -USE:A -NON-SCHENGEN -CALLSIGN:TSC,AIZ,KKK,BMR,CRL,IBS,JAF,EXS,ISS,NLY,LBT,OHY,PGT,SXS,TUX,VLG,AEE,MSC,AMV,FPO,AZI,CAI,ENT,FHY, -CODE:C -PRIORITY:+3 - -STAND:LFPG:Q04:49.011611:2.554311:25 -USE:A -NON-SCHENGEN -CALLSIGN:TSC,AIZ,KKK,BMR,CRL,IBS,JAF,EXS,ISS,NLY,LBT,OHY,PGT,SXS,TUX,VLG,AEE,MSC,AMV,FPO,AZI,CAI,ENT,FHY, -CODE:C -PRIORITY:+3 - -STAND:LFPG:Q05:49.011639:2.554856:25 -USE:A -NON-SCHENGEN -CALLSIGN:TSC,AIZ,KKK,BMR,CRL,IBS,JAF,EXS,ISS,NLY,LBT,OHY,PGT,SXS,TUX,VLG,AEE,MSC,AMV,FPO,AZI,CAI,ENT,FHY, -CODE:C -PRIORITY:+3 - -STAND:LFPG:Q06:49.011658:2.555094:25 -USE:A -NON-SCHENGEN -CALLSIGN:TSC,AIZ,KKK,BMR,CRL,IBS,JAF,EXS,ISS,NLY,LBT,OHY,PGT,SXS,TUX,VLG,AEE,MSC,AMV,FPO,AZI,CAI,ENT,FHY, -CODE:C -PRIORITY:+3 - -STAND:LFPG:Q07:49.011669:2.555403:25 -USE:A -NON-SCHENGEN -CALLSIGN:TSC,AIZ,KKK,BMR,CRL,IBS,JAF,EXS,ISS,NLY,LBT,OHY,PGT,SXS,TUX,VLG,AEE,MSC,AMV,FPO,AZI,CAI,ENT,FHY, -CODE:C -PRIORITY:+3 - -STAND:LFPG:Q08:49.011697:2.555947:25 -USE:A -NON-SCHENGEN -CALLSIGN:TSC,AIZ,KKK,BMR,CRL,IBS,JAF,EXS,ISS,NLY,LBT,OHY,PGT,SXS,TUX,VLG,AEE,MSC,AMV,FPO,AZI,CAI,ENT,FHY, -CODE:C -PRIORITY:+3 - -STAND:LFPG:Q09:49.011722:2.556217:25 -USE:A -NON-SCHENGEN -CALLSIGN:TSC,AIZ,KKK,BMR,CRL,IBS,JAF,EXS,ISS,NLY,LBT,OHY,PGT,SXS,TUX,VLG,AEE,MSC,AMV,FPO,AZI,CAI,ENT,FHY, -CODE:C -PRIORITY:+3 - -STAND:LFPG:Q10:49.011728:2.556492:25 -USE:A -NON-SCHENGEN -CALLSIGN:TSC,AIZ,KKK,BMR,CRL,IBS,JAF,EXS,ISS,NLY,LBT,OHY,PGT,SXS,TUX,VLG,AEE,MSC,AMV,FPO,AZI,CAI,ENT,FHY, -CODE:C -PRIORITY:+3 - -STAND:LFPG:Q11:49.011756:2.557036:25 -USE:A -NON-SCHENGEN -CALLSIGN:TSC,AIZ,KKK,BMR,CRL,IBS,JAF,EXS,ISS,NLY,LBT,OHY,PGT,SXS,TUX,VLG,AEE,MSC,AMV,FPO,AZI,CAI,ENT,FHY, -CODE:C -PRIORITY:+3 - -STAND:LFPG:Q12:49.013633:2.556625:25 -USE:A -NON-SCHENGEN -CALLSIGN:TSC,AIZ,KKK,BMR,CRL,IBS,JAF,EXS,ISS,NLY,LBT,OHY,PGT,SXS,TUX,VLG,AEE,MSC,AMV,FPO,AZI,CAI,ENT,FHY, -CODE:C -PRIORITY:+3 - -STAND:LFPG:Q13:49.013631:2.556497:25 -USE:A -NON-SCHENGEN -CALLSIGN:TSC,AIZ,KKK,BMR,CRL,IBS,JAF,EXS,ISS,NLY,LBT,OHY,PGT,SXS,TUX,VLG,AEE,MSC,AMV,FPO,AZI,CAI,ENT,FHY, -CODE:C -PRIORITY:+3 - -STAND:LFPG:Q14:49.013603:2.556003:25 -USE:A -NON-SCHENGEN -CALLSIGN:TSC,AIZ,KKK,BMR,CRL,IBS,JAF,EXS,ISS,NLY,LBT,OHY,PGT,SXS,TUX,VLG,AEE,MSC,AMV,FPO,AZI,CAI,ENT,FHY, -CODE:C -PRIORITY:+3 - -STAND:LFPG:Q15:49.013581:2.555511:25 -USE:A -NON-SCHENGEN -CALLSIGN:TSC,AIZ,KKK,BMR,CRL,IBS,JAF,EXS,ISS,NLY,LBT,OHY,PGT,SXS,TUX,VLG,AEE,MSC,AMV,FPO,AZI,CAI,ENT,FHY, -CODE:C -PRIORITY:+3 - -STAND:LFPG:Q15:49.013567:2.555367:25 -USE:A -NON-SCHENGEN -CALLSIGN:TSC,AIZ,KKK,BMR,CRL,IBS,JAF,EXS,ISS,NLY,LBT,OHY,PGT,SXS,TUX,VLG,AEE,MSC,AMV,FPO,AZI,CAI,ENT,FHY, -CODE:C -PRIORITY:+3 - -STAND:LFPG:Q17:49.013528:2.554656:25 -USE:A -NON-SCHENGEN -CALLSIGN:TSC,AIZ,KKK,BMR,CRL,IBS,JAF,EXS,ISS,NLY,LBT,OHY,PGT,SXS,TUX,VLG,AEE,MSC,AMV,FPO,AZI,CAI,ENT,FHY, -CODE:C -PRIORITY:+3 - -STAND:LFPG:Q18:49.013522:2.554489:25 -USE:A -NON-SCHENGEN -CALLSIGN:TSC,AIZ,KKK,BMR,CRL,IBS,JAF,EXS,ISS,NLY,LBT,OHY,PGT,SXS,TUX,VLG,AEE,MSC,AMV,FPO,AZI,CAI,ENT,FHY, -CODE:C -PRIORITY:+3 - -STAND:LFPG:Q19:49.013492:2.554033:25 -USE:A -NON-SCHENGEN -CALLSIGN:TSC,AIZ,KKK,BMR,CRL,IBS,JAF,EXS,ISS,NLY,LBT,OHY,PGT,SXS,TUX,VLG,AEE,MSC,AMV,FPO,AZI,CAI,ENT,FHY, -CODE:C -PRIORITY:+3 - -STAND:LFPG:Q20:49.013469:2.5535:25 -USE:A -NON-SCHENGEN -CALLSIGN:TSC,AIZ,KKK,BMR,CRL,IBS,JAF,EXS,ISS,NLY,LBT,OHY,PGT,SXS,TUX,VLG,AEE,MSC,AMV,FPO,AZI,CAI,ENT,FHY, -CODE:C -PRIORITY:+3 - -STAND:LFPG:Q21:49.013458:2.553397:25 -USE:A -NON-SCHENGEN -CALLSIGN:TSC,AIZ,KKK,BMR,CRL,IBS,JAF,EXS,ISS,NLY,LBT,OHY,PGT,SXS,TUX,VLG,AEE,MSC,AMV,FPO,AZI,CAI,ENT,FHY, -CODE:C -PRIORITY:+3 - -STAND:LFPG:K01:49.00755:2.585256:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN -CODE:E -PRIORITY:+3 - -STAND:LFPG:K05:49.007481:2.585244:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN -CODE:F -PRIORITY:+3 - -STAND:LFPG:K09:49.006881:2.585339:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN -CODE:F -PRIORITY:+3 - -STAND:LFPG:K13:49.006294:2.585408:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN -CODE:F -PRIORITY:+3 - -STAND:LFPG:K17:49.006228:2.585419:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN -CODE:E -PRIORITY:+3 - -STAND:LFPG:K21:49.005578:2.5855:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN -CODE:F -PRIORITY:+3 - -STAND:LFPG:K26:49.0077:2.589967:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN -CODE:F -PRIORITY:+3 - -STAND:LFPG:K32:49.00705:2.589828:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN -CODE:F -PRIORITY:+3 - -STAND:LFPG:K38:49.006494:2.589906:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN -CODE:F -PRIORITY:+3 - -STAND:LFPG:K44:49.00575:2.589986:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN -CODE:F -PRIORITY:+3 - -STAND:LFPG:K52:49.003953:2.590206:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN -CODE:F -PRIORITY:+3 - -STAND:LFPG:K53:49.003639:2.585717:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN -CODE:F -PRIORITY:+3 - -STAND:LFPG:K58:49.003303:2.590369:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN -CODE:F -PRIORITY:+3 - -STAND:LFPG:K59:49.002833:2.585836:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN -CODE:F -PRIORITY:+3 - -STAND:LFPG:K64:49.002653:2.590369:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN -CODE:F -PRIORITY:+3 - -STAND:LFPG:K65:49.002028:2.585936:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN -CODE:F -PRIORITY:+3 - -STAND:LFPG:K70:49.002003:2.590447:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN -CODE:F -PRIORITY:+3 - -STAND:LFPG:K71:49.001389:2.586003:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN -CODE:F -PRIORITY:+3 - -STAND:LFPG:K76:49.001347:2.590528:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN -CODE:F -PRIORITY:+3 - -STAND:LFPG:L27:49.007747:2.591078:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN -CODE:F -PRIORITY:+3 - -STAND:LFPG:L33:49.007144:2.591175:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN -CODE:F -PRIORITY:+3 - -STAND:LFPG:L39:49.006181:2.591272:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN -CODE:F -PRIORITY:+3 - -STAND:LFPG:L53:49.003878:2.591636:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN -CODE:F -PRIORITY:+3 - -STAND:LFPG:L59:49.003094:2.591731:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN -CODE:F -PRIORITY:+3 - -STAND:LFPG:L65:49.002308:2.591828:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN -CODE:F -PRIORITY:+3 - -STAND:LFPG:L71:49.001525:2.591925:25 -USE:A -NON-SCHENGEN -CALLSIGN:AFR,AMX,MAU,CES,CSN,DAL,BEE,JAL,KAL,MEA,ROT,HVN -CODE:F -PRIORITY:+3 - -STAND:LFPG:T01:49.013022:2.544289:25 -USE:A -NON-SCHENGEN -CALLSIGN:AEE,EIN,CCA,ANA,AAR,TCV,CRC,9BQ,MSR,EVA,KAC,DJT,NAX,PIA,QTR,RAM,SIA,ALK,TAM,DTH,THA,THY,UAL,SVR -CODE:C -PRIORITY:+3 - -STAND:LFPG:T02:49.012689:2.544464:25 -USE:A -NON-SCHENGEN -CALLSIGN:AEE,EIN,CCA,ANA,AAR,TCV,CRC,9BQ,MSR,EVA,KAC,DJT,NAX,PIA,QTR,RAM,SIA,ALK,TAM,DTH,THA,THY,UAL,SVR -CODE:C -PRIORITY:+3 - -STAND:LFPG:T03:49.012722:2.544667:25 -USE:A -NON-SCHENGEN -CALLSIGN:AEE,EIN,CCA,ANA,AAR,TCV,CRC,9BQ,MSR,EVA,KAC,DJT,NAX,PIA,QTR,RAM,SIA,ALK,TAM,DTH,THA,THY,UAL,SVR -CODE:C -PRIORITY:+3 - -STAND:LFPG:T04:49.013128:2.545525:25 -USE:A -NON-SCHENGEN -CALLSIGN:AEE,EIN,CCA,ANA,AAR,TCV,CRC,9BQ,MSR,EVA,KAC,DJT,NAX,PIA,QTR,RAM,SIA,ALK,TAM,DTH,THA,THY,UAL,SVR -CODE:C -PRIORITY:+3 - -STAND:LFPG:T05:49.013656:2.545825:25 -USE:A -NON-SCHENGEN -CALLSIGN:AEE,EIN,CCA,ANA,AAR,TCV,CRC,9BQ,MSR,EVA,KAC,DJT,NAX,PIA,QTR,RAM,SIA,ALK,TAM,DTH,THA,THY,UAL,SVR -CODE:C -PRIORITY:+3 - -STAND:LFPG:T06:49.013997:2.545292:25 -USE:A -NON-SCHENGEN -CALLSIGN:AEE,EIN,CCA,ANA,AAR,TCV,CRC,9BQ,MSR,EVA,KAC,DJT,NAX,PIA,QTR,RAM,SIA,ALK,TAM,DTH,THA,THY,UAL,SVR -CODE:C -PRIORITY:+3 - -STAND:LFPG:T07:49.014044:2.544536:25 -USE:A -NON-SCHENGEN -CALLSIGN:AEE,EIN,CCA,ANA,AAR,TCV,CRC,9BQ,MSR,EVA,KAC,DJT,NAX,PIA,QTR,RAM,SIA,ALK,TAM,DTH,THA,THY,UAL,SVR -CODE:C -PRIORITY:+3 - -STAND:LFPG:T08:49.013986:2.545133:25 -USE:A -NON-SCHENGEN -CALLSIGN:AEE,EIN,CCA,ANA,AAR,TCV,CRC,9BQ,MSR,EVA,KAC,DJT,NAX,PIA,QTR,RAM,SIA,ALK,TAM,DTH,THA,THY,UAL,SVR -CODE:C -PRIORITY:+3 - -STAND:LFPG:T09:49.013861:2.545603:25 -USE:A -NON-SCHENGEN -CALLSIGN:AEE,EIN,CCA,ANA,AAR,TCV,CRC,9BQ,MSR,EVA,KAC,DJT,NAX,PIA,QTR,RAM,SIA,ALK,TAM,DTH,THA,THY,UAL,SVR -CODE:C -PRIORITY:+3 - -STAND:LFPG:V01:49.015761:2.544328:25 -USE:A -NON-SCHENGEN -CALLSIGN:AEE,EIN,CCA,ANA,AAR,TCV,CRC,9BQ,MSR,EVA,KAC,DJT,NAX,PIA,QTR,RAM,SIA,ALK,TAM,DTH,THA,THY,UAL,SVR -CODE:C -PRIORITY:+3 - -STAND:LFPG:V02:49.016058:2.544989:25 -USE:A -NON-SCHENGEN -CALLSIGN:AEE,EIN,CCA,ANA,AAR,TCV,CRC,9BQ,MSR,EVA,KAC,DJT,NAX,PIA,QTR,RAM,SIA,ALK,TAM,DTH,THA,THY,UAL,SVR -CODE:C -PRIORITY:+3 - -STAND:LFPG:V03:49.015847:2.54445:25 -USE:A -NON-SCHENGEN -CALLSIGN:AEE,EIN,CCA,ANA,AAR,TCV,CRC,9BQ,MSR,EVA,KAC,DJT,NAX,PIA,QTR,RAM,SIA,ALK,TAM,DTH,THA,THY,UAL,SVR -CODE:C -PRIORITY:+3 - -STAND:LFPG:V04:49.016564:2.544386:25 -USE:A -NON-SCHENGEN -CALLSIGN:AEE,EIN,CCA,ANA,AAR,TCV,CRC,9BQ,MSR,EVA,KAC,DJT,NAX,PIA,QTR,RAM,SIA,ALK,TAM,DTH,THA,THY,UAL,SVR -CODE:F -PRIORITY:+3 - -STAND:LFPG:V05:49.01685:2.54365:25 -USE:A -NON-SCHENGEN -CALLSIGN:AEE,EIN,CCA,ANA,AAR,TCV,CRC,9BQ,MSR,EVA,KAC,DJT,NAX,PIA,QTR,RAM,SIA,ALK,TAM,DTH,THA,THY,UAL,SVR -CODE:F -PRIORITY:+3 - -STAND:LFPG:V06:49.016569:2.543047:25 -USE:A -NON-SCHENGEN -CALLSIGN:AEE,EIN,CCA,ANA,AAR,TCV,CRC,9BQ,MSR,EVA,KAC,DJT,NAX,PIA,QTR,RAM,SIA,ALK,TAM,DTH,THA,THY,UAL,SVR -CODE:C -PRIORITY:+3 - -STAND:LFPG:V07:49.016083:2.542844:25 -USE:A -NON-SCHENGEN -CALLSIGN:AEE,EIN,CCA,ANA,AAR,TCV,CRC,9BQ,MSR,EVA,KAC,DJT,NAX,PIA,QTR,RAM,SIA,ALK,TAM,DTH,THA,THY,UAL,SVR -CODE:C -PRIORITY:+3 - -STAND:LFPG:V08:49.016464:2.543036:25 -USE:A -NON-SCHENGEN -CALLSIGN:AEE,EIN,CCA,ANA,AAR,TCV,CRC,9BQ,MSR,EVA,KAC,DJT,NAX,PIA,QTR,RAM,SIA,ALK,TAM,DTH,THA,THY,UAL,SVR -CODE:E -PRIORITY:+3 - -STAND:LFPG:W01:49.016494:2.542422:25 -USE:A -SCHENGEN - -CALLSIGN:AEE,BEL,EWG,GWI,ICE,LOT,LHA,DLH,SAS,SWR,WOW -CODE:C -PRIORITY:+3 - -STAND:LFPG:W02:49.017:2.542633:25 -USE:A -SCHENGEN - -CALLSIGN:AEE,BEL,EWG,GWI,ICE,LOT,LHA,DLH,SAS,SWR,WOW -CODE:C -PRIORITY:+3 - -STAND:LFPG:W03:49.016575:2.542439:25 -USE:A -SCHENGEN - -CALLSIGN:AEE,BEL,EWG,GWI,ICE,LOT,LHA,DLH,SAS,SWR,WOW -CODE:C -PRIORITY:+3 - -STAND:LFPG:W04:49.017131:2.541678:25 -USE:A -SCHENGEN - -CALLSIGN:AEE,BEL,EWG,GWI,ICE,LOT,LHA,DLH,SAS,SWR,WOW -CODE:E -PRIORITY:+3 - -STAND:LFPG:W05:49.017036:2.540847:25 -USE:A -SCHENGEN - -CALLSIGN:AEE,BEL,EWG,GWI,ICE,LOT,LHA,DLH,SAS,SWR,WOW -CODE:C -PRIORITY:+3 - -STAND:LFPG:W06:49.016594:2.540631:25 -USE:A -SCHENGEN - -CALLSIGN:AEE,BEL,EWG,GWI,ICE,LOT,LHA,DLH,SAS,SWR,WOW -CODE:C -PRIORITY:+3 - -STAND:LFPG:W07:49.016111:2.540967:25 -USE:A -SCHENGEN - -CALLSIGN:AEE,BEL,EWG,GWI,ICE,LOT,LHA,DLH,SAS,SWR,WOW -CODE:C -PRIORITY:+3 - -STAND:LFPG:W08:49.016483:2.540742:25 -USE:A -SCHENGEN - -CALLSIGN:AEE,BEL,EWG,GWI,ICE,LOT,LHA,DLH,SAS,SWR,WOW -CODE:E -PRIORITY:+3 - -STAND:LFPG:X01:49.016247:2.540239:25 -USE:A -SCHENGEN - -CALLSIGN:AEE,BEL,EWG,GWI,ICE,LOT,LHA,DLH,SAS,SWR,WOW -CODE:C -PRIORITY:+3 - -STAND:LFPG:X02:49.016722:2.539908:25 -USE:A -SCHENGEN - -CALLSIGN:AEE,BEL,EWG,GWI,ICE,LOT,LHA,DLH,SAS,SWR,WOW -CODE:C -PRIORITY:+3 - -STAND:LFPG:X03:49.016339:2.540142:25 -USE:A -SCHENGEN - -CALLSIGN:AEE,BEL,EWG,GWI,ICE,LOT,LHA,DLH,SAS,SWR,WOW -CODE:C -PRIORITY:+3 - -STAND:LFPG:X04:49.016425:2.539044:25 -USE:A -SCHENGEN - -CALLSIGN:AEE,BEL,EWG,GWI,ICE,LOT,LHA,DLH,SAS,SWR,WOW -CODE:E -PRIORITY:+3 - -STAND:LFPG:X05:49.015997:2.5385:25 -USE:A -SCHENGEN - -CALLSIGN:AEE,BEL,EWG,GWI,ICE,LOT,LHA,DLH,SAS,SWR,WOW -CODE:C -PRIORITY:+3 - -STAND:LFPG:X06:49.01555:2.538828:25 -USE:A -SCHENGEN - -CALLSIGN:AEE,BEL,EWG,GWI,ICE,LOT,LHA,DLH,SAS,SWR,WOW -CODE:C -PRIORITY:+3 - -STAND:LFPG:X07:49.015342:2.5395:25 -USE:A -SCHENGEN - -CALLSIGN:AEE,BEL,EWG,GWI,ICE,LOT,LHA,DLH,SAS,SWR,WOW -CODE:C -PRIORITY:+3 - -STAND:LFPG:X08:49.015531:2.538961:25 -USE:A -SCHENGEN - -CALLSIGN:AEE,BEL,EWG,GWI,ICE,LOT,LHA,DLH,SAS,SWR,WOW -CODE:E -PRIORITY:+3 - -STAND:LFPG:Y01:49.015139:2.538808:25 -USE:A -NON-SCHENGEN -CALLSIGN:AEE,EIN,CCA,ANA,AAR,TCV,CRC,9BQ,MSR,EVA,KAC,DJT,NAX,PIA,QTR,RAM,SIA,ALK,TAM,DTH,THA,THY,UAL,SVR -CODE:C -PRIORITY:+3 - -STAND:LFPG:Y02:49.015361:2.538094:25 -USE:A -NON-SCHENGEN -CALLSIGN:AEE,EIN,CCA,ANA,AAR,TCV,CRC,9BQ,MSR,EVA,KAC,DJT,NAX,PIA,QTR,RAM,SIA,ALK,TAM,DTH,THA,THY,UAL,SVR -CODE:C -PRIORITY:+3 - -STAND:LFPG:Y03:49.015164:2.538644:25 -USE:A -NON-SCHENGEN -CALLSIGN:AEE,EIN,CCA,ANA,AAR,TCV,CRC,9BQ,MSR,EVA,KAC,DJT,NAX,PIA,QTR,RAM,SIA,ALK,TAM,DTH,THA,THY,UAL,SVR -CODE:C -PRIORITY:+3 - -STAND:LFPG:Y04:49.014767:2.537731:25 -USE:A -NON-SCHENGEN -CALLSIGN:AEE,EIN,CCA,ANA,AAR,TCV,CRC,9BQ,MSR,EVA,KAC,DJT,NAX,PIA,QTR,RAM,SIA,ALK,TAM,DTH,THA,THY,UAL,SVR -CODE:E -PRIORITY:+3 - -STAND:LFPG:Y05:49.014194:2.537744:25 -USE:A -NON-SCHENGEN -CALLSIGN:AEE,EIN,CCA,ANA,AAR,TCV,CRC,9BQ,MSR,EVA,KAC,DJT,NAX,PIA,QTR,RAM,SIA,ALK,TAM,DTH,THA,THY,UAL,SVR -CODE:C -PRIORITY:+3 \ No newline at end of file +{ + "version": "v0.0.1", + "ICAO": "LFPG", + "Stands": { + "Y06": { + "Coordinates": "49.014006:2.538408:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "CCA", + "ANA", + "AAR", + "TCV", + "CRC", + "9BQ", + "MSR", + "EVA", + "KAC", + "DJT", + "NAX", + "PIA", + "QTR", + "RAM", + "SIA", + "ALK", + "TAM", + "DTH", + "THA", + "THY", + "UAL", + "SVR" + ], + "WTC": "LMH", + "Priority": 3 + }, + "A01": { + "Coordinates": "48.999836:2.560711:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "DAH", + "KZR", + "ACA", + "SEY", + "THT", + "AAL", + "BAW", + "CPA", + "ETD", + "ETH", + "CHH", + "OMA", + "RJA", + "XLF" + ], + "WTC": "LM", + "Priority": 1 + }, + "Y07": { + "Coordinates": "49.014131:2.539136:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "CCA", + "ANA", + "AAR", + "TCV", + "CRC", + "9BQ", + "MSR", + "EVA", + "KAC", + "DJT", + "NAX", + "PIA", + "QTR", + "RAM", + "SIA", + "ALK", + "TAM", + "DTH", + "THA", + "THY", + "UAL", + "SVR" + ], + "WTC": "LMH", + "Priority": 3 + }, + "A02": { + "Coordinates": "49.001942:2.560117:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "DAH", + "KZR", + "ACA", + "SEY", + "THT", + "AAL", + "BAW", + "CPA", + "ETD", + "ETH", + "CHH", + "OMA", + "RJA", + "XLF" + ], + "WTC": "LMH", + "Priority": 3 + }, + "Y08": { + "Coordinates": "49.014028:2.538544:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "CCA", + "ANA", + "AAR", + "TCV", + "CRC", + "9BQ", + "MSR", + "EVA", + "KAC", + "DJT", + "NAX", + "PIA", + "QTR", + "RAM", + "SIA", + "ALK", + "TAM", + "DTH", + "THA", + "THY", + "UAL", + "SVR" + ], + "WTC": "LM", + "Priority": 3 + }, + "A03": { + "Coordinates": "48.999881:2.561539:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "DAH", + "KZR", + "ACA", + "SEY", + "THT", + "AAL", + "BAW", + "CPA", + "ETD", + "ETH", + "CHH", + "OMA", + "RJA", + "XLF" + ], + "WTC": "LM", + "Priority": 1 + }, + "Y09": { + "Coordinates": "49.014061:2.53805:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "CCA", + "ANA", + "AAR", + "TCV", + "CRC", + "9BQ", + "MSR", + "EVA", + "KAC", + "DJT", + "NAX", + "PIA", + "QTR", + "RAM", + "SIA", + "ALK", + "TAM", + "DTH", + "THA", + "THY", + "UAL", + "SVR" + ], + "WTC": "L", + "Priority": 3 + }, + "A04": { + "Coordinates": "49.002006:2.560472:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "DAH", + "KZR", + "ACA", + "SEY", + "THT", + "AAL", + "BAW", + "CPA", + "ETD", + "ETH", + "CHH", + "OMA", + "RJA", + "XLF" + ], + "WTC": "LMH", + "Priority": 3 + }, + "Y49": { + "Coordinates": "49.014875:2.537658:25", + "Use": "A", + "Schengen": false, + "Callsigns": [], + "WTC": "LMH", + "Priority": 1 + }, + "A05": { + "Coordinates": "48.999931:2.562447:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "DAH", + "KZR", + "ACA", + "SEY", + "THT", + "AAL", + "BAW", + "CPA", + "ETD", + "ETH", + "CHH", + "OMA", + "RJA", + "XLF" + ], + "WTC": "LM", + "Priority": 1 + }, + "Z01": { + "Coordinates": "49.013681:2.538803:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "CCA", + "ANA", + "AAR", + "TCV", + "CRC", + "9BQ", + "MSR", + "EVA", + "KAC", + "DJT", + "NAX", + "PIA", + "QTR", + "RAM", + "SIA", + "ALK", + "TAM", + "DTH", + "THA", + "THY", + "UAL", + "SVR" + ], + "WTC": "LMH", + "Priority": 3 + }, + "A06": { + "Coordinates": "49.00195:2.560528:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "DAH", + "KZR", + "ACA", + "SEY", + "THT", + "AAL", + "BAW", + "CPA", + "ETD", + "ETH", + "CHH", + "OMA", + "RJA", + "XLF" + ], + "WTC": "LMH", + "Priority": 3 + }, + "Z02": { + "Coordinates": "49.013542:2.537986:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "CCA", + "ANA", + "AAR", + "TCV", + "CRC", + "9BQ", + "MSR", + "EVA", + "KAC", + "DJT", + "NAX", + "PIA", + "QTR", + "RAM", + "SIA", + "ALK", + "TAM", + "DTH", + "THA", + "THY", + "UAL", + "SVR" + ], + "WTC": "LMH", + "Priority": 3 + }, + "A07": { + "Coordinates": "48.999981:2.563367:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "DAH", + "KZR", + "ACA", + "SEY", + "THT", + "AAL", + "BAW", + "CPA", + "ETD", + "ETH", + "CHH", + "OMA", + "RJA", + "XLF" + ], + "WTC": "LM", + "Priority": 1 + }, + "Z03": { + "Coordinates": "49.013633:2.53865:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "CCA", + "ANA", + "AAR", + "TCV", + "CRC", + "9BQ", + "MSR", + "EVA", + "KAC", + "DJT", + "NAX", + "PIA", + "QTR", + "RAM", + "SIA", + "ALK", + "TAM", + "DTH", + "THA", + "THY", + "UAL", + "SVR" + ], + "WTC": "LMH", + "Priority": 3 + }, + "A08": { + "Coordinates": "49.001931:2.561214:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "DAH", + "KZR", + "ACA", + "SEY", + "THT", + "AAL", + "BAW", + "CPA", + "ETD", + "ETH", + "CHH", + "OMA", + "RJA", + "XLF" + ], + "WTC": "LMH", + "Priority": 3 + }, + "Z04": { + "Coordinates": "49.012939:2.538333:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "CCA", + "ANA", + "AAR", + "TCV", + "CRC", + "9BQ", + "MSR", + "EVA", + "KAC", + "DJT", + "NAX", + "PIA", + "QTR", + "RAM", + "SIA", + "ALK", + "TAM", + "DTH", + "THA", + "THY", + "UAL", + "SVR" + ], + "WTC": "LM", + "Priority": 3 + }, + "A09": { + "Coordinates": "49.000028:2.564286:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "DAH", + "KZR", + "ACA", + "SEY", + "THT", + "AAL", + "BAW", + "CPA", + "ETD", + "ETH", + "CHH", + "OMA", + "RJA", + "XLF" + ], + "WTC": "LMH", + "Priority": 1 + }, + "Z05": { + "Coordinates": "49.012511:2.538939:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "CCA", + "ANA", + "AAR", + "TCV", + "CRC", + "9BQ", + "MSR", + "EVA", + "KAC", + "DJT", + "NAX", + "PIA", + "QTR", + "RAM", + "SIA", + "ALK", + "TAM", + "DTH", + "THA", + "THY", + "UAL", + "SVR" + ], + "WTC": "LMH", + "Priority": 3 + }, + "A10": { + "Coordinates": "49.001842:2.561978:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "DAH", + "KZR", + "ACA", + "SEY", + "THT", + "AAL", + "BAW", + "CPA", + "ETD", + "ETH", + "CHH", + "OMA", + "RJA", + "XLF" + ], + "WTC": "LMH", + "Priority": 3 + }, + "Z06": { + "Coordinates": "49.01255:2.539739:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "CCA", + "ANA", + "AAR", + "TCV", + "CRC", + "9BQ", + "MSR", + "EVA", + "KAC", + "DJT", + "NAX", + "PIA", + "QTR", + "RAM", + "SIA", + "ALK", + "TAM", + "DTH", + "THA", + "THY", + "UAL", + "SVR" + ], + "WTC": "LMH", + "Priority": 3 + }, + "A12": { + "Coordinates": "49.001872:2.562706:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "DAH", + "KZR", + "ACA", + "SEY", + "THT", + "AAL", + "BAW", + "CPA", + "ETD", + "ETH", + "CHH", + "OMA", + "RJA", + "XLF" + ], + "WTC": "LMH", + "Priority": 3 + }, + "Z07": { + "Coordinates": "49.012725:2.540006:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "CCA", + "ANA", + "AAR", + "TCV", + "CRC", + "9BQ", + "MSR", + "EVA", + "KAC", + "DJT", + "NAX", + "PIA", + "QTR", + "RAM", + "SIA", + "ALK", + "TAM", + "DTH", + "THA", + "THY", + "UAL", + "SVR" + ], + "WTC": "LM", + "Priority": 3 + }, + "A14": { + "Coordinates": "49.001975:2.563453:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "DAH", + "KZR", + "ACA", + "SEY", + "THT", + "AAL", + "BAW", + "CPA", + "ETD", + "ETH", + "CHH", + "OMA", + "RJA", + "XLF" + ], + "WTC": "LM", + "Priority": 3 + }, + "Z08": { + "Coordinates": "49.013064:2.540022:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "CCA", + "ANA", + "AAR", + "TCV", + "CRC", + "9BQ", + "MSR", + "EVA", + "KAC", + "DJT", + "NAX", + "PIA", + "QTR", + "RAM", + "SIA", + "ALK", + "TAM", + "DTH", + "THA", + "THY", + "UAL", + "SVR" + ], + "WTC": "LMH", + "Priority": 3 + }, + "A30": { + "Coordinates": "49.0023:2.558264:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "DAH", + "KZR", + "ACA", + "SEY", + "THT", + "AAL", + "BAW", + "CPA", + "ETD", + "ETH", + "CHH", + "OMA", + "RJA", + "XLF" + ], + "WTC": "LMH", + "Priority": 3 + }, + "Z09": { + "Coordinates": "49.012875:2.539858:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "CCA", + "ANA", + "AAR", + "TCV", + "CRC", + "9BQ", + "MSR", + "EVA", + "KAC", + "DJT", + "NAX", + "PIA", + "QTR", + "RAM", + "SIA", + "ALK", + "TAM", + "DTH", + "THA", + "THY", + "UAL", + "SVR" + ], + "WTC": "LM", + "Priority": 3 + }, + "A32": { + "Coordinates": "49.001922:2.558197:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "DAH", + "KZR", + "ACA", + "SEY", + "THT", + "AAL", + "BAW", + "CPA", + "ETD", + "ETH", + "CHH", + "OMA", + "RJA", + "XLF" + ], + "WTC": "LMH", + "Priority": 3 + }, + "M06": { + "Coordinates": "49.000386:2.546044:25", + "Use": "C", + "Schengen": false, + "Callsigns": [], + "WTC": "LM", + "Priority": 3 + }, + "A34": { + "Coordinates": "49.001883:2.558569:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "DAH", + "KZR", + "ACA", + "SEY", + "THT", + "AAL", + "BAW", + "CPA", + "ETD", + "ETH", + "CHH", + "OMA", + "RJA", + "XLF" + ], + "WTC": "LMH", + "Priority": 3 + }, + "M07": { + "Coordinates": "49.000347:2.544931:25", + "Use": "C", + "Schengen": false, + "Callsigns": [], + "WTC": "LM", + "Priority": 3 + }, + "A36": { + "Coordinates": "49.001831:2.55855:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "DAH", + "KZR", + "ACA", + "SEY", + "THT", + "AAL", + "BAW", + "CPA", + "ETD", + "ETH", + "CHH", + "OMA", + "RJA", + "XLF" + ], + "WTC": "LMH", + "Priority": 3 + }, + "M08": { + "Coordinates": "49.000294:2.543944:25", + "Use": "C", + "Schengen": false, + "Callsigns": [], + "WTC": "LM", + "Priority": 3 + }, + "A38": { + "Coordinates": "49.001697:2.559081:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "DAH", + "KZR", + "ACA", + "SEY", + "THT", + "AAL", + "BAW", + "CPA", + "ETD", + "ETH", + "CHH", + "OMA", + "RJA", + "XLF" + ], + "WTC": "LMH", + "Priority": 3 + }, + "M09": { + "Coordinates": "49.000189:2.542961:25", + "Use": "C", + "Schengen": false, + "Callsigns": [], + "WTC": "LM", + "Priority": 3 + }, + "C02": { + "Coordinates": "49.002125:2.565903:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFL", + "REU", + "AIC", + "MDG", + "UAE", + "ETD", + "GFA", + "JAI", + "KQA", + "SVA", + "UZB" + ], + "WTC": "LMH", + "Priority": 3 + }, + "M10": { + "Coordinates": "49.00015:2.541969:25", + "Use": "C", + "Schengen": false, + "Callsigns": [], + "WTC": "LM", + "Priority": 3 + }, + "M11": { + "Coordinates": "49.000097:2.540978:25", + "Use": "C", + "Schengen": false, + "Callsigns": [], + "WTC": "LM", + "Priority": 3 + }, + "C03": { + "Coordinates": "49.000294:2.566942:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFL", + "REU", + "AIC", + "MDG", + "UAE", + "ETD", + "GFA", + "JAI", + "KQA", + "SVA", + "UZB" + ], + "WTC": "LM", + "Priority": 1 + }, + "M12": { + "Coordinates": "49.000028:2.539825:25", + "Use": "C", + "Schengen": false, + "Callsigns": [ + "CLX" + ], + "WTC": "LM", + "Priority": 3 + }, + "C04": { + "Coordinates": "49.0021:2.566683:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFL", + "REU", + "AIC", + "MDG", + "UAE", + "ETD", + "GFA", + "JAI", + "KQA", + "SVA", + "UZB" + ], + "WTC": "LMH", + "Priority": 3 + }, + "M13": { + "Coordinates": "49.000003:2.539067:25", + "Use": "C", + "Schengen": false, + "Callsigns": [], + "WTC": "LM", + "Priority": 3 + }, + "M14": { + "Coordinates": "48.999944:2.538008:25", + "Use": "C", + "Schengen": false, + "Callsigns": [], + "WTC": "LM", + "Priority": 3 + }, + "C05": { + "Coordinates": "49.000206:2.567861:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFL", + "REU", + "AIC", + "MDG", + "UAE", + "ETD", + "GFA", + "JAI", + "KQA", + "SVA", + "UZB" + ], + "WTC": "LM", + "Priority": 1 + }, + "M15": { + "Coordinates": "48.999894:2.537044:25", + "Use": "C", + "Schengen": false, + "Callsigns": [], + "WTC": "LM", + "Priority": 3 + }, + "C06": { + "Coordinates": "49.002028:2.567372:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFL", + "REU", + "AIC", + "MDG", + "UAE", + "ETD", + "GFA", + "JAI", + "KQA", + "SVA", + "UZB" + ], + "WTC": "LMH", + "Priority": 3 + }, + "N01": { + "Coordinates": "48.996722:2.531294:25", + "Use": "C", + "Schengen": false, + "Callsigns": [], + "WTC": "LM", + "Priority": 3 + }, + "C07": { + "Coordinates": "49.00025:2.568675:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFL", + "REU", + "AIC", + "MDG", + "UAE", + "ETD", + "GFA", + "JAI", + "KQA", + "SVA", + "UZB" + ], + "WTC": "LM", + "Priority": 1 + }, + "N02": { + "Coordinates": "48.996158:2.531322:25", + "Use": "C", + "Schengen": false, + "Callsigns": [], + "WTC": "LM", + "Priority": 3 + }, + "C08": { + "Coordinates": "49.002189:2.568208:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFL", + "REU", + "AIC", + "MDG", + "UAE", + "ETD", + "GFA", + "JAI", + "KQA", + "SVA", + "UZB" + ], + "WTC": "LM", + "Priority": 3 + }, + "N03": { + "Coordinates": "48.995606:2.531447:25", + "Use": "C", + "Schengen": false, + "Callsigns": [], + "WTC": "LM", + "Priority": 3 + }, + "C09": { + "Coordinates": "49.000258:2.568031:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFL", + "REU", + "AIC", + "MDG", + "UAE", + "ETD", + "GFA", + "JAI", + "KQA", + "SVA", + "UZB" + ], + "WTC": "LMH", + "Priority": 1 + }, + "N31": { + "Coordinates": "48.995756:2.531481:25", + "Use": "C", + "Schengen": false, + "Callsigns": [], + "WTC": "LM", + "Priority": 2 + }, + "C10": { + "Coordinates": "49.002261:2.569625:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFL", + "REU", + "AIC", + "MDG", + "UAE", + "ETD", + "GFA", + "JAI", + "KQA", + "SVA", + "UZB" + ], + "WTC": "LMH", + "Priority": 3 + }, + "N33": { + "Coordinates": "48.995442:2.531519:25", + "Use": "C", + "Schengen": false, + "Callsigns": [], + "WTC": "LM", + "Priority": 2 + }, + "C12": { + "Coordinates": "49.002261:2.568989:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFL", + "REU", + "AIC", + "MDG", + "UAE", + "ETD", + "GFA", + "JAI", + "KQA", + "SVA", + "UZB" + ], + "WTC": "LM", + "Priority": 3 + }, + "N04": { + "Coordinates": "48.995014:2.531714:25", + "Use": "C", + "Schengen": false, + "Callsigns": [], + "WTC": "LM", + "Priority": 3 + }, + "C16": { + "Coordinates": "49.002594:2.569625:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFL", + "REU", + "AIC", + "MDG", + "UAE", + "ETD", + "GFA", + "JAI", + "KQA", + "SVA", + "UZB" + ], + "WTC": "LMH", + "Priority": 3 + }, + "N41": { + "Coordinates": "48.995114:2.531561:25", + "Use": "C", + "Schengen": false, + "Callsigns": [], + "WTC": "LM", + "Priority": 2 + }, + "D02": { + "Coordinates": "49.005339:2.569358:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "ADR", + "AAF", + "ASL", + "AHY", + "BRU", + "LZB", + "CTN", + "EZY", + "EJU", + "TGZ", + "MGX", + "TUA", + "AUI", + "ADR", + "AAF", + "BTI", + "AMC", + "AUA", + "CSA", + "EZY", + "FIN" + ], + "WTC": "LMH", + "Priority": 3 + }, + "N43": { + "Coordinates": "48.994808:2.531858:25", + "Use": "C", + "Schengen": false, + "Callsigns": [], + "WTC": "LM", + "Priority": 2 + }, + "D03": { + "Coordinates": "49.007367:2.568419:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "ADR", + "AAF", + "ASL", + "AHY", + "BRU", + "LZB", + "CTN", + "EZY", + "EJU", + "TGZ", + "MGX", + "TUA", + "AUI", + "ADR", + "AAF", + "BTI", + "AMC", + "AUA", + "CSA", + "EZY", + "FIN" + ], + "WTC": "LMH", + "Priority": 1 + }, + "N05": { + "Coordinates": "48.994325:2.531819:25", + "Use": "C", + "Schengen": false, + "Callsigns": [], + "WTC": "LM", + "Priority": 3 + }, + "D04": { + "Coordinates": "49.005431:2.569031:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "ADR", + "AAF", + "ASL", + "AHY", + "BRU", + "LZB", + "CTN", + "EZY", + "EJU", + "TGZ", + "MGX", + "TUA", + "AUI", + "ADR", + "AAF", + "BTI", + "AMC", + "AUA", + "CSA", + "EZY", + "FIN" + ], + "WTC": "LM", + "Priority": 3 + }, + "N51": { + "Coordinates": "48.994444:2.531889:25", + "Use": "C", + "Schengen": false, + "Callsigns": [], + "WTC": "LM", + "Priority": 2 + }, + "D05": { + "Coordinates": "49.007306:2.567858:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "ADR", + "AAF", + "ASL", + "AHY", + "BRU", + "LZB", + "CTN", + "EZY", + "EJU", + "TGZ", + "MGX", + "TUA", + "AUI", + "ADR", + "AAF", + "BTI", + "AMC", + "AUA", + "CSA", + "EZY", + "FIN" + ], + "WTC": "LMH", + "Priority": 1 + }, + "N53": { + "Coordinates": "48.993908:2.531933:25", + "Use": "C", + "Schengen": false, + "Callsigns": [], + "WTC": "LM", + "Priority": 2 + }, + "D06": { + "Coordinates": "49.0054:2.568919:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "ADR", + "AAF", + "ASL", + "AHY", + "BRU", + "LZB", + "CTN", + "EZY", + "EJU", + "TGZ", + "MGX", + "TUA", + "AUI", + "ADR", + "AAF", + "BTI", + "AMC", + "AUA", + "CSA", + "EZY", + "FIN" + ], + "WTC": "LMH", + "Priority": 3 + }, + "D07": { + "Coordinates": "49.007281:2.567367:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "ADR", + "AAF", + "ASL", + "AHY", + "BRU", + "LZB", + "CTN", + "EZY", + "EJU", + "TGZ", + "MGX", + "TUA", + "AUI", + "ADR", + "AAF", + "BTI", + "AMC", + "AUA", + "CSA", + "EZY", + "FIN" + ], + "WTC": "LM", + "Priority": 1 + }, + "D08": { + "Coordinates": "49.005589:2.568422:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "ADR", + "AAF", + "ASL", + "AHY", + "BRU", + "LZB", + "CTN", + "EZY", + "EJU", + "TGZ", + "MGX", + "TUA", + "AUI", + "ADR", + "AAF", + "BTI", + "AMC", + "AUA", + "CSA", + "EZY", + "FIN" + ], + "WTC": "LMH", + "Priority": 3 + }, + "D09": { + "Coordinates": "49.007281:2.567292:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "ADR", + "AAF", + "ASL", + "AHY", + "BRU", + "LZB", + "CTN", + "EZY", + "TGZ", + "MGX", + "TUA", + "AUI", + "ADR", + "AAF", + "BTI", + "AMC", + "AUA", + "CSA", + "EZY", + "FIN", + "EJU" + ], + "WTC": "LMH", + "Priority": 1 + }, + "D10": { + "Coordinates": "49.005483:2.568053:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "ADR", + "AAF", + "ASL", + "AHY", + "BRU", + "LZB", + "CTN", + "EZY", + "TGZ", + "MGX", + "TUA", + "AUI", + "ADR", + "AAF", + "BTI", + "AMC", + "AUA", + "CSA", + "EZY", + "FIN", + "EJU" + ], + "WTC": "LM", + "Priority": 3 + }, + "D11": { + "Coordinates": "49.00725:2.566728:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "ADR", + "AAF", + "ASL", + "AHY", + "BRU", + "LZB", + "CTN", + "EZY", + "TGZ", + "MGX", + "TUA", + "AUI", + "ADR", + "AAF", + "BTI", + "AMC", + "AUA", + "CSA", + "EZY", + "FIN", + "EJU" + ], + "WTC": "LMH", + "Priority": 1 + }, + "D12": { + "Coordinates": "49.005528:2.568072:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "ADR", + "AAF", + "ASL", + "AHY", + "BRU", + "LZB", + "CTN", + "EZY", + "TGZ", + "MGX", + "TUA", + "AUI", + "ADR", + "AAF", + "BTI", + "AMC", + "AUA", + "CSA", + "EZY", + "FIN", + "EJU" + ], + "WTC": "LMH", + "Priority": 3 + }, + "D13": { + "Coordinates": "49.007239:2.566619:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "ADR", + "AAF", + "ASL", + "AHY", + "BRU", + "LZB", + "CTN", + "EZY", + "TGZ", + "MGX", + "TUA", + "AUI", + "ADR", + "AAF", + "BTI", + "AMC", + "AUA", + "CSA", + "EZY", + "FIN", + "EJU" + ], + "WTC": "LM", + "Priority": 1 + }, + "D14": { + "Coordinates": "49.005561:2.567394:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "ADR", + "AAF", + "ASL", + "AHY", + "BRU", + "LZB", + "CTN", + "EZY", + "TGZ", + "MGX", + "TUA", + "AUI", + "ADR", + "AAF", + "BTI", + "AMC", + "AUA", + "CSA", + "EZY", + "FIN", + "EJU" + ], + "WTC": "LMH", + "Priority": 3 + }, + "D15": { + "Coordinates": "49.007219:2.566161:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "ADR", + "AAF", + "ASL", + "AHY", + "BRU", + "LZB", + "CTN", + "EZY", + "TGZ", + "MGX", + "TUA", + "AUI", + "ADR", + "AAF", + "BTI", + "AMC", + "AUA", + "CSA", + "EZY", + "FIN", + "EJU" + ], + "WTC": "LMH", + "Priority": 1 + }, + "D16": { + "Coordinates": "49.005556:2.56665:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "ADR", + "AAF", + "ASL", + "AHY", + "BRU", + "LZB", + "CTN", + "EZY", + "TGZ", + "MGX", + "TUA", + "AUI", + "ADR", + "AAF", + "BTI", + "AMC", + "AUA", + "CSA", + "EZY", + "FIN", + "EJU" + ], + "WTC": "LMH", + "Priority": 3 + }, + "D17": { + "Coordinates": "49.0072:2.565869:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "ADR", + "AAF", + "ASL", + "AHY", + "BRU", + "LZB", + "CTN", + "EZY", + "TGZ", + "MGX", + "TUA", + "AUI", + "ADR", + "AAF", + "BTI", + "AMC", + "AUA", + "CSA", + "EZY", + "FIN", + "EJU" + ], + "WTC": "LM", + "Priority": 1 + }, + "D18": { + "Coordinates": "49.005481:2.565953:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "ADR", + "AAF", + "ASL", + "AHY", + "BRU", + "LZB", + "CTN", + "EZY", + "TGZ", + "MGX", + "TUA", + "AUI", + "ADR", + "AAF", + "BTI", + "AMC", + "AUA", + "CSA", + "EZY", + "FIN", + "EJU" + ], + "WTC": "LMH", + "Priority": 3 + }, + "D19": { + "Coordinates": "49.007189:2.565597:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "ADR", + "AAF", + "ASL", + "AHY", + "BRU", + "LZB", + "CTN", + "EZY", + "TGZ", + "MGX", + "TUA", + "AUI", + "ADR", + "AAF", + "BTI", + "AMC", + "AUA", + "CSA", + "EZY", + "FIN", + "EJU" + ], + "WTC": "LMH", + "Priority": 1 + }, + "D20": { + "Coordinates": "49.005417:2.565283:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "ADR", + "AAF", + "ASL", + "AHY", + "BRU", + "LZB", + "CTN", + "EZY", + "TGZ", + "MGX", + "TUA", + "AUI", + "ADR", + "AAF", + "BTI", + "AMC", + "AUA", + "CSA", + "EZY", + "FIN", + "EJU" + ], + "WTC": "LMH", + "Priority": 3 + }, + "D22": { + "Coordinates": "49.005211:2.565064:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "ADR", + "AAF", + "ASL", + "AHY", + "BRU", + "LZB", + "CTN", + "EZY", + "TGZ", + "MGX", + "TUA", + "AUI", + "ADR", + "AAF", + "BTI", + "AMC", + "AUA", + "CSA", + "EZY", + "FIN", + "EJU" + ], + "WTC": "LM", + "Priority": 3 + }, + "D24": { + "Coordinates": "49.005183:2.565036:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "ADR", + "AAF", + "ASL", + "AHY", + "BRU", + "LZB", + "CTN", + "EZY", + "TGZ", + "MGX", + "TUA", + "AUI", + "ADR", + "AAF", + "BTI", + "AMC", + "AUA", + "CSA", + "EZY", + "FIN", + "EJU" + ], + "WTC": "LMH", + "Priority": 3 + }, + "E01": { + "Coordinates": "49.003667:2.584069:25", + "Use": "A", + "Schengen": false, + "Callsigns": [], + "WTC": "LMH", + "Priority": 1 + }, + "E05": { + "Coordinates": "49.003283:2.584119:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN" + ], + "WTC": "LMH", + "Priority": 3 + }, + "E09": { + "Coordinates": "49.002906:2.584206:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN" + ], + "WTC": "LMH", + "Priority": 3 + }, + "E10": { + "Coordinates": "49.001214:2.573658:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN", + "ELY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "E12": { + "Coordinates": "49.001231:2.573881:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN", + "ELY" + ], + "WTC": "LM", + "Priority": 3 + }, + "E13": { + "Coordinates": "49.002525:2.584253:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN", + "ELY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "E14": { + "Coordinates": "49.001406:2.574419:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN", + "ELY" + ], + "WTC": "LM", + "Priority": 3 + }, + "E16": { + "Coordinates": "49.001347:2.574367:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN", + "ELY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "E17": { + "Coordinates": "49.002039:2.584311:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN", + "ELY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "E18": { + "Coordinates": "49.001506:2.575222:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN" + ], + "WTC": "LM", + "Priority": 3 + }, + "E20": { + "Coordinates": "49.001567:2.576206:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN" + ], + "WTC": "LM", + "Priority": 3 + }, + "E21": { + "Coordinates": "49.001658:2.584358:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN" + ], + "WTC": "LMH", + "Priority": 3 + }, + "E22": { + "Coordinates": "49.00165:2.577192:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN" + ], + "WTC": "LM", + "Priority": 3 + }, + "E24": { + "Coordinates": "49.001711:2.578178:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN" + ], + "WTC": "LM", + "Priority": 3 + }, + "E25": { + "Coordinates": "49.001278:2.584406:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN" + ], + "WTC": "LMH", + "Priority": 3 + }, + "E26": { + "Coordinates": "49.001747:2.579167:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN" + ], + "WTC": "LM", + "Priority": 3 + }, + "E29": { + "Coordinates": "49.000897:2.584453:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN" + ], + "WTC": "LMH", + "Priority": 3 + }, + "E30": { + "Coordinates": "49.001742:2.580164:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN" + ], + "WTC": "LM", + "Priority": 3 + }, + "E32": { + "Coordinates": "49.001719:2.581128:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN" + ], + "WTC": "LM", + "Priority": 3 + }, + "E34": { + "Coordinates": "49.001703:2.5822:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN" + ], + "WTC": "LM", + "Priority": 3 + }, + "E38": { + "Coordinates": "49.002478:2.581344:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN" + ], + "WTC": "LM", + "Priority": 3 + }, + "E40": { + "Coordinates": "49.002625:2.580581:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN" + ], + "WTC": "LM", + "Priority": 3 + }, + "E42": { + "Coordinates": "49.002422:2.580289:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN" + ], + "WTC": "LM", + "Priority": 3 + }, + "E44": { + "Coordinates": "49.002586:2.579425:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN" + ], + "WTC": "LM", + "Priority": 3 + }, + "F02": { + "Coordinates": "49.005481:2.573622:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AFR", + "CCM", + "AEA", + "AZA", + "KLM", + "ITY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "F03": { + "Coordinates": "49.007436:2.583831:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AFR", + "CCM", + "AEA", + "AZA", + "KLM", + "ITY" + ], + "WTC": "LM", + "Priority": 3 + }, + "F04": { + "Coordinates": "49.005811:2.573536:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AFR", + "CCM", + "AEA", + "AZA", + "KLM", + "ITY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "F07": { + "Coordinates": "49.006814:2.583681:25", + "Use": "A", + "Schengen": false, + "Callsigns": [], + "WTC": "LMH", + "Priority": 1 + }, + "F08": { + "Coordinates": "49.006181:2.573372:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AFR", + "CCM", + "AEA", + "AZA", + "KLM", + "ITY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "F09": { + "Coordinates": "49.006683:2.583922:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AFR", + "CCM", + "AEA", + "AZA", + "KLM" + ], + "WTC": "LM", + "Priority": 3 + }, + "F10": { + "Coordinates": "49.006497:2.573244:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AFR", + "CCM", + "AEA", + "AZA", + "KLM", + "ITY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "F13": { + "Coordinates": "49.006053:2.583775:25", + "Use": "A", + "Schengen": false, + "Callsigns": [], + "WTC": "LMH", + "Priority": 1 + }, + "F14": { + "Coordinates": "49.006747:2.573286:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AFR", + "CCM", + "AEA", + "AZA", + "KLM", + "ITY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "F15": { + "Coordinates": "49.005911:2.584017:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AFR", + "CCM", + "AEA", + "AZA", + "KLM" + ], + "WTC": "LM", + "Priority": 3 + }, + "F16": { + "Coordinates": "49.006958:2.573594:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AFR", + "CCM", + "AEA", + "AZA", + "KLM", + "ITY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "F18": { + "Coordinates": "49.006933:2.573664:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "CCM", + "AEA", + "AZA", + "KLM", + "ITY" + ], + "WTC": "LMH", + "Priority": 1 + }, + "F20": { + "Coordinates": "49.007089:2.573986:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AFR", + "CCM", + "AEA", + "AZA", + "KLM", + "ITY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "F22": { + "Coordinates": "49.007133:2.574433:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AFR", + "CCM", + "AEA", + "AZA", + "KLM", + "ITY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "F26": { + "Coordinates": "49.007075:2.575136:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AFR", + "CCM", + "AEA", + "AZA", + "KLM", + "ITY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "F28": { + "Coordinates": "49.007036:2.575261:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AFR", + "CCM", + "AEA", + "AZA", + "KLM", + "ITY" + ], + "WTC": "LM", + "Priority": 3 + }, + "F30": { + "Coordinates": "49.006883:2.575528:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AFR", + "CCM", + "AEA", + "AZA", + "KLM", + "ITY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "F32": { + "Coordinates": "49.006567:2.575617:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AFR", + "CCM", + "AEA", + "AZA", + "KLM", + "ITY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "F34": { + "Coordinates": "49.006269:2.575844:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AFR", + "CCM", + "AEA", + "AZA", + "KLM", + "ITY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "F66": { + "Coordinates": "49.006308:2.577717:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AFR", + "CCM", + "AEA", + "AZA", + "KLM", + "ITY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "F68": { + "Coordinates": "49.006619:2.577719:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AFR", + "CCM", + "AEA", + "AZA", + "KLM", + "ITY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "F70": { + "Coordinates": "49.007:2.577772:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AFR", + "CCM", + "AEA", + "AZA", + "KLM", + "ITY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "F72": { + "Coordinates": "49.007022:2.577742:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AFR", + "CCM", + "AEA", + "AZA", + "KLM", + "ITY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "F74": { + "Coordinates": "49.006956:2.577761:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AFR", + "CCM", + "AEA", + "AZA", + "KLM", + "ITY" + ], + "WTC": "LM", + "Priority": 3 + }, + "F76": { + "Coordinates": "49.007197:2.577961:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AFR", + "CCM", + "AEA", + "AZA", + "KLM", + "ITY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "F80": { + "Coordinates": "49.007325:2.578461:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AFR", + "CCM", + "AEA", + "AZA", + "KLM", + "ITY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "F82": { + "Coordinates": "49.007336:2.579128:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AFR", + "CCM", + "AEA", + "AZA", + "KLM", + "ITY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "F84": { + "Coordinates": "49.007333:2.579525:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AFR", + "CCM", + "AEA", + "AZA", + "KLM", + "ITY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "F86": { + "Coordinates": "49.007114:2.579925:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AFR", + "CCM", + "AEA", + "AZA", + "KLM", + "ITY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "F90": { + "Coordinates": "49.006831:2.580017:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AFR", + "CCM", + "AEA", + "AZA", + "KLM", + "ITY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "F92": { + "Coordinates": "49.006503:2.579967:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AFR", + "CCM", + "AEA", + "AZA", + "KLM", + "ITY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "F94": { + "Coordinates": "49.006158:2.580097:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AFR", + "CCM", + "AEA", + "AZA", + "KLM", + "ITY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "F96": { + "Coordinates": "49.005836:2.580056:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AFR", + "CCM", + "AEA", + "AZA", + "KLM", + "ITY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "J01": { + "Coordinates": "49.004172:2.597847:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AFR", + "LGL", + "HOP" + ], + "WTC": "LMH", + "Priority": 1 + }, + "J02": { + "Coordinates": "49.003911:2.597886:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AFR", + "LGL", + "HOP" + ], + "WTC": "LMH", + "Priority": 1 + }, + "J03": { + "Coordinates": "49.0036:2.597925:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "LGL", + "HOP" + ], + "WTC": "LMH", + "Priority": 1 + }, + "J04": { + "Coordinates": "49.003622:2.598339:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "LGL", + "HOP" + ], + "WTC": "LMH", + "Priority": 1 + }, + "J05": { + "Coordinates": "49.004042:2.598328:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "LGL", + "HOP" + ], + "WTC": "LMH", + "Priority": 1 + }, + "J06": { + "Coordinates": "49.004339:2.598317:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "LGL", + "HOP" + ], + "WTC": "LMH", + "Priority": 1 + }, + "J10": { + "Coordinates": "49.004844:2.600075:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "LGL", + "HOP" + ], + "WTC": "LMH", + "Priority": 3 + }, + "J11": { + "Coordinates": "49.004464:2.600122:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "LGL", + "HOP" + ], + "WTC": "LMH", + "Priority": 3 + }, + "J12": { + "Coordinates": "49.004131:2.600164:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "LGL", + "HOP" + ], + "WTC": "LMH", + "Priority": 3 + }, + "J13": { + "Coordinates": "49.003869:2.600069:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "LGL", + "HOP" + ], + "WTC": "LMH", + "Priority": 3 + }, + "J14": { + "Coordinates": "49.003908:2.600356:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "LGL", + "HOP" + ], + "WTC": "LMH", + "Priority": 3 + }, + "J16": { + "Coordinates": "49.003969:2.600808:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "LGL", + "HOP" + ], + "WTC": "LMH", + "Priority": 3 + }, + "J17": { + "Coordinates": "49.003964:2.601117:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "LGL", + "HOP" + ], + "WTC": "LMH", + "Priority": 1 + }, + "J18": { + "Coordinates": "49.004142:2.601014:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "LGL", + "HOP" + ], + "WTC": "LMH", + "Priority": 3 + }, + "J19": { + "Coordinates": "49.004336:2.600978:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "LGL", + "HOP" + ], + "WTC": "LMH", + "Priority": 1 + }, + "J20": { + "Coordinates": "49.004447:2.600942:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "LGL", + "HOP" + ], + "WTC": "LMH", + "Priority": 3 + }, + "J21": { + "Coordinates": "49.004744:2.600925:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "LGL", + "HOP" + ], + "WTC": "LMH", + "Priority": 3 + }, + "J30": { + "Coordinates": "49.004847:2.602822:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "LGL", + "HOP" + ], + "WTC": "LMH", + "Priority": 3 + }, + "J31": { + "Coordinates": "49.004558:2.602883:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "LGL", + "HOP" + ], + "WTC": "LMH", + "Priority": 3 + }, + "J32": { + "Coordinates": "49.004439:2.602881:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "LGL", + "HOP" + ], + "WTC": "LMH", + "Priority": 3 + }, + "J33": { + "Coordinates": "49.004175:2.602878:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "LGL", + "HOP" + ], + "WTC": "LMH", + "Priority": 3 + }, + "J34": { + "Coordinates": "49.003903:2.60285:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "LGL", + "HOP" + ], + "WTC": "LMH", + "Priority": 3 + }, + "J35": { + "Coordinates": "49.004056:2.603108:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "LGL", + "HOP" + ], + "WTC": "LMH", + "Priority": 3 + }, + "J37": { + "Coordinates": "49.004117:2.603586:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "LGL", + "HOP" + ], + "WTC": "LMH", + "Priority": 3 + }, + "J38": { + "Coordinates": "49.003908:2.603931:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "LGL", + "HOP" + ], + "WTC": "LMH", + "Priority": 3 + }, + "J39": { + "Coordinates": "49.004311:2.603775:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "LGL", + "HOP" + ], + "WTC": "LMH", + "Priority": 3 + }, + "J40": { + "Coordinates": "49.004625:2.603622:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "LGL", + "HOP" + ], + "WTC": "LMH", + "Priority": 3 + }, + "J41": { + "Coordinates": "49.004994:2.603647:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "LGL", + "HOP" + ], + "WTC": "LMH", + "Priority": 3 + }, + "I14": { + "Coordinates": "49.011508:2.505825:25", + "Use": "C", + "Schengen": false, + "Callsigns": [ + "FDX" + ], + "WTC": "LM", + "Priority": 3 + }, + "I15": { + "Coordinates": "49.010972:2.505811:25", + "Use": "C", + "Schengen": false, + "Callsigns": [ + "FDX" + ], + "WTC": "LM", + "Priority": 3 + }, + "I16": { + "Coordinates": "49.010861:2.505892:25", + "Use": "C", + "Schengen": false, + "Callsigns": [ + "FDX" + ], + "WTC": "LM", + "Priority": 3 + }, + "I17": { + "Coordinates": "49.010439:2.505878:25", + "Use": "C", + "Schengen": false, + "Callsigns": [ + "FDX" + ], + "WTC": "LM", + "Priority": 3 + }, + "I18": { + "Coordinates": "49.010214:2.505972:25", + "Use": "C", + "Schengen": false, + "Callsigns": [ + "FDX" + ], + "WTC": "LM", + "Priority": 3 + }, + "I19": { + "Coordinates": "49.009906:2.505944:25", + "Use": "C", + "Schengen": false, + "Callsigns": [ + "FDX" + ], + "WTC": "LM", + "Priority": 3 + }, + "I20": { + "Coordinates": "49.013128:2.502617:25", + "Use": "C", + "Schengen": false, + "Callsigns": [ + "FDX", + "FPO" + ], + "WTC": "LM", + "Priority": 3 + }, + "I21": { + "Coordinates": "49.012511:2.502306:25", + "Use": "C", + "Schengen": false, + "Callsigns": [ + "FDX" + ], + "WTC": "LM", + "Priority": 3 + }, + "I22": { + "Coordinates": "49.012331:2.502125:25", + "Use": "C", + "Schengen": false, + "Callsigns": [ + "FDX" + ], + "WTC": "LM", + "Priority": 3 + }, + "I23": { + "Coordinates": "49.011978:2.502372:25", + "Use": "C", + "Schengen": false, + "Callsigns": [ + "FDX" + ], + "WTC": "LM", + "Priority": 3 + }, + "I24": { + "Coordinates": "49.011444:2.502442:25", + "Use": "C", + "Schengen": false, + "Callsigns": [ + "FDX" + ], + "WTC": "LM", + "Priority": 3 + }, + "I25": { + "Coordinates": "49.010911:2.502508:25", + "Use": "C", + "Schengen": false, + "Callsigns": [ + "FDX" + ], + "WTC": "LM", + "Priority": 3 + }, + "I26": { + "Coordinates": "49.010536:2.502347:25", + "Use": "C", + "Schengen": false, + "Callsigns": [ + "FDX" + ], + "WTC": "LM", + "Priority": 3 + }, + "I27": { + "Coordinates": "49.010367:2.502367:25", + "Use": "C", + "Schengen": false, + "Callsigns": [ + "FDX" + ], + "WTC": "LM", + "Priority": 3 + }, + "I30": { + "Coordinates": "49.015075:2.503206:25", + "Use": "C", + "Schengen": false, + "Callsigns": [ + "FDX" + ], + "WTC": "LM", + "Priority": 1 + }, + "I31": { + "Coordinates": "49.015036:2.502492:25", + "Use": "C", + "Schengen": false, + "Callsigns": [ + "FDX" + ], + "WTC": "LM", + "Priority": 1 + }, + "I32": { + "Coordinates": "49.014997:2.501775:25", + "Use": "C", + "Schengen": false, + "Callsigns": [ + "FDX" + ], + "WTC": "LM", + "Priority": 1 + }, + "I33": { + "Coordinates": "49.014947:2.500825:25", + "Use": "C", + "Schengen": false, + "Callsigns": [ + "FDX" + ], + "WTC": "LM", + "Priority": 1 + }, + "I34": { + "Coordinates": "49.014908:2.500111:25", + "Use": "C", + "Schengen": false, + "Callsigns": [ + "FDX" + ], + "WTC": "LM", + "Priority": 1 + }, + "I41": { + "Coordinates": "49.013383:2.502853:25", + "Use": "C", + "Schengen": false, + "Callsigns": [ + "FDX" + ], + "WTC": "LM", + "Priority": 3 + }, + "I42": { + "Coordinates": "49.013183:2.502228:25", + "Use": "C", + "Schengen": false, + "Callsigns": [ + "FDX" + ], + "WTC": "LM", + "Priority": 3 + }, + "I43": { + "Coordinates": "49.013128:2.501197:25", + "Use": "C", + "Schengen": false, + "Callsigns": [ + "FDX" + ], + "WTC": "LM", + "Priority": 3 + }, + "I44": { + "Coordinates": "49.013083:2.500389:25", + "Use": "C", + "Schengen": false, + "Callsigns": [ + "FDX" + ], + "WTC": "LM", + "Priority": 3 + }, + "I45": { + "Coordinates": "49.013042:2.499578:25", + "Use": "C", + "Schengen": false, + "Callsigns": [ + "FDX" + ], + "WTC": "LM", + "Priority": 3 + }, + "I46": { + "Coordinates": "49.012994:2.498767:25", + "Use": "C", + "Schengen": false, + "Callsigns": [ + "FDX" + ], + "WTC": "LM", + "Priority": 3 + }, + "I47": { + "Coordinates": "49.012953:2.497956:25", + "Use": "C", + "Schengen": false, + "Callsigns": [ + "FDX" + ], + "WTC": "LM", + "Priority": 3 + }, + "I48": { + "Coordinates": "49.0129:2.496983:25", + "Use": "C", + "Schengen": false, + "Callsigns": [ + "FDX" + ], + "WTC": "LM", + "Priority": 3 + }, + "I49": { + "Coordinates": "49.012856:2.496172:25", + "Use": "C", + "Schengen": false, + "Callsigns": [ + "FDX" + ], + "WTC": "LM", + "Priority": 3 + }, + "I50": { + "Coordinates": "49.012722:2.495375:25", + "Use": "C", + "Schengen": false, + "Callsigns": [ + "FDX" + ], + "WTC": "LM", + "Priority": 3 + }, + "I51": { + "Coordinates": "49.012461:2.494597:25", + "Use": "C", + "Schengen": false, + "Callsigns": [ + "FDX" + ], + "WTC": "LM", + "Priority": 3 + }, + "I52": { + "Coordinates": "49.012231:2.494703:25", + "Use": "C", + "Schengen": false, + "Callsigns": [ + "FDX" + ], + "WTC": "LM", + "Priority": 3 + }, + "I53": { + "Coordinates": "49.011925:2.494594:25", + "Use": "C", + "Schengen": false, + "Callsigns": [ + "FDX" + ], + "WTC": "LM", + "Priority": 3 + }, + "I54": { + "Coordinates": "49.011581:2.494783:25", + "Use": "C", + "Schengen": false, + "Callsigns": [ + "FDX" + ], + "WTC": "LM", + "Priority": 3 + }, + "I55": { + "Coordinates": "49.011392:2.494656:25", + "Use": "C", + "Schengen": false, + "Callsigns": [ + "FDX" + ], + "WTC": "LM", + "Priority": 3 + }, + "Q01": { + "Coordinates": "49.011536:2.5529:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "TSC", + "AIZ", + "KKK", + "BMR", + "CRL", + "IBS", + "JAF", + "EXS", + "ISS", + "NLY", + "LBT", + "OHY", + "PGT", + "SXS", + "TUX", + "VLG", + "AEE", + "MSC", + "AMV", + "FPO", + "AZI", + "CAI", + "ENT", + "FHY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "Q02": { + "Coordinates": "49.011581:2.553769:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "TSC", + "AIZ", + "KKK", + "BMR", + "CRL", + "IBS", + "JAF", + "EXS", + "ISS", + "NLY", + "LBT", + "OHY", + "PGT", + "SXS", + "TUX", + "VLG", + "AEE", + "MSC", + "AMV", + "FPO", + "AZI", + "CAI", + "ENT", + "FHY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "Q03": { + "Coordinates": "49.0116:2.554022:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "TSC", + "AIZ", + "KKK", + "BMR", + "CRL", + "IBS", + "JAF", + "EXS", + "ISS", + "NLY", + "LBT", + "OHY", + "PGT", + "SXS", + "TUX", + "VLG", + "AEE", + "MSC", + "AMV", + "FPO", + "AZI", + "CAI", + "ENT", + "FHY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "Q04": { + "Coordinates": "49.011611:2.554311:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "TSC", + "AIZ", + "KKK", + "BMR", + "CRL", + "IBS", + "JAF", + "EXS", + "ISS", + "NLY", + "LBT", + "OHY", + "PGT", + "SXS", + "TUX", + "VLG", + "AEE", + "MSC", + "AMV", + "FPO", + "AZI", + "CAI", + "ENT", + "FHY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "Q05": { + "Coordinates": "49.011639:2.554856:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "TSC", + "AIZ", + "KKK", + "BMR", + "CRL", + "IBS", + "JAF", + "EXS", + "ISS", + "NLY", + "LBT", + "OHY", + "PGT", + "SXS", + "TUX", + "VLG", + "AEE", + "MSC", + "AMV", + "FPO", + "AZI", + "CAI", + "ENT", + "FHY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "Q06": { + "Coordinates": "49.011658:2.555094:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "TSC", + "AIZ", + "KKK", + "BMR", + "CRL", + "IBS", + "JAF", + "EXS", + "ISS", + "NLY", + "LBT", + "OHY", + "PGT", + "SXS", + "TUX", + "VLG", + "AEE", + "MSC", + "AMV", + "FPO", + "AZI", + "CAI", + "ENT", + "FHY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "Q07": { + "Coordinates": "49.011669:2.555403:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "TSC", + "AIZ", + "KKK", + "BMR", + "CRL", + "IBS", + "JAF", + "EXS", + "ISS", + "NLY", + "LBT", + "OHY", + "PGT", + "SXS", + "TUX", + "VLG", + "AEE", + "MSC", + "AMV", + "FPO", + "AZI", + "CAI", + "ENT", + "FHY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "Q08": { + "Coordinates": "49.011697:2.555947:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "TSC", + "AIZ", + "KKK", + "BMR", + "CRL", + "IBS", + "JAF", + "EXS", + "ISS", + "NLY", + "LBT", + "OHY", + "PGT", + "SXS", + "TUX", + "VLG", + "AEE", + "MSC", + "AMV", + "FPO", + "AZI", + "CAI", + "ENT", + "FHY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "Q09": { + "Coordinates": "49.011722:2.556217:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "TSC", + "AIZ", + "KKK", + "BMR", + "CRL", + "IBS", + "JAF", + "EXS", + "ISS", + "NLY", + "LBT", + "OHY", + "PGT", + "SXS", + "TUX", + "VLG", + "AEE", + "MSC", + "AMV", + "FPO", + "AZI", + "CAI", + "ENT", + "FHY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "Q10": { + "Coordinates": "49.011728:2.556492:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "TSC", + "AIZ", + "KKK", + "BMR", + "CRL", + "IBS", + "JAF", + "EXS", + "ISS", + "NLY", + "LBT", + "OHY", + "PGT", + "SXS", + "TUX", + "VLG", + "AEE", + "MSC", + "AMV", + "FPO", + "AZI", + "CAI", + "ENT", + "FHY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "Q11": { + "Coordinates": "49.011756:2.557036:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "TSC", + "AIZ", + "KKK", + "BMR", + "CRL", + "IBS", + "JAF", + "EXS", + "ISS", + "NLY", + "LBT", + "OHY", + "PGT", + "SXS", + "TUX", + "VLG", + "AEE", + "MSC", + "AMV", + "FPO", + "AZI", + "CAI", + "ENT", + "FHY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "Q12": { + "Coordinates": "49.013633:2.556625:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "TSC", + "AIZ", + "KKK", + "BMR", + "CRL", + "IBS", + "JAF", + "EXS", + "ISS", + "NLY", + "LBT", + "OHY", + "PGT", + "SXS", + "TUX", + "VLG", + "AEE", + "MSC", + "AMV", + "FPO", + "AZI", + "CAI", + "ENT", + "FHY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "Q13": { + "Coordinates": "49.013631:2.556497:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "TSC", + "AIZ", + "KKK", + "BMR", + "CRL", + "IBS", + "JAF", + "EXS", + "ISS", + "NLY", + "LBT", + "OHY", + "PGT", + "SXS", + "TUX", + "VLG", + "AEE", + "MSC", + "AMV", + "FPO", + "AZI", + "CAI", + "ENT", + "FHY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "Q14": { + "Coordinates": "49.013603:2.556003:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "TSC", + "AIZ", + "KKK", + "BMR", + "CRL", + "IBS", + "JAF", + "EXS", + "ISS", + "NLY", + "LBT", + "OHY", + "PGT", + "SXS", + "TUX", + "VLG", + "AEE", + "MSC", + "AMV", + "FPO", + "AZI", + "CAI", + "ENT", + "FHY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "Q15": { + "Coordinates": "49.013567:2.555367:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "TSC", + "AIZ", + "KKK", + "BMR", + "CRL", + "IBS", + "JAF", + "EXS", + "ISS", + "NLY", + "LBT", + "OHY", + "PGT", + "SXS", + "TUX", + "VLG", + "AEE", + "MSC", + "AMV", + "FPO", + "AZI", + "CAI", + "ENT", + "FHY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "Q17": { + "Coordinates": "49.013528:2.554656:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "TSC", + "AIZ", + "KKK", + "BMR", + "CRL", + "IBS", + "JAF", + "EXS", + "ISS", + "NLY", + "LBT", + "OHY", + "PGT", + "SXS", + "TUX", + "VLG", + "AEE", + "MSC", + "AMV", + "FPO", + "AZI", + "CAI", + "ENT", + "FHY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "Q18": { + "Coordinates": "49.013522:2.554489:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "TSC", + "AIZ", + "KKK", + "BMR", + "CRL", + "IBS", + "JAF", + "EXS", + "ISS", + "NLY", + "LBT", + "OHY", + "PGT", + "SXS", + "TUX", + "VLG", + "AEE", + "MSC", + "AMV", + "FPO", + "AZI", + "CAI", + "ENT", + "FHY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "Q19": { + "Coordinates": "49.013492:2.554033:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "TSC", + "AIZ", + "KKK", + "BMR", + "CRL", + "IBS", + "JAF", + "EXS", + "ISS", + "NLY", + "LBT", + "OHY", + "PGT", + "SXS", + "TUX", + "VLG", + "AEE", + "MSC", + "AMV", + "FPO", + "AZI", + "CAI", + "ENT", + "FHY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "Q20": { + "Coordinates": "49.013469:2.5535:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "TSC", + "AIZ", + "KKK", + "BMR", + "CRL", + "IBS", + "JAF", + "EXS", + "ISS", + "NLY", + "LBT", + "OHY", + "PGT", + "SXS", + "TUX", + "VLG", + "AEE", + "MSC", + "AMV", + "FPO", + "AZI", + "CAI", + "ENT", + "FHY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "Q21": { + "Coordinates": "49.013458:2.553397:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "TSC", + "AIZ", + "KKK", + "BMR", + "CRL", + "IBS", + "JAF", + "EXS", + "ISS", + "NLY", + "LBT", + "OHY", + "PGT", + "SXS", + "TUX", + "VLG", + "AEE", + "MSC", + "AMV", + "FPO", + "AZI", + "CAI", + "ENT", + "FHY" + ], + "WTC": "LMH", + "Priority": 3 + }, + "K01": { + "Coordinates": "49.00755:2.585256:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN" + ], + "WTC": "LM", + "Priority": 3 + }, + "K05": { + "Coordinates": "49.007481:2.585244:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN" + ], + "WTC": "L", + "Priority": 3 + }, + "K09": { + "Coordinates": "49.006881:2.585339:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN" + ], + "WTC": "L", + "Priority": 3 + }, + "K13": { + "Coordinates": "49.006294:2.585408:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN" + ], + "WTC": "L", + "Priority": 3 + }, + "K17": { + "Coordinates": "49.006228:2.585419:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN" + ], + "WTC": "LM", + "Priority": 3 + }, + "K21": { + "Coordinates": "49.005578:2.5855:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN" + ], + "WTC": "L", + "Priority": 3 + }, + "K26": { + "Coordinates": "49.0077:2.589967:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN" + ], + "WTC": "L", + "Priority": 3 + }, + "K32": { + "Coordinates": "49.00705:2.589828:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN" + ], + "WTC": "L", + "Priority": 3 + }, + "K38": { + "Coordinates": "49.006494:2.589906:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN" + ], + "WTC": "L", + "Priority": 3 + }, + "K44": { + "Coordinates": "49.00575:2.589986:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN" + ], + "WTC": "L", + "Priority": 3 + }, + "K52": { + "Coordinates": "49.003953:2.590206:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN" + ], + "WTC": "L", + "Priority": 3 + }, + "K53": { + "Coordinates": "49.003639:2.585717:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN" + ], + "WTC": "L", + "Priority": 3 + }, + "K58": { + "Coordinates": "49.003303:2.590369:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN" + ], + "WTC": "L", + "Priority": 3 + }, + "K59": { + "Coordinates": "49.002833:2.585836:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN" + ], + "WTC": "L", + "Priority": 3 + }, + "K64": { + "Coordinates": "49.002653:2.590369:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN" + ], + "WTC": "L", + "Priority": 3 + }, + "K65": { + "Coordinates": "49.002028:2.585936:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN" + ], + "WTC": "L", + "Priority": 3 + }, + "K70": { + "Coordinates": "49.002003:2.590447:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN" + ], + "WTC": "L", + "Priority": 3 + }, + "K71": { + "Coordinates": "49.001389:2.586003:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN" + ], + "WTC": "L", + "Priority": 3 + }, + "K76": { + "Coordinates": "49.001347:2.590528:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN" + ], + "WTC": "L", + "Priority": 3 + }, + "L27": { + "Coordinates": "49.007747:2.591078:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN" + ], + "WTC": "L", + "Priority": 3 + }, + "L33": { + "Coordinates": "49.007144:2.591175:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN" + ], + "WTC": "L", + "Priority": 3 + }, + "L39": { + "Coordinates": "49.006181:2.591272:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN" + ], + "WTC": "L", + "Priority": 3 + }, + "L53": { + "Coordinates": "49.003878:2.591636:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN" + ], + "WTC": "L", + "Priority": 3 + }, + "L59": { + "Coordinates": "49.003094:2.591731:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN" + ], + "WTC": "L", + "Priority": 3 + }, + "L65": { + "Coordinates": "49.002308:2.591828:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN" + ], + "WTC": "L", + "Priority": 3 + }, + "L71": { + "Coordinates": "49.001525:2.591925:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AFR", + "AMX", + "MAU", + "CES", + "CSN", + "DAL", + "BEE", + "JAL", + "KAL", + "MEA", + "ROT", + "HVN" + ], + "WTC": "L", + "Priority": 3 + }, + "T01": { + "Coordinates": "49.013022:2.544289:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "CCA", + "ANA", + "AAR", + "TCV", + "CRC", + "9BQ", + "MSR", + "EVA", + "KAC", + "DJT", + "NAX", + "PIA", + "QTR", + "RAM", + "SIA", + "ALK", + "TAM", + "DTH", + "THA", + "THY", + "UAL", + "SVR" + ], + "WTC": "LMH", + "Priority": 3 + }, + "T02": { + "Coordinates": "49.012689:2.544464:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "CCA", + "ANA", + "AAR", + "TCV", + "CRC", + "9BQ", + "MSR", + "EVA", + "KAC", + "DJT", + "NAX", + "PIA", + "QTR", + "RAM", + "SIA", + "ALK", + "TAM", + "DTH", + "THA", + "THY", + "UAL", + "SVR" + ], + "WTC": "LMH", + "Priority": 3 + }, + "T03": { + "Coordinates": "49.012722:2.544667:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "CCA", + "ANA", + "AAR", + "TCV", + "CRC", + "9BQ", + "MSR", + "EVA", + "KAC", + "DJT", + "NAX", + "PIA", + "QTR", + "RAM", + "SIA", + "ALK", + "TAM", + "DTH", + "THA", + "THY", + "UAL", + "SVR" + ], + "WTC": "LMH", + "Priority": 3 + }, + "T04": { + "Coordinates": "49.013128:2.545525:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "CCA", + "ANA", + "AAR", + "TCV", + "CRC", + "9BQ", + "MSR", + "EVA", + "KAC", + "DJT", + "NAX", + "PIA", + "QTR", + "RAM", + "SIA", + "ALK", + "TAM", + "DTH", + "THA", + "THY", + "UAL", + "SVR" + ], + "WTC": "LMH", + "Priority": 3 + }, + "T05": { + "Coordinates": "49.013656:2.545825:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "CCA", + "ANA", + "AAR", + "TCV", + "CRC", + "9BQ", + "MSR", + "EVA", + "KAC", + "DJT", + "NAX", + "PIA", + "QTR", + "RAM", + "SIA", + "ALK", + "TAM", + "DTH", + "THA", + "THY", + "UAL", + "SVR" + ], + "WTC": "LMH", + "Priority": 3 + }, + "T06": { + "Coordinates": "49.013997:2.545292:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "CCA", + "ANA", + "AAR", + "TCV", + "CRC", + "9BQ", + "MSR", + "EVA", + "KAC", + "DJT", + "NAX", + "PIA", + "QTR", + "RAM", + "SIA", + "ALK", + "TAM", + "DTH", + "THA", + "THY", + "UAL", + "SVR" + ], + "WTC": "LMH", + "Priority": 3 + }, + "T07": { + "Coordinates": "49.014044:2.544536:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "CCA", + "ANA", + "AAR", + "TCV", + "CRC", + "9BQ", + "MSR", + "EVA", + "KAC", + "DJT", + "NAX", + "PIA", + "QTR", + "RAM", + "SIA", + "ALK", + "TAM", + "DTH", + "THA", + "THY", + "UAL", + "SVR" + ], + "WTC": "LMH", + "Priority": 3 + }, + "T08": { + "Coordinates": "49.013986:2.545133:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "CCA", + "ANA", + "AAR", + "TCV", + "CRC", + "9BQ", + "MSR", + "EVA", + "KAC", + "DJT", + "NAX", + "PIA", + "QTR", + "RAM", + "SIA", + "ALK", + "TAM", + "DTH", + "THA", + "THY", + "UAL", + "SVR" + ], + "WTC": "LMH", + "Priority": 3 + }, + "T09": { + "Coordinates": "49.013861:2.545603:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "CCA", + "ANA", + "AAR", + "TCV", + "CRC", + "9BQ", + "MSR", + "EVA", + "KAC", + "DJT", + "NAX", + "PIA", + "QTR", + "RAM", + "SIA", + "ALK", + "TAM", + "DTH", + "THA", + "THY", + "UAL", + "SVR" + ], + "WTC": "LMH", + "Priority": 3 + }, + "V01": { + "Coordinates": "49.015761:2.544328:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "CCA", + "ANA", + "AAR", + "TCV", + "CRC", + "9BQ", + "MSR", + "EVA", + "KAC", + "DJT", + "NAX", + "PIA", + "QTR", + "RAM", + "SIA", + "ALK", + "TAM", + "DTH", + "THA", + "THY", + "UAL", + "SVR" + ], + "WTC": "LMH", + "Priority": 3 + }, + "V02": { + "Coordinates": "49.016058:2.544989:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "CCA", + "ANA", + "AAR", + "TCV", + "CRC", + "9BQ", + "MSR", + "EVA", + "KAC", + "DJT", + "NAX", + "PIA", + "QTR", + "RAM", + "SIA", + "ALK", + "TAM", + "DTH", + "THA", + "THY", + "UAL", + "SVR" + ], + "WTC": "LMH", + "Priority": 3 + }, + "V03": { + "Coordinates": "49.015847:2.54445:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "CCA", + "ANA", + "AAR", + "TCV", + "CRC", + "9BQ", + "MSR", + "EVA", + "KAC", + "DJT", + "NAX", + "PIA", + "QTR", + "RAM", + "SIA", + "ALK", + "TAM", + "DTH", + "THA", + "THY", + "UAL", + "SVR" + ], + "WTC": "LMH", + "Priority": 3 + }, + "V04": { + "Coordinates": "49.016564:2.544386:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "CCA", + "ANA", + "AAR", + "TCV", + "CRC", + "9BQ", + "MSR", + "EVA", + "KAC", + "DJT", + "NAX", + "PIA", + "QTR", + "RAM", + "SIA", + "ALK", + "TAM", + "DTH", + "THA", + "THY", + "UAL", + "SVR" + ], + "WTC": "L", + "Priority": 3 + }, + "V05": { + "Coordinates": "49.01685:2.54365:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "CCA", + "ANA", + "AAR", + "TCV", + "CRC", + "9BQ", + "MSR", + "EVA", + "KAC", + "DJT", + "NAX", + "PIA", + "QTR", + "RAM", + "SIA", + "ALK", + "TAM", + "DTH", + "THA", + "THY", + "UAL", + "SVR" + ], + "WTC": "L", + "Priority": 3 + }, + "V06": { + "Coordinates": "49.016569:2.543047:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "CCA", + "ANA", + "AAR", + "TCV", + "CRC", + "9BQ", + "MSR", + "EVA", + "KAC", + "DJT", + "NAX", + "PIA", + "QTR", + "RAM", + "SIA", + "ALK", + "TAM", + "DTH", + "THA", + "THY", + "UAL", + "SVR" + ], + "WTC": "LMH", + "Priority": 3 + }, + "V07": { + "Coordinates": "49.016083:2.542844:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "CCA", + "ANA", + "AAR", + "TCV", + "CRC", + "9BQ", + "MSR", + "EVA", + "KAC", + "DJT", + "NAX", + "PIA", + "QTR", + "RAM", + "SIA", + "ALK", + "TAM", + "DTH", + "THA", + "THY", + "UAL", + "SVR" + ], + "WTC": "LMH", + "Priority": 3 + }, + "V08": { + "Coordinates": "49.016464:2.543036:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "CCA", + "ANA", + "AAR", + "TCV", + "CRC", + "9BQ", + "MSR", + "EVA", + "KAC", + "DJT", + "NAX", + "PIA", + "QTR", + "RAM", + "SIA", + "ALK", + "TAM", + "DTH", + "THA", + "THY", + "UAL", + "SVR" + ], + "WTC": "LM", + "Priority": 3 + }, + "W01": { + "Coordinates": "49.016494:2.542422:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AEE", + "BEL", + "EWG", + "GWI", + "ICE", + "LOT", + "LHA", + "DLH", + "SAS", + "SWR", + "WOW" + ], + "WTC": "LMH", + "Priority": 3 + }, + "W02": { + "Coordinates": "49.017:2.542633:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AEE", + "BEL", + "EWG", + "GWI", + "ICE", + "LOT", + "LHA", + "DLH", + "SAS", + "SWR", + "WOW" + ], + "WTC": "LMH", + "Priority": 3 + }, + "W03": { + "Coordinates": "49.016575:2.542439:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AEE", + "BEL", + "EWG", + "GWI", + "ICE", + "LOT", + "LHA", + "DLH", + "SAS", + "SWR", + "WOW" + ], + "WTC": "LMH", + "Priority": 3 + }, + "W04": { + "Coordinates": "49.017131:2.541678:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AEE", + "BEL", + "EWG", + "GWI", + "ICE", + "LOT", + "LHA", + "DLH", + "SAS", + "SWR", + "WOW" + ], + "WTC": "LM", + "Priority": 3 + }, + "W05": { + "Coordinates": "49.017036:2.540847:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AEE", + "BEL", + "EWG", + "GWI", + "ICE", + "LOT", + "LHA", + "DLH", + "SAS", + "SWR", + "WOW" + ], + "WTC": "LMH", + "Priority": 3 + }, + "W06": { + "Coordinates": "49.016594:2.540631:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AEE", + "BEL", + "EWG", + "GWI", + "ICE", + "LOT", + "LHA", + "DLH", + "SAS", + "SWR", + "WOW" + ], + "WTC": "LMH", + "Priority": 3 + }, + "W07": { + "Coordinates": "49.016111:2.540967:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AEE", + "BEL", + "EWG", + "GWI", + "ICE", + "LOT", + "LHA", + "DLH", + "SAS", + "SWR", + "WOW" + ], + "WTC": "LMH", + "Priority": 3 + }, + "W08": { + "Coordinates": "49.016483:2.540742:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AEE", + "BEL", + "EWG", + "GWI", + "ICE", + "LOT", + "LHA", + "DLH", + "SAS", + "SWR", + "WOW" + ], + "WTC": "LM", + "Priority": 3 + }, + "X01": { + "Coordinates": "49.016247:2.540239:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AEE", + "BEL", + "EWG", + "GWI", + "ICE", + "LOT", + "LHA", + "DLH", + "SAS", + "SWR", + "WOW" + ], + "WTC": "LMH", + "Priority": 3 + }, + "X02": { + "Coordinates": "49.016722:2.539908:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AEE", + "BEL", + "EWG", + "GWI", + "ICE", + "LOT", + "LHA", + "DLH", + "SAS", + "SWR", + "WOW" + ], + "WTC": "LMH", + "Priority": 3 + }, + "X03": { + "Coordinates": "49.016339:2.540142:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AEE", + "BEL", + "EWG", + "GWI", + "ICE", + "LOT", + "LHA", + "DLH", + "SAS", + "SWR", + "WOW" + ], + "WTC": "LMH", + "Priority": 3 + }, + "X04": { + "Coordinates": "49.016425:2.539044:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AEE", + "BEL", + "EWG", + "GWI", + "ICE", + "LOT", + "LHA", + "DLH", + "SAS", + "SWR", + "WOW" + ], + "WTC": "LM", + "Priority": 3 + }, + "X05": { + "Coordinates": "49.015997:2.5385:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AEE", + "BEL", + "EWG", + "GWI", + "ICE", + "LOT", + "LHA", + "DLH", + "SAS", + "SWR", + "WOW" + ], + "WTC": "LMH", + "Priority": 3 + }, + "X06": { + "Coordinates": "49.01555:2.538828:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AEE", + "BEL", + "EWG", + "GWI", + "ICE", + "LOT", + "LHA", + "DLH", + "SAS", + "SWR", + "WOW" + ], + "WTC": "LMH", + "Priority": 3 + }, + "X07": { + "Coordinates": "49.015342:2.5395:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AEE", + "BEL", + "EWG", + "GWI", + "ICE", + "LOT", + "LHA", + "DLH", + "SAS", + "SWR", + "WOW" + ], + "WTC": "LMH", + "Priority": 3 + }, + "X08": { + "Coordinates": "49.015531:2.538961:25", + "Use": "A", + "Schengen": true, + "Callsigns": [ + "AEE", + "BEL", + "EWG", + "GWI", + "ICE", + "LOT", + "LHA", + "DLH", + "SAS", + "SWR", + "WOW" + ], + "WTC": "LM", + "Priority": 3 + }, + "Y01": { + "Coordinates": "49.015139:2.538808:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "CCA", + "ANA", + "AAR", + "TCV", + "CRC", + "9BQ", + "MSR", + "EVA", + "KAC", + "DJT", + "NAX", + "PIA", + "QTR", + "RAM", + "SIA", + "ALK", + "TAM", + "DTH", + "THA", + "THY", + "UAL", + "SVR" + ], + "WTC": "LMH", + "Priority": 3 + }, + "Y02": { + "Coordinates": "49.015361:2.538094:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "CCA", + "ANA", + "AAR", + "TCV", + "CRC", + "9BQ", + "MSR", + "EVA", + "KAC", + "DJT", + "NAX", + "PIA", + "QTR", + "RAM", + "SIA", + "ALK", + "TAM", + "DTH", + "THA", + "THY", + "UAL", + "SVR" + ], + "WTC": "LMH", + "Priority": 3 + }, + "Y03": { + "Coordinates": "49.015164:2.538644:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "CCA", + "ANA", + "AAR", + "TCV", + "CRC", + "9BQ", + "MSR", + "EVA", + "KAC", + "DJT", + "NAX", + "PIA", + "QTR", + "RAM", + "SIA", + "ALK", + "TAM", + "DTH", + "THA", + "THY", + "UAL", + "SVR" + ], + "WTC": "LMH", + "Priority": 3 + }, + "Y04": { + "Coordinates": "49.014767:2.537731:25", + "Use": "A", + "Schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "CCA", + "ANA", + "AAR", + "TCV", + "CRC", + "9BQ", + "MSR", + "EVA", + "KAC", + "DJT", + "NAX", + "PIA", + "QTR", + "RAM", + "SIA", + "ALK", + "TAM", + "DTH", + "THA", + "THY", + "UAL", + "SVR" + ], + "WTC": "LM", + "Priority": 3 + }, + "Y05": { + "Coordinates": "49.014194:2.537744:25", + "Use": "A", + "schengen": false, + "Callsigns": [ + "AEE", + "EIN", + "CCA", + "ANA", + "AAR", + "TCV", + "CRC", + "9BQ", + "MSR", + "EVA", + "KAC", + "DJT", + "NAX", + "PIA", + "QTR", + "RAM", + "SIA", + "ALK", + "TAM", + "DTH", + "THA", + "THY", + "UAL", + "SVR" + ], + "WTC": "LMH", + "Priority": 3 + } + } +} \ No newline at end of file diff --git a/src/config/config.json b/src/config/config.json new file mode 100644 index 0000000..cd54c6f --- /dev/null +++ b/src/config/config.json @@ -0,0 +1,207 @@ +{ + "config_github_url": "", + "update_interval": 5, + "max_alt": 15000, + "max_distance": 50.0, + "CargoOperator": [ + "FDX", + "UPS", + "GTI", + "CLX", + "CKS", + "BCS", + "GEC", + "ABW", + "NCA", + "RCH", + "SQC", + "CMB", + "BOX", + "MPH", + "TAY", + "QAJ", + "ICV", + "KYE", + "ACX", + "BRQ", + "FPO" + ], + "Helicopters": [ + "H145", + "H135", + "EC135", + "EC145", + "EC130", + "EC120", + "EC155", + "AS350", + "AS355", + "AS365", + "AS565", + "R22", + "R44", + "R66", + "B06", + "B407", + "B412", + "B429", + "B430", + "S76", + "S92", + "MD500", + "MD520", + "MD530", + "AW109", + "AW139", + "AW169", + "AW189", + "UH60", + "H60", + "MI8", + "MI17", + "SA330", + "SA341", + "SA342" + ], + "Military": [ + "F16", + "F18", + "F22", + "F35", + "A10", + "B52", + "C130", + "C17", + "KC135", + "KC10", + "E3", + "E6", + "P8", + "T38", + "AH64", + "UH60", + "CH47", + "F15", + "AV8B", + "EA18G", + "C5M", + "C40B", + "C37A", + "C37B", + "C32B" + ], + "GeneralAviation": [ + "C150", + "C152", + "C172", + "C175", + "C177", + "C182", + "C185", + "C206", + "C207", + "C210", + "C337", + "C340", + "C402", + "C414", + "C421", + "C208", + "PA18", + "PA28", + "P28A", + "PA32", + "PA34", + "PA44", + "PA46", + "P46T", + "PA24", + "PA30", + "BE33", + "BE35", + "BE36", + "BE55", + "BE58", + "BE9L", + "BE10", + "BE20", + "B350", + "SR20", + "SR22", + "SR22T", + "DA20", + "DA40", + "DA42", + "DA50", + "DA62", + "M20P", + "M20T", + "M20R", + "M20J", + "DR40", + "DR221", + "DR253", + "DR300", + "DR315", + "DR400", + "TB10", + "TB20", + "TB21", + "TBM7", + "TBM8", + "TBM9", + "PC12", + "PC6", + "RV6", + "RV7", + "RV8", + "RV9", + "RV10", + "RV12", + "C510", + "C525", + "C25A", + "C25B", + "C25C", + "C560", + "C56X", + "C650", + "C680", + "C68A", + "C700", + "E50P", + "E55P", + "E545", + "E35L", + "E545", + "E550", + "LJ24", + "LJ31", + "LJ35", + "LJ40", + "LJ45", + "LJ55", + "LJ60", + "LJ70", + "LJ75", + "FA20", + "FA50", + "FA7X", + "FA8X", + "FA900", + "GLF2", + "GLF3", + "GLF4", + "GLF5", + "GLF6", + "GLF650", + "GLF7", + "GLF8", + "CL30", + "CL35", + "CL60", + "G150", + "G200", + "G280" + ] +} \ No newline at end of file diff --git a/src/core/CompileCommands.h b/src/core/CompileCommands.h index dcc9f74..2997b2d 100644 --- a/src/core/CompileCommands.h +++ b/src/core/CompileCommands.h @@ -38,6 +38,13 @@ void NeoSTAND::RegisterCommand() { definition.parameters.clear(); airportsCommandId_ = chatAPI_->registerCommand(definition.name, definition, CommandProvider_); + + definition.name = "stand dump"; + definition.description = "Dump current config to log file"; + definition.lastParameterHasSpaces = false; + definition.parameters.clear(); + + dumpCommandId_ = chatAPI_->registerCommand(definition.name, definition, CommandProvider_); definition.name = "stand occupied"; definition.description = "Display all occupied stands"; @@ -52,6 +59,18 @@ void NeoSTAND::RegisterCommand() { definition.parameters.clear(); blockedCommandId_ = chatAPI_->registerCommand(definition.name, definition, CommandProvider_); + + definition.name = "stand pilot"; + definition.description = "check if a pilot is on a stand"; + definition.lastParameterHasSpaces = false; + definition.parameters.clear(); + + Chat::CommandParameter param; + param.name = "callsign"; + param.required = false; + definition.parameters.push_back(param); + + pilotCommandId_ = chatAPI_->registerCommand(definition.name, definition, CommandProvider_); } catch (const std::exception& ex) { @@ -67,12 +86,94 @@ inline void NeoSTAND::unegisterCommand() chatAPI_->unregisterCommand(helpCommandId_); chatAPI_->unregisterCommand(toggleModeCommandId_); chatAPI_->unregisterCommand(airportsCommandId_); + chatAPI_->unregisterCommand(dumpCommandId_); chatAPI_->unregisterCommand(occupiedCommandId_); chatAPI_->unregisterCommand(blockedCommandId_); + chatAPI_->unregisterCommand(pilotCommandId_); CommandProvider_.reset(); } } +void generateDumpLog(std::vector& lines, std::string time, NeoSTAND* neoSTAND) +{ + lines.push_back("NeoSTAND Configuration Dump :" + time); + lines.push_back("Version: " + std::string(NEOSTAND_VERSION)); + lines.push_back("Update Interval: " + std::to_string(neoSTAND->GetDataManager()->getUpdateInterval()) + " seconds"); + lines.push_back("Max Altitude: " + std::to_string(neoSTAND->GetDataManager()->getMaxAltitude()) + " feet"); + lines.push_back("Max Distance: " + std::to_string(neoSTAND->GetDataManager()->getMaxDistance()) + " NM"); + lines.push_back("Config URL: " + neoSTAND->GetDataManager()->getConfigUrl()); + lines.push_back("Active Airports:"); + std::vector airports = neoSTAND->GetDataManager()->getAllActiveAirports(); + if (airports.empty()) { + lines.push_back(" None"); + } + else { + for (const std::string& airport : airports) { + lines.push_back(" " + airport); + } + } + lines.push_back("Pilots:"); + std::vector pilots = neoSTAND->GetDataManager()->getAllPilots(); + if (pilots.empty()) { + lines.push_back(" None"); + } + else { + for (const DataManager::Pilot& pilot : pilots) { + lines.push_back(" " + pilot.callsign + " - Dest:" + pilot.destination + " - WTC:" + pilot.aircraftWTC + " - " + + (pilot.isSchengen ? "Schengen" : "Non-Schengen") + " - " + + (pilot.isNational ? "National" : "International") + " - Stand: " + (pilot.stand.empty() ? "None" : pilot.stand)); + } + } + lines.push_back("Occupied Stands:"); + std::vector occupiedStands = neoSTAND->GetDataManager()->getOccupiedStands(); + if (occupiedStands.empty()) { + lines.push_back(" None"); + } + else { + for (const DataManager::Stand& stand : occupiedStands) { + lines.push_back(" " + stand.name + " (" + stand.icao + ") - " + stand.callsign); + } + } + lines.push_back("Blocked Stands:"); + std::vector blockedStands = neoSTAND->GetDataManager()->getBlockedStands(); + if (blockedStands.empty()) { + lines.push_back(" None"); + } + else { + for (const DataManager::Stand& stand : blockedStands) { + lines.push_back(" " + stand.name + " (" + stand.icao + ") - " + stand.callsign); + } + } + lines.push_back("Ignored Callsigns:"); + std::unordered_set ignoredCallsigns = neoSTAND->GetIgnoredCallsigns(); + if (ignoredCallsigns.empty()) { + lines.push_back(" None"); + } + else { + for (const std::string& callsign : ignoredCallsigns) { + lines.push_back(" " + callsign); + } + } + lines.push_back("Cargo Types: "); + for (const std::string& type : neoSTAND->GetDataManager()->getCargoTypes()) { + lines.push_back(" " + type); + } + lines.push_back("Helicopter Types: "); + for (const std::string& type : neoSTAND->GetDataManager()->getHeliTypes()) { + lines.push_back(" " + type); + } + lines.push_back("Military Types: "); + for (const std::string& type : neoSTAND->GetDataManager()->getMilitaryTypes()) { + lines.push_back(" " + type); + } + lines.push_back("General Aviation Types: "); + for (const std::string& type : neoSTAND->GetDataManager()->getGATypes()) { + lines.push_back(" " + type); + } + lines.push_back("End of Configuration Dump."); +} + + Chat::CommandResult NeoSTANDCommandProvider::Execute( const std::string &commandId, const std::vector &args) { if (commandId == neoSTAND_->versionCommandId_) @@ -89,6 +190,8 @@ Chat::CommandResult NeoSTANDCommandProvider::Execute( const std::string &command ".stand airports", ".stand occupied", ".stand blocked", + ".stand dump" + ".stand pilot ", }) { neoSTAND_->DisplayMessage(line); @@ -121,14 +224,16 @@ Chat::CommandResult NeoSTANDCommandProvider::Execute( const std::string &command } else if (commandId == neoSTAND_->occupiedCommandId_) { - std::vector stands = neoSTAND_->GetDataManager()->getOccupiedStands(); + std::vector stands = neoSTAND_->GetDataManager()->getOccupiedStands(); if (stands.empty()) { neoSTAND_->DisplayMessage("No occupied stands found."); } else { - stands.emplace(stands.begin(), "Occupied Stands:"); - for (const std::string& line : stands) + neoSTAND_->DisplayMessage("Occupied Stands:"); + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + for (const DataManager::Stand& stand : stands) { + std::string line = stand.name + " (" + stand.icao + ") - " + stand.callsign; neoSTAND_->DisplayMessage(line); std::this_thread::sleep_for(std::chrono::milliseconds(1)); } @@ -137,17 +242,68 @@ Chat::CommandResult NeoSTANDCommandProvider::Execute( const std::string &command } else if (commandId == neoSTAND_->blockedCommandId_) { - std::vector stands = neoSTAND_->GetDataManager()->getBlockedStands(); + std::vector stands = neoSTAND_->GetDataManager()->getBlockedStands(); if (stands.empty()) { neoSTAND_->DisplayMessage("No blocked stands found."); } else { - stands.emplace(stands.begin(), "Blocked Stands:"); - for (const std::string& line : stands) + neoSTAND_->DisplayMessage("Blocked Stands:"); + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + for (const DataManager::Stand& stand : stands) { + std::string line = stand.name + " (" + stand.icao + ") - " + stand.callsign; neoSTAND_->DisplayMessage(line); std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } + } + } + return { true, std::nullopt }; + } + else if (commandId == neoSTAND_->dumpCommandId_) + { + std::vector lines; + std::chrono::system_clock::time_point now = std::chrono::system_clock::now(); + std::time_t now_c = std::chrono::system_clock::to_time_t(now); + generateDumpLog(lines, std::string(std::ctime(&now_c)), neoSTAND_); + std::tm tm{}; +#if defined(_WIN32) + if (localtime_s(&tm, &now_c) != 0) { + neoSTAND_->DisplayMessage("Failed to get local time."); + return { true, std::nullopt }; + } +#else + if (localtime_r(&now_c, &tm) == nullptr) { + neoSTAND_->DisplayMessage("Failed to get local time."); + return { true, std::nullopt }; + } +#endif + std::ostringstream oss; + oss << "NeoSTAND_ConfigDump_" + << std::put_time(&tm, "%Y-%m-%d_%H-%M-%S") + << ".txt"; + std::string fileName = oss.str(); + + bool success = neoSTAND_->GetDataManager()->printToFile(lines, fileName); + if (!success) { + neoSTAND_->DisplayMessage("Failed to write dump log."); + return { true, std::nullopt }; + } + neoSTAND_->DisplayMessage("Configuration dumped to " + fileName); + return { true, std::nullopt }; + } + else if (commandId == neoSTAND_->pilotCommandId_) + { + if (args.empty()) { + neoSTAND_->DisplayMessage("Usage: .stand pilot "); + return { true, "error" }; + } + std::string callsign = args[0]; + std::transform(callsign.begin(), callsign.end(), callsign.begin(), ::toupper); + std::string stand = neoSTAND_->GetDataManager()->isAircraftOnStand(callsign); + if (stand.empty()) { + neoSTAND_->DisplayMessage("Pilot " + callsign + " is not on a stand."); + } + else { + neoSTAND_->DisplayMessage("Pilot " + callsign + " is on stand: " + stand); } return { true, std::nullopt }; } diff --git a/src/core/DataManager.cpp b/src/core/DataManager.cpp index 366a503..d864021 100644 --- a/src/core/DataManager.cpp +++ b/src/core/DataManager.cpp @@ -1,18 +1,10 @@ #include #include +#include #include "../NeoSTAND.h" #include "DataManager.h" -#if defined(_WIN32) -#include -#include -#include -#elif defined(__APPLE__) || defined(__linux__) -#include -#include -#endif - #ifdef DEV #define LOG_DEBUG(loglevel, message) loggerAPI_->log(loglevel, message) #else @@ -29,29 +21,17 @@ DataManager::DataManager(stand::NeoSTAND* neoSTAND) controllerDataAPI_ = neoSTAND_->GetControllerDataAPI(); configPath_ = getDllDirectory(); + loadSettingJson(); + bool success = parseSettings(); + configsError_.clear(); + configsDownloaded_.clear(); + callsignError_.clear(); } std::filesystem::path DataManager::getDllDirectory() { -#if defined(_WIN32) - PWSTR path = nullptr; - HRESULT hr = SHGetKnownFolderPath(FOLDERID_Documents, 0, NULL, &path); - std::filesystem::path documentsPath; - if (SUCCEEDED(hr)) { - documentsPath = path; - CoTaskMemFree(path); - } - return documentsPath / "NeoRadar/plugins"; -#elif defined(__APPLE__) || defined(__linux__) - const char* homeDir = std::getenv("HOME"); - if (homeDir) { - return std::filesystem::path(homeDir) / "Documents" / "NeoRadar/plugins"; - } - return std::filesystem::path(); // Return empty path if HOME is not set -#else - return std::filesystem::path(); // Return an empty path for unsupported platforms -#endif + return neoSTAND_->GetClientInfo().documentsPath; } void DataManager::clearData() @@ -73,6 +53,7 @@ void DataManager::clearJson() { std::lock_guard lock(dataMutex_); configJson_.clear(); + settingJson_.clear(); } void DataManager::DisplayMessageFromDataManager(const std::string& message, const std::string& sender) @@ -88,45 +69,129 @@ void DataManager::DisplayMessageFromDataManager(const std::string& message, cons int DataManager::retrieveConfigJson(const std::string& icao) { - std::string fileName = icao + ".json"; - std::filesystem::path jsonPath = configPath_ / "NeoSTAND" / fileName; - - std::ifstream config(jsonPath); - if (!config.is_open()) { - DisplayMessageFromDataManager("Could not open JSON file: " + jsonPath.string(), "DataManager"); - loggerAPI_->log(Logger::LogLevel::Error, "Could not open JSON file: " + jsonPath.string()); - return -1; - } - - nlohmann::ordered_json parsed; - try { - config >> parsed; - if (parsed.contains("version")) { - if (!isCorrectJsonVersion(parsed["version"].get(), fileName)) { - return -1; - } - } - else { - DisplayMessageFromDataManager("Config version missing in JSON file: " + fileName, "DataManager"); - } - } - catch (...) { - DisplayMessageFromDataManager("Error parsing JSON file: " + jsonPath.string(), "DataManager"); - loggerAPI_->log(Logger::LogLevel::Error, "Error parsing JSON file: " + jsonPath.string()); - return -1; - } - - { - std::lock_guard lock(dataMutex_); - configJson_ = std::move(parsed); - } - - return 0; + std::string icaoUpper = icao; + std::transform(icaoUpper.begin(), icaoUpper.end(), icaoUpper.begin(), ::toupper); + const std::string fileName = icaoUpper + ".json"; + const std::filesystem::path jsonPath = configPath_ / "Plugins/NeoSTAND" / fileName; + + nlohmann::ordered_json tempJson; + bool alreadyDownloaded = false; + + { + std::lock_guard lock(dataMutex_); + if (configsDownloaded_.contains(icaoUpper)) alreadyDownloaded = true; + } + + for (int attempt = 0; attempt < 2; ++attempt) + { + std::ifstream config(jsonPath); + if (!config.is_open()) + { + if (!alreadyDownloaded) + { + configJson_.clear(); + bool downloadOk = neoSTAND_->downloadAirportConfig(icao); + alreadyDownloaded = true; + if (!downloadOk) return -1; + continue; + } + bool firstErrorForFile; + { + std::lock_guard lock(dataMutex_); + firstErrorForFile = !configsError_.contains(icaoUpper); + configsError_.insert(icaoUpper); + } + if (firstErrorForFile) + { + DisplayMessageFromDataManager("Could not open JSON file: " + jsonPath.string(), "DataManager"); + loggerAPI_->log(Logger::LogLevel::Error, "Could not open JSON file: " + jsonPath.string()); + } + + return -1; + } + + try { + config >> tempJson; + } + catch (...) { + DisplayMessageFromDataManager("Error parsing JSON file: " + jsonPath.string(), "DataManager"); + loggerAPI_->log(Logger::LogLevel::Error, "Error parsing JSON file: " + jsonPath.string()); + return -1; + } + + if (!tempJson.contains("version")) + { + if (!alreadyDownloaded) + { + configJson_.clear(); + bool downloadOk = neoSTAND_->downloadAirportConfig(icao); + alreadyDownloaded = true; + if (!downloadOk) return -1; + std::this_thread::sleep_for(std::chrono::milliseconds(300)); + continue; + } + { + std::lock_guard lock(dataMutex_); + if (!configsError_.contains(icaoUpper)) + configsError_.insert(icaoUpper); + else return -1; + } + DisplayMessageFromDataManager("Config version missing in JSON file: " + fileName, "DataManager"); + loggerAPI_->log(Logger::LogLevel::Error, "Config version missing in JSON file: " + fileName); + return -1; + } + + const std::string versionRead = tempJson["version"].get(); + std::string version = neoSTAND_->getConfigVersion(); + if (!version.empty() && versionRead != version) + { + bool firstErrorForFile; + { + std::lock_guard lock(dataMutex_); + firstErrorForFile = !configsError_.contains(icaoUpper); + configsError_.insert(icaoUpper); + } + + if (firstErrorForFile) + { + DisplayMessageFromDataManager("Config version mismatch! Expected: " + version + ", Found: " + versionRead + " (" + fileName + ")", "DataManager"); + loggerAPI_->log(Logger::LogLevel::Error, "Config version mismatch! Expected: " + version + ", Found: " + versionRead + " " + fileName); + } + + if (!alreadyDownloaded) + { + configJson_.clear(); + bool downloadOk = neoSTAND_->downloadAirportConfig(icao); + alreadyDownloaded = true; + if (!downloadOk) + { + loggerAPI_->log(Logger::LogLevel::Warning, "Download attempt after version mismatch failed: " + fileName); + return -1; + } + std::this_thread::sleep_for(std::chrono::milliseconds(300)); + continue; + } + return 0; + } + break; + } + + { + std::lock_guard lock(dataMutex_); + if (configsError_.contains(icaoUpper)) { + configsError_.erase(icaoUpper); + DisplayMessageFromDataManager("Successfully redownloaded config for: " + icaoUpper, "DataManager"); + loggerAPI_->log(Logger::LogLevel::Info, "Successfully redownloaded config for: " + icaoUpper); + } + configJson_ = tempJson; + configsDownloaded_.insert(icaoUpper); + } + return 0; } bool DataManager::retrieveCorrectConfigJson(const std::string& icao) { - if (!configJson_.contains(icao) || configJson_.empty()) { + if (!(configJson_.contains("ICAO") && configJson_["ICAO"].get() == icao) || configJson_.empty()) { if (retrieveConfigJson(icao) == -1) return false; } return true; @@ -144,6 +209,120 @@ bool DataManager::isCorrectJsonVersion(const std::string& config_version, const return false; } +void DataManager::loadSettingJson() +{ + std::lock_guard lock(dataMutex_); + std::filesystem::path jsonPath = configPath_ / "plugins" / "NeoSTAND" / "config.json"; + std::ifstream configFile(jsonPath); + if (!configFile.is_open()) { + DisplayMessageFromDataManager("Could not open config data JSON file: " + jsonPath.string(), "DataManager"); + loggerAPI_->log(Logger::LogLevel::Error, "Could not open config data JSON file: " + jsonPath.string()); + return; + } + try { + configJson_ = nlohmann::json::parse(configFile); + } + catch (...) { + DisplayMessageFromDataManager("Error parsing config data JSON file: " + jsonPath.string(), "DataManager"); + loggerAPI_->log(Logger::LogLevel::Error, "Error parsing config data JSON file: " + jsonPath.string()); + return; + } +} + +bool DataManager::parseSettings() +{ + std::lock_guard lock(dataMutex_); + + auto readInt = [&](const char* key, int defVal) -> int { + if (configJson_.contains(key)) { + const auto& v = configJson_[key]; + if (v.is_number_integer()) { + int x = v.get(); + return x; + } + if (v.is_number_float()) { + int x = static_cast(v.get()); + return x; + } + } + loggerAPI_->log(Logger::LogLevel::Warning, std::string(key) + " missing or not an integer in config.json, using default"); + DisplayMessageFromDataManager(std::string(key) + " missing or not an integer in config.json, using default", "DataManager"); + return defVal; + }; + + auto readDouble = [&](const char* key, double defVal) -> double { + if (configJson_.contains(key)) { + const auto& v = configJson_[key]; + if (v.is_number()) { + return v.get(); + } + } + loggerAPI_->log(Logger::LogLevel::Warning, std::string(key) + " missing or not a number in config.json, using default"); + DisplayMessageFromDataManager(std::string(key) + " missing or not a number in config.json, using default", "DataManager"); + return defVal; + }; + + if (configJson_.contains("config_github_url") && configJson_["config_github_url"].is_string()) { + configUrl_ = configJson_["config_github_url"].get(); + } + + updateInterval_ = readInt("update_interval", stand::DEFAULT_UPDATE_INTERVAL); + if (updateInterval_ <= 0) { + loggerAPI_->log(Logger::LogLevel::Warning, "update_interval <= 0, using default"); + DisplayMessageFromDataManager("update_interval <= 0, using default", "DataManager"); + updateInterval_ = stand::DEFAULT_UPDATE_INTERVAL; + } + + maxAltitude_ = readInt("max_alt", stand::MAX_ALTITUDE); + if (maxAltitude_ <= 0) { + loggerAPI_->log(Logger::LogLevel::Warning, "max_alt <= 0, using default"); + DisplayMessageFromDataManager("max_alt <= 0, using default", "DataManager"); + maxAltitude_ = stand::MAX_ALTITUDE; + } + + maxDistance_ = readDouble("max_distance", stand::MAX_DISTANCE); + if (maxDistance_ < 0) { + loggerAPI_->log(Logger::LogLevel::Warning, "max_distance < 0, using default"); + DisplayMessageFromDataManager("max_distance < 0, using default", "DataManager"); + maxDistance_ = stand::MAX_DISTANCE; + } + + if (configJson_.contains("CargoOperator") && configJson_["CargoOperator"].is_array()) { + cargo = configJson_["CargoOperator"].get>(); + } + if (cargo.empty()) { + loggerAPI_->log(Logger::LogLevel::Warning, "No valid cargo operator list in config.json"); + DisplayMessageFromDataManager("No valid cargo operator list in config.json, Cargo stand won't be assignable."); + } + + if (configJson_.contains("Helicopters") && configJson_["Helicopters"].is_array()) { + heliTypes = configJson_["Helicopters"].get>(); + } + if (heliTypes.empty()) { + loggerAPI_->log(Logger::LogLevel::Warning, "No valid helicopter list in config.json"); + DisplayMessageFromDataManager("No valid helicopter list in config.json."); + } + + if (configJson_.contains("Military") && configJson_["Military"].is_array()) { + militaryTypes = configJson_["Military"].get>(); + } + if (militaryTypes.empty()) { + loggerAPI_->log(Logger::LogLevel::Warning, "No valid military list in config.json"); + DisplayMessageFromDataManager("No valid military list in config.json."); + } + + if (configJson_.contains("GeneralAviation") && configJson_["GeneralAviation"].is_array()) { + gaTypes = configJson_["GeneralAviation"].get>(); + } + if (gaTypes.empty()) { + loggerAPI_->log(Logger::LogLevel::Warning, "No valid General Aviation list in config.json"); + DisplayMessageFromDataManager("No valid General Aviation list in config.json."); + } + + + return true; +} + bool DataManager::removePilot(const std::string& callsign) { std::lock_guard lock(dataMutex_); @@ -161,26 +340,44 @@ bool DataManager::removePilot(const std::string& callsign) return pilots_.size() < initial; } -void DataManager::assignStands(Pilot& pilot) +void DataManager::assignStands(const std::string& callsign) { - std::lock_guard lock(dataMutex_); + Pilot *pilot = getPilotByCallsign(callsign); + if (!pilot) return; + + std::vector errorMessages; + errorMessages.reserve(300); + // Check if configJSON is already the right one, if not, retrieve it - if (!retrieveCorrectConfigJson(pilot.destination)) { - loggerAPI_->log(Logger::LogLevel::Warning, "Failed to retrieve config when assigning Stand for: " + pilot.destination); - pilot.stand = ""; + std::string icao = pilot->destination; + std::transform(icao.begin(), icao.end(), icao.begin(), ::toupper); + if (!retrieveCorrectConfigJson(icao)) { + loggerAPI_->log(Logger::LogLevel::Warning, "Failed to retrieve config when assigning Stand for: " + callsign); + pilot->stand = ""; return; } + std::lock_guard lock(dataMutex_); + // If aircraft occupies stand already, assign the occupied stand + auto occupiedIt = std::find_if(occupiedStands_.begin(), occupiedStands_.end(), [&callsign](const Stand& stand) { return callsign == stand.callsign; }); + if (occupiedIt != occupiedStands_.end()) { + pilot->stand = occupiedIt->name; + LOG_DEBUG(Logger::LogLevel::Info, "Pilot: " + pilot->callsign + " already occupies stand: " + pilot->stand); + return; + } + nlohmann::json standsJson; - if (configJson_.contains("STAND")) - standsJson = configJson_["STAND"]; + if (configJson_.contains("Stands")) { + standsJson = configJson_["Stands"]; + LOG_DEBUG(Logger::LogLevel::Info, "Assigning stand for pilot: " + pilot->callsign + " at " + pilot->destination); + } else { - loggerAPI_->log(Logger::LogLevel::Warning, "No STAND section in config for: " + pilot.destination); - pilot.stand = ""; + loggerAPI_->log(Logger::LogLevel::Warning, "No STAND section in config for: " + icao); + pilot->stand = ""; return; } - LOG_DEBUG(Logger::LogLevel::Info, "Total stands available before filtering: " + std::to_string(standsJson.size())); + errorMessages.push_back("Total stands available before filtering: " + std::to_string(standsJson.size())); // Filter stands based on criteria auto it = standsJson.begin(); @@ -190,17 +387,18 @@ void DataManager::assignStands(Pilot& pilot) // Check WTC if (stand.contains("WTC")) { std::string wtc = stand["WTC"].get(); - if (wtc != "A" && wtc != pilot.aircraftWTC) { + if (wtc.find(pilot->aircraftWTC) == std::string::npos) { + errorMessages.push_back("Removing stand " + it.key() + " due to WTC mismatch. Stand: " + wtc + " Pilot: " + pilot->aircraftWTC); it = standsJson.erase(it); continue; } } // Check USE - if (stand.contains("use")) { - std::string use = stand["use"].get(); + if (stand.contains("Use")) { + std::string use = stand["Use"].get(); std::string pilotType; - switch (pilot.aircraftType) { + switch (pilot->aircraftType) { case AircraftType::airliner: pilotType = "A"; break; case AircraftType::generalAviation: pilotType = "P"; break; case AircraftType::helicopter: pilotType = "H"; break; @@ -208,38 +406,53 @@ void DataManager::assignStands(Pilot& pilot) case AircraftType::cargo: pilotType = "C"; break; default: pilotType = ""; break; } - if (use != pilotType) { + if (use.find(pilotType) == std::string::npos) { + errorMessages.push_back("Removing stand " + it.key() + " due to Use mismatch. Stand: " + use + " Pilot: " + pilotType); it = standsJson.erase(it); continue; } } - // Check SHENGEN - if (stand.contains("shengen")) { - bool shengen = stand["shengen"].get(); - if (shengen != pilot.isShengen) { + // Check SCHENGEN + if (stand.contains("Schengen")) { + bool schegen = stand["Schengen"].get(); + if (schegen == true && pilot->isSchengen == false) { + errorMessages.push_back("Removing stand " + it.key() + " due to Schengen mismatch. Stand: " + (schegen ? "true" : "false") + " Pilot: " + (pilot->isSchengen ? "true" : "false")); it = standsJson.erase(it); continue; } } // Check NATIONAL - if (stand.contains("national")) { - bool national = stand["national"].get(); - if (national != pilot.isNational) { + if (stand.contains("National")) { + bool national = stand["National"].get(); + if (national != pilot->isNational) { + errorMessages.push_back("Removing stand " + it.key() + " due to National mismatch. Stand: " + (national ? "true" : "false") + " Pilot: " + (pilot->isNational ? "true" : "false")); + it = standsJson.erase(it); + continue; + } + } + + // Check Callsigns + if (stand.contains("Callsigns")) { + std::vector callsigns = stand["Callsigns"].get>(); + if (callsign.length() < 3 || std::find(callsigns.begin(), callsigns.end(), pilot->callsign.substr(0, 3)) == callsigns.end()) { + errorMessages.push_back("Removing stand " + it.key() + " due to Callsign mismatch. Pilot: " + pilot->callsign); it = standsJson.erase(it); continue; } } // Check if stand is occupied - if (std::find_if(occupiedStands_.begin(), occupiedStands_.end(), [&it](const Stand& stand){ return it.key() == stand.name;}) != occupiedStands_.end()) { + if (std::find_if(occupiedStands_.begin(), occupiedStands_.end(), [&it, icao](const Stand& stand){ return it.key() == stand.name && icao == stand.icao;}) != occupiedStands_.end()) { + errorMessages.push_back("Removing stand " + it.key() + " because it is already occupied."); it = standsJson.erase(it); continue; } // Check if stand is blocked - if (std::find_if(blockedStands_.begin(), blockedStands_.end(), [&it](const Stand& stand) { return it.key() == stand.name; }) != blockedStands_.end()) { + if (std::find_if(blockedStands_.begin(), blockedStands_.end(), [&it, icao](const Stand& stand) { return it.key() == stand.name && icao == stand.icao; }) != blockedStands_.end()) { + errorMessages.push_back("Removing stand " + it.key() + " because it is blocked."); it = standsJson.erase(it); continue; } @@ -248,42 +461,360 @@ void DataManager::assignStands(Pilot& pilot) } if (standsJson.empty()) { - loggerAPI_->log(Logger::LogLevel::Warning, "No suitable stand found for pilot: " + pilot.callsign + " at " + pilot.destination); - pilot.stand = ""; + if (!callsignError_.contains(pilot->callsign)) { + loggerAPI_->log(Logger::LogLevel::Warning, "No suitable stand found for pilot: " + pilot->callsign + " at " + pilot->destination); + DisplayMessageFromDataManager("No suitable stand found for pilot: " + pilot->callsign + " at " + pilot->destination + ". Printed error to log File Documents/NeoRadar/logs/plugins/NeoSTAND/NeoSTAND_debug_" + pilot->callsign + ".log"); + callsignError_.insert(pilot->callsign); + printToFile(errorMessages, "NeoSTAND_debug_" + pilot->callsign + ".log"); + } + pilot->stand = ""; return; } LOG_DEBUG(Logger::LogLevel::Info, "Total stands available after filtering: " + std::to_string(standsJson.size())); - // Randomly select a stand from the filtered list + // Determine lowest priority first (keep all stands sharing that value) + int lowestPriority = std::numeric_limits::max(); + bool anyPriority = false; + for (auto& [standName, stand] : standsJson.items()) { + if (stand.contains("Priority") && stand["Priority"].is_number_integer()) { + int p = stand["Priority"].get(); + if (p < lowestPriority) lowestPriority = p; + anyPriority = true; + } + } + + if (anyPriority) { + // Erase every stand whose priority != lowestPriority. + // Use iterator loop to avoid invalidation issues. + for (auto it = standsJson.begin(); it != standsJson.end(); ) { + auto& stand = it.value(); + if (stand.contains("Priority") && stand["Priority"].is_number_integer()) { + int p = stand["Priority"].get(); + if (p != lowestPriority) { + it = standsJson.erase(it); + continue; + } + } + else { + // If a stand has no Priority while some priorities exist, drop it. + it = standsJson.erase(it); + continue; + } + ++it; + } + } + + // Only stands with lowest priority remain or all stands if none had priority + //Randomly select a stand from the filtered list (object-safe) std::srand(static_cast(std::time(nullptr))); - int randomIndex = std::rand() % standsJson.size(); - const auto& selectedStand = standsJson[randomIndex]; - pilot.stand = selectedStand.begin().key(); + const size_t count = standsJson.size(); + + auto itSel = standsJson.begin(); + std::advance(itSel, std::rand() % count); + + const std::string selectedStandName = itSel.key(); + const auto& selectedStand = itSel.value(); + pilot->stand = selectedStandName; - LOG_DEBUG(Logger::LogLevel::Info, "Assigned stand " + pilot.stand + " to pilot: " + pilot.callsign); + LOG_DEBUG(Logger::LogLevel::Info, "Assigned stand " + pilot->stand + " to pilot: " + pilot->callsign); // Mark the stand as occupied Stand stand; - stand.name = pilot.stand; - stand.icao = pilot.destination; - stand.callsign = pilot.callsign; + stand.name = pilot->stand; + stand.icao = pilot->destination; + stand.callsign = pilot->callsign; occupiedStands_.push_back(stand); // Check if the stand is blocking other stands - if (selectedStand.contains("BLOCK")) + if (selectedStand.contains("Block") && selectedStand["Block"].is_array()) { - for (const auto& blockedStandName : selectedStand["BLOCK"]) { + for (const auto& blockedStandName : selectedStand["Block"]) { Stand blockedStand; blockedStand.name = blockedStandName.get(); - blockedStand.icao = pilot.destination; - blockedStand.callsign = pilot.callsign; + blockedStand.icao = pilot->destination; + blockedStand.callsign = pilot->callsign; blockedStands_.push_back(blockedStand); - LOG_DEBUG(Logger::LogLevel::Info, "Also blocking stand " + blockedStand.name + " due to assignment of " + pilot.stand); + LOG_DEBUG(Logger::LogLevel::Info, "Also blocking stand " + blockedStand.name + " due to assignment of " + pilot->stand); } } } +void DataManager::assignStandToPilot(Pilot& pilot, const std::string& standName) +{ + // Check if configJSON is already the right one, if not, retrieve it + std::string icao = pilot.destination; + std::transform(icao.begin(), icao.end(), icao.begin(), ::toupper); + if (!retrieveCorrectConfigJson(icao)) { + loggerAPI_->log(Logger::LogLevel::Warning, "Failed to retrieve config when assigning Stand for: " + pilot.callsign); + pilot.stand = ""; + return; + } + + std::lock_guard lock(dataMutex_); + // Check if the stand is already occupied + if (std::find_if(occupiedStands_.begin(), occupiedStands_.end(), + [&standName](const Stand& stand) { return stand.name == standName; }) != occupiedStands_.end()) { + loggerAPI_->log(Logger::LogLevel::Warning, "Stand " + standName + " is already occupied, cannot assign to pilot: " + pilot.callsign); + DisplayMessageFromDataManager("Stand " + standName + " is already occupied, cannot assign to pilot: " + pilot.callsign); + pilot.stand = ""; + return; + } + // Check if the stand is blocked + if (std::find_if(blockedStands_.begin(), blockedStands_.end(), + [&standName](const Stand& stand) { return stand.name == standName; }) != blockedStands_.end()) { + loggerAPI_->log(Logger::LogLevel::Warning, "Stand " + standName + " is blocked, cannot assign to pilot: " + pilot.callsign); + DisplayMessageFromDataManager("Stand " + standName + " is blocked, cannot assign to pilot: " + pilot.callsign); + pilot.stand = ""; + return; + } + pilot.stand = standName; + + // Release any previously occupied stand by this pilot + occupiedStands_.erase(std::remove_if(occupiedStands_.begin(), occupiedStands_.end(), + [&pilot](const Stand& s) { return s.callsign == pilot.callsign; }), occupiedStands_.end()); + blockedStands_.erase(std::remove_if(blockedStands_.begin(), blockedStands_.end(), + [&pilot](const Stand& s) { return s.callsign == pilot.callsign; }), blockedStands_.end()); + + // Mark the stand as occupied + Stand stand; + stand.name = pilot.stand; + stand.icao = pilot.destination; + stand.callsign = pilot.callsign; + occupiedStands_.push_back(stand); + loggerAPI_->log(Logger::LogLevel::Info, "Manually assigned stand " + pilot.stand + " to pilot: " + pilot.callsign); + + // Check if the stand is blocking other stands + if (configJson_.contains("Stands") && configJson_["Stands"].contains(stand.name)) { + const auto& standJson = configJson_["Stands"][stand.name]; + if (standJson.contains("Block") && standJson["Block"].is_array()) + { + for (const auto& blockedStandName : standJson["Block"]) { + Stand blockedStand; + blockedStand.name = blockedStandName.get(); + blockedStand.icao = stand.icao; + blockedStand.callsign = stand.callsign; + if (std::find(blockedStands_.begin(), blockedStands_.end(), blockedStand) == blockedStands_.end()) { + blockedStands_.push_back(blockedStand); + loggerAPI_->log(Logger::LogLevel::Info, "Also blocking stand " + blockedStand.name + " due to assignment of " + pilot.stand); + } + } + } + } +} + +void DataManager::freeStand(const std::string& standName) +{ + std::lock_guard lock(dataMutex_); + // Find the occupying pilot for this stand + auto itOccupied = std::find_if(occupiedStands_.begin(), occupiedStands_.end(), + [&standName](const Stand& s) { return s.name == standName; }); + if (itOccupied == occupiedStands_.end()) return; + + const std::string callsign = itOccupied->callsign; + + occupiedStands_.erase(std::remove_if(occupiedStands_.begin(), occupiedStands_.end(), + [&standName](const Stand& s) { return s.name == standName; }), occupiedStands_.end()); + + blockedStands_.erase(std::remove_if(blockedStands_.begin(), blockedStands_.end(), + [callsign](const Stand& s) { return s.callsign == callsign; }), blockedStands_.end()); +} + +void DataManager::addStandToOccupied(const Stand& stand) +{ + { + std::lock_guard lock(dataMutex_); + if (std::find(occupiedStands_.begin(), occupiedStands_.end(), stand) == occupiedStands_.end()) { + occupiedStands_.push_back(stand); + } + } + + // Check if stand blocking other stands + std::vector stands = getAllStandsForAirport(stand.icao); + + auto it = std::find_if(stands.begin(), stands.end(), [&stand](const Stand& s) { return s.name == stand.name; }); + if (it != stands.end()) { + // Check if the stand is blocking other stands + if (configJson_.contains("Stands") && configJson_["Stands"].contains(stand.name)) { + const auto& standJson = configJson_["Stands"][stand.name]; + if (standJson.contains("Block") && standJson["Block"].is_array()) + { + for (const auto& blockedStandName : standJson["Block"]) { + Stand blockedStand; + blockedStand.name = blockedStandName.get(); + blockedStand.icao = stand.icao; + blockedStand.callsign = stand.callsign; + std::lock_guard lock(dataMutex_); + if (std::find(blockedStands_.begin(), blockedStands_.end(), blockedStand) == blockedStands_.end()) { + blockedStands_.push_back(blockedStand); + } + } + } + } + } +} + +bool DataManager::saveDownloadedAirportConfig(const nlohmann::ordered_json& json, std::string icao) +{ + std::lock_guard lock(dataMutex_); + std::transform(icao.begin(), icao.end(), icao.begin(), ::toupper); + std::string fileName = icao + ".json"; + std::filesystem::path jsonPath = configPath_ / "Plugins/NeoSTAND" / fileName; + std::ofstream configFile(jsonPath); + if (!configFile.is_open()) { + loggerAPI_->log(Logger::LogLevel::Error, "Could not open file to save downloaded config: " + jsonPath.string()); + return false; + } + try { + configFile << std::setw(4) << json << std::endl; + configsDownloaded_.insert(icao); + } + catch (...) { + loggerAPI_->log(Logger::LogLevel::Error, "Error writing to file: " + jsonPath.string()); + return false; + } + + // Always update in-memory representation with the freshly downloaded JSON. + configJson_ = json; + + return true; +} + +bool DataManager::printToFile(const std::vector& lines, const std::string& fileName) +{ + std::lock_guard lock(dataMutex_); + std::filesystem::path dir = configPath_ / "logs" / "plugins" / "NeoSTAND"; + std::error_code ec; + if (!std::filesystem::exists(dir)) + { + if (!std::filesystem::create_directories(dir, ec)) + { + loggerAPI_->log(Logger::LogLevel::Error, + "Failed to create log directory: " + dir.string() + " ec=" + ec.message()); + return false; + } + } + std::filesystem::path filePath = dir / fileName; + std::ofstream outFile(filePath); + if (!outFile.is_open()) { + loggerAPI_->log(Logger::LogLevel::Error, "Could not open file to write: " + filePath.string()); + return false; + } + for (const auto& line : lines) { + outFile << line << std::endl; + } + outFile.close(); + return true; +} + +std::string DataManager::isAircraftOnStand(const std::string& callsign, const std::string& icao) +{ + std::optional aircraftOpt = aircraftAPI_->getByCallsign(callsign); + std::optional flightplanOpt = flightplanAPI_->getByCallsign(callsign); + if (!aircraftOpt.has_value()) return ""; + + Aircraft::Aircraft aircraft = *aircraftOpt; + + if (!aircraft.position.onGround) return ""; + + std::string icaoFromAircraft; + if (icao.empty()) { + std::optional distOrigin = aircraftAPI_->getDistanceFromOrigin(callsign); + std::optional distDest = aircraftAPI_->getDistanceToDestination(callsign); + if (!distOrigin.has_value() || !distDest.has_value()) return ""; + if (*distOrigin - *distDest > 0.) icaoFromAircraft = flightplanOpt->destination; + else icaoFromAircraft = flightplanOpt->origin; + } + else { + icaoFromAircraft = icao; + } + + std::vector activeAirports = getAllActiveAirports(); + if (std::find(activeAirports.begin(), activeAirports.end(), icaoFromAircraft) == activeAirports.end()) return ""; + + auto haversineMeters = [](double lat1Deg, double lon1Deg, double lat2Deg, double lon2Deg) -> double { + constexpr double kPi = 3.14159265358979323846; + constexpr double kR = 6371000.0; // meters + auto rad = [&](double d) { return d * kPi / 180.0; }; + double lat1 = rad(lat1Deg), lon1 = rad(lon1Deg); + double lat2 = rad(lat2Deg), lon2 = rad(lon2Deg); + double dLat = lat2 - lat1; + double dLon = lon2 - lon1; + double a = std::sin(dLat / 2) * std::sin(dLat / 2) + + std::cos(lat1) * std::cos(lat2) * + std::sin(dLon / 2) * std::sin(dLon / 2); + double c = 2 * std::atan2(std::sqrt(a), std::sqrt(1 - a)); + return kR * c; + }; + + // Load stands for the airport + std::transform(icaoFromAircraft.begin(), icaoFromAircraft.end(), icaoFromAircraft.begin(), ::toupper); + if (!retrieveCorrectConfigJson(icaoFromAircraft)) { + loggerAPI_->log(Logger::LogLevel::Warning, "Failed to retrieve config when assigning Stand for: " + icaoFromAircraft); + return ""; + } + + std::lock_guard lock(dataMutex_); + nlohmann::json standsJson; + if (configJson_.contains("Stands")) { + standsJson = configJson_["Stands"]; + } + else { + loggerAPI_->log(Logger::LogLevel::Warning, "No STAND section in config for: " + icaoFromAircraft); + return ""; + } + + constexpr double kDefaultRadiusMeters = 30.0; + + for (auto it = standsJson.begin(); it != standsJson.end(); ++it) { + const auto& stand = *it; + if (!stand.contains("Coordinates")) continue; + + const std::string coordStr = stand["Coordinates"].get(); + + // Split "lat:lon[:radius]" + size_t p1 = coordStr.find(':'); + if (p1 == std::string::npos) continue; + size_t p2 = coordStr.find(':', p1 + 1); + + std::string latStr = coordStr.substr(0, p1); + std::string lonStr = (p2 == std::string::npos) ? coordStr.substr(p1 + 1) + : coordStr.substr(p1 + 1, p2 - p1 - 1); + std::string radiusStr = (p2 == std::string::npos) ? std::string() : coordStr.substr(p2 + 1); + + double standLat = 0.0, standLon = 0.0; + try { + standLat = std::stod(latStr); // decimal degrees; allow negative for S/W + standLon = std::stod(lonStr); + } + catch (...) { + continue; // skip malformed entries + } + + double radiusMeters = kDefaultRadiusMeters; + if (!radiusStr.empty()) { + try { + radiusMeters = std::stod(radiusStr); + if (radiusMeters <= 0) radiusMeters = kDefaultRadiusMeters; + } + catch (...) { + radiusMeters = kDefaultRadiusMeters; + } + } + + double distanceMeters = haversineMeters( + aircraft.position.latitude, aircraft.position.longitude, + standLat, standLon + ); + + if (distanceMeters <= radiusMeters) { + return it.key() + " " + icaoFromAircraft; + } + } + + return ""; +} + void DataManager::PopulateActiveAirports() { std::vector airports = airportAPI_->getConfigurations(); @@ -319,21 +850,20 @@ bool DataManager::pilotExists(const std::string& callsign) [&callsign](const Pilot& p) { return p.callsign == callsign; }); } -DataManager::Pilot DataManager::getPilotByCallsign(const std::string& callsign) +DataManager::Pilot* DataManager::getPilotByCallsign(const std::string& callsign) { std::lock_guard lock(dataMutex_); - for (const auto& pilot : pilots_) + for (auto& pilot : pilots_) { if (pilot.callsign == callsign) - return pilot; + return &pilot; } - return Pilot{}; + return nullptr; } void DataManager::updateAllPilots() { std::vector flightplans = flightplanAPI_->getAll(); - for (const auto& fp : flightplans) { updatePilot(fp.callsign); } @@ -347,32 +877,37 @@ void DataManager::updatePilot(const std::string& callsign) if (!aircraftOpt.has_value()) return; Aircraft::Aircraft aircraft = *aircraftOpt; - if (aircraft.position.altitude > stand::MAX_ALTITUDE) return; + if (aircraft.position.altitude > getMaxAltitude()) return; std::optional flightplan = flightplanAPI_->getByCallsign(aircraft.callsign); if (!flightplan.has_value()) return; std::optional distanceToDest = aircraftAPI_->getDistanceToDestination(aircraft.callsign); - if (!distanceToDest.has_value() || *distanceToDest > stand::MAX_DISTANCE) return; + if (!distanceToDest.has_value() || *distanceToDest > getMaxDistance()) return; if (!isConcernedAircraft(*flightplan)) return; + std::string previousStand = ""; { std::lock_guard lock(dataMutex_); - if (!pilots_.empty() && std::any_of(pilots_.begin(), pilots_.end(), - [&aircraft](const Pilot& p) { return p.callsign == aircraft.callsign; })) { - return; // Skip if pilot already exists + auto itPilot = std::find_if(pilots_.begin(), pilots_.end(), + [&callsign](const Pilot& p) { return p.callsign == callsign; }); + + std::string freedIcao; + if (itPilot != pilots_.end()) { + previousStand = itPilot->stand; } + pilots_.erase(std::remove_if(pilots_.begin(), pilots_.end(), [&aircraft](const Pilot& p) { return p.callsign == aircraft.callsign; }), pilots_.end()); } Pilot pilot; pilot.callsign = aircraft.callsign; pilot.destination = flightplan->destination; - pilot.isShengen = isShengen(*flightplan); + pilot.isSchengen = isSchengen(*flightplan); pilot.isNational = isNational(*flightplan); pilot.aircraftType = getAircraftType(*flightplan); pilot.aircraftWTC = flightplan->wakeCategory; - pilot.stand = ""; + pilot.stand = previousStand; { std::lock_guard lock(dataMutex_); @@ -393,63 +928,78 @@ DataManager::AircraftType DataManager::getAircraftType(const Flightplan::Flightp //IMPROVE: parse from Config.json all the types so it can be modified by user std::string callsign = fp.callsign; std::transform(callsign.begin(), callsign.end(), callsign.begin(), ::toupper); + + if (callsign.size() < 3) return AircraftType::generalAviation; if (callsign[1] == '-' || callsign[2] == '-') return AircraftType::generalAviation; - static const std::unordered_set cargo = { - "FDX","UPS","GTI","CLX","CKS","BCS","GEC","ABW","NCA","RCH","SQC","CMB","BOX","MPH","TAY","QAJ","ICV","KYE","ACX","BRQ" - }; if (cargo.contains(callsign.substr(0, 3))) return AircraftType::cargo; - static const std::unordered_set heliTypes = { - "H145","H135","EC135","EC145","EC130","EC120","EC155","AS350","AS355","AS365","AS565", - "R22","R44","R66","B06","B407","B412","B429","B430","S76","S92","MD500","MD520","MD530", - "AW109","AW139","AW169","AW189","UH60","H60","MI8","MI17","SA330","SA341","SA342" - }; std::string acType = fp.acType; if (heliTypes.contains(acType)) return AircraftType::helicopter; - static const std::unordered_set militaryTypes = { - "F16","F18","F22","F35","A10","B52","C130","C17","KC135","KC10","E3","E6","P8","T38", - "AH64","UH60","CH47","F15","AV8B","EA18G","C5M","C40B","C37A","C37B","C32B" - }; if (militaryTypes.contains(acType)) return AircraftType::military; - static const std::unordered_set gaTypes = { - "C150","C152","C172","C175","C177","C182","C185","C206","C207","C210","C337","C340","C402","C414","C421","C208", - "PA18","PA28","P28A","PA32","PA34","PA44","PA46","P46T","PA24","PA30", - "BE33","BE35","BE36","BE55","BE58","BE9L","BE10","BE20","B350", - "SR20","SR22","SR22T", "DA20","DA40","DA42","DA50","DA62", "M20P","M20T","M20R","M20J", - "DR40","DR221","DR253","DR300","DR315","DR400", "TB10","TB20","TB21","TBM7","TBM8","TBM9", - "PC12","PC6", "RV6","RV7","RV8","RV9","RV10","RV12", "C510","C525","C25A","C25B","C25C","C560","C56X","C650","C680","C68A","C700", - "E50P","E55P","E545","E35L","E545","E550", "LJ24","LJ31","LJ35","LJ40","LJ45","LJ55","LJ60","LJ70","LJ75", - "FA20","FA50","FA7X","FA8X","FA900", "GLF2","GLF3","GLF4","GLF5","GLF6","GLF650","GLF7","GLF8", - "CL30","CL35","CL60","G150","G200","G280" - }; if (gaTypes.contains(acType)) return AircraftType::generalAviation; return AircraftType::airliner; } -std::vector DataManager::getOccupiedStands() +std::vector DataManager::getOccupiedStands() { - std::vector stands; std::lock_guard lock(dataMutex_); - for (const auto& stand : occupiedStands_) { - stands.push_back(stand.name + " (" + stand.icao + ")"); - } - return stands; + return occupiedStands_; } -std::vector DataManager::getBlockedStands() +std::vector DataManager::getBlockedStands() { - std::vector stands; std::lock_guard lock(dataMutex_); - for (const auto& stand : blockedStands_) { - stands.push_back(stand.name + " (" + stand.icao + ")"); + return blockedStands_; +} + +std::vector DataManager::getAllStandsForAirport(const std::string& icao) +{ + if (!retrieveCorrectConfigJson(icao)) { + loggerAPI_->log(Logger::LogLevel::Warning, "Failed to retrieve config when assigning Stand for: " + icao); + return {}; + } + + std::lock_guard lock(dataMutex_); + nlohmann::json standsJson; + if (configJson_.contains("Stands")) { + standsJson = configJson_["Stands"]; + } + else { + loggerAPI_->log(Logger::LogLevel::Warning, "No STAND section in config for: " + icao); + return {}; + } + std::vector stands; + for (auto it = standsJson.begin(); it != standsJson.end(); ++it) { + Stand stand; + stand.name = it.key(); + stand.icao = icao; + stand.callsign = ""; + stands.push_back(stand); } + return stands; } +std::vector DataManager::getAvailableStandsForAirport(const std::string& icao) +{ + std::vector allStands = getAllStandsForAirport(icao); + std::vector availableStands; + for (const auto& stand : allStands) { + bool isOccupied = std::find_if(occupiedStands_.begin(), occupiedStands_.end(), + [&stand](const Stand& s) { return s.name == stand.name && s.icao == stand.icao; }) != occupiedStands_.end(); + bool isBlocked = std::find_if(blockedStands_.begin(), blockedStands_.end(), + [&stand](const Stand& s) { return s.name == stand.name && s.icao == stand.icao; }) != blockedStands_.end(); + if (!isOccupied && !isBlocked) { + availableStands.push_back(stand); + } + } + return availableStands; +} + bool DataManager::isConcernedAircraft(const Flightplan::Flightplan& fp) { std::lock_guard lock(dataMutex_); @@ -461,7 +1011,18 @@ bool DataManager::isConcernedAircraft(const Flightplan::Flightplan& fp) return false; } -bool DataManager::isShengen(const Flightplan::Flightplan& fp) +bool DataManager::isArrival(const std::string& callsign) +{ + std::optional flightplanOpt = flightplanAPI_->getByCallsign(callsign); + if (!flightplanOpt.has_value()) return false; + Flightplan::Flightplan fp = *flightplanOpt; + + std::vector activeAirports = getAllActiveAirports(); + + return std::find(activeAirports.begin(), activeAirports.end(), fp.destination) != activeAirports.end(); +} + +bool DataManager::isSchengen(const Flightplan::Flightplan& fp) { auto isInSchengen = [](std::string icao) -> bool { if (icao.size() < 2) return false; diff --git a/src/core/DataManager.h b/src/core/DataManager.h index 48261b3..981896a 100644 --- a/src/core/DataManager.h +++ b/src/core/DataManager.h @@ -9,8 +9,10 @@ using namespace PluginSDK; namespace stand { - constexpr const int MAX_DISTANCE = 25; // Max distance to consider an aircraft (in NM) - constexpr const int MAX_ALTITUDE = 5000; // Max altitude to consider an aircraft (in feet) + // Default settings value + constexpr const int MAX_DISTANCE = 50; // Max distance to consider an aircraft (in NM) + constexpr const int MAX_ALTITUDE = 10000; // Max altitude to consider an aircraft (in feet) + constexpr const int DEFAULT_UPDATE_INTERVAL = 5; // Interval to update stands (in seconds) } class DataManager { @@ -30,7 +32,7 @@ class DataManager { std::string aircraftWTC; AircraftType aircraftType; std::string stand; - bool isShengen; + bool isSchengen; bool isNational; bool empty() const { @@ -55,29 +57,48 @@ class DataManager { void clearData(); void clearJson(); - static std::filesystem::path getDllDirectory(); + std::filesystem::path getDllDirectory(); void DisplayMessageFromDataManager(const std::string& message, const std::string& sender = ""); int retrieveConfigJson(const std::string& icao); bool retrieveCorrectConfigJson(const std::string& icao); bool isCorrectJsonVersion(const std::string& config_version, const std::string& fileName); + void loadSettingJson(); + bool parseSettings(); void PopulateActiveAirports(); void updateAllPilots(); void updatePilot(const std::string& callsign); void removeAllPilots(); bool removePilot(const std::string& callsign); - void assignStands(Pilot& pilot); + void assignStands(const std::string& callsign); + void assignStandToPilot(Pilot& pilot, const std::string& standName); + void freeStand(const std::string& standName); + void addStandToOccupied(const Stand& stand); + bool saveDownloadedAirportConfig(const nlohmann::ordered_json& json, std::string icao); + bool printToFile(const std::vector& lines, const std::string& fileName); std::vector getAllActiveAirports(); std::vector getAllPilots(); bool pilotExists(const std::string& callsign); - Pilot getPilotByCallsign(const std::string& callsign); + Pilot* getPilotByCallsign(const std::string& callsign); AircraftType getAircraftType(const Flightplan::Flightplan& fp); - std::vector getOccupiedStands(); - std::vector getBlockedStands(); + std::vector getOccupiedStands(); + std::vector getBlockedStands(); + int getUpdateInterval() const { return updateInterval_; } + int getMaxAltitude() const { return maxAltitude_; } + double getMaxDistance() const { return maxDistance_; } + std::vector getAllStandsForAirport(const std::string& icao); + std::vector getAvailableStandsForAirport(const std::string& icao); + std::string getConfigUrl() const { return configUrl_; } + std::unordered_set getCargoTypes() const { return cargo; } + std::unordered_set getHeliTypes() const { return heliTypes; } + std::unordered_set getMilitaryTypes() const { return militaryTypes; } + std::unordered_set getGATypes() const { return gaTypes; } bool isConcernedAircraft(const Flightplan::Flightplan& fp); - bool isShengen(const Flightplan::Flightplan& fp); + bool isArrival(const std::string& callsign); + bool isSchengen(const Flightplan::Flightplan& fp); bool isNational(const Flightplan::Flightplan& fp); + std::string isAircraftOnStand(const std::string& callsign, const std::string& icao=""); private: Aircraft::AircraftAPI* aircraftAPI_ = nullptr; @@ -91,9 +112,23 @@ class DataManager { std::mutex dataMutex_; std::filesystem::path configPath_; nlohmann::ordered_json configJson_; + nlohmann::ordered_json settingJson_; + std::string configUrl_; std::vector pilots_; std::vector activeAirports_; std::vector occupiedStands_; std::vector blockedStands_; + std::unordered_set configsError_; + std::unordered_set configsDownloaded_; + std::unordered_set callsignError_; + + std::unordered_set gaTypes; + std::unordered_set militaryTypes; + std::unordered_set heliTypes; + std::unordered_set cargo; + + int updateInterval_; + int maxAltitude_; + double maxDistance_; }; \ No newline at end of file diff --git a/src/core/TagFunctions.h b/src/core/TagFunctions.h index a511e9f..369646b 100644 --- a/src/core/TagFunctions.h +++ b/src/core/TagFunctions.h @@ -1,5 +1,5 @@ #pragma once -#include "NeOSTAND.h" +#include "NeoSTAND.h" namespace stand { void NeoSTAND::RegisterTagActions() @@ -13,17 +13,25 @@ void NeoSTAND::RegisterTagActions() assignActionId_ = tagInterface_->RegisterTagAction(tagDef); // Dropdown Menu def + tagDef.name = "StandMenu"; + tagDef.description = "open the stand menu"; + standMenuId_ = tagInterface_->RegisterTagAction(tagDef); + PluginSDK::Tag::DropdownDefinition dropdownDef; - dropdownDef.title = "STAND SELECT"; + dropdownDef.title = "STAND"; dropdownDef.width = 75; dropdownDef.maxHeight = 150; PluginSDK::Tag::DropdownComponent dropdownComponent; + PluginSDK::Tag::DropdownComponentStyle style; + + style.textAlign = PluginSDK::Tag::DropdownAlignmentType::Center; dropdownComponent.id = "STAND1"; dropdownComponent.type = PluginSDK::Tag::DropdownComponentType::Button; dropdownComponent.text = "48A"; dropdownComponent.requiresInput = false; + dropdownComponent.style = style; dropdownDef.components.push_back(dropdownComponent); tagInterface_->SetActionDropdown(standMenuId_, dropdownDef); @@ -47,8 +55,22 @@ void NeoSTAND::OnTagDropdownAction(const PluginSDK::Tag::DropdownActionEvent *ev { return; } + DataManager::Pilot* pilot = dataManager_->getPilotByCallsign(event->callsign); + if (!pilot || pilot->empty()) return; + + if (event->componentId == "None") + { + if (!pilot->stand.empty()) + { + dataManager_->freeStand(pilot->stand); + pilot->stand.clear(); + UpdateTagItems(pilot->callsign); + } + return; + } - DisplayMessage("Assigning Stand 48A for: " + event->callsign); + dataManager_->assignStandToPilot(*pilot, event->componentId); + UpdateTagItems(pilot->callsign); } void NeoSTAND::TagProcessing(const std::string &callsign, const std::string &actionId, const std::string &userInput) @@ -59,9 +81,45 @@ void NeoSTAND::TagProcessing(const std::string &callsign, const std::string &act } } -inline bool NeoSTAND::toggleAutoMode() +inline void NeoSTAND::updateStandMenuButtons(const std::string& icao) { - autoMode = !autoMode; - return autoMode; + std::vector stands = dataManager_->getAvailableStandsForAirport(icao); + + PluginSDK::Tag::DropdownDefinition dropdownDef; + dropdownDef.title = "STAND"; + dropdownDef.width = 75; + dropdownDef.maxHeight = 150; + + PluginSDK::Tag::DropdownComponent scrollArea; + scrollArea.id = "SCROLL"; + scrollArea.type = PluginSDK::Tag::DropdownComponentType::ScrollArea; + + + PluginSDK::Tag::DropdownComponent dropdownComponent; + PluginSDK::Tag::DropdownComponentStyle style; + + style.textAlign = PluginSDK::Tag::DropdownAlignmentType::Center; + + dropdownComponent.id = "None"; + dropdownComponent.type = PluginSDK::Tag::DropdownComponentType::Button; + dropdownComponent.text = "None"; + dropdownComponent.requiresInput = false; + dropdownComponent.style = style; + scrollArea.children.push_back(dropdownComponent); + + + for (const auto& stand : stands) { + dropdownComponent.id = stand.name; + dropdownComponent.type = PluginSDK::Tag::DropdownComponentType::Button; + dropdownComponent.text = stand.name; + dropdownComponent.requiresInput = false; + dropdownComponent.style = style; + scrollArea.children.push_back(dropdownComponent); + } + + dropdownDef.components.push_back(scrollArea); + + tagInterface_->UpdateActionDropdown(standMenuId_, dropdownDef); } -} // namespace vsid \ No newline at end of file + +} // namespace stand \ No newline at end of file