Luu 1 год назад
Родитель
Сommit
0fafb9084f

+ 1 - 1
metroflip.c

@@ -154,7 +154,7 @@ void locale_format_datetime_cat(FuriString* out, const DateTime* dt, bool time)
     const char* separator = (date_format == LocaleDateFormatDMY) ? "." : "/";
     const char* separator = (date_format == LocaleDateFormatDMY) ? "." : "/";
     locale_format_date(s, dt, date_format, separator);
     locale_format_date(s, dt, date_format, separator);
     furi_string_cat(out, s);
     furi_string_cat(out, s);
-    if (time) {
+    if(time) {
         locale_format_time(s, dt, locale_get_time_format(), false);
         locale_format_time(s, dt, locale_get_time_format(), false);
         furi_string_cat_printf(out, "  ");
         furi_string_cat_printf(out, "  ");
         furi_string_cat(out, s);
         furi_string_cat(out, s);

+ 5 - 2
metroflip_i.h

@@ -1,6 +1,8 @@
 #pragma once
 #pragma once
 
 
 #include <furi.h>
 #include <furi.h>
+#include <furi_hal.h>
+#include <stdlib.h>
 #include <gui/gui.h>
 #include <gui/gui.h>
 #include <gui/view.h>
 #include <gui/view.h>
 #include <gui/modules/validators.h>
 #include <gui/modules/validators.h>
@@ -34,7 +36,8 @@ extern const Icon I_RFIDDolphinReceive_97x61;
 #include <datetime.h>
 #include <datetime.h>
 #include <dolphin/dolphin.h>
 #include <dolphin/dolphin.h>
 #include <locale/locale.h>
 #include <locale/locale.h>
-
+#include <stdio.h>
+#include <string.h>
 #include <flipper_application/flipper_application.h>
 #include <flipper_application/flipper_application.h>
 #include <loader/firmware_api/firmware_api.h>
 #include <loader/firmware_api/firmware_api.h>
 
 
@@ -135,4 +138,4 @@ void byte_to_binary(uint8_t byte, char* bits);
 
 
 int binary_to_decimal(const char binary[]);
 int binary_to_decimal(const char binary[]);
 
 
-int bit_slice_to_dec(const char* bit_representation, int start, int end);
+int bit_slice_to_dec(const char* bit_representation, int start, int end);

+ 1 - 1
scenes/metroflip_scene_bip.c

@@ -409,4 +409,4 @@ void metroflip_scene_bip_on_exit(void* context) {
     popup_reset(app->popup);
     popup_reset(app->popup);
 
 
     metroflip_app_blink_stop(app);
     metroflip_app_blink_stop(app);
-}
+}

+ 1 - 1
scenes/metroflip_scene_charliecard.c

@@ -1320,4 +1320,4 @@ void metroflip_scene_charliecard_on_exit(void* context) {
     popup_reset(app->popup);
     popup_reset(app->popup);
 
 
     metroflip_app_blink_stop(app);
     metroflip_app_blink_stop(app);
-}
+}

+ 1 - 1
scenes/metroflip_scene_metromoney.c

@@ -197,4 +197,4 @@ void metroflip_scene_metromoney_on_exit(void* context) {
     popup_reset(app->popup);
     popup_reset(app->popup);
 
 
     metroflip_app_blink_stop(app);
     metroflip_app_blink_stop(app);
-}
+}

+ 35 - 34
scenes/metroflip_scene_navigo.c

@@ -8,10 +8,7 @@
 
 
 #define TAG "Metroflip:Scene:Navigo"
 #define TAG "Metroflip:Scene:Navigo"
 
 
-void metroflip_navigo_widget_callback(
-    GuiButtonType result,
-    InputType type,
-    void* context) {
+void metroflip_navigo_widget_callback(GuiButtonType result, InputType type, void* context) {
     Metroflip* app = context;
     Metroflip* app = context;
     UNUSED(result);
     UNUSED(result);
 
 
@@ -46,7 +43,6 @@ static NfcCommand metroflip_scene_navigo_poller_callback(NfcGenericEvent event,
             size_t response_length = 0;
             size_t response_length = 0;
 
 
             do {
             do {
-
                 // Select app for contracts
                 // Select app for contracts
                 select_app[6] = 32;
                 select_app[6] = 32;
                 bit_buffer_reset(tx_buffer);
                 bit_buffer_reset(tx_buffer);
@@ -75,7 +71,6 @@ static NfcCommand metroflip_scene_navigo_poller_callback(NfcGenericEvent event,
                     break;
                     break;
                 }
                 }
 
 
-
                 // read file 1
                 // read file 1
                 read_file[2] = 1;
                 read_file[2] = 1;
                 bit_buffer_reset(tx_buffer);
                 bit_buffer_reset(tx_buffer);
@@ -103,14 +98,13 @@ static NfcCommand metroflip_scene_navigo_poller_callback(NfcGenericEvent event,
                         app->view_dispatcher, MetroflipCustomEventPollerFileNotFound);
                         app->view_dispatcher, MetroflipCustomEventPollerFileNotFound);
                     break;
                     break;
                 }
                 }
-                char bit_representation
-                    [response_length * 8 + 1]; 
-                bit_representation[0] = '\0'; 
+                char bit_representation[response_length * 8 + 1];
+                bit_representation[0] = '\0';
                 for(size_t i = 0; i < response_length; i++) {
                 for(size_t i = 0; i < response_length; i++) {
-                    char bits[9]; 
+                    char bits[9];
                     uint8_t byte = bit_buffer_get_byte(rx_buffer, i);
                     uint8_t byte = bit_buffer_get_byte(rx_buffer, i);
                     byte_to_binary(byte, bits);
                     byte_to_binary(byte, bits);
-                    strcat(bit_representation, bits); 
+                    strcat(bit_representation, bits);
                 }
                 }
                 int start = 55, end = 70;
                 int start = 55, end = 70;
                 float decimal_value = bit_slice_to_dec(bit_representation, start, end);
                 float decimal_value = bit_slice_to_dec(bit_representation, start, end);
@@ -155,7 +149,6 @@ static NfcCommand metroflip_scene_navigo_poller_callback(NfcGenericEvent event,
                     break;
                     break;
                 }
                 }
 
 
-
                 // read file 1
                 // read file 1
                 read_file[2] = 1;
                 read_file[2] = 1;
                 bit_buffer_reset(tx_buffer);
                 bit_buffer_reset(tx_buffer);
@@ -183,18 +176,19 @@ static NfcCommand metroflip_scene_navigo_poller_callback(NfcGenericEvent event,
                         app->view_dispatcher, MetroflipCustomEventPollerFileNotFound);
                         app->view_dispatcher, MetroflipCustomEventPollerFileNotFound);
                     break;
                     break;
                 }
                 }
-                char environment_bit_representation[response_length * 8 + 1]; 
-                environment_bit_representation[0] = '\0'; 
+                char environment_bit_representation[response_length * 8 + 1];
+                environment_bit_representation[0] = '\0';
                 for(size_t i = 0; i < response_length; i++) {
                 for(size_t i = 0; i < response_length; i++) {
-                    char bits[9]; 
+                    char bits[9];
                     uint8_t byte = bit_buffer_get_byte(rx_buffer, i);
                     uint8_t byte = bit_buffer_get_byte(rx_buffer, i);
                     byte_to_binary(byte, bits);
                     byte_to_binary(byte, bits);
-                    strcat(environment_bit_representation, bits); 
+                    strcat(environment_bit_representation, bits);
                 }
                 }
                 start = 45;
                 start = 45;
                 end = 58;
                 end = 58;
                 decimal_value = bit_slice_to_dec(environment_bit_representation, start, end);
                 decimal_value = bit_slice_to_dec(environment_bit_representation, start, end);
-                uint64_t end_validity_timestamp = (decimal_value * 24 * 3600) + (float)epoch + 3600;
+                uint64_t end_validity_timestamp =
+                    (decimal_value * 24 * 3600) + (float)epoch + 3600;
                 DateTime end_dt = {0};
                 DateTime end_dt = {0};
                 datetime_timestamp_to_datetime(end_validity_timestamp, &end_dt);
                 datetime_timestamp_to_datetime(end_validity_timestamp, &end_dt);
                 furi_string_cat_printf(parsed_data, "\nEnd Validity:\n");
                 furi_string_cat_printf(parsed_data, "\nEnd Validity:\n");
@@ -260,29 +254,37 @@ static NfcCommand metroflip_scene_navigo_poller_callback(NfcGenericEvent event,
                             app->view_dispatcher, MetroflipCustomEventPollerFileNotFound);
                             app->view_dispatcher, MetroflipCustomEventPollerFileNotFound);
                         break;
                         break;
                     }
                     }
-                    char event_bit_representation
-                        [response_length * 8 + 1]; 
-                    event_bit_representation[0] = '\0'; 
+                    char event_bit_representation[response_length * 8 + 1];
+                    event_bit_representation[0] = '\0';
                     for(size_t i = 0; i < response_length; i++) {
                     for(size_t i = 0; i < response_length; i++) {
-                        char bits[9]; 
+                        char bits[9];
                         uint8_t byte = bit_buffer_get_byte(rx_buffer, i);
                         uint8_t byte = bit_buffer_get_byte(rx_buffer, i);
                         byte_to_binary(byte, bits);
                         byte_to_binary(byte, bits);
-                        strcat(event_bit_representation, bits); 
+                        strcat(event_bit_representation, bits);
                     }
                     }
                     furi_string_cat_printf(parsed_data, "\nEvent 0%d:\n", i);
                     furi_string_cat_printf(parsed_data, "\nEvent 0%d:\n", i);
                     int start = 53, end = 60;
                     int start = 53, end = 60;
                     int decimal_value = bit_slice_to_dec(event_bit_representation, start, end);
                     int decimal_value = bit_slice_to_dec(event_bit_representation, start, end);
                     int transport_type = decimal_value >> 4;
                     int transport_type = decimal_value >> 4;
                     int transition = decimal_value & 15;
                     int transition = decimal_value & 15;
-                    furi_string_cat_printf(parsed_data, "%s - %s\n", TRANSPORT_LIST[transport_type], TRANSITION_LIST[transition]);
+                    furi_string_cat_printf(
+                        parsed_data,
+                        "%s - %s\n",
+                        TRANSPORT_LIST[transport_type],
+                        TRANSITION_LIST[transition]);
                     start = 69, end = 84;
                     start = 69, end = 84;
                     decimal_value = bit_slice_to_dec(event_bit_representation, start, end);
                     decimal_value = bit_slice_to_dec(event_bit_representation, start, end);
                     int line_id = (decimal_value >> 9) - 1;
                     int line_id = (decimal_value >> 9) - 1;
                     int station_id = ((decimal_value >> 4) & 31) - 1;
                     int station_id = ((decimal_value >> 4) & 31) - 1;
-                    furi_string_cat_printf(parsed_data, "Line: %s\nStation: %s\n", METRO_LIST[line_id].name, METRO_LIST[line_id].stations[station_id]);
+                    furi_string_cat_printf(
+                        parsed_data,
+                        "Line: %s\nStation: %s\n",
+                        METRO_LIST[line_id].name,
+                        METRO_LIST[line_id].stations[station_id]);
                     start = 61, end = 68;
                     start = 61, end = 68;
                     decimal_value = bit_slice_to_dec(event_bit_representation, start, end);
                     decimal_value = bit_slice_to_dec(event_bit_representation, start, end);
-                    furi_string_cat_printf(parsed_data, "Provider: %s\n", SERVICE_PROVIDERS[decimal_value]);
+                    furi_string_cat_printf(
+                        parsed_data, "Provider: %s\n", SERVICE_PROVIDERS[decimal_value]);
                     start = 0, end = 13;
                     start = 0, end = 13;
                     decimal_value = bit_slice_to_dec(event_bit_representation, start, end);
                     decimal_value = bit_slice_to_dec(event_bit_representation, start, end);
                     uint64_t date_timestamp = (decimal_value * 24 * 3600) + epoch + 3600;
                     uint64_t date_timestamp = (decimal_value * 24 * 3600) + epoch + 3600;
@@ -292,27 +294,26 @@ static NfcCommand metroflip_scene_navigo_poller_callback(NfcGenericEvent event,
                     locale_format_datetime_cat(parsed_data, &dt, false);
                     locale_format_datetime_cat(parsed_data, &dt, false);
                     start = 14, end = 24;
                     start = 14, end = 24;
                     decimal_value = bit_slice_to_dec(event_bit_representation, start, end);
                     decimal_value = bit_slice_to_dec(event_bit_representation, start, end);
-                    furi_string_cat_printf(parsed_data, " %02d:%02d:%02d\n\n", ((decimal_value*60) / 3600), (((decimal_value*60) % 3600)/60), (((decimal_value*60) % 3600)%60));
+                    furi_string_cat_printf(
+                        parsed_data,
+                        " %02d:%02d:%02d\n\n",
+                        ((decimal_value * 60) / 3600),
+                        (((decimal_value * 60) % 3600) / 60),
+                        (((decimal_value * 60) % 3600) % 60));
                 }
                 }
 
 
                 widget_add_text_scroll_element(
                 widget_add_text_scroll_element(
                     widget, 0, 0, 128, 64, furi_string_get_cstr(parsed_data));
                     widget, 0, 0, 128, 64, furi_string_get_cstr(parsed_data));
 
 
                 widget_add_button_element(
                 widget_add_button_element(
-                    widget,
-                    GuiButtonTypeRight,
-                    "Exit",
-                    metroflip_navigo_widget_callback,
-                    app);
+                    widget, GuiButtonTypeRight, "Exit", metroflip_navigo_widget_callback, app);
 
 
                 furi_string_free(parsed_data);
                 furi_string_free(parsed_data);
                 view_dispatcher_switch_to_view(app->view_dispatcher, MetroflipViewWidget);
                 view_dispatcher_switch_to_view(app->view_dispatcher, MetroflipViewWidget);
                 metroflip_app_blink_stop(app);
                 metroflip_app_blink_stop(app);
                 stage = MetroflipPollerEventTypeSuccess;
                 stage = MetroflipPollerEventTypeSuccess;
                 next_command = NfcCommandStop;
                 next_command = NfcCommandStop;
-                } while(false);
-
-
+            } while(false);
 
 
             if(stage != MetroflipPollerEventTypeSuccess) {
             if(stage != MetroflipPollerEventTypeSuccess) {
                 next_command = NfcCommandStop;
                 next_command = NfcCommandStop;

+ 11 - 18
scenes/metroflip_scene_ravkav.c

@@ -4,10 +4,7 @@
 
 
 #define TAG "Metroflip:Scene:RavKav"
 #define TAG "Metroflip:Scene:RavKav"
 
 
-void metroflip_ravkav_widget_callback(
-    GuiButtonType result,
-    InputType type,
-    void* context) {
+void metroflip_ravkav_widget_callback(GuiButtonType result, InputType type, void* context) {
     Metroflip* app = context;
     Metroflip* app = context;
     UNUSED(result);
     UNUSED(result);
 
 
@@ -70,6 +67,7 @@ static NfcCommand metroflip_scene_ravkav_poller_callback(NfcGenericEvent event,
                 }
                 }
 
 
                 // Now send the read command
                 // Now send the read command
+                read_file[2] = 1;
                 bit_buffer_reset(tx_buffer);
                 bit_buffer_reset(tx_buffer);
                 bit_buffer_append_bytes(tx_buffer, read_file, sizeof(read_file));
                 bit_buffer_append_bytes(tx_buffer, read_file, sizeof(read_file));
                 error = iso14443_4b_poller_send_block(iso14443_4b_poller, tx_buffer, rx_buffer);
                 error = iso14443_4b_poller_send_block(iso14443_4b_poller, tx_buffer, rx_buffer);
@@ -146,7 +144,7 @@ static NfcCommand metroflip_scene_ravkav_poller_callback(NfcGenericEvent event,
                         app->view_dispatcher, MetroflipCustomEventPollerFileNotFound);
                         app->view_dispatcher, MetroflipCustomEventPollerFileNotFound);
                     break;
                     break;
                 }
                 }
-
+                read_file[2] = 1;
                 bit_buffer_reset(tx_buffer);
                 bit_buffer_reset(tx_buffer);
                 bit_buffer_append_bytes(tx_buffer, read_file, sizeof(read_file));
                 bit_buffer_append_bytes(tx_buffer, read_file, sizeof(read_file));
                 error = iso14443_4b_poller_send_block(iso14443_4b_poller, tx_buffer, rx_buffer);
                 error = iso14443_4b_poller_send_block(iso14443_4b_poller, tx_buffer, rx_buffer);
@@ -172,14 +170,13 @@ static NfcCommand metroflip_scene_ravkav_poller_callback(NfcGenericEvent event,
                         app->view_dispatcher, MetroflipCustomEventPollerFileNotFound);
                         app->view_dispatcher, MetroflipCustomEventPollerFileNotFound);
                     break;
                     break;
                 }
                 }
-                char bit_representation
-                    [response_length * 8 + 1]; // Total bits in the response (each byte = 8 bits)
-                bit_representation[0] = '\0'; // Initialize the string to empty
+                char bit_representation[response_length * 8 + 1];
+                bit_representation[0] = '\0';
                 for(size_t i = 0; i < response_length; i++) {
                 for(size_t i = 0; i < response_length; i++) {
-                    char bits[9]; // Temporary string for each byte (8 bits + null terminator)
+                    char bits[9];
                     uint8_t byte = bit_buffer_get_byte(rx_buffer, i);
                     uint8_t byte = bit_buffer_get_byte(rx_buffer, i);
                     byte_to_binary(byte, bits);
                     byte_to_binary(byte, bits);
-                    strcat(bit_representation, bits); // Append binary string to the result
+                    strcat(bit_representation, bits);
                 }
                 }
                 int start = 54, end = 83;
                 int start = 54, end = 83;
                 char bit_slice[end - start + 1];
                 char bit_slice[end - start + 1];
@@ -253,12 +250,12 @@ static NfcCommand metroflip_scene_ravkav_poller_callback(NfcGenericEvent event,
                     }
                     }
                     char bit_representation
                     char bit_representation
                         [response_length * 8 + 1]; // Total bits in the response (each byte = 8 bits)
                         [response_length * 8 + 1]; // Total bits in the response (each byte = 8 bits)
-                    bit_representation[0] = '\0'; // Initialize the string to empty
+                    bit_representation[0] = '\0';
                     for(size_t i = 0; i < response_length; i++) {
                     for(size_t i = 0; i < response_length; i++) {
-                        char bits[9]; // Temporary string for each byte (8 bits + null terminator)
+                        char bits[9];
                         uint8_t byte = bit_buffer_get_byte(rx_buffer, i);
                         uint8_t byte = bit_buffer_get_byte(rx_buffer, i);
                         byte_to_binary(byte, bits);
                         byte_to_binary(byte, bits);
-                        strcat(bit_representation, bits); // Append binary string to the result
+                        strcat(bit_representation, bits);
                     }
                     }
                     int start = 23, end = 52;
                     int start = 23, end = 52;
                     char bit_slice[end - start + 2];
                     char bit_slice[end - start + 2];
@@ -277,11 +274,7 @@ static NfcCommand metroflip_scene_ravkav_poller_callback(NfcGenericEvent event,
                     widget, 0, 0, 128, 64, furi_string_get_cstr(parsed_data));
                     widget, 0, 0, 128, 64, furi_string_get_cstr(parsed_data));
 
 
                 widget_add_button_element(
                 widget_add_button_element(
-                    widget,
-                    GuiButtonTypeRight,
-                    "Exit",
-                    metroflip_ravkav_widget_callback,
-                    app);
+                    widget, GuiButtonTypeRight, "Exit", metroflip_ravkav_widget_callback, app);
 
 
                 furi_string_free(parsed_data);
                 furi_string_free(parsed_data);
                 view_dispatcher_switch_to_view(app->view_dispatcher, MetroflipViewWidget);
                 view_dispatcher_switch_to_view(app->view_dispatcher, MetroflipViewWidget);

+ 284 - 156
scenes/navigo.h

@@ -3,175 +3,303 @@
 
 
 typedef struct {
 typedef struct {
     const char* name;
     const char* name;
-    const char* stations[14];  
+    const char* stations[14];
 } MetroLine;
 } MetroLine;
 
 
 #ifndef NAVIGO_H
 #ifndef NAVIGO_H
 #define NAVIGO_H
 #define NAVIGO_H
 
 
 // Service Providers
 // Service Providers
-static const char* SERVICE_PROVIDERS[] = { 
-    [2] = "SNCF",  
-    [3] = "RATP"
-};
+static const char* SERVICE_PROVIDERS[] = {[2] = "SNCF", [3] = "RATP"};
 
 
 // Transport Types
 // Transport Types
-static const char* TRANSPORT_LIST[] = {  
-    [1] = "Urban Bus",  
-    [2] = "Interurban Bus",  
-    [3] = "Metro",  
-    [4] = "Tram",  
-    [5] = "Train",  
-    [8] = "Parking"
-};
+static const char* TRANSPORT_LIST[] = {
+    [1] = "Urban Bus",
+    [2] = "Interurban Bus",
+    [3] = "Metro",
+    [4] = "Tram",
+    [5] = "Train",
+    [8] = "Parking"};
 
 
 // Transition Types
 // Transition Types
-static const char* TRANSITION_LIST[] = {  
-    [1] = "Entry",  
-    [2] = "Exit",  
-    [4] = "Inspection",  
-    [6] = "Interchange (entry)",  
-    [7] = "Interchange (exit)"
-};
+static const char* TRANSITION_LIST[] = {
+    [1] = "Entry",
+    [2] = "Exit",
+    [4] = "Inspection",
+    [6] = "Interchange (entry)",
+    [7] = "Interchange (exit)"};
 
 
 #endif // NAVIGO_H
 #endif // NAVIGO_H
 
 
-
 const MetroLine METRO_LIST[] = {
 const MetroLine METRO_LIST[] = {
-    [0] = {
-        "Cite", {
-            "Saint-Michel", "Odeon", "Cluny - La Sorbonne", "Maubert - Mutualite", "Luxembourg", 
-            "Chatelet", "Les Halles", "Les Halles", "Louvre - Rivoli", "Pont Neuf", "Cite", "Hotel de Ville"
-        }
-    },
-    [1] = {
-        "Rennes", {
-            "Cambronne", "Sevres - Lecourbe", "Segur", "Saint-Francois-Xavier", "Duroc", 
-            "Vaneau", "Sevres - Babylone", "Rue du Bac", "Rennes", "Saint-Sulpice", "Mabillon", "Saint-Germain-des-Pres"
-        }
-    },
-    [2] = {
-        "Villette", {
-            "Porte de la Villette", "Aubervilliers - Pantin - Quatre Chemins", "Fort d'Aubervilliers", 
-            "La Courneuve - 8 Mai 1945", "Hoche", "Eglise de Pantin", "Bobigny - Pantin - Raymond Queneau", 
-            "Bobigny - Pablo Picasso"
-        }
-    },
-    [3] = {
-        "Montparnasse", {
-            "Pernety", "Plaisance", "Gaite", "Edgar Quinet", "Vavin", "Montparnasse - Bienvenue", 
-            "Saint-Placide", "Notre-Dame-des-Champs"
-        }
-    },
-    [4] = {
-        "Nation", {
-            "Robespierre", "Porte de Montreuil", "Maraichers", "Buzenval", "Rue des Boulets", "Porte de Vincennes", 
-            "Picpus", "Nation", "Avron", "Alexandre Dumas"
-        }
-    },
-    [5] = {
-        "Saint-Lazare", {
-            "Malesherbes", "Monceau", "Villiers", "Quatre-Septembre", "Opera", "Auber", 
-            "Havre - Caumartin", "Saint-Lazare", "Saint-Lazare", "Saint-Augustin", "Europe", "Liege"
-        }
-    },
-    [6] = {
-        "Auteuil", {
-            "Porte de Saint-Cloud", "Porte d'Auteuil", "Eglise d'Auteuil", "Michel-Ange - Auteuil", 
-            "Michel-Ange - Molitor", "Chardon-Lagache", "Mirabeau", "Exelmans", "Jasmin"
-        }
-    },
-    [7] = {
-        "Republique", {
-            "Rambuteau", "Arts et Metiers", "Jacques Bonsergent", "Goncourt", "Temple", "Republique", 
-            "Oberkampf", "Parmentier", "Filles du Calvaire", "Saint-Sebastien - Froissart", "Richard-Lenoir", "Saint-Ambroise"
-        }
-    },
-    [8] = {
-        "Austerlitz", {
-            "Quai de la Gare", "Chevaleret", "Saint-Marcel", "Gare d'Austerlitz", "Gare de Lyon", "Quai de la Rapee"
-        }
-    },
-    [9] = {
-        "Invalides", {
-            "Champs-Elysees - Clemenceau", "Concorde", "Madeleine", "Bir-Hakeim", "Ecole Militaire", 
-            "La Tour-Maubourg", "Invalides", "Saint-Denis - Universite", "Varenne", "Assemblee nationale", "Solferino"
-        }
-    },
-    [10] = {
-        "Sentier", {
-            "Tuileries", "Palais Royal - Musee du Louvre", "Pyramides", "Bourse", "Grands Boulevards", 
-            "Richelieu - Drouot", "Bonne Nouvelle", "Strasbourg - Saint-Denis", "Chateau d'Eau", "Sentier", 
-            "Reaumur - Sebastopol", "Etienne Marcel"
-        }
-    },
-    [11] = {
-        "Ile Saint-Louis", {
-            "Faidherbe - Chaligny", "Reuilly - Diderot", "Montgallet", "Censier - Daubenton", "Place Monge", 
-            "Cardinal Lemoine", "Jussieu", "Sully - Morland", "Pont Marie", "Saint-Paul", "Bastille", "Chemin Vert", 
-            "Breguet - Sabin", "Ledru-Rollin"
-        }
-    },
-    [12] = {
-        "Daumesnil", {
-            "Porte Doree", "Porte de Charenton", "Bercy", "Dugommier", "Michel Bizot", "Daumesnil", "Bel-Air"
-        }
-    },
-    [13] = {
-        "Italie", {
-            "Porte de Choisy", "Porte d'Italie", "Cite universitaire", "Maison Blanche", "Tolbiac", "Nationale", 
-            "Campo-Formio", "Les Gobelins", "Place d'Italie", "Corvisart"
-        }
-    },
-    [14] = {
-        "Denfert", {
-            "Cour Saint-Emilion", "Porte d'Orleans", "Bibliotheque Francois Mitterrand", "Mouton-Duvernet", "Alesia", 
-            "Olympiades", "Glaciere", "Saint-Jacques", "Raspail", "Denfert-Rochereau"
-        }
-    },
-    [15] = {
-        "Felix Faure", {
-            "Falguiere", "Pasteur", "Volontaires", "Vaugirard", "Convention", "Porte de Versailles", 
-            "Balard", "Lourmel", "Boucicaut", "Felix Faure", "Charles Michels", "Javel - Andre Citroen"
-        }
-    },
-    [16] = {
-        "Passy", {
-            "Porte Dauphine", "La Motte-Picquet - Grenelle", "Commerce", "Avenue Emile Zola", "Dupleix", 
-            "Passy", "Ranelagh", "La Muette", "Rue de la Pompe", "Boissiere", "Trocadero"
-        }
-    },
-    [17] = {
-        "Etoile", {
-            "Iena", "Alma - Marceau", "Miromesnil", "Saint-Philippe du Roule", "Franklin D. Roosevelt", 
-            "George V", "Kleber", "Victor Hugo", "Argentine", "Charles de Gaulle - Etoile", "Ternes", "Courcelles"
-        }
-    },
-    [18] = {
-        "Clichy - Saint Ouen", {
-            "Mairie de Clichy", "Gabriel Peri", "Les Agnettes", "Asnieres - Gennevilliers - Les Courtilles", 
-            "La Chapelle", "Garibaldi", "Mairie de Saint-Ouen", "Carrefour Pleyel", "Saint-Denis - Porte de Paris", 
-            "Basilique de Saint-Denis"
-        }
-    },
-    [19] = {
-        "Montmartre", {
-            "Porte de Clignancourt", "Porte de la Chapelle", "Marx Dormoy", "Marcadet - Poissonniers", "Simplon", 
-            "Jules Joffrin", "Lamarck - Caulaincourt"
-        }
-    },
-    [20] = {
-        "Lafayette", {
-            "Chaussee d'Antin - La Fayette", "Le Peletier", "Cadet", "Chateau Rouge", "Barbes - Rochechouart", 
-            "Gare du Nord", "Gare de l'Est", "Poissonniere", "Chateau-Landon"
-        }
-    },
+    [0] =
+        {"Cite",
+         {"Saint-Michel",
+          "Odeon",
+          "Cluny - La Sorbonne",
+          "Maubert - Mutualite",
+          "Luxembourg",
+          "Chatelet",
+          "Les Halles",
+          "Les Halles",
+          "Louvre - Rivoli",
+          "Pont Neuf",
+          "Cite",
+          "Hotel de Ville"}},
+    [1] =
+        {"Rennes",
+         {"Cambronne",
+          "Sevres - Lecourbe",
+          "Segur",
+          "Saint-Francois-Xavier",
+          "Duroc",
+          "Vaneau",
+          "Sevres - Babylone",
+          "Rue du Bac",
+          "Rennes",
+          "Saint-Sulpice",
+          "Mabillon",
+          "Saint-Germain-des-Pres"}},
+    [2] =
+        {"Villette",
+         {"Porte de la Villette",
+          "Aubervilliers - Pantin - Quatre Chemins",
+          "Fort d'Aubervilliers",
+          "La Courneuve - 8 Mai 1945",
+          "Hoche",
+          "Eglise de Pantin",
+          "Bobigny - Pantin - Raymond Queneau",
+          "Bobigny - Pablo Picasso"}},
+    [3] =
+        {"Montparnasse",
+         {"Pernety",
+          "Plaisance",
+          "Gaite",
+          "Edgar Quinet",
+          "Vavin",
+          "Montparnasse - Bienvenue",
+          "Saint-Placide",
+          "Notre-Dame-des-Champs"}},
+    [4] =
+        {"Nation",
+         {"Robespierre",
+          "Porte de Montreuil",
+          "Maraichers",
+          "Buzenval",
+          "Rue des Boulets",
+          "Porte de Vincennes",
+          "Picpus",
+          "Nation",
+          "Avron",
+          "Alexandre Dumas"}},
+    [5] =
+        {"Saint-Lazare",
+         {"Malesherbes",
+          "Monceau",
+          "Villiers",
+          "Quatre-Septembre",
+          "Opera",
+          "Auber",
+          "Havre - Caumartin",
+          "Saint-Lazare",
+          "Saint-Lazare",
+          "Saint-Augustin",
+          "Europe",
+          "Liege"}},
+    [6] =
+        {"Auteuil",
+         {"Porte de Saint-Cloud",
+          "Porte d'Auteuil",
+          "Eglise d'Auteuil",
+          "Michel-Ange - Auteuil",
+          "Michel-Ange - Molitor",
+          "Chardon-Lagache",
+          "Mirabeau",
+          "Exelmans",
+          "Jasmin"}},
+    [7] =
+        {"Republique",
+         {"Rambuteau",
+          "Arts et Metiers",
+          "Jacques Bonsergent",
+          "Goncourt",
+          "Temple",
+          "Republique",
+          "Oberkampf",
+          "Parmentier",
+          "Filles du Calvaire",
+          "Saint-Sebastien - Froissart",
+          "Richard-Lenoir",
+          "Saint-Ambroise"}},
+    [8] =
+        {"Austerlitz",
+         {"Quai de la Gare",
+          "Chevaleret",
+          "Saint-Marcel",
+          "Gare d'Austerlitz",
+          "Gare de Lyon",
+          "Quai de la Rapee"}},
+    [9] =
+        {"Invalides",
+         {"Champs-Elysees - Clemenceau",
+          "Concorde",
+          "Madeleine",
+          "Bir-Hakeim",
+          "Ecole Militaire",
+          "La Tour-Maubourg",
+          "Invalides",
+          "Saint-Denis - Universite",
+          "Varenne",
+          "Assemblee nationale",
+          "Solferino"}},
+    [10] =
+        {"Sentier",
+         {"Tuileries",
+          "Palais Royal - Musee du Louvre",
+          "Pyramides",
+          "Bourse",
+          "Grands Boulevards",
+          "Richelieu - Drouot",
+          "Bonne Nouvelle",
+          "Strasbourg - Saint-Denis",
+          "Chateau d'Eau",
+          "Sentier",
+          "Reaumur - Sebastopol",
+          "Etienne Marcel"}},
+    [11] =
+        {"Ile Saint-Louis",
+         {"Faidherbe - Chaligny",
+          "Reuilly - Diderot",
+          "Montgallet",
+          "Censier - Daubenton",
+          "Place Monge",
+          "Cardinal Lemoine",
+          "Jussieu",
+          "Sully - Morland",
+          "Pont Marie",
+          "Saint-Paul",
+          "Bastille",
+          "Chemin Vert",
+          "Breguet - Sabin",
+          "Ledru-Rollin"}},
+    [12] =
+        {"Daumesnil",
+         {"Porte Doree",
+          "Porte de Charenton",
+          "Bercy",
+          "Dugommier",
+          "Michel Bizot",
+          "Daumesnil",
+          "Bel-Air"}},
+    [13] =
+        {"Italie",
+         {"Porte de Choisy",
+          "Porte d'Italie",
+          "Cite universitaire",
+          "Maison Blanche",
+          "Tolbiac",
+          "Nationale",
+          "Campo-Formio",
+          "Les Gobelins",
+          "Place d'Italie",
+          "Corvisart"}},
+    [14] =
+        {"Denfert",
+         {"Cour Saint-Emilion",
+          "Porte d'Orleans",
+          "Bibliotheque Francois Mitterrand",
+          "Mouton-Duvernet",
+          "Alesia",
+          "Olympiades",
+          "Glaciere",
+          "Saint-Jacques",
+          "Raspail",
+          "Denfert-Rochereau"}},
+    [15] =
+        {"Felix Faure",
+         {"Falguiere",
+          "Pasteur",
+          "Volontaires",
+          "Vaugirard",
+          "Convention",
+          "Porte de Versailles",
+          "Balard",
+          "Lourmel",
+          "Boucicaut",
+          "Felix Faure",
+          "Charles Michels",
+          "Javel - Andre Citroen"}},
+    [16] =
+        {"Passy",
+         {"Porte Dauphine",
+          "La Motte-Picquet - Grenelle",
+          "Commerce",
+          "Avenue Emile Zola",
+          "Dupleix",
+          "Passy",
+          "Ranelagh",
+          "La Muette",
+          "Rue de la Pompe",
+          "Boissiere",
+          "Trocadero"}},
+    [17] =
+        {"Etoile",
+         {"Iena",
+          "Alma - Marceau",
+          "Miromesnil",
+          "Saint-Philippe du Roule",
+          "Franklin D. Roosevelt",
+          "George V",
+          "Kleber",
+          "Victor Hugo",
+          "Argentine",
+          "Charles de Gaulle - Etoile",
+          "Ternes",
+          "Courcelles"}},
+    [18] =
+        {"Clichy - Saint Ouen",
+         {"Mairie de Clichy",
+          "Gabriel Peri",
+          "Les Agnettes",
+          "Asnieres - Gennevilliers - Les Courtilles",
+          "La Chapelle",
+          "Garibaldi",
+          "Mairie de Saint-Ouen",
+          "Carrefour Pleyel",
+          "Saint-Denis - Porte de Paris",
+          "Basilique de Saint-Denis"}},
+    [19] =
+        {"Montmartre",
+         {"Porte de Clignancourt",
+          "Porte de la Chapelle",
+          "Marx Dormoy",
+          "Marcadet - Poissonniers",
+          "Simplon",
+          "Jules Joffrin",
+          "Lamarck - Caulaincourt"}},
+    [20] =
+        {"Lafayette",
+         {"Chaussee d'Antin - La Fayette",
+          "Le Peletier",
+          "Cadet",
+          "Chateau Rouge",
+          "Barbes - Rochechouart",
+          "Gare du Nord",
+          "Gare de l'Est",
+          "Poissonniere",
+          "Chateau-Landon"}},
     [21] = {
     [21] = {
-        "Buttes Chaumont", {
-            "Porte de Pantin", "Ourcq", "Corentin Cariou", "Crimee", "Riquet", "La Chapelle", 
-            "Belleville", "Botzaris", "Pelleport", "Place des Fetes", "Cimetiere du Pere Lachaise"
-        }
-    }
-};
+        "Buttes Chaumont",
+        {"Porte de Pantin",
+         "Ourcq",
+         "Corentin Cariou",
+         "Crimee",
+         "Riquet",
+         "La Chapelle",
+         "Belleville",
+         "Botzaris",
+         "Pelleport",
+         "Place des Fetes",
+         "Cimetiere du Pere Lachaise"}}};
 
 
-#endif // METRO_LIST_H
+#endif // METRO_LIST_H