From 3598f4b848848b9dc76c9d4a0a4a59d61df47d3d Mon Sep 17 00:00:00 2001 From: Pieter Colpaert Date: Sun, 2 Aug 2015 09:43:52 +0200 Subject: [PATCH 01/51] Updated Mamer locations --- app/stations.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/stations.json b/app/stations.json index 37d81b28..bc7f079d 100644 --- a/app/stations.json +++ b/app/stations.json @@ -1 +1 @@ -{"@context":{"name":"http://xmlns.com/foaf/0.1/name","longitude":"http://www.w3.org/2003/01/geo/wgs84_pos#long","latitude":"http://www.w3.org/2003/01/geo/wgs84_pos#lat","alternative":"http://purl.org/dc/terms/alternative","country":{"@type":"@id","@id":"http://www.geonames.org/ontology#parentCountry"}},"@graph":[{"@id":"http://irail.be/stations/NMBS/007015400","alternative":[{"@language":"fr","@value":"Londres Saint Pancras"},{"@language":"nl","@value":"Londen Saint Pancras"}],"country":"http://sws.geonames.org/2635167/","latitude":"51.5310399","longitude":"-0.1260606","name":"London Saint Pancras International"},{"@id":"http://irail.be/stations/NMBS/007015440","country":"http://sws.geonames.org/2635167/","latitude":"51.44304","longitude":"0.32107","name":"Ebbsfleet International"},{"@id":"http://irail.be/stations/NMBS/008008094","country":"http://sws.geonames.org/2921044/","latitude":"51.219962","longitude":"6.794319","name":"Düsseldorf Hbf"},{"@id":"http://irail.be/stations/NMBS/008010184","country":"http://sws.geonames.org/2921044/","latitude":"51.451355","longitude":"7.014793","name":"Essen Hbf"},{"@id":"http://irail.be/stations/NMBS/008010316","country":"http://sws.geonames.org/2921044/","latitude":"51.42978","longitude":"6.7759037","name":"Duisburg Hbf"},{"@id":"http://irail.be/stations/NMBS/008011068","alternative":[{"@language":"fr","@value":"Francfort-sur-le-Main Hbf"}],"country":"http://sws.geonames.org/2921044/","latitude":"50.1071318","longitude":"8.6653708","name":"Frankfurt am Main Hbf"},{"@id":"http://irail.be/stations/NMBS/008011090","alternative":[{"@language":"en","@value":"Frankfurt am Main Airport"},{"@language":"fr","@value":"Francfort-sur-le-Main Aéroport"},{"@language":"nl","@value":"Frankfurt am Main Luchthaven"}],"country":"http://sws.geonames.org/2921044/","latitude":"50.051696","longitude":"8.569853","name":"Frankfurt am Main Flughafen"},{"@id":"http://irail.be/stations/NMBS/008015345","alternative":[{"@language":"fr","@value":"Aix-la-Chapelle Hbf"},{"@language":"nl","@value":"Aken Hbf"}],"country":"http://sws.geonames.org/2921044/","latitude":"50.770832","longitude":"6.105275","name":"Aachen Hbf"},{"@id":"http://irail.be/stations/NMBS/008015458","alternative":[{"@language":"fr","@value":"Cologne Hbf"},{"@language":"nl","@value":"Keulen Hbf"}],"country":"http://sws.geonames.org/2921044/","latitude":"50.942721","longitude":"6.958823","name":"Köln Hbf"},{"@id":"http://irail.be/stations/NMBS/008015588","country":"http://sws.geonames.org/2921044/","latitude":"50.793916","longitude":"7.203029","name":"Siegburg"},{"@id":"http://irail.be/stations/NMBS/008032572","country":"http://sws.geonames.org/2921044/","latitude":"50.3825","longitude":"8.096112","name":"Limburg Süd"},{"@id":"http://irail.be/stations/NMBS/008039904","country":"http://sws.geonames.org/2921044/","latitude":"51.292008","longitude":"6.786837","name":"Düsseldorf Flughafen Hbf"},{"@id":"http://irail.be/stations/NMBS/008200100","alternative":[{"@language":"fr","@value":"Luxembourg"},{"@language":"nl","@value":"Luxemburg"},{"@language":"de","@value":"Luxemburg"}],"country":"http://sws.geonames.org/2960313/","latitude":"49.599996","longitude":"6.133331","name":"Lëtzebuerg"},{"@id":"http://irail.be/stations/NMBS/008200110","country":"http://sws.geonames.org/2960313/","latitude":"49.748893","longitude":"6.106111","name":"Mersch"},{"@id":"http://irail.be/stations/NMBS/008200120","alternative":[{"@language":"fr","@value":"Ettelbruck"},{"@language":"nl","@value":"Ettelbruck"},{"@language":"de","@value":"Ettelbrück"}],"country":"http://sws.geonames.org/2960313/","latitude":"49.847496","longitude":"6.104169","name":"Ettelbréck"},{"@id":"http://irail.be/stations/NMBS/008200130","alternative":[{"@language":"fr","@value":"Kautenbach"},{"@language":"nl","@value":"Kautenbach"},{"@language":"de","@value":"Kautenbach"}],"country":"http://sws.geonames.org/2960313/","latitude":"49.952777","longitude":"6.020003","name":"Kautebaach"},{"@id":"http://irail.be/stations/NMBS/008200132","country":"http://sws.geonames.org/2960313/","latitude":"49.988887","longitude":"5.999166","name":"Wilwerwiltz"},{"@id":"http://irail.be/stations/NMBS/008200133","country":"http://sws.geonames.org/2960313/","latitude":"50.017778","longitude":"6.006106","name":"Drauffelt"},{"@id":"http://irail.be/stations/NMBS/008200134","country":"http://sws.geonames.org/2960313/","latitude":"50.054724","longitude":"6.031393","name":"Clervaux"},{"@id":"http://irail.be/stations/NMBS/008200136","country":"http://sws.geonames.org/2960313/","latitude":"50.121109","longitude":"6.000281","name":"Troisvierges"},{"@id":"http://irail.be/stations/NMBS/008200510","country":"http://sws.geonames.org/2960313/","latitude":"49.613002","longitude":"6.060601","name":"Bertrange Strassen"},{"@id":"http://irail.be/stations/NMBS/008200516","country":"http://sws.geonames.org/2960313/","latitude":"49.627502","longitude":"6.02333","name":"Mamer"},{"@id":"http://irail.be/stations/NMBS/008200518","alternative":[{"@language":"fr","@value":"Capellen"},{"@language":"nl","@value":"Capellen"},{"@language":"de","@value":"Capellen"}],"country":"http://sws.geonames.org/2960313/","latitude":"49.644996","longitude":"5.990833","name":"Kapellen"},{"@id":"http://irail.be/stations/NMBS/008200520","alternative":[{"@language":"fr","@value":"Kleinbettingen"},{"@language":"nl","@value":"Kleinbettingen"},{"@language":"de","@value":"Kleinbettingen"}],"country":"http://sws.geonames.org/2960313/","latitude":"49.646389","longitude":"5.916385","name":"Klengbetten"},{"@id":"http://irail.be/stations/NMBS/008200940","country":"http://sws.geonames.org/2960313/","latitude":"49.551283","longitude":"5.845028","name":"Rodange"},{"@id":"http://irail.be/stations/NMBS/008210014","country":"http://sws.geonames.org/2960313/","latitude":"49.627502","longitude":"6.02333","name":"Mamer-Lycée"},{"@id":"http://irail.be/stations/NMBS/008400058","country":"http://sws.geonames.org/2750405/","latitude":"52.379128","longitude":"4.900272","name":"Amsterdam CS"},{"@id":"http://irail.be/stations/NMBS/008400180","country":"http://sws.geonames.org/2750405/","latitude":"51.799998","longitude":"4.666668","name":"Dordrecht"},{"@id":"http://irail.be/stations/NMBS/008400219","country":"http://sws.geonames.org/2750405/","latitude":"50.772135","longitude":"5.709786","name":"Eijsden"},{"@id":"http://irail.be/stations/NMBS/008400280","country":"http://sws.geonames.org/2750405/","latitude":"52.083329","longitude":"4.299999","name":"Den Haag HS"},{"@id":"http://irail.be/stations/NMBS/008400424","country":"http://sws.geonames.org/2750405/","latitude":"50.85","longitude":"5.683331","name":"Maastricht"},{"@id":"http://irail.be/stations/NMBS/008400426","country":"http://sws.geonames.org/2750405/","latitude":"50.838502","longitude":"5.716707","name":"Maastricht Randwyck"},{"@id":"http://irail.be/stations/NMBS/008400526","country":"http://sws.geonames.org/2750405/","latitude":"51.533333","longitude":"4.466667","name":"Roosendaal"},{"@id":"http://irail.be/stations/NMBS/008400530","country":"http://sws.geonames.org/2750405/","latitude":"51.925093","longitude":"4.469424","name":"Rotterdam CS"},{"@id":"http://irail.be/stations/NMBS/008400561","country":"http://sws.geonames.org/2750405/","latitude":"52.308294","longitude":"4.762268","name":"Schiphol"},{"@id":"http://irail.be/stations/NMBS/008500010","alternative":[{"@language":"nl","@value":"Bazel"}],"country":"http://sws.geonames.org/2658434/","latitude":"47.547408","longitude":"7.590716","name":"Basel"},{"@id":"http://irail.be/stations/NMBS/008711184","country":"http://sws.geonames.org/3017382/","latitude":"48.868256","longitude":"2.782184","name":"Marne-la-Vallée - Chessy"},{"@id":"http://irail.be/stations/NMBS/008718201","country":"http://sws.geonames.org/3017382/","latitude":"48.083335","longitude":"7.366668","name":"Colmar"},{"@id":"http://irail.be/stations/NMBS/008718206","country":"http://sws.geonames.org/3017382/","latitude":"47.749998","longitude":"7.333336","name":"Mulhouse"},{"@id":"http://irail.be/stations/NMBS/008718213","country":"http://sws.geonames.org/3017382/","latitude":"47.5907","longitude":"7.555316","name":"Saint-Louis-Haut-Rhin"},{"@id":"http://irail.be/stations/NMBS/008719100","country":"http://sws.geonames.org/3017382/","latitude":"49.366663","longitude":"6.166663","name":"Thionville"},{"@id":"http://irail.be/stations/NMBS/008719203","country":"http://sws.geonames.org/3017382/","latitude":"49.13333","longitude":"6.166663","name":"Metz"},{"@id":"http://irail.be/stations/NMBS/008721202","alternative":[{"@language":"nl","@value":"Straatsburg"},{"@language":"de","@value":"Straßburg"}],"country":"http://sws.geonames.org/3017382/","latitude":"48.585437","longitude":"7.733905","name":"Strasbourg"},{"@id":"http://irail.be/stations/NMBS/008721222","country":"http://sws.geonames.org/3017382/","latitude":"48.744798","longitude":"7.362255","name":"Saverne"},{"@id":"http://irail.be/stations/NMBS/008721405","country":"http://sws.geonames.org/3017382/","latitude":"48.26667","longitude":"7.449999","name":"Selestat"},{"@id":"http://irail.be/stations/NMBS/008722326","alternative":[{"@language":"nl","@value":"Rijsel-Europa"}],"country":"http://sws.geonames.org/3017382/","latitude":"50.636108","longitude":"3.071516","name":"Lille Europe"},{"@id":"http://irail.be/stations/NMBS/008727100","alternative":[{"@language":"nl","@value":"Parijs Noord"}],"country":"http://sws.geonames.org/3017382/","latitude":"48.8809984","longitude":"2.3553093","name":"Paris Nord"},{"@id":"http://irail.be/stations/NMBS/008727149","country":"http://sws.geonames.org/3017382/","latitude":"49.003955","longitude":"2.571123","name":"Aéroport Charles-de-Gaulle TGV"},{"@id":"http://irail.be/stations/NMBS/008728105","country":"http://sws.geonames.org/3017382/","latitude":"50.675708","longitude":"3.13381","name":"Croix l'Allumette"},{"@id":"http://irail.be/stations/NMBS/008728600","alternative":[{"@language":"nl","@value":"Rijsel-Vlaanderen"}],"country":"http://sws.geonames.org/3017382/","latitude":"50.633333","longitude":"3.066669","name":"Lille Flandres"},{"@id":"http://irail.be/stations/NMBS/008728606","country":"http://sws.geonames.org/3017382/","latitude":"50.626941","longitude":"3.108892","name":"Hellemmes"},{"@id":"http://irail.be/stations/NMBS/008728654","country":"http://sws.geonames.org/2921044/","latitude":"50.716663","longitude":"3.168033","name":"Tourcoing"},{"@id":"http://irail.be/stations/NMBS/008728671","country":"http://sws.geonames.org/3017382/","latitude":"50.6764687","longitude":"3.149272","name":"Croix Wasquehal"},{"@id":"http://irail.be/stations/NMBS/008728673","country":"http://sws.geonames.org/3017382/","latitude":"50.699997","longitude":"3.166666","name":"Roubaix"},{"@id":"http://irail.be/stations/NMBS/008728683","country":"http://sws.geonames.org/3017382/","latitude":"50.624164","longitude":"3.1275","name":"Pont de Bois"},{"@id":"http://irail.be/stations/NMBS/008728685","country":"http://sws.geonames.org/3017382/","latitude":"50.6228168","longitude":"3.1473086","name":"Annappes"},{"@id":"http://irail.be/stations/NMBS/008728686","country":"http://sws.geonames.org/3017382/","latitude":"50.616666","longitude":"3.166666","name":"Ascq"},{"@id":"http://irail.be/stations/NMBS/008728687","country":"http://sws.geonames.org/3017382/","latitude":"50.610039","longitude":"3.2378999","name":"Baisieux"},{"@id":"http://irail.be/stations/NMBS/008728710","country":"http://sws.geonames.org/3017382/","latitude":"50.616666","longitude":"3.116667","name":"Lezennes"},{"@id":"http://irail.be/stations/NMBS/008731388","country":"http://sws.geonames.org/3017382/","latitude":"49.623044","longitude":"2.802566","name":"Haute-Picardie TGV"},{"@id":"http://irail.be/stations/NMBS/008731896","country":"http://sws.geonames.org/3017382/","latitude":"43.921433","longitude":"4.785841","name":"Avignon TGV"},{"@id":"http://irail.be/stations/NMBS/008731901","country":"http://sws.geonames.org/3017382/","latitude":"43.455128","longitude":"5.317243","name":"Aix-en-Provence TGV"},{"@id":"http://irail.be/stations/NMBS/008772202","country":"http://sws.geonames.org/3017382/","latitude":"45.748360","longitude":"4.825301","name":"Lyon-Perrache TGV"},{"@id":"http://irail.be/stations/NMBS/008772319","country":"http://sws.geonames.org/3017382/","latitude":"45.7612738","longitude":"4.8594013","name":"Lyon Part Dieu TGV"},{"@id":"http://irail.be/stations/NMBS/008774100","country":"http://sws.geonames.org/3017382/","latitude":"45.571498","longitude":"5.919756","name":"Chambéry-Challes-les-Eaux"},{"@id":"http://irail.be/stations/NMBS/008774164","country":"http://sws.geonames.org/3017382/","latitude":"45.673624","longitude":"6.383617","name":"Albertville"},{"@id":"http://irail.be/stations/NMBS/008774172","country":"http://sws.geonames.org/3017382/","latitude":"45.486693","longitude":"6.531454","name":"Moûtiers-Salins-Brides-les-Bai"},{"@id":"http://irail.be/stations/NMBS/008774176","country":"http://sws.geonames.org/3017382/","latitude":"45.554202","longitude":"6.648394","name":"Aime-la-Plagne"},{"@id":"http://irail.be/stations/NMBS/008774177","country":"http://sws.geonames.org/3017382/","latitude":"45.574194","longitude":"6.733522","name":"Landry"},{"@id":"http://irail.be/stations/NMBS/008774179","country":"http://sws.geonames.org/3017382/","latitude":"45.618826","longitude":"6.771664","name":"Bourg-Saint-Maurice"},{"@id":"http://irail.be/stations/NMBS/008775100","country":"http://sws.geonames.org/3017382/","latitude":"43.303178","longitude":"5.380752","name":"Marseille-Saint-Charles"},{"@id":"http://irail.be/stations/NMBS/008775500","country":"http://sws.geonames.org/3017382/","latitude":"43.1274781","longitude":"5.9326648","name":"Toulon"},{"@id":"http://irail.be/stations/NMBS/008775544","country":"http://sws.geonames.org/3017382/","latitude":"43.4555673","longitude":"6.4826446","name":"Les Arcs - Draguignan"},{"@id":"http://irail.be/stations/NMBS/008775605","country":"http://sws.geonames.org/3017382/","latitude":"43.704605","longitude":"7.261928","name":"Nice Ville"},{"@id":"http://irail.be/stations/NMBS/008775752","country":"http://sws.geonames.org/3017382/","latitude":"43.423456","longitude":"6.768825","name":"Saint-Raphaël-Valescure"},{"@id":"http://irail.be/stations/NMBS/008775762","country":"http://sws.geonames.org/3017382/","latitude":"43.553742","longitude":"7.019895","name":"Cannes"},{"@id":"http://irail.be/stations/NMBS/008775767","country":"http://sws.geonames.org/3017382/","latitude":"43.586618","longitude":"7.1201361","name":"Antibes"},{"@id":"http://irail.be/stations/NMBS/008776290","country":"http://sws.geonames.org/3017382/","latitude":"45.720907","longitude":"5.075822","name":"Lyon-Saint Exupéry TGV"},{"@id":"http://irail.be/stations/NMBS/008776302","country":"http://sws.geonames.org/2921044/","latitude":"44.992586","longitude":"4.978529","name":"Valence TGV"},{"@id":"http://irail.be/stations/NMBS/008777300","country":"http://sws.geonames.org/3017382/","latitude":"43.604947","longitude":"3.880534","name":"Montpellier"},{"@id":"http://irail.be/stations/NMBS/008777320","country":"http://sws.geonames.org/3017382/","latitude":"43.412810","longitude":"3.696535","name":"Sète"},{"@id":"http://irail.be/stations/NMBS/008777500","country":"http://sws.geonames.org/3017382/","latitude":"43.832602","longitude":"4.365997","name":"Nîmes"},{"@id":"http://irail.be/stations/NMBS/008778100","country":"http://sws.geonames.org/3017382/","latitude":"43.336177","longitude":"3.218794","name":"Béziers"},{"@id":"http://irail.be/stations/NMBS/008778110","country":"http://sws.geonames.org/3017382/","latitude":"43.190399","longitude":"3.006010","name":"Narbonne"},{"@id":"http://irail.be/stations/NMBS/008778127","country":"http://sws.geonames.org/3017382/","latitude":"43.317498","longitude":"3.465800","name":"Agde"},{"@id":"http://irail.be/stations/NMBS/008778400","country":"http://sws.geonames.org/3017382/","latitude":"42.695938","longitude":"2.879397","name":"Perpignan"},{"@id":"http://irail.be/stations/NMBS/008811007","alternative":[{"@language":"fr","@value":"Schaerbeek"},{"@language":"nl","@value":"Schaarbeek"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.878513","longitude":"4.378636","name":"Schaarbeek/Schaerbeek"},{"@id":"http://irail.be/stations/NMBS/008811106","country":"http://sws.geonames.org/2802361/","latitude":"50.86778","longitude":"4.400965","name":"Evere"},{"@id":"http://irail.be/stations/NMBS/008811130","alternative":[{"@language":"fr","@value":"Haren-Sud"},{"@language":"nl","@value":"Haren-Zuid"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.889696","longitude":"4.415357","name":"Haren-Sud/Haren-Zuid"},{"@id":"http://irail.be/stations/NMBS/008811148","country":"http://sws.geonames.org/2802361/","latitude":"50.907495","longitude":"4.417074","name":"Buda"},{"@id":"http://irail.be/stations/NMBS/008811155","country":"http://sws.geonames.org/2802361/","latitude":"50.888878","longitude":"4.419978","name":"Haren"},{"@id":"http://irail.be/stations/NMBS/008811163","country":"http://sws.geonames.org/2802361/","latitude":"50.877785","longitude":"4.410026","name":"Bordet"},{"@id":"http://irail.be/stations/NMBS/008811171","country":"http://sws.geonames.org/2802361/","latitude":"50.854072","longitude":"4.394421","name":"Meiser"},{"@id":"http://irail.be/stations/NMBS/008811189","alternative":[{"@language":"fr","@value":"Vilvorde"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.924583","longitude":"4.432823","name":"Vilvoorde"},{"@id":"http://irail.be/stations/NMBS/008811197","country":"http://sws.geonames.org/2802361/","latitude":"50.839284","longitude":"4.398934","name":"Merode"},{"@id":"http://irail.be/stations/NMBS/008811205","country":"http://sws.geonames.org/2802361/","latitude":"50.818357","longitude":"4.403869","name":"Delta"},{"@id":"http://irail.be/stations/NMBS/008811213","country":"http://sws.geonames.org/2802361/","latitude":"50.890478","longitude":"4.442774","name":"Diegem"},{"@id":"http://irail.be/stations/NMBS/008811221","country":"http://sws.geonames.org/2802361/","latitude":"50.885723","longitude":"4.469886","name":"Zaventem"},{"@id":"http://irail.be/stations/NMBS/008811247","country":"http://sws.geonames.org/2802361/","latitude":"50.883314","longitude":"4.506112","name":"Nossegem"},{"@id":"http://irail.be/stations/NMBS/008811254","country":"http://sws.geonames.org/2802361/","latitude":"50.893067","longitude":"4.543301","name":"Kortenberg"},{"@id":"http://irail.be/stations/NMBS/008811262","country":"http://sws.geonames.org/2802361/","latitude":"50.89651","longitude":"4.585001","name":"Erps-Kwerps"},{"@id":"http://irail.be/stations/NMBS/008811270","country":"http://sws.geonames.org/2802361/","latitude":"50.900519","longitude":"4.633516","name":"Veltem"},{"@id":"http://irail.be/stations/NMBS/008811288","country":"http://sws.geonames.org/2802361/","latitude":"50.90353","longitude":"4.672188","name":"Herent"},{"@id":"http://irail.be/stations/NMBS/008811304","alternative":[{"@language":"en","@value":"Brussels-Luxemburg/Brussels-Luxembourg"},{"@language":"fr","@value":"Bruxelles-Luxembourg"},{"@language":"nl","@value":"Brussel-Luxemburg"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.838943","longitude":"4.373674","name":"Brussel-Luxemburg/Bruxelles-Luxembourg"},{"@id":"http://irail.be/stations/NMBS/008811411","country":"http://sws.geonames.org/2802361/","latitude":"50.822187","longitude":"4.389513","name":"Etterbeek"},{"@id":"http://irail.be/stations/NMBS/008811429","alternative":[{"@language":"fr","@value":"Watermael"},{"@language":"nl","@value":"Watermaal"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.80917","longitude":"4.399887","name":"Watermaal/Watermael"},{"@id":"http://irail.be/stations/NMBS/008811437","alternative":[{"@language":"fr","@value":"Boitsfort"},{"@language":"nl","@value":"Bosvoorde"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.794698","longitude":"4.408112","name":"Bosvoorde/Boitsfort"},{"@id":"http://irail.be/stations/NMBS/008811445","alternative":[{"@language":"fr","@value":"Groenendael"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.766103","longitude":"4.449489","name":"Groenendaal"},{"@id":"http://irail.be/stations/NMBS/008811460","country":"http://sws.geonames.org/2802361/","latitude":"50.760161","longitude":"4.467414","name":"Hoeilaart"},{"@id":"http://irail.be/stations/NMBS/008811510","alternative":[{"@language":"nl","@value":"Terhulpen"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.737958","longitude":"4.49706","name":"La Hulpe"},{"@id":"http://irail.be/stations/NMBS/008811528","country":"http://sws.geonames.org/2802361/","latitude":"50.725697","longitude":"4.514832","name":"Genval"},{"@id":"http://irail.be/stations/NMBS/008811536","country":"http://sws.geonames.org/2802361/","latitude":"50.711413","longitude":"4.532855","name":"Rixensart"},{"@id":"http://irail.be/stations/NMBS/008811544","country":"http://sws.geonames.org/2802361/","latitude":"50.693758","longitude":"4.549153","name":"Profondsart"},{"@id":"http://irail.be/stations/NMBS/008811601","country":"http://sws.geonames.org/2802361/","latitude":"50.673667","longitude":"4.56936","name":"Ottignies"},{"@id":"http://irail.be/stations/NMBS/008811635","country":"http://sws.geonames.org/2802361/","latitude":"50.69214","longitude":"4.575302","name":"Limal"},{"@id":"http://irail.be/stations/NMBS/008811676","country":"http://sws.geonames.org/2802361/","latitude":"50.669793","longitude":"4.615745","name":"Louvain-la-Neuve-Université"},{"@id":"http://irail.be/stations/NMBS/008811718","country":"http://sws.geonames.org/2802361/","latitude":"50.707772","longitude":"4.594746","name":"Bierges-Walibi"},{"@id":"http://irail.be/stations/NMBS/008811726","alternative":[{"@language":"nl","@value":"Waver"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.716267","longitude":"4.604778","name":"Wavre"},{"@id":"http://irail.be/stations/NMBS/008811734","country":"http://sws.geonames.org/2802361/","latitude":"50.72442","longitude":"4.621651","name":"Basse-Wavre"},{"@id":"http://irail.be/stations/NMBS/008811742","country":"http://sws.geonames.org/2802361/","latitude":"50.736646","longitude":"4.649598","name":"Gastuche"},{"@id":"http://irail.be/stations/NMBS/008811759","alternative":[{"@language":"nl","@value":"Eerken"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.754345","longitude":"4.662444","name":"Archennes"},{"@id":"http://irail.be/stations/NMBS/008811767","country":"http://sws.geonames.org/2802361/","latitude":"50.761501","longitude":"4.653868","name":"Florival"},{"@id":"http://irail.be/stations/NMBS/008811775","country":"http://sws.geonames.org/2802361/","latitude":"50.778517","longitude":"4.651486","name":"Pécrot"},{"@id":"http://irail.be/stations/NMBS/008811817","country":"http://sws.geonames.org/2802361/","latitude":"50.659941","longitude":"4.569046","name":"Ceroux-Mousty"},{"@id":"http://irail.be/stations/NMBS/008811825","country":"http://sws.geonames.org/2802361/","latitude":"50.645567","longitude":"4.565819","name":"Court-Saint-Étienne"},{"@id":"http://irail.be/stations/NMBS/008811916","alternative":[{"@language":"en","@value":"Brussels-Schuman"},{"@language":"fr","@value":"Bruxelles-Schuman"},{"@language":"nl","@value":"Brussel-Schuman"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.843276","longitude":"4.380722","name":"Brussel-Schuman/Bruxelles-Schuman"},{"@id":"http://irail.be/stations/NMBS/008812005","alternative":[{"@language":"en","@value":"Brussels-North"},{"@language":"fr","@value":"Bruxelles-Nord"},{"@language":"nl","@value":"Brussel-Noord"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.859663","longitude":"4.360846","name":"Brussel-Noord/Bruxelles-Nord"},{"@id":"http://irail.be/stations/NMBS/008812013","country":"http://sws.geonames.org/2802361/","latitude":"50.863645","longitude":"4.32898","name":"Simonis"},{"@id":"http://irail.be/stations/NMBS/008812021","country":"http://sws.geonames.org/2802361/","latitude":"50.87943","longitude":"4.348513","name":"Bockstael"},{"@id":"http://irail.be/stations/NMBS/008812047","country":"http://sws.geonames.org/2802361/","latitude":"50.880833","longitude":"4.32622","name":"Jette"},{"@id":"http://irail.be/stations/NMBS/008812062","country":"http://sws.geonames.org/2802361/","latitude":"50.890028","longitude":"4.274541","name":"Zellik"},{"@id":"http://irail.be/stations/NMBS/008812070","country":"http://sws.geonames.org/2802361/","latitude":"50.906488","longitude":"4.207985","name":"Asse"},{"@id":"http://irail.be/stations/NMBS/008812112","country":"http://sws.geonames.org/2802361/","latitude":"50.933473","longitude":"4.216965","name":"Mollem"},{"@id":"http://irail.be/stations/NMBS/008812120","country":"http://sws.geonames.org/2802361/","latitude":"50.954958","longitude":"4.222718","name":"Merchtem"},{"@id":"http://irail.be/stations/NMBS/008812146","country":"http://sws.geonames.org/2802361/","latitude":"50.974779","longitude":"4.187319","name":"Opwijk"},{"@id":"http://irail.be/stations/NMBS/008812153","country":"http://sws.geonames.org/2802361/","latitude":"50.989593","longitude":"4.156171","name":"Heizijde"},{"@id":"http://irail.be/stations/NMBS/008812161","country":"http://sws.geonames.org/2802361/","latitude":"51.005009","longitude":"4.134372","name":"Lebbeke"},{"@id":"http://irail.be/stations/NMBS/008812211","alternative":[{"@language":"fr","@value":"Berchem-Sainte-Agathe"},{"@language":"nl","@value":"Sint-Agatha-Berchem"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.872625","longitude":"4.289895","name":"Sint-Agatha-Berchem/Berchem-Sainte-Agathe"},{"@id":"http://irail.be/stations/NMBS/008812229","alternative":[{"@language":"fr","@value":"Grand-Bigard"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.868337","longitude":"4.273543","name":"Groot-Bijgaarden"},{"@id":"http://irail.be/stations/NMBS/008812237","country":"http://sws.geonames.org/2802361/","latitude":"50.866728","longitude":"4.243393","name":"Dilbeek"},{"@id":"http://irail.be/stations/NMBS/008812245","alternative":[{"@language":"fr","@value":"Bodeghem-Saint-Martin"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.86716","longitude":"4.205081","name":"Sint-Martens-Bodegem"},{"@id":"http://irail.be/stations/NMBS/008812252","country":"http://sws.geonames.org/2802361/","latitude":"50.874522","longitude":"4.16534","name":"Ternat"},{"@id":"http://irail.be/stations/NMBS/008812260","country":"http://sws.geonames.org/2802361/","latitude":"50.882451","longitude":"4.115171","name":"Essene-Lombeek"},{"@id":"http://irail.be/stations/NMBS/008813003","alternative":[{"@language":"en","@value":"Brussels-Central"},{"@language":"fr","@value":"Bruxelles-Central"},{"@language":"nl","@value":"Brussel-Centraal"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.845658","longitude":"4.356801","name":"Brussel-Centraal/Bruxelles-Central"},{"@id":"http://irail.be/stations/NMBS/008813037","alternative":[{"@language":"en","@value":"Brussels-Chapelle/Brussels-Kapellekerk"},{"@language":"fr","@value":"Bruxelles-Chapelle"},{"@language":"nl","@value":"Brussel-Kapellekerk"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.841127","longitude":"4.347866","name":"Brussel-Kapellekerk/Bruxelles-Chapelle"},{"@id":"http://irail.be/stations/NMBS/008813045","alternative":[{"@language":"en","@value":"Brussels-Congres"},{"@language":"fr","@value":"Bruxelles-Congrès"},{"@language":"nl","@value":"Brussel-Congres"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.852067","longitude":"4.362051","name":"Brussel-Congres/Bruxelles-Congrès"},{"@id":"http://irail.be/stations/NMBS/008814001","alternative":[{"@language":"en","@value":"Brussels-South/Brussels-Midi"},{"@language":"fr","@value":"Bruxelles-Midi"},{"@language":"nl","@value":"Brussel-Zuid"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.835707","longitude":"4.336531","name":"Brussel-Zuid/Bruxelles-Midi"},{"@id":"http://irail.be/stations/NMBS/008814118","alternative":[{"@language":"fr","@value":"Forest-Est"},{"@language":"nl","@value":"Vorst-Oost"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.810195","longitude":"4.320943","name":"Vorst-Oost/Forest-Est"},{"@id":"http://irail.be/stations/NMBS/008814126","alternative":[{"@language":"fr","@value":"Uccle-Stalle"},{"@language":"nl","@value":"Ukkel-Stalle"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.802411","longitude":"4.323901","name":"Ukkel-Stalle/Uccle-Stalle"},{"@id":"http://irail.be/stations/NMBS/008814134","alternative":[{"@language":"fr","@value":"Uccle-Calevoet"},{"@language":"nl","@value":"Ukkel-Kalevoet"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.791749","longitude":"4.332207","name":"Ukkel-Kalevoet/Uccle-Calevoet"},{"@id":"http://irail.be/stations/NMBS/008814142","country":"http://sws.geonames.org/2802361/","latitude":"50.773681","longitude":"4.339434","name":"Linkebeek"},{"@id":"http://irail.be/stations/NMBS/008814159","country":"http://sws.geonames.org/2802361/","latitude":"50.767631","longitude":"4.353952","name":"Holleken"},{"@id":"http://irail.be/stations/NMBS/008814167","alternative":[{"@language":"fr","@value":"Rhode-Saint-Genèse"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.74781","longitude":"4.361997","name":"Sint-Genesius-Rode"},{"@id":"http://irail.be/stations/NMBS/008814175","country":"http://sws.geonames.org/2802361/","latitude":"50.738812","longitude":"4.370717","name":"De Hoek"},{"@id":"http://irail.be/stations/NMBS/008814209","alternative":[{"@language":"nl","@value":"Nijvel"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.599641","longitude":"4.335065","name":"Nivelles"},{"@id":"http://irail.be/stations/NMBS/008814241","country":"http://sws.geonames.org/2802361/","latitude":"50.645423","longitude":"4.365368","name":"Lillois"},{"@id":"http://irail.be/stations/NMBS/008814258","alternative":[{"@language":"nl","@value":"Eigenbrakel"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.684778","longitude":"4.375526","name":"Braine-l'Alleud"},{"@id":"http://irail.be/stations/NMBS/008814266","country":"http://sws.geonames.org/2802361/","latitude":"50.715422","longitude":"4.383481","name":"Waterloo"},{"@id":"http://irail.be/stations/NMBS/008814308","alternative":[{"@language":"fr","@value":"Hal"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.733931","longitude":"4.240634","name":"Halle"},{"@id":"http://irail.be/stations/NMBS/008814332","country":"http://sws.geonames.org/2802361/","latitude":"50.715107","longitude":"4.221577","name":"Lembeek"},{"@id":"http://irail.be/stations/NMBS/008814340","country":"http://sws.geonames.org/2802361/","latitude":"50.751577","longitude":"4.258558","name":"Buizingen"},{"@id":"http://irail.be/stations/NMBS/008814357","country":"http://sws.geonames.org/2802361/","latitude":"50.766364","longitude":"4.273696","name":"Lot"},{"@id":"http://irail.be/stations/NMBS/008814365","country":"http://sws.geonames.org/2802361/","latitude":"50.79183","longitude":"4.295333","name":"Ruisbroek"},{"@id":"http://irail.be/stations/NMBS/008814373","alternative":[{"@language":"fr","@value":"Forest-Midi"},{"@language":"nl","@value":"Vorst-Zuid"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.809215","longitude":"4.309167","name":"Vorst-Zuid/Forest-Midi"},{"@id":"http://irail.be/stations/NMBS/008814415","country":"http://sws.geonames.org/2802361/","latitude":"50.7519","longitude":"4.266487","name":"Huizingen"},{"@id":"http://irail.be/stations/NMBS/008814423","country":"http://sws.geonames.org/2802361/","latitude":"50.766616","longitude":"4.302605","name":"Beersel"},{"@id":"http://irail.be/stations/NMBS/008814431","country":"http://sws.geonames.org/2802361/","latitude":"50.77832","longitude":"4.330733","name":"Moensberg"},{"@id":"http://irail.be/stations/NMBS/008814449","alternative":[{"@language":"fr","@value":"Saint-Job"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.79441","longitude":"4.362761","name":"Sint-Job"},{"@id":"http://irail.be/stations/NMBS/008814456","alternative":[{"@language":"fr","@value":"Boondael"},{"@language":"nl","@value":"Boondaal"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.801665","longitude":"4.393387","name":"Boondaal/Boondael"},{"@id":"http://irail.be/stations/NMBS/008814464","alternative":[{"@language":"fr","@value":"Vivier d'Oie"},{"@language":"nl","@value":"Diesdelle"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.796145","longitude":"4.374052","name":"Diesdelle/Vivier d'Oie"},{"@id":"http://irail.be/stations/NMBS/008815040","alternative":[{"@language":"en","@value":"Brussels-West"},{"@language":"fr","@value":"Bruxelles-Ouest"},{"@language":"nl","@value":"Brussel-West"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.848552","longitude":"4.321042","name":"Brussel-West/Bruxelles-Ouest"},{"@id":"http://irail.be/stations/NMBS/008819406","alternative":[{"@language":"en","@value":"Brussels-Airport"},{"@language":"fr","@value":"Bruxelles-Nat-Aéroport"},{"@language":"nl","@value":"Brussel-Nat-Luchthaven"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.896456","longitude":"4.482075","name":"Brussel-Nat-Luchthaven/Bruxelles-Nat-Aéroport"},{"@id":"http://irail.be/stations/NMBS/008821006","alternative":[{"@language":"en","@value":"Antwerp-Central"},{"@language":"fr","@value":"Anvers-Central"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.2172","longitude":"4.421101","name":"Antwerpen-Centraal"},{"@id":"http://irail.be/stations/NMBS/008821022","alternative":[{"@language":"en","@value":"Antwerp-East"},{"@language":"fr","@value":"Anvers-Est"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.207357","longitude":"4.436392","name":"Antwerpen-Oost"},{"@id":"http://irail.be/stations/NMBS/008821048","alternative":[{"@language":"en","@value":"Antwerp-Haven"},{"@language":"fr","@value":"Anvers-Haven"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.289968","longitude":"4.379086","name":"Antwerpen-Haven"},{"@id":"http://irail.be/stations/NMBS/008821063","alternative":[{"@language":"en","@value":"Antwerp-Luchtbal"},{"@language":"fr","@value":"Anvers-Luchtbal"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.244132","longitude":"4.425029","name":"Antwerpen-Luchtbal"},{"@id":"http://irail.be/stations/NMBS/008821071","country":"http://sws.geonames.org/2802361/","latitude":"51.281626","longitude":"4.434154","name":"Ekeren"},{"@id":"http://irail.be/stations/NMBS/008821089","alternative":[{"@language":"en","@value":"Antwerp-Noorderdokken"},{"@language":"fr","@value":"Anvers-Noorderdokken"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.261643","longitude":"4.427906","name":"Antwerpen-Noorderdokken"},{"@id":"http://irail.be/stations/NMBS/008821105","country":"http://sws.geonames.org/2802361/","latitude":"51.356838","longitude":"4.632204","name":"Noorderkempen"},{"@id":"http://irail.be/stations/NMBS/008821121","alternative":[{"@language":"en","@value":"Antwerp-Berchem"},{"@language":"fr","@value":"Anvers-Berchem"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.19923","longitude":"4.432221","name":"Antwerpen-Berchem"},{"@id":"http://irail.be/stations/NMBS/008821147","country":"http://sws.geonames.org/2802361/","latitude":"51.18296","longitude":"4.448437","name":"Mortsel"},{"@id":"http://irail.be/stations/NMBS/008821154","country":"http://sws.geonames.org/2802361/","latitude":"51.183023","longitude":"4.446514","name":"Mortsel-Deurnesteenweg"},{"@id":"http://irail.be/stations/NMBS/008821196","alternative":[{"@language":"en","@value":"Antwerp-South"},{"@language":"fr","@value":"Anvers-Sud"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.197828","longitude":"4.390259","name":"Antwerpen-Zuid"},{"@id":"http://irail.be/stations/NMBS/008821238","country":"http://sws.geonames.org/2802361/","latitude":"51.171256","longitude":"4.455737","name":"Mortsel-Oude God"},{"@id":"http://irail.be/stations/NMBS/008821246","country":"http://sws.geonames.org/2802361/","latitude":"51.169027","longitude":"4.468843","name":"Mortsel-Liersesteenweg"},{"@id":"http://irail.be/stations/NMBS/008821311","country":"http://sws.geonames.org/2802361/","latitude":"51.134023","longitude":"4.476358","name":"Kontich"},{"@id":"http://irail.be/stations/NMBS/008821337","country":"http://sws.geonames.org/2802361/","latitude":"51.154114","longitude":"4.465157","name":"Hove"},{"@id":"http://irail.be/stations/NMBS/008821402","country":"http://sws.geonames.org/2802361/","latitude":"51.462767","longitude":"4.451314","name":"Essen"},{"@id":"http://irail.be/stations/NMBS/008821436","country":"http://sws.geonames.org/2802361/","latitude":"51.428087","longitude":"4.46335","name":"Wildert"},{"@id":"http://irail.be/stations/NMBS/008821444","country":"http://sws.geonames.org/2802361/","latitude":"51.391177","longitude":"4.46682","name":"Kalmthout"},{"@id":"http://irail.be/stations/NMBS/008821451","country":"http://sws.geonames.org/2802361/","latitude":"51.378664","longitude":"4.467315","name":"Kijkuit"},{"@id":"http://irail.be/stations/NMBS/008821519","country":"http://sws.geonames.org/2802361/","latitude":"51.364623","longitude":"4.460483","name":"Heide"},{"@id":"http://irail.be/stations/NMBS/008821535","country":"http://sws.geonames.org/2802361/","latitude":"51.313528","longitude":"4.432661","name":"Kapellen"},{"@id":"http://irail.be/stations/NMBS/008821543","country":"http://sws.geonames.org/2802361/","latitude":"51.291658","longitude":"4.4349","name":"Sint-Mariaburg"},{"@id":"http://irail.be/stations/NMBS/008821600","alternative":[{"@language":"fr","@value":"Lierre"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.135758","longitude":"4.560614","name":"Lier"},{"@id":"http://irail.be/stations/NMBS/008821634","country":"http://sws.geonames.org/2802361/","latitude":"51.16348","longitude":"4.494489","name":"Boechout"},{"@id":"http://irail.be/stations/NMBS/008821659","country":"http://sws.geonames.org/2802361/","latitude":"51.151057","longitude":"4.618459","name":"Kessel"},{"@id":"http://irail.be/stations/NMBS/008821667","country":"http://sws.geonames.org/2802361/","latitude":"51.15984","longitude":"4.666588","name":"Nijlen"},{"@id":"http://irail.be/stations/NMBS/008821709","country":"http://sws.geonames.org/2802361/","latitude":"51.168361","longitude":"4.786144","name":"Wolfstee"},{"@id":"http://irail.be/stations/NMBS/008821717","country":"http://sws.geonames.org/2802361/","latitude":"51.181513","longitude":"4.829535","name":"Herentals"},{"@id":"http://irail.be/stations/NMBS/008821725","country":"http://sws.geonames.org/2802361/","latitude":"51.165764","longitude":"4.746511","name":"Bouwel"},{"@id":"http://irail.be/stations/NMBS/008821816","country":"http://sws.geonames.org/2802361/","latitude":"51.113662","longitude":"4.638811","name":"Berlaar"},{"@id":"http://irail.be/stations/NMBS/008821824","country":"http://sws.geonames.org/2802361/","latitude":"51.094938","longitude":"4.671532","name":"Melkouwen"},{"@id":"http://irail.be/stations/NMBS/008821832","country":"http://sws.geonames.org/2802361/","latitude":"51.074146","longitude":"4.708235","name":"Heist-op-den-Berg"},{"@id":"http://irail.be/stations/NMBS/008821857","country":"http://sws.geonames.org/2802361/","latitude":"51.037344","longitude":"4.773478","name":"Booischot"},{"@id":"http://irail.be/stations/NMBS/008821865","country":"http://sws.geonames.org/2802361/","latitude":"51.021972","longitude":"4.800338","name":"Begijnendijk"},{"@id":"http://irail.be/stations/NMBS/008821907","country":"http://sws.geonames.org/2802361/","latitude":"51.322032","longitude":"4.937415","name":"Turnhout"},{"@id":"http://irail.be/stations/NMBS/008821964","country":"http://sws.geonames.org/2802361/","latitude":"51.241021","longitude":"4.893089","name":"Tielen"},{"@id":"http://irail.be/stations/NMBS/008822004","alternative":[{"@language":"fr","@value":"Malines"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.017648","longitude":"4.482785","name":"Mechelen"},{"@id":"http://irail.be/stations/NMBS/008822053","country":"http://sws.geonames.org/2802361/","latitude":"51.010843","longitude":"4.359121","name":"Kapelle-op-den-Bos"},{"@id":"http://irail.be/stations/NMBS/008822111","country":"http://sws.geonames.org/2802361/","latitude":"51.009091","longitude":"4.299073","name":"Londerzeel"},{"@id":"http://irail.be/stations/NMBS/008822137","country":"http://sws.geonames.org/2802361/","latitude":"51.014484","longitude":"4.22911","name":"Malderen"},{"@id":"http://irail.be/stations/NMBS/008822145","country":"http://sws.geonames.org/2802361/","latitude":"51.016291","longitude":"4.201666","name":"Buggenhout"},{"@id":"http://irail.be/stations/NMBS/008822160","alternative":[{"@language":"fr","@value":"Baesrode-Sud"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.019437","longitude":"4.153492","name":"Baasrode-Zuid"},{"@id":"http://irail.be/stations/NMBS/008822210","country":"http://sws.geonames.org/2802361/","latitude":"51.091243","longitude":"4.493186","name":"Duffel"},{"@id":"http://irail.be/stations/NMBS/008822228","alternative":[{"@language":"fr","@value":"Wavre-Sainte-Catherine"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.069975","longitude":"4.496116","name":"Sint-Katelijne-Waver"},{"@id":"http://irail.be/stations/NMBS/008822251","country":"http://sws.geonames.org/2802361/","latitude":"50.977449","longitude":"4.470937","name":"Weerde"},{"@id":"http://irail.be/stations/NMBS/008822269","country":"http://sws.geonames.org/2802361/","latitude":"50.9584","longitude":"4.45749","name":"Eppegem"},{"@id":"http://irail.be/stations/NMBS/008822277","country":"http://sws.geonames.org/2802361/","latitude":"50.988658","longitude":"4.498336","name":"Hofstade"},{"@id":"http://irail.be/stations/NMBS/008822343","alternative":[{"@language":"fr","@value":"Malines-Nekkerspoel"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.029883","longitude":"4.489914","name":"Mechelen-Nekkerspoel"},{"@id":"http://irail.be/stations/NMBS/008822426","country":"http://sws.geonames.org/2802361/","latitude":"51.008201","longitude":"4.513843","name":"Muizen"},{"@id":"http://irail.be/stations/NMBS/008822459","country":"http://sws.geonames.org/2802361/","latitude":"50.997791","longitude":"4.537637","name":"Hever"},{"@id":"http://irail.be/stations/NMBS/008822475","country":"http://sws.geonames.org/2802361/","latitude":"50.981853","longitude":"4.5739","name":"Boortmeerbeek"},{"@id":"http://irail.be/stations/NMBS/008822517","country":"http://sws.geonames.org/2802361/","latitude":"50.966428","longitude":"4.613309","name":"Haacht"},{"@id":"http://irail.be/stations/NMBS/008822525","country":"http://sws.geonames.org/2802361/","latitude":"50.958544","longitude":"4.638011","name":"Wespelaar-Tildonk"},{"@id":"http://irail.be/stations/NMBS/008822533","country":"http://sws.geonames.org/2802361/","latitude":"50.944251","longitude":"4.66301","name":"Hambos"},{"@id":"http://irail.be/stations/NMBS/008822608","country":"http://sws.geonames.org/2802361/","latitude":"51.066343","longitude":"4.356019","name":"Willebroek"},{"@id":"http://irail.be/stations/NMBS/008822715","country":"http://sws.geonames.org/2802361/","latitude":"51.07722","longitude":"4.282703","name":"Puurs"},{"@id":"http://irail.be/stations/NMBS/008822772","country":"http://sws.geonames.org/2802361/","latitude":"51.099225","longitude":"4.240526","name":"Bornem"},{"@id":"http://irail.be/stations/NMBS/008822814","country":"http://sws.geonames.org/2802361/","latitude":"51.090713","longitude":"4.360694","name":"Boom"},{"@id":"http://irail.be/stations/NMBS/008822848","country":"http://sws.geonames.org/2802361/","latitude":"51.081022","longitude":"4.324998","name":"Ruisbroek-Sauvegarde"},{"@id":"http://irail.be/stations/NMBS/008824158","country":"http://sws.geonames.org/2802361/","latitude":"51.182699","longitude":"4.347785","name":"Hoboken-Polder"},{"@id":"http://irail.be/stations/NMBS/008824224","country":"http://sws.geonames.org/2802361/","latitude":"51.136243","longitude":"4.338293","name":"Hemiksem"},{"@id":"http://irail.be/stations/NMBS/008824232","country":"http://sws.geonames.org/2802361/","latitude":"51.12551","longitude":"4.340261","name":"Schelle"},{"@id":"http://irail.be/stations/NMBS/008824240","country":"http://sws.geonames.org/2802361/","latitude":"51.111595","longitude":"4.338589","name":"Niel"},{"@id":"http://irail.be/stations/NMBS/008831005","country":"http://sws.geonames.org/2802361/","latitude":"50.930822","longitude":"5.327627","name":"Hasselt"},{"@id":"http://irail.be/stations/NMBS/008831039","country":"http://sws.geonames.org/2802361/","latitude":"50.886837","longitude":"5.292866","name":"Alken"},{"@id":"http://irail.be/stations/NMBS/008831088","country":"http://sws.geonames.org/2802361/","latitude":"50.963758","longitude":"5.187405","name":"Schulen"},{"@id":"http://irail.be/stations/NMBS/008831112","country":"http://sws.geonames.org/2802361/","latitude":"50.910452","longitude":"5.419947","name":"Diepenbeek"},{"@id":"http://irail.be/stations/NMBS/008831138","country":"http://sws.geonames.org/2802361/","latitude":"50.868643","longitude":"5.50938","name":"Bilzen"},{"@id":"http://irail.be/stations/NMBS/008831310","alternative":[{"@language":"fr","@value":"Tongres"},{"@language":"de","@value":"Tongern"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.784405","longitude":"5.47328","name":"Tongeren"},{"@id":"http://irail.be/stations/NMBS/008831401","country":"http://sws.geonames.org/2802361/","latitude":"50.993341","longitude":"5.050031","name":"Diest"},{"@id":"http://irail.be/stations/NMBS/008831765","country":"http://sws.geonames.org/2802361/","latitude":"50.967057","longitude":"5.497685","name":"Genk"},{"@id":"http://irail.be/stations/NMBS/008831781","country":"http://sws.geonames.org/2802361/","latitude":"50.955812","longitude":"5.408386","name":"Bokrijk"},{"@id":"http://irail.be/stations/NMBS/008831807","alternative":[{"@language":"fr","@value":"Saint-Trond"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.81762","longitude":"5.176654","name":"Sint-Truiden"},{"@id":"http://irail.be/stations/NMBS/008832003","alternative":[{"@language":"fr","@value":"Bourg-Léopold"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.117312","longitude":"5.257287","name":"Leopoldsburg"},{"@id":"http://irail.be/stations/NMBS/008832045","alternative":[{"@language":"fr","@value":"Baelen"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.169099","longitude":"5.164986","name":"Balen"},{"@id":"http://irail.be/stations/NMBS/008832227","country":"http://sws.geonames.org/2802361/","latitude":"51.087719","longitude":"5.234373","name":"Beverlo"},{"@id":"http://irail.be/stations/NMBS/008832235","country":"http://sws.geonames.org/2802361/","latitude":"51.050603","longitude":"5.235892","name":"Beringen"},{"@id":"http://irail.be/stations/NMBS/008832243","country":"http://sws.geonames.org/2802361/","latitude":"51.038207","longitude":"5.281782","name":"Heusden"},{"@id":"http://irail.be/stations/NMBS/008832250","country":"http://sws.geonames.org/2802361/","latitude":"51.033548","longitude":"5.3299","name":"Zolder"},{"@id":"http://irail.be/stations/NMBS/008832334","country":"http://sws.geonames.org/2802361/","latitude":"50.989557","longitude":"5.348815","name":"Zonhoven"},{"@id":"http://irail.be/stations/NMBS/008832375","country":"http://sws.geonames.org/2802361/","latitude":"50.954841","longitude":"5.350226","name":"Kiewit"},{"@id":"http://irail.be/stations/NMBS/008832409","country":"http://sws.geonames.org/2802361/","latitude":"51.19105","longitude":"5.116336","name":"Mol"},{"@id":"http://irail.be/stations/NMBS/008832433","country":"http://sws.geonames.org/2802361/","latitude":"51.168955","longitude":"4.988608","name":"Geel"},{"@id":"http://irail.be/stations/NMBS/008832458","country":"http://sws.geonames.org/2802361/","latitude":"51.188057","longitude":"4.847585","name":"Olen"},{"@id":"http://irail.be/stations/NMBS/008832565","country":"http://sws.geonames.org/2802361/","latitude":"51.211564","longitude":"5.312031","name":"Lommel"},{"@id":"http://irail.be/stations/NMBS/008832573","country":"http://sws.geonames.org/2802361/","latitude":"51.215618","longitude":"5.422751","name":"Overpelt"},{"@id":"http://irail.be/stations/NMBS/008832615","country":"http://sws.geonames.org/2802361/","latitude":"51.222369","longitude":"5.43717","name":"Neerpelt"},{"@id":"http://irail.be/stations/NMBS/008832664","country":"http://sws.geonames.org/2802361/","latitude":"51.246424","longitude":"5.543279","name":"Hamont"},{"@id":"http://irail.be/stations/NMBS/008833001","alternative":[{"@language":"fr","@value":"Louvain"},{"@language":"de","@value":"Löwen"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.88228","longitude":"4.715866","name":"Leuven"},{"@id":"http://irail.be/stations/NMBS/008833050","country":"http://sws.geonames.org/2802361/","latitude":"50.836282","longitude":"4.835522","name":"Vertrijk"},{"@id":"http://irail.be/stations/NMBS/008833126","country":"http://sws.geonames.org/2802361/","latitude":"50.86253","longitude":"4.6952","name":"Heverlee"},{"@id":"http://irail.be/stations/NMBS/008833134","country":"http://sws.geonames.org/2802361/","latitude":"50.835931","longitude":"4.653311","name":"Oud-Heverlee"},{"@id":"http://irail.be/stations/NMBS/008833159","country":"http://sws.geonames.org/2802361/","latitude":"50.800631","longitude":"4.651728","name":"Sint-Joris-Weert"},{"@id":"http://irail.be/stations/NMBS/008833175","country":"http://sws.geonames.org/2802361/","latitude":"50.92274","longitude":"4.701475","name":"Wijgmaal"},{"@id":"http://irail.be/stations/NMBS/008833209","country":"http://sws.geonames.org/2802361/","latitude":"50.984406","longitude":"4.824043","name":"Aarschot"},{"@id":"http://irail.be/stations/NMBS/008833233","country":"http://sws.geonames.org/2802361/","latitude":"50.956261","longitude":"4.747679","name":"Wezemaal"},{"@id":"http://irail.be/stations/NMBS/008833258","country":"http://sws.geonames.org/2802361/","latitude":"51.002466","longitude":"4.863541","name":"Langdorp"},{"@id":"http://irail.be/stations/NMBS/008833266","country":"http://sws.geonames.org/2802361/","latitude":"51.009864","longitude":"4.945829","name":"Testelt"},{"@id":"http://irail.be/stations/NMBS/008833274","country":"http://sws.geonames.org/2802361/","latitude":"51.00669","longitude":"4.987359","name":"Zichem"},{"@id":"http://irail.be/stations/NMBS/008833308","alternative":[{"@language":"fr","@value":"Tirlemont"},{"@language":"de","@value":"Thienen"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.80802","longitude":"4.92581","name":"Tienen"},{"@id":"http://irail.be/stations/NMBS/008833449","country":"http://sws.geonames.org/2802361/","latitude":"50.772126","longitude":"4.994217","name":"Ezemaal"},{"@id":"http://irail.be/stations/NMBS/008833605","country":"http://sws.geonames.org/2802361/","latitude":"50.747927","longitude":"5.07966","name":"Landen"},{"@id":"http://irail.be/stations/NMBS/008833670","country":"http://sws.geonames.org/2802361/","latitude":"50.763964","longitude":"5.036323","name":"Neerwinden"},{"@id":"http://irail.be/stations/NMBS/008841004","alternative":[{"@language":"nl","@value":"Luik-Guillemins"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.62455","longitude":"5.566695","name":"Liège-Guillemins"},{"@id":"http://irail.be/stations/NMBS/008841202","country":"http://sws.geonames.org/2802361/","latitude":"50.661208","longitude":"5.509704","name":"Ans"},{"@id":"http://irail.be/stations/NMBS/008841319","country":"http://sws.geonames.org/2802361/","latitude":"50.65861","longitude":"5.460551","name":"Bierset-Awans"},{"@id":"http://irail.be/stations/NMBS/008841327","country":"http://sws.geonames.org/2802361/","latitude":"50.66181","longitude":"5.429556","name":"Voroux"},{"@id":"http://irail.be/stations/NMBS/008841400","alternative":[{"@language":"nl","@value":"Borgworm"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.694549","longitude":"5.249475","name":"Waremme"},{"@id":"http://irail.be/stations/NMBS/008841434","country":"http://sws.geonames.org/2802361/","latitude":"50.685065","longitude":"5.286394","name":"Bleret"},{"@id":"http://irail.be/stations/NMBS/008841442","country":"http://sws.geonames.org/2802361/","latitude":"50.678611","longitude":"5.321407","name":"Remicourt"},{"@id":"http://irail.be/stations/NMBS/008841459","country":"http://sws.geonames.org/2802361/","latitude":"50.66991","longitude":"5.367602","name":"Momalle"},{"@id":"http://irail.be/stations/NMBS/008841467","country":"http://sws.geonames.org/2802361/","latitude":"50.664049","longitude":"5.398453","name":"Fexhe-le-Haut-Clocher"},{"@id":"http://irail.be/stations/NMBS/008841525","alternative":[{"@language":"nl","@value":"Luik-Paleis"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.646349","longitude":"5.570453","name":"Liège-Palais"},{"@id":"http://irail.be/stations/NMBS/008841558","alternative":[{"@language":"nl","@value":"Luik-Jonfosse"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.640299","longitude":"5.561131","name":"Liège-Jonfosse"},{"@id":"http://irail.be/stations/NMBS/008841608","country":"http://sws.geonames.org/2802361/","latitude":"50.660911","longitude":"5.622761","name":"Herstal"},{"@id":"http://irail.be/stations/NMBS/008841665","country":"http://sws.geonames.org/2802361/","latitude":"50.692455","longitude":"5.60009","name":"Milmort"},{"@id":"http://irail.be/stations/NMBS/008841673","country":"http://sws.geonames.org/2802361/","latitude":"50.698181","longitude":"5.56683","name":"Liers"},{"@id":"http://irail.be/stations/NMBS/008841731","alternative":[{"@language":"nl","@value":"Glaaien"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.750426","longitude":"5.535431","name":"Glons"},{"@id":"http://irail.be/stations/NMBS/008842002","country":"http://sws.geonames.org/2802361/","latitude":"50.613152","longitude":"5.599695","name":"Angleur"},{"@id":"http://irail.be/stations/NMBS/008842036","country":"http://sws.geonames.org/2802361/","latitude":"50.608019","longitude":"5.616073","name":"Chênée"},{"@id":"http://irail.be/stations/NMBS/008842630","country":"http://sws.geonames.org/2802361/","latitude":"50.570624","longitude":"5.583937","name":"Tilff"},{"@id":"http://irail.be/stations/NMBS/008842648","country":"http://sws.geonames.org/2802361/","latitude":"50.54762","longitude":"5.587236","name":"Méry"},{"@id":"http://irail.be/stations/NMBS/008842655","country":"http://sws.geonames.org/2802361/","latitude":"50.539917","longitude":"5.573563","name":"Hony"},{"@id":"http://irail.be/stations/NMBS/008842663","country":"http://sws.geonames.org/2802361/","latitude":"50.530568","longitude":"5.572565","name":"Esneux"},{"@id":"http://irail.be/stations/NMBS/008842689","country":"http://sws.geonames.org/2802361/","latitude":"50.509209","longitude":"5.578858","name":"Poulseur"},{"@id":"http://irail.be/stations/NMBS/008842705","country":"http://sws.geonames.org/2802361/","latitude":"50.483285","longitude":"5.587631","name":"Rivage"},{"@id":"http://irail.be/stations/NMBS/008842754","country":"http://sws.geonames.org/2802361/","latitude":"50.472938","longitude":"5.672499","name":"Aywaille"},{"@id":"http://irail.be/stations/NMBS/008842838","country":"http://sws.geonames.org/2802361/","latitude":"50.456865","longitude":"5.566956","name":"Comblain-la-Tour"},{"@id":"http://irail.be/stations/NMBS/008842846","country":"http://sws.geonames.org/2802361/","latitude":"50.428181","longitude":"5.533561","name":"Hamoir"},{"@id":"http://irail.be/stations/NMBS/008842853","country":"http://sws.geonames.org/2802361/","latitude":"50.403254","longitude":"5.523565","name":"Sy"},{"@id":"http://irail.be/stations/NMBS/008843133","country":"http://sws.geonames.org/2802361/","latitude":"50.609844","longitude":"5.558911","name":"Sclessin"},{"@id":"http://irail.be/stations/NMBS/008843141","country":"http://sws.geonames.org/2802361/","latitude":"50.619651","longitude":"5.510162","name":"Pont-de-Seraing"},{"@id":"http://irail.be/stations/NMBS/008843158","country":"http://sws.geonames.org/2802361/","latitude":"50.618446","longitude":"5.497874","name":"Jemeppe-sur-Meuse"},{"@id":"http://irail.be/stations/NMBS/008843166","country":"http://sws.geonames.org/2802361/","latitude":"50.605349","longitude":"5.480983","name":"Flemalle-Grande"},{"@id":"http://irail.be/stations/NMBS/008843208","country":"http://sws.geonames.org/2802361/","latitude":"50.595308","longitude":"5.457656","name":"Flemalle-Haute"},{"@id":"http://irail.be/stations/NMBS/008843224","country":"http://sws.geonames.org/2802361/","latitude":"50.600396","longitude":"5.468309","name":"Leman"},{"@id":"http://irail.be/stations/NMBS/008843240","country":"http://sws.geonames.org/2802361/","latitude":"50.582957","longitude":"5.401986","name":"Engis"},{"@id":"http://irail.be/stations/NMBS/008843307","alternative":[{"@language":"nl","@value":"Hoei"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.527242","longitude":"5.234211","name":"Huy"},{"@id":"http://irail.be/stations/NMBS/008843323","country":"http://sws.geonames.org/2802361/","latitude":"50.539215","longitude":"5.289729","name":"Ampsin"},{"@id":"http://irail.be/stations/NMBS/008843331","country":"http://sws.geonames.org/2802361/","latitude":"50.546011","longitude":"5.32049","name":"Amay"},{"@id":"http://irail.be/stations/NMBS/008843349","country":"http://sws.geonames.org/2802361/","latitude":"50.55349","longitude":"5.330333","name":"Haute-Flône"},{"@id":"http://irail.be/stations/NMBS/008843406","country":"http://sws.geonames.org/2802361/","latitude":"50.528276","longitude":"5.219676","name":"Statte"},{"@id":"http://irail.be/stations/NMBS/008843430","country":"http://sws.geonames.org/2802361/","latitude":"50.52263","longitude":"5.190937","name":"Bas-Oha"},{"@id":"http://irail.be/stations/NMBS/008843901","country":"http://sws.geonames.org/2802361/","latitude":"50.643967","longitude":"5.611057","name":"Bressoux"},{"@id":"http://irail.be/stations/NMBS/008844008","alternative":[{"@language":"nl","@value":"Verviers-Centraal"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.588135","longitude":"5.854917","name":"Verviers-Central"},{"@id":"http://irail.be/stations/NMBS/008844057","alternative":[{"@language":"nl","@value":"Verviers-Paleis"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.590921","longitude":"5.865335","name":"Verviers-Palais"},{"@id":"http://irail.be/stations/NMBS/008844206","country":"http://sws.geonames.org/2802361/","latitude":"50.568179","longitude":"5.80615","name":"Pepinster"},{"@id":"http://irail.be/stations/NMBS/008844230","country":"http://sws.geonames.org/2802361/","latitude":"50.572089","longitude":"5.741581","name":"Nessonvaux"},{"@id":"http://irail.be/stations/NMBS/008844255","country":"http://sws.geonames.org/2802361/","latitude":"50.565059","longitude":"5.723665","name":"Fraipont"},{"@id":"http://irail.be/stations/NMBS/008844271","country":"http://sws.geonames.org/2802361/","latitude":"50.573213","longitude":"5.688346","name":"Trooz"},{"@id":"http://irail.be/stations/NMBS/008844313","country":"http://sws.geonames.org/2802361/","latitude":"50.563405","longitude":"5.804397","name":"Pepinster-Cité"},{"@id":"http://irail.be/stations/NMBS/008844321","country":"http://sws.geonames.org/2802361/","latitude":"50.544717","longitude":"5.809935","name":"Juslenville"},{"@id":"http://irail.be/stations/NMBS/008844339","country":"http://sws.geonames.org/2802361/","latitude":"50.536159","longitude":"5.815031","name":"Theux"},{"@id":"http://irail.be/stations/NMBS/008844347","country":"http://sws.geonames.org/2802361/","latitude":"50.525723","longitude":"5.822223","name":"Franchimont"},{"@id":"http://irail.be/stations/NMBS/008844404","country":"http://sws.geonames.org/2802361/","latitude":"50.490305","longitude":"5.855096","name":"Spa"},{"@id":"http://irail.be/stations/NMBS/008844420","country":"http://sws.geonames.org/2802361/","latitude":"50.489307","longitude":"5.866207","name":"Spa-Géronstère"},{"@id":"http://irail.be/stations/NMBS/008844503","country":"http://sws.geonames.org/2802361/","latitude":"50.659707","longitude":"5.975381","name":"Welkenraedt"},{"@id":"http://irail.be/stations/NMBS/008844545","country":"http://sws.geonames.org/2802361/","latitude":"50.616244","longitude":"5.936494","name":"Dolhain-Gileppe"},{"@id":"http://irail.be/stations/NMBS/008844628","country":"http://sws.geonames.org/2802361/","latitude":"50.635157","longitude":"6.03711","name":"Eupen"},{"@id":"http://irail.be/stations/NMBS/008844644","country":"http://sws.geonames.org/2802361/","latitude":"50.718209","longitude":"6.041335","name":"Hergenrath"},{"@id":"http://irail.be/stations/NMBS/008845005","country":"http://sws.geonames.org/2802361/","latitude":"50.189409","longitude":"5.953906","name":"Gouvy"},{"@id":"http://irail.be/stations/NMBS/008845146","country":"http://sws.geonames.org/2802361/","latitude":"50.278933","longitude":"5.909211","name":"Vielsalm"},{"@id":"http://irail.be/stations/NMBS/008845203","country":"http://sws.geonames.org/2802361/","latitude":"50.368214","longitude":"5.873578","name":"Trois-Ponts"},{"@id":"http://irail.be/stations/NMBS/008845229","country":"http://sws.geonames.org/2802361/","latitude":"50.391127","longitude":"5.880473","name":"Coo"},{"@id":"http://irail.be/stations/NMBS/008846201","alternative":[{"@language":"nl","@value":"Wezet"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.73776","longitude":"5.692544","name":"Visé"},{"@id":"http://irail.be/stations/NMBS/008861119","country":"http://sws.geonames.org/2802361/","latitude":"50.457737","longitude":"4.82842","name":"Ronet"},{"@id":"http://irail.be/stations/NMBS/008861127","country":"http://sws.geonames.org/2802361/","latitude":"50.456236","longitude":"4.806298","name":"Flawinne"},{"@id":"http://irail.be/stations/NMBS/008861135","country":"http://sws.geonames.org/2802361/","latitude":"50.443328","longitude":"4.762368","name":"Floreffe"},{"@id":"http://irail.be/stations/NMBS/008861143","country":"http://sws.geonames.org/2802361/","latitude":"50.439543","longitude":"4.733548","name":"Franière"},{"@id":"http://irail.be/stations/NMBS/008861150","country":"http://sws.geonames.org/2802361/","latitude":"50.452748","longitude":"4.693807","name":"Moustier"},{"@id":"http://irail.be/stations/NMBS/008861168","country":"http://sws.geonames.org/2802361/","latitude":"50.45255","longitude":"4.669392","name":"Ham-sur-Sambre"},{"@id":"http://irail.be/stations/NMBS/008861200","country":"http://sws.geonames.org/2802361/","latitude":"50.570489","longitude":"4.691497","name":"Gembloux"},{"@id":"http://irail.be/stations/NMBS/008861317","country":"http://sws.geonames.org/2802361/","latitude":"50.557374","longitude":"4.697627","name":"Chapelle-Dieu"},{"@id":"http://irail.be/stations/NMBS/008861333","country":"http://sws.geonames.org/2802361/","latitude":"50.513497","longitude":"4.675829","name":"Mazy"},{"@id":"http://irail.be/stations/NMBS/008861416","country":"http://sws.geonames.org/2802361/","latitude":"50.551935","longitude":"4.7201","name":"Lonzée"},{"@id":"http://irail.be/stations/NMBS/008861424","country":"http://sws.geonames.org/2802361/","latitude":"50.534208","longitude":"4.748533","name":"Beuzet"},{"@id":"http://irail.be/stations/NMBS/008861432","country":"http://sws.geonames.org/2802361/","latitude":"50.5213","longitude":"4.767788","name":"Saint-Denis-Bovesse"},{"@id":"http://irail.be/stations/NMBS/008861440","country":"http://sws.geonames.org/2802361/","latitude":"50.499348","longitude":"4.801866","name":"Rhisnes"},{"@id":"http://irail.be/stations/NMBS/008861515","country":"http://sws.geonames.org/2802361/","latitude":"50.590823","longitude":"4.668538","name":"Ernage"},{"@id":"http://irail.be/stations/NMBS/008861523","country":"http://sws.geonames.org/2802361/","latitude":"50.608819","longitude":"4.648888","name":"Chastre"},{"@id":"http://irail.be/stations/NMBS/008861531","country":"http://sws.geonames.org/2802361/","latitude":"50.619453","longitude":"4.636393","name":"Blanmont"},{"@id":"http://irail.be/stations/NMBS/008861549","country":"http://sws.geonames.org/2802361/","latitude":"50.637611","longitude":"4.613884","name":"Mont-Saint-Guibert"},{"@id":"http://irail.be/stations/NMBS/008862018","country":"http://sws.geonames.org/2802361/","latitude":"49.690939","longitude":"5.769115","name":"Stockem"},{"@id":"http://irail.be/stations/NMBS/008863008","alternative":[{"@language":"nl","@value":"Namen"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.468794","longitude":"4.86222","name":"Namur"},{"@id":"http://irail.be/stations/NMBS/008863115","country":"http://sws.geonames.org/2802361/","latitude":"50.454843","longitude":"4.876144","name":"Jambes"},{"@id":"http://irail.be/stations/NMBS/008863156","country":"http://sws.geonames.org/2802361/","latitude":"50.391559","longitude":"4.877241","name":"Lustin"},{"@id":"http://irail.be/stations/NMBS/008863354","country":"http://sws.geonames.org/2802361/","latitude":"50.454798","longitude":"4.880261","name":"Jambes-Est"},{"@id":"http://irail.be/stations/NMBS/008863362","country":"http://sws.geonames.org/2802361/","latitude":"50.429098","longitude":"4.884414","name":"Dave-Saint-Martin"},{"@id":"http://irail.be/stations/NMBS/008863404","country":"http://sws.geonames.org/2802361/","latitude":"50.496759","longitude":"5.094699","name":"Andenne"},{"@id":"http://irail.be/stations/NMBS/008863438","country":"http://sws.geonames.org/2802361/","latitude":"50.497209","longitude":"5.081745","name":"Château-de-Seilles"},{"@id":"http://irail.be/stations/NMBS/008863446","country":"http://sws.geonames.org/2802361/","latitude":"50.492247","longitude":"5.026363","name":"Sclaigneaux"},{"@id":"http://irail.be/stations/NMBS/008863453","country":"http://sws.geonames.org/2802361/","latitude":"50.47043","longitude":"4.997939","name":"Namêche"},{"@id":"http://irail.be/stations/NMBS/008863461","country":"http://sws.geonames.org/2802361/","latitude":"50.480741","longitude":"4.96458","name":"Marche-les-Dames"},{"@id":"http://irail.be/stations/NMBS/008863503","country":"http://sws.geonames.org/2802361/","latitude":"50.260721","longitude":"4.908182","name":"Dinant"},{"@id":"http://irail.be/stations/NMBS/008863545","country":"http://sws.geonames.org/2802361/","latitude":"50.32084","longitude":"4.878643","name":"Yvoir"},{"@id":"http://irail.be/stations/NMBS/008863560","country":"http://sws.geonames.org/2802361/","latitude":"50.348914","longitude":"4.86996","name":"Godinne"},{"@id":"http://irail.be/stations/NMBS/008863818","country":"http://sws.geonames.org/2802361/","latitude":"50.238023","longitude":"4.90553","name":"Anseremme"},{"@id":"http://irail.be/stations/NMBS/008863834","country":"http://sws.geonames.org/2802361/","latitude":"50.211235","longitude":"4.964607","name":"Gendron-Celles"},{"@id":"http://irail.be/stations/NMBS/008863842","country":"http://sws.geonames.org/2802361/","latitude":"50.189868","longitude":"5.006074","name":"Houyet"},{"@id":"http://irail.be/stations/NMBS/008863867","country":"http://sws.geonames.org/2802361/","latitude":"50.11443","longitude":"4.95684","name":"Beauraing"},{"@id":"http://irail.be/stations/NMBS/008864006","country":"http://sws.geonames.org/2802361/","latitude":"50.160401","longitude":"5.266698","name":"Jemelle"},{"@id":"http://irail.be/stations/NMBS/008864311","country":"http://sws.geonames.org/2802361/","latitude":"50.132759","longitude":"5.276784","name":"Forrières"},{"@id":"http://irail.be/stations/NMBS/008864337","country":"http://sws.geonames.org/2802361/","latitude":"50.0906","longitude":"5.280524","name":"Grupont"},{"@id":"http://irail.be/stations/NMBS/008864345","country":"http://sws.geonames.org/2802361/","latitude":"50.202821","longitude":"5.313892","name":"Marloie"},{"@id":"http://irail.be/stations/NMBS/008864352","country":"http://sws.geonames.org/2802361/","latitude":"50.224135","longitude":"5.301091","name":"Aye"},{"@id":"http://irail.be/stations/NMBS/008864410","country":"http://sws.geonames.org/2802361/","latitude":"50.222472","longitude":"5.346289","name":"Marche-en-Famenne"},{"@id":"http://irail.be/stations/NMBS/008864436","country":"http://sws.geonames.org/2802361/","latitude":"50.28367","longitude":"5.440136","name":"Melreux-Hotton"},{"@id":"http://irail.be/stations/NMBS/008864451","country":"http://sws.geonames.org/2802361/","latitude":"50.349417","longitude":"5.501542","name":"Barvaux"},{"@id":"http://irail.be/stations/NMBS/008864469","country":"http://sws.geonames.org/2802361/","latitude":"50.376798","longitude":"5.519304","name":"Bomal"},{"@id":"http://irail.be/stations/NMBS/008864501","country":"http://sws.geonames.org/2802361/","latitude":"50.29105","longitude":"5.091409","name":"Ciney"},{"@id":"http://irail.be/stations/NMBS/008864816","country":"http://sws.geonames.org/2802361/","latitude":"50.267768","longitude":"5.107778","name":"Leignon"},{"@id":"http://irail.be/stations/NMBS/008864824","country":"http://sws.geonames.org/2802361/","latitude":"50.262366","longitude":"5.124255","name":"Chapois"},{"@id":"http://irail.be/stations/NMBS/008864832","country":"http://sws.geonames.org/2802361/","latitude":"50.249044","longitude":"5.194371","name":"Haversin"},{"@id":"http://irail.be/stations/NMBS/008864915","country":"http://sws.geonames.org/2802361/","latitude":"50.343296","longitude":"5.06116","name":"Natoye"},{"@id":"http://irail.be/stations/NMBS/008864923","country":"http://sws.geonames.org/2802361/","latitude":"50.357786","longitude":"5.056099","name":"Florée"},{"@id":"http://irail.be/stations/NMBS/008864931","country":"http://sws.geonames.org/2802361/","latitude":"50.368133","longitude":"5.022839","name":"Assesse"},{"@id":"http://irail.be/stations/NMBS/008864949","country":"http://sws.geonames.org/2802361/","latitude":"50.387442","longitude":"4.996051","name":"Courrière"},{"@id":"http://irail.be/stations/NMBS/008864956","country":"http://sws.geonames.org/2802361/","latitude":"50.406373","longitude":"4.949739","name":"Sart-Bernard"},{"@id":"http://irail.be/stations/NMBS/008864964","country":"http://sws.geonames.org/2802361/","latitude":"50.419695","longitude":"4.929756","name":"Naninne"},{"@id":"http://irail.be/stations/NMBS/008865003","country":"http://sws.geonames.org/2802361/","latitude":"49.920434","longitude":"5.37927","name":"Libramont"},{"@id":"http://irail.be/stations/NMBS/008865110","alternative":[{"@language":"nl","@value":"Bastenaken-Zuid"}],"country":"http://sws.geonames.org/2802361/","latitude":"49.999737","longitude":"5.709858","name":"Bastogne-Sud"},{"@id":"http://irail.be/stations/NMBS/008865128","alternative":[{"@language":"nl","@value":"Bastenaken-Noord"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.006919","longitude":"5.720744","name":"Bastogne-Nord"},{"@id":"http://irail.be/stations/NMBS/008865227","country":"http://sws.geonames.org/2802361/","latitude":"50.019504","longitude":"5.292641","name":"Poix-Saint-Hubert"},{"@id":"http://irail.be/stations/NMBS/008865300","country":"http://sws.geonames.org/2802361/","latitude":"49.852835","longitude":"5.267193","name":"Bertrix"},{"@id":"http://irail.be/stations/NMBS/008865540","country":"http://sws.geonames.org/2802361/","latitude":"49.895408","longitude":"5.118349","name":"Paliseul"},{"@id":"http://irail.be/stations/NMBS/008865565","country":"http://sws.geonames.org/2802361/","latitude":"49.905458","longitude":"5.092784","name":"Carlsbourg"},{"@id":"http://irail.be/stations/NMBS/008865615","country":"http://sws.geonames.org/2802361/","latitude":"49.934134","longitude":"5.043047","name":"Graide"},{"@id":"http://irail.be/stations/NMBS/008865649","country":"http://sws.geonames.org/2802361/","latitude":"49.984123","longitude":"4.978073","name":"Gedinne"},{"@id":"http://irail.be/stations/NMBS/008866001","alternative":[{"@language":"nl","@value":"Aarlen"},{"@language":"de","@value":"Arel"}],"country":"http://sws.geonames.org/2802361/","latitude":"49.68053","longitude":"5.809971","name":"Arlon"},{"@id":"http://irail.be/stations/NMBS/008866118","country":"http://sws.geonames.org/2802361/","latitude":"49.688243","longitude":"5.786527","name":"Viville"},{"@id":"http://irail.be/stations/NMBS/008866142","country":"http://sws.geonames.org/2802361/","latitude":"49.718249","longitude":"5.632685","name":"Habay"},{"@id":"http://irail.be/stations/NMBS/008866175","country":"http://sws.geonames.org/2802361/","latitude":"49.727337","longitude":"5.539755","name":"Marbehan"},{"@id":"http://irail.be/stations/NMBS/008866258","country":"http://sws.geonames.org/2802361/","latitude":"49.854318","longitude":"5.452559","name":"Neufchâteau"},{"@id":"http://irail.be/stations/NMBS/008866407","country":"http://sws.geonames.org/2802361/","latitude":"49.560821","longitude":"5.519125","name":"Virton"},{"@id":"http://irail.be/stations/NMBS/008866530","country":"http://sws.geonames.org/2802361/","latitude":"49.5562","longitude":"5.741347","name":"Halanzy"},{"@id":"http://irail.be/stations/NMBS/008866605","alternative":[{"@language":"de","@value":"Athem"}],"country":"http://sws.geonames.org/2802361/","latitude":"49.563346","longitude":"5.828947","name":"Athus"},{"@id":"http://irail.be/stations/NMBS/008866654","country":"http://sws.geonames.org/2802361/","latitude":"49.564093","longitude":"5.79806","name":"Aubange"},{"@id":"http://irail.be/stations/NMBS/008866662","country":"http://sws.geonames.org/2802361/","latitude":"49.592777","longitude":"5.818915","name":"Messancy"},{"@id":"http://irail.be/stations/NMBS/008866845","country":"http://sws.geonames.org/2802361/","latitude":"49.706967","longitude":"5.331115","name":"Florenville"},{"@id":"http://irail.be/stations/NMBS/008871100","country":"http://sws.geonames.org/2802361/","latitude":"50.412171","longitude":"4.394223","name":"Marchienne-au-Pont"},{"@id":"http://irail.be/stations/NMBS/008871175","country":"http://sws.geonames.org/2802361/","latitude":"50.352896","longitude":"4.411294","name":"Jamioulx"},{"@id":"http://irail.be/stations/NMBS/008871183","country":"http://sws.geonames.org/2802361/","latitude":"50.333893","longitude":"4.406305","name":"Beignée"},{"@id":"http://irail.be/stations/NMBS/008871217","country":"http://sws.geonames.org/2802361/","latitude":"50.443112","longitude":"4.393199","name":"Roux"},{"@id":"http://irail.be/stations/NMBS/008871225","country":"http://sws.geonames.org/2802361/","latitude":"50.462007","longitude":"4.400534","name":"Courcelles-Motte"},{"@id":"http://irail.be/stations/NMBS/008871308","country":"http://sws.geonames.org/2802361/","latitude":"50.505856","longitude":"4.38412","name":"Luttre"},{"@id":"http://irail.be/stations/NMBS/008871332","country":"http://sws.geonames.org/2802361/","latitude":"50.535206","longitude":"4.36357","name":"Obaix-Buzet"},{"@id":"http://irail.be/stations/NMBS/008871365","country":"http://sws.geonames.org/2802361/","latitude":"50.513812","longitude":"4.355291","name":"Pont-à-Celles"},{"@id":"http://irail.be/stations/NMBS/008871373","country":"http://sws.geonames.org/2802361/","latitude":"50.497065","longitude":"4.325123","name":"Gouy-lez-Pieton"},{"@id":"http://irail.be/stations/NMBS/008871381","country":"http://sws.geonames.org/2802361/","latitude":"50.492795","longitude":"4.290308","name":"Godarville"},{"@id":"http://irail.be/stations/NMBS/008871415","country":"http://sws.geonames.org/2802361/","latitude":"50.434959","longitude":"4.288438","name":"Piéton"},{"@id":"http://irail.be/stations/NMBS/008871514","country":"http://sws.geonames.org/2802361/","latitude":"50.433314","longitude":"4.325384","name":"Forchies"},{"@id":"http://irail.be/stations/NMBS/008871605","country":"http://sws.geonames.org/2802361/","latitude":"50.304192","longitude":"4.113562","name":"Erquelinnes"},{"@id":"http://irail.be/stations/NMBS/008871647","country":"http://sws.geonames.org/2802361/","latitude":"50.310179","longitude":"4.132314","name":"Erquelinnes-Village"},{"@id":"http://irail.be/stations/NMBS/008871662","country":"http://sws.geonames.org/2802361/","latitude":"50.312642","longitude":"4.158427","name":"Solre-sur-Sambre"},{"@id":"http://irail.be/stations/NMBS/008871670","country":"http://sws.geonames.org/2802361/","latitude":"50.316328","longitude":"4.186833","name":"Labuissière"},{"@id":"http://irail.be/stations/NMBS/008871688","country":"http://sws.geonames.org/2802361/","latitude":"50.321164","longitude":"4.212785","name":"Fontaine-Valmont"},{"@id":"http://irail.be/stations/NMBS/008871712","country":"http://sws.geonames.org/2802361/","latitude":"50.346469","longitude":"4.260958","name":"Lobbes"},{"@id":"http://irail.be/stations/NMBS/008871811","country":"http://sws.geonames.org/2802361/","latitude":"50.342738","longitude":"4.288906","name":"Thuin"},{"@id":"http://irail.be/stations/NMBS/008871829","country":"http://sws.geonames.org/2802361/","latitude":"50.363692","longitude":"4.308736","name":"Hourpes"},{"@id":"http://irail.be/stations/NMBS/008871837","country":"http://sws.geonames.org/2802361/","latitude":"50.377311","longitude":"4.350976","name":"Landelies"},{"@id":"http://irail.be/stations/NMBS/008871852","country":"http://sws.geonames.org/2802361/","latitude":"50.397465","longitude":"4.388767","name":"Marchienne-Zone"},{"@id":"http://irail.be/stations/NMBS/008872009","alternative":[{"@language":"nl","@value":"Charleroi-Zuid"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.40471","longitude":"4.438567","name":"Charleroi-Sud"},{"@id":"http://irail.be/stations/NMBS/008872066","alternative":[{"@language":"nl","@value":"Charleroi-West"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.410948","longitude":"4.436653","name":"Charleroi-Ouest"},{"@id":"http://irail.be/stations/NMBS/008872306","country":"http://sws.geonames.org/2802361/","latitude":"50.432451","longitude":"4.462946","name":"Lodelinsart"},{"@id":"http://irail.be/stations/NMBS/008872413","country":"http://sws.geonames.org/2802361/","latitude":"50.481927","longitude":"4.543741","name":"Fleurus"},{"@id":"http://irail.be/stations/NMBS/008872520","country":"http://sws.geonames.org/2802361/","latitude":"50.511726","longitude":"4.566133","name":"Ligny"},{"@id":"http://irail.be/stations/NMBS/008872553","country":"http://sws.geonames.org/2802361/","latitude":"50.558084","longitude":"4.552676","name":"Tilly"},{"@id":"http://irail.be/stations/NMBS/008872579","country":"http://sws.geonames.org/2802361/","latitude":"50.578103","longitude":"4.533349","name":"Villers-la-Ville"},{"@id":"http://irail.be/stations/NMBS/008872587","country":"http://sws.geonames.org/2802361/","latitude":"50.610338","longitude":"4.539157","name":"La Roche (Brabant)"},{"@id":"http://irail.be/stations/NMBS/008872611","country":"http://sws.geonames.org/2802361/","latitude":"50.621826","longitude":"4.54926","name":"Faux"},{"@id":"http://irail.be/stations/NMBS/008873007","country":"http://sws.geonames.org/2802361/","latitude":"50.259219","longitude":"4.435879","name":"Walcourt"},{"@id":"http://irail.be/stations/NMBS/008873122","country":"http://sws.geonames.org/2802361/","latitude":"50.191639","longitude":"4.535956","name":"Philippeville"},{"@id":"http://irail.be/stations/NMBS/008873239","country":"http://sws.geonames.org/2802361/","latitude":"50.237133","longitude":"4.492709","name":"Yves-Gomezée"},{"@id":"http://irail.be/stations/NMBS/008873312","country":"http://sws.geonames.org/2802361/","latitude":"50.269278","longitude":"4.428805","name":"Pry"},{"@id":"http://irail.be/stations/NMBS/008873320","country":"http://sws.geonames.org/2802361/","latitude":"50.285603","longitude":"4.405909","name":"Berzée"},{"@id":"http://irail.be/stations/NMBS/008873379","country":"http://sws.geonames.org/2802361/","latitude":"50.300138","longitude":"4.391491","name":"Cour-sur-Heure"},{"@id":"http://irail.be/stations/NMBS/008873387","country":"http://sws.geonames.org/2802361/","latitude":"50.319555","longitude":"4.404696","name":"Ham-sur-Heure"},{"@id":"http://irail.be/stations/NMBS/008874005","country":"http://sws.geonames.org/2802361/","latitude":"50.410103","longitude":"4.521861","name":"Châtelet"},{"@id":"http://irail.be/stations/NMBS/008874054","country":"http://sws.geonames.org/2802361/","latitude":"50.392718","longitude":"4.46851","name":"Couillet"},{"@id":"http://irail.be/stations/NMBS/008874559","country":"http://sws.geonames.org/2802361/","latitude":"50.428936","longitude":"4.552586","name":"Le Campinaire"},{"@id":"http://irail.be/stations/NMBS/008874567","country":"http://sws.geonames.org/2802361/","latitude":"50.435246","longitude":"4.564138","name":"Farciennes"},{"@id":"http://irail.be/stations/NMBS/008874583","country":"http://sws.geonames.org/2802361/","latitude":"50.429529","longitude":"4.584552","name":"Aiseau"},{"@id":"http://irail.be/stations/NMBS/008874609","country":"http://sws.geonames.org/2802361/","latitude":"50.432235","longitude":"4.608823","name":"Tamines"},{"@id":"http://irail.be/stations/NMBS/008874716","country":"http://sws.geonames.org/2802361/","latitude":"50.449197","longitude":"4.630532","name":"Auvelais"},{"@id":"http://irail.be/stations/NMBS/008874724","country":"http://sws.geonames.org/2802361/","latitude":"50.45095","longitude":"4.662632","name":"Jemeppe-sur-Sambre"},{"@id":"http://irail.be/stations/NMBS/008875002","country":"http://sws.geonames.org/2802361/","latitude":"50.09549","longitude":"4.525691","name":"Mariembourg"},{"@id":"http://irail.be/stations/NMBS/008875127","country":"http://sws.geonames.org/2802361/","latitude":"50.056324","longitude":"4.491702","name":"Couvin"},{"@id":"http://irail.be/stations/NMBS/008881000","alternative":[{"@language":"nl","@value":"Bergen"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.453854","longitude":"3.942542","name":"Mons"},{"@id":"http://irail.be/stations/NMBS/008881125","country":"http://sws.geonames.org/2802361/","latitude":"50.487411","longitude":"3.906343","name":"Ghlin"},{"@id":"http://irail.be/stations/NMBS/008881158","country":"http://sws.geonames.org/2802361/","latitude":"50.507025","longitude":"3.887987","name":"Erbisœul"},{"@id":"http://irail.be/stations/NMBS/008881166","alternative":[{"@language":"fr","@value":"Jurbise"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.530496","longitude":"3.910694","name":"Jurbeke"},{"@id":"http://irail.be/stations/NMBS/008881174","country":"http://sws.geonames.org/2802361/","latitude":"50.536546","longitude":"3.962139","name":"Masnuy-Saint-Pierre"},{"@id":"http://irail.be/stations/NMBS/008881190","country":"http://sws.geonames.org/2802361/","latitude":"50.559342","longitude":"3.903224","name":"Lens"},{"@id":"http://irail.be/stations/NMBS/008881315","country":"http://sws.geonames.org/2802361/","latitude":"50.471644","longitude":"3.956089","name":"Nimy"},{"@id":"http://irail.be/stations/NMBS/008881406","country":"http://sws.geonames.org/2802361/","latitude":"50.469873","longitude":"4.007804","name":"Obourg"},{"@id":"http://irail.be/stations/NMBS/008881430","country":"http://sws.geonames.org/2802361/","latitude":"50.470754","longitude":"4.059987","name":"Havre"},{"@id":"http://irail.be/stations/NMBS/008881455","country":"http://sws.geonames.org/2802361/","latitude":"50.46954","longitude":"4.098523","name":"Thieu"},{"@id":"http://irail.be/stations/NMBS/008881463","country":"http://sws.geonames.org/2802361/","latitude":"50.474457","longitude":"4.126345","name":"Bracquegnies"},{"@id":"http://irail.be/stations/NMBS/008881505","country":"http://sws.geonames.org/2802361/","latitude":"50.341534","longitude":"3.909489","name":"Quevy"},{"@id":"http://irail.be/stations/NMBS/008881562","country":"http://sws.geonames.org/2802361/","latitude":"50.390642","longitude":"3.911638","name":"Genly"},{"@id":"http://irail.be/stations/NMBS/008881570","country":"http://sws.geonames.org/2802361/","latitude":"50.405932","longitude":"3.906586","name":"Frameries"},{"@id":"http://irail.be/stations/NMBS/008882107","alternative":[{"@language":"nl","@value":"La Louvière-Centrum"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.478161","longitude":"4.179858","name":"La Louvière-Centre"},{"@id":"http://irail.be/stations/NMBS/008882206","alternative":[{"@language":"nl","@value":"La Louvière-Zuid"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.464974","longitude":"4.190609","name":"La Louvière-Sud"},{"@id":"http://irail.be/stations/NMBS/008882230","country":"http://sws.geonames.org/2802361/","latitude":"50.457998","longitude":"4.247367","name":"Morlanwelz"},{"@id":"http://irail.be/stations/NMBS/008882248","country":"http://sws.geonames.org/2802361/","latitude":"50.447957","longitude":"4.263826","name":"Carnieres"},{"@id":"http://irail.be/stations/NMBS/008882339","country":"http://sws.geonames.org/2802361/","latitude":"50.430797","longitude":"4.211041","name":"Leval"},{"@id":"http://irail.be/stations/NMBS/008882362","country":"http://sws.geonames.org/2802361/","latitude":"50.408764","longitude":"4.172451","name":"Binche"},{"@id":"http://irail.be/stations/NMBS/008882701","country":"http://sws.geonames.org/2802361/","latitude":"50.506108","longitude":"4.234683","name":"Manage"},{"@id":"http://irail.be/stations/NMBS/008883006","alternative":[{"@language":"nl","@value":"'s Gravenbrakel"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.605079","longitude":"4.137662","name":"Braine-le-Comte"},{"@id":"http://irail.be/stations/NMBS/008883022","country":"http://sws.geonames.org/2802361/","latitude":"50.651005","longitude":"4.175893","name":"Hennuyères"},{"@id":"http://irail.be/stations/NMBS/008883113","alternative":[{"@language":"nl","@value":"Zinnik"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.572763","longitude":"4.067519","name":"Soignies"},{"@id":"http://irail.be/stations/NMBS/008883121","country":"http://sws.geonames.org/2802361/","latitude":"50.543602","longitude":"4.010672","name":"Neufvilles"},{"@id":"http://irail.be/stations/NMBS/008883212","country":"http://sws.geonames.org/2802361/","latitude":"50.56239","longitude":"4.156639","name":"Écaussinnes"},{"@id":"http://irail.be/stations/NMBS/008883220","country":"http://sws.geonames.org/2802361/","latitude":"50.546173","longitude":"4.177098","name":"Marche-lez-Écaussinnes"},{"@id":"http://irail.be/stations/NMBS/008883238","country":"http://sws.geonames.org/2802361/","latitude":"50.519358","longitude":"4.211581","name":"Familleureux"},{"@id":"http://irail.be/stations/NMBS/008883311","alternative":[{"@language":"nl","@value":"Edingen"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.697273","longitude":"4.047357","name":"Enghien"},{"@id":"http://irail.be/stations/NMBS/008883436","alternative":[{"@language":"nl","@value":"Opzullik"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.662386","longitude":"3.935863","name":"Silly"},{"@id":"http://irail.be/stations/NMBS/008883808","alternative":[{"@language":"nl","@value":"Tubeke"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.691708","longitude":"4.205729","name":"Tubize"},{"@id":"http://irail.be/stations/NMBS/008884004","country":"http://sws.geonames.org/2802361/","latitude":"50.44286","longitude":"3.820253","name":"Saint-Ghislain"},{"@id":"http://irail.be/stations/NMBS/008884319","country":"http://sws.geonames.org/2802361/","latitude":"50.436388","longitude":"3.797025","name":"Boussu"},{"@id":"http://irail.be/stations/NMBS/008884327","country":"http://sws.geonames.org/2802361/","latitude":"50.428019","longitude":"3.766893","name":"Hainin"},{"@id":"http://irail.be/stations/NMBS/008884335","country":"http://sws.geonames.org/2802361/","latitude":"50.410103","longitude":"3.68608","name":"Quievrain"},{"@id":"http://irail.be/stations/NMBS/008884350","country":"http://sws.geonames.org/2802361/","latitude":"50.423335","longitude":"3.744708","name":"Thulin"},{"@id":"http://irail.be/stations/NMBS/008884541","country":"http://sws.geonames.org/2802361/","latitude":"50.449827","longitude":"3.856543","name":"Quaregnon"},{"@id":"http://irail.be/stations/NMBS/008884566","country":"http://sws.geonames.org/2802361/","latitude":"50.452577","longitude":"3.885587","name":"Jemappes"},{"@id":"http://irail.be/stations/NMBS/008884632","country":"http://sws.geonames.org/2802361/","latitude":"50.464542","longitude":"3.724248","name":"Ville-Pommerœul"},{"@id":"http://irail.be/stations/NMBS/008884640","country":"http://sws.geonames.org/2802361/","latitude":"50.482565","longitude":"3.698764","name":"Harchies"},{"@id":"http://irail.be/stations/NMBS/008884715","country":"http://sws.geonames.org/2802361/","latitude":"50.505461","longitude":"3.666304","name":"Blaton"},{"@id":"http://irail.be/stations/NMBS/008884855","country":"http://sws.geonames.org/2802361/","latitude":"50.513704","longitude":"3.592772","name":"Péruwelz"},{"@id":"http://irail.be/stations/NMBS/008884889","country":"http://sws.geonames.org/2802361/","latitude":"50.527359","longitude":"3.52618","name":"Callenelle"},{"@id":"http://irail.be/stations/NMBS/008885001","alternative":[{"@language":"nl","@value":"Doornik"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.613134","longitude":"3.396942","name":"Tournai"},{"@id":"http://irail.be/stations/NMBS/008885068","country":"http://sws.geonames.org/2802361/","latitude":"50.62989","longitude":"3.354837","name":"Froyennes"},{"@id":"http://irail.be/stations/NMBS/008885522","country":"http://sws.geonames.org/2802361/","latitude":"50.569626","longitude":"3.451309","name":"Antoing"},{"@id":"http://irail.be/stations/NMBS/008885530","country":"http://sws.geonames.org/2802361/","latitude":"50.547557","longitude":"3.495527","name":"Maubray"},{"@id":"http://irail.be/stations/NMBS/008885704","alternative":[{"@language":"nl","@value":"Moeskroen"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.741005","longitude":"3.228448","name":"Mouscron"},{"@id":"http://irail.be/stations/NMBS/008885753","country":"http://sws.geonames.org/2802361/","latitude":"50.713894","longitude":"3.245959","name":"Herseaux"},{"@id":"http://irail.be/stations/NMBS/008886009","alternative":[{"@language":"nl","@value":"Aat"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.626932","longitude":"3.777429","name":"Ath"},{"@id":"http://irail.be/stations/NMBS/008886041","country":"http://sws.geonames.org/2802361/","latitude":"50.614356","longitude":"3.800117","name":"Maffle"},{"@id":"http://irail.be/stations/NMBS/008886058","country":"http://sws.geonames.org/2802361/","latitude":"50.600108","longitude":"3.833917","name":"Mevergnies-Attre"},{"@id":"http://irail.be/stations/NMBS/008886066","country":"http://sws.geonames.org/2802361/","latitude":"50.594229","longitude":"3.852551","name":"Brugelette"},{"@id":"http://irail.be/stations/NMBS/008886074","country":"http://sws.geonames.org/2802361/","latitude":"50.586759","longitude":"3.874809","name":"Cambron-Casteau"},{"@id":"http://irail.be/stations/NMBS/008886348","country":"http://sws.geonames.org/2802361/","latitude":"50.600612","longitude":"3.616872","name":"Leuze"},{"@id":"http://irail.be/stations/NMBS/008886504","country":"http://sws.geonames.org/2802361/","latitude":"50.712015","longitude":"3.836434","name":"Lessen"},{"@id":"http://irail.be/stations/NMBS/008886546","alternative":[{"@language":"nl","@value":"Akren"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.733095","longitude":"3.847086","name":"Acren"},{"@id":"http://irail.be/stations/NMBS/008886553","country":"http://sws.geonames.org/2802361/","latitude":"50.703062","longitude":"3.835175","name":"Houraing"},{"@id":"http://irail.be/stations/NMBS/008886561","country":"http://sws.geonames.org/2802361/","latitude":"50.686585","longitude":"3.823408","name":"Papegem"},{"@id":"http://irail.be/stations/NMBS/008886587","country":"http://sws.geonames.org/2802361/","latitude":"50.661235","longitude":"3.793627","name":"Rebaix"},{"@id":"http://irail.be/stations/NMBS/008891009","alternative":[{"@language":"fr","@value":"Bruges"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.197226","longitude":"3.216726","name":"Brugge"},{"@id":"http://irail.be/stations/NMBS/008891033","alternative":[{"@language":"fr","@value":"Bruges-Saint-Pierre"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.223115","longitude":"3.201795","name":"Brugge-Sint-Pieters"},{"@id":"http://irail.be/stations/NMBS/008891116","country":"http://sws.geonames.org/2802361/","latitude":"51.154114","longitude":"3.257466","name":"Oostkamp"},{"@id":"http://irail.be/stations/NMBS/008891124","country":"http://sws.geonames.org/2802361/","latitude":"51.128009","longitude":"3.329892","name":"Beernem"},{"@id":"http://irail.be/stations/NMBS/008891132","country":"http://sws.geonames.org/2802361/","latitude":"51.107612","longitude":"3.38673","name":"Maria-Aalter"},{"@id":"http://irail.be/stations/NMBS/008891140","country":"http://sws.geonames.org/2802361/","latitude":"51.092295","longitude":"3.447848","name":"Aalter"},{"@id":"http://irail.be/stations/NMBS/008891157","country":"http://sws.geonames.org/2802361/","latitude":"51.083908","longitude":"3.487374","name":"Bellem"},{"@id":"http://irail.be/stations/NMBS/008891165","country":"http://sws.geonames.org/2802361/","latitude":"51.073202","longitude":"3.536212","name":"Hansbeke"},{"@id":"http://irail.be/stations/NMBS/008891173","country":"http://sws.geonames.org/2802361/","latitude":"51.324549","longitude":"3.186666","name":"Zeebrugge-Strand"},{"@id":"http://irail.be/stations/NMBS/008891264","country":"http://sws.geonames.org/2802361/","latitude":"51.127047","longitude":"3.16414","name":"Zedelgem"},{"@id":"http://irail.be/stations/NMBS/008891314","country":"http://sws.geonames.org/2802361/","latitude":"51.064707","longitude":"3.105871","name":"Torhout"},{"@id":"http://irail.be/stations/NMBS/008891405","country":"http://sws.geonames.org/2802361/","latitude":"51.312432","longitude":"3.133864","name":"Blankenberge"},{"@id":"http://irail.be/stations/NMBS/008891553","country":"http://sws.geonames.org/2802361/","latitude":"51.326383","longitude":"3.19517","name":"Zeebrugge-Dorp"},{"@id":"http://irail.be/stations/NMBS/008891611","country":"http://sws.geonames.org/2802361/","latitude":"51.306409","longitude":"3.191557","name":"Zwankendamme"},{"@id":"http://irail.be/stations/NMBS/008891629","country":"http://sws.geonames.org/2802361/","latitude":"51.294714","longitude":"3.194505","name":"Lissewege"},{"@id":"http://irail.be/stations/NMBS/008891645","country":"http://sws.geonames.org/2802361/","latitude":"51.333979","longitude":"3.239181","name":"Heist"},{"@id":"http://irail.be/stations/NMBS/008891652","country":"http://sws.geonames.org/2802361/","latitude":"51.338195","longitude":"3.263587","name":"Duinbergen"},{"@id":"http://irail.be/stations/NMBS/008891660","country":"http://sws.geonames.org/2802361/","latitude":"51.339894","longitude":"3.285188","name":"Knokke"},{"@id":"http://irail.be/stations/NMBS/008891702","alternative":[{"@language":"fr","@value":"Ostende"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.228212","longitude":"2.925809","name":"Oostende"},{"@id":"http://irail.be/stations/NMBS/008892007","alternative":[{"@language":"en","@value":"Ghent-Sint-Pieters"},{"@language":"fr","@value":"Gand-Saint-Pierre"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.035896","longitude":"3.710675","name":"Gent-Sint-Pieters"},{"@id":"http://irail.be/stations/NMBS/008892031","country":"http://sws.geonames.org/2802361/","latitude":"51.047295","longitude":"3.655202","name":"Drongen"},{"@id":"http://irail.be/stations/NMBS/008892056","country":"http://sws.geonames.org/2802361/","latitude":"51.064311","longitude":"3.576852","name":"Landegem"},{"@id":"http://irail.be/stations/NMBS/008892080","country":"http://sws.geonames.org/2802361/","latitude":"50.997063","longitude":"3.650465","name":"De Pinte"},{"@id":"http://irail.be/stations/NMBS/008892106","country":"http://sws.geonames.org/2802361/","latitude":"50.978258","longitude":"3.534432","name":"Deinze"},{"@id":"http://irail.be/stations/NMBS/008892205","country":"http://sws.geonames.org/2802361/","latitude":"51.025163","longitude":"3.127212","name":"Lichtervelde"},{"@id":"http://irail.be/stations/NMBS/008892254","country":"http://sws.geonames.org/2802361/","latitude":"50.990842","longitude":"3.330341","name":"Tielt"},{"@id":"http://irail.be/stations/NMBS/008892288","country":"http://sws.geonames.org/2802361/","latitude":"50.98446","longitude":"3.418363","name":"Aarsele"},{"@id":"http://irail.be/stations/NMBS/008892304","alternative":[{"@language":"fr","@value":"Furnes"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.073867","longitude":"2.66994","name":"Veurne"},{"@id":"http://irail.be/stations/NMBS/008892320","alternative":[{"@language":"fr","@value":"Coxyde"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.079197","longitude":"2.65277","name":"Koksijde"},{"@id":"http://irail.be/stations/NMBS/008892338","alternative":[{"@language":"fr","@value":"La Panne"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.0774","longitude":"2.601963","name":"De Panne"},{"@id":"http://irail.be/stations/NMBS/008892403","country":"http://sws.geonames.org/2802361/","latitude":"51.025244","longitude":"3.043459","name":"Kortemark"},{"@id":"http://irail.be/stations/NMBS/008892452","alternative":[{"@language":"fr","@value":"Dixmude"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.032723","longitude":"2.868943","name":"Diksmuide"},{"@id":"http://irail.be/stations/NMBS/008892601","country":"http://sws.geonames.org/2802361/","latitude":"50.850116","longitude":"3.600386","name":"Oudenaarde"},{"@id":"http://irail.be/stations/NMBS/008892627","country":"http://sws.geonames.org/2802361/","latitude":"50.870432","longitude":"3.623776","name":"Eine"},{"@id":"http://irail.be/stations/NMBS/008892635","country":"http://sws.geonames.org/2802361/","latitude":"50.908025","longitude":"3.646384","name":"Zingem"},{"@id":"http://irail.be/stations/NMBS/008892643","country":"http://sws.geonames.org/2802361/","latitude":"50.930021","longitude":"3.639732","name":"Gavere-Asper"},{"@id":"http://irail.be/stations/NMBS/008892650","country":"http://sws.geonames.org/2802361/","latitude":"50.960774","longitude":"3.627839","name":"Eke-Nazareth"},{"@id":"http://irail.be/stations/NMBS/008892692","country":"http://sws.geonames.org/2802361/","latitude":"50.874297","longitude":"3.698395","name":"Sint-Denijs-Boekel"},{"@id":"http://irail.be/stations/NMBS/008892734","country":"http://sws.geonames.org/2802361/","latitude":"50.826385","longitude":"3.495014","name":"Anzegem"},{"@id":"http://irail.be/stations/NMBS/008892908","alternative":[{"@language":"fr","@value":"Renaix"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.742506","longitude":"3.602552","name":"Ronse"},{"@id":"http://irail.be/stations/NMBS/008893013","country":"http://sws.geonames.org/2802361/","latitude":"51.017531","longitude":"3.768889","name":"Merelbeke"},{"@id":"http://irail.be/stations/NMBS/008893039","country":"http://sws.geonames.org/2802361/","latitude":"51.002807","longitude":"3.797088","name":"Melle"},{"@id":"http://irail.be/stations/NMBS/008893047","country":"http://sws.geonames.org/2802361/","latitude":"50.980199","longitude":"3.801672","name":"Gontrode"},{"@id":"http://irail.be/stations/NMBS/008893054","country":"http://sws.geonames.org/2802361/","latitude":"50.970545","longitude":"3.791146","name":"Landskouter"},{"@id":"http://irail.be/stations/NMBS/008893062","country":"http://sws.geonames.org/2802361/","latitude":"50.953519","longitude":"3.781339","name":"Moortsele"},{"@id":"http://irail.be/stations/NMBS/008893070","country":"http://sws.geonames.org/2802361/","latitude":"50.937069","longitude":"3.777842","name":"Scheldewindeke"},{"@id":"http://irail.be/stations/NMBS/008893120","alternative":[{"@language":"en","@value":"Ghent-Dampoort"},{"@language":"fr","@value":"Gand-Dampoort"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.056365","longitude":"3.740591","name":"Gent-Dampoort"},{"@id":"http://irail.be/stations/NMBS/008893179","country":"http://sws.geonames.org/2802361/","latitude":"51.038647","longitude":"3.756322","name":"Gentbrugge"},{"@id":"http://irail.be/stations/NMBS/008893211","country":"http://sws.geonames.org/2802361/","latitude":"51.088357","longitude":"3.719071","name":"Wondelgem"},{"@id":"http://irail.be/stations/NMBS/008893252","country":"http://sws.geonames.org/2802361/","latitude":"51.107585","longitude":"3.70138","name":"Evergem"},{"@id":"http://irail.be/stations/NMBS/008893260","country":"http://sws.geonames.org/2802361/","latitude":"51.126607","longitude":"3.667526","name":"Sleidinge"},{"@id":"http://irail.be/stations/NMBS/008893401","alternative":[{"@language":"fr","@value":"Termonde"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.022781","longitude":"4.101427","name":"Dendermonde"},{"@id":"http://irail.be/stations/NMBS/008893443","alternative":[{"@language":"fr","@value":"Saint-Gilles-lez-Termonde"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.021693","longitude":"4.117832","name":"Sint-Gillis-Dendermonde"},{"@id":"http://irail.be/stations/NMBS/008893518","country":"http://sws.geonames.org/2802361/","latitude":"51.01523","longitude":"4.064472","name":"Oudegem"},{"@id":"http://irail.be/stations/NMBS/008893526","country":"http://sws.geonames.org/2802361/","latitude":"51.003149","longitude":"4.011094","name":"Schoonaarde"},{"@id":"http://irail.be/stations/NMBS/008893534","country":"http://sws.geonames.org/2802361/","latitude":"51.001962","longitude":"3.969195","name":"Wichelen"},{"@id":"http://irail.be/stations/NMBS/008893542","country":"http://sws.geonames.org/2802361/","latitude":"51.003149","longitude":"3.921373","name":"Schellebelle"},{"@id":"http://irail.be/stations/NMBS/008893559","country":"http://sws.geonames.org/2802361/","latitude":"51.001603","longitude":"3.881883","name":"Wetteren"},{"@id":"http://irail.be/stations/NMBS/008893567","alternative":[{"@language":"fr","@value":"Quatrecht"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.99175","longitude":"3.829593","name":"Kwatrecht"},{"@id":"http://irail.be/stations/NMBS/008893583","country":"http://sws.geonames.org/2802361/","latitude":"50.984397","longitude":"3.959361","name":"Serskamp"},{"@id":"http://irail.be/stations/NMBS/008893708","country":"http://sws.geonames.org/2802361/","latitude":"51.181333","longitude":"3.574515","name":"Eeklo"},{"@id":"http://irail.be/stations/NMBS/008893815","country":"http://sws.geonames.org/2802361/","latitude":"51.154608","longitude":"3.615353","name":"Waarschoot"},{"@id":"http://irail.be/stations/NMBS/008894151","country":"http://sws.geonames.org/2802361/","latitude":"51.08753","longitude":"3.879384","name":"Beervelde"},{"@id":"http://irail.be/stations/NMBS/008894201","country":"http://sws.geonames.org/2802361/","latitude":"51.108062","longitude":"3.987794","name":"Lokeren"},{"@id":"http://irail.be/stations/NMBS/008894235","country":"http://sws.geonames.org/2802361/","latitude":"51.073256","longitude":"4.041999","name":"Zele"},{"@id":"http://irail.be/stations/NMBS/008894425","country":"http://sws.geonames.org/2802361/","latitude":"51.143398","longitude":"4.06894","name":"Sinaai"},{"@id":"http://irail.be/stations/NMBS/008894433","country":"http://sws.geonames.org/2802361/","latitude":"51.150994","longitude":"4.088608","name":"Belsele"},{"@id":"http://irail.be/stations/NMBS/008894508","alternative":[{"@language":"fr","@value":"Saint-Nicolas"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.171472","longitude":"4.142966","name":"Sint-Niklaas"},{"@id":"http://irail.be/stations/NMBS/008894672","country":"http://sws.geonames.org/2802361/","latitude":"51.126085","longitude":"4.221352","name":"Temse"},{"@id":"http://irail.be/stations/NMBS/008894714","country":"http://sws.geonames.org/2802361/","latitude":"51.185612","longitude":"4.185907","name":"Nieuwkerken-Waas"},{"@id":"http://irail.be/stations/NMBS/008894748","country":"http://sws.geonames.org/2802361/","latitude":"51.208336","longitude":"4.25952","name":"Beveren"},{"@id":"http://irail.be/stations/NMBS/008894755","country":"http://sws.geonames.org/2802361/","latitude":"51.21071","longitude":"4.286766","name":"Melsele"},{"@id":"http://irail.be/stations/NMBS/008894821","country":"http://sws.geonames.org/2802361/","latitude":"51.214108","longitude":"4.32978","name":"Zwijndrecht"},{"@id":"http://irail.be/stations/NMBS/008895000","alternative":[{"@language":"fr","@value":"Alost"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.942813","longitude":"4.039653","name":"Aalst"},{"@id":"http://irail.be/stations/NMBS/008895067","country":"http://sws.geonames.org/2802361/","latitude":"50.970895","longitude":"3.984981","name":"Lede"},{"@id":"http://irail.be/stations/NMBS/008895091","country":"http://sws.geonames.org/2802361/","latitude":"50.919621","longitude":"4.055447","name":"Erembodegem"},{"@id":"http://irail.be/stations/NMBS/008895125","country":"http://sws.geonames.org/2802361/","latitude":"50.948377","longitude":"4.024407","name":"Aalst-Kerrebroek"},{"@id":"http://irail.be/stations/NMBS/008895208","country":"http://sws.geonames.org/2802361/","latitude":"50.869102","longitude":"3.81441","name":"Zottegem"},{"@id":"http://irail.be/stations/NMBS/008895232","country":"http://sws.geonames.org/2802361/","latitude":"50.875673","longitude":"3.733238","name":"Munkzwalm"},{"@id":"http://irail.be/stations/NMBS/008895240","country":"http://sws.geonames.org/2802361/","latitude":"50.90051","longitude":"3.80587","name":"Balegem-Zuid"},{"@id":"http://irail.be/stations/NMBS/008895257","country":"http://sws.geonames.org/2802361/","latitude":"50.919612","longitude":"3.791425","name":"Balegem-Dorp"},{"@id":"http://irail.be/stations/NMBS/008895422","country":"http://sws.geonames.org/2802361/","latitude":"50.891296","longitude":"3.857469","name":"Hillegem"},{"@id":"http://irail.be/stations/NMBS/008895430","country":"http://sws.geonames.org/2802361/","latitude":"50.89722","longitude":"3.880616","name":"Herzele"},{"@id":"http://irail.be/stations/NMBS/008895448","country":"http://sws.geonames.org/2802361/","latitude":"50.901643","longitude":"3.896653","name":"Terhagen"},{"@id":"http://irail.be/stations/NMBS/008895455","country":"http://sws.geonames.org/2802361/","latitude":"50.907198","longitude":"3.922416","name":"Burst"},{"@id":"http://irail.be/stations/NMBS/008895463","country":"http://sws.geonames.org/2802361/","latitude":"50.913769","longitude":"3.935711","name":"Bambrugge"},{"@id":"http://irail.be/stations/NMBS/008895471","country":"http://sws.geonames.org/2802361/","latitude":"50.928601","longitude":"3.962463","name":"Erpe-Mere"},{"@id":"http://irail.be/stations/NMBS/008895489","country":"http://sws.geonames.org/2802361/","latitude":"50.943254","longitude":"3.98125","name":"Vijfhuizen"},{"@id":"http://irail.be/stations/NMBS/008895505","alternative":[{"@language":"fr","@value":"Grammont"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.771137","longitude":"3.872328","name":"Geraardsbergen"},{"@id":"http://irail.be/stations/NMBS/008895570","country":"http://sws.geonames.org/2802361/","latitude":"50.816236","longitude":"3.826564","name":"Lierde"},{"@id":"http://irail.be/stations/NMBS/008895612","country":"http://sws.geonames.org/2802361/","latitude":"50.751981","longitude":"3.917337","name":"Viane-Moerbeke"},{"@id":"http://irail.be/stations/NMBS/008895620","alternative":[{"@language":"fr","@value":"Gammerages"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.743918","longitude":"3.965726","name":"Galmaarden"},{"@id":"http://irail.be/stations/NMBS/008895638","country":"http://sws.geonames.org/2802361/","latitude":"50.735522","longitude":"3.992828","name":"Tollembeek"},{"@id":"http://irail.be/stations/NMBS/008895646","country":"http://sws.geonames.org/2802361/","latitude":"50.723701","longitude":"4.014573","name":"Herne"},{"@id":"http://irail.be/stations/NMBS/008895711","country":"http://sws.geonames.org/2802361/","latitude":"50.797844","longitude":"3.899286","name":"Schendelbeke"},{"@id":"http://irail.be/stations/NMBS/008895729","country":"http://sws.geonames.org/2802361/","latitude":"50.801871","longitude":"3.921553","name":"Idegem"},{"@id":"http://irail.be/stations/NMBS/008895737","country":"http://sws.geonames.org/2802361/","latitude":"50.806986","longitude":"3.957653","name":"Zandbergen"},{"@id":"http://irail.be/stations/NMBS/008895745","country":"http://sws.geonames.org/2802361/","latitude":"50.813063","longitude":"3.972108","name":"Appelterre"},{"@id":"http://irail.be/stations/NMBS/008895752","country":"http://sws.geonames.org/2802361/","latitude":"50.823994","longitude":"3.993745","name":"Eichem"},{"@id":"http://irail.be/stations/NMBS/008895760","country":"http://sws.geonames.org/2802361/","latitude":"50.839509","longitude":"4.026133","name":"Ninove"},{"@id":"http://irail.be/stations/NMBS/008895778","country":"http://sws.geonames.org/2802361/","latitude":"50.857712","longitude":"4.054557","name":"Okegem"},{"@id":"http://irail.be/stations/NMBS/008895802","country":"http://sws.geonames.org/2802361/","latitude":"50.891925","longitude":"4.071825","name":"Denderleeuw"},{"@id":"http://irail.be/stations/NMBS/008895836","country":"http://sws.geonames.org/2802361/","latitude":"50.882531","longitude":"4.095287","name":"Liedekerke"},{"@id":"http://irail.be/stations/NMBS/008895844","country":"http://sws.geonames.org/2802361/","latitude":"50.876886","longitude":"4.06849","name":"Iddergem"},{"@id":"http://irail.be/stations/NMBS/008895851","country":"http://sws.geonames.org/2802361/","latitude":"50.903279","longitude":"4.05062","name":"Welle"},{"@id":"http://irail.be/stations/NMBS/008895869","country":"http://sws.geonames.org/2802361/","latitude":"50.906838","longitude":"4.023958","name":"Haaltert"},{"@id":"http://irail.be/stations/NMBS/008895877","country":"http://sws.geonames.org/2802361/","latitude":"50.911054","longitude":"3.987524","name":"Ede"},{"@id":"http://irail.be/stations/NMBS/008896008","alternative":[{"@language":"fr","@value":"Courtrai"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.824506","longitude":"3.264549","name":"Kortrijk"},{"@id":"http://irail.be/stations/NMBS/008896115","country":"http://sws.geonames.org/2802361/","latitude":"50.85586","longitude":"3.314008","name":"Harelbeke"},{"@id":"http://irail.be/stations/NMBS/008896149","country":"http://sws.geonames.org/2802361/","latitude":"50.892456","longitude":"3.42551","name":"Waregem"},{"@id":"http://irail.be/stations/NMBS/008896230","country":"http://sws.geonames.org/2802361/","latitude":"50.833657","longitude":"3.39163","name":"Vichte"},{"@id":"http://irail.be/stations/NMBS/008896305","alternative":[{"@language":"fr","@value":"Menin"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.799489","longitude":"3.113791","name":"Menen"},{"@id":"http://irail.be/stations/NMBS/008896370","country":"http://sws.geonames.org/2802361/","latitude":"50.811526","longitude":"3.18352","name":"Wevelgem"},{"@id":"http://irail.be/stations/NMBS/008896388","country":"http://sws.geonames.org/2802361/","latitude":"50.825845","longitude":"3.224205","name":"Bissegem"},{"@id":"http://irail.be/stations/NMBS/008896396","country":"http://sws.geonames.org/2802361/","latitude":"50.781861","longitude":"3.046983","name":"Wervik"},{"@id":"http://irail.be/stations/NMBS/008896412","alternative":[{"@language":"nl","@value":"Komen"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.772072","longitude":"2.999286","name":"Comines"},{"@id":"http://irail.be/stations/NMBS/008896503","alternative":[{"@language":"fr","@value":"Ypres"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.847402","longitude":"2.876593","name":"Ieper"},{"@id":"http://irail.be/stations/NMBS/008896735","country":"http://sws.geonames.org/2802361/","latitude":"50.854449","longitude":"2.736343","name":"Poperinge"},{"@id":"http://irail.be/stations/NMBS/008896800","alternative":[{"@language":"fr","@value":"Roulers"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.949025","longitude":"3.130412","name":"Roeselare"},{"@id":"http://irail.be/stations/NMBS/008896909","country":"http://sws.geonames.org/2802361/","latitude":"50.921149","longitude":"3.212088","name":"Izegem"},{"@id":"http://irail.be/stations/NMBS/008896925","country":"http://sws.geonames.org/2802361/","latitude":"50.914326","longitude":"3.255416","name":"Ingelmunster"}],"@id":"http://irail.be/stations/NMBS/"} +{"@context":{"name":"http://xmlns.com/foaf/0.1/name","longitude":"http://www.w3.org/2003/01/geo/wgs84_pos#long","latitude":"http://www.w3.org/2003/01/geo/wgs84_pos#lat","alternative":"http://purl.org/dc/terms/alternative","country":{"@type":"@id","@id":"http://www.geonames.org/ontology#parentCountry"}},"@graph":[{"@id":"http://irail.be/stations/NMBS/007015400","alternative":[{"@language":"fr","@value":"Londres Saint Pancras"},{"@language":"nl","@value":"Londen Saint Pancras"}],"country":"http://sws.geonames.org/2635167/","latitude":"51.5310399","longitude":"-0.1260606","name":"London Saint Pancras International"},{"@id":"http://irail.be/stations/NMBS/007015440","country":"http://sws.geonames.org/2635167/","latitude":"51.44304","longitude":"0.32107","name":"Ebbsfleet International"},{"@id":"http://irail.be/stations/NMBS/008008094","country":"http://sws.geonames.org/2921044/","latitude":"51.219962","longitude":"6.794319","name":"Düsseldorf Hbf"},{"@id":"http://irail.be/stations/NMBS/008010184","country":"http://sws.geonames.org/2921044/","latitude":"51.451355","longitude":"7.014793","name":"Essen Hbf"},{"@id":"http://irail.be/stations/NMBS/008010316","country":"http://sws.geonames.org/2921044/","latitude":"51.42978","longitude":"6.7759037","name":"Duisburg Hbf"},{"@id":"http://irail.be/stations/NMBS/008011068","alternative":[{"@language":"fr","@value":"Francfort-sur-le-Main Hbf"}],"country":"http://sws.geonames.org/2921044/","latitude":"50.1071318","longitude":"8.6653708","name":"Frankfurt am Main Hbf"},{"@id":"http://irail.be/stations/NMBS/008011090","alternative":[{"@language":"en","@value":"Frankfurt am Main Airport"},{"@language":"fr","@value":"Francfort-sur-le-Main Aéroport"},{"@language":"nl","@value":"Frankfurt am Main Luchthaven"}],"country":"http://sws.geonames.org/2921044/","latitude":"50.051696","longitude":"8.569853","name":"Frankfurt am Main Flughafen"},{"@id":"http://irail.be/stations/NMBS/008015345","alternative":[{"@language":"fr","@value":"Aix-la-Chapelle Hbf"},{"@language":"nl","@value":"Aken Hbf"}],"country":"http://sws.geonames.org/2921044/","latitude":"50.770832","longitude":"6.105275","name":"Aachen Hbf"},{"@id":"http://irail.be/stations/NMBS/008015458","alternative":[{"@language":"fr","@value":"Cologne Hbf"},{"@language":"nl","@value":"Keulen Hbf"}],"country":"http://sws.geonames.org/2921044/","latitude":"50.942721","longitude":"6.958823","name":"Köln Hbf"},{"@id":"http://irail.be/stations/NMBS/008015588","country":"http://sws.geonames.org/2921044/","latitude":"50.793916","longitude":"7.203029","name":"Siegburg"},{"@id":"http://irail.be/stations/NMBS/008032572","country":"http://sws.geonames.org/2921044/","latitude":"50.3825","longitude":"8.096112","name":"Limburg Süd"},{"@id":"http://irail.be/stations/NMBS/008039904","country":"http://sws.geonames.org/2921044/","latitude":"51.292008","longitude":"6.786837","name":"Düsseldorf Flughafen Hbf"},{"@id":"http://irail.be/stations/NMBS/008200100","alternative":[{"@language":"fr","@value":"Luxembourg"},{"@language":"nl","@value":"Luxemburg"},{"@language":"de","@value":"Luxemburg"}],"country":"http://sws.geonames.org/2960313/","latitude":"49.599996","longitude":"6.133331","name":"Lëtzebuerg"},{"@id":"http://irail.be/stations/NMBS/008200110","country":"http://sws.geonames.org/2960313/","latitude":"49.748893","longitude":"6.106111","name":"Mersch"},{"@id":"http://irail.be/stations/NMBS/008200120","alternative":[{"@language":"fr","@value":"Ettelbruck"},{"@language":"nl","@value":"Ettelbruck"},{"@language":"de","@value":"Ettelbrück"}],"country":"http://sws.geonames.org/2960313/","latitude":"49.847496","longitude":"6.104169","name":"Ettelbréck"},{"@id":"http://irail.be/stations/NMBS/008200130","alternative":[{"@language":"fr","@value":"Kautenbach"},{"@language":"nl","@value":"Kautenbach"},{"@language":"de","@value":"Kautenbach"}],"country":"http://sws.geonames.org/2960313/","latitude":"49.952777","longitude":"6.020003","name":"Kautebaach"},{"@id":"http://irail.be/stations/NMBS/008200132","country":"http://sws.geonames.org/2960313/","latitude":"49.988887","longitude":"5.999166","name":"Wilwerwiltz"},{"@id":"http://irail.be/stations/NMBS/008200133","country":"http://sws.geonames.org/2960313/","latitude":"50.017778","longitude":"6.006106","name":"Drauffelt"},{"@id":"http://irail.be/stations/NMBS/008200134","country":"http://sws.geonames.org/2960313/","latitude":"50.054724","longitude":"6.031393","name":"Clervaux"},{"@id":"http://irail.be/stations/NMBS/008200136","country":"http://sws.geonames.org/2960313/","latitude":"50.121109","longitude":"6.000281","name":"Troisvierges"},{"@id":"http://irail.be/stations/NMBS/008200510","country":"http://sws.geonames.org/2960313/","latitude":"49.613002","longitude":"6.060601","name":"Bertrange Strassen"},{"@id":"http://irail.be/stations/NMBS/008200516","country":"http://sws.geonames.org/2960313/","latitude":"49.625663","longitude":"6.02014","name":"Mamer"},{"@id":"http://irail.be/stations/NMBS/008200518","alternative":[{"@language":"fr","@value":"Capellen"},{"@language":"nl","@value":"Capellen"},{"@language":"de","@value":"Capellen"}],"country":"http://sws.geonames.org/2960313/","latitude":"49.644996","longitude":"5.990833","name":"Kapellen"},{"@id":"http://irail.be/stations/NMBS/008200520","alternative":[{"@language":"fr","@value":"Kleinbettingen"},{"@language":"nl","@value":"Kleinbettingen"},{"@language":"de","@value":"Kleinbettingen"}],"country":"http://sws.geonames.org/2960313/","latitude":"49.646389","longitude":"5.916385","name":"Klengbetten"},{"@id":"http://irail.be/stations/NMBS/008200940","country":"http://sws.geonames.org/2960313/","latitude":"49.551283","longitude":"5.845028","name":"Rodange"},{"@id":"http://irail.be/stations/NMBS/008210014","country":"http://sws.geonames.org/2960313/","latitude":"49.618415","longitude":"6.02968","name":"Mamer-Lycée"},{"@id":"http://irail.be/stations/NMBS/008400058","country":"http://sws.geonames.org/2750405/","latitude":"52.379128","longitude":"4.900272","name":"Amsterdam CS"},{"@id":"http://irail.be/stations/NMBS/008400180","country":"http://sws.geonames.org/2750405/","latitude":"51.799998","longitude":"4.666668","name":"Dordrecht"},{"@id":"http://irail.be/stations/NMBS/008400219","country":"http://sws.geonames.org/2750405/","latitude":"50.772135","longitude":"5.709786","name":"Eijsden"},{"@id":"http://irail.be/stations/NMBS/008400280","country":"http://sws.geonames.org/2750405/","latitude":"52.083329","longitude":"4.299999","name":"Den Haag HS"},{"@id":"http://irail.be/stations/NMBS/008400424","country":"http://sws.geonames.org/2750405/","latitude":"50.85","longitude":"5.683331","name":"Maastricht"},{"@id":"http://irail.be/stations/NMBS/008400426","country":"http://sws.geonames.org/2750405/","latitude":"50.838502","longitude":"5.716707","name":"Maastricht Randwyck"},{"@id":"http://irail.be/stations/NMBS/008400526","country":"http://sws.geonames.org/2750405/","latitude":"51.533333","longitude":"4.466667","name":"Roosendaal"},{"@id":"http://irail.be/stations/NMBS/008400530","country":"http://sws.geonames.org/2750405/","latitude":"51.925093","longitude":"4.469424","name":"Rotterdam CS"},{"@id":"http://irail.be/stations/NMBS/008400561","country":"http://sws.geonames.org/2750405/","latitude":"52.308294","longitude":"4.762268","name":"Schiphol"},{"@id":"http://irail.be/stations/NMBS/008500010","alternative":[{"@language":"nl","@value":"Bazel"}],"country":"http://sws.geonames.org/2658434/","latitude":"47.547408","longitude":"7.590716","name":"Basel"},{"@id":"http://irail.be/stations/NMBS/008711184","country":"http://sws.geonames.org/3017382/","latitude":"48.868256","longitude":"2.782184","name":"Marne-la-Vallée - Chessy"},{"@id":"http://irail.be/stations/NMBS/008718201","country":"http://sws.geonames.org/3017382/","latitude":"48.083335","longitude":"7.366668","name":"Colmar"},{"@id":"http://irail.be/stations/NMBS/008718206","country":"http://sws.geonames.org/3017382/","latitude":"47.749998","longitude":"7.333336","name":"Mulhouse"},{"@id":"http://irail.be/stations/NMBS/008718213","country":"http://sws.geonames.org/3017382/","latitude":"47.5907","longitude":"7.555316","name":"Saint-Louis-Haut-Rhin"},{"@id":"http://irail.be/stations/NMBS/008719100","country":"http://sws.geonames.org/3017382/","latitude":"49.366663","longitude":"6.166663","name":"Thionville"},{"@id":"http://irail.be/stations/NMBS/008719203","country":"http://sws.geonames.org/3017382/","latitude":"49.13333","longitude":"6.166663","name":"Metz"},{"@id":"http://irail.be/stations/NMBS/008721202","alternative":[{"@language":"nl","@value":"Straatsburg"},{"@language":"de","@value":"Straßburg"}],"country":"http://sws.geonames.org/3017382/","latitude":"48.585437","longitude":"7.733905","name":"Strasbourg"},{"@id":"http://irail.be/stations/NMBS/008721222","country":"http://sws.geonames.org/3017382/","latitude":"48.744798","longitude":"7.362255","name":"Saverne"},{"@id":"http://irail.be/stations/NMBS/008721405","country":"http://sws.geonames.org/3017382/","latitude":"48.26667","longitude":"7.449999","name":"Selestat"},{"@id":"http://irail.be/stations/NMBS/008722326","alternative":[{"@language":"nl","@value":"Rijsel-Europa"}],"country":"http://sws.geonames.org/3017382/","latitude":"50.636108","longitude":"3.071516","name":"Lille Europe"},{"@id":"http://irail.be/stations/NMBS/008727100","alternative":[{"@language":"nl","@value":"Parijs Noord"}],"country":"http://sws.geonames.org/3017382/","latitude":"48.8809984","longitude":"2.3553093","name":"Paris Nord"},{"@id":"http://irail.be/stations/NMBS/008727149","country":"http://sws.geonames.org/3017382/","latitude":"49.003955","longitude":"2.571123","name":"Aéroport Charles-de-Gaulle TGV"},{"@id":"http://irail.be/stations/NMBS/008728105","country":"http://sws.geonames.org/3017382/","latitude":"50.675708","longitude":"3.13381","name":"Croix l'Allumette"},{"@id":"http://irail.be/stations/NMBS/008728600","alternative":[{"@language":"nl","@value":"Rijsel-Vlaanderen"}],"country":"http://sws.geonames.org/3017382/","latitude":"50.633333","longitude":"3.066669","name":"Lille Flandres"},{"@id":"http://irail.be/stations/NMBS/008728606","country":"http://sws.geonames.org/3017382/","latitude":"50.626941","longitude":"3.108892","name":"Hellemmes"},{"@id":"http://irail.be/stations/NMBS/008728654","country":"http://sws.geonames.org/2921044/","latitude":"50.716663","longitude":"3.168033","name":"Tourcoing"},{"@id":"http://irail.be/stations/NMBS/008728671","country":"http://sws.geonames.org/3017382/","latitude":"50.6764687","longitude":"3.149272","name":"Croix Wasquehal"},{"@id":"http://irail.be/stations/NMBS/008728673","country":"http://sws.geonames.org/3017382/","latitude":"50.699997","longitude":"3.166666","name":"Roubaix"},{"@id":"http://irail.be/stations/NMBS/008728683","country":"http://sws.geonames.org/3017382/","latitude":"50.624164","longitude":"3.1275","name":"Pont de Bois"},{"@id":"http://irail.be/stations/NMBS/008728685","country":"http://sws.geonames.org/3017382/","latitude":"50.6228168","longitude":"3.1473086","name":"Annappes"},{"@id":"http://irail.be/stations/NMBS/008728686","country":"http://sws.geonames.org/3017382/","latitude":"50.616666","longitude":"3.166666","name":"Ascq"},{"@id":"http://irail.be/stations/NMBS/008728687","country":"http://sws.geonames.org/3017382/","latitude":"50.610039","longitude":"3.2378999","name":"Baisieux"},{"@id":"http://irail.be/stations/NMBS/008728710","country":"http://sws.geonames.org/3017382/","latitude":"50.616666","longitude":"3.116667","name":"Lezennes"},{"@id":"http://irail.be/stations/NMBS/008731388","country":"http://sws.geonames.org/3017382/","latitude":"49.623044","longitude":"2.802566","name":"Haute-Picardie TGV"},{"@id":"http://irail.be/stations/NMBS/008731896","country":"http://sws.geonames.org/3017382/","latitude":"43.921433","longitude":"4.785841","name":"Avignon TGV"},{"@id":"http://irail.be/stations/NMBS/008731901","country":"http://sws.geonames.org/3017382/","latitude":"43.455128","longitude":"5.317243","name":"Aix-en-Provence TGV"},{"@id":"http://irail.be/stations/NMBS/008772202","country":"http://sws.geonames.org/3017382/","latitude":"45.748360","longitude":"4.825301","name":"Lyon-Perrache TGV"},{"@id":"http://irail.be/stations/NMBS/008772319","country":"http://sws.geonames.org/3017382/","latitude":"45.7612738","longitude":"4.8594013","name":"Lyon Part Dieu TGV"},{"@id":"http://irail.be/stations/NMBS/008774100","country":"http://sws.geonames.org/3017382/","latitude":"45.571498","longitude":"5.919756","name":"Chambéry-Challes-les-Eaux"},{"@id":"http://irail.be/stations/NMBS/008774164","country":"http://sws.geonames.org/3017382/","latitude":"45.673624","longitude":"6.383617","name":"Albertville"},{"@id":"http://irail.be/stations/NMBS/008774172","country":"http://sws.geonames.org/3017382/","latitude":"45.486693","longitude":"6.531454","name":"Moûtiers-Salins-Brides-les-Bai"},{"@id":"http://irail.be/stations/NMBS/008774176","country":"http://sws.geonames.org/3017382/","latitude":"45.554202","longitude":"6.648394","name":"Aime-la-Plagne"},{"@id":"http://irail.be/stations/NMBS/008774177","country":"http://sws.geonames.org/3017382/","latitude":"45.574194","longitude":"6.733522","name":"Landry"},{"@id":"http://irail.be/stations/NMBS/008774179","country":"http://sws.geonames.org/3017382/","latitude":"45.618826","longitude":"6.771664","name":"Bourg-Saint-Maurice"},{"@id":"http://irail.be/stations/NMBS/008775100","country":"http://sws.geonames.org/3017382/","latitude":"43.303178","longitude":"5.380752","name":"Marseille-Saint-Charles"},{"@id":"http://irail.be/stations/NMBS/008775500","country":"http://sws.geonames.org/3017382/","latitude":"43.1274781","longitude":"5.9326648","name":"Toulon"},{"@id":"http://irail.be/stations/NMBS/008775544","country":"http://sws.geonames.org/3017382/","latitude":"43.4555673","longitude":"6.4826446","name":"Les Arcs - Draguignan"},{"@id":"http://irail.be/stations/NMBS/008775605","country":"http://sws.geonames.org/3017382/","latitude":"43.704605","longitude":"7.261928","name":"Nice Ville"},{"@id":"http://irail.be/stations/NMBS/008775752","country":"http://sws.geonames.org/3017382/","latitude":"43.423456","longitude":"6.768825","name":"Saint-Raphaël-Valescure"},{"@id":"http://irail.be/stations/NMBS/008775762","country":"http://sws.geonames.org/3017382/","latitude":"43.553742","longitude":"7.019895","name":"Cannes"},{"@id":"http://irail.be/stations/NMBS/008775767","country":"http://sws.geonames.org/3017382/","latitude":"43.586618","longitude":"7.1201361","name":"Antibes"},{"@id":"http://irail.be/stations/NMBS/008776290","country":"http://sws.geonames.org/3017382/","latitude":"45.720907","longitude":"5.075822","name":"Lyon-Saint Exupéry TGV"},{"@id":"http://irail.be/stations/NMBS/008776302","country":"http://sws.geonames.org/2921044/","latitude":"44.992586","longitude":"4.978529","name":"Valence TGV"},{"@id":"http://irail.be/stations/NMBS/008777300","country":"http://sws.geonames.org/3017382/","latitude":"43.604947","longitude":"3.880534","name":"Montpellier"},{"@id":"http://irail.be/stations/NMBS/008777320","country":"http://sws.geonames.org/3017382/","latitude":"43.412810","longitude":"3.696535","name":"Sète"},{"@id":"http://irail.be/stations/NMBS/008777500","country":"http://sws.geonames.org/3017382/","latitude":"43.832602","longitude":"4.365997","name":"Nîmes"},{"@id":"http://irail.be/stations/NMBS/008778100","country":"http://sws.geonames.org/3017382/","latitude":"43.336177","longitude":"3.218794","name":"Béziers"},{"@id":"http://irail.be/stations/NMBS/008778110","country":"http://sws.geonames.org/3017382/","latitude":"43.190399","longitude":"3.006010","name":"Narbonne"},{"@id":"http://irail.be/stations/NMBS/008778127","country":"http://sws.geonames.org/3017382/","latitude":"43.317498","longitude":"3.465800","name":"Agde"},{"@id":"http://irail.be/stations/NMBS/008778400","country":"http://sws.geonames.org/3017382/","latitude":"42.695938","longitude":"2.879397","name":"Perpignan"},{"@id":"http://irail.be/stations/NMBS/008811007","alternative":[{"@language":"fr","@value":"Schaerbeek"},{"@language":"nl","@value":"Schaarbeek"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.878513","longitude":"4.378636","name":"Schaarbeek/Schaerbeek"},{"@id":"http://irail.be/stations/NMBS/008811106","country":"http://sws.geonames.org/2802361/","latitude":"50.86778","longitude":"4.400965","name":"Evere"},{"@id":"http://irail.be/stations/NMBS/008811130","alternative":[{"@language":"fr","@value":"Haren-Sud"},{"@language":"nl","@value":"Haren-Zuid"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.889696","longitude":"4.415357","name":"Haren-Sud/Haren-Zuid"},{"@id":"http://irail.be/stations/NMBS/008811148","country":"http://sws.geonames.org/2802361/","latitude":"50.907495","longitude":"4.417074","name":"Buda"},{"@id":"http://irail.be/stations/NMBS/008811155","country":"http://sws.geonames.org/2802361/","latitude":"50.888878","longitude":"4.419978","name":"Haren"},{"@id":"http://irail.be/stations/NMBS/008811163","country":"http://sws.geonames.org/2802361/","latitude":"50.877785","longitude":"4.410026","name":"Bordet"},{"@id":"http://irail.be/stations/NMBS/008811171","country":"http://sws.geonames.org/2802361/","latitude":"50.854072","longitude":"4.394421","name":"Meiser"},{"@id":"http://irail.be/stations/NMBS/008811189","alternative":[{"@language":"fr","@value":"Vilvorde"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.924583","longitude":"4.432823","name":"Vilvoorde"},{"@id":"http://irail.be/stations/NMBS/008811197","country":"http://sws.geonames.org/2802361/","latitude":"50.839284","longitude":"4.398934","name":"Merode"},{"@id":"http://irail.be/stations/NMBS/008811205","country":"http://sws.geonames.org/2802361/","latitude":"50.818357","longitude":"4.403869","name":"Delta"},{"@id":"http://irail.be/stations/NMBS/008811213","country":"http://sws.geonames.org/2802361/","latitude":"50.890478","longitude":"4.442774","name":"Diegem"},{"@id":"http://irail.be/stations/NMBS/008811221","country":"http://sws.geonames.org/2802361/","latitude":"50.885723","longitude":"4.469886","name":"Zaventem"},{"@id":"http://irail.be/stations/NMBS/008811247","country":"http://sws.geonames.org/2802361/","latitude":"50.883314","longitude":"4.506112","name":"Nossegem"},{"@id":"http://irail.be/stations/NMBS/008811254","country":"http://sws.geonames.org/2802361/","latitude":"50.893067","longitude":"4.543301","name":"Kortenberg"},{"@id":"http://irail.be/stations/NMBS/008811262","country":"http://sws.geonames.org/2802361/","latitude":"50.89651","longitude":"4.585001","name":"Erps-Kwerps"},{"@id":"http://irail.be/stations/NMBS/008811270","country":"http://sws.geonames.org/2802361/","latitude":"50.900519","longitude":"4.633516","name":"Veltem"},{"@id":"http://irail.be/stations/NMBS/008811288","country":"http://sws.geonames.org/2802361/","latitude":"50.90353","longitude":"4.672188","name":"Herent"},{"@id":"http://irail.be/stations/NMBS/008811304","alternative":[{"@language":"en","@value":"Brussels-Luxemburg/Brussels-Luxembourg"},{"@language":"fr","@value":"Bruxelles-Luxembourg"},{"@language":"nl","@value":"Brussel-Luxemburg"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.838943","longitude":"4.373674","name":"Brussel-Luxemburg/Bruxelles-Luxembourg"},{"@id":"http://irail.be/stations/NMBS/008811411","country":"http://sws.geonames.org/2802361/","latitude":"50.822187","longitude":"4.389513","name":"Etterbeek"},{"@id":"http://irail.be/stations/NMBS/008811429","alternative":[{"@language":"fr","@value":"Watermael"},{"@language":"nl","@value":"Watermaal"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.80917","longitude":"4.399887","name":"Watermaal/Watermael"},{"@id":"http://irail.be/stations/NMBS/008811437","alternative":[{"@language":"fr","@value":"Boitsfort"},{"@language":"nl","@value":"Bosvoorde"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.794698","longitude":"4.408112","name":"Bosvoorde/Boitsfort"},{"@id":"http://irail.be/stations/NMBS/008811445","alternative":[{"@language":"fr","@value":"Groenendael"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.766103","longitude":"4.449489","name":"Groenendaal"},{"@id":"http://irail.be/stations/NMBS/008811460","country":"http://sws.geonames.org/2802361/","latitude":"50.760161","longitude":"4.467414","name":"Hoeilaart"},{"@id":"http://irail.be/stations/NMBS/008811510","alternative":[{"@language":"nl","@value":"Terhulpen"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.737958","longitude":"4.49706","name":"La Hulpe"},{"@id":"http://irail.be/stations/NMBS/008811528","country":"http://sws.geonames.org/2802361/","latitude":"50.725697","longitude":"4.514832","name":"Genval"},{"@id":"http://irail.be/stations/NMBS/008811536","country":"http://sws.geonames.org/2802361/","latitude":"50.711413","longitude":"4.532855","name":"Rixensart"},{"@id":"http://irail.be/stations/NMBS/008811544","country":"http://sws.geonames.org/2802361/","latitude":"50.693758","longitude":"4.549153","name":"Profondsart"},{"@id":"http://irail.be/stations/NMBS/008811601","country":"http://sws.geonames.org/2802361/","latitude":"50.673667","longitude":"4.56936","name":"Ottignies"},{"@id":"http://irail.be/stations/NMBS/008811635","country":"http://sws.geonames.org/2802361/","latitude":"50.69214","longitude":"4.575302","name":"Limal"},{"@id":"http://irail.be/stations/NMBS/008811676","country":"http://sws.geonames.org/2802361/","latitude":"50.669793","longitude":"4.615745","name":"Louvain-la-Neuve-Université"},{"@id":"http://irail.be/stations/NMBS/008811718","country":"http://sws.geonames.org/2802361/","latitude":"50.707772","longitude":"4.594746","name":"Bierges-Walibi"},{"@id":"http://irail.be/stations/NMBS/008811726","alternative":[{"@language":"nl","@value":"Waver"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.716267","longitude":"4.604778","name":"Wavre"},{"@id":"http://irail.be/stations/NMBS/008811734","country":"http://sws.geonames.org/2802361/","latitude":"50.72442","longitude":"4.621651","name":"Basse-Wavre"},{"@id":"http://irail.be/stations/NMBS/008811742","country":"http://sws.geonames.org/2802361/","latitude":"50.736646","longitude":"4.649598","name":"Gastuche"},{"@id":"http://irail.be/stations/NMBS/008811759","alternative":[{"@language":"nl","@value":"Eerken"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.754345","longitude":"4.662444","name":"Archennes"},{"@id":"http://irail.be/stations/NMBS/008811767","country":"http://sws.geonames.org/2802361/","latitude":"50.761501","longitude":"4.653868","name":"Florival"},{"@id":"http://irail.be/stations/NMBS/008811775","country":"http://sws.geonames.org/2802361/","latitude":"50.778517","longitude":"4.651486","name":"Pécrot"},{"@id":"http://irail.be/stations/NMBS/008811817","country":"http://sws.geonames.org/2802361/","latitude":"50.659941","longitude":"4.569046","name":"Ceroux-Mousty"},{"@id":"http://irail.be/stations/NMBS/008811825","country":"http://sws.geonames.org/2802361/","latitude":"50.645567","longitude":"4.565819","name":"Court-Saint-Étienne"},{"@id":"http://irail.be/stations/NMBS/008811916","alternative":[{"@language":"en","@value":"Brussels-Schuman"},{"@language":"fr","@value":"Bruxelles-Schuman"},{"@language":"nl","@value":"Brussel-Schuman"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.843276","longitude":"4.380722","name":"Brussel-Schuman/Bruxelles-Schuman"},{"@id":"http://irail.be/stations/NMBS/008812005","alternative":[{"@language":"en","@value":"Brussels-North"},{"@language":"fr","@value":"Bruxelles-Nord"},{"@language":"nl","@value":"Brussel-Noord"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.859663","longitude":"4.360846","name":"Brussel-Noord/Bruxelles-Nord"},{"@id":"http://irail.be/stations/NMBS/008812013","country":"http://sws.geonames.org/2802361/","latitude":"50.863645","longitude":"4.32898","name":"Simonis"},{"@id":"http://irail.be/stations/NMBS/008812021","country":"http://sws.geonames.org/2802361/","latitude":"50.87943","longitude":"4.348513","name":"Bockstael"},{"@id":"http://irail.be/stations/NMBS/008812047","country":"http://sws.geonames.org/2802361/","latitude":"50.880833","longitude":"4.32622","name":"Jette"},{"@id":"http://irail.be/stations/NMBS/008812062","country":"http://sws.geonames.org/2802361/","latitude":"50.890028","longitude":"4.274541","name":"Zellik"},{"@id":"http://irail.be/stations/NMBS/008812070","country":"http://sws.geonames.org/2802361/","latitude":"50.906488","longitude":"4.207985","name":"Asse"},{"@id":"http://irail.be/stations/NMBS/008812112","country":"http://sws.geonames.org/2802361/","latitude":"50.933473","longitude":"4.216965","name":"Mollem"},{"@id":"http://irail.be/stations/NMBS/008812120","country":"http://sws.geonames.org/2802361/","latitude":"50.954958","longitude":"4.222718","name":"Merchtem"},{"@id":"http://irail.be/stations/NMBS/008812146","country":"http://sws.geonames.org/2802361/","latitude":"50.974779","longitude":"4.187319","name":"Opwijk"},{"@id":"http://irail.be/stations/NMBS/008812153","country":"http://sws.geonames.org/2802361/","latitude":"50.989593","longitude":"4.156171","name":"Heizijde"},{"@id":"http://irail.be/stations/NMBS/008812161","country":"http://sws.geonames.org/2802361/","latitude":"51.005009","longitude":"4.134372","name":"Lebbeke"},{"@id":"http://irail.be/stations/NMBS/008812211","alternative":[{"@language":"fr","@value":"Berchem-Sainte-Agathe"},{"@language":"nl","@value":"Sint-Agatha-Berchem"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.872625","longitude":"4.289895","name":"Sint-Agatha-Berchem/Berchem-Sainte-Agathe"},{"@id":"http://irail.be/stations/NMBS/008812229","alternative":[{"@language":"fr","@value":"Grand-Bigard"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.868337","longitude":"4.273543","name":"Groot-Bijgaarden"},{"@id":"http://irail.be/stations/NMBS/008812237","country":"http://sws.geonames.org/2802361/","latitude":"50.866728","longitude":"4.243393","name":"Dilbeek"},{"@id":"http://irail.be/stations/NMBS/008812245","alternative":[{"@language":"fr","@value":"Bodeghem-Saint-Martin"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.86716","longitude":"4.205081","name":"Sint-Martens-Bodegem"},{"@id":"http://irail.be/stations/NMBS/008812252","country":"http://sws.geonames.org/2802361/","latitude":"50.874522","longitude":"4.16534","name":"Ternat"},{"@id":"http://irail.be/stations/NMBS/008812260","country":"http://sws.geonames.org/2802361/","latitude":"50.882451","longitude":"4.115171","name":"Essene-Lombeek"},{"@id":"http://irail.be/stations/NMBS/008813003","alternative":[{"@language":"en","@value":"Brussels-Central"},{"@language":"fr","@value":"Bruxelles-Central"},{"@language":"nl","@value":"Brussel-Centraal"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.845658","longitude":"4.356801","name":"Brussel-Centraal/Bruxelles-Central"},{"@id":"http://irail.be/stations/NMBS/008813037","alternative":[{"@language":"en","@value":"Brussels-Chapelle/Brussels-Kapellekerk"},{"@language":"fr","@value":"Bruxelles-Chapelle"},{"@language":"nl","@value":"Brussel-Kapellekerk"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.841127","longitude":"4.347866","name":"Brussel-Kapellekerk/Bruxelles-Chapelle"},{"@id":"http://irail.be/stations/NMBS/008813045","alternative":[{"@language":"en","@value":"Brussels-Congres"},{"@language":"fr","@value":"Bruxelles-Congrès"},{"@language":"nl","@value":"Brussel-Congres"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.852067","longitude":"4.362051","name":"Brussel-Congres/Bruxelles-Congrès"},{"@id":"http://irail.be/stations/NMBS/008814001","alternative":[{"@language":"en","@value":"Brussels-South/Brussels-Midi"},{"@language":"fr","@value":"Bruxelles-Midi"},{"@language":"nl","@value":"Brussel-Zuid"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.835707","longitude":"4.336531","name":"Brussel-Zuid/Bruxelles-Midi"},{"@id":"http://irail.be/stations/NMBS/008814118","alternative":[{"@language":"fr","@value":"Forest-Est"},{"@language":"nl","@value":"Vorst-Oost"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.810195","longitude":"4.320943","name":"Vorst-Oost/Forest-Est"},{"@id":"http://irail.be/stations/NMBS/008814126","alternative":[{"@language":"fr","@value":"Uccle-Stalle"},{"@language":"nl","@value":"Ukkel-Stalle"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.802411","longitude":"4.323901","name":"Ukkel-Stalle/Uccle-Stalle"},{"@id":"http://irail.be/stations/NMBS/008814134","alternative":[{"@language":"fr","@value":"Uccle-Calevoet"},{"@language":"nl","@value":"Ukkel-Kalevoet"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.791749","longitude":"4.332207","name":"Ukkel-Kalevoet/Uccle-Calevoet"},{"@id":"http://irail.be/stations/NMBS/008814142","country":"http://sws.geonames.org/2802361/","latitude":"50.773681","longitude":"4.339434","name":"Linkebeek"},{"@id":"http://irail.be/stations/NMBS/008814159","country":"http://sws.geonames.org/2802361/","latitude":"50.767631","longitude":"4.353952","name":"Holleken"},{"@id":"http://irail.be/stations/NMBS/008814167","alternative":[{"@language":"fr","@value":"Rhode-Saint-Genèse"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.74781","longitude":"4.361997","name":"Sint-Genesius-Rode"},{"@id":"http://irail.be/stations/NMBS/008814175","country":"http://sws.geonames.org/2802361/","latitude":"50.738812","longitude":"4.370717","name":"De Hoek"},{"@id":"http://irail.be/stations/NMBS/008814209","alternative":[{"@language":"nl","@value":"Nijvel"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.599641","longitude":"4.335065","name":"Nivelles"},{"@id":"http://irail.be/stations/NMBS/008814241","country":"http://sws.geonames.org/2802361/","latitude":"50.645423","longitude":"4.365368","name":"Lillois"},{"@id":"http://irail.be/stations/NMBS/008814258","alternative":[{"@language":"nl","@value":"Eigenbrakel"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.684778","longitude":"4.375526","name":"Braine-l'Alleud"},{"@id":"http://irail.be/stations/NMBS/008814266","country":"http://sws.geonames.org/2802361/","latitude":"50.715422","longitude":"4.383481","name":"Waterloo"},{"@id":"http://irail.be/stations/NMBS/008814308","alternative":[{"@language":"fr","@value":"Hal"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.733931","longitude":"4.240634","name":"Halle"},{"@id":"http://irail.be/stations/NMBS/008814332","country":"http://sws.geonames.org/2802361/","latitude":"50.715107","longitude":"4.221577","name":"Lembeek"},{"@id":"http://irail.be/stations/NMBS/008814340","country":"http://sws.geonames.org/2802361/","latitude":"50.751577","longitude":"4.258558","name":"Buizingen"},{"@id":"http://irail.be/stations/NMBS/008814357","country":"http://sws.geonames.org/2802361/","latitude":"50.766364","longitude":"4.273696","name":"Lot"},{"@id":"http://irail.be/stations/NMBS/008814365","country":"http://sws.geonames.org/2802361/","latitude":"50.79183","longitude":"4.295333","name":"Ruisbroek"},{"@id":"http://irail.be/stations/NMBS/008814373","alternative":[{"@language":"fr","@value":"Forest-Midi"},{"@language":"nl","@value":"Vorst-Zuid"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.809215","longitude":"4.309167","name":"Vorst-Zuid/Forest-Midi"},{"@id":"http://irail.be/stations/NMBS/008814415","country":"http://sws.geonames.org/2802361/","latitude":"50.7519","longitude":"4.266487","name":"Huizingen"},{"@id":"http://irail.be/stations/NMBS/008814423","country":"http://sws.geonames.org/2802361/","latitude":"50.766616","longitude":"4.302605","name":"Beersel"},{"@id":"http://irail.be/stations/NMBS/008814431","country":"http://sws.geonames.org/2802361/","latitude":"50.77832","longitude":"4.330733","name":"Moensberg"},{"@id":"http://irail.be/stations/NMBS/008814449","alternative":[{"@language":"fr","@value":"Saint-Job"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.79441","longitude":"4.362761","name":"Sint-Job"},{"@id":"http://irail.be/stations/NMBS/008814456","alternative":[{"@language":"fr","@value":"Boondael"},{"@language":"nl","@value":"Boondaal"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.801665","longitude":"4.393387","name":"Boondaal/Boondael"},{"@id":"http://irail.be/stations/NMBS/008814464","alternative":[{"@language":"fr","@value":"Vivier d'Oie"},{"@language":"nl","@value":"Diesdelle"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.796145","longitude":"4.374052","name":"Diesdelle/Vivier d'Oie"},{"@id":"http://irail.be/stations/NMBS/008815040","alternative":[{"@language":"en","@value":"Brussels-West"},{"@language":"fr","@value":"Bruxelles-Ouest"},{"@language":"nl","@value":"Brussel-West"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.848552","longitude":"4.321042","name":"Brussel-West/Bruxelles-Ouest"},{"@id":"http://irail.be/stations/NMBS/008819406","alternative":[{"@language":"en","@value":"Brussels-Airport"},{"@language":"fr","@value":"Bruxelles-Nat-Aéroport"},{"@language":"nl","@value":"Brussel-Nat-Luchthaven"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.896456","longitude":"4.482075","name":"Brussel-Nat-Luchthaven/Bruxelles-Nat-Aéroport"},{"@id":"http://irail.be/stations/NMBS/008821006","alternative":[{"@language":"en","@value":"Antwerp-Central"},{"@language":"fr","@value":"Anvers-Central"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.2172","longitude":"4.421101","name":"Antwerpen-Centraal"},{"@id":"http://irail.be/stations/NMBS/008821022","alternative":[{"@language":"en","@value":"Antwerp-East"},{"@language":"fr","@value":"Anvers-Est"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.207357","longitude":"4.436392","name":"Antwerpen-Oost"},{"@id":"http://irail.be/stations/NMBS/008821048","alternative":[{"@language":"en","@value":"Antwerp-Haven"},{"@language":"fr","@value":"Anvers-Haven"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.289968","longitude":"4.379086","name":"Antwerpen-Haven"},{"@id":"http://irail.be/stations/NMBS/008821063","alternative":[{"@language":"en","@value":"Antwerp-Luchtbal"},{"@language":"fr","@value":"Anvers-Luchtbal"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.244132","longitude":"4.425029","name":"Antwerpen-Luchtbal"},{"@id":"http://irail.be/stations/NMBS/008821071","country":"http://sws.geonames.org/2802361/","latitude":"51.281626","longitude":"4.434154","name":"Ekeren"},{"@id":"http://irail.be/stations/NMBS/008821089","alternative":[{"@language":"en","@value":"Antwerp-Noorderdokken"},{"@language":"fr","@value":"Anvers-Noorderdokken"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.261643","longitude":"4.427906","name":"Antwerpen-Noorderdokken"},{"@id":"http://irail.be/stations/NMBS/008821105","country":"http://sws.geonames.org/2802361/","latitude":"51.356838","longitude":"4.632204","name":"Noorderkempen"},{"@id":"http://irail.be/stations/NMBS/008821121","alternative":[{"@language":"en","@value":"Antwerp-Berchem"},{"@language":"fr","@value":"Anvers-Berchem"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.19923","longitude":"4.432221","name":"Antwerpen-Berchem"},{"@id":"http://irail.be/stations/NMBS/008821147","country":"http://sws.geonames.org/2802361/","latitude":"51.18296","longitude":"4.448437","name":"Mortsel"},{"@id":"http://irail.be/stations/NMBS/008821154","country":"http://sws.geonames.org/2802361/","latitude":"51.183023","longitude":"4.446514","name":"Mortsel-Deurnesteenweg"},{"@id":"http://irail.be/stations/NMBS/008821196","alternative":[{"@language":"en","@value":"Antwerp-South"},{"@language":"fr","@value":"Anvers-Sud"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.197828","longitude":"4.390259","name":"Antwerpen-Zuid"},{"@id":"http://irail.be/stations/NMBS/008821238","country":"http://sws.geonames.org/2802361/","latitude":"51.171256","longitude":"4.455737","name":"Mortsel-Oude God"},{"@id":"http://irail.be/stations/NMBS/008821246","country":"http://sws.geonames.org/2802361/","latitude":"51.169027","longitude":"4.468843","name":"Mortsel-Liersesteenweg"},{"@id":"http://irail.be/stations/NMBS/008821311","country":"http://sws.geonames.org/2802361/","latitude":"51.134023","longitude":"4.476358","name":"Kontich"},{"@id":"http://irail.be/stations/NMBS/008821337","country":"http://sws.geonames.org/2802361/","latitude":"51.154114","longitude":"4.465157","name":"Hove"},{"@id":"http://irail.be/stations/NMBS/008821402","country":"http://sws.geonames.org/2802361/","latitude":"51.462767","longitude":"4.451314","name":"Essen"},{"@id":"http://irail.be/stations/NMBS/008821436","country":"http://sws.geonames.org/2802361/","latitude":"51.428087","longitude":"4.46335","name":"Wildert"},{"@id":"http://irail.be/stations/NMBS/008821444","country":"http://sws.geonames.org/2802361/","latitude":"51.391177","longitude":"4.46682","name":"Kalmthout"},{"@id":"http://irail.be/stations/NMBS/008821451","country":"http://sws.geonames.org/2802361/","latitude":"51.378664","longitude":"4.467315","name":"Kijkuit"},{"@id":"http://irail.be/stations/NMBS/008821519","country":"http://sws.geonames.org/2802361/","latitude":"51.364623","longitude":"4.460483","name":"Heide"},{"@id":"http://irail.be/stations/NMBS/008821535","country":"http://sws.geonames.org/2802361/","latitude":"51.313528","longitude":"4.432661","name":"Kapellen"},{"@id":"http://irail.be/stations/NMBS/008821543","country":"http://sws.geonames.org/2802361/","latitude":"51.291658","longitude":"4.4349","name":"Sint-Mariaburg"},{"@id":"http://irail.be/stations/NMBS/008821600","alternative":[{"@language":"fr","@value":"Lierre"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.135758","longitude":"4.560614","name":"Lier"},{"@id":"http://irail.be/stations/NMBS/008821634","country":"http://sws.geonames.org/2802361/","latitude":"51.16348","longitude":"4.494489","name":"Boechout"},{"@id":"http://irail.be/stations/NMBS/008821659","country":"http://sws.geonames.org/2802361/","latitude":"51.151057","longitude":"4.618459","name":"Kessel"},{"@id":"http://irail.be/stations/NMBS/008821667","country":"http://sws.geonames.org/2802361/","latitude":"51.15984","longitude":"4.666588","name":"Nijlen"},{"@id":"http://irail.be/stations/NMBS/008821709","country":"http://sws.geonames.org/2802361/","latitude":"51.168361","longitude":"4.786144","name":"Wolfstee"},{"@id":"http://irail.be/stations/NMBS/008821717","country":"http://sws.geonames.org/2802361/","latitude":"51.181513","longitude":"4.829535","name":"Herentals"},{"@id":"http://irail.be/stations/NMBS/008821725","country":"http://sws.geonames.org/2802361/","latitude":"51.165764","longitude":"4.746511","name":"Bouwel"},{"@id":"http://irail.be/stations/NMBS/008821816","country":"http://sws.geonames.org/2802361/","latitude":"51.113662","longitude":"4.638811","name":"Berlaar"},{"@id":"http://irail.be/stations/NMBS/008821824","country":"http://sws.geonames.org/2802361/","latitude":"51.094938","longitude":"4.671532","name":"Melkouwen"},{"@id":"http://irail.be/stations/NMBS/008821832","country":"http://sws.geonames.org/2802361/","latitude":"51.074146","longitude":"4.708235","name":"Heist-op-den-Berg"},{"@id":"http://irail.be/stations/NMBS/008821857","country":"http://sws.geonames.org/2802361/","latitude":"51.037344","longitude":"4.773478","name":"Booischot"},{"@id":"http://irail.be/stations/NMBS/008821865","country":"http://sws.geonames.org/2802361/","latitude":"51.021972","longitude":"4.800338","name":"Begijnendijk"},{"@id":"http://irail.be/stations/NMBS/008821907","country":"http://sws.geonames.org/2802361/","latitude":"51.322032","longitude":"4.937415","name":"Turnhout"},{"@id":"http://irail.be/stations/NMBS/008821964","country":"http://sws.geonames.org/2802361/","latitude":"51.241021","longitude":"4.893089","name":"Tielen"},{"@id":"http://irail.be/stations/NMBS/008822004","alternative":[{"@language":"fr","@value":"Malines"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.017648","longitude":"4.482785","name":"Mechelen"},{"@id":"http://irail.be/stations/NMBS/008822053","country":"http://sws.geonames.org/2802361/","latitude":"51.010843","longitude":"4.359121","name":"Kapelle-op-den-Bos"},{"@id":"http://irail.be/stations/NMBS/008822111","country":"http://sws.geonames.org/2802361/","latitude":"51.009091","longitude":"4.299073","name":"Londerzeel"},{"@id":"http://irail.be/stations/NMBS/008822137","country":"http://sws.geonames.org/2802361/","latitude":"51.014484","longitude":"4.22911","name":"Malderen"},{"@id":"http://irail.be/stations/NMBS/008822145","country":"http://sws.geonames.org/2802361/","latitude":"51.016291","longitude":"4.201666","name":"Buggenhout"},{"@id":"http://irail.be/stations/NMBS/008822160","alternative":[{"@language":"fr","@value":"Baesrode-Sud"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.019437","longitude":"4.153492","name":"Baasrode-Zuid"},{"@id":"http://irail.be/stations/NMBS/008822210","country":"http://sws.geonames.org/2802361/","latitude":"51.091243","longitude":"4.493186","name":"Duffel"},{"@id":"http://irail.be/stations/NMBS/008822228","alternative":[{"@language":"fr","@value":"Wavre-Sainte-Catherine"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.069975","longitude":"4.496116","name":"Sint-Katelijne-Waver"},{"@id":"http://irail.be/stations/NMBS/008822251","country":"http://sws.geonames.org/2802361/","latitude":"50.977449","longitude":"4.470937","name":"Weerde"},{"@id":"http://irail.be/stations/NMBS/008822269","country":"http://sws.geonames.org/2802361/","latitude":"50.9584","longitude":"4.45749","name":"Eppegem"},{"@id":"http://irail.be/stations/NMBS/008822277","country":"http://sws.geonames.org/2802361/","latitude":"50.988658","longitude":"4.498336","name":"Hofstade"},{"@id":"http://irail.be/stations/NMBS/008822343","alternative":[{"@language":"fr","@value":"Malines-Nekkerspoel"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.029883","longitude":"4.489914","name":"Mechelen-Nekkerspoel"},{"@id":"http://irail.be/stations/NMBS/008822426","country":"http://sws.geonames.org/2802361/","latitude":"51.008201","longitude":"4.513843","name":"Muizen"},{"@id":"http://irail.be/stations/NMBS/008822459","country":"http://sws.geonames.org/2802361/","latitude":"50.997791","longitude":"4.537637","name":"Hever"},{"@id":"http://irail.be/stations/NMBS/008822475","country":"http://sws.geonames.org/2802361/","latitude":"50.981853","longitude":"4.5739","name":"Boortmeerbeek"},{"@id":"http://irail.be/stations/NMBS/008822517","country":"http://sws.geonames.org/2802361/","latitude":"50.966428","longitude":"4.613309","name":"Haacht"},{"@id":"http://irail.be/stations/NMBS/008822525","country":"http://sws.geonames.org/2802361/","latitude":"50.958544","longitude":"4.638011","name":"Wespelaar-Tildonk"},{"@id":"http://irail.be/stations/NMBS/008822533","country":"http://sws.geonames.org/2802361/","latitude":"50.944251","longitude":"4.66301","name":"Hambos"},{"@id":"http://irail.be/stations/NMBS/008822608","country":"http://sws.geonames.org/2802361/","latitude":"51.066343","longitude":"4.356019","name":"Willebroek"},{"@id":"http://irail.be/stations/NMBS/008822715","country":"http://sws.geonames.org/2802361/","latitude":"51.07722","longitude":"4.282703","name":"Puurs"},{"@id":"http://irail.be/stations/NMBS/008822772","country":"http://sws.geonames.org/2802361/","latitude":"51.099225","longitude":"4.240526","name":"Bornem"},{"@id":"http://irail.be/stations/NMBS/008822814","country":"http://sws.geonames.org/2802361/","latitude":"51.090713","longitude":"4.360694","name":"Boom"},{"@id":"http://irail.be/stations/NMBS/008822848","country":"http://sws.geonames.org/2802361/","latitude":"51.081022","longitude":"4.324998","name":"Ruisbroek-Sauvegarde"},{"@id":"http://irail.be/stations/NMBS/008824158","country":"http://sws.geonames.org/2802361/","latitude":"51.182699","longitude":"4.347785","name":"Hoboken-Polder"},{"@id":"http://irail.be/stations/NMBS/008824224","country":"http://sws.geonames.org/2802361/","latitude":"51.136243","longitude":"4.338293","name":"Hemiksem"},{"@id":"http://irail.be/stations/NMBS/008824232","country":"http://sws.geonames.org/2802361/","latitude":"51.12551","longitude":"4.340261","name":"Schelle"},{"@id":"http://irail.be/stations/NMBS/008824240","country":"http://sws.geonames.org/2802361/","latitude":"51.111595","longitude":"4.338589","name":"Niel"},{"@id":"http://irail.be/stations/NMBS/008831005","country":"http://sws.geonames.org/2802361/","latitude":"50.930822","longitude":"5.327627","name":"Hasselt"},{"@id":"http://irail.be/stations/NMBS/008831039","country":"http://sws.geonames.org/2802361/","latitude":"50.886837","longitude":"5.292866","name":"Alken"},{"@id":"http://irail.be/stations/NMBS/008831088","country":"http://sws.geonames.org/2802361/","latitude":"50.963758","longitude":"5.187405","name":"Schulen"},{"@id":"http://irail.be/stations/NMBS/008831112","country":"http://sws.geonames.org/2802361/","latitude":"50.910452","longitude":"5.419947","name":"Diepenbeek"},{"@id":"http://irail.be/stations/NMBS/008831138","country":"http://sws.geonames.org/2802361/","latitude":"50.868643","longitude":"5.50938","name":"Bilzen"},{"@id":"http://irail.be/stations/NMBS/008831310","alternative":[{"@language":"fr","@value":"Tongres"},{"@language":"de","@value":"Tongern"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.784405","longitude":"5.47328","name":"Tongeren"},{"@id":"http://irail.be/stations/NMBS/008831401","country":"http://sws.geonames.org/2802361/","latitude":"50.993341","longitude":"5.050031","name":"Diest"},{"@id":"http://irail.be/stations/NMBS/008831765","country":"http://sws.geonames.org/2802361/","latitude":"50.967057","longitude":"5.497685","name":"Genk"},{"@id":"http://irail.be/stations/NMBS/008831781","country":"http://sws.geonames.org/2802361/","latitude":"50.955812","longitude":"5.408386","name":"Bokrijk"},{"@id":"http://irail.be/stations/NMBS/008831807","alternative":[{"@language":"fr","@value":"Saint-Trond"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.81762","longitude":"5.176654","name":"Sint-Truiden"},{"@id":"http://irail.be/stations/NMBS/008832003","alternative":[{"@language":"fr","@value":"Bourg-Léopold"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.117312","longitude":"5.257287","name":"Leopoldsburg"},{"@id":"http://irail.be/stations/NMBS/008832045","alternative":[{"@language":"fr","@value":"Baelen"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.169099","longitude":"5.164986","name":"Balen"},{"@id":"http://irail.be/stations/NMBS/008832227","country":"http://sws.geonames.org/2802361/","latitude":"51.087719","longitude":"5.234373","name":"Beverlo"},{"@id":"http://irail.be/stations/NMBS/008832235","country":"http://sws.geonames.org/2802361/","latitude":"51.050603","longitude":"5.235892","name":"Beringen"},{"@id":"http://irail.be/stations/NMBS/008832243","country":"http://sws.geonames.org/2802361/","latitude":"51.038207","longitude":"5.281782","name":"Heusden"},{"@id":"http://irail.be/stations/NMBS/008832250","country":"http://sws.geonames.org/2802361/","latitude":"51.033548","longitude":"5.3299","name":"Zolder"},{"@id":"http://irail.be/stations/NMBS/008832334","country":"http://sws.geonames.org/2802361/","latitude":"50.989557","longitude":"5.348815","name":"Zonhoven"},{"@id":"http://irail.be/stations/NMBS/008832375","country":"http://sws.geonames.org/2802361/","latitude":"50.954841","longitude":"5.350226","name":"Kiewit"},{"@id":"http://irail.be/stations/NMBS/008832409","country":"http://sws.geonames.org/2802361/","latitude":"51.19105","longitude":"5.116336","name":"Mol"},{"@id":"http://irail.be/stations/NMBS/008832433","country":"http://sws.geonames.org/2802361/","latitude":"51.168955","longitude":"4.988608","name":"Geel"},{"@id":"http://irail.be/stations/NMBS/008832458","country":"http://sws.geonames.org/2802361/","latitude":"51.188057","longitude":"4.847585","name":"Olen"},{"@id":"http://irail.be/stations/NMBS/008832565","country":"http://sws.geonames.org/2802361/","latitude":"51.211564","longitude":"5.312031","name":"Lommel"},{"@id":"http://irail.be/stations/NMBS/008832573","country":"http://sws.geonames.org/2802361/","latitude":"51.215618","longitude":"5.422751","name":"Overpelt"},{"@id":"http://irail.be/stations/NMBS/008832615","country":"http://sws.geonames.org/2802361/","latitude":"51.222369","longitude":"5.43717","name":"Neerpelt"},{"@id":"http://irail.be/stations/NMBS/008832664","country":"http://sws.geonames.org/2802361/","latitude":"51.246424","longitude":"5.543279","name":"Hamont"},{"@id":"http://irail.be/stations/NMBS/008833001","alternative":[{"@language":"fr","@value":"Louvain"},{"@language":"de","@value":"Löwen"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.88228","longitude":"4.715866","name":"Leuven"},{"@id":"http://irail.be/stations/NMBS/008833050","country":"http://sws.geonames.org/2802361/","latitude":"50.836282","longitude":"4.835522","name":"Vertrijk"},{"@id":"http://irail.be/stations/NMBS/008833126","country":"http://sws.geonames.org/2802361/","latitude":"50.86253","longitude":"4.6952","name":"Heverlee"},{"@id":"http://irail.be/stations/NMBS/008833134","country":"http://sws.geonames.org/2802361/","latitude":"50.835931","longitude":"4.653311","name":"Oud-Heverlee"},{"@id":"http://irail.be/stations/NMBS/008833159","country":"http://sws.geonames.org/2802361/","latitude":"50.800631","longitude":"4.651728","name":"Sint-Joris-Weert"},{"@id":"http://irail.be/stations/NMBS/008833175","country":"http://sws.geonames.org/2802361/","latitude":"50.92274","longitude":"4.701475","name":"Wijgmaal"},{"@id":"http://irail.be/stations/NMBS/008833209","country":"http://sws.geonames.org/2802361/","latitude":"50.984406","longitude":"4.824043","name":"Aarschot"},{"@id":"http://irail.be/stations/NMBS/008833233","country":"http://sws.geonames.org/2802361/","latitude":"50.956261","longitude":"4.747679","name":"Wezemaal"},{"@id":"http://irail.be/stations/NMBS/008833258","country":"http://sws.geonames.org/2802361/","latitude":"51.002466","longitude":"4.863541","name":"Langdorp"},{"@id":"http://irail.be/stations/NMBS/008833266","country":"http://sws.geonames.org/2802361/","latitude":"51.009864","longitude":"4.945829","name":"Testelt"},{"@id":"http://irail.be/stations/NMBS/008833274","country":"http://sws.geonames.org/2802361/","latitude":"51.00669","longitude":"4.987359","name":"Zichem"},{"@id":"http://irail.be/stations/NMBS/008833308","alternative":[{"@language":"fr","@value":"Tirlemont"},{"@language":"de","@value":"Thienen"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.80802","longitude":"4.92581","name":"Tienen"},{"@id":"http://irail.be/stations/NMBS/008833449","country":"http://sws.geonames.org/2802361/","latitude":"50.772126","longitude":"4.994217","name":"Ezemaal"},{"@id":"http://irail.be/stations/NMBS/008833605","country":"http://sws.geonames.org/2802361/","latitude":"50.747927","longitude":"5.07966","name":"Landen"},{"@id":"http://irail.be/stations/NMBS/008833670","country":"http://sws.geonames.org/2802361/","latitude":"50.763964","longitude":"5.036323","name":"Neerwinden"},{"@id":"http://irail.be/stations/NMBS/008841004","alternative":[{"@language":"nl","@value":"Luik-Guillemins"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.62455","longitude":"5.566695","name":"Liège-Guillemins"},{"@id":"http://irail.be/stations/NMBS/008841202","country":"http://sws.geonames.org/2802361/","latitude":"50.661208","longitude":"5.509704","name":"Ans"},{"@id":"http://irail.be/stations/NMBS/008841319","country":"http://sws.geonames.org/2802361/","latitude":"50.65861","longitude":"5.460551","name":"Bierset-Awans"},{"@id":"http://irail.be/stations/NMBS/008841327","country":"http://sws.geonames.org/2802361/","latitude":"50.66181","longitude":"5.429556","name":"Voroux"},{"@id":"http://irail.be/stations/NMBS/008841400","alternative":[{"@language":"nl","@value":"Borgworm"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.694549","longitude":"5.249475","name":"Waremme"},{"@id":"http://irail.be/stations/NMBS/008841434","country":"http://sws.geonames.org/2802361/","latitude":"50.685065","longitude":"5.286394","name":"Bleret"},{"@id":"http://irail.be/stations/NMBS/008841442","country":"http://sws.geonames.org/2802361/","latitude":"50.678611","longitude":"5.321407","name":"Remicourt"},{"@id":"http://irail.be/stations/NMBS/008841459","country":"http://sws.geonames.org/2802361/","latitude":"50.66991","longitude":"5.367602","name":"Momalle"},{"@id":"http://irail.be/stations/NMBS/008841467","country":"http://sws.geonames.org/2802361/","latitude":"50.664049","longitude":"5.398453","name":"Fexhe-le-Haut-Clocher"},{"@id":"http://irail.be/stations/NMBS/008841525","alternative":[{"@language":"nl","@value":"Luik-Paleis"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.646349","longitude":"5.570453","name":"Liège-Palais"},{"@id":"http://irail.be/stations/NMBS/008841558","alternative":[{"@language":"nl","@value":"Luik-Jonfosse"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.640299","longitude":"5.561131","name":"Liège-Jonfosse"},{"@id":"http://irail.be/stations/NMBS/008841608","country":"http://sws.geonames.org/2802361/","latitude":"50.660911","longitude":"5.622761","name":"Herstal"},{"@id":"http://irail.be/stations/NMBS/008841665","country":"http://sws.geonames.org/2802361/","latitude":"50.692455","longitude":"5.60009","name":"Milmort"},{"@id":"http://irail.be/stations/NMBS/008841673","country":"http://sws.geonames.org/2802361/","latitude":"50.698181","longitude":"5.56683","name":"Liers"},{"@id":"http://irail.be/stations/NMBS/008841731","alternative":[{"@language":"nl","@value":"Glaaien"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.750426","longitude":"5.535431","name":"Glons"},{"@id":"http://irail.be/stations/NMBS/008842002","country":"http://sws.geonames.org/2802361/","latitude":"50.613152","longitude":"5.599695","name":"Angleur"},{"@id":"http://irail.be/stations/NMBS/008842036","country":"http://sws.geonames.org/2802361/","latitude":"50.608019","longitude":"5.616073","name":"Chênée"},{"@id":"http://irail.be/stations/NMBS/008842630","country":"http://sws.geonames.org/2802361/","latitude":"50.570624","longitude":"5.583937","name":"Tilff"},{"@id":"http://irail.be/stations/NMBS/008842648","country":"http://sws.geonames.org/2802361/","latitude":"50.54762","longitude":"5.587236","name":"Méry"},{"@id":"http://irail.be/stations/NMBS/008842655","country":"http://sws.geonames.org/2802361/","latitude":"50.539917","longitude":"5.573563","name":"Hony"},{"@id":"http://irail.be/stations/NMBS/008842663","country":"http://sws.geonames.org/2802361/","latitude":"50.530568","longitude":"5.572565","name":"Esneux"},{"@id":"http://irail.be/stations/NMBS/008842689","country":"http://sws.geonames.org/2802361/","latitude":"50.509209","longitude":"5.578858","name":"Poulseur"},{"@id":"http://irail.be/stations/NMBS/008842705","country":"http://sws.geonames.org/2802361/","latitude":"50.483285","longitude":"5.587631","name":"Rivage"},{"@id":"http://irail.be/stations/NMBS/008842754","country":"http://sws.geonames.org/2802361/","latitude":"50.472938","longitude":"5.672499","name":"Aywaille"},{"@id":"http://irail.be/stations/NMBS/008842838","country":"http://sws.geonames.org/2802361/","latitude":"50.456865","longitude":"5.566956","name":"Comblain-la-Tour"},{"@id":"http://irail.be/stations/NMBS/008842846","country":"http://sws.geonames.org/2802361/","latitude":"50.428181","longitude":"5.533561","name":"Hamoir"},{"@id":"http://irail.be/stations/NMBS/008842853","country":"http://sws.geonames.org/2802361/","latitude":"50.403254","longitude":"5.523565","name":"Sy"},{"@id":"http://irail.be/stations/NMBS/008843133","country":"http://sws.geonames.org/2802361/","latitude":"50.609844","longitude":"5.558911","name":"Sclessin"},{"@id":"http://irail.be/stations/NMBS/008843141","country":"http://sws.geonames.org/2802361/","latitude":"50.619651","longitude":"5.510162","name":"Pont-de-Seraing"},{"@id":"http://irail.be/stations/NMBS/008843158","country":"http://sws.geonames.org/2802361/","latitude":"50.618446","longitude":"5.497874","name":"Jemeppe-sur-Meuse"},{"@id":"http://irail.be/stations/NMBS/008843166","country":"http://sws.geonames.org/2802361/","latitude":"50.605349","longitude":"5.480983","name":"Flemalle-Grande"},{"@id":"http://irail.be/stations/NMBS/008843208","country":"http://sws.geonames.org/2802361/","latitude":"50.595308","longitude":"5.457656","name":"Flemalle-Haute"},{"@id":"http://irail.be/stations/NMBS/008843224","country":"http://sws.geonames.org/2802361/","latitude":"50.600396","longitude":"5.468309","name":"Leman"},{"@id":"http://irail.be/stations/NMBS/008843240","country":"http://sws.geonames.org/2802361/","latitude":"50.582957","longitude":"5.401986","name":"Engis"},{"@id":"http://irail.be/stations/NMBS/008843307","alternative":[{"@language":"nl","@value":"Hoei"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.527242","longitude":"5.234211","name":"Huy"},{"@id":"http://irail.be/stations/NMBS/008843323","country":"http://sws.geonames.org/2802361/","latitude":"50.539215","longitude":"5.289729","name":"Ampsin"},{"@id":"http://irail.be/stations/NMBS/008843331","country":"http://sws.geonames.org/2802361/","latitude":"50.546011","longitude":"5.32049","name":"Amay"},{"@id":"http://irail.be/stations/NMBS/008843349","country":"http://sws.geonames.org/2802361/","latitude":"50.55349","longitude":"5.330333","name":"Haute-Flône"},{"@id":"http://irail.be/stations/NMBS/008843406","country":"http://sws.geonames.org/2802361/","latitude":"50.528276","longitude":"5.219676","name":"Statte"},{"@id":"http://irail.be/stations/NMBS/008843430","country":"http://sws.geonames.org/2802361/","latitude":"50.52263","longitude":"5.190937","name":"Bas-Oha"},{"@id":"http://irail.be/stations/NMBS/008843901","country":"http://sws.geonames.org/2802361/","latitude":"50.643967","longitude":"5.611057","name":"Bressoux"},{"@id":"http://irail.be/stations/NMBS/008844008","alternative":[{"@language":"nl","@value":"Verviers-Centraal"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.588135","longitude":"5.854917","name":"Verviers-Central"},{"@id":"http://irail.be/stations/NMBS/008844057","alternative":[{"@language":"nl","@value":"Verviers-Paleis"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.590921","longitude":"5.865335","name":"Verviers-Palais"},{"@id":"http://irail.be/stations/NMBS/008844206","country":"http://sws.geonames.org/2802361/","latitude":"50.568179","longitude":"5.80615","name":"Pepinster"},{"@id":"http://irail.be/stations/NMBS/008844230","country":"http://sws.geonames.org/2802361/","latitude":"50.572089","longitude":"5.741581","name":"Nessonvaux"},{"@id":"http://irail.be/stations/NMBS/008844255","country":"http://sws.geonames.org/2802361/","latitude":"50.565059","longitude":"5.723665","name":"Fraipont"},{"@id":"http://irail.be/stations/NMBS/008844271","country":"http://sws.geonames.org/2802361/","latitude":"50.573213","longitude":"5.688346","name":"Trooz"},{"@id":"http://irail.be/stations/NMBS/008844313","country":"http://sws.geonames.org/2802361/","latitude":"50.563405","longitude":"5.804397","name":"Pepinster-Cité"},{"@id":"http://irail.be/stations/NMBS/008844321","country":"http://sws.geonames.org/2802361/","latitude":"50.544717","longitude":"5.809935","name":"Juslenville"},{"@id":"http://irail.be/stations/NMBS/008844339","country":"http://sws.geonames.org/2802361/","latitude":"50.536159","longitude":"5.815031","name":"Theux"},{"@id":"http://irail.be/stations/NMBS/008844347","country":"http://sws.geonames.org/2802361/","latitude":"50.525723","longitude":"5.822223","name":"Franchimont"},{"@id":"http://irail.be/stations/NMBS/008844404","country":"http://sws.geonames.org/2802361/","latitude":"50.490305","longitude":"5.855096","name":"Spa"},{"@id":"http://irail.be/stations/NMBS/008844420","country":"http://sws.geonames.org/2802361/","latitude":"50.489307","longitude":"5.866207","name":"Spa-Géronstère"},{"@id":"http://irail.be/stations/NMBS/008844503","country":"http://sws.geonames.org/2802361/","latitude":"50.659707","longitude":"5.975381","name":"Welkenraedt"},{"@id":"http://irail.be/stations/NMBS/008844545","country":"http://sws.geonames.org/2802361/","latitude":"50.616244","longitude":"5.936494","name":"Dolhain-Gileppe"},{"@id":"http://irail.be/stations/NMBS/008844628","country":"http://sws.geonames.org/2802361/","latitude":"50.635157","longitude":"6.03711","name":"Eupen"},{"@id":"http://irail.be/stations/NMBS/008844644","country":"http://sws.geonames.org/2802361/","latitude":"50.718209","longitude":"6.041335","name":"Hergenrath"},{"@id":"http://irail.be/stations/NMBS/008845005","country":"http://sws.geonames.org/2802361/","latitude":"50.189409","longitude":"5.953906","name":"Gouvy"},{"@id":"http://irail.be/stations/NMBS/008845146","country":"http://sws.geonames.org/2802361/","latitude":"50.278933","longitude":"5.909211","name":"Vielsalm"},{"@id":"http://irail.be/stations/NMBS/008845203","country":"http://sws.geonames.org/2802361/","latitude":"50.368214","longitude":"5.873578","name":"Trois-Ponts"},{"@id":"http://irail.be/stations/NMBS/008845229","country":"http://sws.geonames.org/2802361/","latitude":"50.391127","longitude":"5.880473","name":"Coo"},{"@id":"http://irail.be/stations/NMBS/008846201","alternative":[{"@language":"nl","@value":"Wezet"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.73776","longitude":"5.692544","name":"Visé"},{"@id":"http://irail.be/stations/NMBS/008861119","country":"http://sws.geonames.org/2802361/","latitude":"50.457737","longitude":"4.82842","name":"Ronet"},{"@id":"http://irail.be/stations/NMBS/008861127","country":"http://sws.geonames.org/2802361/","latitude":"50.456236","longitude":"4.806298","name":"Flawinne"},{"@id":"http://irail.be/stations/NMBS/008861135","country":"http://sws.geonames.org/2802361/","latitude":"50.443328","longitude":"4.762368","name":"Floreffe"},{"@id":"http://irail.be/stations/NMBS/008861143","country":"http://sws.geonames.org/2802361/","latitude":"50.439543","longitude":"4.733548","name":"Franière"},{"@id":"http://irail.be/stations/NMBS/008861150","country":"http://sws.geonames.org/2802361/","latitude":"50.452748","longitude":"4.693807","name":"Moustier"},{"@id":"http://irail.be/stations/NMBS/008861168","country":"http://sws.geonames.org/2802361/","latitude":"50.45255","longitude":"4.669392","name":"Ham-sur-Sambre"},{"@id":"http://irail.be/stations/NMBS/008861200","country":"http://sws.geonames.org/2802361/","latitude":"50.570489","longitude":"4.691497","name":"Gembloux"},{"@id":"http://irail.be/stations/NMBS/008861317","country":"http://sws.geonames.org/2802361/","latitude":"50.557374","longitude":"4.697627","name":"Chapelle-Dieu"},{"@id":"http://irail.be/stations/NMBS/008861333","country":"http://sws.geonames.org/2802361/","latitude":"50.513497","longitude":"4.675829","name":"Mazy"},{"@id":"http://irail.be/stations/NMBS/008861416","country":"http://sws.geonames.org/2802361/","latitude":"50.551935","longitude":"4.7201","name":"Lonzée"},{"@id":"http://irail.be/stations/NMBS/008861424","country":"http://sws.geonames.org/2802361/","latitude":"50.534208","longitude":"4.748533","name":"Beuzet"},{"@id":"http://irail.be/stations/NMBS/008861432","country":"http://sws.geonames.org/2802361/","latitude":"50.5213","longitude":"4.767788","name":"Saint-Denis-Bovesse"},{"@id":"http://irail.be/stations/NMBS/008861440","country":"http://sws.geonames.org/2802361/","latitude":"50.499348","longitude":"4.801866","name":"Rhisnes"},{"@id":"http://irail.be/stations/NMBS/008861515","country":"http://sws.geonames.org/2802361/","latitude":"50.590823","longitude":"4.668538","name":"Ernage"},{"@id":"http://irail.be/stations/NMBS/008861523","country":"http://sws.geonames.org/2802361/","latitude":"50.608819","longitude":"4.648888","name":"Chastre"},{"@id":"http://irail.be/stations/NMBS/008861531","country":"http://sws.geonames.org/2802361/","latitude":"50.619453","longitude":"4.636393","name":"Blanmont"},{"@id":"http://irail.be/stations/NMBS/008861549","country":"http://sws.geonames.org/2802361/","latitude":"50.637611","longitude":"4.613884","name":"Mont-Saint-Guibert"},{"@id":"http://irail.be/stations/NMBS/008862018","country":"http://sws.geonames.org/2802361/","latitude":"49.690939","longitude":"5.769115","name":"Stockem"},{"@id":"http://irail.be/stations/NMBS/008863008","alternative":[{"@language":"nl","@value":"Namen"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.468794","longitude":"4.86222","name":"Namur"},{"@id":"http://irail.be/stations/NMBS/008863115","country":"http://sws.geonames.org/2802361/","latitude":"50.454843","longitude":"4.876144","name":"Jambes"},{"@id":"http://irail.be/stations/NMBS/008863156","country":"http://sws.geonames.org/2802361/","latitude":"50.391559","longitude":"4.877241","name":"Lustin"},{"@id":"http://irail.be/stations/NMBS/008863354","country":"http://sws.geonames.org/2802361/","latitude":"50.454798","longitude":"4.880261","name":"Jambes-Est"},{"@id":"http://irail.be/stations/NMBS/008863362","country":"http://sws.geonames.org/2802361/","latitude":"50.429098","longitude":"4.884414","name":"Dave-Saint-Martin"},{"@id":"http://irail.be/stations/NMBS/008863404","country":"http://sws.geonames.org/2802361/","latitude":"50.496759","longitude":"5.094699","name":"Andenne"},{"@id":"http://irail.be/stations/NMBS/008863438","country":"http://sws.geonames.org/2802361/","latitude":"50.497209","longitude":"5.081745","name":"Château-de-Seilles"},{"@id":"http://irail.be/stations/NMBS/008863446","country":"http://sws.geonames.org/2802361/","latitude":"50.492247","longitude":"5.026363","name":"Sclaigneaux"},{"@id":"http://irail.be/stations/NMBS/008863453","country":"http://sws.geonames.org/2802361/","latitude":"50.47043","longitude":"4.997939","name":"Namêche"},{"@id":"http://irail.be/stations/NMBS/008863461","country":"http://sws.geonames.org/2802361/","latitude":"50.480741","longitude":"4.96458","name":"Marche-les-Dames"},{"@id":"http://irail.be/stations/NMBS/008863503","country":"http://sws.geonames.org/2802361/","latitude":"50.260721","longitude":"4.908182","name":"Dinant"},{"@id":"http://irail.be/stations/NMBS/008863545","country":"http://sws.geonames.org/2802361/","latitude":"50.32084","longitude":"4.878643","name":"Yvoir"},{"@id":"http://irail.be/stations/NMBS/008863560","country":"http://sws.geonames.org/2802361/","latitude":"50.348914","longitude":"4.86996","name":"Godinne"},{"@id":"http://irail.be/stations/NMBS/008863818","country":"http://sws.geonames.org/2802361/","latitude":"50.238023","longitude":"4.90553","name":"Anseremme"},{"@id":"http://irail.be/stations/NMBS/008863834","country":"http://sws.geonames.org/2802361/","latitude":"50.211235","longitude":"4.964607","name":"Gendron-Celles"},{"@id":"http://irail.be/stations/NMBS/008863842","country":"http://sws.geonames.org/2802361/","latitude":"50.189868","longitude":"5.006074","name":"Houyet"},{"@id":"http://irail.be/stations/NMBS/008863867","country":"http://sws.geonames.org/2802361/","latitude":"50.11443","longitude":"4.95684","name":"Beauraing"},{"@id":"http://irail.be/stations/NMBS/008864006","country":"http://sws.geonames.org/2802361/","latitude":"50.160401","longitude":"5.266698","name":"Jemelle"},{"@id":"http://irail.be/stations/NMBS/008864311","country":"http://sws.geonames.org/2802361/","latitude":"50.132759","longitude":"5.276784","name":"Forrières"},{"@id":"http://irail.be/stations/NMBS/008864337","country":"http://sws.geonames.org/2802361/","latitude":"50.0906","longitude":"5.280524","name":"Grupont"},{"@id":"http://irail.be/stations/NMBS/008864345","country":"http://sws.geonames.org/2802361/","latitude":"50.202821","longitude":"5.313892","name":"Marloie"},{"@id":"http://irail.be/stations/NMBS/008864352","country":"http://sws.geonames.org/2802361/","latitude":"50.224135","longitude":"5.301091","name":"Aye"},{"@id":"http://irail.be/stations/NMBS/008864410","country":"http://sws.geonames.org/2802361/","latitude":"50.222472","longitude":"5.346289","name":"Marche-en-Famenne"},{"@id":"http://irail.be/stations/NMBS/008864436","country":"http://sws.geonames.org/2802361/","latitude":"50.28367","longitude":"5.440136","name":"Melreux-Hotton"},{"@id":"http://irail.be/stations/NMBS/008864451","country":"http://sws.geonames.org/2802361/","latitude":"50.349417","longitude":"5.501542","name":"Barvaux"},{"@id":"http://irail.be/stations/NMBS/008864469","country":"http://sws.geonames.org/2802361/","latitude":"50.376798","longitude":"5.519304","name":"Bomal"},{"@id":"http://irail.be/stations/NMBS/008864501","country":"http://sws.geonames.org/2802361/","latitude":"50.29105","longitude":"5.091409","name":"Ciney"},{"@id":"http://irail.be/stations/NMBS/008864816","country":"http://sws.geonames.org/2802361/","latitude":"50.267768","longitude":"5.107778","name":"Leignon"},{"@id":"http://irail.be/stations/NMBS/008864824","country":"http://sws.geonames.org/2802361/","latitude":"50.262366","longitude":"5.124255","name":"Chapois"},{"@id":"http://irail.be/stations/NMBS/008864832","country":"http://sws.geonames.org/2802361/","latitude":"50.249044","longitude":"5.194371","name":"Haversin"},{"@id":"http://irail.be/stations/NMBS/008864915","country":"http://sws.geonames.org/2802361/","latitude":"50.343296","longitude":"5.06116","name":"Natoye"},{"@id":"http://irail.be/stations/NMBS/008864923","country":"http://sws.geonames.org/2802361/","latitude":"50.357786","longitude":"5.056099","name":"Florée"},{"@id":"http://irail.be/stations/NMBS/008864931","country":"http://sws.geonames.org/2802361/","latitude":"50.368133","longitude":"5.022839","name":"Assesse"},{"@id":"http://irail.be/stations/NMBS/008864949","country":"http://sws.geonames.org/2802361/","latitude":"50.387442","longitude":"4.996051","name":"Courrière"},{"@id":"http://irail.be/stations/NMBS/008864956","country":"http://sws.geonames.org/2802361/","latitude":"50.406373","longitude":"4.949739","name":"Sart-Bernard"},{"@id":"http://irail.be/stations/NMBS/008864964","country":"http://sws.geonames.org/2802361/","latitude":"50.419695","longitude":"4.929756","name":"Naninne"},{"@id":"http://irail.be/stations/NMBS/008865003","country":"http://sws.geonames.org/2802361/","latitude":"49.920434","longitude":"5.37927","name":"Libramont"},{"@id":"http://irail.be/stations/NMBS/008865110","alternative":[{"@language":"nl","@value":"Bastenaken-Zuid"}],"country":"http://sws.geonames.org/2802361/","latitude":"49.999737","longitude":"5.709858","name":"Bastogne-Sud"},{"@id":"http://irail.be/stations/NMBS/008865128","alternative":[{"@language":"nl","@value":"Bastenaken-Noord"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.006919","longitude":"5.720744","name":"Bastogne-Nord"},{"@id":"http://irail.be/stations/NMBS/008865227","country":"http://sws.geonames.org/2802361/","latitude":"50.019504","longitude":"5.292641","name":"Poix-Saint-Hubert"},{"@id":"http://irail.be/stations/NMBS/008865300","country":"http://sws.geonames.org/2802361/","latitude":"49.852835","longitude":"5.267193","name":"Bertrix"},{"@id":"http://irail.be/stations/NMBS/008865540","country":"http://sws.geonames.org/2802361/","latitude":"49.895408","longitude":"5.118349","name":"Paliseul"},{"@id":"http://irail.be/stations/NMBS/008865565","country":"http://sws.geonames.org/2802361/","latitude":"49.905458","longitude":"5.092784","name":"Carlsbourg"},{"@id":"http://irail.be/stations/NMBS/008865615","country":"http://sws.geonames.org/2802361/","latitude":"49.934134","longitude":"5.043047","name":"Graide"},{"@id":"http://irail.be/stations/NMBS/008865649","country":"http://sws.geonames.org/2802361/","latitude":"49.984123","longitude":"4.978073","name":"Gedinne"},{"@id":"http://irail.be/stations/NMBS/008866001","alternative":[{"@language":"nl","@value":"Aarlen"},{"@language":"de","@value":"Arel"}],"country":"http://sws.geonames.org/2802361/","latitude":"49.68053","longitude":"5.809971","name":"Arlon"},{"@id":"http://irail.be/stations/NMBS/008866118","country":"http://sws.geonames.org/2802361/","latitude":"49.688243","longitude":"5.786527","name":"Viville"},{"@id":"http://irail.be/stations/NMBS/008866142","country":"http://sws.geonames.org/2802361/","latitude":"49.718249","longitude":"5.632685","name":"Habay"},{"@id":"http://irail.be/stations/NMBS/008866175","country":"http://sws.geonames.org/2802361/","latitude":"49.727337","longitude":"5.539755","name":"Marbehan"},{"@id":"http://irail.be/stations/NMBS/008866258","country":"http://sws.geonames.org/2802361/","latitude":"49.854318","longitude":"5.452559","name":"Neufchâteau"},{"@id":"http://irail.be/stations/NMBS/008866407","country":"http://sws.geonames.org/2802361/","latitude":"49.560821","longitude":"5.519125","name":"Virton"},{"@id":"http://irail.be/stations/NMBS/008866530","country":"http://sws.geonames.org/2802361/","latitude":"49.5562","longitude":"5.741347","name":"Halanzy"},{"@id":"http://irail.be/stations/NMBS/008866605","alternative":[{"@language":"de","@value":"Athem"}],"country":"http://sws.geonames.org/2802361/","latitude":"49.563346","longitude":"5.828947","name":"Athus"},{"@id":"http://irail.be/stations/NMBS/008866654","country":"http://sws.geonames.org/2802361/","latitude":"49.564093","longitude":"5.79806","name":"Aubange"},{"@id":"http://irail.be/stations/NMBS/008866662","country":"http://sws.geonames.org/2802361/","latitude":"49.592777","longitude":"5.818915","name":"Messancy"},{"@id":"http://irail.be/stations/NMBS/008866845","country":"http://sws.geonames.org/2802361/","latitude":"49.706967","longitude":"5.331115","name":"Florenville"},{"@id":"http://irail.be/stations/NMBS/008871100","country":"http://sws.geonames.org/2802361/","latitude":"50.412171","longitude":"4.394223","name":"Marchienne-au-Pont"},{"@id":"http://irail.be/stations/NMBS/008871175","country":"http://sws.geonames.org/2802361/","latitude":"50.352896","longitude":"4.411294","name":"Jamioulx"},{"@id":"http://irail.be/stations/NMBS/008871183","country":"http://sws.geonames.org/2802361/","latitude":"50.333893","longitude":"4.406305","name":"Beignée"},{"@id":"http://irail.be/stations/NMBS/008871217","country":"http://sws.geonames.org/2802361/","latitude":"50.443112","longitude":"4.393199","name":"Roux"},{"@id":"http://irail.be/stations/NMBS/008871225","country":"http://sws.geonames.org/2802361/","latitude":"50.462007","longitude":"4.400534","name":"Courcelles-Motte"},{"@id":"http://irail.be/stations/NMBS/008871308","country":"http://sws.geonames.org/2802361/","latitude":"50.505856","longitude":"4.38412","name":"Luttre"},{"@id":"http://irail.be/stations/NMBS/008871332","country":"http://sws.geonames.org/2802361/","latitude":"50.535206","longitude":"4.36357","name":"Obaix-Buzet"},{"@id":"http://irail.be/stations/NMBS/008871365","country":"http://sws.geonames.org/2802361/","latitude":"50.513812","longitude":"4.355291","name":"Pont-à-Celles"},{"@id":"http://irail.be/stations/NMBS/008871373","country":"http://sws.geonames.org/2802361/","latitude":"50.497065","longitude":"4.325123","name":"Gouy-lez-Pieton"},{"@id":"http://irail.be/stations/NMBS/008871381","country":"http://sws.geonames.org/2802361/","latitude":"50.492795","longitude":"4.290308","name":"Godarville"},{"@id":"http://irail.be/stations/NMBS/008871415","country":"http://sws.geonames.org/2802361/","latitude":"50.434959","longitude":"4.288438","name":"Piéton"},{"@id":"http://irail.be/stations/NMBS/008871514","country":"http://sws.geonames.org/2802361/","latitude":"50.433314","longitude":"4.325384","name":"Forchies"},{"@id":"http://irail.be/stations/NMBS/008871605","country":"http://sws.geonames.org/2802361/","latitude":"50.304192","longitude":"4.113562","name":"Erquelinnes"},{"@id":"http://irail.be/stations/NMBS/008871647","country":"http://sws.geonames.org/2802361/","latitude":"50.310179","longitude":"4.132314","name":"Erquelinnes-Village"},{"@id":"http://irail.be/stations/NMBS/008871662","country":"http://sws.geonames.org/2802361/","latitude":"50.312642","longitude":"4.158427","name":"Solre-sur-Sambre"},{"@id":"http://irail.be/stations/NMBS/008871670","country":"http://sws.geonames.org/2802361/","latitude":"50.316328","longitude":"4.186833","name":"Labuissière"},{"@id":"http://irail.be/stations/NMBS/008871688","country":"http://sws.geonames.org/2802361/","latitude":"50.321164","longitude":"4.212785","name":"Fontaine-Valmont"},{"@id":"http://irail.be/stations/NMBS/008871712","country":"http://sws.geonames.org/2802361/","latitude":"50.346469","longitude":"4.260958","name":"Lobbes"},{"@id":"http://irail.be/stations/NMBS/008871811","country":"http://sws.geonames.org/2802361/","latitude":"50.342738","longitude":"4.288906","name":"Thuin"},{"@id":"http://irail.be/stations/NMBS/008871829","country":"http://sws.geonames.org/2802361/","latitude":"50.363692","longitude":"4.308736","name":"Hourpes"},{"@id":"http://irail.be/stations/NMBS/008871837","country":"http://sws.geonames.org/2802361/","latitude":"50.377311","longitude":"4.350976","name":"Landelies"},{"@id":"http://irail.be/stations/NMBS/008871852","country":"http://sws.geonames.org/2802361/","latitude":"50.397465","longitude":"4.388767","name":"Marchienne-Zone"},{"@id":"http://irail.be/stations/NMBS/008872009","alternative":[{"@language":"nl","@value":"Charleroi-Zuid"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.40471","longitude":"4.438567","name":"Charleroi-Sud"},{"@id":"http://irail.be/stations/NMBS/008872066","alternative":[{"@language":"nl","@value":"Charleroi-West"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.410948","longitude":"4.436653","name":"Charleroi-Ouest"},{"@id":"http://irail.be/stations/NMBS/008872306","country":"http://sws.geonames.org/2802361/","latitude":"50.432451","longitude":"4.462946","name":"Lodelinsart"},{"@id":"http://irail.be/stations/NMBS/008872413","country":"http://sws.geonames.org/2802361/","latitude":"50.481927","longitude":"4.543741","name":"Fleurus"},{"@id":"http://irail.be/stations/NMBS/008872520","country":"http://sws.geonames.org/2802361/","latitude":"50.511726","longitude":"4.566133","name":"Ligny"},{"@id":"http://irail.be/stations/NMBS/008872553","country":"http://sws.geonames.org/2802361/","latitude":"50.558084","longitude":"4.552676","name":"Tilly"},{"@id":"http://irail.be/stations/NMBS/008872579","country":"http://sws.geonames.org/2802361/","latitude":"50.578103","longitude":"4.533349","name":"Villers-la-Ville"},{"@id":"http://irail.be/stations/NMBS/008872587","country":"http://sws.geonames.org/2802361/","latitude":"50.610338","longitude":"4.539157","name":"La Roche (Brabant)"},{"@id":"http://irail.be/stations/NMBS/008872611","country":"http://sws.geonames.org/2802361/","latitude":"50.621826","longitude":"4.54926","name":"Faux"},{"@id":"http://irail.be/stations/NMBS/008873007","country":"http://sws.geonames.org/2802361/","latitude":"50.259219","longitude":"4.435879","name":"Walcourt"},{"@id":"http://irail.be/stations/NMBS/008873122","country":"http://sws.geonames.org/2802361/","latitude":"50.191639","longitude":"4.535956","name":"Philippeville"},{"@id":"http://irail.be/stations/NMBS/008873239","country":"http://sws.geonames.org/2802361/","latitude":"50.237133","longitude":"4.492709","name":"Yves-Gomezée"},{"@id":"http://irail.be/stations/NMBS/008873312","country":"http://sws.geonames.org/2802361/","latitude":"50.269278","longitude":"4.428805","name":"Pry"},{"@id":"http://irail.be/stations/NMBS/008873320","country":"http://sws.geonames.org/2802361/","latitude":"50.285603","longitude":"4.405909","name":"Berzée"},{"@id":"http://irail.be/stations/NMBS/008873379","country":"http://sws.geonames.org/2802361/","latitude":"50.300138","longitude":"4.391491","name":"Cour-sur-Heure"},{"@id":"http://irail.be/stations/NMBS/008873387","country":"http://sws.geonames.org/2802361/","latitude":"50.319555","longitude":"4.404696","name":"Ham-sur-Heure"},{"@id":"http://irail.be/stations/NMBS/008874005","country":"http://sws.geonames.org/2802361/","latitude":"50.410103","longitude":"4.521861","name":"Châtelet"},{"@id":"http://irail.be/stations/NMBS/008874054","country":"http://sws.geonames.org/2802361/","latitude":"50.392718","longitude":"4.46851","name":"Couillet"},{"@id":"http://irail.be/stations/NMBS/008874559","country":"http://sws.geonames.org/2802361/","latitude":"50.428936","longitude":"4.552586","name":"Le Campinaire"},{"@id":"http://irail.be/stations/NMBS/008874567","country":"http://sws.geonames.org/2802361/","latitude":"50.435246","longitude":"4.564138","name":"Farciennes"},{"@id":"http://irail.be/stations/NMBS/008874583","country":"http://sws.geonames.org/2802361/","latitude":"50.429529","longitude":"4.584552","name":"Aiseau"},{"@id":"http://irail.be/stations/NMBS/008874609","country":"http://sws.geonames.org/2802361/","latitude":"50.432235","longitude":"4.608823","name":"Tamines"},{"@id":"http://irail.be/stations/NMBS/008874716","country":"http://sws.geonames.org/2802361/","latitude":"50.449197","longitude":"4.630532","name":"Auvelais"},{"@id":"http://irail.be/stations/NMBS/008874724","country":"http://sws.geonames.org/2802361/","latitude":"50.45095","longitude":"4.662632","name":"Jemeppe-sur-Sambre"},{"@id":"http://irail.be/stations/NMBS/008875002","country":"http://sws.geonames.org/2802361/","latitude":"50.09549","longitude":"4.525691","name":"Mariembourg"},{"@id":"http://irail.be/stations/NMBS/008875127","country":"http://sws.geonames.org/2802361/","latitude":"50.056324","longitude":"4.491702","name":"Couvin"},{"@id":"http://irail.be/stations/NMBS/008881000","alternative":[{"@language":"nl","@value":"Bergen"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.453854","longitude":"3.942542","name":"Mons"},{"@id":"http://irail.be/stations/NMBS/008881125","country":"http://sws.geonames.org/2802361/","latitude":"50.487411","longitude":"3.906343","name":"Ghlin"},{"@id":"http://irail.be/stations/NMBS/008881158","country":"http://sws.geonames.org/2802361/","latitude":"50.507025","longitude":"3.887987","name":"Erbisœul"},{"@id":"http://irail.be/stations/NMBS/008881166","alternative":[{"@language":"fr","@value":"Jurbise"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.530496","longitude":"3.910694","name":"Jurbeke"},{"@id":"http://irail.be/stations/NMBS/008881174","country":"http://sws.geonames.org/2802361/","latitude":"50.536546","longitude":"3.962139","name":"Masnuy-Saint-Pierre"},{"@id":"http://irail.be/stations/NMBS/008881190","country":"http://sws.geonames.org/2802361/","latitude":"50.559342","longitude":"3.903224","name":"Lens"},{"@id":"http://irail.be/stations/NMBS/008881315","country":"http://sws.geonames.org/2802361/","latitude":"50.471644","longitude":"3.956089","name":"Nimy"},{"@id":"http://irail.be/stations/NMBS/008881406","country":"http://sws.geonames.org/2802361/","latitude":"50.469873","longitude":"4.007804","name":"Obourg"},{"@id":"http://irail.be/stations/NMBS/008881430","country":"http://sws.geonames.org/2802361/","latitude":"50.470754","longitude":"4.059987","name":"Havre"},{"@id":"http://irail.be/stations/NMBS/008881455","country":"http://sws.geonames.org/2802361/","latitude":"50.46954","longitude":"4.098523","name":"Thieu"},{"@id":"http://irail.be/stations/NMBS/008881463","country":"http://sws.geonames.org/2802361/","latitude":"50.474457","longitude":"4.126345","name":"Bracquegnies"},{"@id":"http://irail.be/stations/NMBS/008881505","country":"http://sws.geonames.org/2802361/","latitude":"50.341534","longitude":"3.909489","name":"Quevy"},{"@id":"http://irail.be/stations/NMBS/008881562","country":"http://sws.geonames.org/2802361/","latitude":"50.390642","longitude":"3.911638","name":"Genly"},{"@id":"http://irail.be/stations/NMBS/008881570","country":"http://sws.geonames.org/2802361/","latitude":"50.405932","longitude":"3.906586","name":"Frameries"},{"@id":"http://irail.be/stations/NMBS/008882107","alternative":[{"@language":"nl","@value":"La Louvière-Centrum"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.478161","longitude":"4.179858","name":"La Louvière-Centre"},{"@id":"http://irail.be/stations/NMBS/008882206","alternative":[{"@language":"nl","@value":"La Louvière-Zuid"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.464974","longitude":"4.190609","name":"La Louvière-Sud"},{"@id":"http://irail.be/stations/NMBS/008882230","country":"http://sws.geonames.org/2802361/","latitude":"50.457998","longitude":"4.247367","name":"Morlanwelz"},{"@id":"http://irail.be/stations/NMBS/008882248","country":"http://sws.geonames.org/2802361/","latitude":"50.447957","longitude":"4.263826","name":"Carnieres"},{"@id":"http://irail.be/stations/NMBS/008882339","country":"http://sws.geonames.org/2802361/","latitude":"50.430797","longitude":"4.211041","name":"Leval"},{"@id":"http://irail.be/stations/NMBS/008882362","country":"http://sws.geonames.org/2802361/","latitude":"50.408764","longitude":"4.172451","name":"Binche"},{"@id":"http://irail.be/stations/NMBS/008882701","country":"http://sws.geonames.org/2802361/","latitude":"50.506108","longitude":"4.234683","name":"Manage"},{"@id":"http://irail.be/stations/NMBS/008883006","alternative":[{"@language":"nl","@value":"'s Gravenbrakel"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.605079","longitude":"4.137662","name":"Braine-le-Comte"},{"@id":"http://irail.be/stations/NMBS/008883022","country":"http://sws.geonames.org/2802361/","latitude":"50.651005","longitude":"4.175893","name":"Hennuyères"},{"@id":"http://irail.be/stations/NMBS/008883113","alternative":[{"@language":"nl","@value":"Zinnik"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.572763","longitude":"4.067519","name":"Soignies"},{"@id":"http://irail.be/stations/NMBS/008883121","country":"http://sws.geonames.org/2802361/","latitude":"50.543602","longitude":"4.010672","name":"Neufvilles"},{"@id":"http://irail.be/stations/NMBS/008883212","country":"http://sws.geonames.org/2802361/","latitude":"50.56239","longitude":"4.156639","name":"Écaussinnes"},{"@id":"http://irail.be/stations/NMBS/008883220","country":"http://sws.geonames.org/2802361/","latitude":"50.546173","longitude":"4.177098","name":"Marche-lez-Écaussinnes"},{"@id":"http://irail.be/stations/NMBS/008883238","country":"http://sws.geonames.org/2802361/","latitude":"50.519358","longitude":"4.211581","name":"Familleureux"},{"@id":"http://irail.be/stations/NMBS/008883311","alternative":[{"@language":"nl","@value":"Edingen"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.697273","longitude":"4.047357","name":"Enghien"},{"@id":"http://irail.be/stations/NMBS/008883436","alternative":[{"@language":"nl","@value":"Opzullik"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.662386","longitude":"3.935863","name":"Silly"},{"@id":"http://irail.be/stations/NMBS/008883808","alternative":[{"@language":"nl","@value":"Tubeke"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.691708","longitude":"4.205729","name":"Tubize"},{"@id":"http://irail.be/stations/NMBS/008884004","country":"http://sws.geonames.org/2802361/","latitude":"50.44286","longitude":"3.820253","name":"Saint-Ghislain"},{"@id":"http://irail.be/stations/NMBS/008884319","country":"http://sws.geonames.org/2802361/","latitude":"50.436388","longitude":"3.797025","name":"Boussu"},{"@id":"http://irail.be/stations/NMBS/008884327","country":"http://sws.geonames.org/2802361/","latitude":"50.428019","longitude":"3.766893","name":"Hainin"},{"@id":"http://irail.be/stations/NMBS/008884335","country":"http://sws.geonames.org/2802361/","latitude":"50.410103","longitude":"3.68608","name":"Quievrain"},{"@id":"http://irail.be/stations/NMBS/008884350","country":"http://sws.geonames.org/2802361/","latitude":"50.423335","longitude":"3.744708","name":"Thulin"},{"@id":"http://irail.be/stations/NMBS/008884541","country":"http://sws.geonames.org/2802361/","latitude":"50.449827","longitude":"3.856543","name":"Quaregnon"},{"@id":"http://irail.be/stations/NMBS/008884566","country":"http://sws.geonames.org/2802361/","latitude":"50.452577","longitude":"3.885587","name":"Jemappes"},{"@id":"http://irail.be/stations/NMBS/008884632","country":"http://sws.geonames.org/2802361/","latitude":"50.464542","longitude":"3.724248","name":"Ville-Pommerœul"},{"@id":"http://irail.be/stations/NMBS/008884640","country":"http://sws.geonames.org/2802361/","latitude":"50.482565","longitude":"3.698764","name":"Harchies"},{"@id":"http://irail.be/stations/NMBS/008884715","country":"http://sws.geonames.org/2802361/","latitude":"50.505461","longitude":"3.666304","name":"Blaton"},{"@id":"http://irail.be/stations/NMBS/008884855","country":"http://sws.geonames.org/2802361/","latitude":"50.513704","longitude":"3.592772","name":"Péruwelz"},{"@id":"http://irail.be/stations/NMBS/008884889","country":"http://sws.geonames.org/2802361/","latitude":"50.527359","longitude":"3.52618","name":"Callenelle"},{"@id":"http://irail.be/stations/NMBS/008885001","alternative":[{"@language":"nl","@value":"Doornik"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.613134","longitude":"3.396942","name":"Tournai"},{"@id":"http://irail.be/stations/NMBS/008885068","country":"http://sws.geonames.org/2802361/","latitude":"50.62989","longitude":"3.354837","name":"Froyennes"},{"@id":"http://irail.be/stations/NMBS/008885522","country":"http://sws.geonames.org/2802361/","latitude":"50.569626","longitude":"3.451309","name":"Antoing"},{"@id":"http://irail.be/stations/NMBS/008885530","country":"http://sws.geonames.org/2802361/","latitude":"50.547557","longitude":"3.495527","name":"Maubray"},{"@id":"http://irail.be/stations/NMBS/008885704","alternative":[{"@language":"nl","@value":"Moeskroen"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.741005","longitude":"3.228448","name":"Mouscron"},{"@id":"http://irail.be/stations/NMBS/008885753","country":"http://sws.geonames.org/2802361/","latitude":"50.713894","longitude":"3.245959","name":"Herseaux"},{"@id":"http://irail.be/stations/NMBS/008886009","alternative":[{"@language":"nl","@value":"Aat"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.626932","longitude":"3.777429","name":"Ath"},{"@id":"http://irail.be/stations/NMBS/008886041","country":"http://sws.geonames.org/2802361/","latitude":"50.614356","longitude":"3.800117","name":"Maffle"},{"@id":"http://irail.be/stations/NMBS/008886058","country":"http://sws.geonames.org/2802361/","latitude":"50.600108","longitude":"3.833917","name":"Mevergnies-Attre"},{"@id":"http://irail.be/stations/NMBS/008886066","country":"http://sws.geonames.org/2802361/","latitude":"50.594229","longitude":"3.852551","name":"Brugelette"},{"@id":"http://irail.be/stations/NMBS/008886074","country":"http://sws.geonames.org/2802361/","latitude":"50.586759","longitude":"3.874809","name":"Cambron-Casteau"},{"@id":"http://irail.be/stations/NMBS/008886348","country":"http://sws.geonames.org/2802361/","latitude":"50.600612","longitude":"3.616872","name":"Leuze"},{"@id":"http://irail.be/stations/NMBS/008886504","country":"http://sws.geonames.org/2802361/","latitude":"50.712015","longitude":"3.836434","name":"Lessen"},{"@id":"http://irail.be/stations/NMBS/008886546","alternative":[{"@language":"nl","@value":"Akren"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.733095","longitude":"3.847086","name":"Acren"},{"@id":"http://irail.be/stations/NMBS/008886553","country":"http://sws.geonames.org/2802361/","latitude":"50.703062","longitude":"3.835175","name":"Houraing"},{"@id":"http://irail.be/stations/NMBS/008886561","country":"http://sws.geonames.org/2802361/","latitude":"50.686585","longitude":"3.823408","name":"Papegem"},{"@id":"http://irail.be/stations/NMBS/008886587","country":"http://sws.geonames.org/2802361/","latitude":"50.661235","longitude":"3.793627","name":"Rebaix"},{"@id":"http://irail.be/stations/NMBS/008891009","alternative":[{"@language":"fr","@value":"Bruges"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.197226","longitude":"3.216726","name":"Brugge"},{"@id":"http://irail.be/stations/NMBS/008891033","alternative":[{"@language":"fr","@value":"Bruges-Saint-Pierre"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.223115","longitude":"3.201795","name":"Brugge-Sint-Pieters"},{"@id":"http://irail.be/stations/NMBS/008891116","country":"http://sws.geonames.org/2802361/","latitude":"51.154114","longitude":"3.257466","name":"Oostkamp"},{"@id":"http://irail.be/stations/NMBS/008891124","country":"http://sws.geonames.org/2802361/","latitude":"51.128009","longitude":"3.329892","name":"Beernem"},{"@id":"http://irail.be/stations/NMBS/008891132","country":"http://sws.geonames.org/2802361/","latitude":"51.107612","longitude":"3.38673","name":"Maria-Aalter"},{"@id":"http://irail.be/stations/NMBS/008891140","country":"http://sws.geonames.org/2802361/","latitude":"51.092295","longitude":"3.447848","name":"Aalter"},{"@id":"http://irail.be/stations/NMBS/008891157","country":"http://sws.geonames.org/2802361/","latitude":"51.083908","longitude":"3.487374","name":"Bellem"},{"@id":"http://irail.be/stations/NMBS/008891165","country":"http://sws.geonames.org/2802361/","latitude":"51.073202","longitude":"3.536212","name":"Hansbeke"},{"@id":"http://irail.be/stations/NMBS/008891173","country":"http://sws.geonames.org/2802361/","latitude":"51.324549","longitude":"3.186666","name":"Zeebrugge-Strand"},{"@id":"http://irail.be/stations/NMBS/008891264","country":"http://sws.geonames.org/2802361/","latitude":"51.127047","longitude":"3.16414","name":"Zedelgem"},{"@id":"http://irail.be/stations/NMBS/008891314","country":"http://sws.geonames.org/2802361/","latitude":"51.064707","longitude":"3.105871","name":"Torhout"},{"@id":"http://irail.be/stations/NMBS/008891405","country":"http://sws.geonames.org/2802361/","latitude":"51.312432","longitude":"3.133864","name":"Blankenberge"},{"@id":"http://irail.be/stations/NMBS/008891553","country":"http://sws.geonames.org/2802361/","latitude":"51.326383","longitude":"3.19517","name":"Zeebrugge-Dorp"},{"@id":"http://irail.be/stations/NMBS/008891611","country":"http://sws.geonames.org/2802361/","latitude":"51.306409","longitude":"3.191557","name":"Zwankendamme"},{"@id":"http://irail.be/stations/NMBS/008891629","country":"http://sws.geonames.org/2802361/","latitude":"51.294714","longitude":"3.194505","name":"Lissewege"},{"@id":"http://irail.be/stations/NMBS/008891645","country":"http://sws.geonames.org/2802361/","latitude":"51.333979","longitude":"3.239181","name":"Heist"},{"@id":"http://irail.be/stations/NMBS/008891652","country":"http://sws.geonames.org/2802361/","latitude":"51.338195","longitude":"3.263587","name":"Duinbergen"},{"@id":"http://irail.be/stations/NMBS/008891660","country":"http://sws.geonames.org/2802361/","latitude":"51.339894","longitude":"3.285188","name":"Knokke"},{"@id":"http://irail.be/stations/NMBS/008891702","alternative":[{"@language":"fr","@value":"Ostende"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.228212","longitude":"2.925809","name":"Oostende"},{"@id":"http://irail.be/stations/NMBS/008892007","alternative":[{"@language":"en","@value":"Ghent-Sint-Pieters"},{"@language":"fr","@value":"Gand-Saint-Pierre"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.035896","longitude":"3.710675","name":"Gent-Sint-Pieters"},{"@id":"http://irail.be/stations/NMBS/008892031","country":"http://sws.geonames.org/2802361/","latitude":"51.047295","longitude":"3.655202","name":"Drongen"},{"@id":"http://irail.be/stations/NMBS/008892056","country":"http://sws.geonames.org/2802361/","latitude":"51.064311","longitude":"3.576852","name":"Landegem"},{"@id":"http://irail.be/stations/NMBS/008892080","country":"http://sws.geonames.org/2802361/","latitude":"50.997063","longitude":"3.650465","name":"De Pinte"},{"@id":"http://irail.be/stations/NMBS/008892106","country":"http://sws.geonames.org/2802361/","latitude":"50.978258","longitude":"3.534432","name":"Deinze"},{"@id":"http://irail.be/stations/NMBS/008892205","country":"http://sws.geonames.org/2802361/","latitude":"51.025163","longitude":"3.127212","name":"Lichtervelde"},{"@id":"http://irail.be/stations/NMBS/008892254","country":"http://sws.geonames.org/2802361/","latitude":"50.990842","longitude":"3.330341","name":"Tielt"},{"@id":"http://irail.be/stations/NMBS/008892288","country":"http://sws.geonames.org/2802361/","latitude":"50.98446","longitude":"3.418363","name":"Aarsele"},{"@id":"http://irail.be/stations/NMBS/008892304","alternative":[{"@language":"fr","@value":"Furnes"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.073867","longitude":"2.66994","name":"Veurne"},{"@id":"http://irail.be/stations/NMBS/008892320","alternative":[{"@language":"fr","@value":"Coxyde"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.079197","longitude":"2.65277","name":"Koksijde"},{"@id":"http://irail.be/stations/NMBS/008892338","alternative":[{"@language":"fr","@value":"La Panne"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.0774","longitude":"2.601963","name":"De Panne"},{"@id":"http://irail.be/stations/NMBS/008892403","country":"http://sws.geonames.org/2802361/","latitude":"51.025244","longitude":"3.043459","name":"Kortemark"},{"@id":"http://irail.be/stations/NMBS/008892452","alternative":[{"@language":"fr","@value":"Dixmude"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.032723","longitude":"2.868943","name":"Diksmuide"},{"@id":"http://irail.be/stations/NMBS/008892601","country":"http://sws.geonames.org/2802361/","latitude":"50.850116","longitude":"3.600386","name":"Oudenaarde"},{"@id":"http://irail.be/stations/NMBS/008892627","country":"http://sws.geonames.org/2802361/","latitude":"50.870432","longitude":"3.623776","name":"Eine"},{"@id":"http://irail.be/stations/NMBS/008892635","country":"http://sws.geonames.org/2802361/","latitude":"50.908025","longitude":"3.646384","name":"Zingem"},{"@id":"http://irail.be/stations/NMBS/008892643","country":"http://sws.geonames.org/2802361/","latitude":"50.930021","longitude":"3.639732","name":"Gavere-Asper"},{"@id":"http://irail.be/stations/NMBS/008892650","country":"http://sws.geonames.org/2802361/","latitude":"50.960774","longitude":"3.627839","name":"Eke-Nazareth"},{"@id":"http://irail.be/stations/NMBS/008892692","country":"http://sws.geonames.org/2802361/","latitude":"50.874297","longitude":"3.698395","name":"Sint-Denijs-Boekel"},{"@id":"http://irail.be/stations/NMBS/008892734","country":"http://sws.geonames.org/2802361/","latitude":"50.826385","longitude":"3.495014","name":"Anzegem"},{"@id":"http://irail.be/stations/NMBS/008892908","alternative":[{"@language":"fr","@value":"Renaix"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.742506","longitude":"3.602552","name":"Ronse"},{"@id":"http://irail.be/stations/NMBS/008893013","country":"http://sws.geonames.org/2802361/","latitude":"51.017531","longitude":"3.768889","name":"Merelbeke"},{"@id":"http://irail.be/stations/NMBS/008893039","country":"http://sws.geonames.org/2802361/","latitude":"51.002807","longitude":"3.797088","name":"Melle"},{"@id":"http://irail.be/stations/NMBS/008893047","country":"http://sws.geonames.org/2802361/","latitude":"50.980199","longitude":"3.801672","name":"Gontrode"},{"@id":"http://irail.be/stations/NMBS/008893054","country":"http://sws.geonames.org/2802361/","latitude":"50.970545","longitude":"3.791146","name":"Landskouter"},{"@id":"http://irail.be/stations/NMBS/008893062","country":"http://sws.geonames.org/2802361/","latitude":"50.953519","longitude":"3.781339","name":"Moortsele"},{"@id":"http://irail.be/stations/NMBS/008893070","country":"http://sws.geonames.org/2802361/","latitude":"50.937069","longitude":"3.777842","name":"Scheldewindeke"},{"@id":"http://irail.be/stations/NMBS/008893120","alternative":[{"@language":"en","@value":"Ghent-Dampoort"},{"@language":"fr","@value":"Gand-Dampoort"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.056365","longitude":"3.740591","name":"Gent-Dampoort"},{"@id":"http://irail.be/stations/NMBS/008893179","country":"http://sws.geonames.org/2802361/","latitude":"51.038647","longitude":"3.756322","name":"Gentbrugge"},{"@id":"http://irail.be/stations/NMBS/008893211","country":"http://sws.geonames.org/2802361/","latitude":"51.088357","longitude":"3.719071","name":"Wondelgem"},{"@id":"http://irail.be/stations/NMBS/008893252","country":"http://sws.geonames.org/2802361/","latitude":"51.107585","longitude":"3.70138","name":"Evergem"},{"@id":"http://irail.be/stations/NMBS/008893260","country":"http://sws.geonames.org/2802361/","latitude":"51.126607","longitude":"3.667526","name":"Sleidinge"},{"@id":"http://irail.be/stations/NMBS/008893401","alternative":[{"@language":"fr","@value":"Termonde"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.022781","longitude":"4.101427","name":"Dendermonde"},{"@id":"http://irail.be/stations/NMBS/008893443","alternative":[{"@language":"fr","@value":"Saint-Gilles-lez-Termonde"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.021693","longitude":"4.117832","name":"Sint-Gillis-Dendermonde"},{"@id":"http://irail.be/stations/NMBS/008893518","country":"http://sws.geonames.org/2802361/","latitude":"51.01523","longitude":"4.064472","name":"Oudegem"},{"@id":"http://irail.be/stations/NMBS/008893526","country":"http://sws.geonames.org/2802361/","latitude":"51.003149","longitude":"4.011094","name":"Schoonaarde"},{"@id":"http://irail.be/stations/NMBS/008893534","country":"http://sws.geonames.org/2802361/","latitude":"51.001962","longitude":"3.969195","name":"Wichelen"},{"@id":"http://irail.be/stations/NMBS/008893542","country":"http://sws.geonames.org/2802361/","latitude":"51.003149","longitude":"3.921373","name":"Schellebelle"},{"@id":"http://irail.be/stations/NMBS/008893559","country":"http://sws.geonames.org/2802361/","latitude":"51.001603","longitude":"3.881883","name":"Wetteren"},{"@id":"http://irail.be/stations/NMBS/008893567","alternative":[{"@language":"fr","@value":"Quatrecht"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.99175","longitude":"3.829593","name":"Kwatrecht"},{"@id":"http://irail.be/stations/NMBS/008893583","country":"http://sws.geonames.org/2802361/","latitude":"50.984397","longitude":"3.959361","name":"Serskamp"},{"@id":"http://irail.be/stations/NMBS/008893708","country":"http://sws.geonames.org/2802361/","latitude":"51.181333","longitude":"3.574515","name":"Eeklo"},{"@id":"http://irail.be/stations/NMBS/008893815","country":"http://sws.geonames.org/2802361/","latitude":"51.154608","longitude":"3.615353","name":"Waarschoot"},{"@id":"http://irail.be/stations/NMBS/008894151","country":"http://sws.geonames.org/2802361/","latitude":"51.08753","longitude":"3.879384","name":"Beervelde"},{"@id":"http://irail.be/stations/NMBS/008894201","country":"http://sws.geonames.org/2802361/","latitude":"51.108062","longitude":"3.987794","name":"Lokeren"},{"@id":"http://irail.be/stations/NMBS/008894235","country":"http://sws.geonames.org/2802361/","latitude":"51.073256","longitude":"4.041999","name":"Zele"},{"@id":"http://irail.be/stations/NMBS/008894425","country":"http://sws.geonames.org/2802361/","latitude":"51.143398","longitude":"4.06894","name":"Sinaai"},{"@id":"http://irail.be/stations/NMBS/008894433","country":"http://sws.geonames.org/2802361/","latitude":"51.150994","longitude":"4.088608","name":"Belsele"},{"@id":"http://irail.be/stations/NMBS/008894508","alternative":[{"@language":"fr","@value":"Saint-Nicolas"}],"country":"http://sws.geonames.org/2802361/","latitude":"51.171472","longitude":"4.142966","name":"Sint-Niklaas"},{"@id":"http://irail.be/stations/NMBS/008894672","country":"http://sws.geonames.org/2802361/","latitude":"51.126085","longitude":"4.221352","name":"Temse"},{"@id":"http://irail.be/stations/NMBS/008894714","country":"http://sws.geonames.org/2802361/","latitude":"51.185612","longitude":"4.185907","name":"Nieuwkerken-Waas"},{"@id":"http://irail.be/stations/NMBS/008894748","country":"http://sws.geonames.org/2802361/","latitude":"51.208336","longitude":"4.25952","name":"Beveren"},{"@id":"http://irail.be/stations/NMBS/008894755","country":"http://sws.geonames.org/2802361/","latitude":"51.21071","longitude":"4.286766","name":"Melsele"},{"@id":"http://irail.be/stations/NMBS/008894821","country":"http://sws.geonames.org/2802361/","latitude":"51.214108","longitude":"4.32978","name":"Zwijndrecht"},{"@id":"http://irail.be/stations/NMBS/008895000","alternative":[{"@language":"fr","@value":"Alost"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.942813","longitude":"4.039653","name":"Aalst"},{"@id":"http://irail.be/stations/NMBS/008895067","country":"http://sws.geonames.org/2802361/","latitude":"50.970895","longitude":"3.984981","name":"Lede"},{"@id":"http://irail.be/stations/NMBS/008895091","country":"http://sws.geonames.org/2802361/","latitude":"50.919621","longitude":"4.055447","name":"Erembodegem"},{"@id":"http://irail.be/stations/NMBS/008895125","country":"http://sws.geonames.org/2802361/","latitude":"50.948377","longitude":"4.024407","name":"Aalst-Kerrebroek"},{"@id":"http://irail.be/stations/NMBS/008895208","country":"http://sws.geonames.org/2802361/","latitude":"50.869102","longitude":"3.81441","name":"Zottegem"},{"@id":"http://irail.be/stations/NMBS/008895232","country":"http://sws.geonames.org/2802361/","latitude":"50.875673","longitude":"3.733238","name":"Munkzwalm"},{"@id":"http://irail.be/stations/NMBS/008895240","country":"http://sws.geonames.org/2802361/","latitude":"50.90051","longitude":"3.80587","name":"Balegem-Zuid"},{"@id":"http://irail.be/stations/NMBS/008895257","country":"http://sws.geonames.org/2802361/","latitude":"50.919612","longitude":"3.791425","name":"Balegem-Dorp"},{"@id":"http://irail.be/stations/NMBS/008895422","country":"http://sws.geonames.org/2802361/","latitude":"50.891296","longitude":"3.857469","name":"Hillegem"},{"@id":"http://irail.be/stations/NMBS/008895430","country":"http://sws.geonames.org/2802361/","latitude":"50.89722","longitude":"3.880616","name":"Herzele"},{"@id":"http://irail.be/stations/NMBS/008895448","country":"http://sws.geonames.org/2802361/","latitude":"50.901643","longitude":"3.896653","name":"Terhagen"},{"@id":"http://irail.be/stations/NMBS/008895455","country":"http://sws.geonames.org/2802361/","latitude":"50.907198","longitude":"3.922416","name":"Burst"},{"@id":"http://irail.be/stations/NMBS/008895463","country":"http://sws.geonames.org/2802361/","latitude":"50.913769","longitude":"3.935711","name":"Bambrugge"},{"@id":"http://irail.be/stations/NMBS/008895471","country":"http://sws.geonames.org/2802361/","latitude":"50.928601","longitude":"3.962463","name":"Erpe-Mere"},{"@id":"http://irail.be/stations/NMBS/008895489","country":"http://sws.geonames.org/2802361/","latitude":"50.943254","longitude":"3.98125","name":"Vijfhuizen"},{"@id":"http://irail.be/stations/NMBS/008895505","alternative":[{"@language":"fr","@value":"Grammont"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.771137","longitude":"3.872328","name":"Geraardsbergen"},{"@id":"http://irail.be/stations/NMBS/008895570","country":"http://sws.geonames.org/2802361/","latitude":"50.816236","longitude":"3.826564","name":"Lierde"},{"@id":"http://irail.be/stations/NMBS/008895612","country":"http://sws.geonames.org/2802361/","latitude":"50.751981","longitude":"3.917337","name":"Viane-Moerbeke"},{"@id":"http://irail.be/stations/NMBS/008895620","alternative":[{"@language":"fr","@value":"Gammerages"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.743918","longitude":"3.965726","name":"Galmaarden"},{"@id":"http://irail.be/stations/NMBS/008895638","country":"http://sws.geonames.org/2802361/","latitude":"50.735522","longitude":"3.992828","name":"Tollembeek"},{"@id":"http://irail.be/stations/NMBS/008895646","country":"http://sws.geonames.org/2802361/","latitude":"50.723701","longitude":"4.014573","name":"Herne"},{"@id":"http://irail.be/stations/NMBS/008895711","country":"http://sws.geonames.org/2802361/","latitude":"50.797844","longitude":"3.899286","name":"Schendelbeke"},{"@id":"http://irail.be/stations/NMBS/008895729","country":"http://sws.geonames.org/2802361/","latitude":"50.801871","longitude":"3.921553","name":"Idegem"},{"@id":"http://irail.be/stations/NMBS/008895737","country":"http://sws.geonames.org/2802361/","latitude":"50.806986","longitude":"3.957653","name":"Zandbergen"},{"@id":"http://irail.be/stations/NMBS/008895745","country":"http://sws.geonames.org/2802361/","latitude":"50.813063","longitude":"3.972108","name":"Appelterre"},{"@id":"http://irail.be/stations/NMBS/008895752","country":"http://sws.geonames.org/2802361/","latitude":"50.823994","longitude":"3.993745","name":"Eichem"},{"@id":"http://irail.be/stations/NMBS/008895760","country":"http://sws.geonames.org/2802361/","latitude":"50.839509","longitude":"4.026133","name":"Ninove"},{"@id":"http://irail.be/stations/NMBS/008895778","country":"http://sws.geonames.org/2802361/","latitude":"50.857712","longitude":"4.054557","name":"Okegem"},{"@id":"http://irail.be/stations/NMBS/008895802","country":"http://sws.geonames.org/2802361/","latitude":"50.891925","longitude":"4.071825","name":"Denderleeuw"},{"@id":"http://irail.be/stations/NMBS/008895836","country":"http://sws.geonames.org/2802361/","latitude":"50.882531","longitude":"4.095287","name":"Liedekerke"},{"@id":"http://irail.be/stations/NMBS/008895844","country":"http://sws.geonames.org/2802361/","latitude":"50.876886","longitude":"4.06849","name":"Iddergem"},{"@id":"http://irail.be/stations/NMBS/008895851","country":"http://sws.geonames.org/2802361/","latitude":"50.903279","longitude":"4.05062","name":"Welle"},{"@id":"http://irail.be/stations/NMBS/008895869","country":"http://sws.geonames.org/2802361/","latitude":"50.906838","longitude":"4.023958","name":"Haaltert"},{"@id":"http://irail.be/stations/NMBS/008895877","country":"http://sws.geonames.org/2802361/","latitude":"50.911054","longitude":"3.987524","name":"Ede"},{"@id":"http://irail.be/stations/NMBS/008896008","alternative":[{"@language":"fr","@value":"Courtrai"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.824506","longitude":"3.264549","name":"Kortrijk"},{"@id":"http://irail.be/stations/NMBS/008896115","country":"http://sws.geonames.org/2802361/","latitude":"50.85586","longitude":"3.314008","name":"Harelbeke"},{"@id":"http://irail.be/stations/NMBS/008896149","country":"http://sws.geonames.org/2802361/","latitude":"50.892456","longitude":"3.42551","name":"Waregem"},{"@id":"http://irail.be/stations/NMBS/008896230","country":"http://sws.geonames.org/2802361/","latitude":"50.833657","longitude":"3.39163","name":"Vichte"},{"@id":"http://irail.be/stations/NMBS/008896305","alternative":[{"@language":"fr","@value":"Menin"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.799489","longitude":"3.113791","name":"Menen"},{"@id":"http://irail.be/stations/NMBS/008896370","country":"http://sws.geonames.org/2802361/","latitude":"50.811526","longitude":"3.18352","name":"Wevelgem"},{"@id":"http://irail.be/stations/NMBS/008896388","country":"http://sws.geonames.org/2802361/","latitude":"50.825845","longitude":"3.224205","name":"Bissegem"},{"@id":"http://irail.be/stations/NMBS/008896396","country":"http://sws.geonames.org/2802361/","latitude":"50.781861","longitude":"3.046983","name":"Wervik"},{"@id":"http://irail.be/stations/NMBS/008896412","alternative":[{"@language":"nl","@value":"Komen"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.772072","longitude":"2.999286","name":"Comines"},{"@id":"http://irail.be/stations/NMBS/008896503","alternative":[{"@language":"fr","@value":"Ypres"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.847402","longitude":"2.876593","name":"Ieper"},{"@id":"http://irail.be/stations/NMBS/008896735","country":"http://sws.geonames.org/2802361/","latitude":"50.854449","longitude":"2.736343","name":"Poperinge"},{"@id":"http://irail.be/stations/NMBS/008896800","alternative":[{"@language":"fr","@value":"Roulers"}],"country":"http://sws.geonames.org/2802361/","latitude":"50.949025","longitude":"3.130412","name":"Roeselare"},{"@id":"http://irail.be/stations/NMBS/008896909","country":"http://sws.geonames.org/2802361/","latitude":"50.921149","longitude":"3.212088","name":"Izegem"},{"@id":"http://irail.be/stations/NMBS/008896925","country":"http://sws.geonames.org/2802361/","latitude":"50.914326","longitude":"3.255416","name":"Ingelmunster"}],"@id":"http://irail.be/stations/NMBS/"} From f6419e9cfb263df72fe2056bd9788a00cf08f76c Mon Sep 17 00:00:00 2001 From: Tjoosten Date: Mon, 17 Aug 2015 14:05:55 +0200 Subject: [PATCH 02/51] clean the branch --- CONTRIBUTING.md | 11 - Gemfile | 4 - Gemfile.lock | 36 - Gruntfile.js | 69 - LICENSE | 116 - README.md | 70 - Vagrantfile | 146 - app/commands/.gitkeep | 0 app/config/app.php | 180 - app/config/auth.php | 71 - app/config/cache.php | 89 - app/config/compile.php | 15 - app/config/database.php | 124 - app/config/mail.php | 124 - app/config/packages/.gitkeep | 0 app/config/queue.php | 82 - app/config/remote.php | 59 - app/config/session.php | 140 - app/config/testing/cache.php | 20 - app/config/testing/session.php | 21 - app/config/view.php | 31 - app/config/workbench.php | 31 - app/controllers/.gitkeep | 0 app/controllers/BaseController.php | 16 - app/controllers/ClassicRedirectController.php | 65 - app/controllers/ContributorsController.php | 9 - app/controllers/HomeController.php | 18 - app/controllers/LanguageController.php | 16 - app/controllers/RouteController.php | 101 - app/controllers/StationController.php | 412 - app/database/migrations/.gitkeep | 0 app/database/production.sqlite | 0 app/database/seeds/.gitkeep | 0 app/database/seeds/DatabaseSeeder.php | 17 - .../StationConversionFailureException.php | 6 - app/exceptions/iRailClassicAPIException.php | 6 - app/filters.php | 97 - app/hyperRail/FormatConverter.php | 52 - app/hyperRail/Models/LiveboardItem.php | 62 - app/hyperRail/StationString.php | 104 - app/lang/de/client.php | 64 - app/lang/de/contributors.php | 8 - app/lang/en/client.php | 114 - app/lang/en/contributors.php | 8 - app/lang/en/pagination.php | 20 - app/lang/en/reminders.php | 24 - app/lang/en/validation.php | 98 - app/lang/fr/client.php | 114 - app/lang/fr/contributors.php | 8 - app/lang/nl/client.php | 118 - app/lang/nl/contributors.php | 8 - app/models/User.php | 52 - app/routes.php | 46 - app/start/artisan.php | 13 - app/start/constants.php | 3 - app/start/global.php | 83 - app/start/local.php | 3 - app/stations.json | 1 - app/storage/.gitignore | 1 - app/storage/cache/.gitignore | 2 - app/storage/logs/.gitignore | 2 - app/storage/meta/.gitignore | 2 - app/storage/sessions/.gitignore | 2 - app/storage/views/.gitignore | 2 - app/tests/ExampleTest.php | 16 - app/tests/TestCase.php | 20 - app/views/_partials/route/empty.blade.php | 13 - app/views/_partials/route/errors.blade.php | 13 - app/views/_partials/route/loading.blade.php | 7 - app/views/_partials/route/planner.blade.php | 60 - app/views/_partials/route/results.blade.php | 117 - app/views/contributors/home.blade.php | 31 - app/views/core/footer.blade.php | 13 - app/views/core/head.blade.php | 18 - app/views/core/navigation.blade.php | 19 - app/views/errors/404.blade.php | 27 - app/views/language.blade.php | 27 - app/views/route/planner.blade.php | 22 - app/views/stations/departurearchive.blade.php | 70 - app/views/stations/departuredetail.blade.php | 66 - app/views/stations/expired.blade.php | 44 - app/views/stations/liveboard.blade.php | 72 - app/views/stations/search.blade.php | 28 - artisan | 74 - bootstrap/autoload.php | 75 - bootstrap/paths.php | 57 - bootstrap/start.php | 78 - bower.json | 24 - composer.json | 52 - composer.lock | 3008 -- package.json | 25 - phpunit.xml | 18 - public/.htaccess | 16 - public/app/css/style.css | 5416 --- public/app/js/app.js | 36 - .../app/js/iRail/Controllers/PlannerCtrl.js | 283 - .../iRail/Controllers/StationLiveBoardCtrl.js | 53 - .../js/iRail/Controllers/StationSearchCtrl.js | 55 - public/app/sass/bootstrap/_variables.scss | 637 - public/app/sass/irail/_theme.scss | 225 - public/app/sass/style.scss | 4 - public/apple-touch-icon-precomposed.png | Bin 11327 -> 0 bytes public/builds/js/scripts.js | 31622 ---------------- public/favicon.ico | Bin 24838 -> 0 bytes public/images/irail_logo_delays-01.png | Bin 4567 -> 0 bytes public/images/irail_logo_delays-01.svg | 43 - public/images/irail_logo_delays-02.png | Bin 4293 -> 0 bytes public/images/irail_logo_delays-02.svg | 32 - public/images/irail_logo_delays-03.png | Bin 4282 -> 0 bytes public/images/irail_logo_delays-03.svg | 32 - public/images/irail_logo_delays-04.png | Bin 4642 -> 0 bytes public/images/irail_logo_delays-04.svg | 40 - public/images/irail_logo_delays-05.png | Bin 4777 -> 0 bytes public/images/irail_logo_delays-05.svg | 45 - public/images/irail_logo_delays-06.png | Bin 4726 -> 0 bytes public/images/irail_logo_delays-06.svg | 47 - public/images/irail_logo_delays-07.png | Bin 4665 -> 0 bytes public/images/irail_logo_delays-07.svg | 43 - public/images/irail_logo_delays-08.png | Bin 5488 -> 0 bytes public/images/irail_logo_delays-08.svg | 40 - public/images/irail_logo_delays-09.png | Bin 4709 -> 0 bytes public/images/irail_logo_delays-09.svg | 45 - public/images/logo.png | Bin 598 -> 0 bytes public/images/logo.svg | 48 - public/images/logoLarge.svg | 48 - public/images/stair.svg | 15 - public/images/train.jpg | Bin 12670 -> 0 bytes public/images/train.png | Bin 5872 -> 0 bytes public/images/train.svg | 66 - public/images/train_png.png | Bin 8663 -> 0 bytes public/index.php | 49 - public/packages/.gitkeep | 0 public/robots.txt | 2 - server.php | 19 - 134 files changed, 46271 deletions(-) delete mode 100644 CONTRIBUTING.md delete mode 100644 Gemfile delete mode 100644 Gemfile.lock delete mode 100755 Gruntfile.js delete mode 100644 LICENSE delete mode 100644 README.md delete mode 100644 Vagrantfile delete mode 100644 app/commands/.gitkeep delete mode 100644 app/config/app.php delete mode 100644 app/config/auth.php delete mode 100644 app/config/cache.php delete mode 100644 app/config/compile.php delete mode 100644 app/config/database.php delete mode 100644 app/config/mail.php delete mode 100644 app/config/packages/.gitkeep delete mode 100644 app/config/queue.php delete mode 100644 app/config/remote.php delete mode 100644 app/config/session.php delete mode 100644 app/config/testing/cache.php delete mode 100644 app/config/testing/session.php delete mode 100644 app/config/view.php delete mode 100644 app/config/workbench.php delete mode 100644 app/controllers/.gitkeep delete mode 100644 app/controllers/BaseController.php delete mode 100644 app/controllers/ClassicRedirectController.php delete mode 100644 app/controllers/ContributorsController.php delete mode 100644 app/controllers/HomeController.php delete mode 100644 app/controllers/LanguageController.php delete mode 100644 app/controllers/RouteController.php delete mode 100644 app/controllers/StationController.php delete mode 100644 app/database/migrations/.gitkeep delete mode 100644 app/database/production.sqlite delete mode 100644 app/database/seeds/.gitkeep delete mode 100644 app/database/seeds/DatabaseSeeder.php delete mode 100644 app/exceptions/StationConversionFailureException.php delete mode 100644 app/exceptions/iRailClassicAPIException.php delete mode 100644 app/filters.php delete mode 100644 app/hyperRail/FormatConverter.php delete mode 100644 app/hyperRail/Models/LiveboardItem.php delete mode 100644 app/hyperRail/StationString.php delete mode 100644 app/lang/de/client.php delete mode 100644 app/lang/de/contributors.php delete mode 100644 app/lang/en/client.php delete mode 100644 app/lang/en/contributors.php delete mode 100644 app/lang/en/pagination.php delete mode 100644 app/lang/en/reminders.php delete mode 100644 app/lang/en/validation.php delete mode 100755 app/lang/fr/client.php delete mode 100644 app/lang/fr/contributors.php delete mode 100644 app/lang/nl/client.php delete mode 100644 app/lang/nl/contributors.php delete mode 100644 app/models/User.php delete mode 100644 app/routes.php delete mode 100644 app/start/artisan.php delete mode 100644 app/start/constants.php delete mode 100644 app/start/global.php delete mode 100644 app/start/local.php delete mode 100644 app/stations.json delete mode 100755 app/storage/.gitignore delete mode 100755 app/storage/cache/.gitignore delete mode 100755 app/storage/logs/.gitignore delete mode 100755 app/storage/meta/.gitignore delete mode 100755 app/storage/sessions/.gitignore delete mode 100755 app/storage/views/.gitignore delete mode 100644 app/tests/ExampleTest.php delete mode 100644 app/tests/TestCase.php delete mode 100644 app/views/_partials/route/empty.blade.php delete mode 100644 app/views/_partials/route/errors.blade.php delete mode 100644 app/views/_partials/route/loading.blade.php delete mode 100644 app/views/_partials/route/planner.blade.php delete mode 100644 app/views/_partials/route/results.blade.php delete mode 100644 app/views/contributors/home.blade.php delete mode 100644 app/views/core/footer.blade.php delete mode 100644 app/views/core/head.blade.php delete mode 100644 app/views/core/navigation.blade.php delete mode 100644 app/views/errors/404.blade.php delete mode 100644 app/views/language.blade.php delete mode 100644 app/views/route/planner.blade.php delete mode 100644 app/views/stations/departurearchive.blade.php delete mode 100644 app/views/stations/departuredetail.blade.php delete mode 100644 app/views/stations/expired.blade.php delete mode 100644 app/views/stations/liveboard.blade.php delete mode 100644 app/views/stations/search.blade.php delete mode 100755 artisan delete mode 100644 bootstrap/autoload.php delete mode 100644 bootstrap/paths.php delete mode 100644 bootstrap/start.php delete mode 100644 bower.json delete mode 100644 composer.json delete mode 100644 composer.lock delete mode 100644 package.json delete mode 100644 phpunit.xml delete mode 100644 public/.htaccess delete mode 100644 public/app/css/style.css delete mode 100644 public/app/js/app.js delete mode 100644 public/app/js/iRail/Controllers/PlannerCtrl.js delete mode 100644 public/app/js/iRail/Controllers/StationLiveBoardCtrl.js delete mode 100644 public/app/js/iRail/Controllers/StationSearchCtrl.js delete mode 100644 public/app/sass/bootstrap/_variables.scss delete mode 100644 public/app/sass/irail/_theme.scss delete mode 100644 public/app/sass/style.scss delete mode 100644 public/apple-touch-icon-precomposed.png delete mode 100644 public/builds/js/scripts.js delete mode 100644 public/favicon.ico delete mode 100644 public/images/irail_logo_delays-01.png delete mode 100644 public/images/irail_logo_delays-01.svg delete mode 100644 public/images/irail_logo_delays-02.png delete mode 100644 public/images/irail_logo_delays-02.svg delete mode 100644 public/images/irail_logo_delays-03.png delete mode 100644 public/images/irail_logo_delays-03.svg delete mode 100644 public/images/irail_logo_delays-04.png delete mode 100644 public/images/irail_logo_delays-04.svg delete mode 100644 public/images/irail_logo_delays-05.png delete mode 100644 public/images/irail_logo_delays-05.svg delete mode 100644 public/images/irail_logo_delays-06.png delete mode 100644 public/images/irail_logo_delays-06.svg delete mode 100644 public/images/irail_logo_delays-07.png delete mode 100644 public/images/irail_logo_delays-07.svg delete mode 100644 public/images/irail_logo_delays-08.png delete mode 100644 public/images/irail_logo_delays-08.svg delete mode 100644 public/images/irail_logo_delays-09.png delete mode 100644 public/images/irail_logo_delays-09.svg delete mode 100644 public/images/logo.png delete mode 100755 public/images/logo.svg delete mode 100644 public/images/logoLarge.svg delete mode 100644 public/images/stair.svg delete mode 100644 public/images/train.jpg delete mode 100644 public/images/train.png delete mode 100644 public/images/train.svg delete mode 100644 public/images/train_png.png delete mode 100644 public/index.php delete mode 100644 public/packages/.gitkeep delete mode 100644 public/robots.txt delete mode 100644 server.php diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 55343bc6..00000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,11 +0,0 @@ -# Contribution Guidelines - -Please report all issues on the GitHub repository: https://github.com/iRail/hyperRail/ - -## Front end - -Assets are compiled using Grunt. To set this up you have to run `npm install`, `bower install` and `bundle install`. This will install all dependencies you need to compile the source files. - -To compile the files you can use `grunt` or `grunt watch`. - -The first one compiles all assets, the later one tracks changes in the source files and compiles when needed. \ No newline at end of file diff --git a/Gemfile b/Gemfile deleted file mode 100644 index 2fb482a0..00000000 --- a/Gemfile +++ /dev/null @@ -1,4 +0,0 @@ -source "https://rubygems.org" - -gem "sass", "~> 3.3.8" -gem "compass", "1.0.0.alpha.18" diff --git a/Gemfile.lock b/Gemfile.lock deleted file mode 100644 index b559fb87..00000000 --- a/Gemfile.lock +++ /dev/null @@ -1,36 +0,0 @@ -GEM - remote: https://rubygems.org/ - specs: - chunky_png (1.3.1) - compass (1.0.0.alpha.18) - chunky_png (~> 1.2) - compass-core (~> 1.0.0.alpha.17) - compass-import-once (~> 1.0.2) - json - listen (~> 1.1.0) - sass (~> 3.3.0.rc.3) - compass-core (1.0.0.alpha.19) - multi_json (~> 1.0) - sass (>= 3.3.0, < 3.5) - compass-import-once (1.0.4) - sass (>= 3.2, < 3.5) - ffi (1.9.3) - json (1.8.1) - listen (1.1.6) - rb-fsevent (>= 0.9.3) - rb-inotify (>= 0.9) - rb-kqueue (>= 0.2) - multi_json (1.10.1) - rb-fsevent (0.9.4) - rb-inotify (0.9.5) - ffi (>= 0.5.0) - rb-kqueue (0.2.3) - ffi (>= 0.5.0) - sass (3.3.8) - -PLATFORMS - ruby - -DEPENDENCIES - compass (= 1.0.0.alpha.18) - sass (~> 3.3.8) diff --git a/Gruntfile.js b/Gruntfile.js deleted file mode 100755 index 0d175416..00000000 --- a/Gruntfile.js +++ /dev/null @@ -1,69 +0,0 @@ -module.exports = function (grunt) { - - // Load modules - require('jit-grunt')(grunt, { - }); - - /** - * Loads all available tasks options - * - * @param {String} folder - * - * @return {Object} - */ - function loadConfig(folder) { - var glob = require('glob'); - var path = require('path'); - var key; - - glob.sync('**/*.js', {cwd: folder}).forEach(function (option) { - key = path.basename(option, '.js'); - config[key] = require(folder + option); - }); - } - - //////////////////////////////////////////////////////////////////// - //////////////////////////// CONFIGURATION ///////////////////////// - //////////////////////////////////////////////////////////////////// - - var config = { - pkg : grunt.file.readJSON('package.json'), - name: '<%= pkg.name %>', - - grunt : '.grunt', - app : 'public/app', - builds : 'public/builds', - components: 'public/components', - - paths: { - original: { - css : '<%= app %>/css', - js : '<%= app %>/js', - sass : '<%= app %>/sass', - fonts : '<%= app %>/fonts', - }, - compiled : { - css : '<%= builds %>/css', - js : '<%= builds %>/js', - fonts: '<%= builds %>/fonts', - }, - components: { - jquery : '<%= components %>/jquery/dist/jquery.js', - angular : '<%= components %>/angular/angular.js', - bootstrap : { - fonts : '<%= components %>/bootstrap-sass-official/assets/fonts/bootstrap', - js : '<%= components %>/bootstrap-sass-official/assets/javascripts/bootstrap.js', - } - } - }, - }; - - // Load all tasks - var gruntPath = './' + config.grunt + '/'; - loadConfig(gruntPath); - grunt.initConfig(config); - - // Load custom tasks - require(gruntPath + 'tasks.js')(grunt); - -}; \ No newline at end of file diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 3bbbc1ee..00000000 --- a/LICENSE +++ /dev/null @@ -1,116 +0,0 @@ -CC0 1.0 Universal - -Statement of Purpose - -The laws of most jurisdictions throughout the world automatically confer -exclusive Copyright and Related Rights (defined below) upon the creator and -subsequent owner(s) (each and all, an "owner") of an original work of -authorship and/or a database (each, a "Work"). - -Certain owners wish to permanently relinquish those rights to a Work for the -purpose of contributing to a commons of creative, cultural and scientific -works ("Commons") that the public can reliably and without fear of later -claims of infringement build upon, modify, incorporate in other works, reuse -and redistribute as freely as possible in any form whatsoever and for any -purposes, including without limitation commercial purposes. These owners may -contribute to the Commons to promote the ideal of a free culture and the -further production of creative, cultural and scientific works, or to gain -reputation or greater distribution for their Work in part through the use and -efforts of others. - -For these and/or other purposes and motivations, and without any expectation -of additional consideration or compensation, the person associating CC0 with a -Work (the "Affirmer"), to the extent that he or she is an owner of Copyright -and Related Rights in the Work, voluntarily elects to apply CC0 to the Work -and publicly distribute the Work under its terms, with knowledge of his or her -Copyright and Related Rights in the Work and the meaning and intended legal -effect of CC0 on those rights. - -1. Copyright and Related Rights. A Work made available under CC0 may be -protected by copyright and related or neighboring rights ("Copyright and -Related Rights"). Copyright and Related Rights include, but are not limited -to, the following: - - i. the right to reproduce, adapt, distribute, perform, display, communicate, - and translate a Work; - - ii. moral rights retained by the original author(s) and/or performer(s); - - iii. publicity and privacy rights pertaining to a person's image or likeness - depicted in a Work; - - iv. rights protecting against unfair competition in regards to a Work, - subject to the limitations in paragraph 4(a), below; - - v. rights protecting the extraction, dissemination, use and reuse of data in - a Work; - - vi. database rights (such as those arising under Directive 96/9/EC of the - European Parliament and of the Council of 11 March 1996 on the legal - protection of databases, and under any national implementation thereof, - including any amended or successor version of such directive); and - - vii. other similar, equivalent or corresponding rights throughout the world - based on applicable law or treaty, and any national implementations thereof. - -2. Waiver. To the greatest extent permitted by, but not in contravention of, -applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and -unconditionally waives, abandons, and surrenders all of Affirmer's Copyright -and Related Rights and associated claims and causes of action, whether now -known or unknown (including existing as well as future claims and causes of -action), in the Work (i) in all territories worldwide, (ii) for the maximum -duration provided by applicable law or treaty (including future time -extensions), (iii) in any current or future medium and for any number of -copies, and (iv) for any purpose whatsoever, including without limitation -commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes -the Waiver for the benefit of each member of the public at large and to the -detriment of Affirmer's heirs and successors, fully intending that such Waiver -shall not be subject to revocation, rescission, cancellation, termination, or -any other legal or equitable action to disrupt the quiet enjoyment of the Work -by the public as contemplated by Affirmer's express Statement of Purpose. - -3. Public License Fallback. Should any part of the Waiver for any reason be -judged legally invalid or ineffective under applicable law, then the Waiver -shall be preserved to the maximum extent permitted taking into account -Affirmer's express Statement of Purpose. In addition, to the extent the Waiver -is so judged Affirmer hereby grants to each affected person a royalty-free, -non transferable, non sublicensable, non exclusive, irrevocable and -unconditional license to exercise Affirmer's Copyright and Related Rights in -the Work (i) in all territories worldwide, (ii) for the maximum duration -provided by applicable law or treaty (including future time extensions), (iii) -in any current or future medium and for any number of copies, and (iv) for any -purpose whatsoever, including without limitation commercial, advertising or -promotional purposes (the "License"). The License shall be deemed effective as -of the date CC0 was applied by Affirmer to the Work. Should any part of the -License for any reason be judged legally invalid or ineffective under -applicable law, such partial invalidity or ineffectiveness shall not -invalidate the remainder of the License, and in such case Affirmer hereby -affirms that he or she will not (i) exercise any of his or her remaining -Copyright and Related Rights in the Work or (ii) assert any associated claims -and causes of action with respect to the Work, in either case contrary to -Affirmer's express Statement of Purpose. - -4. Limitations and Disclaimers. - - a. No trademark or patent rights held by Affirmer are waived, abandoned, - surrendered, licensed or otherwise affected by this document. - - b. Affirmer offers the Work as-is and makes no representations or warranties - of any kind concerning the Work, express, implied, statutory or otherwise, - including without limitation warranties of title, merchantability, fitness - for a particular purpose, non infringement, or the absence of latent or - other defects, accuracy, or the present or absence of errors, whether or not - discoverable, all to the greatest extent permissible under applicable law. - - c. Affirmer disclaims responsibility for clearing rights of other persons - that may apply to the Work or any use thereof, including without limitation - any person's Copyright and Related Rights in the Work. Further, Affirmer - disclaims responsibility for obtaining any necessary consents, permissions - or other rights required for any use of the Work. - - d. Affirmer understands and acknowledges that Creative Commons is not a - party to this document and has no duty or obligation with respect to this - CC0 or use of the Work. - -For more information, please see - \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index a99ef0f5..00000000 --- a/README.md +++ /dev/null @@ -1,70 +0,0 @@ -# iRail.be - -[iRail.be](https://irail.be) is a web-application that uses data from http://api.irail.be ([source code](https://github.com/irail/irail).) to create a hyper-media driven application for the Belgian railway company. - -_Looking for data? Check https://hello.irail.be for more info_ - -## Features - - * Implemented: [Content negotiation](https://en.wikipedia.org/wiki/Content_negotiation) for languages (en, fr, nl and de) and content-types (application/json and text/html) - * Implemented: auto-complete for [all SNCB stations](https://irail.be/irail/stations) - * Implemented: route planning interface - * Planned: support for the [Hydra Linked Data vocabulary](http://www.hydra-cg.com/) for [hypermedia](https://en.wikipedia.org/wiki/Hypermedia) - -_Want more features? Please do contribute by adding [feature requests](https://github.com/iRail/hyperRail/issues/new). Are you a developer? We accept pull requests!_ - -## Install locally for development purposes - -Next to following these steps, you can also use [vagrant](https://www.vagrantup.com/). After cloning the repo, do `vagrant up` and a new virtual machine will be set up. - -### Step 0: Requirements and clone ### - -* PHP 5.3+ for Laravel project -* PHP 5.4+ for Way/Generators, if you have 5.4+ you can uncomment Way/Generators in /app/config/app.php -* Apache - -Clone the repository: - -```bash -git clone https://github.com/iRail/hyperRail.git -``` - -### Step 1: Install dependencies ### - -Run `composer update`. If you do not yet have composer, get it here: http://getcomposer.org - -### Step 2: Update bootstrap/start.php for environments ### - -Optional, but can be useful. - -### Step 3: make app/storage writeable ### - -```bash -chmod -R 777 app/storage -``` - -### Step 4: Set up hostname ### - -In /app/config/app.php set the following to your personal hostname/preferences: - - 'url' => 'http://irail.dev', // with http - 'url-short' => 'irail.dev', // without http - -### Step 5: Set up resources ### - - * `npm install` - * `npm run update-stations` - * `bower install` - * `grunt` - -### Step 6: You're ready! ### - -Usually you should be ready to get started by visiting the hostname you have set up. If it does not work, log an [issue](https://github.com/iRail/hyperRail/issues/new). We'll help you out and fix the documentation for everyone else. - -In case you just want to update the stations list to the latest version, run: `npm run update-stations` - -# License - -We hereby put this work in the public domain under a [CC0 license](https://creativecommons.org/publicdomain/zero/1.0/)! - -Feel free to attribute us at http://hello.irail.be. diff --git a/Vagrantfile b/Vagrantfile deleted file mode 100644 index 08ab0d03..00000000 --- a/Vagrantfile +++ /dev/null @@ -1,146 +0,0 @@ -# -*- mode: ruby -*- -# vi: set ft=ruby : - -# Config Github Settings -github_username = "fideloper" -github_repo = "Vaprobash12" -github_branch = "master" - -# Server Configuration - -# Set a local private network IP address. -# See http://en.wikipedia.org/wiki/Private_network for explanation -# You can use the following IP ranges: -# 10.0.0.1 - 10.255.255.254 -# 172.16.0.1 - 172.31.255.254 -# 192.168.0.1 - 192.168.255.254 -server_ip = "192.168.100.10" -server_memory = "384" # MB -server_timezone = "UTC" -server_hostname = "irail.dev" - -# Database Configuration -mysql_root_password = "root" # We'll assume user "root" -mysql_version = "5.5" # Options: 5.5 | 5.6 -mysql_enable_remote = "false" # remote access enabled when true - -# Languages and Packages -ruby_version = "latest" # Choose what ruby version should be installed (will also be the default version) -ruby_gems = [ # List any Ruby Gems that you want to install - #"jekyll", - "sass", - "compass", -] - -# HHVM pptions -hhvm_use_fastcgi = "false" # Use HHVM as FastCGI (over php-fpm) -hhvm_over_php = "false" # Symlink HHVM to PHP, so calls to PHP run via HHVM - -# PHP Options -php_version = "latest" # Options: latest|previous|distributed For 12.04. latest=5.5, previous=5.4, distributed=5.3 -composer_packages = [ # List any global Composer packages that you want to install - "phpunit/phpunit:4.0.*", - "codeception/codeception=*", - "phpspec/phpspec:2.0.*@dev", -] -public_folder = "/vagrant/public" # If installing Symfony or Laravel, leave this blank to default to the framework public directory - -nodejs_version = "latest" # By default "latest" will equal the latest stable version -nodejs_packages = [ # List any global NodeJS packages that you want to install - "grunt-cli", - "bower", -] - -Vagrant.configure("2") do |config| - - # Set server to Ubuntu 12.04 - config.vm.box = "precise64" - - config.vm.box_url = "http://files.vagrantup.com/precise64.box" - # If using VMWare Fusion Provider: - # config.vm.box_url = "http://files.vagrantup.com/precise64_vmware.box" - - # Create a hostname, don't forget to put it to the `hosts` file - # This will point to the server's default virtual host - # TO DO: Make this work with virtualhost along-side xip.io URL - config.vm.hostname = server_hostname - - # Create a static IP - config.vm.network :private_network, ip: server_ip - - # Use NFS for the shared folder - config.vm.synced_folder ".", "/vagrant", - id: "core", - :nfs => true, - :mount_options => ['nolock,vers=3,udp,noatime'] - - # If using VirtualBox - config.vm.provider :virtualbox do |vb| - - # Set server memory - vb.customize ["modifyvm", :id, "--memory", server_memory] - - # Set the timesync threshold to 10 seconds, instead of the default 20 minutes. - # If the clock gets more than 15 minutes out of sync (due to your laptop going - # to sleep for instance, then some 3rd party services will reject requests. - vb.customize ["guestproperty", "set", :id, "/VirtualBox/GuestAdd/VBoxService/--timesync-set-threshold", 10000] - - # Prevent VMs running on Ubuntu to lose internet connection - # vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"] - # vb.customize ["modifyvm", :id, "--natdnsproxy1", "on"] - - end - - # If using VMWare Fusion - config.vm.provider :vmware_fusion do |vb| - - # Set server memory - vb.vmx["memsize"] = server_memory - - end - - # If using Vagrant-Cachier - # http://fgrehm.viewdocs.io/vagrant-cachier - if Vagrant.has_plugin?("vagrant-cachier") - # Configure cached packages to be shared between instances of the same base box. - # Usage docs: http://fgrehm.viewdocs.io/vagrant-cachier/usage - config.cache.scope = :box - - config.cache.synced_folder_opts = { - type: :nfs, - mount_options: ['rw', 'vers=3', 'tcp', 'nolock'] - } - end - - #### - # Base Items - ########## - - # Provision Base Packages - config.vm.provision "shell", path: "https://raw.github.com/#{github_username}/#{github_repo}/#{github_branch}/scripts/base.sh" - - # Provision PHP - config.vm.provision "shell", path: "https://raw.github.com/#{github_username}/#{github_repo}/#{github_branch}/scripts/php.sh", args: [php_version, server_timezone] - - - #### - # Web Servers - ########## - - # Provision Apache Base - config.vm.provision "shell", path: "https://raw.github.com/#{github_username}/#{github_repo}/#{github_branch}/scripts/apache.sh", args: [server_ip, public_folder] - - # Create Project VirtualHost - config.vm.provision "shell", inline: "sudo vhost -s #{server_hostname} -d #{public_folder}; sudo a2ensite #{server_hostname}; sudo service apache2 restart" - - # Disable the default VirtualHost - config.vm.provision "shell", inline: "sudo rm /etc/apache2/sites-enabled/000-default.conf; sudo service apache2 restart" - - #### - # Frameworks and Tooling - ########## - - # Provision Composer - config.vm.provision "shell", path: "https://raw.github.com/#{github_username}/#{github_repo}/#{github_branch}/scripts/composer.sh", privileged: false, args: composer_packages.join(" ") - -end \ No newline at end of file diff --git a/app/commands/.gitkeep b/app/commands/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/app/config/app.php b/app/config/app.php deleted file mode 100644 index b0785fc5..00000000 --- a/app/config/app.php +++ /dev/null @@ -1,180 +0,0 @@ - true, - - /* - |-------------------------------------------------------------------------- - | Application URL - |-------------------------------------------------------------------------- - | - | This URL is used by the console to properly generate URLs when using - | the Artisan command line tool. You should set this to the root of - | your application so that it is used when running Artisan tasks. - | - */ - - 'url' => 'http://irail.dev', // with http - 'url-short' => 'irail.dev', // without http - - /* - |-------------------------------------------------------------------------- - | Application Timezone - |-------------------------------------------------------------------------- - | - | Here you may specify the default timezone for your application, which - | will be used by the PHP date and date-time functions. We have gone - | ahead and set this to a sensible default for you out of the box. - | - */ - - 'timezone' => 'Europe/Brussels', - - /* - |-------------------------------------------------------------------------- - | Application Locale Configuration - |-------------------------------------------------------------------------- - | - | The application locale determines the default locale that will be used - | by the translation service provider. You are free to set this value - | to any of the locales which will be supported by the application. - | - */ - - 'locale' => 'en', - - /* - |-------------------------------------------------------------------------- - | Encryption Key - |-------------------------------------------------------------------------- - | - | This key is used by the Illuminate encrypter service and should be set - | to a random, 32 character string, otherwise these encrypted strings - | will not be safe. Please do this before deploying an application! - | - */ - - 'key' => '5Cl3bgfvG2ZJg47WQy9ZHbGfo9OB04SO', - - /* - |-------------------------------------------------------------------------- - | Autoloaded Service Providers - |-------------------------------------------------------------------------- - | - | The service providers listed here will be automatically loaded on the - | request to your application. Feel free to add your own services to - | this array to grant expanded functionality to your applications. - | - */ - - 'providers' => array( - - 'Illuminate\Foundation\Providers\ArtisanServiceProvider', - 'Illuminate\Auth\AuthServiceProvider', - 'Illuminate\Cache\CacheServiceProvider', - 'Illuminate\Session\CommandsServiceProvider', - 'Illuminate\Foundation\Providers\ConsoleSupportServiceProvider', - 'Illuminate\Routing\ControllerServiceProvider', - 'Illuminate\Cookie\CookieServiceProvider', - 'Illuminate\Database\DatabaseServiceProvider', - 'Illuminate\Encryption\EncryptionServiceProvider', - 'Illuminate\Filesystem\FilesystemServiceProvider', - 'Illuminate\Hashing\HashServiceProvider', - 'Illuminate\Html\HtmlServiceProvider', - 'Illuminate\Log\LogServiceProvider', - 'Illuminate\Mail\MailServiceProvider', - 'Illuminate\Database\MigrationServiceProvider', - 'Illuminate\Pagination\PaginationServiceProvider', - 'Illuminate\Queue\QueueServiceProvider', - 'Illuminate\Redis\RedisServiceProvider', - 'Illuminate\Remote\RemoteServiceProvider', - 'Illuminate\Auth\Reminders\ReminderServiceProvider', - 'Illuminate\Database\SeedServiceProvider', - 'Illuminate\Session\SessionServiceProvider', - 'Illuminate\Translation\TranslationServiceProvider', - 'Illuminate\Validation\ValidationServiceProvider', - 'Illuminate\View\ViewServiceProvider', - 'Illuminate\Workbench\WorkbenchServiceProvider', - 'Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider', - // 'Way\Generators\GeneratorsServiceProvider', - ), - - /* - |-------------------------------------------------------------------------- - | Service Provider Manifest - |-------------------------------------------------------------------------- - | - | The service provider manifest is used by Laravel to lazy load service - | providers which are not needed for each request, as well to keep a - | list of all of the services. Here, you may set its storage spot. - | - */ - - 'manifest' => storage_path() . '/meta', - - /* - |-------------------------------------------------------------------------- - | Class Aliases - |-------------------------------------------------------------------------- - | - | This array of class aliases will be registered when this application - | is started. However, feel free to register as many as you wish as - | the aliases are "lazy" loaded so they don't hinder performance. - | - */ - - 'aliases' => array( - - 'App' => 'Illuminate\Support\Facades\App', - 'Artisan' => 'Illuminate\Support\Facades\Artisan', - 'Auth' => 'Illuminate\Support\Facades\Auth', - 'Blade' => 'Illuminate\Support\Facades\Blade', - 'Cache' => 'Illuminate\Support\Facades\Cache', - 'ClassLoader' => 'Illuminate\Support\ClassLoader', - 'Config' => 'Illuminate\Support\Facades\Config', - 'Controller' => 'Illuminate\Routing\Controller', - 'Cookie' => 'Illuminate\Support\Facades\Cookie', - 'Crypt' => 'Illuminate\Support\Facades\Crypt', - 'DB' => 'Illuminate\Support\Facades\DB', - 'Eloquent' => 'Illuminate\Database\Eloquent\Model', - 'Event' => 'Illuminate\Support\Facades\Event', - 'File' => 'Illuminate\Support\Facades\File', - 'Form' => 'Illuminate\Support\Facades\Form', - 'Hash' => 'Illuminate\Support\Facades\Hash', - 'HTML' => 'Illuminate\Support\Facades\HTML', - 'Input' => 'Illuminate\Support\Facades\Input', - 'Lang' => 'Illuminate\Support\Facades\Lang', - 'Log' => 'Illuminate\Support\Facades\Log', - 'Mail' => 'Illuminate\Support\Facades\Mail', - 'Paginator' => 'Illuminate\Support\Facades\Paginator', - 'Password' => 'Illuminate\Support\Facades\Password', - 'Queue' => 'Illuminate\Support\Facades\Queue', - 'Redirect' => 'Illuminate\Support\Facades\Redirect', - 'Redis' => 'Illuminate\Support\Facades\Redis', - 'Request' => 'Illuminate\Support\Facades\Request', - 'Response' => 'Illuminate\Support\Facades\Response', - 'Route' => 'Illuminate\Support\Facades\Route', - 'Schema' => 'Illuminate\Support\Facades\Schema', - 'Seeder' => 'Illuminate\Database\Seeder', - 'Session' => 'Illuminate\Support\Facades\Session', - 'SSH' => 'Illuminate\Support\Facades\SSH', - 'Str' => 'Illuminate\Support\Str', - 'URL' => 'Illuminate\Support\Facades\URL', - 'Validator' => 'Illuminate\Support\Facades\Validator', - 'View' => 'Illuminate\Support\Facades\View', - - ), - -); diff --git a/app/config/auth.php b/app/config/auth.php deleted file mode 100644 index 852ed4c9..00000000 --- a/app/config/auth.php +++ /dev/null @@ -1,71 +0,0 @@ - 'eloquent', - - /* - |-------------------------------------------------------------------------- - | Authentication Model - |-------------------------------------------------------------------------- - | - | When using the "Eloquent" authentication driver, we need to know which - | Eloquent model should be used to retrieve your users. Of course, it - | is often just the "User" model but you may use whatever you like. - | - */ - - 'model' => 'User', - - /* - |-------------------------------------------------------------------------- - | Authentication Table - |-------------------------------------------------------------------------- - | - | When using the "Database" authentication driver, we need to know which - | table should be used to retrieve your users. We have chosen a basic - | default value but you may easily change it to any table you like. - | - */ - - 'table' => 'users', - - /* - |-------------------------------------------------------------------------- - | Password Reminder Settings - |-------------------------------------------------------------------------- - | - | Here you may set the settings for password reminders, including a view - | that should be used as your password reminder e-mail. You will also - | be able to set the name of the table that holds the reset tokens. - | - | The "expire" time is the number of minutes that the reminder should be - | considered valid. This security feature keeps tokens short-lived so - | they have less time to be guessed. You may change this as needed. - | - */ - - 'reminder' => array( - - 'email' => 'emails.auth.reminder', - - 'table' => 'password_reminders', - - 'expire' => 60, - - ), - -); diff --git a/app/config/cache.php b/app/config/cache.php deleted file mode 100644 index c3702b01..00000000 --- a/app/config/cache.php +++ /dev/null @@ -1,89 +0,0 @@ - 'file', - - /* - |-------------------------------------------------------------------------- - | File Cache Location - |-------------------------------------------------------------------------- - | - | When using the "file" cache driver, we need a location where the cache - | files may be stored. A sensible default has been specified, but you - | are free to change it to any other place on disk that you desire. - | - */ - - 'path' => storage_path() . '/cache', - - /* - |-------------------------------------------------------------------------- - | Database Cache Connection - |-------------------------------------------------------------------------- - | - | When using the "database" cache driver you may specify the connection - | that should be used to store the cached items. When this option is - | null the default database connection will be utilized for cache. - | - */ - - 'connection' => null, - - /* - |-------------------------------------------------------------------------- - | Database Cache Table - |-------------------------------------------------------------------------- - | - | When using the "database" cache driver we need to know the table that - | should be used to store the cached items. A default table name has - | been provided but you're free to change it however you deem fit. - | - */ - - 'table' => 'cache', - - /* - |-------------------------------------------------------------------------- - | Memcached Servers - |-------------------------------------------------------------------------- - | - | Now you may specify an array of your Memcached servers that should be - | used when utilizing the Memcached cache driver. All of the servers - | should contain a value for "host", "port", and "weight" options. - | - */ - - 'memcached' => array( - - array('host' => '127.0.0.1', 'port' => 11211, 'weight' => 100), - - ), - - /* - |-------------------------------------------------------------------------- - | Cache Key Prefix - |-------------------------------------------------------------------------- - | - | When utilizing a RAM based store such as APC or Memcached, there might - | be other applications utilizing the same cache. So, we'll specify a - | value to get prefixed to all our keys so we can avoid collisions. - | - */ - - 'prefix' => 'laravel', - -); diff --git a/app/config/compile.php b/app/config/compile.php deleted file mode 100644 index 44c6f192..00000000 --- a/app/config/compile.php +++ /dev/null @@ -1,15 +0,0 @@ - PDO::FETCH_CLASS, - - /* - |-------------------------------------------------------------------------- - | Default Database Connection Name - |-------------------------------------------------------------------------- - | - | Here you may specify which of the database connections below you wish - | to use as your default connection for all database work. Of course - | you may use many connections at once using the Database library. - | - */ - - 'default' => 'mysql', - - /* - |-------------------------------------------------------------------------- - | Database Connections - |-------------------------------------------------------------------------- - | - | Here are each of the database connections setup for your application. - | Of course, examples of configuring each database platform that is - | supported by Laravel is shown below to make development simple. - | - | - | All database work in Laravel is done through the PHP PDO facilities - | so make sure you have the driver for your particular database of - | choice installed on your machine before you begin development. - | - */ - - 'connections' => array( - - 'sqlite' => array( - 'driver' => 'sqlite', - 'database' => __DIR__ . '/../database/production.sqlite', - 'prefix' => '', - ), - - 'mysql' => array( - 'driver' => 'mysql', - 'host' => 'localhost', - 'database' => 'database', - 'username' => 'root', - 'password' => '', - 'charset' => 'utf8', - 'collation' => 'utf8_unicode_ci', - 'prefix' => '', - ), - - 'pgsql' => array( - 'driver' => 'pgsql', - 'host' => 'localhost', - 'database' => 'database', - 'username' => 'root', - 'password' => '', - 'charset' => 'utf8', - 'prefix' => '', - 'schema' => 'public', - ), - - 'sqlsrv' => array( - 'driver' => 'sqlsrv', - 'host' => 'localhost', - 'database' => 'database', - 'username' => 'root', - 'password' => '', - 'prefix' => '', - ), - - ), - - /* - |-------------------------------------------------------------------------- - | Migration Repository Table - |-------------------------------------------------------------------------- - | - | This table keeps track of all the migrations that have already run for - | your application. Using this information, we can determine which of - | the migrations on disk haven't actually been run in the database. - | - */ - - 'migrations' => 'migrations', - - /* - |-------------------------------------------------------------------------- - | Redis Databases - |-------------------------------------------------------------------------- - | - | Redis is an open source, fast, and advanced key-value store that also - | provides a richer set of commands than a typical key-value systems - | such as APC or Memcached. Laravel makes it easy to dig right in. - | - */ - - 'redis' => array( - - 'cluster' => false, - - 'default' => array( - 'host' => '127.0.0.1', - 'port' => 6379, - 'database' => 0, - ), - - ), - -); diff --git a/app/config/mail.php b/app/config/mail.php deleted file mode 100644 index e98e3714..00000000 --- a/app/config/mail.php +++ /dev/null @@ -1,124 +0,0 @@ - 'smtp', - - /* - |-------------------------------------------------------------------------- - | SMTP Host Address - |-------------------------------------------------------------------------- - | - | Here you may provide the host address of the SMTP server used by your - | applications. A default option is provided that is compatible with - | the Postmark mail service, which will provide reliable delivery. - | - */ - - 'host' => 'smtp.mailgun.org', - - /* - |-------------------------------------------------------------------------- - | SMTP Host Port - |-------------------------------------------------------------------------- - | - | This is the SMTP port used by your application to delivery e-mails to - | users of your application. Like the host we have set this value to - | stay compatible with the Postmark e-mail application by default. - | - */ - - 'port' => 587, - - /* - |-------------------------------------------------------------------------- - | Global "From" Address - |-------------------------------------------------------------------------- - | - | You may wish for all e-mails sent by your application to be sent from - | the same address. Here, you may specify a name and address that is - | used globally for all e-mails that are sent by your application. - | - */ - - 'from' => array('address' => null, 'name' => null), - - /* - |-------------------------------------------------------------------------- - | E-Mail Encryption Protocol - |-------------------------------------------------------------------------- - | - | Here you may specify the encryption protocol that should be used when - | the application send e-mail messages. A sensible default using the - | transport layer security protocol should provide great security. - | - */ - - 'encryption' => 'tls', - - /* - |-------------------------------------------------------------------------- - | SMTP Server Username - |-------------------------------------------------------------------------- - | - | If your SMTP server requires a username for authentication, you should - | set it here. This will get used to authenticate with your server on - | connection. You may also set the "password" value below this one. - | - */ - - 'username' => null, - - /* - |-------------------------------------------------------------------------- - | SMTP Server Password - |-------------------------------------------------------------------------- - | - | Here you may set the password required by your SMTP server to send out - | messages from your application. This will be given to the server on - | connection so that the application will be able to send messages. - | - */ - - 'password' => null, - - /* - |-------------------------------------------------------------------------- - | Sendmail System Path - |-------------------------------------------------------------------------- - | - | When using the "sendmail" driver to send e-mails, we will need to know - | the path to where Sendmail lives on this server. A default path has - | been provided here, which will work well on most of your systems. - | - */ - - 'sendmail' => '/usr/sbin/sendmail -bs', - - /* - |-------------------------------------------------------------------------- - | Mail "Pretend" - |-------------------------------------------------------------------------- - | - | When this option is enabled, e-mail will not actually be sent over the - | web and will instead be written to your application's logs files so - | you may inspect the message. This is great for local development. - | - */ - - 'pretend' => false, - -); \ No newline at end of file diff --git a/app/config/packages/.gitkeep b/app/config/packages/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/app/config/queue.php b/app/config/queue.php deleted file mode 100644 index 2e46c4f8..00000000 --- a/app/config/queue.php +++ /dev/null @@ -1,82 +0,0 @@ - 'sync', - - /* - |-------------------------------------------------------------------------- - | Queue Connections - |-------------------------------------------------------------------------- - | - | Here you may configure the connection information for each server that - | is used by your application. A default configuration has been added - | for each back-end shipped with Laravel. You are free to add more. - | - */ - - 'connections' => array( - - 'sync' => array( - 'driver' => 'sync', - ), - - 'beanstalkd' => array( - 'driver' => 'beanstalkd', - 'host' => 'localhost', - 'queue' => 'default', - ), - - 'sqs' => array( - 'driver' => 'sqs', - 'key' => 'your-public-key', - 'secret' => 'your-secret-key', - 'queue' => 'your-queue-url', - 'region' => 'us-east-1', - ), - - 'iron' => array( - 'driver' => 'iron', - 'project' => 'your-project-id', - 'token' => 'your-token', - 'queue' => 'your-queue-name', - ), - - 'redis' => array( - 'driver' => 'redis', - 'queue' => 'default', - ), - - ), - - /* - |-------------------------------------------------------------------------- - | Failed Queue Jobs - |-------------------------------------------------------------------------- - | - | These options configure the behavior of failed queue job logging so you - | can control which database and table are used to store the jobs that - | have failed. You may change them to any database / table you wish. - | - */ - - 'failed' => array( - - 'database' => 'mysql', 'table' => 'failed_jobs', - - ), - -); diff --git a/app/config/remote.php b/app/config/remote.php deleted file mode 100644 index 2e60f3dc..00000000 --- a/app/config/remote.php +++ /dev/null @@ -1,59 +0,0 @@ - 'production', - - /* - |-------------------------------------------------------------------------- - | Remote Server Connections - |-------------------------------------------------------------------------- - | - | These are the servers that will be accessible via the SSH task runner - | facilities of Laravel. This feature radically simplifies executing - | tasks on your servers, such as deploying out these applications. - | - */ - - 'connections' => array( - - 'production' => array( - 'host' => '', - 'username' => '', - 'password' => '', - 'key' => '', - 'keyphrase' => '', - 'root' => '/var/www', - ), - - ), - - /* - |-------------------------------------------------------------------------- - | Remote Server Groups - |-------------------------------------------------------------------------- - | - | Here you may list connections under a single group name, which allows - | you to easily access all of the servers at once using a short name - | that is extremely easy to remember, such as "web" or "database". - | - */ - - 'groups' => array( - - 'web' => array('production') - - ), - -); \ No newline at end of file diff --git a/app/config/session.php b/app/config/session.php deleted file mode 100644 index a5adc66f..00000000 --- a/app/config/session.php +++ /dev/null @@ -1,140 +0,0 @@ - 'cookie', - - /* - |-------------------------------------------------------------------------- - | Session Lifetime - |-------------------------------------------------------------------------- - | - | Here you may specify the number of minutes that you wish the session - | to be allowed to remain idle before it expires. If you want them - | to immediately expire on the browser closing, set that option. - | - */ - - 'lifetime' => 512640, //one year - - 'expire_on_close' => false, - - /* - |-------------------------------------------------------------------------- - | Session File Location - |-------------------------------------------------------------------------- - | - | When using the native session driver, we need a location where session - | files may be stored. A default has been set for you but a different - | location may be specified. This is only needed for file sessions. - | - */ - - 'files' => storage_path() . '/sessions', - - /* - |-------------------------------------------------------------------------- - | Session Database Connection - |-------------------------------------------------------------------------- - | - | When using the "database" or "redis" session drivers, you may specify a - | connection that should be used to manage these sessions. This should - | correspond to a connection in your database configuration options. - | - */ - - 'connection' => null, - - /* - |-------------------------------------------------------------------------- - | Session Database Table - |-------------------------------------------------------------------------- - | - | When using the "database" session driver, you may specify the table we - | should use to manage the sessions. Of course, a sensible default is - | provided for you; however, you are free to change this as needed. - | - */ - - 'table' => 'sessions', - - /* - |-------------------------------------------------------------------------- - | Session Sweeping Lottery - |-------------------------------------------------------------------------- - | - | Some session drivers must manually sweep their storage location to get - | rid of old sessions from storage. Here are the chances that it will - | happen on a given request. By default, the odds are 2 out of 100. - | - */ - - 'lottery' => array(2, 100), - - /* - |-------------------------------------------------------------------------- - | Session Cookie Name - |-------------------------------------------------------------------------- - | - | Here you may change the name of the cookie used to identify a session - | instance by ID. The name specified here will get used every time a - | new session cookie is created by the framework for every driver. - | - */ - - 'cookie' => 'laravel_session', - - /* - |-------------------------------------------------------------------------- - | Session Cookie Path - |-------------------------------------------------------------------------- - | - | The session cookie path determines the path for which the cookie will - | be regarded as available. Typically, this will be the root path of - | your application but you are free to change this when necessary. - | - */ - - 'path' => '/', - - /* - |-------------------------------------------------------------------------- - | Session Cookie Domain - |-------------------------------------------------------------------------- - | - | Here you may change the domain of the cookie used to identify a session - | in your application. This will determine which domains the cookie is - | available to in your application. A sensible default has been set. - | - */ - - 'domain' => null, - - /* - |-------------------------------------------------------------------------- - | HTTPS Only Cookies - |-------------------------------------------------------------------------- - | - | By setting this option to true, session cookies will only be sent back - | to the server if the browser has a HTTPS connection. This will keep - | the cookie from being sent to you if it can not be done securely. - | - */ - - 'secure' => false, - -); diff --git a/app/config/testing/cache.php b/app/config/testing/cache.php deleted file mode 100644 index d50b36ed..00000000 --- a/app/config/testing/cache.php +++ /dev/null @@ -1,20 +0,0 @@ - 'array', - -); diff --git a/app/config/testing/session.php b/app/config/testing/session.php deleted file mode 100644 index 450b9945..00000000 --- a/app/config/testing/session.php +++ /dev/null @@ -1,21 +0,0 @@ - 'array', - -); diff --git a/app/config/view.php b/app/config/view.php deleted file mode 100644 index deb24809..00000000 --- a/app/config/view.php +++ /dev/null @@ -1,31 +0,0 @@ - array(__DIR__ . '/../views'), - - /* - |-------------------------------------------------------------------------- - | Pagination View - |-------------------------------------------------------------------------- - | - | This view will be used to render the pagination link output, and can - | be easily customized here to show any view you like. A clean view - | compatible with Twitter's Bootstrap is given to you by default. - | - */ - - 'pagination' => 'pagination::slider-3', - -); diff --git a/app/config/workbench.php b/app/config/workbench.php deleted file mode 100644 index 9a36c418..00000000 --- a/app/config/workbench.php +++ /dev/null @@ -1,31 +0,0 @@ - '', - - /* - |-------------------------------------------------------------------------- - | Workbench Author E-Mail Address - |-------------------------------------------------------------------------- - | - | Like the option above, your e-mail address is used when generating new - | workbench packages. The e-mail is placed in your composer.json file - | automatically after the package is created by the workbench tool. - | - */ - - 'email' => '', - -); \ No newline at end of file diff --git a/app/controllers/.gitkeep b/app/controllers/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/app/controllers/BaseController.php b/app/controllers/BaseController.php deleted file mode 100644 index d22a9b0a..00000000 --- a/app/controllers/BaseController.php +++ /dev/null @@ -1,16 +0,0 @@ -layout)) { - $this->layout = View::make($this->layout); - } - } -} diff --git a/app/controllers/ClassicRedirectController.php b/app/controllers/ClassicRedirectController.php deleted file mode 100644 index 8e131c7b..00000000 --- a/app/controllers/ClassicRedirectController.php +++ /dev/null @@ -1,65 +0,0 @@ -id); - } else { - return 'Liveboard for the following station: ' . $station_provided_string . ' was not found.'; - } - return null; - } - - /** - * Redirect classic liveboards URL to the new location - * and interpret two station names - */ - public function redirectBoardTwoStations($station, $station2) - { - return 'Liveboards with multiple stations are no longer supported.'; - } - - /** - * Redirect classic routing from the old iRail to the new - * way the routing is done - */ - public function redirectHomeRoute($departure_station, $destination_station) - { - $departure = \hyperRail\StationString::convertToId($departure_station); - $destination = \hyperRail\StationString::convertToId($destination_station); - - if ($departure != null && $destination != null) { - header("HTTP/1.1 301 Moved Permanently"); - return Redirect::to("https://" . _DOMAIN_ . "/route" . - "?from=" . $departure->{'@id'} . "&to=" . $destination->{'@id'} . "&time=" - . date("Hi") . "&auto=true"); - } else { - return "It looks like we couldn't convert your route request to the new format :("; - } - } - - public function redirectSettings() - { - return 'iRail has been changed. iRail no longer has a dedicated settings page.'; - } -} diff --git a/app/controllers/ContributorsController.php b/app/controllers/ContributorsController.php deleted file mode 100644 index ba75e2d9..00000000 --- a/app/controllers/ContributorsController.php +++ /dev/null @@ -1,9 +0,0 @@ -getBest($acceptHeader, $priorities); - // Default to html if $result is not set - $val = "text/html"; - if (isset($result)) { - $val = $result->getValue(); - } - // See what kind of content we should return - switch ($val) { - case "text/html": - // In case we want to return html, just let - // Laravel render the view and send the headers - return Response::view('route.planner') - ->header('Content-Type', "text/html") - ->header('Vary', 'accept'); - break; - case "application/json": - default: - // In case we want to return JSON(LD) or something else, generate - // our JSON by calling our static function 'getJSON()' - return Response::make($this::getJSON()) - ->header('Content-Type', "application/json") - ->header('Vary', 'accept'); - break; - } - } - - /** - * Generate JSON based on data we get back from the iRail scraper. - * @return array|string - */ - public static function getJSON() - { - if (Input::get('from') && Input::get('to')) { - // Most of our parsing will be done by checking various parameters, - // most of them GET parameters. - - // Required parameters (from and to; destination and departure) - $from = urldecode(Input::get('from')); - $to = urldecode(Input::get('to')); - - // Optional time - $time = Input::get('time'); - // If time is not set, default to now - if (!Input::get('time')) { - $time = date("Hi", time()); - } - - // Optional date - $date = Input::get('date'); - // If date is not set, default to today - if (!Input::get('date')) { - $date = date("dmy", time()); - } - - // Time selector: does the user want to arrive or depart at this hour? - // Optional. Default to 'depart at hour' if null. - $timeSel = Input::get('timeSel'); - if (!Input::get('timeSel')) { - $timeSel = "depart"; - } - - // Get the app's current language/locale - $lang = Config::get('app.locale'); - - $fromId = str_replace("http://irail.be/stations/NMBS/", "", $from); - $toId = str_replace("http://irail.be/stations/NMBS/", "", $to); - - try { - $json = file_get_contents('http://api.irail.be/connections/?to=' - . $toId . '&from=' . $fromId . '&date=' . $date . '&time=' . - $time . '&timeSel=' . $timeSel . '&lang=' . $lang . '&format=json'); - return trim($json); - } catch (ErrorException $ex) { - return array( - 'connection' => array(), - ); - } - - } else { - // TODO: Show the HYDRA JSON-LD for doing a request to the right URI - return 'Required parameters are missing.'; - } - } -} diff --git a/app/controllers/StationController.php b/app/controllers/StationController.php deleted file mode 100644 index c797e9c2..00000000 --- a/app/controllers/StationController.php +++ /dev/null @@ -1,412 +0,0 @@ -getBest($acceptHeader, $priorities); - $val = "text/html"; - if (isset($result)) { - $val = $result->getValue(); - } - - // Evaluate the preferred content type. - - switch ($val) { - case "text/html": - return View::make('stations.search'); - break; - case "application/json": - case "application/ld+json": - default: - return Response::make($this->getStations(Input::get("q")), 200) - ->header('Content-Type', 'application/ld+json') - ->header('Vary', 'accept'); - break; - } - } - - // TODO: rewrite using an in-memory store (e.g. redis) - /** - * @param string $query - * @return string - */ - private function getStations($query = "") - { - if ($query && $query !== "") { - // Filter the stations on name match - $stations = json_decode(File::get(app_path() . '/stations.json')); - - $newstations = new \stdClass; - $newstations->{"@id"} = $stations->{"@id"}; - $newstations->{"@context"} = $stations->{"@context"}; - $newstations->{"@graph"} = array(); - - //make sure something between brackets is ignored - $query = preg_replace("/\s?\(.*?\)/i", "", $query); - - // st. is the same as Saint - $query = preg_replace("/st(\s|$)/i", "(saint|st|sint) ", $query); - - //make sure that we're only taking the first part before a / - $query = explode("/", $query); - $query = trim($query[0]); - - // Dashes are the same as spaces - $query = $this->normalizeAccents($query); - $query = str_replace("\-", "[\- ]", $query); - $query = str_replace(" ", "[\- ]", $query); - - $count = 0; - - foreach ($stations->{"@graph"} as $station) { - if (preg_match('/.*' . $query . '.*/i', $this->normalizeAccents($station->{"name"}), $match)) { - $newstations->{"@graph"}[] = $station; - $count++; - } elseif (isset($station->alternative)) { - if (is_array($station->alternative)) { - foreach ($station->alternative as $alternative) { - if (preg_match('/.*(' . $query . ').*/i', $this - ->normalizeAccents($alternative->{"@value"}), $match)) { - $newstations->{"@graph"}[] = $station; - $count++; - break; - } - } - } else { - if (preg_match('/.*' . $query . '.*/i', $this - ->normalizeAccents($station->alternative->{"@value"}))) { - $newstations->{"@graph"}[] = $station; - $count++; - } - } - } - if ($count > 5) { - return json_encode($newstations); - } - } - return json_encode($newstations); - } else { - return File::get(app_path() . '/stations.json'); - } - } - - /** - * @param $str - * @return string - * Languages supported are: German, French and Dutch - * We have to take into account that some words may have accents - * Taken from https://stackoverflow.com/questions/3371697/replacing-accented-characters-php - */ - public function normalizeAccents($str) - { - $unwanted_array = array( - 'Š' => 'S', 'š' => 's', 'Ž' => 'Z', 'ž' => 'z', - 'À' => 'A', 'Á' => 'A', 'Â' => 'A', 'Ã' => 'A', - 'Ä' => 'A', 'Å' => 'A', 'Æ' => 'A', 'Ç' => 'C', - 'È' => 'E', 'É' => 'E', 'Ê' => 'E', 'Ë' => 'E', - 'Ì' => 'I', 'Í' => 'I', 'Î' => 'I', 'Ï' => 'I', - 'Ñ' => 'N', 'Ò' => 'O', 'Ó' => 'O', 'Ô' => 'O', - 'Õ' => 'O', 'Ö' => 'O', 'Ø' => 'O', 'Ù' => 'U', - 'Ú' => 'U', 'Û' => 'U', 'Ü' => 'U', 'Ý' => 'Y', - 'Þ' => 'B', 'ß' => 'Ss', 'à' => 'a', 'á' => 'a', - 'â' => 'a', 'ã' => 'a', 'ä' => 'a', 'å' => 'a', - 'æ' => 'a', 'ç' => 'c', 'è' => 'e', 'é' => 'e', - 'ê' => 'e', 'ë' => 'e', 'ì' => 'i', 'í' => 'i', - 'î' => 'i', 'ï' => 'i', 'ð' => 'o', 'ñ' => 'n', - 'ò' => 'o', 'ó' => 'o', 'ô' => 'o', 'õ' => 'o', - 'ö' => 'o', 'ø' => 'o', 'ù' => 'u', 'ú' => 'u', - 'û' => 'u', 'ý' => 'y', 'ý' => 'y', 'þ' => 'b', - 'ÿ' => 'y' - ); - - return strtr($str, $unwanted_array); - } - - /** - * Redirects to the stations page for NMBS - * @return \Illuminate\Http\RedirectResponse - */ - public function redirectToNMBSStations() - { - return Redirect::to('stations/NMBS'); - } - - /** - * Shows a liveboard or liveboard data, based on the accept-header. - * @param $id - * @return \Illuminate\Http\Response - */ - public function liveboard($id) - { - $negotiator = new \Negotiation\FormatNegotiator(); - $acceptHeader = Request::header('accept'); - $priorities = array('application/json', 'text/html', '*/*'); - $result = $negotiator->getBest($acceptHeader, $priorities); - - $val = "text/html"; - //unless the negotiator has found something better for us - if (isset($result)) { - $val = $result->getValue(); - } - - switch ($val) { - case "text/html": - try { - $station = \hyperRail\StationString::convertToString($id); - if ($station == null) { - throw new StationConversionFailureException(); - } - $data = array('station' => $station); - return Response::view('stations.liveboard', $data) - ->header('Content-Type', "text/html") - ->header('Vary', 'accept'); - break; - } catch (StationConversionFailureException $ex) { - App::abort(404); - } - break; - case "application/json": - case "application/ld+json": - default: - try { - $stationStringName = \hyperRail\StationString::convertToString($id); - if ($stationStringName == null) { - throw new StationConversionFailureException(); - } - //Check for optional time parameters - $datetime = Input::get("datetime"); - if (isset($datetime) && strtotime($datetime)) { - $datetime = strtotime($datetime); - } else { - $datetime = strtotime("now"); - } - - $URL = "http://api.irail.be/liveboard/?station=" - . $stationStringName->name . "&fast=true&lang=nl&format=json&date=" - . date("mmddyy", $datetime) . "&time=" . date("Hi", $datetime); - $data = file_get_contents($URL); - - try { - $newData = \hyperRail\FormatConverter::convertLiveboardData($data, $id); - $jsonLD = (string)json_encode($newData); - return Response::make($jsonLD, 200) - ->header('Content-Type', 'application/ld+json') - ->header('Vary', 'accept'); - } catch (Exception $ex) { - $error = (string)json_encode(array('error' => 'An error occured while parsing the data')); - return Response::make($error, 500) - ->header('Content-Type', 'application/json') - ->header('Vary', 'accept'); - } - - } catch (StationConversionFailureException $ex) { - $error = (string)json_encode(array('error' => 'This station does not exist!')); - App::abort(404); - } - break; - } - } - - /** - * Shows a train or train data, based on the accept-header. - * @param $station_id - * @param $liveboard_id - * @return array - * @throws EasyRdf_Exception - */ - public function specificTrain($station_id, $liveboard_id) - { - $negotiator = new \Negotiation\FormatNegotiator(); - $acceptHeader = Request::header('accept'); - $priorities = array('application/json', 'text/html', '*/*'); - $result = $negotiator->getBest($acceptHeader, $priorities); - $val = $result->getValue(); - //get the right date-time to query - $datetime = substr($liveboard_id, 0, 12); - $datetime = strtotime($datetime); - $archived = false; - if ($datetime < strtotime("now")) { - $archived = true; - } - - switch ($val) { - case "text/html": - // Convert id to string for interpretation by old API - $stationStringName = \hyperRail\StationString::convertToString($station_id); - - if (!$archived) { - // Set up path to old api - $URL = "http://api.irail.be/liveboard/?station=" . urlencode($stationStringName->name) . - "&date=" . date("mmddyy", $datetime) . "&time=" . date("Hi", $datetime) . - "&fast=true&lang=nl&format=json"; - - // Get the contents of this path - $data = file_get_contents($URL); - - // Convert the data to the new liveboard object - $newData = \hyperRail\FormatConverter::convertLiveboardData($data, $station_id); - // Read new liveboard object and return the page but load data - foreach ($newData['@graph'] as $graph) { - if (strpos($graph['@id'], $liveboard_id) !== false) { - return View::make('stations.departuredetail') - ->with('station', $graph) - ->with('departureStation', $stationStringName); - } - } - App::abort(404); - } else { - // If no match is found, attempt to look in the archive - // Fetch file using curl - $ch = curl_init( - "http://archive.irail.be/" . 'irail?subject=' . - urlencode('http://irail.be/stations/NMBS/' . $station_id . '/departures/' . $liveboard_id) - ); - curl_setopt($ch, CURLOPT_HEADER, 0); - $request_headers[] = 'Accept: text/turtle'; - curl_setopt($ch, CURLOPT_HTTPHEADER, $request_headers); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - $turtle = (curl_exec($ch)); - curl_close($ch); - // Convert turtle to json-ld - // Create a new graph - $graph = new EasyRdf_Graph(); - if (empty($_REQUEST['data'])) { - // Load the sample information - $graph->parse($turtle, 'turtle'); - } - // Export to JSON LD - $format = EasyRdf_Format::getFormat('jsonld'); - $output = $graph->serialise($format); - if (!is_scalar($output)) { - $output = var_export($output, true); - } - // First, define the context - $context = array( - "delay" => "http://semweb.mmlab.be/ns/rplod/delay", - "platform" => "http://semweb.mmlab.be/ns/rplod/platform", - "scheduledDepartureTime" => "http://semweb.mmlab.be/ns/rplod/scheduledDepartureTime", - "headsign" => "http://vocab.org/transit/terms/headsign", - "routeLabel" => "http://semweb.mmlab.be/ns/rplod/routeLabel", - "stop" => array( - "@id" => "http://semweb.mmlab.be/ns/rplod/stop", - "@type" => "@id" - ), - "seeAlso" => array( - "@id" => "http://www.w3.org/2000/01/rdf-schema#seeAlso", - "@type" => "@id", - ) - ); - // Next, encode the context as JSON - $jsonContext = json_encode($context); - // Compact the JsonLD by using @context - $compacted = JsonLD::compact($output, $jsonContext); - // Print the resulting JSON-LD! - $urlToFind = 'NMBS/' . $station_id . '/departures/' . $liveboard_id; - $stationDataFallback = json_decode(JsonLD::toString($compacted, true)); - foreach ($stationDataFallback->{'@graph'} as $graph) { - if (strpos($graph->{'@id'}, $urlToFind) !== false) { - return View::make('stations.departurearchive') - ->with('station', $graph) - ->with('departureStation', $stationStringName); - } - } - App::abort(404); - } - - break; - case "application/json": - case "application/ld+json": - default: - $stationStringName = \hyperRail\StationString::convertToString($station_id); - if (!$archived) { - $URL = "http://api.irail.be/liveboard/?station=" . urlencode($stationStringName->name) . - "&date=" . date("mmddyy", $datetime) . "&time=" . date("Hi", $datetime) . - "&fast=true&lang=nl&format=json"; - $data = file_get_contents($URL); - $newData = \hyperRail\FormatConverter::convertLiveboardData($data, $station_id); - foreach ($newData['@graph'] as $graph) { - if (strpos($graph['@id'], $liveboard_id) !== false) { - $context = array( - "delay" => "http://semweb.mmlab.be/ns/rplod/delay", - "platform" => "http://semweb.mmlab.be/ns/rplod/platform", - "scheduledDepartureTime" => "http://semweb.mmlab.be/ns/rplod/scheduledDepartureTime", - "headsign" => "http://vocab.org/transit/terms/headsign", - "routeLabel" => "http://semweb.mmlab.be/ns/rplod/routeLabel", - "stop" => array( - "@id" => "http://semweb.mmlab.be/ns/rplod/stop", - "@type" => "@id" - ), - ); - return array("@context" => $context, "@graph" => $graph); - } - } - App::abort(404); - } else { - // If no match is found, attempt to look in the archive - // Fetch file using curl - $ch = curl_init("http://archive.irail.be/" . 'irail?subject=' . - urlencode('http://irail.be/stations/NMBS/' . $station_id . '/departures/' . $liveboard_id)); - curl_setopt($ch, CURLOPT_HEADER, 0); - $request_headers[] = 'Accept: text/turtle'; - curl_setopt($ch, CURLOPT_HTTPHEADER, $request_headers); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - $turtle = (curl_exec($ch)); - curl_close($ch); - // Convert turtle to json-ld - // Create a new graph - $graph = new EasyRdf_Graph(); - if (empty($_REQUEST['data'])) { - // Load the sample information - $graph->parse($turtle, 'turtle'); - } - // Export to JSON LD - $format = EasyRdf_Format::getFormat('jsonld'); - $output = $graph->serialise($format); - if (!is_scalar($output)) { - $output = var_export($output, true); - } - // First, define the context - $context = array( - "delay" => "http://semweb.mmlab.be/ns/rplod/delay", - "platform" => "http://semweb.mmlab.be/ns/rplod/platform", - "scheduledDepartureTime" => "http://semweb.mmlab.be/ns/rplod/scheduledDepartureTime", - "headsign" => "http://vocab.org/transit/terms/headsign", - "routeLabel" => "http://semweb.mmlab.be/ns/rplod/routeLabel", - "stop" => array( - "@id" => "http://semweb.mmlab.be/ns/rplod/stop", - "@type" => "@id" - ), - "seeAlso" => array( - "@id" => "http://www.w3.org/2000/01/rdf-schema#seeAlso", - "@type" => "@id", - ) - ); - // Next, encode the context as JSON - $jsonContext = json_encode($context); - // Compact the JsonLD by using @context - $compacted = JsonLD::compact($output, $jsonContext); - // Print the resulting JSON-LD! - $urlToFind = 'NMBS/' . $station_id . '/departures/' . $liveboard_id; - $stationDataFallback = json_decode(JsonLD::toString($compacted, true)); - foreach ($stationDataFallback->{'@graph'} as $graph) { - if (strpos($graph->{'@id'}, $urlToFind) !== false) { - return array("@context" => $context, "@graph" => $graph); - } - } - App::abort(404); - } - break; - } - } -} diff --git a/app/database/migrations/.gitkeep b/app/database/migrations/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/app/database/production.sqlite b/app/database/production.sqlite deleted file mode 100644 index e69de29b..00000000 diff --git a/app/database/seeds/.gitkeep b/app/database/seeds/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/app/database/seeds/DatabaseSeeder.php b/app/database/seeds/DatabaseSeeder.php deleted file mode 100644 index 6a8c204c..00000000 --- a/app/database/seeds/DatabaseSeeder.php +++ /dev/null @@ -1,17 +0,0 @@ -call('UserTableSeeder'); - } - -} \ No newline at end of file diff --git a/app/exceptions/StationConversionFailureException.php b/app/exceptions/StationConversionFailureException.php deleted file mode 100644 index 0c18bb03..00000000 --- a/app/exceptions/StationConversionFailureException.php +++ /dev/null @@ -1,6 +0,0 @@ -stationinfo->name; - // Convert timestamp to date - // TODO: count amount of elements, if null, throw error - foreach ($initialData->departures->departure as $departure) { - $time = $departure->time; - $liveboardItem = new LiveboardItem(); - $date = date('Ymd', $time); - $time = date('Hi', $time); - $vehicleShort = explode("BE.NMBS.", $departure->vehicle); - $liveboardItem->fill($station_id, $date, $time, $vehicleShort[1], $departure->station, $departure->delay, date('c', $departure->time), $departure->platform); - array_push($liveboardCollection, $liveboardItem->toArray()); - } - $context = array( - "delay" => "http://semweb.mmlab.be/ns/rplod/delay", - "platform" => "http://semweb.mmlab.be/ns/rplod/platform", - "scheduledDepartureTime" => "http://semweb.mmlab.be/ns/rplod/scheduledDepartureTime", - "headsign" => "http://vocab.org/transit/terms/headsign", - "routeLabel" => "http://semweb.mmlab.be/ns/rplod/routeLabel", - "stop" => array( - "@id" => "http://semweb.mmlab.be/ns/rplod/stop", - "@type" => "@id" - ), - ); - return array("@context" => $context, "@graph" => $liveboardCollection); - } -} \ No newline at end of file diff --git a/app/hyperRail/Models/LiveboardItem.php b/app/hyperRail/Models/LiveboardItem.php deleted file mode 100644 index 8f9c7c03..00000000 --- a/app/hyperRail/Models/LiveboardItem.php +++ /dev/null @@ -1,62 +0,0 @@ -headsign = $headSign; - $this->routeLabel = preg_replace("/([A-Z]{1,2})(\d+)/", "$1 $2", $routeLabel); - $md5hash = md5($this->routeLabel . $this->headsign); - $this->stationURL = "http://" - . _DOMAIN_ . "/stations/NMBS/" . - $stationId . "/departures/" . $requestDate . - $requestTime . $md5hash; - $this->delay = $delay; - $this->scheduledDepartureTime = $time; - $this->platform = $platform; - $this->destinationURL = "http://" . _DOMAIN_ . "/stations/NMBS/" . $stationId; - } - - /** - * Converts this object to a JSON-LD compatible array (using @id). - * @return array - */ - public function toArray() - { - $dataArray = array( - "@id" => $this->stationURL, - "delay" => $this->delay, - "platform" => $this->platform, - "scheduledDepartureTime" => $this->scheduledDepartureTime, - "stop" => $this->destinationURL, - "headsign" => $this->headsign, - "routeLabel" => $this->routeLabel - ); - return $dataArray; - } -} diff --git a/app/hyperRail/StationString.php b/app/hyperRail/StationString.php deleted file mode 100644 index f8161ca4..00000000 --- a/app/hyperRail/StationString.php +++ /dev/null @@ -1,104 +0,0 @@ -{"@graph"} as $station) { - - /* - * Write an array with station name alternates - * - * This also solves multilanguage issues since the strings are simply converted - * to the proper id :) This way, we can make iRail multilanguage! - * - */ - - /* If we can find the station name in the string, - * we can return the station data if we get a hit! - */ - if (strpos($station->name, $string) !== false) { - return $station; - } - - /* - * Assuming the main name was not a hit, try the alternates - * If an alternate value matches, return the station - */ - if (isset($station->alternative)) { - foreach ($station->alternative as $alternate) { - if (strpos($alternate->{"@value"}, $string) !== false) { - return $station; - } - } - } - } - // If there is no station id found for this string... - // we return null. Cool thing about this method is that our strings - // no not need to be complete. 'Pieters' will take me to 'Ghent-Sint-Pieters'! - return null; - } - - /** - * Converts a station id to a station string. If the string cannot be converted, - * null is returned. - * @param $string - * @return string or null - */ - public static function convertToString($string) - { - - // Fetch stations list to compare the station string with - - $json = \File::get(app_path() . "/stations.json"); - $data = json_decode($json); - - // For each station in the array of stations, attempt comparison - - foreach ($data->{"@graph"} as $station) { - - /* - * TODO: write an array with station name alternates - * - * This also solves multilanguage issues since the strings are simply converted - * to the proper id :) This way, we can make iRail multilanguage! - * - * $alternates = array( - * "Gent-Sint-Pieters" => array('Ghent-Sint-Pieters', 'Gent Sint Pieters', 'Ghent Sint Pieters') - * ) - */ - - /* - * Assuming we have a list of station name alternates, we can do even more - * comparisons to ensure that this process is functional. - * TODO: write a function that loops through station name alternates - */ - - /* If we can find the station name in the string of Nicola's records, - * we can return the station data if we get a hit! - * Arguably we need to check if there are multiple hits: - * TODO: check for multiple hits when using strpos() - */ - - if (strpos($station->{"@id"}, $string) !== false) { - return $station; - } - } - return null; - } - -} diff --git a/app/lang/de/client.php b/app/lang/de/client.php deleted file mode 100644 index 1d84160a..00000000 --- a/app/lang/de/client.php +++ /dev/null @@ -1,64 +0,0 @@ -"Suche", - "departure_at" => "Abfahrt", - "arrival_at" => "Ankunft", - "to" => "Nach", - "from" => "Von", - "favourite" => "Favorit", - "settings"=> "Einstellungen", - "board"=>"Board", - "route" => "Route", - "your_routes" => "Ihre Routen", - "nearby" => "In der Nähe", - "most_used" => "am meisten verwendet", - "log_in" => "Anmelden", - "register" => "Registrieren Sie sich hier", - "username" => "Name", - "password" => "Kennwort", - "err404_FirstParagraph" => "Entschuldigung!", - "err404_SecondParagraph" => "Da ist wohl etwas auf unseren Servern schief gelaufen.", - "go_back" => "Zurück", - "or_try_to" => "oder versuchen", - "refresh_page" => "Sie diese Seite neu zu laden", - "of" => "von", - "to_optional" => "Nach (optional)", - "show_live_board" => "Live Fahrplan anzeigen", - "earliestRide" => "Früheste", - "rideEarlier" => "frühere", - "rideLater" => "spätere", - "latestRide" => "Letzte", - "english" => "Englisch", - "dutch" => "Niederländisch", - "pickLanguage" => "Sprache", - "errSubmitBoard" => "Sie müssen mindestens ein Feld ausfüllen", - "geolocationErr" => "Wir konnten Ihren Standort nicht ermitteln, versuchen Sie die Seite erneut zu laden", - "geoLocationSearch" => "Standortsuche", - "noMostUsed" => "Keine vorherigen Routen gefunden", - "noNearbyStations" => "Kein Bahnhof in Ihrer Nähe gefunden", - "noFav" => "Sie haben noch keine Favoriten.", - "en" => "Englisch", - "nl" => "Niederländisch", - "de" => "Deutsch", - "fr" => "Französisch", - "datausedfrom" => "basierend auf Daten von", - "madeby" => "Made by", - "npo" => "NPO", - "authors" => "Autoren", - "design" => "Entwurf", - "frontendcoding" => "Front-end Entwicklung", - "backendcoding" => "Back-end Entwicklung", - "infrastructure" => "Infrastruktur", - "andothers" => "Und viele andere", - "stealthiscode" => "Steal this code (AGPL)", - "ErrNoResults" => "Leider haben wir nichts gefunden.", - "aboutUs" => "Über uns", - "fromStation" => "Klicken Sie", - "toStation" => "Klicken Sie", - "ofStation" => "Klicken Sie", - "to_optionalStation" => "Klicken Sie", - "refreshBoard" => "Erfrischen", - "marketLink" => "Download des offiziellen App", - "errorHoliday" => "Wir können keine Verbindung finden. An Feiertagen ist es möglich, daß an kleineren Haltestellen keine Züge halten.", -); \ No newline at end of file diff --git a/app/lang/de/contributors.php b/app/lang/de/contributors.php deleted file mode 100644 index c34c6fd8..00000000 --- a/app/lang/de/contributors.php +++ /dev/null @@ -1,8 +0,0 @@ - "Contributeurs", - "description" => "iRail ist gemacht durch diese Menschen:", - -); \ No newline at end of file diff --git a/app/lang/en/client.php b/app/lang/en/client.php deleted file mode 100644 index 99158efd..00000000 --- a/app/lang/en/client.php +++ /dev/null @@ -1,114 +0,0 @@ - "Plan new route", - "searchStations" => "Search stations", - "typeToStation" => "Type destination station name", - "typeFromStation" => "Type departure station name", - "chooseDate" => "Choose your preferred date", - "chooseTime" => "Pick your preferred time", - "confirmSearch" => "Find trains", - "departureAtHour" => "Departure at chosen hour", - "arrivalAtHour" => "Arrival at chosen hour", - "loadingHeader" => "Loading your results. Sit tight.", - "loadingSub" => "Your results will be available within a few seconds.", - "depart" => "depart", - "arrive" => "arrive", - "on" => "on", - "at" => "at", - "youWantTo" => "You want to", - "routesFoundDescription" => "routes found. The optimal route has been expanded. Tap or click the headers to expand them.", - "reverse" => "Reverse trip", - "planAnother" => "Plan another trip", - "errorCheckInput" => "We could not translate your text to a station. Please check your input. We automatically suggest possible stations! :)", - "error" => "Something seems to have gone wrong.", - "errorNoRoutes" => "We could not find any routes.", - "errorNoLiveboard" => "We could not find any liveboards.", - "errorExplanation" => "This sometimes happens when data is unavailable (e.g. date far in the future). Please try again. If this problem persists,", - "errorReturn" => "Return to the planner", - "errorReturnLiveboard" => "Return to station search", - "errorMail" => "mail us", - "errorHoliday" => "We couldn't find any trains. On holidays, it is possible that there are no trains in smaller stations.", - "stationsIdentical" => "The departure and destination station are the same. We can't calculate a route where there is none :)", - "quickFilter" => "Type here to quickly filter liveboard results", - "noResultsFoundLiveboard" => "We're sorry. According to our data, there are no trains departing right now in this station.", - "language" => "Language", - "isPartOf" => "iRail is a part of", - "stationName" => "Station name", - "stationSearchPlaceholder" => "Type to search for a station", - "viewLiveboard" => "View Liveboard", - "platform" => "Platform", - "station" => "Station", - "liveboardDescription" => "Below you'll find a list of all trains departing for a certain station and their possible delay.", - "waitBetween" => "Wait", - "mins" => "minutes before departure", - "404ErrorTitle" => "Page not found", - "404Explanation" => "We could not find this page. If you think this was a mistake, ", - "goHome" => "Go back to the homepage", - "ExpiredErrorTitle" => "This train has left the station!", - "ExpiredExplanation" => "This train has left the station, and is no longer available. To learn more about this train, visit ", - "delay" => "delay", - "historicalDelays" => "Historical delays", - "archived" => "Archived", - // END OF NEW TRANSLATION STRINGS - "search"=>"Search", - "departure_at" => "Departure", - "arrival_at" => "Arrival", - "to" => "To", - "from" => "From", - "favourite" => "Favourite", - "settings"=> "Settings", - "board"=>"Board", - "route" => "Route", - "your_routes" => "Your routes", - "nearby" => "Nearby", - "most_used" => "Most used", - "log_in" => "Log in", - "register" => "Register", - "username" => "Username", - "password" => "Password", - "err404_FirstParagraph" => "We're so sorry!", - "err404_SecondParagraph" => "Something went wrong on our servers", - "go_back" => "Go back", - "or_try_to" => "or try", - "refresh_page" => "to refresh this page", - "of" => "From", - "to_optional" => "To (optional)", - "show_live_board" => "Show live board", - "earliestRide" => "Earliest", - "rideEarlier" => "Earlier", - "rideLater" => "Later", - "latestRide" => "Latest", - "english" => "English", - "dutch" => "Dutch", - "pickLanguage" => "Language", - "errSubmitBoard" => "You have to atleast fill in 1 field", - "geolocationErr" => "Couln't find the geo location, try to refresh.", - "geoLocationSearch" => "Searching user location", - "noMostUsed" => "Cannot find any last used routes", - "noNearbyStations" => "Couln't find any station nearby", - "noFav" => "You don't have a favourite yet.", - "en" => "English", - "nl" => "Dutch", - "de" => "German", - "fr" => "French", - "datausedfrom" => "Data used from", - "madeby" => "Made by", - "npo" => "NPO", - "authors" => "Authors", - "design" => "Design", - "frontendcoding" => "Front-end coding", - "backendcoding" => "Back-end coding", - "infrastructure" => "Infrastructure", - "andothers" => "And many others", - "stealthiscode" => "Steal this code (AGPL)", - "ErrNoResults" => "Sorry, couldn't find any results", - "aboutUs" => "About us", - "fromStation" => "Select departure", - "toStation" => "Select destination", - "ofStation" => "Select station", - "to_optionalStation" => "Click here for destination (optional)", - "refreshBoard" => "Refresh", - "marketLink" => "Download the official app", -); \ No newline at end of file diff --git a/app/lang/en/contributors.php b/app/lang/en/contributors.php deleted file mode 100644 index 2bfbaa43..00000000 --- a/app/lang/en/contributors.php +++ /dev/null @@ -1,8 +0,0 @@ - "Contributors", - "description" => "iRail is brought to you by the following people:", - -); \ No newline at end of file diff --git a/app/lang/en/pagination.php b/app/lang/en/pagination.php deleted file mode 100644 index eb9be3ba..00000000 --- a/app/lang/en/pagination.php +++ /dev/null @@ -1,20 +0,0 @@ - '« Previous', - - 'next' => 'Next »', - -); \ No newline at end of file diff --git a/app/lang/en/reminders.php b/app/lang/en/reminders.php deleted file mode 100644 index e42148e9..00000000 --- a/app/lang/en/reminders.php +++ /dev/null @@ -1,24 +0,0 @@ - "Passwords must be at least six characters and match the confirmation.", - - "user" => "We can't find a user with that e-mail address.", - - "token" => "This password reset token is invalid.", - - "sent" => "Password reminder sent!", - -); diff --git a/app/lang/en/validation.php b/app/lang/en/validation.php deleted file mode 100644 index 94823021..00000000 --- a/app/lang/en/validation.php +++ /dev/null @@ -1,98 +0,0 @@ - "The :attribute must be accepted.", - "active_url" => "The :attribute is not a valid URL.", - "after" => "The :attribute must be a date after :date.", - "alpha" => "The :attribute may only contain letters.", - "alpha_dash" => "The :attribute may only contain letters, numbers, and dashes.", - "alpha_num" => "The :attribute may only contain letters and numbers.", - "array" => "The :attribute must be an array.", - "before" => "The :attribute must be a date before :date.", - "between" => array( - "numeric" => "The :attribute must be between :min and :max.", - "file" => "The :attribute must be between :min and :max kilobytes.", - "string" => "The :attribute must be between :min and :max characters.", - "array" => "The :attribute must have between :min and :max items.", - ), - "confirmed" => "The :attribute confirmation does not match.", - "date" => "The :attribute is not a valid date.", - "date_format" => "The :attribute does not match the format :format.", - "different" => "The :attribute and :other must be different.", - "digits" => "The :attribute must be :digits digits.", - "digits_between" => "The :attribute must be between :min and :max digits.", - "email" => "The :attribute format is invalid.", - "exists" => "The selected :attribute is invalid.", - "image" => "The :attribute must be an image.", - "in" => "The selected :attribute is invalid.", - "integer" => "The :attribute must be an integer.", - "ip" => "The :attribute must be a valid IP address.", - "max" => array( - "numeric" => "The :attribute may not be greater than :max.", - "file" => "The :attribute may not be greater than :max kilobytes.", - "string" => "The :attribute may not be greater than :max characters.", - "array" => "The :attribute may not have more than :max items.", - ), - "mimes" => "The :attribute must be a file of type: :values.", - "min" => array( - "numeric" => "The :attribute must be at least :min.", - "file" => "The :attribute must be at least :min kilobytes.", - "string" => "The :attribute must be at least :min characters.", - "array" => "The :attribute must have at least :min items.", - ), - "not_in" => "The selected :attribute is invalid.", - "numeric" => "The :attribute must be a number.", - "regex" => "The :attribute format is invalid.", - "required" => "The :attribute field is required.", - "required_if" => "The :attribute field is required when :other is :value.", - "required_with" => "The :attribute field is required when :values is present.", - "required_without" => "The :attribute field is required when :values is not present.", - "same" => "The :attribute and :other must match.", - "size" => array( - "numeric" => "The :attribute must be :size.", - "file" => "The :attribute must be :size kilobytes.", - "string" => "The :attribute must be :size characters.", - "array" => "The :attribute must contain :size items.", - ), - "unique" => "The :attribute has already been taken.", - "url" => "The :attribute format is invalid.", - - /* - |-------------------------------------------------------------------------- - | Custom Validation Language Lines - |-------------------------------------------------------------------------- - | - | Here you may specify custom validation messages for attributes using the - | convention "attribute.rule" to name the lines. This makes it quick to - | specify a specific custom language line for a given attribute rule. - | - */ - - 'custom' => array(), - - /* - |-------------------------------------------------------------------------- - | Custom Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap attribute place-holders - | with something more reader friendly such as E-Mail Address instead - | of "email". This simply helps us make messages a little cleaner. - | - */ - - 'attributes' => array(), - -); diff --git a/app/lang/fr/client.php b/app/lang/fr/client.php deleted file mode 100755 index 482fff60..00000000 --- a/app/lang/fr/client.php +++ /dev/null @@ -1,114 +0,0 @@ - "Planifier un nouveau trajet", - "searchStations" => "Rechercher une gare", - "typeToStation" => "Entrez le nom de la gare d'arrivée", - "typeFromStation" => "Entrez le nom de la gare de départ", - "chooseDate" => "Choisissez votre date de préférence", - "chooseTime" => "Choisissez votre heure de préférence", - "confirmSearch" => "Rechercher un trajet", - "departureAtHour" => "Départ à l'heure choisie", - "arrivalAtHour" => "Arrivée à l'heure choisie", - "loadingHeader" => "Chargement des résultats. Veuillez patienter.", - "loadingSub" => "Vos résultats seront disponibles dans quelques secondes.", - "depart" => "partir", - "arrive" => "arriver", - "on" => "le", - "at" => "à", - "youWantTo" => "Vous désirez", - "routesFoundDescription" => "trajets trouvés. Les détails du trajet optimal sont affichés. Cliquez sur l'en-tête pour afficher les détails.", - "reverse" => "Trajet retour", - "planAnother" => "Planifier un autre trajet", - "errorCheckInput" => "Nous n'avons pas pu traduire votre texte vers une gare. Veuillez vérifier votre saisie. Nous proposons automatiquement les gares possibles! :)", - "error" => "Il semblerait qu'une erreur soit survenue.", - "errorNoRoutes" => "Nous n'avons pas pu trouver de trajet.", - "errorNoLiveboard" => "Nous n'avons pas pu trouver de liveboard.", - "errorExplanation" => "Cela arrive parfois lorsque les données ne sont pas disponibles (e.g. une date loin dans le futur). Veuillez réessayer. Si le problème persiste,", - "errorReturn" => "Retour au planificateur", - "errorReturnLiveboard" => "Retour à la recherche de gare", - "errorMail" => "envoyez nous un mail", - "errorHoliday" => "Nous n'avons pas pu trouver de trajet. Pendant les jours fériés il est possible qu'aucun train ne circulent dans les petites stations.", - "stationsIdentical" => "Les gares de départ et de destination sont les mêmes. Nous ne pouvons pas calculer de trajet s'il n'y en a pas :)", - "quickFilter" => "Tapez ici pour filtrer rapidement les résultats du liveboard", - "noResultsFoundLiveboard" => "Nous sommes désolés. Selon nos données, il n'y a pas de train au départ en ce moment dans cette gare.", - "language" => "Langue", - "isPartOf" => "iRail est un membre de", - "stationName" => "Gare", - "stationSearchPlaceholder" => "Tapez pour rechercher une gare", - "viewLiveboard" => "Afficher le Liveboard", - "platform" => "Quai", - "station" => "Gare", - "liveboardDescription" => "Vous trouverez ci-dessous la liste de tous les trains au départ d'une certaine gare ainsi que les délais possibles.", - "waitBetween" => "Veuillez patienter", - "mins" => "minutes avant le départ", - "404ErrorTitle" => "Page non trouvé", - "404Explanation" => "Nous n'avons pas trouvé cette page. Si le problème persiste et que vous pensez que c'est un erreur, ", - "goHome" => "Retournez à page d’accueil", - "ExpiredErrorTitle" => "Ce train a déjà quitté la gare!", - "ExpiredExplanation" => "Ce train a déjà quitté la gare et n'est plus disponible. Pour obtenir plus d'information sur ce train vous pouvez consulter nos archives de données à ", - "delay" => "de retard", - "historicalDelays" => "Histoire de retard", - "archived" => "Archivée", - // END OF NEW TRANSLATION STRINGS - "search"=>"Chercher", - "departure_at" => "Départ", - "arrival_at" => "Arrivée", - "to" => "Vers", - "from" => "De", - "favourite" => "Favori", - "settings"=> "Settings", - "board"=>"Panneau", - "route" => "Trajet", - "your_routes" => "Vos trajets", - "nearby" => "A proximité", - "most_used" => "Plus utilisés", - "log_in" => "Se connecter", - "register" => "S'enregistrer", - "username" => "Utilisateur", - "password" => "Mot de passe", - "err404_FirstParagraph" => "Désolé!", - "err404_SecondParagraph" => "Erreur de nos serveurs", - "go_back" => "Retour", - "or_try_to" => "Réessayer", - "refresh_page" => "Rafraichir la page", - "of" => "Ou", - "to_optional" => "Vers (optionnel)", - "show_live_board" => "Afficher le Liveboard", - "earliestRide" => "Premier", - "rideEarlier" => "Plus tôt", - "rideLater" => "Plus tard", - "latestRide" => "Dernier", - "english" => "Anglais", - "dutch" => "Néerlandais", - "pickLanguage" => "Langage", - "errSubmitBoard" => "Remplissez au moins un champs", - "geolocationErr" => "Impossible de trouver votre localisation. Veuillez réessayer", - "geoLocationSearch" => "Recherche de votre position", - "noMostUsed" => "Impossible de trouver vos derniers voyages", - "noNearbyStations" => "Impossible de trouver les gares à proximité", - "noFav" => "Veuillez enregistrer vos favoris.", - "en" => "Anglais", - "nl" => "Néerlandais", - "de" => "Allemand", - "fr" => "Francais", - "datausedfrom" => "Données en provenance de", - "madeby" => "Réalisé par", - "npo" => "ASBL", - "authors" => "Auteurs", - "design" => "Design", - "frontendcoding" => "Front-end coding", - "backendcoding" => "Back-end coding", - "infrastructure" => "Infrastructure", - "andothers" => "Et de nombreuses autres personnes", - "stealthiscode" => "Prenez le code (AGPL)", - "ErrNoResults" => "Désolé, il n'y a pas des résultats", - "aboutUs" => "À propos", - "fromStation" => "Sélectionnez départ", - "toStation" => "Sélectionnez direction", - "ofStation" => "from station", - "to_optionalStation" => "Sélectionnez la direction (optionnel)", - "refreshBoard" => "Rafraîchir", - "marketLink" => "Téléchargez l'application officielle", -); diff --git a/app/lang/fr/contributors.php b/app/lang/fr/contributors.php deleted file mode 100644 index b2fb8325..00000000 --- a/app/lang/fr/contributors.php +++ /dev/null @@ -1,8 +0,0 @@ - "Contributeurs", - "description" => "iRail est crée par ces contributeurs:", - -); \ No newline at end of file diff --git a/app/lang/nl/client.php b/app/lang/nl/client.php deleted file mode 100644 index ecbb7aeb..00000000 --- a/app/lang/nl/client.php +++ /dev/null @@ -1,118 +0,0 @@ - "Plan nieuwe route", - "searchStations" => "Zoek naar stations", - "typeToStation" => "Typ bestemmingstation", - "typeFromStation" => "Typ vertrekstation", - "chooseDate" => "Kies uw gewenste datum", - "chooseTime" => "Kies uw gewenste tijdstip", - "confirmSearch" => "Zoek naar treinen", - "departureAtHour" => "Vertrek om gekozen uur", - "arrivalAtHour" => "Arriveren om gekozen uur", - "loadingHeader" => "Bezig met laden van resultaten.", - "loadingSub" => "Uw resultaten zullen over een seconde of twee beschikbaar zijn.", - "depart" => "vertrekken", - "arrive" => "arriveren", - "on" => "op", - "at" => "om", - "youWantTo" => "U wilt", - "routesFoundDescription" => "routes gevonden. De optimale route is al uitgebreid. U kan op de andere routes klikken om ze uit te breiden.", - "reverse" => "Trip omkeren", - "planAnother" => "Andere trip plannen", - // - "errorCheckInput" => "We konden je tekst niet omzetten naar een station. Gelieve je input te controleren. We suggereren automatisch stations! :)", - "error" => "Hmm, er is iets fout gegaan!", - "errorNoRoutes" => "We konden geen routes vinden.", - "errorNoLiveboard" => "We konden geen liveboard data ontvangen.", - "errorExplanation" => "Dit gebeurt soms wanneer data niet beschikbaar is (b.v. datum in de verre toekomst). Gelieve opnieuw te proberen. Als dit probleem blijft duren,", - "errorReturn" => "Terug naar de planner", - "errorReturnLiveboard" => "Terug naar stations zoeken", - "errorMail" => "mail ons", - "errorHoliday" => "We konden geen routes vinden. Op feestdagen is het mogelijk dat er geen treinen rijden in kleinere stations.", - "stationsIdentical" => "Uw vertrekstation en bestemmingsstation zijn hetzelfde! We kunnen geen route berekenen waar er geen is :)", - "quickFilter" => "Type hier om snel liveboard-resultaten te filteren", - "noResultsFoundLiveboard" => "Het spijt ons. Volgens onze data vertrekken er hier geen treinen momenteel.", - // - "language" => "Taalkeuze", - "isPartOf" => "iRail is een onderdeel van", - // - "stationName" => "Stationsnaam", - "stationSearchPlaceholder" => "Typ om te zoeken naar een station", - "viewLiveboard" => "Liveboard bekijken", - // - "platform" => "Perron", - "station" => "Station", - "liveboardDescription" => "Hier onder vind je een lijst met alle treinen die naar een bepaald station rijden en hun mogelijke vertragingen.", - // - "mins" => "minuten wachten tot vertrek", - "404ErrorTitle" => "Pagina niet gevonden", - "404Explanation" => "We konden deze pagina niet vinden. Als je denkt dat dit een fout is, ", - "goHome" => "Ga terug naar de homepage", - "ExpiredErrorTitle" => "Deze trein heeft het station reeds verlaten!", - "ExpiredExplanation" => "Deze trein heeft het station reeds verlaten, en is niet meer beschikbaar. Om meer te weten te komen over deze trein kan je onze data-archieven bekijken op ", - "delay" => "vertraging", - "historicalDelays" => "Geschiedenis van vertragingen", - "archived" => "Gearchiveerd", - // - "search"=>"Zoek route", - "departure_at" => "Vertrek", - "arrival_at" => "Aankomst", - "to" => "Naar", - "from" => "Van", - "favourite" => "Favoriete", - "settings"=> "Opties", - "board"=>"Bord", - "route" => "Route", - "your_routes" => "Uw routes", - "nearby" => "Dichtbij", - "most_used" => "Gebruikte", - "log_in" => "Aanmelden", - "register" => "Registreer", - "username" => "Gebruikersnaam", - "password" => "Wachtwoord", - "err404_FirstParagraph" => "Het spijt ons", - "err404_SecondParagraph" => "Er ging iets mis.", - "go_back" => "Ga terug", - "or_try_to" => "of probeer", - "refresh_page" => "te vernieuwen", - "of" => "Van", - "to_optional" => "Naar (optioneel)", - "show_live_board" => "Toon live bord", - "earliestRide" => "Vroegste", - "rideEarlier" => "Vroeger", - "rideLater" => "Later", - "latestRide" => "Laatste", - "english" => "Engels", - "dutch" => "Nederlands", - "pickLanguage" => "Taal", - "errSubmitBoard" => "U dient tenminste 1 veld in te vullen.", - "geolocationErr" => "Kan uw geolocatie niet vinden, herlaad uw pagina.", - "geoLocationSearch" => "Zoeken naar uw positie ...", - "noMostUsed" => "Geen laatst gebruikte routes beschikbaar.", - "noNearbyStations" => "Kan geen stations vinden die zich dichtbij bevinden.", - "noFav" => "U heeft nog geen favoriete route.", - "en" => "Engels", - "nl" => "Nederlands", - "de" => "Duits", - "fr" => "Frans", - "datausedfrom" => "Data gebruikt van", - "madeby" => "Mogelijk gemaakt door", - "npo" => "VZW", - "authors" => "Auteurs", - "design" => "Ontwerp", - "frontendcoding" => "Front-end coding", - "backendcoding" => "Back-end coding", - "infrastructure" => "Infrastructuur", - "andothers" => "En vele anderen", - "stealthiscode" => "Steel deze code (AGPL)", - "ErrNoResults" => "Sorry, er werden geen resultaten gevonden", - "aboutUs" => "Over ons", - "fromStation" => "Selecteer vertrekstation", - "toStation" => "Selecteer bestemming", - "ofStation" => "Selecteer station", - "to_optionalStation" => "Selecteer richting (optioneel)", - "refreshBoard" => "Vernieuw", - "marketLink" => "Download de officiële app", -); \ No newline at end of file diff --git a/app/lang/nl/contributors.php b/app/lang/nl/contributors.php deleted file mode 100644 index b63fec84..00000000 --- a/app/lang/nl/contributors.php +++ /dev/null @@ -1,8 +0,0 @@ - "Bijdragers", - "description" => "iRail is gerealiseerd door de volgende mensen:", - -); \ No newline at end of file diff --git a/app/models/User.php b/app/models/User.php deleted file mode 100644 index 42fe853f..00000000 --- a/app/models/User.php +++ /dev/null @@ -1,52 +0,0 @@ -getKey(); - } - - /** - * Get the password for the user. - * - * @return string - */ - public function getAuthPassword() - { - return $this->password; - } - - /** - * Get the e-mail address where password reminders are sent. - * - * @return string - */ - public function getReminderEmail() - { - return $this->email; - } - -} \ No newline at end of file diff --git a/app/routes.php b/app/routes.php deleted file mode 100644 index 130d4102..00000000 --- a/app/routes.php +++ /dev/null @@ -1,46 +0,0 @@ -client->request('GET', '/'); - $this->assertTrue($this->client->getResponse()->isOk()); - } - -} \ No newline at end of file diff --git a/app/tests/TestCase.php b/app/tests/TestCase.php deleted file mode 100644 index a3de44ab..00000000 --- a/app/tests/TestCase.php +++ /dev/null @@ -1,20 +0,0 @@ - -
-
-

-

-

{{Lang::get('client.errorNoRoutes')}}

-

{{Lang::get('client.errorHoliday')}} {{Lang::get('client.errorMail')}}.

-
- {{Lang::get('client.errorReturn')}} -
-
-
- \ No newline at end of file diff --git a/app/views/_partials/route/errors.blade.php b/app/views/_partials/route/errors.blade.php deleted file mode 100644 index f927795d..00000000 --- a/app/views/_partials/route/errors.blade.php +++ /dev/null @@ -1,13 +0,0 @@ -
-
-
-

-

-

{{Lang::get('client.error')}} {{Lang::get('client.errorNoRoutes')}}

-

{{Lang::get('client.errorExplanation')}} {{Lang::get('client.errorMail')}}.

-
- {{Lang::get('client.errorReturn')}} -
-
-
-
\ No newline at end of file diff --git a/app/views/_partials/route/loading.blade.php b/app/views/_partials/route/loading.blade.php deleted file mode 100644 index fbe123af..00000000 --- a/app/views/_partials/route/loading.blade.php +++ /dev/null @@ -1,7 +0,0 @@ -
-
-
Loading...
-

{{Lang::get('client.loadingHeader')}}

-

{{Lang::get('client.loadingSub')}}

-
-
\ No newline at end of file diff --git a/app/views/_partials/route/planner.blade.php b/app/views/_partials/route/planner.blade.php deleted file mode 100644 index 89485a76..00000000 --- a/app/views/_partials/route/planner.blade.php +++ /dev/null @@ -1,60 +0,0 @@ -
-
- -
- -
- - - -
-
-
- -
- - - -
-
-
- -
-
-
-
- - - -
- -
-

{{Lang::get('client.errorCheckInput')}}

-
-
-

{{Lang::get('client.stationsIdentical')}}

-
-
-
\ No newline at end of file diff --git a/app/views/_partials/route/results.blade.php b/app/views/_partials/route/results.blade.php deleted file mode 100644 index 0a0be59c..00000000 --- a/app/views/_partials/route/results.blade.php +++ /dev/null @@ -1,117 +0,0 @@ -
-
-

- {{Lang::get('client.from')}} @{{departure.name}} {{Lang::get('client.to')}} @{{destination.name}} -
- {{Lang::get('client.on')}} @{{mydate | date}}. -
- {{Lang::get('client.youWantTo')}} - {{Lang::get('client.depart')}} - {{Lang::get('client.arrive')}} - {{Lang::get('client.at')}} @{{mytime | date : 'HH:mm' }}. -

-
-
@{{connections.length}} {{Lang::get('client.routesFoundDescription')}}
-
-
- -
-
    -
  • - @{{ conn.departure.platform }} - - - @{{ (conn.departure.time)*1000 | date:'HH:mm' }} - - - - @{{ conn.departure.station}} - - - + @{{ (conn.departure.delay)/60 }}' - -
  • -
  • - ↓ @{{stop.vehicle.replace("BE.NMBS.","")}} (@{{stop.direction.name}}) -
    - - @{{(stop.arrival.time)*1000 | date:'HH:mm'}} - -
    - → @{{(stop.timeBetween/60)}} {{Lang::get('client.mins')}} - -
    - @{{ stop.departure.platform }} - - @{{ (stop.departure.time)*1000 | date:'HH:mm' }} - - - + @{{ (stop.departure.delay)/60 }}' - - - - @{{ stop.station}} - -
    -
  • -
  • - ↓ @{{conn.arrival.vehicle.replace("BE.NMBS.","")}} (@{{conn.arrival.direction.name}}) -
    - @{{ conn.arrival.platform }} - - @{{ (conn.arrival.time)*1000 | date:'HH:mm' }} - - - @{{ conn.arrival.station}} - -
  • -
-
-
-
-
-
-

- This route was planned on iRail.be. Thank you very much for using our webapp. -

-
-
- -
\ No newline at end of file diff --git a/app/views/contributors/home.blade.php b/app/views/contributors/home.blade.php deleted file mode 100644 index a51af13e..00000000 --- a/app/views/contributors/home.blade.php +++ /dev/null @@ -1,31 +0,0 @@ - - - @include('core.head') - -
-
- @include('core.navigation') -
-
-
-

{{Lang::get('contributors.title')}}

-

{{Lang::get('contributors.description')}}

-
    -
  • Pieter Colpaert
  • -
  • Yeri Tiete
  • -
  • Nico Verbruggen
  • -
  • Brecht Van de Vyvere
  • -
  • Bram Devries
  • -
  • Andreas De Lille
  • -
-
-
-
-
-
- @include('core.footer') - - - diff --git a/app/views/core/footer.blade.php b/app/views/core/footer.blade.php deleted file mode 100644 index 2c38babb..00000000 --- a/app/views/core/footer.blade.php +++ /dev/null @@ -1,13 +0,0 @@ - - diff --git a/app/views/core/head.blade.php b/app/views/core/head.blade.php deleted file mode 100644 index 963f6414..00000000 --- a/app/views/core/head.blade.php +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - iRail.be - - - - - - - - diff --git a/app/views/core/navigation.blade.php b/app/views/core/navigation.blade.php deleted file mode 100644 index b3d96946..00000000 --- a/app/views/core/navigation.blade.php +++ /dev/null @@ -1,19 +0,0 @@ - \ No newline at end of file diff --git a/app/views/errors/404.blade.php b/app/views/errors/404.blade.php deleted file mode 100644 index 9a101e0e..00000000 --- a/app/views/errors/404.blade.php +++ /dev/null @@ -1,27 +0,0 @@ - - -@include('core.head') - -
-
- @include('core.navigation') -
-
-
-
-

-

-

404: {{Lang::get('client.404ErrorTitle')}}

-

{{Lang::get('client.404Explanation')}} {{Lang::get('client.errorMail')}}.

-
- {{Lang::get('client.goHome')}} -
-
-
-
-
-
-
-@include('core.footer') - - diff --git a/app/views/language.blade.php b/app/views/language.blade.php deleted file mode 100644 index 7b332a6f..00000000 --- a/app/views/language.blade.php +++ /dev/null @@ -1,27 +0,0 @@ - - -@include('core.head') - -
-
-
-
- Logo iRail -
-
-

iRail.be

-

Welcome. Bonjour. Hallo.

-
-

Gelieve uw taal te kiezen. Choisissez votre langue s.v.p. Please choose your language.

-
- -
-
-
-@include('core.footer') - - diff --git a/app/views/route/planner.blade.php b/app/views/route/planner.blade.php deleted file mode 100644 index 6d362c98..00000000 --- a/app/views/route/planner.blade.php +++ /dev/null @@ -1,22 +0,0 @@ - - - @include('core.head') - -
-
- @include('core.navigation') -
- @include('_partials.route.planner') - @include('_partials.route.loading') - @include('_partials.route.errors') - @include('_partials.route.empty') - @include('_partials.route.results') -
-
-
- @include('core.footer') - - - diff --git a/app/views/stations/departurearchive.blade.php b/app/views/stations/departurearchive.blade.php deleted file mode 100644 index c7b4ceb3..00000000 --- a/app/views/stations/departurearchive.blade.php +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - - delay)/60) . ' minutes'; }}?> on {{date('d/m/y', strtotime($station->scheduledDepartureTime))}}."> - - - - - - iRail | {{$departureStation->name}} to {{str_replace('[NMBS/SNCB]', '', $station->headsign)}} - - - - - - - -
-
- @include('core.navigation') -
-
-
- -
-
-
-
-

{{Lang::get('client.archived')}}

-

{{date('H:i', strtotime($station->scheduledDepartureTime))}}

- delay) && sizeof($station->delay)>1) { - echo "

" . "cancelled" . "

"; - } - ?> -
-
-

{{Lang::get('client.platform')}} {{$station->platform}}

-

{{$departureStation->name}}

-

{{Lang::get('client.to')}}

-

{{str_replace("[NMBS/SNCB]", "", $station->headsign);}}

- delay)) { - if ($station->delay > 0){ - echo "

+" . ($station->delay/60) . "' " . Lang::get('client.delay') . '

'; - } - } else { - echo "
"; - echo "

" . Lang::get('client.historicalDelays') . "

"; - foreach ($station->delay as $delay) { - echo "
  • " . $delay/60 . " min
  • "; - } - } - ?> -
    -
    -
    -
    -
    -@include('core.footer') - - diff --git a/app/views/stations/departuredetail.blade.php b/app/views/stations/departuredetail.blade.php deleted file mode 100644 index f6dd86c3..00000000 --- a/app/views/stations/departuredetail.blade.php +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - - ."> - - - - - iRail | {{$departureStation->name}} to {{str_replace('[NMBS/SNCB]', '', $station['headsign'])}} - - - - - - - -
    -
    - @include('core.navigation') -
    -
    -
    - - - @if ($station['delay'] > 0) - - - {{ HTML::image('images/irail_logo_delays-0' . $image .'.svg') }} - @else - - @endif -
    -
    -
    -
    -

    {{date('H:i', strtotime($station['scheduledDepartureTime']))}}

    - 0){ - echo "

    +" . ($station['delay']/60) . "' " . Lang::get('client.delay') . '

    '; - } - if (is_array($station['delay']) && sizeof($station['delay'])>1) { - echo "

    " . "cancelled" . "

    "; - } - ?> -
    -
    -

    {{Lang::get('client.platform')}} {{$station['platform']}}

    -

    {{$departureStation->name}}

    -

    {{Lang::get('client.to')}}

    -

    {{str_replace("[NMBS/SNCB]", "", $station['headsign']);}}

    -
    -
    -
    -
    -
    -@include('core.footer') - - diff --git a/app/views/stations/expired.blade.php b/app/views/stations/expired.blade.php deleted file mode 100644 index 3458c1e4..00000000 --- a/app/views/stations/expired.blade.php +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - iRail.be - - - - - - - - - - - - - - -
    -
    - @include('core.navigation') -
    -
    -
    -
    -

    -

    -

    Oops: {{Lang::get('client.ExpiredErrorTitle')}}

    -

    {{Lang::get('client.ExpiredExplanation')}} archive.irail.be.

    -
    - {{Lang::get('client.goHome')}} -
    -
    -
    -
    -
    -
    -
    -@include('core.footer') - - diff --git a/app/views/stations/liveboard.blade.php b/app/views/stations/liveboard.blade.php deleted file mode 100644 index 2aa332d0..00000000 --- a/app/views/stations/liveboard.blade.php +++ /dev/null @@ -1,72 +0,0 @@ - - -@include('core.head') - -
    -
    - @include('core.navigation') -
    -
    -
    -
    Loading...
    -

    {{Lang::get('client.loadingHeader')}}

    -

    {{Lang::get('client.loadingSub')}}

    -
    -
    -
    -
    -

    Liveboard {{Lang::get('client.station')}} {{$station->name }}

    -

    {{Lang::get('client.liveboardDescription')}}

    -
    - -
    - -
    - {{Lang::get('client.noResultsFoundLiveboard')}} -
    -
    -
    -
    -
    -
    -

    -

    -

    {{Lang::get('client.error')}} {{Lang::get('client.errorNoLiveboard')}}

    -

    {{Lang::get('client.errorExplanation')}} {{Lang::get('client.errorMail')}}.

    -
    - {{Lang::get('client.errorReturnLiveboard')}} -
    -
    -
    -
    -
    -
    -
    -@include('core.footer') - - diff --git a/app/views/stations/search.blade.php b/app/views/stations/search.blade.php deleted file mode 100644 index c9ed22f0..00000000 --- a/app/views/stations/search.blade.php +++ /dev/null @@ -1,28 +0,0 @@ - - -@include('core.head') - -
    -
    - @include('core.navigation') -
    -
    -
    - -
    - - -
    - {{Lang::get('client.viewLiveboard')}} -
    -
    -
    -
    -
    -@include('core.footer') - - diff --git a/artisan b/artisan deleted file mode 100755 index 36bb2d98..00000000 --- a/artisan +++ /dev/null @@ -1,74 +0,0 @@ -#!/usr/bin/env php -setRequestForConsoleEnvironment(); - -$artisan = Illuminate\Console\Application::start($app); - -/* -|-------------------------------------------------------------------------- -| Run The Artisan Application -|-------------------------------------------------------------------------- -| -| When we run the console application, the current CLI command will be -| executed in this console and the response sent back to a terminal -| or another output device for the developers. Here goes nothing! -| -*/ - -$status = $artisan->run(); - -/* -|-------------------------------------------------------------------------- -| Shutdown The Application -|-------------------------------------------------------------------------- -| -| Once Artisan has finished running. We will fire off the shutdown events -| so that any final work may be done by the application before we shut -| down the process. This is the last thing to happen to the request. -| -*/ - -$app->shutdown(); - -exit($status); \ No newline at end of file diff --git a/bootstrap/autoload.php b/bootstrap/autoload.php deleted file mode 100644 index 6b329312..00000000 --- a/bootstrap/autoload.php +++ /dev/null @@ -1,75 +0,0 @@ - __DIR__.'/../app', - - /* - |-------------------------------------------------------------------------- - | Public Path - |-------------------------------------------------------------------------- - | - | The public path contains the assets for your web application, such as - | your JavaScript and CSS files, and also contains the primary entry - | point for web requests into these applications from the outside. - | - */ - - 'public' => __DIR__.'/../public', - - /* - |-------------------------------------------------------------------------- - | Base Path - |-------------------------------------------------------------------------- - | - | The base path is the root of the Laravel installation. Most likely you - | will not need to change this value. But, if for some wild reason it - | is necessary you will do so here, just proceed with some caution. - | - */ - - 'base' => __DIR__.'/..', - - /* - |-------------------------------------------------------------------------- - | Storage Path - |-------------------------------------------------------------------------- - | - | The storage path is used by Laravel to store cached Blade views, logs - | and other pieces of information. You may modify the path here when - | you want to change the location of this directory for your apps. - | - */ - - 'storage' => __DIR__.'/../app/storage', - -); diff --git a/bootstrap/start.php b/bootstrap/start.php deleted file mode 100644 index 83af1e25..00000000 --- a/bootstrap/start.php +++ /dev/null @@ -1,78 +0,0 @@ -detectEnvironment( function() { - $haystack = __DIR__; // Catch the directory path - // Set the boolean - $isLocal = strpos($haystack, 'Users/nicoverbruggen/Repositories/hyperRail'); - $isLocalVagrant = strpos($haystack, 'var/www/html/'); - $isDevelopment = strpos($haystack, 'var/www/irail.be/development/'); - $isTest = strpos($haystack, 'var/www/irail.be/test/'); - $isProduction = strpos($haystack, 'var/www/irail.be/web/'); - // Return the correct environment - if ($isLocal) return "local"; - if ($isLocalVagrant) return "vagrant"; - if ($isDevelopment) return "development"; - if ($isTest) return "test"; - if ($isProduction) return "production"; -}); - -/* -|-------------------------------------------------------------------------- -| Bind Paths -|-------------------------------------------------------------------------- -| -| Here we are binding the paths configured in paths.php to the app. You -| should not be changing these here. If you need to change these you -| may do so within the paths.php file and they will be bound here. -| -*/ - -$app->bindInstallPaths(require __DIR__.'/paths.php'); - -/* -|-------------------------------------------------------------------------- -| Load The Application -|-------------------------------------------------------------------------- -| -| Here we will load this Illuminate application. We will keep this in a -| separate location so we can isolate the creation of an application -| from the actual running of the application with a given request. -| -*/ - -$framework = $app['path.base'].'/vendor/laravel/framework/src'; - -require $framework.'/Illuminate/Foundation/start.php'; - -/* -|-------------------------------------------------------------------------- -| Return The Application -|-------------------------------------------------------------------------- -| -| This script returns the application instance. The instance is given to -| the calling script so we can separate the building of the instances -| from the actual running of the application and sending responses. -| -*/ - -return $app; diff --git a/bower.json b/bower.json deleted file mode 100644 index f20d3735..00000000 --- a/bower.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "hyperRail", - "version": "1.0.1", - "homepage": "https://github.com/iRail/hyperRail", - "authors": [], - "license": "MIT", - "ignore": [ - "**/.*", - "node_modules", - "bower_components", - "public/components", - "test", - "tests" - ], - "dependencies": { - "jquery": "~2.1.1", - "fontawesome": "~4.1.0", - "animate.css": "~3.1.1", - "angular-bootstrap": "~0.11.0", - "angular-animate": "~1.2.18", - "bootstrap-sass-official": "*", - "bootstrap-sass": "~3.0.2" - } -} diff --git a/composer.json b/composer.json deleted file mode 100644 index b40aed10..00000000 --- a/composer.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "name": "laravel/laravel", - "description": "The Laravel Framework.", - "keywords": ["framework", "laravel"], - "license": "MIT", - "require": { - "laravel/framework": "4.1.*", - "easyrdf/easyrdf": "*", - "semsol/arc2": "*", - "ml/json-ld": "1.*", - "willdurand/negotiation": "@stable" - }, - "require-dev": { - "phpunit/phpunit": "4.0.*", - "mockery/mockery": "0.9.*", - "phpspec/phpspec": "2.*", - "way/generators": "2.*", - "barryvdh/laravel-ide-helper": "1.*" - }, - "autoload": { - "classmap": [ - "app/commands", - "app/controllers", - "app/models", - "app/database/migrations", - "app/database/seeds", - "app/tests/TestCase.php", - "app/exceptions" - ], - "psr-0": { - "hyperRail\\" : "app/" - } - }, - "scripts": { - "post-install-cmd": [ - "php artisan clear-compiled", - "php artisan optimize" - ], - "post-update-cmd": [ - "php artisan clear-compiled", - "php artisan ide-helper:generate", - "php artisan optimize" - ], - "post-create-project-cmd": [ - "php artisan key:generate" - ] - }, - "config": { - "preferred-install": "dist" - }, - "minimum-stability": "stable" -} diff --git a/composer.lock b/composer.lock deleted file mode 100644 index 13dfaabb..00000000 --- a/composer.lock +++ /dev/null @@ -1,3008 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", - "This file is @generated automatically" - ], - "hash": "ee39625a2b54e172817b5dae750aefe6", - "packages": [ - { - "name": "classpreloader/classpreloader", - "version": "1.0.2", - "source": { - "type": "git", - "url": "https://github.com/ClassPreloader/ClassPreloader.git", - "reference": "2c9f3bcbab329570c57339895bd11b5dd3b00877" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ClassPreloader/ClassPreloader/zipball/2c9f3bcbab329570c57339895bd11b5dd3b00877", - "reference": "2c9f3bcbab329570c57339895bd11b5dd3b00877", - "shasum": "" - }, - "require": { - "nikic/php-parser": "~0.9", - "php": ">=5.3.3", - "symfony/console": "~2.1", - "symfony/filesystem": "~2.1", - "symfony/finder": "~2.1" - }, - "bin": [ - "classpreloader.php" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "psr-0": { - "ClassPreloader": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Helps class loading performance by generating a single PHP file containing all of the autoloaded files for a specific use case", - "keywords": [ - "autoload", - "class", - "preload" - ], - "time": "2014-03-12 00:05:31" - }, - { - "name": "d11wtq/boris", - "version": "v1.0.8", - "source": { - "type": "git", - "url": "https://github.com/d11wtq/boris.git", - "reference": "125dd4e5752639af7678a22ea597115646d89c6e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/d11wtq/boris/zipball/125dd4e5752639af7678a22ea597115646d89c6e", - "reference": "125dd4e5752639af7678a22ea597115646d89c6e", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "suggest": { - "ext-pcntl": "*", - "ext-posix": "*", - "ext-readline": "*" - }, - "bin": [ - "bin/boris" - ], - "type": "library", - "autoload": { - "psr-0": { - "Boris": "lib" - } - }, - "notification-url": "https://packagist.org/downloads/", - "time": "2014-01-17 12:21:18" - }, - { - "name": "easyrdf/easyrdf", - "version": "0.9.0", - "source": { - "type": "git", - "url": "https://github.com/njh/easyrdf.git", - "reference": "bb9fd99768d23af0c5b7b55cec5baddc201272b8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/njh/easyrdf/zipball/bb9fd99768d23af0c5b7b55cec5baddc201272b8", - "reference": "bb9fd99768d23af0c5b7b55cec5baddc201272b8", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "ext-pcre": "*", - "php": ">=5.2.8" - }, - "require-dev": { - "phpunit/phpunit": "~3.5", - "sami/sami": "~1.4", - "squizlabs/php_codesniffer": "~1.4.3" - }, - "suggest": { - "ml/json-ld": "~1.0" - }, - "type": "library", - "autoload": { - "psr-0": { - "EasyRdf_": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Nicholas Humfrey", - "email": "njh@aelius.com", - "homepage": "http://www.aelius.com/njh/", - "role": "Developer" - }, - { - "name": "Alexey Zakhlestin", - "email": "indeyets@gmail.com", - "role": "Developer" - } - ], - "description": "EasyRdf is a PHP library designed to make it easy to consume and produce RDF.", - "homepage": "http://www.easyrdf.org/", - "keywords": [ - "Linked Data", - "RDF", - "Semantic Web", - "Turtle", - "rdfa", - "sparql" - ], - "time": "2014-11-07 18:02:16" - }, - { - "name": "filp/whoops", - "version": "1.0.10", - "source": { - "type": "git", - "url": "https://github.com/filp/whoops.git", - "reference": "91e3fd4b0812017ffbeb24add55330664e1ea32a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/91e3fd4b0812017ffbeb24add55330664e1ea32a", - "reference": "91e3fd4b0812017ffbeb24add55330664e1ea32a", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "require-dev": { - "mockery/mockery": "dev-master", - "silex/silex": "1.0.*@dev" - }, - "type": "library", - "autoload": { - "psr-0": { - "Whoops": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Filipe Dobreira", - "homepage": "https://github.com/filp", - "role": "Developer" - } - ], - "description": "php error handling for cool kids", - "homepage": "https://github.com/filp/whoops", - "keywords": [ - "error", - "exception", - "handling", - "library", - "silex-provider", - "whoops", - "zf2" - ], - "time": "2013-12-04 14:19:30" - }, - { - "name": "ircmaxell/password-compat", - "version": "v1.0.4", - "source": { - "type": "git", - "url": "https://github.com/ircmaxell/password_compat.git", - "reference": "5c5cde8822a69545767f7c7f3058cb15ff84614c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ircmaxell/password_compat/zipball/5c5cde8822a69545767f7c7f3058cb15ff84614c", - "reference": "5c5cde8822a69545767f7c7f3058cb15ff84614c", - "shasum": "" - }, - "require-dev": { - "phpunit/phpunit": "4.*" - }, - "type": "library", - "autoload": { - "files": [ - "lib/password.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Anthony Ferrara", - "email": "ircmaxell@php.net", - "homepage": "http://blog.ircmaxell.com" - } - ], - "description": "A compatibility library for the proposed simplified password hashing algorithm: https://wiki.php.net/rfc/password_hash", - "homepage": "https://github.com/ircmaxell/password_compat", - "keywords": [ - "hashing", - "password" - ], - "time": "2014-11-20 16:49:30" - }, - { - "name": "jeremeamia/SuperClosure", - "version": "1.0.2", - "source": { - "type": "git", - "url": "https://github.com/jeremeamia/super_closure.git", - "reference": "4d89ca74994feab128ea46d5b3add92e6cb84554" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/jeremeamia/super_closure/zipball/4d89ca74994feab128ea46d5b3add92e6cb84554", - "reference": "4d89ca74994feab128ea46d5b3add92e6cb84554", - "shasum": "" - }, - "require": { - "nikic/php-parser": "~0.9", - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~3.7" - }, - "type": "library", - "autoload": { - "psr-0": { - "Jeremeamia\\SuperClosure": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jeremy Lindblom" - } - ], - "description": "Doing interesting things with closures like serialization.", - "homepage": "https://github.com/jeremeamia/super_closure", - "keywords": [ - "closure", - "function", - "parser", - "serializable", - "serialize", - "tokenizer" - ], - "time": "2015-01-10 01:09:28" - }, - { - "name": "laravel/framework", - "version": "v4.1.31", - "source": { - "type": "git", - "url": "https://github.com/laravel/framework.git", - "reference": "2b092f8d12eb26929687c3ecfb13b626fba6fe6d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/2b092f8d12eb26929687c3ecfb13b626fba6fe6d", - "reference": "2b092f8d12eb26929687c3ecfb13b626fba6fe6d", - "shasum": "" - }, - "require": { - "classpreloader/classpreloader": "1.0.*", - "d11wtq/boris": "1.0.*", - "filp/whoops": "1.0.10", - "ircmaxell/password-compat": "1.0.*", - "jeremeamia/superclosure": "1.0.*", - "monolog/monolog": "1.*", - "nesbot/carbon": "1.*", - "patchwork/utf8": "1.1.*", - "php": ">=5.3.0", - "phpseclib/phpseclib": "0.3.*", - "predis/predis": "0.8.*", - "stack/builder": "1.0.*", - "swiftmailer/swiftmailer": "~5.0", - "symfony/browser-kit": "2.4.*", - "symfony/console": "2.4.*", - "symfony/css-selector": "2.4.*", - "symfony/debug": "2.4.*", - "symfony/dom-crawler": "2.4.*", - "symfony/finder": "2.4.*", - "symfony/http-foundation": "2.4.*", - "symfony/http-kernel": "2.4.*", - "symfony/process": "2.4.*", - "symfony/routing": "2.4.*", - "symfony/security-core": "2.4.*", - "symfony/translation": "2.4.*" - }, - "replace": { - "illuminate/auth": "self.version", - "illuminate/cache": "self.version", - "illuminate/config": "self.version", - "illuminate/console": "self.version", - "illuminate/container": "self.version", - "illuminate/cookie": "self.version", - "illuminate/database": "self.version", - "illuminate/encryption": "self.version", - "illuminate/events": "self.version", - "illuminate/exception": "self.version", - "illuminate/filesystem": "self.version", - "illuminate/foundation": "self.version", - "illuminate/hashing": "self.version", - "illuminate/html": "self.version", - "illuminate/http": "self.version", - "illuminate/log": "self.version", - "illuminate/mail": "self.version", - "illuminate/pagination": "self.version", - "illuminate/queue": "self.version", - "illuminate/redis": "self.version", - "illuminate/remote": "self.version", - "illuminate/routing": "self.version", - "illuminate/session": "self.version", - "illuminate/support": "self.version", - "illuminate/translation": "self.version", - "illuminate/validation": "self.version", - "illuminate/view": "self.version", - "illuminate/workbench": "self.version" - }, - "require-dev": { - "aws/aws-sdk-php": "2.6.*", - "iron-io/iron_mq": "1.5.*", - "mockery/mockery": "0.9.*", - "pda/pheanstalk": "2.1.*", - "phpunit/phpunit": "4.0.*" - }, - "suggest": { - "doctrine/dbal": "Allow renaming columns and dropping SQLite columns." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/Illuminate/Queue/IlluminateQueueClosure.php" - ], - "files": [ - "src/Illuminate/Support/helpers.php" - ], - "psr-0": { - "Illuminate": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylorotwell@gmail.com" - } - ], - "description": "The Laravel Framework.", - "keywords": [ - "framework", - "laravel" - ], - "time": "2014-09-08 18:40:03" - }, - { - "name": "ml/iri", - "version": "1.1.4", - "target-dir": "ML/IRI", - "source": { - "type": "git", - "url": "https://github.com/lanthaler/IRI.git", - "reference": "cbd44fa913e00ea624241b38cefaa99da8d71341" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/lanthaler/IRI/zipball/cbd44fa913e00ea624241b38cefaa99da8d71341", - "reference": "cbd44fa913e00ea624241b38cefaa99da8d71341", - "shasum": "" - }, - "require": { - "lib-pcre": ">=4.0", - "php": ">=5.3.0" - }, - "type": "library", - "autoload": { - "psr-0": { - "ML\\IRI": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Markus Lanthaler", - "email": "mail@markus-lanthaler.com", - "homepage": "http://www.markus-lanthaler.com", - "role": "Developer" - } - ], - "description": "IRI handling for PHP", - "homepage": "http://www.markus-lanthaler.com", - "keywords": [ - "URN", - "iri", - "uri", - "url" - ], - "time": "2014-01-21 13:43:39" - }, - { - "name": "ml/json-ld", - "version": "1.0.3", - "target-dir": "ML/JsonLD", - "source": { - "type": "git", - "url": "https://github.com/lanthaler/JsonLD.git", - "reference": "10a03f7dec0f4a7db6b2e6e6230cdfb7cce562a2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/lanthaler/JsonLD/zipball/10a03f7dec0f4a7db6b2e6e6230cdfb7cce562a2", - "reference": "10a03f7dec0f4a7db6b2e6e6230cdfb7cce562a2", - "shasum": "" - }, - "require": { - "ext-json": "*", - "ml/iri": ">=1.1.1", - "php": ">=5.3.0" - }, - "require-dev": { - "json-ld/tests": "@dev" - }, - "type": "library", - "autoload": { - "psr-0": { - "ML\\JsonLD": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Markus Lanthaler", - "email": "mail@markus-lanthaler.com", - "homepage": "http://www.markus-lanthaler.com", - "role": "Developer" - } - ], - "description": "JSON-LD Processor for PHP", - "homepage": "http://www.markus-lanthaler.com", - "keywords": [ - "JSON-LD", - "jsonld" - ], - "time": "2014-09-15 10:41:19" - }, - { - "name": "monolog/monolog", - "version": "1.12.0", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/monolog.git", - "reference": "1fbe8c2641f2b163addf49cc5e18f144bec6b19f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/1fbe8c2641f2b163addf49cc5e18f144bec6b19f", - "reference": "1fbe8c2641f2b163addf49cc5e18f144bec6b19f", - "shasum": "" - }, - "require": { - "php": ">=5.3.0", - "psr/log": "~1.0" - }, - "provide": { - "psr/log-implementation": "1.0.0" - }, - "require-dev": { - "aws/aws-sdk-php": "~2.4, >2.4.8", - "doctrine/couchdb": "~1.0@dev", - "graylog2/gelf-php": "~1.0", - "phpunit/phpunit": "~4.0", - "raven/raven": "~0.5", - "ruflin/elastica": "0.90.*", - "videlalvaro/php-amqplib": "~2.4" - }, - "suggest": { - "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", - "doctrine/couchdb": "Allow sending log messages to a CouchDB server", - "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", - "ext-mongo": "Allow sending log messages to a MongoDB server", - "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", - "raven/raven": "Allow sending log messages to a Sentry server", - "rollbar/rollbar": "Allow sending log messages to Rollbar", - "ruflin/elastica": "Allow sending log messages to an Elastic Search server", - "videlalvaro/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.12.x-dev" - } - }, - "autoload": { - "psr-4": { - "Monolog\\": "src/Monolog" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "Sends your logs to files, sockets, inboxes, databases and various web services", - "homepage": "http://github.com/Seldaek/monolog", - "keywords": [ - "log", - "logging", - "psr-3" - ], - "time": "2014-12-29 21:29:35" - }, - { - "name": "nesbot/carbon", - "version": "1.14.0", - "source": { - "type": "git", - "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "bb87460c995d97fe55b39e65f6ffb7f64b0a941e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/bb87460c995d97fe55b39e65f6ffb7f64b0a941e", - "reference": "bb87460c995d97fe55b39e65f6ffb7f64b0a941e", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.0" - }, - "type": "library", - "autoload": { - "psr-0": { - "Carbon": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Brian Nesbitt", - "email": "brian@nesbot.com", - "homepage": "http://nesbot.com" - } - ], - "description": "A simple API extension for DateTime.", - "homepage": "https://github.com/briannesbitt/Carbon", - "keywords": [ - "date", - "datetime", - "time" - ], - "time": "2015-02-06 05:07:29" - }, - { - "name": "nikic/php-parser", - "version": "v0.9.5", - "source": { - "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "ef70767475434bdb3615b43c327e2cae17ef12eb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/ef70767475434bdb3615b43c327e2cae17ef12eb", - "reference": "ef70767475434bdb3615b43c327e2cae17ef12eb", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": ">=5.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.9-dev" - } - }, - "autoload": { - "psr-0": { - "PHPParser": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Nikita Popov" - } - ], - "description": "A PHP parser written in PHP", - "keywords": [ - "parser", - "php" - ], - "time": "2014-07-23 18:24:17" - }, - { - "name": "patchwork/utf8", - "version": "v1.1.28", - "source": { - "type": "git", - "url": "https://github.com/tchwork/utf8.git", - "reference": "ffa082111aa3cb23cf2479a17e6785ace91da982" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/tchwork/utf8/zipball/ffa082111aa3cb23cf2479a17e6785ace91da982", - "reference": "ffa082111aa3cb23cf2479a17e6785ace91da982", - "shasum": "" - }, - "require": { - "lib-pcre": ">=7.3", - "php": ">=5.3.0" - }, - "suggest": { - "ext-iconv": "Use iconv for best performance", - "ext-intl": "Use Intl for best performance", - "ext-mbstring": "Use Mbstring for best performance" - }, - "type": "library", - "autoload": { - "psr-0": { - "Patchwork": "class/", - "Normalizer": "class/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "(Apache-2.0 or GPL-2.0)" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - } - ], - "description": "Portable and performant UTF-8, Unicode and Grapheme Clusters for PHP", - "homepage": "https://github.com/tchwork/utf8", - "keywords": [ - "grapheme", - "i18n", - "unicode", - "utf-8", - "utf8" - ], - "time": "2015-01-12 08:05:15" - }, - { - "name": "phpseclib/phpseclib", - "version": "0.3.10", - "source": { - "type": "git", - "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "d15bba1edcc7c89e09cc74c5d961317a8b947bf4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/d15bba1edcc7c89e09cc74c5d961317a8b947bf4", - "reference": "d15bba1edcc7c89e09cc74c5d961317a8b947bf4", - "shasum": "" - }, - "require": { - "php": ">=5.0.0" - }, - "require-dev": { - "phing/phing": "~2.7", - "phpunit/phpunit": "~4.0", - "sami/sami": "~2.0", - "squizlabs/php_codesniffer": "~1.5" - }, - "suggest": { - "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", - "ext-mcrypt": "Install the Mcrypt extension in order to speed up a wide variety of cryptographic operations.", - "pear-pear/PHP_Compat": "Install PHP_Compat to get phpseclib working on PHP < 4.3.3." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.3-dev" - } - }, - "autoload": { - "psr-0": { - "Crypt": "phpseclib/", - "File": "phpseclib/", - "Math": "phpseclib/", - "Net": "phpseclib/", - "System": "phpseclib/" - }, - "files": [ - "phpseclib/Crypt/Random.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "include-path": [ - "phpseclib/" - ], - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jim Wigginton", - "email": "terrafrost@php.net", - "role": "Lead Developer" - }, - { - "name": "Patrick Monnerat", - "email": "pm@datasphere.ch", - "role": "Developer" - }, - { - "name": "Andreas Fischer", - "email": "bantu@phpbb.com", - "role": "Developer" - }, - { - "name": "Hans-Jürgen Petrich", - "email": "petrich@tronic-media.com", - "role": "Developer" - } - ], - "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", - "homepage": "http://phpseclib.sourceforge.net", - "keywords": [ - "BigInteger", - "aes", - "asn.1", - "asn1", - "blowfish", - "crypto", - "cryptography", - "encryption", - "rsa", - "security", - "sftp", - "signature", - "signing", - "ssh", - "twofish", - "x.509", - "x509" - ], - "time": "2015-01-28 21:50:33" - }, - { - "name": "predis/predis", - "version": "v0.8.7", - "source": { - "type": "git", - "url": "https://github.com/nrk/predis.git", - "reference": "4123fcd85d61354c6c9900db76c9597dbd129bf6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nrk/predis/zipball/4123fcd85d61354c6c9900db76c9597dbd129bf6", - "reference": "4123fcd85d61354c6c9900db76c9597dbd129bf6", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "require-dev": { - "phpunit/phpunit": "~4.0" - }, - "suggest": { - "ext-curl": "Allows access to Webdis when paired with phpiredis", - "ext-phpiredis": "Allows faster serialization and deserialization of the Redis protocol" - }, - "type": "library", - "autoload": { - "psr-0": { - "Predis": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Daniele Alessandri", - "email": "suppakilla@gmail.com", - "homepage": "http://clorophilla.net" - } - ], - "description": "Flexible and feature-complete PHP client library for Redis", - "homepage": "http://github.com/nrk/predis", - "keywords": [ - "nosql", - "predis", - "redis" - ], - "time": "2014-08-01 09:43:10" - }, - { - "name": "psr/log", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/fe0936ee26643249e916849d48e3a51d5f5e278b", - "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b", - "shasum": "" - }, - "type": "library", - "autoload": { - "psr-0": { - "Psr\\Log\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "time": "2012-12-21 11:40:51" - }, - { - "name": "semsol/arc2", - "version": "v2.2.4", - "source": { - "type": "git", - "url": "https://github.com/semsol/arc2.git", - "reference": "8a35ff12a6d44da26ada513016a451a2703557ec" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/semsol/arc2/zipball/8a35ff12a6d44da26ada513016a451a2703557ec", - "reference": "8a35ff12a6d44da26ada513016a451a2703557ec", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "./", - "parsers/", - "serializers/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "W3C" - ], - "authors": [ - { - "name": "Benji Nowack", - "email": "mail@bnowack.de", - "homepage": "http://bnowack.de/" - } - ], - "description": "Semsol's ARC2 RDF library", - "homepage": "https://github.com/semsol/arc2", - "keywords": [ - "RDF", - "sparql" - ], - "time": "2013-12-12 15:02:21" - }, - { - "name": "stack/builder", - "version": "v1.0.3", - "source": { - "type": "git", - "url": "https://github.com/stackphp/builder.git", - "reference": "c1f8a4693b55c563405024f708a76ef576c3b276" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/stackphp/builder/zipball/c1f8a4693b55c563405024f708a76ef576c3b276", - "reference": "c1f8a4693b55c563405024f708a76ef576c3b276", - "shasum": "" - }, - "require": { - "php": ">=5.3.0", - "symfony/http-foundation": "~2.1", - "symfony/http-kernel": "~2.1" - }, - "require-dev": { - "silex/silex": "~1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "psr-0": { - "Stack": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch" - } - ], - "description": "Builder for stack middlewares based on HttpKernelInterface.", - "keywords": [ - "stack" - ], - "time": "2014-11-23 20:37:11" - }, - { - "name": "swiftmailer/swiftmailer", - "version": "v5.3.1", - "source": { - "type": "git", - "url": "https://github.com/swiftmailer/swiftmailer.git", - "reference": "c5f963e7f9d6f6438fda4f22d5cc2db296ec621a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/c5f963e7f9d6f6438fda4f22d5cc2db296ec621a", - "reference": "c5f963e7f9d6f6438fda4f22d5cc2db296ec621a", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "mockery/mockery": "~0.9.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.3-dev" - } - }, - "autoload": { - "files": [ - "lib/swift_required.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Chris Corbyn" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "Swiftmailer, free feature-rich PHP mailer", - "homepage": "http://swiftmailer.org", - "keywords": [ - "mail", - "mailer" - ], - "time": "2014-12-05 14:17:14" - }, - { - "name": "symfony/browser-kit", - "version": "v2.4.10", - "target-dir": "Symfony/Component/BrowserKit", - "source": { - "type": "git", - "url": "https://github.com/symfony/BrowserKit.git", - "reference": "027accb7a418046887680764bfbeeebc84ecf5a6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/BrowserKit/zipball/027accb7a418046887680764bfbeeebc84ecf5a6", - "reference": "027accb7a418046887680764bfbeeebc84ecf5a6", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "symfony/dom-crawler": "~2.0" - }, - "require-dev": { - "symfony/css-selector": "~2.0", - "symfony/process": "~2.0" - }, - "suggest": { - "symfony/process": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\BrowserKit\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "Symfony BrowserKit Component", - "homepage": "http://symfony.com", - "time": "2014-09-22 08:51:05" - }, - { - "name": "symfony/console", - "version": "v2.4.10", - "target-dir": "Symfony/Component/Console", - "source": { - "type": "git", - "url": "https://github.com/symfony/Console.git", - "reference": "39dd1c85ffdfc3c5fb008019dd027af05f64ec36" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Console/zipball/39dd1c85ffdfc3c5fb008019dd027af05f64ec36", - "reference": "39dd1c85ffdfc3c5fb008019dd027af05f64ec36", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "symfony/event-dispatcher": "~2.1" - }, - "suggest": { - "symfony/event-dispatcher": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\Console\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "Symfony Console Component", - "homepage": "http://symfony.com", - "time": "2014-09-22 08:51:05" - }, - { - "name": "symfony/css-selector", - "version": "v2.4.10", - "target-dir": "Symfony/Component/CssSelector", - "source": { - "type": "git", - "url": "https://github.com/symfony/CssSelector.git", - "reference": "4e9ddc09c13475fb1a52fb578a8899c8303966c5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/CssSelector/zipball/4e9ddc09c13475fb1a52fb578a8899c8303966c5", - "reference": "4e9ddc09c13475fb1a52fb578a8899c8303966c5", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\CssSelector\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, - { - "name": "Jean-François Simon", - "email": "jeanfrancois.simon@sensiolabs.com" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "Symfony CssSelector Component", - "homepage": "http://symfony.com", - "time": "2014-09-22 08:51:05" - }, - { - "name": "symfony/debug", - "version": "v2.4.10", - "target-dir": "Symfony/Component/Debug", - "source": { - "type": "git", - "url": "https://github.com/symfony/Debug.git", - "reference": "17f9a22782f51ca18724b6713671cf0148b86043" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Debug/zipball/17f9a22782f51ca18724b6713671cf0148b86043", - "reference": "17f9a22782f51ca18724b6713671cf0148b86043", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "symfony/http-foundation": "~2.1", - "symfony/http-kernel": "~2.1" - }, - "suggest": { - "symfony/http-foundation": "", - "symfony/http-kernel": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\Debug\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "Symfony Debug Component", - "homepage": "http://symfony.com", - "time": "2014-09-28 15:03:21" - }, - { - "name": "symfony/dom-crawler", - "version": "v2.4.10", - "target-dir": "Symfony/Component/DomCrawler", - "source": { - "type": "git", - "url": "https://github.com/symfony/DomCrawler.git", - "reference": "eea2c3d5c16f6319d0122153594fdb66dfba1ca1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/DomCrawler/zipball/eea2c3d5c16f6319d0122153594fdb66dfba1ca1", - "reference": "eea2c3d5c16f6319d0122153594fdb66dfba1ca1", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "symfony/css-selector": "~2.0" - }, - "suggest": { - "symfony/css-selector": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\DomCrawler\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "Symfony DomCrawler Component", - "homepage": "http://symfony.com", - "time": "2014-09-22 08:51:05" - }, - { - "name": "symfony/event-dispatcher", - "version": "v2.6.4", - "target-dir": "Symfony/Component/EventDispatcher", - "source": { - "type": "git", - "url": "https://github.com/symfony/EventDispatcher.git", - "reference": "f75989f3ab2743a82fe0b03ded2598a2b1546813" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/f75989f3ab2743a82fe0b03ded2598a2b1546813", - "reference": "f75989f3ab2743a82fe0b03ded2598a2b1546813", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/config": "~2.0,>=2.0.5", - "symfony/dependency-injection": "~2.6", - "symfony/expression-language": "~2.6", - "symfony/stopwatch": "~2.3" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.6-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\EventDispatcher\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "Symfony EventDispatcher Component", - "homepage": "http://symfony.com", - "time": "2015-02-01 16:10:57" - }, - { - "name": "symfony/filesystem", - "version": "v2.6.4", - "target-dir": "Symfony/Component/Filesystem", - "source": { - "type": "git", - "url": "https://github.com/symfony/Filesystem.git", - "reference": "a1f566d1f92e142fa1593f4555d6d89e3044a9b7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Filesystem/zipball/a1f566d1f92e142fa1593f4555d6d89e3044a9b7", - "reference": "a1f566d1f92e142fa1593f4555d6d89e3044a9b7", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.6-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\Filesystem\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "Symfony Filesystem Component", - "homepage": "http://symfony.com", - "time": "2015-01-03 21:13:09" - }, - { - "name": "symfony/finder", - "version": "v2.4.10", - "target-dir": "Symfony/Component/Finder", - "source": { - "type": "git", - "url": "https://github.com/symfony/Finder.git", - "reference": "cd03920154bc6669f64fbabb803d24cc8629964c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Finder/zipball/cd03920154bc6669f64fbabb803d24cc8629964c", - "reference": "cd03920154bc6669f64fbabb803d24cc8629964c", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\Finder\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "Symfony Finder Component", - "homepage": "http://symfony.com", - "time": "2014-09-27 08:35:25" - }, - { - "name": "symfony/http-foundation", - "version": "v2.4.10", - "target-dir": "Symfony/Component/HttpFoundation", - "source": { - "type": "git", - "url": "https://github.com/symfony/HttpFoundation.git", - "reference": "8e42d9536b5df05f37a9aae5761d3ee69ab95ddf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/HttpFoundation/zipball/8e42d9536b5df05f37a9aae5761d3ee69ab95ddf", - "reference": "8e42d9536b5df05f37a9aae5761d3ee69ab95ddf", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "symfony/expression-language": "~2.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\HttpFoundation\\": "" - }, - "classmap": [ - "Symfony/Component/HttpFoundation/Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "Symfony HttpFoundation Component", - "homepage": "http://symfony.com", - "time": "2014-09-25 08:51:47" - }, - { - "name": "symfony/http-kernel", - "version": "v2.4.10", - "target-dir": "Symfony/Component/HttpKernel", - "source": { - "type": "git", - "url": "https://github.com/symfony/HttpKernel.git", - "reference": "84b1bd5433bc78cf78c19808abdd155edb4f1937" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/HttpKernel/zipball/84b1bd5433bc78cf78c19808abdd155edb4f1937", - "reference": "84b1bd5433bc78cf78c19808abdd155edb4f1937", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "psr/log": "~1.0", - "symfony/debug": "~2.3", - "symfony/event-dispatcher": "~2.1", - "symfony/http-foundation": "~2.4" - }, - "require-dev": { - "symfony/browser-kit": "~2.2", - "symfony/class-loader": "~2.1", - "symfony/config": "~2.0", - "symfony/console": "~2.2", - "symfony/dependency-injection": "~2.0", - "symfony/expression-language": "~2.4", - "symfony/finder": "~2.0", - "symfony/process": "~2.0", - "symfony/routing": "~2.2", - "symfony/stopwatch": "~2.2", - "symfony/templating": "~2.2" - }, - "suggest": { - "symfony/browser-kit": "", - "symfony/class-loader": "", - "symfony/config": "", - "symfony/console": "", - "symfony/dependency-injection": "", - "symfony/finder": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\HttpKernel\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "Symfony HttpKernel Component", - "homepage": "http://symfony.com", - "time": "2014-09-28 17:03:37" - }, - { - "name": "symfony/process", - "version": "v2.4.10", - "target-dir": "Symfony/Component/Process", - "source": { - "type": "git", - "url": "https://github.com/symfony/Process.git", - "reference": "2756ff2bc8e05527f4d5285cc4406e269b12e516" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Process/zipball/2756ff2bc8e05527f4d5285cc4406e269b12e516", - "reference": "2756ff2bc8e05527f4d5285cc4406e269b12e516", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\Process\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "Symfony Process Component", - "homepage": "http://symfony.com", - "time": "2014-09-23 05:24:59" - }, - { - "name": "symfony/routing", - "version": "v2.4.10", - "target-dir": "Symfony/Component/Routing", - "source": { - "type": "git", - "url": "https://github.com/symfony/Routing.git", - "reference": "0bd97a27cfd1ad2699ad045de2a744888318a228" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Routing/zipball/0bd97a27cfd1ad2699ad045de2a744888318a228", - "reference": "0bd97a27cfd1ad2699ad045de2a744888318a228", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "doctrine/annotations": "~1.0", - "psr/log": "~1.0", - "symfony/config": "~2.2", - "symfony/expression-language": "~2.4", - "symfony/http-foundation": "~2.3", - "symfony/yaml": "~2.0" - }, - "suggest": { - "doctrine/annotations": "For using the annotation loader", - "symfony/config": "For using the all-in-one router or any loader", - "symfony/expression-language": "For using expression matching", - "symfony/yaml": "For using the YAML loader" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\Routing\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "Symfony Routing Component", - "homepage": "http://symfony.com", - "keywords": [ - "router", - "routing", - "uri", - "url" - ], - "time": "2014-09-22 15:28:09" - }, - { - "name": "symfony/security-core", - "version": "v2.4.10", - "target-dir": "Symfony/Component/Security/Core", - "source": { - "type": "git", - "url": "https://github.com/symfony/security-core.git", - "reference": "46fe65e1cb18f037c9cd286d8c1bde11ff4b573b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/46fe65e1cb18f037c9cd286d8c1bde11ff4b573b", - "reference": "46fe65e1cb18f037c9cd286d8c1bde11ff4b573b", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "ircmaxell/password-compat": "1.0.*", - "psr/log": "~1.0", - "symfony/event-dispatcher": "~2.1", - "symfony/expression-language": "~2.4", - "symfony/http-foundation": "~2.4", - "symfony/validator": "~2.2,<2.5.0" - }, - "suggest": { - "ircmaxell/password-compat": "For using the BCrypt password encoder in PHP <5.5", - "symfony/event-dispatcher": "", - "symfony/expression-language": "For using the expression voter", - "symfony/http-foundation": "", - "symfony/validator": "For using the user password constraint" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\Security\\Core\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "Symfony Security Component - Core Library", - "homepage": "http://symfony.com", - "time": "2014-09-27 20:16:29" - }, - { - "name": "symfony/translation", - "version": "v2.4.10", - "target-dir": "Symfony/Component/Translation", - "source": { - "type": "git", - "url": "https://github.com/symfony/Translation.git", - "reference": "c61327aab6ec192b55e4868c52fdd0ca476100d3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Translation/zipball/c61327aab6ec192b55e4868c52fdd0ca476100d3", - "reference": "c61327aab6ec192b55e4868c52fdd0ca476100d3", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "symfony/config": "~2.0", - "symfony/intl": "~2.3", - "symfony/yaml": "~2.2" - }, - "suggest": { - "symfony/config": "", - "symfony/yaml": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\Translation\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "Symfony Translation Component", - "homepage": "http://symfony.com", - "time": "2014-09-23 05:24:59" - }, - { - "name": "willdurand/negotiation", - "version": "1.3.4", - "source": { - "type": "git", - "url": "https://github.com/willdurand/Negotiation.git", - "reference": "d7fa4ce4a0436915b9ba9f7cb5ff37719f0a834c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/willdurand/Negotiation/zipball/d7fa4ce4a0436915b9ba9f7cb5ff37719f0a834c", - "reference": "d7fa4ce4a0436915b9ba9f7cb5ff37719f0a834c", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3-dev" - } - }, - "autoload": { - "psr-0": { - "Negotiation": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "William Durand", - "email": "william.durand1@gmail.com" - } - ], - "description": "Content Negotiation tools for PHP provided as a standalone library.", - "homepage": "http://williamdurand.fr/Negotiation/", - "keywords": [ - "accept", - "content", - "format", - "header", - "negotiation" - ], - "time": "2014-10-02 07:26:00" - } - ], - "packages-dev": [ - { - "name": "barryvdh/laravel-ide-helper", - "version": "v1.11.4", - "source": { - "type": "git", - "url": "https://github.com/barryvdh/laravel-ide-helper.git", - "reference": "3f9831c5cf886c142c92e7038bc0340b78614481" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/3f9831c5cf886c142c92e7038bc0340b78614481", - "reference": "3f9831c5cf886c142c92e7038bc0340b78614481", - "shasum": "" - }, - "require": { - "illuminate/console": "4.x", - "illuminate/filesystem": "4.x", - "illuminate/support": "4.x", - "php": ">=5.3.0", - "phpdocumentor/reflection-docblock": "2.0.x", - "symfony/class-loader": "~2.3" - }, - "require-dev": { - "doctrine/dbal": "~2.3" - }, - "suggest": { - "doctrine/dbal": "Load information from the database about models for phpdocs (~2.3)" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.11-dev" - } - }, - "autoload": { - "psr-4": { - "Barryvdh\\LaravelIdeHelper\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Barry vd. Heuvel", - "email": "barryvdh@gmail.com" - } - ], - "description": "Laravel IDE Helper, generates correct PHPDocs for all Facade classes, to improve auto-completion.", - "keywords": [ - "autocomplete", - "codeintel", - "helper", - "ide", - "laravel", - "netbeans", - "phpdoc", - "phpstorm", - "sublime" - ], - "time": "2015-02-04 08:14:36" - }, - { - "name": "doctrine/instantiator", - "version": "1.0.4", - "source": { - "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "f976e5de371104877ebc89bd8fecb0019ed9c119" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f976e5de371104877ebc89bd8fecb0019ed9c119", - "reference": "f976e5de371104877ebc89bd8fecb0019ed9c119", - "shasum": "" - }, - "require": { - "php": ">=5.3,<8.0-DEV" - }, - "require-dev": { - "athletic/athletic": "~0.1.8", - "ext-pdo": "*", - "ext-phar": "*", - "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "2.0.*@ALPHA" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-0": { - "Doctrine\\Instantiator\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.com/" - } - ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://github.com/doctrine/instantiator", - "keywords": [ - "constructor", - "instantiate" - ], - "time": "2014-10-13 12:58:55" - }, - { - "name": "mockery/mockery", - "version": "0.9.3", - "source": { - "type": "git", - "url": "https://github.com/padraic/mockery.git", - "reference": "686f85fa5b3b079cc0157d7cd3e9adb97f0b41e1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/padraic/mockery/zipball/686f85fa5b3b079cc0157d7cd3e9adb97f0b41e1", - "reference": "686f85fa5b3b079cc0157d7cd3e9adb97f0b41e1", - "shasum": "" - }, - "require": { - "lib-pcre": ">=7.0", - "php": ">=5.3.2" - }, - "require-dev": { - "hamcrest/hamcrest-php": "~1.1", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "~0.7@dev" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.9.x-dev" - } - }, - "autoload": { - "psr-0": { - "Mockery": "library/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Pádraic Brady", - "email": "padraic.brady@gmail.com", - "homepage": "http://blog.astrumfutura.com" - }, - { - "name": "Dave Marshall", - "email": "dave.marshall@atstsolutions.co.uk", - "homepage": "http://davedevelopment.co.uk" - } - ], - "description": "Mockery is a simple yet flexible PHP mock object framework for use in unit testing with PHPUnit, PHPSpec or any other testing framework. Its core goal is to offer a test double framework with a succint API capable of clearly defining all possible object operations and interactions using a human readable Domain Specific Language (DSL). Designed as a drop in alternative to PHPUnit's phpunit-mock-objects library, Mockery is easy to integrate with PHPUnit and can operate alongside phpunit-mock-objects without the World ending.", - "homepage": "http://github.com/padraic/mockery", - "keywords": [ - "BDD", - "TDD", - "library", - "mock", - "mock objects", - "mockery", - "stub", - "test", - "test double", - "testing" - ], - "time": "2014-12-22 10:06:19" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d68dbdc53dc358a816f00b300704702b2eaff7b8", - "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.0" - }, - "suggest": { - "dflydev/markdown": "~1.0", - "erusev/parsedown": "~1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-0": { - "phpDocumentor": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "mike.vanriel@naenius.com" - } - ], - "time": "2015-02-03 12:10:50" - }, - { - "name": "phpspec/php-diff", - "version": "v1.0.2", - "source": { - "type": "git", - "url": "https://github.com/phpspec/php-diff.git", - "reference": "30e103d19519fe678ae64a60d77884ef3d71b28a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/php-diff/zipball/30e103d19519fe678ae64a60d77884ef3d71b28a", - "reference": "30e103d19519fe678ae64a60d77884ef3d71b28a", - "shasum": "" - }, - "type": "library", - "autoload": { - "psr-0": { - "Diff": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Chris Boulton", - "homepage": "http://github.com/chrisboulton", - "role": "Original developer" - } - ], - "description": "A comprehensive library for generating differences between two hashable objects (strings or arrays).", - "time": "2013-11-01 13:02:21" - }, - { - "name": "phpspec/phpspec", - "version": "2.1.1", - "source": { - "type": "git", - "url": "https://github.com/phpspec/phpspec.git", - "reference": "66a1df93099282b1514e9e001fcf6e9393f7783d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/phpspec/zipball/66a1df93099282b1514e9e001fcf6e9393f7783d", - "reference": "66a1df93099282b1514e9e001fcf6e9393f7783d", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "~1.0,>=1.0.1", - "php": ">=5.3.3", - "phpspec/php-diff": "~1.0.0", - "phpspec/prophecy": "~1.1", - "sebastian/exporter": "~1.0", - "symfony/console": "~2.3", - "symfony/event-dispatcher": "~2.1", - "symfony/finder": "~2.1", - "symfony/process": "~2.1", - "symfony/yaml": "~2.1" - }, - "require-dev": { - "behat/behat": "~3.0,>=3.0.11", - "bossa/phpspec2-expect": "~1.0", - "symfony/filesystem": "~2.1" - }, - "suggest": { - "phpspec/nyan-formatters": "~1.0 – Adds Nyan formatters" - }, - "bin": [ - "bin/phpspec" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.1.x-dev" - } - }, - "autoload": { - "psr-0": { - "PhpSpec": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "homepage": "http://marcelloduarte.net/" - } - ], - "description": "Specification-oriented BDD framework for PHP 5.3+", - "homepage": "http://phpspec.net/", - "keywords": [ - "BDD", - "SpecBDD", - "TDD", - "spec", - "specification", - "testing", - "tests" - ], - "time": "2015-01-09 13:21:45" - }, - { - "name": "phpspec/prophecy", - "version": "v1.3.1", - "source": { - "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "9ca52329bcdd1500de24427542577ebf3fc2f1c9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/9ca52329bcdd1500de24427542577ebf3fc2f1c9", - "reference": "9ca52329bcdd1500de24427542577ebf3fc2f1c9", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "~1.0,>=1.0.2", - "phpdocumentor/reflection-docblock": "~2.0" - }, - "require-dev": { - "phpspec/phpspec": "~2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "psr-0": { - "Prophecy\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "http://phpspec.org", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" - ], - "time": "2014-11-17 16:23:49" - }, - { - "name": "phpunit/php-code-coverage", - "version": "2.0.15", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "34cc484af1ca149188d0d9e91412191e398e0b67" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/34cc484af1ca149188d0d9e91412191e398e0b67", - "reference": "34cc484af1ca149188d0d9e91412191e398e0b67", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "phpunit/php-file-iterator": "~1.3", - "phpunit/php-text-template": "~1.2", - "phpunit/php-token-stream": "~1.3", - "sebastian/environment": "~1.0", - "sebastian/version": "~1.0" - }, - "require-dev": { - "ext-xdebug": ">=2.1.4", - "phpunit/phpunit": "~4" - }, - "suggest": { - "ext-dom": "*", - "ext-xdebug": ">=2.2.1", - "ext-xmlwriter": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "time": "2015-01-24 10:06:35" - }, - { - "name": "phpunit/php-file-iterator", - "version": "1.3.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "acd690379117b042d1c8af1fafd61bde001bf6bb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/acd690379117b042d1c8af1fafd61bde001bf6bb", - "reference": "acd690379117b042d1c8af1fafd61bde001bf6bb", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "autoload": { - "classmap": [ - "File/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "include-path": [ - "" - ], - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], - "time": "2013-10-10 15:34:57" - }, - { - "name": "phpunit/php-text-template", - "version": "1.2.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/206dfefc0ffe9cebf65c413e3d0e809c82fbf00a", - "reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "autoload": { - "classmap": [ - "Text/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "include-path": [ - "" - ], - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ], - "time": "2014-01-30 17:20:04" - }, - { - "name": "phpunit/php-timer", - "version": "1.0.5", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/19689d4354b295ee3d8c54b4f42c3efb69cbc17c", - "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "autoload": { - "classmap": [ - "PHP/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "include-path": [ - "" - ], - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], - "time": "2013-08-02 07:42:54" - }, - { - "name": "phpunit/php-token-stream", - "version": "1.4.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "db32c18eba00b121c145575fcbcd4d4d24e6db74" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/db32c18eba00b121c145575fcbcd4d4d24e6db74", - "reference": "db32c18eba00b121c145575fcbcd4d4d24e6db74", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Wrapper around PHP's tokenizer extension.", - "homepage": "https://github.com/sebastianbergmann/php-token-stream/", - "keywords": [ - "tokenizer" - ], - "time": "2015-01-17 09:51:32" - }, - { - "name": "phpunit/phpunit", - "version": "4.0.20", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "de121ce8708b7ac7f628603d7682d0d57f528345" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/de121ce8708b7ac7f628603d7682d0d57f528345", - "reference": "de121ce8708b7ac7f628603d7682d0d57f528345", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-json": "*", - "ext-pcre": "*", - "ext-reflection": "*", - "ext-spl": "*", - "php": ">=5.3.3", - "phpunit/php-code-coverage": ">=2.0.0,<2.1.0", - "phpunit/php-file-iterator": "~1.3.1", - "phpunit/php-text-template": "~1.2", - "phpunit/php-timer": "~1.0.2", - "phpunit/phpunit-mock-objects": ">=2.0.0,<2.1.0", - "sebastian/diff": "~1.1", - "sebastian/environment": "~1.0", - "sebastian/exporter": "~1.0.1", - "sebastian/version": "~1.0.3", - "symfony/yaml": "~2.0" - }, - "suggest": { - "phpunit/php-invoker": "~1.1" - }, - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "include-path": [ - "", - "../../symfony/yaml/" - ], - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "The PHP Unit Testing framework.", - "homepage": "http://www.phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], - "time": "2014-05-02 07:19:37" - }, - { - "name": "phpunit/phpunit-mock-objects", - "version": "2.0.10", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", - "reference": "e60bb929c50ae4237aaf680a4f6773f4ee17f0a2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/e60bb929c50ae4237aaf680a4f6773f4ee17f0a2", - "reference": "e60bb929c50ae4237aaf680a4f6773f4ee17f0a2", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "phpunit/php-text-template": "~1.2" - }, - "require-dev": { - "phpunit/phpunit": ">=4.0.0,<4.1.0" - }, - "suggest": { - "ext-soap": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "include-path": [ - "" - ], - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "Mock Object library for PHPUnit", - "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", - "keywords": [ - "mock", - "xunit" - ], - "time": "2014-06-12 07:19:48" - }, - { - "name": "sebastian/diff", - "version": "1.2.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "5843509fed39dee4b356a306401e9dd1a931fec7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/5843509fed39dee4b356a306401e9dd1a931fec7", - "reference": "5843509fed39dee4b356a306401e9dd1a931fec7", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Diff implementation", - "homepage": "http://www.github.com/sebastianbergmann/diff", - "keywords": [ - "diff" - ], - "time": "2014-08-15 10:29:00" - }, - { - "name": "sebastian/environment", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "6e6c71d918088c251b181ba8b3088af4ac336dd7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6e6c71d918088c251b181ba8b3088af4ac336dd7", - "reference": "6e6c71d918088c251b181ba8b3088af4ac336dd7", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], - "time": "2014-10-25 08:00:45" - }, - { - "name": "sebastian/exporter", - "version": "1.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "c7d59948d6e82818e1bdff7cadb6c34710eb7dc0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/c7d59948d6e82818e1bdff7cadb6c34710eb7dc0", - "reference": "c7d59948d6e82818e1bdff7cadb6c34710eb7dc0", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ], - "time": "2014-09-10 00:51:36" - }, - { - "name": "sebastian/version", - "version": "1.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "a77d9123f8e809db3fbdea15038c27a95da4058b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/a77d9123f8e809db3fbdea15038c27a95da4058b", - "reference": "a77d9123f8e809db3fbdea15038c27a95da4058b", - "shasum": "" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "time": "2014-12-15 14:25:24" - }, - { - "name": "symfony/class-loader", - "version": "v2.6.4", - "target-dir": "Symfony/Component/ClassLoader", - "source": { - "type": "git", - "url": "https://github.com/symfony/ClassLoader.git", - "reference": "deac802f76910708ab50d039806cfd1866895b52" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/ClassLoader/zipball/deac802f76910708ab50d039806cfd1866895b52", - "reference": "deac802f76910708ab50d039806cfd1866895b52", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "symfony/finder": "~2.0,>=2.0.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.6-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\ClassLoader\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "Symfony ClassLoader Component", - "homepage": "http://symfony.com", - "time": "2015-01-05 14:28:40" - }, - { - "name": "symfony/yaml", - "version": "v2.6.4", - "target-dir": "Symfony/Component/Yaml", - "source": { - "type": "git", - "url": "https://github.com/symfony/Yaml.git", - "reference": "60ed7751671113cf1ee7d7778e691642c2e9acd8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Yaml/zipball/60ed7751671113cf1ee7d7778e691642c2e9acd8", - "reference": "60ed7751671113cf1ee7d7778e691642c2e9acd8", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.6-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\Yaml\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "Symfony Yaml Component", - "homepage": "http://symfony.com", - "time": "2015-01-25 04:39:26" - }, - { - "name": "way/generators", - "version": "2.6.1", - "source": { - "type": "git", - "url": "https://github.com/JeffreyWay/Laravel-4-Generators.git", - "reference": "484d379c6bc1d38c75e4f52f74efcbcd11f7dd2c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/JeffreyWay/Laravel-4-Generators/zipball/484d379c6bc1d38c75e4f52f74efcbcd11f7dd2c", - "reference": "484d379c6bc1d38c75e4f52f74efcbcd11f7dd2c", - "shasum": "" - }, - "require": { - "illuminate/support": "~4.0", - "php": ">=5.4.0" - }, - "require-dev": { - "behat/behat": "~2.5.1", - "behat/mink": "~1.5.0", - "behat/mink-extension": "~1.2.0", - "behat/mink-goutte-driver": "~1.0.9", - "behat/mink-selenium2-driver": "~1.1.1", - "phpspec/phpspec": "~2.0", - "phpunit/phpunit": "~3.7" - }, - "type": "library", - "autoload": { - "psr-0": { - "Way\\Generators": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jeffrey Way", - "email": "jeffrey@jeffrey-way.com", - "homepage": "http://jeffrye-way.com", - "role": "Developer" - } - ], - "description": "Rapidly generate resources, migrations, models, and much more.", - "time": "2014-05-27 14:21:26" - } - ], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": { - "willdurand/negotiation": 0 - }, - "prefer-stable": false, - "prefer-lowest": false, - "platform": [], - "platform-dev": [] -} diff --git a/package.json b/package.json deleted file mode 100644 index 5a5e426f..00000000 --- a/package.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "hyperRail", - "dependencies": { - "bower": "*", - "grunt": "*", - "grunt-cli": "*", - "glob": "*", - "irail-stations": "*" - }, - "scripts" : { - "update-stations" : "irail-stations > app/stations.json" - }, - "devDependencies": { - "grunt-contrib-concat": "*", - "grunt-contrib-jshint": "*", - "grunt-contrib-uglify": "*", - "grunt-contrib-watch": "*", - "grunt-contrib-cssmin": "*", - "grunt-contrib-sass": "*", - "grunt-autoprefixer": "*", - "grunt-contrib-compass": "~0.9.0", - "grunt-contrib-copy": "*", - "jit-grunt": "*" - } -} diff --git a/phpunit.xml b/phpunit.xml deleted file mode 100644 index c42dc4f7..00000000 --- a/phpunit.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - ./app/tests/ - - - \ No newline at end of file diff --git a/public/.htaccess b/public/.htaccess deleted file mode 100644 index 09472ae7..00000000 --- a/public/.htaccess +++ /dev/null @@ -1,16 +0,0 @@ -AddType text/cache-manifest .appcache - - - Options -MultiViews - - - RewriteEngine On - - # Redirect Trailing Slashes... - RewriteRule ^(.*)/$ /$1 [L,R=301] - - # Handle Front Controller... - RewriteCond %{REQUEST_FILENAME} !-d - RewriteCond %{REQUEST_FILENAME} !-f - RewriteRule ^ index.php [L] - diff --git a/public/app/css/style.css b/public/app/css/style.css deleted file mode 100644 index fc862458..00000000 --- a/public/app/css/style.css +++ /dev/null @@ -1,5416 +0,0 @@ -/*! normalize.css v3.0.1 | MIT License | git.io/normalize */ -html { - font-family: sans-serif; - -ms-text-size-adjust: 100%; - -webkit-text-size-adjust: 100%; } - -body { - margin: 0; } - -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -main, -nav, -section, -summary { - display: block; } - -audio, -canvas, -progress, -video { - display: inline-block; - vertical-align: baseline; } - -audio:not([controls]) { - display: none; - height: 0; } - -[hidden], -template { - display: none; } - -a { - background: transparent; } - -a:active, -a:hover { - outline: 0; } - -abbr[title] { - border-bottom: 1px dotted; } - -b, -strong { - font-weight: bold; } - -dfn { - font-style: italic; } - -h1 { - font-size: 2em; - margin: 0.67em 0; } - -mark { - background: #ff0; - color: #000; } - -small { - font-size: 80%; } - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; } - -sup { - top: -0.5em; } - -sub { - bottom: -0.25em; } - -img { - border: 0; } - -svg:not(:root) { - overflow: hidden; } - -figure { - margin: 1em 40px; } - -hr { - box-sizing: content-box; - height: 0; } - -pre { - overflow: auto; } - -code, -kbd, -pre, -samp { - font-family: monospace, monospace; - font-size: 1em; } - -button, -input, -optgroup, -select, -textarea { - color: inherit; - font: inherit; - margin: 0; } - -button { - overflow: visible; } - -button, -select { - text-transform: none; } - -button, -html input[type="button"], -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; - cursor: pointer; } - -button[disabled], -html input[disabled] { - cursor: default; } - -button::-moz-focus-inner, -input::-moz-focus-inner { - border: 0; - padding: 0; } - -input { - line-height: normal; } - -input[type="checkbox"], -input[type="radio"] { - box-sizing: border-box; - padding: 0; } - -input[type="number"]::-webkit-inner-spin-button, -input[type="number"]::-webkit-outer-spin-button { - height: auto; } - -input[type="search"] { - -webkit-appearance: textfield; - box-sizing: content-box; } - -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; } - -fieldset { - border: 1px solid #c0c0c0; - margin: 0 2px; - padding: 0.35em 0.625em 0.75em; } - -legend { - border: 0; - padding: 0; } - -textarea { - overflow: auto; } - -optgroup { - font-weight: bold; } - -table { - border-collapse: collapse; - border-spacing: 0; } - -td, -th { - padding: 0; } - -@media print { - * { - text-shadow: none !important; - color: #000 !important; - background: transparent !important; - box-shadow: none !important; } - - a, - a:visited { - text-decoration: underline; } - - a[href]:after { - content: " (" attr(href) ")"; } - - abbr[title]:after { - content: " (" attr(title) ")"; } - - a[href^="javascript:"]:after, - a[href^="#"]:after { - content: ""; } - - pre, - blockquote { - border: 1px solid #999; - page-break-inside: avoid; } - - thead { - display: table-header-group; } - - tr, - img { - page-break-inside: avoid; } - - img { - max-width: 100% !important; } - - p, - h2, - h3 { - orphans: 3; - widows: 3; } - - h2, - h3 { - page-break-after: avoid; } - - select { - background: #fff !important; } - - .navbar { - display: none; } - - .table td, - .table th { - background-color: #fff !important; } - - .btn > .caret, - .dropup > .btn > .caret { - border-top-color: #000 !important; } - - .label { - border: 1px solid #000; } - - .table { - border-collapse: collapse !important; } - - .table-bordered th, - .table-bordered td { - border: 1px solid #ddd !important; } } -@font-face { - font-family: 'Glyphicons Halflings'; - src: url("../fonts/glyphicons-halflings-regular.eot"); - src: url("../fonts/glyphicons-halflings-regular.eot?#iefix") format("embedded-opentype"), url("../fonts/glyphicons-halflings-regular.woff") format("woff"), url("../fonts/glyphicons-halflings-regular.ttf") format("truetype"), url("../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular") format("svg"); } -.glyphicon { - position: relative; - top: 1px; - display: inline-block; - font-family: 'Glyphicons Halflings'; - font-style: normal; - font-weight: normal; - line-height: 1; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; } - -.glyphicon-asterisk:before { - content: "\2a"; } - -.glyphicon-plus:before { - content: "\2b"; } - -.glyphicon-euro:before { - content: "\20ac"; } - -.glyphicon-minus:before { - content: "\2212"; } - -.glyphicon-cloud:before { - content: "\2601"; } - -.glyphicon-envelope:before { - content: "\2709"; } - -.glyphicon-pencil:before { - content: "\270f"; } - -.glyphicon-glass:before { - content: "\e001"; } - -.glyphicon-music:before { - content: "\e002"; } - -.glyphicon-search:before { - content: "\e003"; } - -.glyphicon-heart:before { - content: "\e005"; } - -.glyphicon-star:before { - content: "\e006"; } - -.glyphicon-star-empty:before { - content: "\e007"; } - -.glyphicon-user:before { - content: "\e008"; } - -.glyphicon-film:before { - content: "\e009"; } - -.glyphicon-th-large:before { - content: "\e010"; } - -.glyphicon-th:before { - content: "\e011"; } - -.glyphicon-th-list:before { - content: "\e012"; } - -.glyphicon-ok:before { - content: "\e013"; } - -.glyphicon-remove:before { - content: "\e014"; } - -.glyphicon-zoom-in:before { - content: "\e015"; } - -.glyphicon-zoom-out:before { - content: "\e016"; } - -.glyphicon-off:before { - content: "\e017"; } - -.glyphicon-signal:before { - content: "\e018"; } - -.glyphicon-cog:before { - content: "\e019"; } - -.glyphicon-trash:before { - content: "\e020"; } - -.glyphicon-home:before { - content: "\e021"; } - -.glyphicon-file:before { - content: "\e022"; } - -.glyphicon-time:before { - content: "\e023"; } - -.glyphicon-road:before { - content: "\e024"; } - -.glyphicon-download-alt:before { - content: "\e025"; } - -.glyphicon-download:before { - content: "\e026"; } - -.glyphicon-upload:before { - content: "\e027"; } - -.glyphicon-inbox:before { - content: "\e028"; } - -.glyphicon-play-circle:before { - content: "\e029"; } - -.glyphicon-repeat:before { - content: "\e030"; } - -.glyphicon-refresh:before { - content: "\e031"; } - -.glyphicon-list-alt:before { - content: "\e032"; } - -.glyphicon-lock:before { - content: "\e033"; } - -.glyphicon-flag:before { - content: "\e034"; } - -.glyphicon-headphones:before { - content: "\e035"; } - -.glyphicon-volume-off:before { - content: "\e036"; } - -.glyphicon-volume-down:before { - content: "\e037"; } - -.glyphicon-volume-up:before { - content: "\e038"; } - -.glyphicon-qrcode:before { - content: "\e039"; } - -.glyphicon-barcode:before { - content: "\e040"; } - -.glyphicon-tag:before { - content: "\e041"; } - -.glyphicon-tags:before { - content: "\e042"; } - -.glyphicon-book:before { - content: "\e043"; } - -.glyphicon-bookmark:before { - content: "\e044"; } - -.glyphicon-print:before { - content: "\e045"; } - -.glyphicon-camera:before { - content: "\e046"; } - -.glyphicon-font:before { - content: "\e047"; } - -.glyphicon-bold:before { - content: "\e048"; } - -.glyphicon-italic:before { - content: "\e049"; } - -.glyphicon-text-height:before { - content: "\e050"; } - -.glyphicon-text-width:before { - content: "\e051"; } - -.glyphicon-align-left:before { - content: "\e052"; } - -.glyphicon-align-center:before { - content: "\e053"; } - -.glyphicon-align-right:before { - content: "\e054"; } - -.glyphicon-align-justify:before { - content: "\e055"; } - -.glyphicon-list:before { - content: "\e056"; } - -.glyphicon-indent-left:before { - content: "\e057"; } - -.glyphicon-indent-right:before { - content: "\e058"; } - -.glyphicon-facetime-video:before { - content: "\e059"; } - -.glyphicon-picture:before { - content: "\e060"; } - -.glyphicon-map-marker:before { - content: "\e062"; } - -.glyphicon-adjust:before { - content: "\e063"; } - -.glyphicon-tint:before { - content: "\e064"; } - -.glyphicon-edit:before { - content: "\e065"; } - -.glyphicon-share:before { - content: "\e066"; } - -.glyphicon-check:before { - content: "\e067"; } - -.glyphicon-move:before { - content: "\e068"; } - -.glyphicon-step-backward:before { - content: "\e069"; } - -.glyphicon-fast-backward:before { - content: "\e070"; } - -.glyphicon-backward:before { - content: "\e071"; } - -.glyphicon-play:before { - content: "\e072"; } - -.glyphicon-pause:before { - content: "\e073"; } - -.glyphicon-stop:before { - content: "\e074"; } - -.glyphicon-forward:before { - content: "\e075"; } - -.glyphicon-fast-forward:before { - content: "\e076"; } - -.glyphicon-step-forward:before { - content: "\e077"; } - -.glyphicon-eject:before { - content: "\e078"; } - -.glyphicon-chevron-left:before { - content: "\e079"; } - -.glyphicon-chevron-right:before { - content: "\e080"; } - -.glyphicon-plus-sign:before { - content: "\e081"; } - -.glyphicon-minus-sign:before { - content: "\e082"; } - -.glyphicon-remove-sign:before { - content: "\e083"; } - -.glyphicon-ok-sign:before { - content: "\e084"; } - -.glyphicon-question-sign:before { - content: "\e085"; } - -.glyphicon-info-sign:before { - content: "\e086"; } - -.glyphicon-screenshot:before { - content: "\e087"; } - -.glyphicon-remove-circle:before { - content: "\e088"; } - -.glyphicon-ok-circle:before { - content: "\e089"; } - -.glyphicon-ban-circle:before { - content: "\e090"; } - -.glyphicon-arrow-left:before { - content: "\e091"; } - -.glyphicon-arrow-right:before { - content: "\e092"; } - -.glyphicon-arrow-up:before { - content: "\e093"; } - -.glyphicon-arrow-down:before { - content: "\e094"; } - -.glyphicon-share-alt:before { - content: "\e095"; } - -.glyphicon-resize-full:before { - content: "\e096"; } - -.glyphicon-resize-small:before { - content: "\e097"; } - -.glyphicon-exclamation-sign:before { - content: "\e101"; } - -.glyphicon-gift:before { - content: "\e102"; } - -.glyphicon-leaf:before { - content: "\e103"; } - -.glyphicon-fire:before { - content: "\e104"; } - -.glyphicon-eye-open:before { - content: "\e105"; } - -.glyphicon-eye-close:before { - content: "\e106"; } - -.glyphicon-warning-sign:before { - content: "\e107"; } - -.glyphicon-plane:before { - content: "\e108"; } - -.glyphicon-calendar:before { - content: "\e109"; } - -.glyphicon-random:before { - content: "\e110"; } - -.glyphicon-comment:before { - content: "\e111"; } - -.glyphicon-magnet:before { - content: "\e112"; } - -.glyphicon-chevron-up:before { - content: "\e113"; } - -.glyphicon-chevron-down:before { - content: "\e114"; } - -.glyphicon-retweet:before { - content: "\e115"; } - -.glyphicon-shopping-cart:before { - content: "\e116"; } - -.glyphicon-folder-close:before { - content: "\e117"; } - -.glyphicon-folder-open:before { - content: "\e118"; } - -.glyphicon-resize-vertical:before { - content: "\e119"; } - -.glyphicon-resize-horizontal:before { - content: "\e120"; } - -.glyphicon-hdd:before { - content: "\e121"; } - -.glyphicon-bullhorn:before { - content: "\e122"; } - -.glyphicon-bell:before { - content: "\e123"; } - -.glyphicon-certificate:before { - content: "\e124"; } - -.glyphicon-thumbs-up:before { - content: "\e125"; } - -.glyphicon-thumbs-down:before { - content: "\e126"; } - -.glyphicon-hand-right:before { - content: "\e127"; } - -.glyphicon-hand-left:before { - content: "\e128"; } - -.glyphicon-hand-up:before { - content: "\e129"; } - -.glyphicon-hand-down:before { - content: "\e130"; } - -.glyphicon-circle-arrow-right:before { - content: "\e131"; } - -.glyphicon-circle-arrow-left:before { - content: "\e132"; } - -.glyphicon-circle-arrow-up:before { - content: "\e133"; } - -.glyphicon-circle-arrow-down:before { - content: "\e134"; } - -.glyphicon-globe:before { - content: "\e135"; } - -.glyphicon-wrench:before { - content: "\e136"; } - -.glyphicon-tasks:before { - content: "\e137"; } - -.glyphicon-filter:before { - content: "\e138"; } - -.glyphicon-briefcase:before { - content: "\e139"; } - -.glyphicon-fullscreen:before { - content: "\e140"; } - -.glyphicon-dashboard:before { - content: "\e141"; } - -.glyphicon-paperclip:before { - content: "\e142"; } - -.glyphicon-heart-empty:before { - content: "\e143"; } - -.glyphicon-link:before { - content: "\e144"; } - -.glyphicon-phone:before { - content: "\e145"; } - -.glyphicon-pushpin:before { - content: "\e146"; } - -.glyphicon-usd:before { - content: "\e148"; } - -.glyphicon-gbp:before { - content: "\e149"; } - -.glyphicon-sort:before { - content: "\e150"; } - -.glyphicon-sort-by-alphabet:before { - content: "\e151"; } - -.glyphicon-sort-by-alphabet-alt:before { - content: "\e152"; } - -.glyphicon-sort-by-order:before { - content: "\e153"; } - -.glyphicon-sort-by-order-alt:before { - content: "\e154"; } - -.glyphicon-sort-by-attributes:before { - content: "\e155"; } - -.glyphicon-sort-by-attributes-alt:before { - content: "\e156"; } - -.glyphicon-unchecked:before { - content: "\e157"; } - -.glyphicon-expand:before { - content: "\e158"; } - -.glyphicon-collapse-down:before { - content: "\e159"; } - -.glyphicon-collapse-up:before { - content: "\e160"; } - -.glyphicon-log-in:before { - content: "\e161"; } - -.glyphicon-flash:before { - content: "\e162"; } - -.glyphicon-log-out:before { - content: "\e163"; } - -.glyphicon-new-window:before { - content: "\e164"; } - -.glyphicon-record:before { - content: "\e165"; } - -.glyphicon-save:before { - content: "\e166"; } - -.glyphicon-open:before { - content: "\e167"; } - -.glyphicon-saved:before { - content: "\e168"; } - -.glyphicon-import:before { - content: "\e169"; } - -.glyphicon-export:before { - content: "\e170"; } - -.glyphicon-send:before { - content: "\e171"; } - -.glyphicon-floppy-disk:before { - content: "\e172"; } - -.glyphicon-floppy-saved:before { - content: "\e173"; } - -.glyphicon-floppy-remove:before { - content: "\e174"; } - -.glyphicon-floppy-save:before { - content: "\e175"; } - -.glyphicon-floppy-open:before { - content: "\e176"; } - -.glyphicon-credit-card:before { - content: "\e177"; } - -.glyphicon-transfer:before { - content: "\e178"; } - -.glyphicon-cutlery:before { - content: "\e179"; } - -.glyphicon-header:before { - content: "\e180"; } - -.glyphicon-compressed:before { - content: "\e181"; } - -.glyphicon-earphone:before { - content: "\e182"; } - -.glyphicon-phone-alt:before { - content: "\e183"; } - -.glyphicon-tower:before { - content: "\e184"; } - -.glyphicon-stats:before { - content: "\e185"; } - -.glyphicon-sd-video:before { - content: "\e186"; } - -.glyphicon-hd-video:before { - content: "\e187"; } - -.glyphicon-subtitles:before { - content: "\e188"; } - -.glyphicon-sound-stereo:before { - content: "\e189"; } - -.glyphicon-sound-dolby:before { - content: "\e190"; } - -.glyphicon-sound-5-1:before { - content: "\e191"; } - -.glyphicon-sound-6-1:before { - content: "\e192"; } - -.glyphicon-sound-7-1:before { - content: "\e193"; } - -.glyphicon-copyright-mark:before { - content: "\e194"; } - -.glyphicon-registration-mark:before { - content: "\e195"; } - -.glyphicon-cloud-download:before { - content: "\e197"; } - -.glyphicon-cloud-upload:before { - content: "\e198"; } - -.glyphicon-tree-conifer:before { - content: "\e199"; } - -.glyphicon-tree-deciduous:before { - content: "\e200"; } - -* { - box-sizing: border-box; } - -*:before, -*:after { - box-sizing: border-box; } - -html { - font-size: 10px; - -webkit-tap-highlight-color: transparent; } - -body { - font-family: "Source Sans Pro", "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 1.42857; - color: #333333; - background-color: white; } - -input, -button, -select, -textarea { - font-family: inherit; - font-size: inherit; - line-height: inherit; } - -a { - color: #c72929; - text-decoration: none; } - a:hover, a:focus { - color: #881c1c; - text-decoration: underline; } - a:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; } - -figure { - margin: 0; } - -img { - vertical-align: middle; } - -.img-responsive { - display: block; - width: 100% \9; - max-width: 100%; - height: auto; } - -.img-rounded { - border-radius: 6px; } - -.img-thumbnail { - padding: 4px; - line-height: 1.42857; - background-color: white; - border: 1px solid #dddddd; - border-radius: 4px; - -webkit-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; - display: inline-block; - width: 100% \9; - max-width: 100%; - height: auto; } - -.img-circle { - border-radius: 50%; } - -hr { - margin-top: 20px; - margin-bottom: 20px; - border: 0; - border-top: 1px solid #eeeeee; } - -.sr-only { - position: absolute; - width: 1px; - height: 1px; - margin: -1px; - padding: 0; - overflow: hidden; - clip: rect(0, 0, 0, 0); - border: 0; } - -.sr-only-focusable:active, .sr-only-focusable:focus { - position: static; - width: auto; - height: auto; - margin: 0; - overflow: visible; - clip: auto; } - -h1, h2, h3, h4, h5, h6, -.h1, .h2, .h3, .h4, .h5, .h6 { - font-family: "Source Sans Pro", "Helvetica Neue", Helvetica, Arial, sans-serif; - font-weight: 500; - line-height: 1.1; - color: inherit; } - h1 small, - h1 .small, h2 small, - h2 .small, h3 small, - h3 .small, h4 small, - h4 .small, h5 small, - h5 .small, h6 small, - h6 .small, - .h1 small, - .h1 .small, .h2 small, - .h2 .small, .h3 small, - .h3 .small, .h4 small, - .h4 .small, .h5 small, - .h5 .small, .h6 small, - .h6 .small { - font-weight: normal; - line-height: 1; - color: #999999; } - -h1, .h1, -h2, .h2, -h3, .h3 { - margin-top: 20px; - margin-bottom: 10px; } - h1 small, - h1 .small, .h1 small, - .h1 .small, - h2 small, - h2 .small, .h2 small, - .h2 .small, - h3 small, - h3 .small, .h3 small, - .h3 .small { - font-size: 65%; } - -h4, .h4, -h5, .h5, -h6, .h6 { - margin-top: 10px; - margin-bottom: 10px; } - h4 small, - h4 .small, .h4 small, - .h4 .small, - h5 small, - h5 .small, .h5 small, - .h5 .small, - h6 small, - h6 .small, .h6 small, - .h6 .small { - font-size: 75%; } - -h1, .h1 { - font-size: 36px; } - -h2, .h2 { - font-size: 30px; } - -h3, .h3 { - font-size: 24px; } - -h4, .h4 { - font-size: 18px; } - -h5, .h5 { - font-size: 14px; } - -h6, .h6 { - font-size: 12px; } - -p { - margin: 0 0 10px; } - -.lead { - margin-bottom: 20px; - font-size: 16px; - font-weight: 300; - line-height: 1.4; } - @media (min-width: 768px) { - .lead { - font-size: 21px; } } - -small, -.small { - font-size: 85%; } - -cite { - font-style: normal; } - -mark, -.mark { - background-color: #fcf8e3; - padding: .2em; } - -.text-left { - text-align: left; } - -.text-right { - text-align: right; } - -.text-center { - text-align: center; } - -.text-justify { - text-align: justify; } - -.text-nowrap { - white-space: nowrap; } - -.text-lowercase { - text-transform: lowercase; } - -.text-uppercase { - text-transform: uppercase; } - -.text-capitalize { - text-transform: capitalize; } - -.text-muted { - color: #999999; } - -.text-primary { - color: #c72929; } - -a.text-primary:hover { - color: #9d2020; } - -.text-success { - color: #468847; } - -a.text-success:hover { - color: #356635; } - -.text-info { - color: #3a87ad; } - -a.text-info:hover { - color: #2d6987; } - -.text-warning { - color: #c09853; } - -a.text-warning:hover { - color: #a47e3c; } - -.text-danger { - color: #b94a48; } - -a.text-danger:hover { - color: #953b39; } - -.bg-primary { - color: #fff; } - -.bg-primary { - background-color: #c72929; } - -a.bg-primary:hover { - background-color: #9d2020; } - -.bg-success { - background-color: #dff0d8; } - -a.bg-success:hover { - background-color: #c1e2b3; } - -.bg-info { - background-color: #d9edf7; } - -a.bg-info:hover { - background-color: #afd9ee; } - -.bg-warning { - background-color: #fcf8e3; } - -a.bg-warning:hover { - background-color: #f7ecb5; } - -.bg-danger { - background-color: #f2dede; } - -a.bg-danger:hover { - background-color: #e4b9b9; } - -.page-header { - padding-bottom: 9px; - margin: 40px 0 20px; - border-bottom: 1px solid #eeeeee; } - -ul, -ol { - margin-top: 0; - margin-bottom: 10px; } - ul ul, - ul ol, - ol ul, - ol ol { - margin-bottom: 0; } - -.list-unstyled, .list-inline { - padding-left: 0; - list-style: none; } - -.list-inline { - margin-left: -5px; } - .list-inline > li { - display: inline-block; - padding-left: 5px; - padding-right: 5px; } - -dl { - margin-top: 0; - margin-bottom: 20px; } - -dt, -dd { - line-height: 1.42857; } - -dt { - font-weight: bold; } - -dd { - margin-left: 0; } - -.dl-horizontal dd:before, .dl-horizontal dd:after { - content: " "; - display: table; } -.dl-horizontal dd:after { - clear: both; } -@media (min-width: 768px) { - .dl-horizontal dt { - float: left; - width: 160px; - clear: left; - text-align: right; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; } - .dl-horizontal dd { - margin-left: 180px; } } - -abbr[title], -abbr[data-original-title] { - cursor: help; - border-bottom: 1px dotted #999999; } - -.initialism { - font-size: 90%; - text-transform: uppercase; } - -blockquote { - padding: 10px 20px; - margin: 0 0 20px; - font-size: 17.5px; - border-left: 5px solid #eeeeee; } - blockquote p:last-child, - blockquote ul:last-child, - blockquote ol:last-child { - margin-bottom: 0; } - blockquote footer, - blockquote small, - blockquote .small { - display: block; - font-size: 80%; - line-height: 1.42857; - color: #999999; } - blockquote footer:before, - blockquote small:before, - blockquote .small:before { - content: '\2014 \00A0'; } - -.blockquote-reverse, -blockquote.pull-right { - padding-right: 15px; - padding-left: 0; - border-right: 5px solid #eeeeee; - border-left: 0; - text-align: right; } - .blockquote-reverse footer:before, - .blockquote-reverse small:before, - .blockquote-reverse .small:before, - blockquote.pull-right footer:before, - blockquote.pull-right small:before, - blockquote.pull-right .small:before { - content: ''; } - .blockquote-reverse footer:after, - .blockquote-reverse small:after, - .blockquote-reverse .small:after, - blockquote.pull-right footer:after, - blockquote.pull-right small:after, - blockquote.pull-right .small:after { - content: '\00A0 \2014'; } - -blockquote:before, -blockquote:after { - content: ""; } - -address { - margin-bottom: 20px; - font-style: normal; - line-height: 1.42857; } - -code, -kbd, -pre, -samp { - font-family: Monaco, Menlo, Consolas, "Courier New", monospace; } - -code { - padding: 2px 4px; - font-size: 90%; - color: #c7254e; - background-color: #f9f2f4; - border-radius: 4px; } - -kbd { - padding: 2px 4px; - font-size: 90%; - color: white; - background-color: #333333; - border-radius: 3px; - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); } - kbd kbd { - padding: 0; - font-size: 100%; - box-shadow: none; } - -pre { - display: block; - padding: 9.5px; - margin: 0 0 10px; - font-size: 13px; - line-height: 1.42857; - word-break: break-all; - word-wrap: break-word; - color: #333333; - background-color: whitesmoke; - border: 1px solid #cccccc; - border-radius: 4px; } - pre code { - padding: 0; - font-size: inherit; - color: inherit; - white-space: pre-wrap; - background-color: transparent; - border-radius: 0; } - -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; } - -.container { - margin-right: auto; - margin-left: auto; - padding-left: 15px; - padding-right: 15px; } - .container:before, .container:after { - content: " "; - display: table; } - .container:after { - clear: both; } - @media (min-width: 768px) { - .container { - width: 750px; } } - @media (min-width: 992px) { - .container { - width: 970px; } } - @media (min-width: 1200px) { - .container { - width: 1170px; } } - -.container-fluid { - margin-right: auto; - margin-left: auto; - padding-left: 15px; - padding-right: 15px; } - .container-fluid:before, .container-fluid:after { - content: " "; - display: table; } - .container-fluid:after { - clear: both; } - -.row { - margin-left: -15px; - margin-right: -15px; } - .row:before, .row:after { - content: " "; - display: table; } - .row:after { - clear: both; } - -.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { - position: relative; - min-height: 1px; - padding-left: 15px; - padding-right: 15px; } - -.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { - float: left; } - -.col-xs-1 { - width: 8.33333%; } - -.col-xs-2 { - width: 16.66667%; } - -.col-xs-3 { - width: 25%; } - -.col-xs-4 { - width: 33.33333%; } - -.col-xs-5 { - width: 41.66667%; } - -.col-xs-6 { - width: 50%; } - -.col-xs-7 { - width: 58.33333%; } - -.col-xs-8 { - width: 66.66667%; } - -.col-xs-9 { - width: 75%; } - -.col-xs-10 { - width: 83.33333%; } - -.col-xs-11 { - width: 91.66667%; } - -.col-xs-12 { - width: 100%; } - -.col-xs-pull-0 { - right: auto; } - -.col-xs-pull-1 { - right: 8.33333%; } - -.col-xs-pull-2 { - right: 16.66667%; } - -.col-xs-pull-3 { - right: 25%; } - -.col-xs-pull-4 { - right: 33.33333%; } - -.col-xs-pull-5 { - right: 41.66667%; } - -.col-xs-pull-6 { - right: 50%; } - -.col-xs-pull-7 { - right: 58.33333%; } - -.col-xs-pull-8 { - right: 66.66667%; } - -.col-xs-pull-9 { - right: 75%; } - -.col-xs-pull-10 { - right: 83.33333%; } - -.col-xs-pull-11 { - right: 91.66667%; } - -.col-xs-pull-12 { - right: 100%; } - -.col-xs-push-0 { - left: auto; } - -.col-xs-push-1 { - left: 8.33333%; } - -.col-xs-push-2 { - left: 16.66667%; } - -.col-xs-push-3 { - left: 25%; } - -.col-xs-push-4 { - left: 33.33333%; } - -.col-xs-push-5 { - left: 41.66667%; } - -.col-xs-push-6 { - left: 50%; } - -.col-xs-push-7 { - left: 58.33333%; } - -.col-xs-push-8 { - left: 66.66667%; } - -.col-xs-push-9 { - left: 75%; } - -.col-xs-push-10 { - left: 83.33333%; } - -.col-xs-push-11 { - left: 91.66667%; } - -.col-xs-push-12 { - left: 100%; } - -.col-xs-offset-0 { - margin-left: 0%; } - -.col-xs-offset-1 { - margin-left: 8.33333%; } - -.col-xs-offset-2 { - margin-left: 16.66667%; } - -.col-xs-offset-3 { - margin-left: 25%; } - -.col-xs-offset-4 { - margin-left: 33.33333%; } - -.col-xs-offset-5 { - margin-left: 41.66667%; } - -.col-xs-offset-6 { - margin-left: 50%; } - -.col-xs-offset-7 { - margin-left: 58.33333%; } - -.col-xs-offset-8 { - margin-left: 66.66667%; } - -.col-xs-offset-9 { - margin-left: 75%; } - -.col-xs-offset-10 { - margin-left: 83.33333%; } - -.col-xs-offset-11 { - margin-left: 91.66667%; } - -.col-xs-offset-12 { - margin-left: 100%; } - -@media (min-width: 768px) { - .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { - float: left; } - - .col-sm-1 { - width: 8.33333%; } - - .col-sm-2 { - width: 16.66667%; } - - .col-sm-3 { - width: 25%; } - - .col-sm-4 { - width: 33.33333%; } - - .col-sm-5 { - width: 41.66667%; } - - .col-sm-6 { - width: 50%; } - - .col-sm-7 { - width: 58.33333%; } - - .col-sm-8 { - width: 66.66667%; } - - .col-sm-9 { - width: 75%; } - - .col-sm-10 { - width: 83.33333%; } - - .col-sm-11 { - width: 91.66667%; } - - .col-sm-12 { - width: 100%; } - - .col-sm-pull-0 { - right: auto; } - - .col-sm-pull-1 { - right: 8.33333%; } - - .col-sm-pull-2 { - right: 16.66667%; } - - .col-sm-pull-3 { - right: 25%; } - - .col-sm-pull-4 { - right: 33.33333%; } - - .col-sm-pull-5 { - right: 41.66667%; } - - .col-sm-pull-6 { - right: 50%; } - - .col-sm-pull-7 { - right: 58.33333%; } - - .col-sm-pull-8 { - right: 66.66667%; } - - .col-sm-pull-9 { - right: 75%; } - - .col-sm-pull-10 { - right: 83.33333%; } - - .col-sm-pull-11 { - right: 91.66667%; } - - .col-sm-pull-12 { - right: 100%; } - - .col-sm-push-0 { - left: auto; } - - .col-sm-push-1 { - left: 8.33333%; } - - .col-sm-push-2 { - left: 16.66667%; } - - .col-sm-push-3 { - left: 25%; } - - .col-sm-push-4 { - left: 33.33333%; } - - .col-sm-push-5 { - left: 41.66667%; } - - .col-sm-push-6 { - left: 50%; } - - .col-sm-push-7 { - left: 58.33333%; } - - .col-sm-push-8 { - left: 66.66667%; } - - .col-sm-push-9 { - left: 75%; } - - .col-sm-push-10 { - left: 83.33333%; } - - .col-sm-push-11 { - left: 91.66667%; } - - .col-sm-push-12 { - left: 100%; } - - .col-sm-offset-0 { - margin-left: 0%; } - - .col-sm-offset-1 { - margin-left: 8.33333%; } - - .col-sm-offset-2 { - margin-left: 16.66667%; } - - .col-sm-offset-3 { - margin-left: 25%; } - - .col-sm-offset-4 { - margin-left: 33.33333%; } - - .col-sm-offset-5 { - margin-left: 41.66667%; } - - .col-sm-offset-6 { - margin-left: 50%; } - - .col-sm-offset-7 { - margin-left: 58.33333%; } - - .col-sm-offset-8 { - margin-left: 66.66667%; } - - .col-sm-offset-9 { - margin-left: 75%; } - - .col-sm-offset-10 { - margin-left: 83.33333%; } - - .col-sm-offset-11 { - margin-left: 91.66667%; } - - .col-sm-offset-12 { - margin-left: 100%; } } -@media (min-width: 992px) { - .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { - float: left; } - - .col-md-1 { - width: 8.33333%; } - - .col-md-2 { - width: 16.66667%; } - - .col-md-3 { - width: 25%; } - - .col-md-4 { - width: 33.33333%; } - - .col-md-5 { - width: 41.66667%; } - - .col-md-6 { - width: 50%; } - - .col-md-7 { - width: 58.33333%; } - - .col-md-8 { - width: 66.66667%; } - - .col-md-9 { - width: 75%; } - - .col-md-10 { - width: 83.33333%; } - - .col-md-11 { - width: 91.66667%; } - - .col-md-12 { - width: 100%; } - - .col-md-pull-0 { - right: auto; } - - .col-md-pull-1 { - right: 8.33333%; } - - .col-md-pull-2 { - right: 16.66667%; } - - .col-md-pull-3 { - right: 25%; } - - .col-md-pull-4 { - right: 33.33333%; } - - .col-md-pull-5 { - right: 41.66667%; } - - .col-md-pull-6 { - right: 50%; } - - .col-md-pull-7 { - right: 58.33333%; } - - .col-md-pull-8 { - right: 66.66667%; } - - .col-md-pull-9 { - right: 75%; } - - .col-md-pull-10 { - right: 83.33333%; } - - .col-md-pull-11 { - right: 91.66667%; } - - .col-md-pull-12 { - right: 100%; } - - .col-md-push-0 { - left: auto; } - - .col-md-push-1 { - left: 8.33333%; } - - .col-md-push-2 { - left: 16.66667%; } - - .col-md-push-3 { - left: 25%; } - - .col-md-push-4 { - left: 33.33333%; } - - .col-md-push-5 { - left: 41.66667%; } - - .col-md-push-6 { - left: 50%; } - - .col-md-push-7 { - left: 58.33333%; } - - .col-md-push-8 { - left: 66.66667%; } - - .col-md-push-9 { - left: 75%; } - - .col-md-push-10 { - left: 83.33333%; } - - .col-md-push-11 { - left: 91.66667%; } - - .col-md-push-12 { - left: 100%; } - - .col-md-offset-0 { - margin-left: 0%; } - - .col-md-offset-1 { - margin-left: 8.33333%; } - - .col-md-offset-2 { - margin-left: 16.66667%; } - - .col-md-offset-3 { - margin-left: 25%; } - - .col-md-offset-4 { - margin-left: 33.33333%; } - - .col-md-offset-5 { - margin-left: 41.66667%; } - - .col-md-offset-6 { - margin-left: 50%; } - - .col-md-offset-7 { - margin-left: 58.33333%; } - - .col-md-offset-8 { - margin-left: 66.66667%; } - - .col-md-offset-9 { - margin-left: 75%; } - - .col-md-offset-10 { - margin-left: 83.33333%; } - - .col-md-offset-11 { - margin-left: 91.66667%; } - - .col-md-offset-12 { - margin-left: 100%; } } -@media (min-width: 1200px) { - .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { - float: left; } - - .col-lg-1 { - width: 8.33333%; } - - .col-lg-2 { - width: 16.66667%; } - - .col-lg-3 { - width: 25%; } - - .col-lg-4 { - width: 33.33333%; } - - .col-lg-5 { - width: 41.66667%; } - - .col-lg-6 { - width: 50%; } - - .col-lg-7 { - width: 58.33333%; } - - .col-lg-8 { - width: 66.66667%; } - - .col-lg-9 { - width: 75%; } - - .col-lg-10 { - width: 83.33333%; } - - .col-lg-11 { - width: 91.66667%; } - - .col-lg-12 { - width: 100%; } - - .col-lg-pull-0 { - right: auto; } - - .col-lg-pull-1 { - right: 8.33333%; } - - .col-lg-pull-2 { - right: 16.66667%; } - - .col-lg-pull-3 { - right: 25%; } - - .col-lg-pull-4 { - right: 33.33333%; } - - .col-lg-pull-5 { - right: 41.66667%; } - - .col-lg-pull-6 { - right: 50%; } - - .col-lg-pull-7 { - right: 58.33333%; } - - .col-lg-pull-8 { - right: 66.66667%; } - - .col-lg-pull-9 { - right: 75%; } - - .col-lg-pull-10 { - right: 83.33333%; } - - .col-lg-pull-11 { - right: 91.66667%; } - - .col-lg-pull-12 { - right: 100%; } - - .col-lg-push-0 { - left: auto; } - - .col-lg-push-1 { - left: 8.33333%; } - - .col-lg-push-2 { - left: 16.66667%; } - - .col-lg-push-3 { - left: 25%; } - - .col-lg-push-4 { - left: 33.33333%; } - - .col-lg-push-5 { - left: 41.66667%; } - - .col-lg-push-6 { - left: 50%; } - - .col-lg-push-7 { - left: 58.33333%; } - - .col-lg-push-8 { - left: 66.66667%; } - - .col-lg-push-9 { - left: 75%; } - - .col-lg-push-10 { - left: 83.33333%; } - - .col-lg-push-11 { - left: 91.66667%; } - - .col-lg-push-12 { - left: 100%; } - - .col-lg-offset-0 { - margin-left: 0%; } - - .col-lg-offset-1 { - margin-left: 8.33333%; } - - .col-lg-offset-2 { - margin-left: 16.66667%; } - - .col-lg-offset-3 { - margin-left: 25%; } - - .col-lg-offset-4 { - margin-left: 33.33333%; } - - .col-lg-offset-5 { - margin-left: 41.66667%; } - - .col-lg-offset-6 { - margin-left: 50%; } - - .col-lg-offset-7 { - margin-left: 58.33333%; } - - .col-lg-offset-8 { - margin-left: 66.66667%; } - - .col-lg-offset-9 { - margin-left: 75%; } - - .col-lg-offset-10 { - margin-left: 83.33333%; } - - .col-lg-offset-11 { - margin-left: 91.66667%; } - - .col-lg-offset-12 { - margin-left: 100%; } } -table { - background-color: transparent; } - -th { - text-align: left; } - -.table { - width: 100%; - max-width: 100%; - margin-bottom: 20px; } - .table > thead > tr > th, - .table > thead > tr > td, - .table > tbody > tr > th, - .table > tbody > tr > td, - .table > tfoot > tr > th, - .table > tfoot > tr > td { - padding: 8px; - line-height: 1.42857; - vertical-align: top; - border-top: 1px solid #dddddd; } - .table > thead > tr > th { - vertical-align: bottom; - border-bottom: 2px solid #dddddd; } - .table > caption + thead > tr:first-child > th, - .table > caption + thead > tr:first-child > td, - .table > colgroup + thead > tr:first-child > th, - .table > colgroup + thead > tr:first-child > td, - .table > thead:first-child > tr:first-child > th, - .table > thead:first-child > tr:first-child > td { - border-top: 0; } - .table > tbody + tbody { - border-top: 2px solid #dddddd; } - .table .table { - background-color: white; } - -.table-condensed > thead > tr > th, -.table-condensed > thead > tr > td, -.table-condensed > tbody > tr > th, -.table-condensed > tbody > tr > td, -.table-condensed > tfoot > tr > th, -.table-condensed > tfoot > tr > td { - padding: 5px; } - -.table-bordered { - border: 1px solid #dddddd; } - .table-bordered > thead > tr > th, - .table-bordered > thead > tr > td, - .table-bordered > tbody > tr > th, - .table-bordered > tbody > tr > td, - .table-bordered > tfoot > tr > th, - .table-bordered > tfoot > tr > td { - border: 1px solid #dddddd; } - .table-bordered > thead > tr > th, - .table-bordered > thead > tr > td { - border-bottom-width: 2px; } - -.table-striped > tbody > tr:nth-child(odd) > td, -.table-striped > tbody > tr:nth-child(odd) > th { - background-color: #f9f9f9; } - -.table-hover > tbody > tr:hover > td, -.table-hover > tbody > tr:hover > th { - background-color: whitesmoke; } - -table col[class*="col-"] { - position: static; - float: none; - display: table-column; } - -table td[class*="col-"], -table th[class*="col-"] { - position: static; - float: none; - display: table-cell; } - -.table > thead > tr > td.active, -.table > thead > tr > th.active, .table > thead > tr.active > td, .table > thead > tr.active > th, -.table > tbody > tr > td.active, -.table > tbody > tr > th.active, -.table > tbody > tr.active > td, -.table > tbody > tr.active > th, -.table > tfoot > tr > td.active, -.table > tfoot > tr > th.active, -.table > tfoot > tr.active > td, -.table > tfoot > tr.active > th { - background-color: whitesmoke; } - -.table-hover > tbody > tr > td.active:hover, -.table-hover > tbody > tr > th.active:hover, .table-hover > tbody > tr.active:hover > td, .table-hover > tbody > tr:hover > .active, .table-hover > tbody > tr.active:hover > th { - background-color: #e8e8e8; } - -.table > thead > tr > td.success, -.table > thead > tr > th.success, .table > thead > tr.success > td, .table > thead > tr.success > th, -.table > tbody > tr > td.success, -.table > tbody > tr > th.success, -.table > tbody > tr.success > td, -.table > tbody > tr.success > th, -.table > tfoot > tr > td.success, -.table > tfoot > tr > th.success, -.table > tfoot > tr.success > td, -.table > tfoot > tr.success > th { - background-color: #dff0d8; } - -.table-hover > tbody > tr > td.success:hover, -.table-hover > tbody > tr > th.success:hover, .table-hover > tbody > tr.success:hover > td, .table-hover > tbody > tr:hover > .success, .table-hover > tbody > tr.success:hover > th { - background-color: #d0e9c6; } - -.table > thead > tr > td.info, -.table > thead > tr > th.info, .table > thead > tr.info > td, .table > thead > tr.info > th, -.table > tbody > tr > td.info, -.table > tbody > tr > th.info, -.table > tbody > tr.info > td, -.table > tbody > tr.info > th, -.table > tfoot > tr > td.info, -.table > tfoot > tr > th.info, -.table > tfoot > tr.info > td, -.table > tfoot > tr.info > th { - background-color: #d9edf7; } - -.table-hover > tbody > tr > td.info:hover, -.table-hover > tbody > tr > th.info:hover, .table-hover > tbody > tr.info:hover > td, .table-hover > tbody > tr:hover > .info, .table-hover > tbody > tr.info:hover > th { - background-color: #c4e3f3; } - -.table > thead > tr > td.warning, -.table > thead > tr > th.warning, .table > thead > tr.warning > td, .table > thead > tr.warning > th, -.table > tbody > tr > td.warning, -.table > tbody > tr > th.warning, -.table > tbody > tr.warning > td, -.table > tbody > tr.warning > th, -.table > tfoot > tr > td.warning, -.table > tfoot > tr > th.warning, -.table > tfoot > tr.warning > td, -.table > tfoot > tr.warning > th { - background-color: #fcf8e3; } - -.table-hover > tbody > tr > td.warning:hover, -.table-hover > tbody > tr > th.warning:hover, .table-hover > tbody > tr.warning:hover > td, .table-hover > tbody > tr:hover > .warning, .table-hover > tbody > tr.warning:hover > th { - background-color: #faf2cc; } - -.table > thead > tr > td.danger, -.table > thead > tr > th.danger, .table > thead > tr.danger > td, .table > thead > tr.danger > th, -.table > tbody > tr > td.danger, -.table > tbody > tr > th.danger, -.table > tbody > tr.danger > td, -.table > tbody > tr.danger > th, -.table > tfoot > tr > td.danger, -.table > tfoot > tr > th.danger, -.table > tfoot > tr.danger > td, -.table > tfoot > tr.danger > th { - background-color: #f2dede; } - -.table-hover > tbody > tr > td.danger:hover, -.table-hover > tbody > tr > th.danger:hover, .table-hover > tbody > tr.danger:hover > td, .table-hover > tbody > tr:hover > .danger, .table-hover > tbody > tr.danger:hover > th { - background-color: #ebcccc; } - -@media screen and (max-width: 767px) { - .table-responsive { - width: 100%; - margin-bottom: 15px; - overflow-y: hidden; - overflow-x: auto; - -ms-overflow-style: -ms-autohiding-scrollbar; - border: 1px solid #dddddd; - -webkit-overflow-scrolling: touch; } - .table-responsive > .table { - margin-bottom: 0; } - .table-responsive > .table > thead > tr > th, - .table-responsive > .table > thead > tr > td, - .table-responsive > .table > tbody > tr > th, - .table-responsive > .table > tbody > tr > td, - .table-responsive > .table > tfoot > tr > th, - .table-responsive > .table > tfoot > tr > td { - white-space: nowrap; } - .table-responsive > .table-bordered { - border: 0; } - .table-responsive > .table-bordered > thead > tr > th:first-child, - .table-responsive > .table-bordered > thead > tr > td:first-child, - .table-responsive > .table-bordered > tbody > tr > th:first-child, - .table-responsive > .table-bordered > tbody > tr > td:first-child, - .table-responsive > .table-bordered > tfoot > tr > th:first-child, - .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; } - .table-responsive > .table-bordered > thead > tr > th:last-child, - .table-responsive > .table-bordered > thead > tr > td:last-child, - .table-responsive > .table-bordered > tbody > tr > th:last-child, - .table-responsive > .table-bordered > tbody > tr > td:last-child, - .table-responsive > .table-bordered > tfoot > tr > th:last-child, - .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; } - .table-responsive > .table-bordered > tbody > tr:last-child > th, - .table-responsive > .table-bordered > tbody > tr:last-child > td, - .table-responsive > .table-bordered > tfoot > tr:last-child > th, - .table-responsive > .table-bordered > tfoot > tr:last-child > td { - border-bottom: 0; } } - -fieldset { - padding: 0; - margin: 0; - border: 0; - min-width: 0; } - -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 20px; - font-size: 21px; - line-height: inherit; - color: #333333; - border: 0; - border-bottom: 1px solid #e5e5e5; } - -label { - display: inline-block; - max-width: 100%; - margin-bottom: 5px; - font-weight: bold; } - -input[type="search"] { - box-sizing: border-box; } - -input[type="radio"], -input[type="checkbox"] { - margin: 4px 0 0; - margin-top: 1px \9; - line-height: normal; } - -input[type="file"] { - display: block; } - -input[type="range"] { - display: block; - width: 100%; } - -select[multiple], -select[size] { - height: auto; } - -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; } - -output { - display: block; - padding-top: 7px; - font-size: 14px; - line-height: 1.42857; - color: #555555; } - -.form-control { - display: block; - width: 100%; - height: 34px; - padding: 6px 12px; - font-size: 14px; - line-height: 1.42857; - color: #555555; - background-color: white; - background-image: none; - border: 1px solid #cccccc; - border-radius: 4px; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; - transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; } - .form-control:focus { - border-color: #66afe9; - outline: 0; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); } - .form-control::-moz-placeholder { - color: #999999; - opacity: 1; } - .form-control:-ms-input-placeholder { - color: #999999; } - .form-control::-webkit-input-placeholder { - color: #999999; } - .form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control { - cursor: not-allowed; - background-color: #eeeeee; - opacity: 1; } - -textarea.form-control { - height: auto; } - -input[type="search"] { - -webkit-appearance: none; } - -input[type="date"], -input[type="time"], -input[type="datetime-local"], -input[type="month"] { - line-height: 34px; - line-height: 1.42857 \0; } - input[type="date"].input-sm, .form-horizontal .form-group-sm input[type="date"].form-control, .input-group-sm > input[type="date"].form-control, - .input-group-sm > input[type="date"].input-group-addon, - .input-group-sm > .input-group-btn > input[type="date"].btn, - input[type="time"].input-sm, - .form-horizontal .form-group-sm input[type="time"].form-control, - .input-group-sm > input[type="time"].form-control, - .input-group-sm > input[type="time"].input-group-addon, - .input-group-sm > .input-group-btn > input[type="time"].btn, - input[type="datetime-local"].input-sm, - .form-horizontal .form-group-sm input[type="datetime-local"].form-control, - .input-group-sm > input[type="datetime-local"].form-control, - .input-group-sm > input[type="datetime-local"].input-group-addon, - .input-group-sm > .input-group-btn > input[type="datetime-local"].btn, - input[type="month"].input-sm, - .form-horizontal .form-group-sm input[type="month"].form-control, - .input-group-sm > input[type="month"].form-control, - .input-group-sm > input[type="month"].input-group-addon, - .input-group-sm > .input-group-btn > input[type="month"].btn { - line-height: 30px; } - input[type="date"].input-lg, .form-horizontal .form-group-lg input[type="date"].form-control, .input-group-lg > input[type="date"].form-control, - .input-group-lg > input[type="date"].input-group-addon, - .input-group-lg > .input-group-btn > input[type="date"].btn, - input[type="time"].input-lg, - .form-horizontal .form-group-lg input[type="time"].form-control, - .input-group-lg > input[type="time"].form-control, - .input-group-lg > input[type="time"].input-group-addon, - .input-group-lg > .input-group-btn > input[type="time"].btn, - input[type="datetime-local"].input-lg, - .form-horizontal .form-group-lg input[type="datetime-local"].form-control, - .input-group-lg > input[type="datetime-local"].form-control, - .input-group-lg > input[type="datetime-local"].input-group-addon, - .input-group-lg > .input-group-btn > input[type="datetime-local"].btn, - input[type="month"].input-lg, - .form-horizontal .form-group-lg input[type="month"].form-control, - .input-group-lg > input[type="month"].form-control, - .input-group-lg > input[type="month"].input-group-addon, - .input-group-lg > .input-group-btn > input[type="month"].btn { - line-height: 45px; } - -.form-group { - margin-bottom: 15px; } - -.radio, -.checkbox { - position: relative; - display: block; - min-height: 20px; - margin-top: 10px; - margin-bottom: 10px; } - .radio label, - .checkbox label { - padding-left: 20px; - margin-bottom: 0; - font-weight: normal; - cursor: pointer; } - -.radio input[type="radio"], -.radio-inline input[type="radio"], -.checkbox input[type="checkbox"], -.checkbox-inline input[type="checkbox"] { - position: absolute; - margin-left: -20px; - margin-top: 4px \9; } - -.radio + .radio, -.checkbox + .checkbox { - margin-top: -5px; } - -.radio-inline, -.checkbox-inline { - display: inline-block; - padding-left: 20px; - margin-bottom: 0; - vertical-align: middle; - font-weight: normal; - cursor: pointer; } - -.radio-inline + .radio-inline, -.checkbox-inline + .checkbox-inline { - margin-top: 0; - margin-left: 10px; } - -input[type="radio"][disabled], input[type="radio"].disabled, fieldset[disabled] input[type="radio"], -input[type="checkbox"][disabled], -input[type="checkbox"].disabled, fieldset[disabled] -input[type="checkbox"] { - cursor: not-allowed; } - -.radio-inline.disabled, fieldset[disabled] .radio-inline, -.checkbox-inline.disabled, fieldset[disabled] -.checkbox-inline { - cursor: not-allowed; } - -.radio.disabled label, fieldset[disabled] .radio label, -.checkbox.disabled label, fieldset[disabled] -.checkbox label { - cursor: not-allowed; } - -.form-control-static { - padding-top: 7px; - padding-bottom: 7px; - margin-bottom: 0; } - .form-control-static.input-lg, .form-horizontal .form-group-lg .form-control-static.form-control, .input-group-lg > .form-control-static.form-control, - .input-group-lg > .form-control-static.input-group-addon, - .input-group-lg > .input-group-btn > .form-control-static.btn, .form-control-static.input-sm, .form-horizontal .form-group-sm .form-control-static.form-control, .input-group-sm > .form-control-static.form-control, - .input-group-sm > .form-control-static.input-group-addon, - .input-group-sm > .input-group-btn > .form-control-static.btn { - padding-left: 0; - padding-right: 0; } - -.input-sm, .form-horizontal .form-group-sm .form-control, .input-group-sm > .form-control, -.input-group-sm > .input-group-addon, -.input-group-sm > .input-group-btn > .btn { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; } - -select.input-sm, .form-horizontal .form-group-sm select.form-control, .input-group-sm > select.form-control, -.input-group-sm > select.input-group-addon, -.input-group-sm > .input-group-btn > select.btn { - height: 30px; - line-height: 30px; } - -textarea.input-sm, .form-horizontal .form-group-sm textarea.form-control, .input-group-sm > textarea.form-control, -.input-group-sm > textarea.input-group-addon, -.input-group-sm > .input-group-btn > textarea.btn, -select[multiple].input-sm, -.form-horizontal .form-group-sm select[multiple].form-control, -.input-group-sm > select[multiple].form-control, -.input-group-sm > select[multiple].input-group-addon, -.input-group-sm > .input-group-btn > select[multiple].btn { - height: auto; } - -.input-lg, .form-horizontal .form-group-lg .form-control, .input-group-lg > .form-control, -.input-group-lg > .input-group-addon, -.input-group-lg > .input-group-btn > .btn { - height: 45px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; } - -select.input-lg, .form-horizontal .form-group-lg select.form-control, .input-group-lg > select.form-control, -.input-group-lg > select.input-group-addon, -.input-group-lg > .input-group-btn > select.btn { - height: 45px; - line-height: 45px; } - -textarea.input-lg, .form-horizontal .form-group-lg textarea.form-control, .input-group-lg > textarea.form-control, -.input-group-lg > textarea.input-group-addon, -.input-group-lg > .input-group-btn > textarea.btn, -select[multiple].input-lg, -.form-horizontal .form-group-lg select[multiple].form-control, -.input-group-lg > select[multiple].form-control, -.input-group-lg > select[multiple].input-group-addon, -.input-group-lg > .input-group-btn > select[multiple].btn { - height: auto; } - -.has-feedback { - position: relative; } - .has-feedback .form-control { - padding-right: 42.5px; } - -.form-control-feedback { - position: absolute; - top: 25px; - right: 0; - z-index: 2; - display: block; - width: 34px; - height: 34px; - line-height: 34px; - text-align: center; } - -.input-lg + .form-control-feedback, .form-horizontal .form-group-lg .form-control + .form-control-feedback, .input-group-lg > .form-control + .form-control-feedback, -.input-group-lg > .input-group-addon + .form-control-feedback, -.input-group-lg > .input-group-btn > .btn + .form-control-feedback { - width: 45px; - height: 45px; - line-height: 45px; } - -.input-sm + .form-control-feedback, .form-horizontal .form-group-sm .form-control + .form-control-feedback, .input-group-sm > .form-control + .form-control-feedback, -.input-group-sm > .input-group-addon + .form-control-feedback, -.input-group-sm > .input-group-btn > .btn + .form-control-feedback { - width: 30px; - height: 30px; - line-height: 30px; } - -.has-success .help-block, -.has-success .control-label, -.has-success .radio, -.has-success .checkbox, -.has-success .radio-inline, -.has-success .checkbox-inline { - color: #468847; } -.has-success .form-control { - border-color: #468847; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } - .has-success .form-control:focus { - border-color: #356635; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; } -.has-success .input-group-addon { - color: #468847; - border-color: #468847; - background-color: #dff0d8; } -.has-success .form-control-feedback { - color: #468847; } - -.has-warning .help-block, -.has-warning .control-label, -.has-warning .radio, -.has-warning .checkbox, -.has-warning .radio-inline, -.has-warning .checkbox-inline { - color: #c09853; } -.has-warning .form-control { - border-color: #c09853; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } - .has-warning .form-control:focus { - border-color: #a47e3c; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; } -.has-warning .input-group-addon { - color: #c09853; - border-color: #c09853; - background-color: #fcf8e3; } -.has-warning .form-control-feedback { - color: #c09853; } - -.has-error .help-block, -.has-error .control-label, -.has-error .radio, -.has-error .checkbox, -.has-error .radio-inline, -.has-error .checkbox-inline { - color: #b94a48; } -.has-error .form-control { - border-color: #b94a48; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } - .has-error .form-control:focus { - border-color: #953b39; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; } -.has-error .input-group-addon { - color: #b94a48; - border-color: #b94a48; - background-color: #f2dede; } -.has-error .form-control-feedback { - color: #b94a48; } - -.has-feedback label.sr-only ~ .form-control-feedback { - top: 0; } - -.help-block { - display: block; - margin-top: 5px; - margin-bottom: 10px; - color: #737373; } - -@media (min-width: 768px) { - .form-inline .form-group, .navbar-form .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; } - .form-inline .form-control, .navbar-form .form-control { - display: inline-block; - width: auto; - vertical-align: middle; } - .form-inline .input-group, .navbar-form .input-group { - display: inline-table; - vertical-align: middle; } - .form-inline .input-group .input-group-addon, .navbar-form .input-group .input-group-addon, - .form-inline .input-group .input-group-btn, - .navbar-form .input-group .input-group-btn, - .form-inline .input-group .form-control, - .navbar-form .input-group .form-control { - width: auto; } - .form-inline .input-group > .form-control, .navbar-form .input-group > .form-control { - width: 100%; } - .form-inline .control-label, .navbar-form .control-label { - margin-bottom: 0; - vertical-align: middle; } - .form-inline .radio, .navbar-form .radio, - .form-inline .checkbox, - .navbar-form .checkbox { - display: inline-block; - margin-top: 0; - margin-bottom: 0; - vertical-align: middle; } - .form-inline .radio label, .navbar-form .radio label, - .form-inline .checkbox label, - .navbar-form .checkbox label { - padding-left: 0; } - .form-inline .radio input[type="radio"], .navbar-form .radio input[type="radio"], - .form-inline .checkbox input[type="checkbox"], - .navbar-form .checkbox input[type="checkbox"] { - position: relative; - margin-left: 0; } - .form-inline .has-feedback .form-control-feedback, .navbar-form .has-feedback .form-control-feedback { - top: 0; } } - -.form-horizontal .radio, -.form-horizontal .checkbox, -.form-horizontal .radio-inline, -.form-horizontal .checkbox-inline { - margin-top: 0; - margin-bottom: 0; - padding-top: 7px; } -.form-horizontal .radio, -.form-horizontal .checkbox { - min-height: 27px; } -.form-horizontal .form-group { - margin-left: -15px; - margin-right: -15px; } - .form-horizontal .form-group:before, .form-horizontal .form-group:after { - content: " "; - display: table; } - .form-horizontal .form-group:after { - clear: both; } -@media (min-width: 768px) { - .form-horizontal .control-label { - text-align: right; - margin-bottom: 0; - padding-top: 7px; } } -.form-horizontal .has-feedback .form-control-feedback { - top: 0; - right: 15px; } -@media (min-width: 768px) { - .form-horizontal .form-group-lg .control-label { - padding-top: 14.3px; } } -@media (min-width: 768px) { - .form-horizontal .form-group-sm .control-label { - padding-top: 6px; } } - -.btn { - display: inline-block; - margin-bottom: 0; - font-weight: normal; - text-align: center; - vertical-align: middle; - cursor: pointer; - background-image: none; - border: 1px solid transparent; - white-space: nowrap; - padding: 6px 12px; - font-size: 14px; - line-height: 1.42857; - border-radius: 4px; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; } - .btn:focus, .btn:active:focus, .btn.active:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; } - .btn:hover, .btn:focus { - color: #333333; - text-decoration: none; } - .btn:active, .btn.active { - outline: 0; - background-image: none; - box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } - .btn.disabled, .btn[disabled], fieldset[disabled] .btn { - cursor: not-allowed; - pointer-events: none; - opacity: 0.65; - filter: alpha(opacity=65); - box-shadow: none; } - -.btn-default { - color: #333333; - background-color: white; - border-color: #cccccc; } - .btn-default:hover, .btn-default:focus, .btn-default:active, .btn-default.active, .open > .btn-default.dropdown-toggle { - color: #333333; - background-color: #e6e6e6; - border-color: #adadad; } - .btn-default:active, .btn-default.active, .open > .btn-default.dropdown-toggle { - background-image: none; } - .btn-default.disabled, .btn-default.disabled:hover, .btn-default.disabled:focus, .btn-default.disabled:active, .btn-default.disabled.active, .btn-default[disabled], .btn-default[disabled]:hover, .btn-default[disabled]:focus, .btn-default[disabled]:active, .btn-default[disabled].active, fieldset[disabled] .btn-default, fieldset[disabled] .btn-default:hover, fieldset[disabled] .btn-default:focus, fieldset[disabled] .btn-default:active, fieldset[disabled] .btn-default.active { - background-color: white; - border-color: #cccccc; } - .btn-default .badge { - color: white; - background-color: #333333; } - -.btn-primary { - color: white; - background-color: #c72929; - border-color: #b22525; } - .btn-primary:hover, .btn-primary:focus, .btn-primary:active, .btn-primary.active, .open > .btn-primary.dropdown-toggle { - color: white; - background-color: #9d2020; - border-color: #7f1a1a; } - .btn-primary:active, .btn-primary.active, .open > .btn-primary.dropdown-toggle { - background-image: none; } - .btn-primary.disabled, .btn-primary.disabled:hover, .btn-primary.disabled:focus, .btn-primary.disabled:active, .btn-primary.disabled.active, .btn-primary[disabled], .btn-primary[disabled]:hover, .btn-primary[disabled]:focus, .btn-primary[disabled]:active, .btn-primary[disabled].active, fieldset[disabled] .btn-primary, fieldset[disabled] .btn-primary:hover, fieldset[disabled] .btn-primary:focus, fieldset[disabled] .btn-primary:active, fieldset[disabled] .btn-primary.active { - background-color: #c72929; - border-color: #b22525; } - .btn-primary .badge { - color: #c72929; - background-color: white; } - -.btn-success { - color: white; - background-color: #5cb85c; - border-color: #4cae4c; } - .btn-success:hover, .btn-success:focus, .btn-success:active, .btn-success.active, .open > .btn-success.dropdown-toggle { - color: white; - background-color: #449d44; - border-color: #398439; } - .btn-success:active, .btn-success.active, .open > .btn-success.dropdown-toggle { - background-image: none; } - .btn-success.disabled, .btn-success.disabled:hover, .btn-success.disabled:focus, .btn-success.disabled:active, .btn-success.disabled.active, .btn-success[disabled], .btn-success[disabled]:hover, .btn-success[disabled]:focus, .btn-success[disabled]:active, .btn-success[disabled].active, fieldset[disabled] .btn-success, fieldset[disabled] .btn-success:hover, fieldset[disabled] .btn-success:focus, fieldset[disabled] .btn-success:active, fieldset[disabled] .btn-success.active { - background-color: #5cb85c; - border-color: #4cae4c; } - .btn-success .badge { - color: #5cb85c; - background-color: white; } - -.btn-info { - color: white; - background-color: #5bc0de; - border-color: #46b8da; } - .btn-info:hover, .btn-info:focus, .btn-info:active, .btn-info.active, .open > .btn-info.dropdown-toggle { - color: white; - background-color: #31b0d5; - border-color: #269abc; } - .btn-info:active, .btn-info.active, .open > .btn-info.dropdown-toggle { - background-image: none; } - .btn-info.disabled, .btn-info.disabled:hover, .btn-info.disabled:focus, .btn-info.disabled:active, .btn-info.disabled.active, .btn-info[disabled], .btn-info[disabled]:hover, .btn-info[disabled]:focus, .btn-info[disabled]:active, .btn-info[disabled].active, fieldset[disabled] .btn-info, fieldset[disabled] .btn-info:hover, fieldset[disabled] .btn-info:focus, fieldset[disabled] .btn-info:active, fieldset[disabled] .btn-info.active { - background-color: #5bc0de; - border-color: #46b8da; } - .btn-info .badge { - color: #5bc0de; - background-color: white; } - -.btn-warning { - color: white; - background-color: #f0ad4e; - border-color: #eea236; } - .btn-warning:hover, .btn-warning:focus, .btn-warning:active, .btn-warning.active, .open > .btn-warning.dropdown-toggle { - color: white; - background-color: #ec971f; - border-color: #d58512; } - .btn-warning:active, .btn-warning.active, .open > .btn-warning.dropdown-toggle { - background-image: none; } - .btn-warning.disabled, .btn-warning.disabled:hover, .btn-warning.disabled:focus, .btn-warning.disabled:active, .btn-warning.disabled.active, .btn-warning[disabled], .btn-warning[disabled]:hover, .btn-warning[disabled]:focus, .btn-warning[disabled]:active, .btn-warning[disabled].active, fieldset[disabled] .btn-warning, fieldset[disabled] .btn-warning:hover, fieldset[disabled] .btn-warning:focus, fieldset[disabled] .btn-warning:active, fieldset[disabled] .btn-warning.active { - background-color: #f0ad4e; - border-color: #eea236; } - .btn-warning .badge { - color: #f0ad4e; - background-color: white; } - -.btn-danger { - color: white; - background-color: #d9534f; - border-color: #d43f3a; } - .btn-danger:hover, .btn-danger:focus, .btn-danger:active, .btn-danger.active, .open > .btn-danger.dropdown-toggle { - color: white; - background-color: #c9302c; - border-color: #ac2925; } - .btn-danger:active, .btn-danger.active, .open > .btn-danger.dropdown-toggle { - background-image: none; } - .btn-danger.disabled, .btn-danger.disabled:hover, .btn-danger.disabled:focus, .btn-danger.disabled:active, .btn-danger.disabled.active, .btn-danger[disabled], .btn-danger[disabled]:hover, .btn-danger[disabled]:focus, .btn-danger[disabled]:active, .btn-danger[disabled].active, fieldset[disabled] .btn-danger, fieldset[disabled] .btn-danger:hover, fieldset[disabled] .btn-danger:focus, fieldset[disabled] .btn-danger:active, fieldset[disabled] .btn-danger.active { - background-color: #d9534f; - border-color: #d43f3a; } - .btn-danger .badge { - color: #d9534f; - background-color: white; } - -.btn-link { - color: #c72929; - font-weight: normal; - cursor: pointer; - border-radius: 0; } - .btn-link, .btn-link:active, .btn-link[disabled], fieldset[disabled] .btn-link { - background-color: transparent; - box-shadow: none; } - .btn-link, .btn-link:hover, .btn-link:focus, .btn-link:active { - border-color: transparent; } - .btn-link:hover, .btn-link:focus { - color: #881c1c; - text-decoration: underline; - background-color: transparent; } - .btn-link[disabled]:hover, .btn-link[disabled]:focus, fieldset[disabled] .btn-link:hover, fieldset[disabled] .btn-link:focus { - color: #999999; - text-decoration: none; } - -.btn-lg, .btn-group-lg > .btn { - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; } - -.btn-sm, .btn-group-sm > .btn { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; } - -.btn-xs, .btn-group-xs > .btn { - padding: 1px 5px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; } - -.btn-block { - display: block; - width: 100%; } - -.btn-block + .btn-block { - margin-top: 5px; } - -input[type="submit"].btn-block, -input[type="reset"].btn-block, -input[type="button"].btn-block { - width: 100%; } - -.fade { - opacity: 0; - -webkit-transition: opacity 0.15s linear; - transition: opacity 0.15s linear; } - .fade.in { - opacity: 1; } - -.collapse { - display: none; } - .collapse.in { - display: block; } - -tr.collapse.in { - display: table-row; } - -tbody.collapse.in { - display: table-row-group; } - -.collapsing { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition: height 0.35s ease; - transition: height 0.35s ease; } - -.caret { - display: inline-block; - width: 0; - height: 0; - margin-left: 2px; - vertical-align: middle; - border-top: 4px solid; - border-right: 4px solid transparent; - border-left: 4px solid transparent; } - -.dropdown { - position: relative; } - -.dropdown-toggle:focus { - outline: 0; } - -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - padding: 5px 0; - margin: 2px 0 0; - list-style: none; - font-size: 14px; - text-align: left; - background-color: white; - border: 1px solid #cccccc; - border: 1px solid rgba(0, 0, 0, 0.15); - border-radius: 4px; - box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); - background-clip: padding-box; } - .dropdown-menu.pull-right { - right: 0; - left: auto; } - .dropdown-menu .divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; } - .dropdown-menu > li > a { - display: block; - padding: 3px 20px; - clear: both; - font-weight: normal; - line-height: 1.42857; - color: #333333; - white-space: nowrap; } - -.dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { - text-decoration: none; - color: #262626; - background-color: whitesmoke; } - -.dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { - color: white; - text-decoration: none; - outline: 0; - background-color: #c72929; } - -.dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { - color: #999999; } - -.dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { - text-decoration: none; - background-color: transparent; - background-image: none; - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - cursor: not-allowed; } - -.open > .dropdown-menu { - display: block; } -.open > a { - outline: 0; } - -.dropdown-menu-right { - left: auto; - right: 0; } - -.dropdown-menu-left { - left: 0; - right: auto; } - -.dropdown-header { - display: block; - padding: 3px 20px; - font-size: 12px; - line-height: 1.42857; - color: #999999; - white-space: nowrap; } - -.dropdown-backdrop { - position: fixed; - left: 0; - right: 0; - bottom: 0; - top: 0; - z-index: 990; } - -.pull-right > .dropdown-menu { - right: 0; - left: auto; } - -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - border-top: 0; - border-bottom: 4px solid; - content: ""; } -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 1px; } - -@media (min-width: 768px) { - .navbar-right .dropdown-menu { - right: 0; - left: auto; } - .navbar-right .dropdown-menu-left { - left: 0; - right: auto; } } -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-block; - vertical-align: middle; } - .btn-group > .btn, - .btn-group-vertical > .btn { - position: relative; - float: left; } - .btn-group > .btn:hover, .btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active, - .btn-group-vertical > .btn:hover, - .btn-group-vertical > .btn:focus, - .btn-group-vertical > .btn:active, - .btn-group-vertical > .btn.active { - z-index: 2; } - .btn-group > .btn:focus, - .btn-group-vertical > .btn:focus { - outline: 0; } - -.btn-group .btn + .btn, -.btn-group .btn + .btn-group, -.btn-group .btn-group + .btn, -.btn-group .btn-group + .btn-group { - margin-left: -1px; } - -.btn-toolbar { - margin-left: -5px; } - .btn-toolbar:before, .btn-toolbar:after { - content: " "; - display: table; } - .btn-toolbar:after { - clear: both; } - .btn-toolbar .btn-group, - .btn-toolbar .input-group { - float: left; } - .btn-toolbar > .btn, - .btn-toolbar > .btn-group, - .btn-toolbar > .input-group { - margin-left: 5px; } - -.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { - border-radius: 0; } - -.btn-group > .btn:first-child { - margin-left: 0; } - .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { - border-bottom-right-radius: 0; - border-top-right-radius: 0; } - -.btn-group > .btn:last-child:not(:first-child), -.btn-group > .dropdown-toggle:not(:first-child) { - border-bottom-left-radius: 0; - border-top-left-radius: 0; } - -.btn-group > .btn-group { - float: left; } - -.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; } - -.btn-group > .btn-group:first-child > .btn:last-child, -.btn-group > .btn-group:first-child > .dropdown-toggle { - border-bottom-right-radius: 0; - border-top-right-radius: 0; } - -.btn-group > .btn-group:last-child > .btn:first-child { - border-bottom-left-radius: 0; - border-top-left-radius: 0; } - -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; } - -.btn-group > .btn + .dropdown-toggle { - padding-left: 8px; - padding-right: 8px; } - -.btn-group > .btn-lg + .dropdown-toggle, .btn-group-lg.btn-group > .btn + .dropdown-toggle { - padding-left: 12px; - padding-right: 12px; } - -.btn-group.open .dropdown-toggle { - box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } - .btn-group.open .dropdown-toggle.btn-link { - box-shadow: none; } - -.btn .caret { - margin-left: 0; } - -.btn-lg .caret, .btn-group-lg > .btn .caret { - border-width: 5px 5px 0; - border-bottom-width: 0; } - -.dropup .btn-lg .caret, .dropup .btn-group-lg > .btn .caret { - border-width: 0 5px 5px; } - -.btn-group-vertical > .btn, -.btn-group-vertical > .btn-group, -.btn-group-vertical > .btn-group > .btn { - display: block; - float: none; - width: 100%; - max-width: 100%; } -.btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after { - content: " "; - display: table; } -.btn-group-vertical > .btn-group:after { - clear: both; } -.btn-group-vertical > .btn-group > .btn { - float: none; } -.btn-group-vertical > .btn + .btn, -.btn-group-vertical > .btn + .btn-group, -.btn-group-vertical > .btn-group + .btn, -.btn-group-vertical > .btn-group + .btn-group { - margin-top: -1px; - margin-left: 0; } - -.btn-group-vertical > .btn:not(:first-child):not(:last-child) { - border-radius: 0; } -.btn-group-vertical > .btn:first-child:not(:last-child) { - border-top-right-radius: 4px; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; } -.btn-group-vertical > .btn:last-child:not(:first-child) { - border-bottom-left-radius: 4px; - border-top-right-radius: 0; - border-top-left-radius: 0; } - -.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; } - -.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, -.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; } - -.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { - border-top-right-radius: 0; - border-top-left-radius: 0; } - -.btn-group-justified { - display: table; - width: 100%; - table-layout: fixed; - border-collapse: separate; } - .btn-group-justified > .btn, - .btn-group-justified > .btn-group { - float: none; - display: table-cell; - width: 1%; } - .btn-group-justified > .btn-group .btn { - width: 100%; } - .btn-group-justified > .btn-group .dropdown-menu { - left: auto; } - -[data-toggle="buttons"] > .btn > input[type="radio"], -[data-toggle="buttons"] > .btn > input[type="checkbox"] { - position: absolute; - z-index: -1; - opacity: 0; - filter: alpha(opacity=0); } - -.input-group { - position: relative; - display: table; - border-collapse: separate; } - .input-group[class*="col-"] { - float: none; - padding-left: 0; - padding-right: 0; } - .input-group .form-control { - position: relative; - z-index: 2; - float: left; - width: 100%; - margin-bottom: 0; } - -.input-group-addon, -.input-group-btn, -.input-group .form-control { - display: table-cell; } - .input-group-addon:not(:first-child):not(:last-child), - .input-group-btn:not(:first-child):not(:last-child), - .input-group .form-control:not(:first-child):not(:last-child) { - border-radius: 0; } - -.input-group-addon, -.input-group-btn { - width: 1%; - white-space: nowrap; - vertical-align: middle; } - -.input-group-addon { - padding: 6px 12px; - font-size: 14px; - font-weight: normal; - line-height: 1; - color: #555555; - text-align: center; - background-color: #eeeeee; - border: 1px solid #cccccc; - border-radius: 4px; } - .input-group-addon.input-sm, .form-horizontal .form-group-sm .input-group-addon.form-control, - .input-group-sm > .input-group-addon, - .input-group-sm > .input-group-btn > .input-group-addon.btn { - padding: 5px 10px; - font-size: 12px; - border-radius: 3px; } - .input-group-addon.input-lg, .form-horizontal .form-group-lg .input-group-addon.form-control, - .input-group-lg > .input-group-addon, - .input-group-lg > .input-group-btn > .input-group-addon.btn { - padding: 10px 16px; - font-size: 18px; - border-radius: 6px; } - .input-group-addon input[type="radio"], - .input-group-addon input[type="checkbox"] { - margin-top: 0; } - -.input-group .form-control:first-child, -.input-group-addon:first-child, -.input-group-btn:first-child > .btn, -.input-group-btn:first-child > .btn-group > .btn, -.input-group-btn:first-child > .dropdown-toggle, -.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), -.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { - border-bottom-right-radius: 0; - border-top-right-radius: 0; } - -.input-group-addon:first-child { - border-right: 0; } - -.input-group .form-control:last-child, -.input-group-addon:last-child, -.input-group-btn:last-child > .btn, -.input-group-btn:last-child > .btn-group > .btn, -.input-group-btn:last-child > .dropdown-toggle, -.input-group-btn:first-child > .btn:not(:first-child), -.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { - border-bottom-left-radius: 0; - border-top-left-radius: 0; } - -.input-group-addon:last-child { - border-left: 0; } - -.input-group-btn { - position: relative; - font-size: 0; - white-space: nowrap; } - .input-group-btn > .btn { - position: relative; } - .input-group-btn > .btn + .btn { - margin-left: -1px; } - .input-group-btn > .btn:hover, .input-group-btn > .btn:focus, .input-group-btn > .btn:active { - z-index: 2; } - .input-group-btn:first-child > .btn, - .input-group-btn:first-child > .btn-group { - margin-right: -1px; } - .input-group-btn:last-child > .btn, - .input-group-btn:last-child > .btn-group { - margin-left: -1px; } - -.nav { - margin-bottom: 0; - padding-left: 0; - list-style: none; } - .nav:before, .nav:after { - content: " "; - display: table; } - .nav:after { - clear: both; } - .nav > li { - position: relative; - display: block; } - .nav > li > a { - position: relative; - display: block; - padding: 10px 15px; } - .nav > li > a:hover, .nav > li > a:focus { - text-decoration: none; - background-color: #eeeeee; } - .nav > li.disabled > a { - color: #999999; } - .nav > li.disabled > a:hover, .nav > li.disabled > a:focus { - color: #999999; - text-decoration: none; - background-color: transparent; - cursor: not-allowed; } - .nav .open > a, .nav .open > a:hover, .nav .open > a:focus { - background-color: #eeeeee; - border-color: #c72929; } - .nav .nav-divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; } - .nav > li > a > img { - max-width: none; } - -.nav-tabs { - border-bottom: 1px solid #dddddd; } - .nav-tabs > li { - float: left; - margin-bottom: -1px; } - .nav-tabs > li > a { - margin-right: 2px; - line-height: 1.42857; - border: 1px solid transparent; - border-radius: 4px 4px 0 0; } - .nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #dddddd; } - .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { - color: #555555; - background-color: white; - border: 1px solid #dddddd; - border-bottom-color: transparent; - cursor: default; } - -.nav-pills > li { - float: left; } - .nav-pills > li > a { - border-radius: 4px; } - .nav-pills > li + li { - margin-left: 2px; } - .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus { - color: white; - background-color: #c72929; } - -.nav-stacked > li { - float: none; } - .nav-stacked > li + li { - margin-top: 2px; - margin-left: 0; } - -.nav-justified, .nav-tabs.nav-justified { - width: 100%; } - .nav-justified > li, .nav-tabs.nav-justified > li { - float: none; } - .nav-justified > li > a, .nav-tabs.nav-justified > li > a { - text-align: center; - margin-bottom: 5px; } - .nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; } - @media (min-width: 768px) { - .nav-justified > li, .nav-tabs.nav-justified > li { - display: table-cell; - width: 1%; } - .nav-justified > li > a, .nav-tabs.nav-justified > li > a { - margin-bottom: 0; } } - -.nav-tabs-justified, .nav-tabs.nav-justified { - border-bottom: 0; } - .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a { - margin-right: 0; - border-radius: 4px; } - .nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a, - .nav-tabs-justified > .active > a:hover, - .nav-tabs.nav-justified > .active > a:hover, - .nav-tabs-justified > .active > a:focus, - .nav-tabs.nav-justified > .active > a:focus { - border: 1px solid #dddddd; } - @media (min-width: 768px) { - .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a { - border-bottom: 1px solid #dddddd; - border-radius: 4px 4px 0 0; } - .nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a, - .nav-tabs-justified > .active > a:hover, - .nav-tabs.nav-justified > .active > a:hover, - .nav-tabs-justified > .active > a:focus, - .nav-tabs.nav-justified > .active > a:focus { - border-bottom-color: white; } } - -.tab-content > .tab-pane { - display: none; } -.tab-content > .active { - display: block; } - -.nav-tabs .dropdown-menu { - margin-top: -1px; - border-top-right-radius: 0; - border-top-left-radius: 0; } - -.navbar { - position: relative; - min-height: 50px; - margin-bottom: 20px; - border: 1px solid transparent; } - .navbar:before, .navbar:after { - content: " "; - display: table; } - .navbar:after { - clear: both; } - @media (min-width: 768px) { - .navbar { - border-radius: 4px; } } - -.navbar-header:before, .navbar-header:after { - content: " "; - display: table; } -.navbar-header:after { - clear: both; } -@media (min-width: 768px) { - .navbar-header { - float: left; } } - -.navbar-collapse { - overflow-x: visible; - padding-right: 15px; - padding-left: 15px; - border-top: 1px solid transparent; - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); - -webkit-overflow-scrolling: touch; } - .navbar-collapse:before, .navbar-collapse:after { - content: " "; - display: table; } - .navbar-collapse:after { - clear: both; } - .navbar-collapse.in { - overflow-y: auto; } - @media (min-width: 768px) { - .navbar-collapse { - width: auto; - border-top: 0; - box-shadow: none; } - .navbar-collapse.collapse { - display: block !important; - height: auto !important; - padding-bottom: 0; - overflow: visible !important; } - .navbar-collapse.in { - overflow-y: visible; } - .navbar-fixed-top .navbar-collapse, .navbar-static-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { - padding-left: 0; - padding-right: 0; } } - -.navbar-fixed-top .navbar-collapse, -.navbar-fixed-bottom .navbar-collapse { - max-height: 340px; } - @media (max-width: 480px) and (orientation: landscape) { - .navbar-fixed-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - max-height: 200px; } } - -.container > .navbar-header, -.container > .navbar-collapse, -.container-fluid > .navbar-header, -.container-fluid > .navbar-collapse { - margin-right: -15px; - margin-left: -15px; } - @media (min-width: 768px) { - .container > .navbar-header, - .container > .navbar-collapse, - .container-fluid > .navbar-header, - .container-fluid > .navbar-collapse { - margin-right: 0; - margin-left: 0; } } - -.navbar-static-top { - z-index: 1000; - border-width: 0 0 1px; } - @media (min-width: 768px) { - .navbar-static-top { - border-radius: 0; } } - -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); } - @media (min-width: 768px) { - .navbar-fixed-top, - .navbar-fixed-bottom { - border-radius: 0; } } - -.navbar-fixed-top { - top: 0; - border-width: 0 0 1px; } - -.navbar-fixed-bottom { - bottom: 0; - margin-bottom: 0; - border-width: 1px 0 0; } - -.navbar-brand { - float: left; - padding: 15px 15px; - font-size: 18px; - line-height: 20px; - height: 50px; } - .navbar-brand:hover, .navbar-brand:focus { - text-decoration: none; } - @media (min-width: 768px) { - .navbar > .container .navbar-brand, .navbar > .container-fluid .navbar-brand { - margin-left: -15px; } } - -.navbar-toggle { - position: relative; - float: right; - margin-right: 15px; - padding: 9px 10px; - margin-top: 8px; - margin-bottom: 8px; - background-color: transparent; - background-image: none; - border: 1px solid transparent; - border-radius: 4px; } - .navbar-toggle:focus { - outline: 0; } - .navbar-toggle .icon-bar { - display: block; - width: 22px; - height: 2px; - border-radius: 1px; } - .navbar-toggle .icon-bar + .icon-bar { - margin-top: 4px; } - @media (min-width: 768px) { - .navbar-toggle { - display: none; } } - -.navbar-nav { - margin: 7.5px -15px; } - .navbar-nav > li > a { - padding-top: 10px; - padding-bottom: 10px; - line-height: 20px; } - @media (max-width: 767px) { - .navbar-nav .open .dropdown-menu { - position: static; - float: none; - width: auto; - margin-top: 0; - background-color: transparent; - border: 0; - box-shadow: none; } - .navbar-nav .open .dropdown-menu > li > a, - .navbar-nav .open .dropdown-menu .dropdown-header { - padding: 5px 15px 5px 25px; } - .navbar-nav .open .dropdown-menu > li > a { - line-height: 20px; } - .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-nav .open .dropdown-menu > li > a:focus { - background-image: none; } } - @media (min-width: 768px) { - .navbar-nav { - float: left; - margin: 0; } - .navbar-nav > li { - float: left; } - .navbar-nav > li > a { - padding-top: 15px; - padding-bottom: 15px; } - .navbar-nav.navbar-right:last-child { - margin-right: -15px; } } - -@media (min-width: 768px) { - .navbar-left { - float: left !important; } - - .navbar-right { - float: right !important; } } -.navbar-form { - margin-left: -15px; - margin-right: -15px; - padding: 10px 15px; - border-top: 1px solid transparent; - border-bottom: 1px solid transparent; - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - margin-top: 8px; - margin-bottom: 8px; } - @media (max-width: 767px) { - .navbar-form .form-group { - margin-bottom: 5px; } } - @media (min-width: 768px) { - .navbar-form { - width: auto; - border: 0; - margin-left: 0; - margin-right: 0; - padding-top: 0; - padding-bottom: 0; - box-shadow: none; } - .navbar-form.navbar-right:last-child { - margin-right: -15px; } } - -.navbar-nav > li > .dropdown-menu { - margin-top: 0; - border-top-right-radius: 0; - border-top-left-radius: 0; } - -.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; } - -.navbar-btn { - margin-top: 8px; - margin-bottom: 8px; } - .navbar-btn.btn-sm, .btn-group-sm > .navbar-btn.btn { - margin-top: 10px; - margin-bottom: 10px; } - .navbar-btn.btn-xs, .btn-group-xs > .navbar-btn.btn { - margin-top: 14px; - margin-bottom: 14px; } - -.navbar-text { - margin-top: 15px; - margin-bottom: 15px; } - @media (min-width: 768px) { - .navbar-text { - float: left; - margin-left: 15px; - margin-right: 15px; } - .navbar-text.navbar-right:last-child { - margin-right: 0; } } - -.navbar-default { - background-color: #f8f8f8; - border-color: #e7e7e7; } - .navbar-default .navbar-brand { - color: #777777; } - .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus { - color: #5e5e5e; - background-color: transparent; } - .navbar-default .navbar-text { - color: #777777; } - .navbar-default .navbar-nav > li > a { - color: #777777; } - .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus { - color: #333333; - background-color: transparent; } - .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus { - color: #555555; - background-color: #e7e7e7; } - .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus { - color: #cccccc; - background-color: transparent; } - .navbar-default .navbar-toggle { - border-color: #dddddd; } - .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { - background-color: #dddddd; } - .navbar-default .navbar-toggle .icon-bar { - background-color: #cccccc; } - .navbar-default .navbar-collapse, - .navbar-default .navbar-form { - border-color: #e7e7e7; } - .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus { - background-color: #e7e7e7; - color: #555555; } - @media (max-width: 767px) { - .navbar-default .navbar-nav .open .dropdown-menu > li > a { - color: #777777; } - .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { - color: #333333; - background-color: transparent; } - .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #555555; - background-color: #e7e7e7; } - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #cccccc; - background-color: transparent; } } - .navbar-default .navbar-link { - color: #777777; } - .navbar-default .navbar-link:hover { - color: #333333; } - .navbar-default .btn-link { - color: #777777; } - .navbar-default .btn-link:hover, .navbar-default .btn-link:focus { - color: #333333; } - .navbar-default .btn-link[disabled]:hover, .navbar-default .btn-link[disabled]:focus, fieldset[disabled] .navbar-default .btn-link:hover, fieldset[disabled] .navbar-default .btn-link:focus { - color: #cccccc; } - -.navbar-inverse { - background-color: #c72929; - border-color: #b22525; } - .navbar-inverse .navbar-brand { - color: white; } - .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus { - color: white; - background-color: transparent; } - .navbar-inverse .navbar-text { - color: white; } - .navbar-inverse .navbar-nav > li > a { - color: white; } - .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus { - color: white; - background-color: #a52222; } - .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { - color: white; - background-color: #9d2020; } - .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus { - color: #444444; - background-color: transparent; } - .navbar-inverse .navbar-toggle { - border-color: #333333; } - .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus { - background-color: #333333; } - .navbar-inverse .navbar-toggle .icon-bar { - background-color: white; } - .navbar-inverse .navbar-collapse, - .navbar-inverse .navbar-form { - border-color: #a92323; } - .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { - background-color: #9d2020; - color: white; } - @media (max-width: 767px) { - .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { - border-color: #b22525; } - .navbar-inverse .navbar-nav .open .dropdown-menu .divider { - background-color: #b22525; } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { - color: white; } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { - color: white; - background-color: #a52222; } - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { - color: white; - background-color: #9d2020; } - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #444444; - background-color: transparent; } } - .navbar-inverse .navbar-link { - color: white; } - .navbar-inverse .navbar-link:hover { - color: white; } - .navbar-inverse .btn-link { - color: white; } - .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus { - color: white; } - .navbar-inverse .btn-link[disabled]:hover, .navbar-inverse .btn-link[disabled]:focus, fieldset[disabled] .navbar-inverse .btn-link:hover, fieldset[disabled] .navbar-inverse .btn-link:focus { - color: #444444; } - -.breadcrumb { - padding: 8px 15px; - margin-bottom: 20px; - list-style: none; - background-color: whitesmoke; - border-radius: 4px; } - .breadcrumb > li { - display: inline-block; } - .breadcrumb > li + li:before { - content: "/\00a0"; - padding: 0 5px; - color: #cccccc; } - .breadcrumb > .active { - color: #999999; } - -.pagination { - display: inline-block; - padding-left: 0; - margin: 20px 0; - border-radius: 4px; } - .pagination > li { - display: inline; } - .pagination > li > a, - .pagination > li > span { - position: relative; - float: left; - padding: 6px 12px; - line-height: 1.42857; - text-decoration: none; - color: #c72929; - background-color: white; - border: 1px solid #dddddd; - margin-left: -1px; } - .pagination > li:first-child > a, - .pagination > li:first-child > span { - margin-left: 0; - border-bottom-left-radius: 4px; - border-top-left-radius: 4px; } - .pagination > li:last-child > a, - .pagination > li:last-child > span { - border-bottom-right-radius: 4px; - border-top-right-radius: 4px; } - .pagination > li > a:hover, .pagination > li > a:focus, - .pagination > li > span:hover, - .pagination > li > span:focus { - color: #881c1c; - background-color: #eeeeee; - border-color: #dddddd; } - .pagination > .active > a, .pagination > .active > a:hover, .pagination > .active > a:focus, - .pagination > .active > span, - .pagination > .active > span:hover, - .pagination > .active > span:focus { - z-index: 2; - color: white; - background-color: #c72929; - border-color: #c72929; - cursor: default; } - .pagination > .disabled > span, - .pagination > .disabled > span:hover, - .pagination > .disabled > span:focus, - .pagination > .disabled > a, - .pagination > .disabled > a:hover, - .pagination > .disabled > a:focus { - color: #999999; - background-color: white; - border-color: #dddddd; - cursor: not-allowed; } - -.pagination-lg > li > a, -.pagination-lg > li > span { - padding: 10px 16px; - font-size: 18px; } -.pagination-lg > li:first-child > a, -.pagination-lg > li:first-child > span { - border-bottom-left-radius: 6px; - border-top-left-radius: 6px; } -.pagination-lg > li:last-child > a, -.pagination-lg > li:last-child > span { - border-bottom-right-radius: 6px; - border-top-right-radius: 6px; } - -.pagination-sm > li > a, -.pagination-sm > li > span { - padding: 5px 10px; - font-size: 12px; } -.pagination-sm > li:first-child > a, -.pagination-sm > li:first-child > span { - border-bottom-left-radius: 3px; - border-top-left-radius: 3px; } -.pagination-sm > li:last-child > a, -.pagination-sm > li:last-child > span { - border-bottom-right-radius: 3px; - border-top-right-radius: 3px; } - -.pager { - padding-left: 0; - margin: 20px 0; - list-style: none; - text-align: center; } - .pager:before, .pager:after { - content: " "; - display: table; } - .pager:after { - clear: both; } - .pager li { - display: inline; } - .pager li > a, - .pager li > span { - display: inline-block; - padding: 5px 14px; - background-color: white; - border: 1px solid #dddddd; - border-radius: 15px; } - .pager li > a:hover, - .pager li > a:focus { - text-decoration: none; - background-color: #eeeeee; } - .pager .next > a, - .pager .next > span { - float: right; } - .pager .previous > a, - .pager .previous > span { - float: left; } - .pager .disabled > a, - .pager .disabled > a:hover, - .pager .disabled > a:focus, - .pager .disabled > span { - color: #999999; - background-color: white; - cursor: not-allowed; } - -.label { - display: inline; - padding: .2em .6em .3em; - font-size: 75%; - font-weight: bold; - line-height: 1; - color: white; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: .25em; } - .label:empty { - display: none; } - .btn .label { - position: relative; - top: -1px; } - -a.label:hover, a.label:focus { - color: white; - text-decoration: none; - cursor: pointer; } - -.label-default { - background-color: #999999; } - .label-default[href]:hover, .label-default[href]:focus { - background-color: gray; } - -.label-primary { - background-color: #c72929; } - .label-primary[href]:hover, .label-primary[href]:focus { - background-color: #9d2020; } - -.label-success { - background-color: #5cb85c; } - .label-success[href]:hover, .label-success[href]:focus { - background-color: #449d44; } - -.label-info { - background-color: #5bc0de; } - .label-info[href]:hover, .label-info[href]:focus { - background-color: #31b0d5; } - -.label-warning { - background-color: #f0ad4e; } - .label-warning[href]:hover, .label-warning[href]:focus { - background-color: #ec971f; } - -.label-danger { - background-color: #d9534f; } - .label-danger[href]:hover, .label-danger[href]:focus { - background-color: #c9302c; } - -.badge { - display: inline-block; - min-width: 10px; - padding: 3px 7px; - font-size: 12px; - font-weight: bold; - color: white; - line-height: 1; - vertical-align: baseline; - white-space: nowrap; - text-align: center; - background-color: #999999; - border-radius: 10px; } - .badge:empty { - display: none; } - .btn .badge { - position: relative; - top: -1px; } - .btn-xs .badge, .btn-group-xs > .btn .badge { - top: 0; - padding: 1px 5px; } - a.list-group-item.active > .badge, .nav-pills > .active > a > .badge { - color: #c72929; - background-color: white; } - .nav-pills > li > a > .badge { - margin-left: 3px; } - -a.badge:hover, a.badge:focus { - color: white; - text-decoration: none; - cursor: pointer; } - -.jumbotron { - padding: 30px; - margin-bottom: 30px; - color: inherit; - background-color: #eeeeee; } - .jumbotron h1, - .jumbotron .h1 { - color: inherit; } - .jumbotron p { - margin-bottom: 15px; - font-size: 21px; - font-weight: 200; } - .jumbotron > hr { - border-top-color: #d5d5d5; } - .container .jumbotron { - border-radius: 6px; } - .jumbotron .container { - max-width: 100%; } - @media screen and (min-width: 768px) { - .jumbotron { - padding-top: 48px; - padding-bottom: 48px; } - .container .jumbotron { - padding-left: 60px; - padding-right: 60px; } - .jumbotron h1, - .jumbotron .h1 { - font-size: 63px; } } - -.thumbnail { - display: block; - padding: 4px; - margin-bottom: 20px; - line-height: 1.42857; - background-color: white; - border: 1px solid #dddddd; - border-radius: 4px; - -webkit-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; } - .thumbnail > img, - .thumbnail a > img { - display: block; - width: 100% \9; - max-width: 100%; - height: auto; - margin-left: auto; - margin-right: auto; } - .thumbnail .caption { - padding: 9px; - color: #333333; } - -a.thumbnail:hover, -a.thumbnail:focus, -a.thumbnail.active { - border-color: #c72929; } - -.alert { - padding: 15px; - margin-bottom: 20px; - border: 1px solid transparent; - border-radius: 4px; } - .alert h4 { - margin-top: 0; - color: inherit; } - .alert .alert-link { - font-weight: bold; } - .alert > p, - .alert > ul { - margin-bottom: 0; } - .alert > p + p { - margin-top: 5px; } - -.alert-dismissable, -.alert-dismissible { - padding-right: 35px; } - .alert-dismissable .close, - .alert-dismissible .close { - position: relative; - top: -2px; - right: -21px; - color: inherit; } - -.alert-success { - background-color: #dff0d8; - border-color: #d6e9c6; - color: #468847; } - .alert-success hr { - border-top-color: #c9e2b3; } - .alert-success .alert-link { - color: #356635; } - -.alert-info { - background-color: #d9edf7; - border-color: #bce8f1; - color: #3a87ad; } - .alert-info hr { - border-top-color: #a6e1ec; } - .alert-info .alert-link { - color: #2d6987; } - -.alert-warning { - background-color: #fcf8e3; - border-color: #faebcc; - color: #c09853; } - .alert-warning hr { - border-top-color: #f7e1b5; } - .alert-warning .alert-link { - color: #a47e3c; } - -.alert-danger { - background-color: #f2dede; - border-color: #ebccd1; - color: #b94a48; } - .alert-danger hr { - border-top-color: #e4b9c0; } - .alert-danger .alert-link { - color: #953b39; } - -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; } - - to { - background-position: 0 0; } } -@keyframes progress-bar-stripes { - from { - background-position: 40px 0; } - - to { - background-position: 0 0; } } -.progress { - overflow: hidden; - height: 20px; - margin-bottom: 20px; - background-color: whitesmoke; - border-radius: 4px; - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); } - -.progress-bar { - float: left; - width: 0%; - height: 100%; - font-size: 12px; - line-height: 20px; - color: white; - text-align: center; - background-color: #c72929; - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -webkit-transition: width 0.6s ease; - transition: width 0.6s ease; } - -.progress-striped .progress-bar, -.progress-bar-striped { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-size: 40px 40px; } - -.progress.active .progress-bar, -.progress-bar.active { - -webkit-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; } - -.progress-bar[aria-valuenow="1"], .progress-bar[aria-valuenow="2"] { - min-width: 30px; } -.progress-bar[aria-valuenow="0"] { - color: #999999; - min-width: 30px; - background-color: transparent; - background-image: none; - box-shadow: none; } - -.progress-bar-success { - background-color: #5cb85c; } - .progress-striped .progress-bar-success { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } - -.progress-bar-info { - background-color: #5bc0de; } - .progress-striped .progress-bar-info { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } - -.progress-bar-warning { - background-color: #f0ad4e; } - .progress-striped .progress-bar-warning { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } - -.progress-bar-danger { - background-color: #d9534f; } - .progress-striped .progress-bar-danger { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } - -.media, -.media-body { - overflow: hidden; - zoom: 1; } - -.media, -.media .media { - margin-top: 15px; } - -.media:first-child { - margin-top: 0; } - -.media-object { - display: block; } - -.media-heading { - margin: 0 0 5px; } - -.media > .pull-left { - margin-right: 10px; } -.media > .pull-right { - margin-left: 10px; } - -.media-list { - padding-left: 0; - list-style: none; } - -.list-group { - margin-bottom: 20px; - padding-left: 0; } - -.list-group-item { - position: relative; - display: block; - padding: 10px 15px; - margin-bottom: -1px; - background-color: white; - border: 1px solid #dddddd; } - .list-group-item:first-child { - border-top-right-radius: 4px; - border-top-left-radius: 4px; } - .list-group-item:last-child { - margin-bottom: 0; - border-bottom-right-radius: 4px; - border-bottom-left-radius: 4px; } - .list-group-item > .badge { - float: right; } - .list-group-item > .badge + .badge { - margin-right: 5px; } - -a.list-group-item { - color: #555555; } - a.list-group-item .list-group-item-heading { - color: #333333; } - a.list-group-item:hover, a.list-group-item:focus { - text-decoration: none; - color: #555555; - background-color: whitesmoke; } - -.list-group-item.disabled, .list-group-item.disabled:hover, .list-group-item.disabled:focus { - background-color: #eeeeee; - color: #999999; } - .list-group-item.disabled .list-group-item-heading, .list-group-item.disabled:hover .list-group-item-heading, .list-group-item.disabled:focus .list-group-item-heading { - color: inherit; } - .list-group-item.disabled .list-group-item-text, .list-group-item.disabled:hover .list-group-item-text, .list-group-item.disabled:focus .list-group-item-text { - color: #999999; } -.list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { - z-index: 2; - color: white; - background-color: #c72929; - border-color: #c72929; } - .list-group-item.active .list-group-item-heading, - .list-group-item.active .list-group-item-heading > small, - .list-group-item.active .list-group-item-heading > .small, .list-group-item.active:hover .list-group-item-heading, - .list-group-item.active:hover .list-group-item-heading > small, - .list-group-item.active:hover .list-group-item-heading > .small, .list-group-item.active:focus .list-group-item-heading, - .list-group-item.active:focus .list-group-item-heading > small, - .list-group-item.active:focus .list-group-item-heading > .small { - color: inherit; } - .list-group-item.active .list-group-item-text, .list-group-item.active:hover .list-group-item-text, .list-group-item.active:focus .list-group-item-text { - color: #f4c8c8; } - -.list-group-item-success { - color: #468847; - background-color: #dff0d8; } - -a.list-group-item-success { - color: #468847; } - a.list-group-item-success .list-group-item-heading { - color: inherit; } - a.list-group-item-success:hover, a.list-group-item-success:focus { - color: #468847; - background-color: #d0e9c6; } - a.list-group-item-success.active, a.list-group-item-success.active:hover, a.list-group-item-success.active:focus { - color: #fff; - background-color: #468847; - border-color: #468847; } - -.list-group-item-info { - color: #3a87ad; - background-color: #d9edf7; } - -a.list-group-item-info { - color: #3a87ad; } - a.list-group-item-info .list-group-item-heading { - color: inherit; } - a.list-group-item-info:hover, a.list-group-item-info:focus { - color: #3a87ad; - background-color: #c4e3f3; } - a.list-group-item-info.active, a.list-group-item-info.active:hover, a.list-group-item-info.active:focus { - color: #fff; - background-color: #3a87ad; - border-color: #3a87ad; } - -.list-group-item-warning { - color: #c09853; - background-color: #fcf8e3; } - -a.list-group-item-warning { - color: #c09853; } - a.list-group-item-warning .list-group-item-heading { - color: inherit; } - a.list-group-item-warning:hover, a.list-group-item-warning:focus { - color: #c09853; - background-color: #faf2cc; } - a.list-group-item-warning.active, a.list-group-item-warning.active:hover, a.list-group-item-warning.active:focus { - color: #fff; - background-color: #c09853; - border-color: #c09853; } - -.list-group-item-danger { - color: #b94a48; - background-color: #f2dede; } - -a.list-group-item-danger { - color: #b94a48; } - a.list-group-item-danger .list-group-item-heading { - color: inherit; } - a.list-group-item-danger:hover, a.list-group-item-danger:focus { - color: #b94a48; - background-color: #ebcccc; } - a.list-group-item-danger.active, a.list-group-item-danger.active:hover, a.list-group-item-danger.active:focus { - color: #fff; - background-color: #b94a48; - border-color: #b94a48; } - -.list-group-item-heading { - margin-top: 0; - margin-bottom: 5px; } - -.list-group-item-text { - margin-bottom: 0; - line-height: 1.3; } - -.panel { - margin-bottom: 20px; - background-color: white; - border: 1px solid transparent; - border-radius: 4px; - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); } - -.panel-body { - padding: 15px; } - .panel-body:before, .panel-body:after { - content: " "; - display: table; } - .panel-body:after { - clear: both; } - -.panel-heading { - padding: 10px 15px; - border-bottom: 1px solid transparent; - border-top-right-radius: 3px; - border-top-left-radius: 3px; } - .panel-heading > .dropdown .dropdown-toggle { - color: inherit; } - -.panel-title { - margin-top: 0; - margin-bottom: 0; - font-size: 16px; - color: inherit; } - .panel-title > a { - color: inherit; } - -.panel-footer { - padding: 10px 15px; - background-color: whitesmoke; - border-top: 1px solid #dddddd; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; } - -.panel > .list-group { - margin-bottom: 0; } - .panel > .list-group .list-group-item { - border-width: 1px 0; - border-radius: 0; } - .panel > .list-group:first-child .list-group-item:first-child { - border-top: 0; - border-top-right-radius: 3px; - border-top-left-radius: 3px; } - .panel > .list-group:last-child .list-group-item:last-child { - border-bottom: 0; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; } - -.panel-heading + .list-group .list-group-item:first-child { - border-top-width: 0; } - -.list-group + .panel-footer { - border-top-width: 0; } - -.panel > .table, -.panel > .table-responsive > .table, -.panel > .panel-collapse > .table { - margin-bottom: 0; } -.panel > .table:first-child, -.panel > .table-responsive:first-child > .table:first-child { - border-top-right-radius: 3px; - border-top-left-radius: 3px; } - .panel > .table:first-child > thead:first-child > tr:first-child td:first-child, - .panel > .table:first-child > thead:first-child > tr:first-child th:first-child, - .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, - .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, - .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, - .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, - .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, - .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { - border-top-left-radius: 3px; } - .panel > .table:first-child > thead:first-child > tr:first-child td:last-child, - .panel > .table:first-child > thead:first-child > tr:first-child th:last-child, - .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, - .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, - .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, - .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, - .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, - .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { - border-top-right-radius: 3px; } -.panel > .table:last-child, -.panel > .table-responsive:last-child > .table:last-child { - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; } - .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, - .panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, - .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, - .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, - .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, - .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, - .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, - .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { - border-bottom-left-radius: 3px; } - .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, - .panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, - .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, - .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, - .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, - .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, - .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, - .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { - border-bottom-right-radius: 3px; } -.panel > .panel-body + .table, -.panel > .panel-body + .table-responsive { - border-top: 1px solid #dddddd; } -.panel > .table > tbody:first-child > tr:first-child th, -.panel > .table > tbody:first-child > tr:first-child td { - border-top: 0; } -.panel > .table-bordered, -.panel > .table-responsive > .table-bordered { - border: 0; } - .panel > .table-bordered > thead > tr > th:first-child, - .panel > .table-bordered > thead > tr > td:first-child, - .panel > .table-bordered > tbody > tr > th:first-child, - .panel > .table-bordered > tbody > tr > td:first-child, - .panel > .table-bordered > tfoot > tr > th:first-child, - .panel > .table-bordered > tfoot > tr > td:first-child, - .panel > .table-responsive > .table-bordered > thead > tr > th:first-child, - .panel > .table-responsive > .table-bordered > thead > tr > td:first-child, - .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, - .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, - .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, - .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; } - .panel > .table-bordered > thead > tr > th:last-child, - .panel > .table-bordered > thead > tr > td:last-child, - .panel > .table-bordered > tbody > tr > th:last-child, - .panel > .table-bordered > tbody > tr > td:last-child, - .panel > .table-bordered > tfoot > tr > th:last-child, - .panel > .table-bordered > tfoot > tr > td:last-child, - .panel > .table-responsive > .table-bordered > thead > tr > th:last-child, - .panel > .table-responsive > .table-bordered > thead > tr > td:last-child, - .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, - .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, - .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, - .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; } - .panel > .table-bordered > thead > tr:first-child > td, - .panel > .table-bordered > thead > tr:first-child > th, - .panel > .table-bordered > tbody > tr:first-child > td, - .panel > .table-bordered > tbody > tr:first-child > th, - .panel > .table-responsive > .table-bordered > thead > tr:first-child > td, - .panel > .table-responsive > .table-bordered > thead > tr:first-child > th, - .panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, - .panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { - border-bottom: 0; } - .panel > .table-bordered > tbody > tr:last-child > td, - .panel > .table-bordered > tbody > tr:last-child > th, - .panel > .table-bordered > tfoot > tr:last-child > td, - .panel > .table-bordered > tfoot > tr:last-child > th, - .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, - .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, - .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, - .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { - border-bottom: 0; } -.panel > .table-responsive { - border: 0; - margin-bottom: 0; } - -.panel-group { - margin-bottom: 20px; } - .panel-group .panel { - margin-bottom: 0; - border-radius: 4px; } - .panel-group .panel + .panel { - margin-top: 5px; } - .panel-group .panel-heading { - border-bottom: 0; } - .panel-group .panel-heading + .panel-collapse > .panel-body { - border-top: 1px solid #dddddd; } - .panel-group .panel-footer { - border-top: 0; } - .panel-group .panel-footer + .panel-collapse .panel-body { - border-bottom: 1px solid #dddddd; } - -.panel-default { - border-color: #dddddd; } - .panel-default > .panel-heading { - color: #333333; - background-color: whitesmoke; - border-color: #dddddd; } - .panel-default > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #dddddd; } - .panel-default > .panel-heading .badge { - color: whitesmoke; - background-color: #333333; } - .panel-default > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #dddddd; } - -.panel-primary { - border-color: #c72929; } - .panel-primary > .panel-heading { - color: white; - background-color: #c72929; - border-color: #c72929; } - .panel-primary > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #c72929; } - .panel-primary > .panel-heading .badge { - color: #c72929; - background-color: white; } - .panel-primary > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #c72929; } - -.panel-success { - border-color: #d6e9c6; } - .panel-success > .panel-heading { - color: #468847; - background-color: #dff0d8; - border-color: #d6e9c6; } - .panel-success > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #d6e9c6; } - .panel-success > .panel-heading .badge { - color: #dff0d8; - background-color: #468847; } - .panel-success > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #d6e9c6; } - -.panel-info { - border-color: #bce8f1; } - .panel-info > .panel-heading { - color: #3a87ad; - background-color: #d9edf7; - border-color: #bce8f1; } - .panel-info > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #bce8f1; } - .panel-info > .panel-heading .badge { - color: #d9edf7; - background-color: #3a87ad; } - .panel-info > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #bce8f1; } - -.panel-warning { - border-color: #faebcc; } - .panel-warning > .panel-heading { - color: #c09853; - background-color: #fcf8e3; - border-color: #faebcc; } - .panel-warning > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #faebcc; } - .panel-warning > .panel-heading .badge { - color: #fcf8e3; - background-color: #c09853; } - .panel-warning > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #faebcc; } - -.panel-danger { - border-color: #ebccd1; } - .panel-danger > .panel-heading { - color: #b94a48; - background-color: #f2dede; - border-color: #ebccd1; } - .panel-danger > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #ebccd1; } - .panel-danger > .panel-heading .badge { - color: #f2dede; - background-color: #b94a48; } - .panel-danger > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #ebccd1; } - -.embed-responsive { - position: relative; - display: block; - height: 0; - padding: 0; - overflow: hidden; } - .embed-responsive .embed-responsive-item, - .embed-responsive iframe, - .embed-responsive embed, - .embed-responsive object { - position: absolute; - top: 0; - left: 0; - bottom: 0; - height: 100%; - width: 100%; - border: 0; } - .embed-responsive.embed-responsive-16by9 { - padding-bottom: 56.25%; } - .embed-responsive.embed-responsive-4by3 { - padding-bottom: 75%; } - -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: whitesmoke; - border: 1px solid #e3e3e3; - border-radius: 4px; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); } - .well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, 0.15); } - -.well-lg { - padding: 24px; - border-radius: 6px; } - -.well-sm { - padding: 9px; - border-radius: 3px; } - -.close { - float: right; - font-size: 21px; - font-weight: bold; - line-height: 1; - color: black; - text-shadow: 0 1px 0 white; - opacity: 0.2; - filter: alpha(opacity=20); } - .close:hover, .close:focus { - color: black; - text-decoration: none; - cursor: pointer; - opacity: 0.5; - filter: alpha(opacity=50); } - -button.close { - padding: 0; - cursor: pointer; - background: transparent; - border: 0; - -webkit-appearance: none; } - -.modal-open { - overflow: hidden; } - -.modal { - display: none; - overflow: hidden; - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1050; - -webkit-overflow-scrolling: touch; - outline: 0; } - .modal.fade .modal-dialog { - -webkit-transform: translate3d(0, -25%, 0); - transform: translate3d(0, -25%, 0); - -webkit-transition: -webkit-transform 0.3s ease-out; - transition: transform 0.3s ease-out; } - .modal.in .modal-dialog { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); } - -.modal-open .modal { - overflow-x: hidden; - overflow-y: auto; } - -.modal-dialog { - position: relative; - width: auto; - margin: 10px; } - -.modal-content { - position: relative; - background-color: white; - border: 1px solid #999999; - border: 1px solid rgba(0, 0, 0, 0.2); - border-radius: 6px; - box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); - background-clip: padding-box; - outline: 0; } - -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: black; } - .modal-backdrop.fade { - opacity: 0; - filter: alpha(opacity=0); } - .modal-backdrop.in { - opacity: 0.5; - filter: alpha(opacity=50); } - -.modal-header { - padding: 15px; - border-bottom: 1px solid #e5e5e5; - min-height: 16.42857px; } - -.modal-header .close { - margin-top: -2px; } - -.modal-title { - margin: 0; - line-height: 1.42857; } - -.modal-body { - position: relative; - padding: 20px; } - -.modal-footer { - padding: 20px; - text-align: right; - border-top: 1px solid #e5e5e5; } - .modal-footer:before, .modal-footer:after { - content: " "; - display: table; } - .modal-footer:after { - clear: both; } - .modal-footer .btn + .btn { - margin-left: 5px; - margin-bottom: 0; } - .modal-footer .btn-group .btn + .btn { - margin-left: -1px; } - .modal-footer .btn-block + .btn-block { - margin-left: 0; } - -.modal-scrollbar-measure { - position: absolute; - top: -9999px; - width: 50px; - height: 50px; - overflow: scroll; } - -@media (min-width: 768px) { - .modal-dialog { - width: 600px; - margin: 30px auto; } - - .modal-content { - box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); } - - .modal-sm { - width: 300px; } } -@media (min-width: 992px) { - .modal-lg { - width: 900px; } } -.tooltip { - position: absolute; - z-index: 1030; - display: block; - visibility: visible; - font-size: 12px; - line-height: 1.4; - opacity: 0; - filter: alpha(opacity=0); } - .tooltip.in { - opacity: 0.9; - filter: alpha(opacity=90); } - .tooltip.top { - margin-top: -3px; - padding: 5px 0; } - .tooltip.right { - margin-left: 3px; - padding: 0 5px; } - .tooltip.bottom { - margin-top: 3px; - padding: 5px 0; } - .tooltip.left { - margin-left: -3px; - padding: 0 5px; } - -.tooltip-inner { - max-width: 200px; - padding: 3px 8px; - color: white; - text-align: center; - text-decoration: none; - background-color: black; - border-radius: 4px; } - -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; } - -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-width: 5px 5px 0; - border-top-color: black; } -.tooltip.top-left .tooltip-arrow { - bottom: 0; - left: 5px; - border-width: 5px 5px 0; - border-top-color: black; } -.tooltip.top-right .tooltip-arrow { - bottom: 0; - right: 5px; - border-width: 5px 5px 0; - border-top-color: black; } -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-width: 5px 5px 5px 0; - border-right-color: black; } -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-width: 5px 0 5px 5px; - border-left-color: black; } -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-width: 0 5px 5px; - border-bottom-color: black; } -.tooltip.bottom-left .tooltip-arrow { - top: 0; - left: 5px; - border-width: 0 5px 5px; - border-bottom-color: black; } -.tooltip.bottom-right .tooltip-arrow { - top: 0; - right: 5px; - border-width: 0 5px 5px; - border-bottom-color: black; } - -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1010; - display: none; - max-width: 276px; - padding: 1px; - text-align: left; - background-color: white; - background-clip: padding-box; - border: 1px solid #cccccc; - border: 1px solid rgba(0, 0, 0, 0.2); - border-radius: 6px; - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - white-space: normal; } - .popover.top { - margin-top: -10px; } - .popover.right { - margin-left: 10px; } - .popover.bottom { - margin-top: 10px; } - .popover.left { - margin-left: -10px; } - -.popover-title { - margin: 0; - padding: 8px 14px; - font-size: 14px; - font-weight: normal; - line-height: 18px; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - border-radius: 5px 5px 0 0; } - -.popover-content { - padding: 9px 14px; } - -.popover > .arrow, .popover > .arrow:after { - position: absolute; - display: block; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; } - -.popover > .arrow { - border-width: 11px; } - -.popover > .arrow:after { - border-width: 10px; - content: ""; } - -.popover.top > .arrow { - left: 50%; - margin-left: -11px; - border-bottom-width: 0; - border-top-color: #999999; - border-top-color: rgba(0, 0, 0, 0.25); - bottom: -11px; } - .popover.top > .arrow:after { - content: " "; - bottom: 1px; - margin-left: -10px; - border-bottom-width: 0; - border-top-color: white; } -.popover.right > .arrow { - top: 50%; - left: -11px; - margin-top: -11px; - border-left-width: 0; - border-right-color: #999999; - border-right-color: rgba(0, 0, 0, 0.25); } - .popover.right > .arrow:after { - content: " "; - left: 1px; - bottom: -10px; - border-left-width: 0; - border-right-color: white; } -.popover.bottom > .arrow { - left: 50%; - margin-left: -11px; - border-top-width: 0; - border-bottom-color: #999999; - border-bottom-color: rgba(0, 0, 0, 0.25); - top: -11px; } - .popover.bottom > .arrow:after { - content: " "; - top: 1px; - margin-left: -10px; - border-top-width: 0; - border-bottom-color: white; } -.popover.left > .arrow { - top: 50%; - right: -11px; - margin-top: -11px; - border-right-width: 0; - border-left-color: #999999; - border-left-color: rgba(0, 0, 0, 0.25); } - .popover.left > .arrow:after { - content: " "; - right: 1px; - border-right-width: 0; - border-left-color: white; - bottom: -10px; } - -.carousel { - position: relative; } - -.carousel-inner { - position: relative; - overflow: hidden; - width: 100%; } - .carousel-inner > .item { - display: none; - position: relative; - -webkit-transition: 0.6s ease-in-out left; - transition: 0.6s ease-in-out left; } - .carousel-inner > .item > img, - .carousel-inner > .item > a > img { - display: block; - width: 100% \9; - max-width: 100%; - height: auto; - line-height: 1; } - .carousel-inner > .active, - .carousel-inner > .next, - .carousel-inner > .prev { - display: block; } - .carousel-inner > .active { - left: 0; } - .carousel-inner > .next, - .carousel-inner > .prev { - position: absolute; - top: 0; - width: 100%; } - .carousel-inner > .next { - left: 100%; } - .carousel-inner > .prev { - left: -100%; } - .carousel-inner > .next.left, - .carousel-inner > .prev.right { - left: 0; } - .carousel-inner > .active.left { - left: -100%; } - .carousel-inner > .active.right { - left: 100%; } - -.carousel-control { - position: absolute; - top: 0; - left: 0; - bottom: 0; - width: 15%; - opacity: 0.5; - filter: alpha(opacity=50); - font-size: 20px; - color: white; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); } - .carousel-control.left { - background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); - background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001))); - background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); } - .carousel-control.right { - left: auto; - right: 0; - background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); - background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5))); - background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); } - .carousel-control:hover, .carousel-control:focus { - outline: 0; - color: white; - text-decoration: none; - opacity: 0.9; - filter: alpha(opacity=90); } - .carousel-control .icon-prev, - .carousel-control .icon-next, - .carousel-control .glyphicon-chevron-left, - .carousel-control .glyphicon-chevron-right { - position: absolute; - top: 50%; - z-index: 5; - display: inline-block; } - .carousel-control .icon-prev, - .carousel-control .glyphicon-chevron-left { - left: 50%; - margin-left: -10px; } - .carousel-control .icon-next, - .carousel-control .glyphicon-chevron-right { - right: 50%; - margin-right: -10px; } - .carousel-control .icon-prev, - .carousel-control .icon-next { - width: 20px; - height: 20px; - margin-top: -10px; - font-family: serif; } - .carousel-control .icon-prev:before { - content: '\2039'; } - .carousel-control .icon-next:before { - content: '\203a'; } - -.carousel-indicators { - position: absolute; - bottom: 10px; - left: 50%; - z-index: 15; - width: 60%; - margin-left: -30%; - padding-left: 0; - list-style: none; - text-align: center; } - .carousel-indicators li { - display: inline-block; - width: 10px; - height: 10px; - margin: 1px; - text-indent: -999px; - border: 1px solid white; - border-radius: 10px; - cursor: pointer; - background-color: #000 \9; - background-color: transparent; } - .carousel-indicators .active { - margin: 0; - width: 12px; - height: 12px; - background-color: white; } - -.carousel-caption { - position: absolute; - left: 15%; - right: 15%; - bottom: 20px; - z-index: 10; - padding-top: 20px; - padding-bottom: 20px; - color: white; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); } - .carousel-caption .btn { - text-shadow: none; } - -@media screen and (min-width: 768px) { - .carousel-control .glyphicon-chevron-left, - .carousel-control .glyphicon-chevron-right, - .carousel-control .icon-prev, - .carousel-control .icon-next { - width: 30px; - height: 30px; - margin-top: -15px; - font-size: 30px; } - .carousel-control .glyphicon-chevron-left, - .carousel-control .icon-prev { - margin-left: -15px; } - .carousel-control .glyphicon-chevron-right, - .carousel-control .icon-next { - margin-right: -15px; } - - .carousel-caption { - left: 20%; - right: 20%; - padding-bottom: 30px; } - - .carousel-indicators { - bottom: 20px; } } -.clearfix:before, .clearfix:after { - content: " "; - display: table; } -.clearfix:after { - clear: both; } - -.center-block { - display: block; - margin-left: auto; - margin-right: auto; } - -.pull-right { - float: right !important; } - -.pull-left { - float: left !important; } - -.hide { - display: none !important; } - -.show { - display: block !important; } - -.invisible { - visibility: hidden; } - -.text-hide { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; } - -.hidden { - display: none !important; - visibility: hidden !important; } - -.affix { - position: fixed; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); } - -@-ms-viewport { - width: device-width; } -.visible-xs, .visible-sm, .visible-md, .visible-lg { - display: none !important; } - -.visible-xs-block, -.visible-xs-inline, -.visible-xs-inline-block, -.visible-sm-block, -.visible-sm-inline, -.visible-sm-inline-block, -.visible-md-block, -.visible-md-inline, -.visible-md-inline-block, -.visible-lg-block, -.visible-lg-inline, -.visible-lg-inline-block { - display: none !important; } - -@media (max-width: 767px) { - .visible-xs { - display: block !important; } - - table.visible-xs { - display: table; } - - tr.visible-xs { - display: table-row !important; } - - th.visible-xs, - td.visible-xs { - display: table-cell !important; } } -@media (max-width: 767px) { - .visible-xs-block { - display: block !important; } } - -@media (max-width: 767px) { - .visible-xs-inline { - display: inline !important; } } - -@media (max-width: 767px) { - .visible-xs-inline-block { - display: inline-block !important; } } - -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm { - display: block !important; } - - table.visible-sm { - display: table; } - - tr.visible-sm { - display: table-row !important; } - - th.visible-sm, - td.visible-sm { - display: table-cell !important; } } -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm-block { - display: block !important; } } - -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm-inline { - display: inline !important; } } - -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm-inline-block { - display: inline-block !important; } } - -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md { - display: block !important; } - - table.visible-md { - display: table; } - - tr.visible-md { - display: table-row !important; } - - th.visible-md, - td.visible-md { - display: table-cell !important; } } -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md-block { - display: block !important; } } - -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md-inline { - display: inline !important; } } - -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md-inline-block { - display: inline-block !important; } } - -@media (min-width: 1200px) { - .visible-lg { - display: block !important; } - - table.visible-lg { - display: table; } - - tr.visible-lg { - display: table-row !important; } - - th.visible-lg, - td.visible-lg { - display: table-cell !important; } } -@media (min-width: 1200px) { - .visible-lg-block { - display: block !important; } } - -@media (min-width: 1200px) { - .visible-lg-inline { - display: inline !important; } } - -@media (min-width: 1200px) { - .visible-lg-inline-block { - display: inline-block !important; } } - -@media (max-width: 767px) { - .hidden-xs { - display: none !important; } } -@media (min-width: 768px) and (max-width: 991px) { - .hidden-sm { - display: none !important; } } -@media (min-width: 992px) and (max-width: 1199px) { - .hidden-md { - display: none !important; } } -@media (min-width: 1200px) { - .hidden-lg { - display: none !important; } } -.visible-print { - display: none !important; } - -@media print { - .visible-print { - display: block !important; } - - table.visible-print { - display: table; } - - tr.visible-print { - display: table-row !important; } - - th.visible-print, - td.visible-print { - display: table-cell !important; } } -.visible-print-block { - display: none !important; } - @media print { - .visible-print-block { - display: block !important; } } - -.visible-print-inline { - display: none !important; } - @media print { - .visible-print-inline { - display: inline !important; } } - -.visible-print-inline-block { - display: none !important; } - @media print { - .visible-print-inline-block { - display: inline-block !important; } } - -@media print { - .hidden-print { - display: none !important; } } -/* Main SASS CSS file */ -input.ng-invalid { - border: 1px solid red !important; } - -.navbar-nav li a { - font-size: 1.1em; } - -.navbar-bottom { - margin-bottom: 5px !important; } - -.navbar-brand { - line-height: 1.7em !important; - padding-top: 10px !important; - padding-right: 20px !important; - padding-left: 5px !important; - padding-bottom: 0px !important; } - -.fa-12 { - font-size: 1.3em; } - -.container33 { - display: inline-block; - width: 100%; } - .container33 .tleft { - float: left; - width: 60%; - text-align: left; } - .container33 .tright { - float: left; - width: 20%; - text-align: right; } - .container33 .tcenter { - float: left; - width: 20%; - text-align: center; } - .container33 .platform-left { - float: left; - width: 20%; - text-align: left; } - .container33 .time-right { - margin-top: 5px; - float: left; - width: 20%; - text-align: right; } - .container33 .station-middle { - margin-top: 5px; - float: left; - width: 50%; - text-align: left; } - .container33 .delay-right { - margin-top: 5px; - float: left; - width: 10%; - text-align: left; } - -.liveboard-list { - font-size: 1.3em; } - -.delay { - color: red; } - -.max-w5 { - max-width: 480px !important; - margin-left: auto !important; - margin-right: auto !important; } - -.floatright { - float: right; - clear: both; } - -.center { - text-align: center; } - -.list-group { - margin-bottom: 0px !important; } - -.loader { - margin: 6em auto; - font-size: 10px; - position: relative; - text-indent: -9999em; - border-top: 1.1em solid rgba(0, 0, 0, 0.2); - border-right: 1.1em solid rgba(0, 0, 0, 0.2); - border-bottom: 1.1em solid rgba(0, 0, 0, 0.2); - border-left: 1.1em solid #C72929; - -webkit-animation: load8 1.1s infinite linear; - animation: load8 1.1s infinite linear; } - -.loader, -.loader:after { - border-radius: 50%; - width: 10em; - height: 10em; } - -@-webkit-keyframes load8 { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); } - - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); } } -@keyframes load8 { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); } - - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); } } -.btn-wide { - width: 100% !important; } - -.btn-50 { - width: 50% !important; } - -.btn-botm { - margin-bottom: 15px; } - -.planner-time { - font-size: 1.3em; - color: #C72929; - margin-right: 15px; - width: 50%; } - -.planner-station { - width: 50%; - font-size: 1.2em; - margin-right: 15px; } - -.delay-route { - color: red; } - -.badge { - font-size: 1.3em; } - -.navbar-name { - font-size: 1.2em; - font-family: "PT Sans", "Helvetica Neue", Helvetica, Arial, sans-serif !important; - font-weight: bold; } - -.irail-logo { - position: relative; - top: -3px; } - -.datepicker .btn-info.active { - background-color: #C72929 !important; - border-color: #C72929 !important; } - .datepicker .btn-info.active span.text-info { - color: #FFF !important; } - -.ul-lg li { - font-size: 1.4em; } - -/* Animations */ -.row.ng-hide-remove { - -webkit-animation: fadeIn 0.7s; - animation: fadeIn 0.7s; } - -a.bounceIn.ng-hide-remove { - -webkit-animation: bounceIn 0.7s; - animation: bounceIn 0.7s; } - -.row.loading.ng-hide-remove { - -webkit-animation: bounceIn 0.7s; - animation: bounceIn 0.7s; } - -.row.routeplanner.ng-hide-remove { - -webkit-animation: fadeInDown 0.7s; - animation: fadeInDown 0.7s; } - -.label-lg { - font-size: 1.5em; } diff --git a/public/app/js/app.js b/public/app/js/app.js deleted file mode 100644 index e9c88003..00000000 --- a/public/app/js/app.js +++ /dev/null @@ -1,36 +0,0 @@ -/*-------------------------------------------------------- - * SET UP AS ANGULAR APP - *-------------------------------------------------------*/ - -var irailapp = angular.module('irailapp', - [ - 'ui.bootstrap', - 'ngAnimate', - 'irailapp.controllers' - ] -); - -angular.module('irailapp.controllers', []); - -/** - * Helper method to get a URL parameter - * @param {[type]} sParam [description] - */ -function GetURLParameter(sParam){ - var sPageURL = window.location.search.substring(1); - var sURLVariables = sPageURL.split('&'); - for (var i = 0; i < sURLVariables.length; i=i+1) - { - var sParameterName = sURLVariables[i].split('='); - if (sParameterName[0] === sParam) - { - return sParameterName[1]; - } - } -} - -$(function(){ - if (window.innerWidth > 500){ - $('#collapseCalendar').addClass('in'); - } -}); \ No newline at end of file diff --git a/public/app/js/iRail/Controllers/PlannerCtrl.js b/public/app/js/iRail/Controllers/PlannerCtrl.js deleted file mode 100644 index bbd67e1e..00000000 --- a/public/app/js/iRail/Controllers/PlannerCtrl.js +++ /dev/null @@ -1,283 +0,0 @@ -var PlannerCtrl = function ($scope, $http, $filter, $timeout, $window) { - - /*-------------------------------------------------------- - * INITIAL VARIABLES & SETUP - *-------------------------------------------------------*/ - - // Init departure and destination as undefined - $scope.departure = undefined; - $scope.destination = undefined; - // Time and date are automatically set - $scope.mytime = new Date(); - $scope.mydate = new Date(); - // Timeoption defaults to arrive at set hour - $scope.timeoption = "depart"; - // Default states - $scope.planning = true; // When planning is set to true, you can enter stations and set time - $scope.loading = false; // When loading is set to true, you see a spinner - $scope.results = false; // When results is set to true, results are displayed - - /*-------------------------------------------------------- - * FUNCTIONS THAT CAN BE CALLED - *-------------------------------------------------------*/ - - $(document).keypress(function (e) { - if(e.which === 13 && $scope.planning === true){ - $("#confirm").focus(); - } - }); - - /** - * Check if we can dump the data - */ - /*jshint quotmark: double */ - $scope.confirmRouteSearch = function () { - if ($scope.departure && $scope.destination && "@id" in $scope.departure && "@id" in $scope.destination) { - $scope.data = { - "departure" : decodeURIComponent($scope.departure), - "destination" : decodeURIComponent($scope.destination), - "date" : $filter("date")($scope.mydate, "shortDate"), - "time" : $filter("date")($scope.mytime, "HH:mm"), - "timeoption" : $scope.timeoption - }; - // Set app as loading - $scope.results = false; - $scope.planning = false; - $scope.loading = true; - - window.history.pushState("departure", "iRail.be", "?to=" + encodeURIComponent($scope.destination["@id"]) - + "&from=" + encodeURIComponent($scope.departure["@id"]) - + "&date=" + ($filter("date")($scope.mydate, "ddMMyy")) - + "&time=" + ($filter("date")($scope.mytime, "HHmm")) - + "&timeSel=" + $scope.timeoption - ); - - var $urlInWindow = document.URL; - - $http.get($urlInWindow) - .success(function (data) { - $scope.parseResults(data); - - $scope.loading = false; - $scope.results = true; - }) - .error(function () { - $scope.error = true; - $scope.loading = false; - $scope.results = false; - $scope.planning = false; - }); - } - }; - - /** - * Used to interpret the new station id - * @param string - */ - $scope.findStationById = function (suppliedIdentifierString) { - for (var i = 0, len = $scope.stations['@graph'].length; i < len; i=i+1) { - if (($scope.stations["@graph"][i]["@id"]).indexOf(suppliedIdentifierString) !== -1) { - return $scope.stations["@graph"][i]; - } - } - }; - - - $scope.getStations = function(query) { - return $http.get('/stations/NMBS', { - params: { - q: query - } - }).then(function(res){ - var lang = $('html').attr("lang"); - - for( i in res["data"]["@graph"] ){ - var station = res["data"]["@graph"][i]; - - //only if there are alternatives - if (station["alternative"]){ - //array of alternatives - if ( station["alternative"] instanceof Array ){ - var j = 0; - while ( j < station["alternative"].length - && station["alternative"][j]["@language"] != lang){ - j++; - } - - if ( j < station["alternative"].length ){ //one found in right lang => switch - station["name"] = station["alternative"][j]["@value"]; - } - }else if (station["alternative"]["@language"] == lang){ //single alternative - station["name"] = station["alternative"]["@value"]; - } - } - } - - return res["data"]["@graph"]; - }); - }; - - /** - * Parse the results - * @param data - */ - $scope.parseResults = function (data) { - if ($scope.timeoption === "arrive") { - // Reverse connections - // First result should be close to your set time - data.connection.reverse(); - } - - $scope.connections = data.connection; - - }; - - /** - * Save the entered data and request - */ - $scope.save = function () { - // Check if time and date are set - if ($scope.mydate === undefined) { - $scope.data = null; - return; - } - if ($scope.mytime === undefined) { - $scope.data = null; - return; - } - // Check if departure and destination are bound - - - if ($scope.departure && $scope.destination) { - $scope.confirmRouteSearch(); - // If not bound, try to bind data - } else { - for (var i = 0, len = $scope.stations["@graph"].length; i < len; i=i+1) { - if (($scope.stations["@graph"][i].name.toLowerCase()).indexOf($scope.departure.toLowerCase()) !== -1) { - arr = $scope.stations["@graph"]; - $scope.departure = arr[i]; - } - if (($scope.stations["@graph"][i].name.toLowerCase()).indexOf($scope.destination.toLowerCase()) !== -1) { - arr = $scope.stations["@graph"]; - $scope.destination = arr[i]; - } - } - $scope.confirmRouteSearch(); - } - // TODO: Check if select box has been set - }; - - /** - * Resets the route planner to default values - */ - $scope.resetplanner = function (e) { - $window.location.reload(); - }; - - $scope.reverse = function () { - var destination = $scope.destination; - $scope.destination = $scope.departure; - $scope.departure = destination; - $scope.confirmRouteSearch(); - }; - - $scope.earlier = function () { - var itime = $scope.mytime; - $scope.mytime = new Date(itime.setHours(itime.getHours()-1)); - $scope.confirmRouteSearch(); - }; - - $scope.later = function () { - var itime = $scope.mytime; - $scope.mytime = new Date(itime.setHours(itime.getHours()+1)); - $scope.confirmRouteSearch(); - }; - - $scope.earliest = function () { - var itime = $scope.mytime; - $scope.timeoption = "depart"; - $scope.mytime = new Date(itime.setHours(0, 0, 0)); - $scope.confirmRouteSearch(); - }; - - $scope.latest = function () { - var itime = $scope.mytime; - $scope.timeoption = "arrive"; - $scope.mytime = new Date(itime.setHours(23, 59, 0)); - $scope.confirmRouteSearch(); - }; - - // Fetch stations via HTTP GET request - $http.get("stations/NMBS",{header:{"Accept":"application/json"}}).success(function (data) { - $scope.stations = data; - // Check if URL params are set - var dep = decodeURIComponent(GetURLParameter("from")); - var des = decodeURIComponent(GetURLParameter("to")); - var urltime = GetURLParameter("time"); - var dateparam = GetURLParameter("date"); - var timeoption = GetURLParameter("timeSel"); - if (dep !== "undefined" && des !== "undefined") { - // Get departure and destination id from URL - $scope.departure = $scope.findStationById(dep); - $scope.destination = $scope.findStationById(des); - // Get date - var parts = /^(\d\d)(\d\d)(\d{2})$/.exec(dateparam); - $scope.mydate = new Date( 20 + parts[3], parts[2]-1, parts[1] ); - // Get time - var dat = new Date(), time = urltime.split(/^(\d\d)(\d\d)$/); - dat.setHours(time[1]); - dat.setMinutes(time[2]); - $scope.mytime = dat; - // Get time option - if (timeoption === "arrive") { - $scope.timeoption = "arrive"; - } - else { - $scope.timeoption = "depart"; - } - $scope.confirmRouteSearch(); - } else if (GetURLParameter("from") !== "undefined") { - try { - $scope.departure = $scope.findStationById(decodeURIComponent(GetURLParameter("from"))); - } - catch (ex) { - //console.log("Could not link departure station from URL."); - } - } else if (GetURLParameter("to") !== "undefined") { - try { - $scope.destination = $scope.findStationById(decodeURIComponent(GetURLParameter("to"))); - } - catch (ex) { - //console.log("Could not link destination station from URL."); - } - } - }); - $scope.formatDuration = function(minutes){ - //return minutes; - - var hours = Math.floor(minutes/60); - var minutes = Math.floor(minutes%60); - - var str = ""; - if ( hours < 10 ){ - str += "0"; - } - str += hours + ":"; - if ( minutes < 10 ){ - str += "0"; - } - str += minutes; - - return str; - }; -}; - -angular.module("irailapp.controllers") - .controller("PlannerCtrl", [ - "$scope", - "$http", - "$filter", - "$timeout", - "$window", - PlannerCtrl - ]); diff --git a/public/app/js/iRail/Controllers/StationLiveBoardCtrl.js b/public/app/js/iRail/Controllers/StationLiveBoardCtrl.js deleted file mode 100644 index 16e0c63a..00000000 --- a/public/app/js/iRail/Controllers/StationLiveBoardCtrl.js +++ /dev/null @@ -1,53 +0,0 @@ -var StationLiveBoardCtrl = function ($scope, $http, $filter, $timeout) { - $scope.loading = true; - - var config = {headers: {'Accept': 'application/ld+json'}}; - - $http.get('', config).success( function (data) { - $scope.stations = data; - var location = document.URL; - // Request the URL - $http.get(document.URL, config) - .success( function (data) { - $scope.liveboardData = data; - $scope.results = true; - $scope.loading = false; - $scope.error = false; - }).error( function (ex) { - $scope.results = false; - $scope.loading = false; - $scope.error = true; - }); - }); - $scope.findStationById = function(suppliedIdentifierString){ - for (var i = 0, len = $scope.stations.stations.length; i < len; i=i+1) { - if (($scope.stations.stations[i].id.toLowerCase()).indexOf(suppliedIdentifierString) !== -1) { - return $scope.stations.stations[i]; - } - } - }; - - $scope.resetplanner = function () { - // Should not do anything - }; - - /** - * Helper method to determine if a result should be highlighted or not - * - * @param index - * @returns {boolean} - */ - $scope.isSelected = function (index) { - return (index + 1 ) == GetURLParameter('result'); - } - -}; - -angular.module('irailapp.controllers') - .controller('StationLiveboardCtrl', [ - '$scope', - '$http', - '$filter', - '$timeout', - StationLiveBoardCtrl - ]); diff --git a/public/app/js/iRail/Controllers/StationSearchCtrl.js b/public/app/js/iRail/Controllers/StationSearchCtrl.js deleted file mode 100644 index 1fa043d9..00000000 --- a/public/app/js/iRail/Controllers/StationSearchCtrl.js +++ /dev/null @@ -1,55 +0,0 @@ -var StationSearchCtrl = function ($scope, $http, $filter, $timeout) { - - $scope.getStations = function(query) { - return $http.get('', { - params: { - q: query - } - }).then(function(res){ - var lang = $('html').attr("lang"); - - for( i in res["data"]["@graph"] ){ - var station = res["data"]["@graph"][i]; - - //only if there are alternatives - if (station["alternative"]){ - //array of alternatives - if ( station["alternative"] instanceof Array ){ - var j = 0; - while ( j < station["alternative"].length - && station["alternative"][j]["@language"] != lang){ - j++; - } - - if ( j < station["alternative"].length ){ //one found in right lang => switch - station["name"] = station["alternative"][j]["@value"]; - } - }else if (station["alternative"]["@language"] == lang){ //single alternative - station["name"] = station["alternative"]["@value"]; - } - } - } - - return res["data"]["@graph"]; - }); - }; - - $(document).keypress( function (e) { - if (e.which === 13) { - $('#confirm').focus(); - } - }); - - $scope.resetplanner = function () { - // Should not do anything - }; -}; - -angular.module('irailapp.controllers') - .controller('StationSearchCtrl', [ - '$scope', - '$http', - '$filter', - '$timeout', - StationSearchCtrl - ]); diff --git a/public/app/sass/bootstrap/_variables.scss b/public/app/sass/bootstrap/_variables.scss deleted file mode 100644 index f98352f1..00000000 --- a/public/app/sass/bootstrap/_variables.scss +++ /dev/null @@ -1,637 +0,0 @@ -// -// Variables -// -------------------------------------------------- - - -// Global values -// -------------------------------------------------- - -// Grays -// ------------------------- - -$gray-darker: lighten(#000, 13.5%) !default; // #222 -$gray-dark: lighten(#000, 20%) !default; // #333 -$gray: lighten(#000, 33.5%) !default; // #555 -$gray-light: lighten(#000, 60%) !default; // #999 -$gray-lighter: lighten(#000, 93.5%) !default; // #eee - -// Brand colors -// ------------------------- - -$brand-primary: #C72929 !default; -$brand-success: #5cb85c !default; -$brand-warning: #f0ad4e !default; -$brand-danger: #d9534f !default; -$brand-info: #5bc0de !default; - -// Scaffolding -// ------------------------- - -$body-bg: #fff !default; -$text-color: $gray-dark !default; - -// Links -// ------------------------- - -$link-color: $brand-primary !default; -$link-hover-color: darken($link-color, 15%) !default; - -// Typography -// ------------------------- - -$font-family-sans-serif: "Source Sans Pro", "Helvetica Neue", Helvetica, Arial, sans-serif !default; -$font-family-serif: Georgia, "Times New Roman", Times, serif !default; -$font-family-monospace: Monaco, Menlo, Consolas, "Courier New", monospace !default; -$font-family-base: $font-family-sans-serif !default; - -$font-size-base: 14px !default; -$font-size-large: ceil($font-size-base * 1.25) !default; // ~18px -$font-size-small: ceil($font-size-base * 0.85) !default; // ~12px - -$font-size-h1: floor($font-size-base * 2.6) !default; // ~36px -$font-size-h2: floor($font-size-base * 2.15) !default; // ~30px -$font-size-h3: ceil($font-size-base * 1.7) !default; // ~24px -$font-size-h4: ceil($font-size-base * 1.25) !default; // ~18px -$font-size-h5: $font-size-base !default; -$font-size-h6: ceil($font-size-base * 0.85) !default; // ~12px - -$line-height-base: 1.428571429 !default; // 20/14 -$line-height-computed: floor($font-size-base * $line-height-base) !default; // ~20px - -$headings-font-family: $font-family-base !default; -$headings-font-weight: 500 !default; -$headings-line-height: 1.1 !default; -$headings-color: inherit !default; - - -// Iconography -// ------------------------- - -$icon-font-path: "../fonts/" !default; -$icon-font-name: "glyphicons-halflings-regular" !default; - - -// Components -// ------------------------- -// Based on 14px font-size and 1.428 line-height (~20px to start) - -$padding-base-vertical: 6px !default; -$padding-base-horizontal: 12px !default; - -$padding-large-vertical: 10px !default; -$padding-large-horizontal: 16px !default; - -$padding-small-vertical: 5px !default; -$padding-small-horizontal: 10px !default; - -$line-height-large: 1.33 !default; -$line-height-small: 1.5 !default; - -$border-radius-base: 4px !default; -$border-radius-large: 6px !default; -$border-radius-small: 3px !default; - -$component-active-color: #fff !default; -$component-active-bg: $brand-primary !default; - -$caret-width-base: 4px !default; -$caret-width-large: 5px !default; - -// Tables -// ------------------------- - -$table-cell-padding: 8px !default; -$table-condensed-cell-padding: 5px !default; - -$table-bg: transparent !default; // overall background-color -$table-bg-accent: #f9f9f9 !default; // for striping -$table-bg-hover: #f5f5f5 !default; -$table-bg-active: $table-bg-hover !default; - -$table-border-color: #ddd !default; // table and cell border - - -// Buttons -// ------------------------- - -$btn-font-weight: normal !default; - -$btn-default-color: #333 !default; -$btn-default-bg: #fff !default; -$btn-default-border: #ccc !default; - -$btn-primary-color: #fff !default; -$btn-primary-bg: $brand-primary !default; -$btn-primary-border: darken($btn-primary-bg, 5%) !default; - -$btn-success-color: #fff !default; -$btn-success-bg: $brand-success !default; -$btn-success-border: darken($btn-success-bg, 5%) !default; - -$btn-warning-color: #fff !default; -$btn-warning-bg: $brand-warning !default; -$btn-warning-border: darken($btn-warning-bg, 5%) !default; - -$btn-danger-color: #fff !default; -$btn-danger-bg: $brand-danger !default; -$btn-danger-border: darken($btn-danger-bg, 5%) !default; - -$btn-info-color: #fff !default; -$btn-info-bg: $brand-info !default; -$btn-info-border: darken($btn-info-bg, 5%) !default; - -$btn-link-disabled-color: $gray-light !default; - - -// Forms -// ------------------------- - -$input-bg: #fff !default; -$input-bg-disabled: $gray-lighter !default; - -$input-color: $gray !default; -$input-border: #ccc !default; -$input-border-radius: $border-radius-base !default; -$input-border-focus: #66afe9 !default; - -$input-color-placeholder: $gray-light !default; - -$input-height-base: ($line-height-computed + ($padding-base-vertical * 2) + 2) !default; -$input-height-large: (floor($font-size-large * $line-height-large) + ($padding-large-vertical * 2) + 2) !default; -$input-height-small: (floor($font-size-small * $line-height-small) + ($padding-small-vertical * 2) + 2) !default; - -$legend-color: $gray-dark !default; -$legend-border-color: #e5e5e5 !default; - -$input-group-addon-bg: $gray-lighter !default; -$input-group-addon-border-color: $input-border !default; - - -// Dropdowns -// ------------------------- - -$dropdown-bg: #fff !default; -$dropdown-border: rgba(0,0,0,.15) !default; -$dropdown-fallback-border: #ccc !default; -$dropdown-divider-bg: #e5e5e5 !default; - -$dropdown-link-color: $gray-dark !default; -$dropdown-link-hover-color: darken($gray-dark, 5%) !default; -$dropdown-link-hover-bg: #f5f5f5 !default; - -$dropdown-link-active-color: $component-active-color !default; -$dropdown-link-active-bg: $component-active-bg !default; - -$dropdown-link-disabled-color: $gray-light !default; - -$dropdown-header-color: $gray-light !default; - -$dropdown-caret-color: #000 !default; - - -// COMPONENT VARIABLES -// -------------------------------------------------- - - -// Z-index master list -// ------------------------- -// Used for a bird's eye view of components dependent on the z-axis -// Try to avoid customizing these :) - -$zindex-navbar: 1000 !default; -$zindex-dropdown: 1000 !default; -$zindex-popover: 1010 !default; -$zindex-tooltip: 1030 !default; -$zindex-navbar-fixed: 1030 !default; -$zindex-modal-background: 1040 !default; -$zindex-modal: 1050 !default; - -// Media queries breakpoints -// -------------------------------------------------- - -// Extra small screen / phone -// Note: Deprecated $screen-xs and $screen-phone as of v3.0.1 -$screen-xs: 480px !default; -$screen-xs-min: $screen-xs !default; -$screen-phone: $screen-xs-min !default; - -// Small screen / tablet -// Note: Deprecated $screen-sm and $screen-tablet as of v3.0.1 -$screen-sm: 768px !default; -$screen-sm-min: $screen-sm !default; -$screen-tablet: $screen-sm-min !default; - -// Medium screen / desktop -// Note: Deprecated $screen-md and $screen-desktop as of v3.0.1 -$screen-md: 992px !default; -$screen-md-min: $screen-md !default; -$screen-desktop: $screen-md-min !default; - -// Large screen / wide desktop -// Note: Deprecated $screen-lg and $screen-lg-desktop as of v3.0.1 -$screen-lg: 1200px !default; -$screen-lg-min: $screen-lg !default; -$screen-lg-desktop: $screen-lg-min !default; - -// So media queries don't overlap when required, provide a maximum -$screen-xs-max: ($screen-sm-min - 1) !default; -$screen-sm-max: ($screen-md-min - 1) !default; -$screen-md-max: ($screen-lg-min - 1) !default; - - -// Grid system -// -------------------------------------------------- - -// Number of columns in the grid system -$grid-columns: 12 !default; -// Padding, to be divided by two and applied to the left and right of all columns -$grid-gutter-width: 30px !default; -// Point at which the navbar stops collapsing -$grid-float-breakpoint: $screen-sm-min !default; - - -// Navbar -// ------------------------- - -// Basics of a navbar -$navbar-height: 50px !default; -$navbar-margin-bottom: $line-height-computed !default; -$navbar-border-radius: $border-radius-base !default; -$navbar-padding-horizontal: floor($grid-gutter-width / 2) !default; -$navbar-padding-vertical: (($navbar-height - $line-height-computed) / 2) !default; - -$navbar-default-color: #777 !default; -$navbar-default-bg: #f8f8f8 !default; -$navbar-default-border: darken($navbar-default-bg, 6.5%) !default; - -// Navbar links -$navbar-default-link-color: #777 !default; -$navbar-default-link-hover-color: #333 !default; -$navbar-default-link-hover-bg: transparent !default; -$navbar-default-link-active-color: #555 !default; -$navbar-default-link-active-bg: darken($navbar-default-bg, 6.5%) !default; -$navbar-default-link-disabled-color: #ccc !default; -$navbar-default-link-disabled-bg: transparent !default; - -// Navbar brand label -$navbar-default-brand-color: $navbar-default-link-color !default; -$navbar-default-brand-hover-color: darken($navbar-default-brand-color, 10%) !default; -$navbar-default-brand-hover-bg: transparent !default; - -// Navbar toggle -$navbar-default-toggle-hover-bg: #ddd !default; -$navbar-default-toggle-icon-bar-bg: #ccc !default; -$navbar-default-toggle-border-color: #ddd !default; - - -// Inverted navbar -// -// Reset inverted navbar basics -$navbar-inverse-color: #FFF !default; -$navbar-inverse-bg: $brand-primary !default; -$navbar-inverse-border: darken($navbar-inverse-bg, 5%) !default; - -// Inverted navbar links -$navbar-inverse-link-color: #fff !default; -$navbar-inverse-link-hover-color: #fff !default; -$navbar-inverse-link-hover-bg: #A52222 !default; -$navbar-inverse-link-active-color: $navbar-inverse-link-hover-color !default; -$navbar-inverse-link-active-bg: darken($navbar-inverse-bg, 10%) !default; -$navbar-inverse-link-disabled-color: #444 !default; -$navbar-inverse-link-disabled-bg: transparent !default; - -// Inverted navbar brand label -$navbar-inverse-brand-color: $navbar-inverse-link-color !default; -$navbar-inverse-brand-hover-color: #fff !default; -$navbar-inverse-brand-hover-bg: transparent !default; - -// Inverted navbar toggle -$navbar-inverse-toggle-hover-bg: #333 !default; -$navbar-inverse-toggle-icon-bar-bg: #fff !default; -$navbar-inverse-toggle-border-color: #333 !default; - - -// Navs -// ------------------------- - -$nav-link-padding: 10px 15px !default; -$nav-link-hover-bg: $gray-lighter !default; - -$nav-disabled-link-color: $gray-light !default; -$nav-disabled-link-hover-color: $gray-light !default; - -$nav-open-link-hover-color: #fff !default; -$nav-open-caret-border-color: #fff !default; - -// Tabs -$nav-tabs-border-color: #ddd !default; - -$nav-tabs-link-hover-border-color: $gray-lighter !default; - -$nav-tabs-active-link-hover-bg: $body-bg !default; -$nav-tabs-active-link-hover-color: $gray !default; -$nav-tabs-active-link-hover-border-color: #ddd !default; - -$nav-tabs-justified-link-border-color: #ddd !default; -$nav-tabs-justified-active-link-border-color: $body-bg !default; - -// Pills -$nav-pills-border-radius: $border-radius-base !default; -$nav-pills-active-link-hover-bg: $component-active-bg !default; -$nav-pills-active-link-hover-color: $component-active-color !default; - - -// Pagination -// ------------------------- - -$pagination-bg: #fff !default; -$pagination-border: #ddd !default; - -$pagination-hover-bg: $gray-lighter !default; - -$pagination-active-bg: $brand-primary !default; -$pagination-active-color: #fff !default; - -$pagination-disabled-color: $gray-light !default; - - -// Pager -// ------------------------- - -$pager-border-radius: 15px !default; -$pager-disabled-color: $gray-light !default; - - -// Jumbotron -// ------------------------- - -$jumbotron-padding: 30px !default; -$jumbotron-color: inherit !default; -$jumbotron-bg: $gray-lighter !default; -$jumbotron-heading-color: inherit !default; -$jumbotron-font-size: ceil($font-size-base * 1.5) !default; - - -// Form states and alerts -// ------------------------- - -$state-success-text: #468847 !default; -$state-success-bg: #dff0d8 !default; -$state-success-border: darken(adjust-hue($state-success-bg, -10), 5%) !default; - -$state-info-text: #3a87ad !default; -$state-info-bg: #d9edf7 !default; -$state-info-border: darken(adjust-hue($state-info-bg, -10), 7%) !default; - -$state-warning-text: #c09853 !default; -$state-warning-bg: #fcf8e3 !default; -$state-warning-border: darken(adjust-hue($state-warning-bg, -10), 5%) !default; - -$state-danger-text: #b94a48 !default; -$state-danger-bg: #f2dede !default; -$state-danger-border: darken(adjust-hue($state-danger-bg, -10), 5%) !default; - - -// Tooltips -// ------------------------- -$tooltip-max-width: 200px !default; -$tooltip-color: #fff !default; -$tooltip-bg: #000 !default; - -$tooltip-arrow-width: 5px !default; -$tooltip-arrow-color: $tooltip-bg !default; - - -// Popovers -// ------------------------- -$popover-bg: #fff !default; -$popover-max-width: 276px !default; -$popover-border-color: rgba(0,0,0,.2) !default; -$popover-fallback-border-color: #ccc !default; - -$popover-title-bg: darken($popover-bg, 3%) !default; - -$popover-arrow-width: 10px !default; -$popover-arrow-color: #fff !default; - -$popover-arrow-outer-width: ($popover-arrow-width + 1) !default; -$popover-arrow-outer-color: rgba(0,0,0,.25) !default; -$popover-arrow-outer-fallback-color: #999 !default; - - -// Labels -// ------------------------- - -$label-default-bg: $gray-light !default; -$label-primary-bg: $brand-primary !default; -$label-success-bg: $brand-success !default; -$label-info-bg: $brand-info !default; -$label-warning-bg: $brand-warning !default; -$label-danger-bg: $brand-danger !default; - -$label-color: #fff !default; -$label-link-hover-color: #fff !default; - - -// Modals -// ------------------------- -$modal-inner-padding: 20px !default; - -$modal-title-padding: 15px !default; -$modal-title-line-height: $line-height-base !default; - -$modal-content-bg: #fff !default; -$modal-content-border-color: rgba(0,0,0,.2) !default; -$modal-content-fallback-border-color: #999 !default; - -$modal-backdrop-bg: #000 !default; -$modal-header-border-color: #e5e5e5 !default; -$modal-footer-border-color: $modal-header-border-color !default; - - -// Alerts -// ------------------------- -$alert-padding: 15px !default; -$alert-border-radius: $border-radius-base !default; -$alert-link-font-weight: bold !default; - -$alert-success-bg: $state-success-bg !default; -$alert-success-text: $state-success-text !default; -$alert-success-border: $state-success-border !default; - -$alert-info-bg: $state-info-bg !default; -$alert-info-text: $state-info-text !default; -$alert-info-border: $state-info-border !default; - -$alert-warning-bg: $state-warning-bg !default; -$alert-warning-text: $state-warning-text !default; -$alert-warning-border: $state-warning-border !default; - -$alert-danger-bg: $state-danger-bg !default; -$alert-danger-text: $state-danger-text !default; -$alert-danger-border: $state-danger-border !default; - - -// Progress bars -// ------------------------- -$progress-bg: #f5f5f5 !default; -$progress-bar-color: #fff !default; - -$progress-bar-bg: $brand-primary !default; -$progress-bar-success-bg: $brand-success !default; -$progress-bar-warning-bg: $brand-warning !default; -$progress-bar-danger-bg: $brand-danger !default; -$progress-bar-info-bg: $brand-info !default; - - -// List group -// ------------------------- -$list-group-bg: #fff !default; -$list-group-border: #ddd !default; -$list-group-border-radius: $border-radius-base !default; - -$list-group-hover-bg: #f5f5f5 !default; -$list-group-active-color: $component-active-color !default; -$list-group-active-bg: $component-active-bg !default; -$list-group-active-border: $list-group-active-bg !default; - -$list-group-link-color: #555 !default; -$list-group-link-heading-color: #333 !default; - - -// Panels -// ------------------------- -$panel-bg: #fff !default; -$panel-inner-border: #ddd !default; -$panel-border-radius: $border-radius-base !default; -$panel-footer-bg: #f5f5f5 !default; - -$panel-default-text: $gray-dark !default; -$panel-default-border: #ddd !default; -$panel-default-heading-bg: #f5f5f5 !default; - -$panel-primary-text: #fff !default; -$panel-primary-border: $brand-primary !default; -$panel-primary-heading-bg: $brand-primary !default; - -$panel-success-text: $state-success-text !default; -$panel-success-border: $state-success-border !default; -$panel-success-heading-bg: $state-success-bg !default; - -$panel-warning-text: $state-warning-text !default; -$panel-warning-border: $state-warning-border !default; -$panel-warning-heading-bg: $state-warning-bg !default; - -$panel-danger-text: $state-danger-text !default; -$panel-danger-border: $state-danger-border !default; -$panel-danger-heading-bg: $state-danger-bg !default; - -$panel-info-text: $state-info-text !default; -$panel-info-border: $state-info-border !default; -$panel-info-heading-bg: $state-info-bg !default; - - -// Thumbnails -// ------------------------- -$thumbnail-padding: 4px !default; -$thumbnail-bg: $body-bg !default; -$thumbnail-border: #ddd !default; -$thumbnail-border-radius: $border-radius-base !default; - -$thumbnail-caption-color: $text-color !default; -$thumbnail-caption-padding: 9px !default; - - -// Wells -// ------------------------- -$well-bg: #f5f5f5 !default; - - -// Badges -// ------------------------- -$badge-color: #fff !default; -$badge-link-hover-color: #fff !default; -$badge-bg: $gray-light !default; - -$badge-active-color: $link-color !default; -$badge-active-bg: #fff !default; - -$badge-font-weight: bold !default; -$badge-line-height: 1 !default; -$badge-border-radius: 10px !default; - - -// Breadcrumbs -// ------------------------- -$breadcrumb-bg: #f5f5f5 !default; -$breadcrumb-color: #ccc !default; -$breadcrumb-active-color: $gray-light !default; -$breadcrumb-separator: "/" !default; - - -// Carousel -// ------------------------ - -$carousel-text-shadow: 0 1px 2px rgba(0,0,0,.6) !default; - -$carousel-control-color: #fff !default; -$carousel-control-width: 15% !default; -$carousel-control-opacity: .5 !default; -$carousel-control-font-size: 20px !default; - -$carousel-indicator-active-bg: #fff !default; -$carousel-indicator-border-color: #fff !default; - -$carousel-caption-color: #fff !default; - - -// Close -// ------------------------ -$close-font-weight: bold !default; -$close-color: #000 !default; -$close-text-shadow: 0 1px 0 #fff !default; - - -// Code -// ------------------------ -$code-color: #c7254e !default; -$code-bg: #f9f2f4 !default; - -$pre-bg: #f5f5f5 !default; -$pre-color: $gray-dark !default; -$pre-border-color: #ccc !default; -$pre-scrollable-max-height: 340px !default; - -// Type -// ------------------------ -$text-muted: $gray-light !default; -$abbr-border-color: $gray-light !default; -$headings-small-color: $gray-light !default; -$blockquote-small-color: $gray-light !default; -$blockquote-border-color: $gray-lighter !default; -$page-header-border-color: $gray-lighter !default; - -// Miscellaneous -// ------------------------- - -// Hr border color -$hr-border: $gray-lighter !default; - -// Horizontal forms & lists -$component-offset-horizontal: 180px !default; - - -// Container sizes -// -------------------------------------------------- - -// Small screen / tablet -$container-tablet: ((720px + $grid-gutter-width)) !default; -$container-sm: $container-tablet !default; - -// Medium screen / desktop -$container-desktop: ((940px + $grid-gutter-width)) !default; -$container-md: $container-desktop !default; - -// Large screen / wide desktop -$container-large-desktop: ((1140px + $grid-gutter-width)) !default; -$container-lg: $container-large-desktop !default; diff --git a/public/app/sass/irail/_theme.scss b/public/app/sass/irail/_theme.scss deleted file mode 100644 index 520a91c4..00000000 --- a/public/app/sass/irail/_theme.scss +++ /dev/null @@ -1,225 +0,0 @@ -/* Main SASS CSS file */ - - -input.ng-invalid { - border: 1px solid red !important; - } - -.navbar-nav{ - li a{ - font-size: 1.1em; - } - } - -.navbar-bottom{ - margin-bottom: 5px !important; - } - -.navbar-brand{ - line-height: 1.7em !important; - padding-top: 10px !important; - padding-right: 20px !important; - padding-left: 5px !important; - padding-bottom: 0px !important; - } - -.fa-12{ - font-size: 1.3em; - } - -.container33{ - display: inline-block; - width: 100%; - .tleft{ - float: left; - width: 60%; - text-align: left; - } - .tright{ - float: left; - width: 20%; - text-align: right; - } - .tcenter{ - float: left; - width: 20%; - text-align: center; - } - .platform-left{ - float: left; - width: 20%; - text-align: left; - } - .time-right{ - margin-top: 5px; - float: left; - width: 20%; - text-align: right; - } - .station-middle{ - margin-top: 5px; - float: left; - width: 50%; - text-align: left; - } - .delay-right{ - margin-top: 5px; - float: left; - width: 10%; - text-align: left; - } -} - -.liveboard-list{ - font-size: 1.3em; - } - -.delay{ - color: red; - } - -.max-w5{ - max-width: 480px !important; - margin-left: auto !important; - margin-right: auto !important; -} - -.floatright{ - float: right; - clear: both; - } - -.center{ - text-align: center; - } - -.list-group{ - margin-bottom: 0px !important; - } - -.loader { - margin: 6em auto; - font-size: 10px; - position: relative; - text-indent: -9999em; - border-top: 1.1em solid rgba(0, 0, 0, 0.2); - border-right: 1.1em solid rgba(0, 0, 0, 0.2); - border-bottom: 1.1em solid rgba(0, 0, 0, 0.2); - border-left: 1.1em solid #C72929; - -webkit-animation: load8 1.1s infinite linear; - animation: load8 1.1s infinite linear; - } -.loader, -.loader:after { - border-radius: 50%; - width: 10em; - height: 10em; - } -@-webkit-keyframes load8 { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } - } -@keyframes load8 { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } - } - -.btn-wide{ - width: 100% !important; - } - -.btn-50{ - width: 50% !important; - } - -.btn-botm{ - margin-bottom: 15px; - } - -.planner-time{ - font-size: 1.3em; - color: #C72929; - margin-right: 15px; - width: 50%; - } - -.planner-station{ - width: 50%; - font-size: 1.2em; - margin-right: 15px; - } - -.delay-route{ - color: red; - } - -.badge{ - font-size: 1.3em; - } - -.navbar-name{ - font-size: 1.2em; - font-family: "PT Sans", "Helvetica Neue", Helvetica, Arial, sans-serif !important; - font-weight: bold; - } - -.irail-logo{ - position: relative; - top: -3px; - } - -.datepicker{ - .btn-info.active{ - background-color: #C72929 !important; - border-color: #C72929 !important; - span.text-info{ - color: #FFF !important; - } - } - } - -.ul-lg{ - li{ - font-size: 1.4em; - } - } - -/* Animations */ - -.row.ng-hide-remove { - -webkit-animation: fadeIn 0.7s; - animation: fadeIn 0.7s; - } - -a.bounceIn.ng-hide-remove { - -webkit-animation: bounceIn 0.7s; - animation: bounceIn 0.7s; - } - - -.row.loading.ng-hide-remove { - -webkit-animation: bounceIn 0.7s; - animation: bounceIn 0.7s; - } - -.row.routeplanner.ng-hide-remove { - -webkit-animation: fadeInDown 0.7s; - animation: fadeInDown 0.7s; - } - -.label-lg{ - font-size: 1.5em; - } -//gooby pls \ No newline at end of file diff --git a/public/app/sass/style.scss b/public/app/sass/style.scss deleted file mode 100644 index 896a50ea..00000000 --- a/public/app/sass/style.scss +++ /dev/null @@ -1,4 +0,0 @@ -@import "bootstrap/variables"; -@import "../../components/bootstrap-sass-official/assets/stylesheets/bootstrap/"; - -@import "irail/theme"; diff --git a/public/apple-touch-icon-precomposed.png b/public/apple-touch-icon-precomposed.png deleted file mode 100644 index 229a9d0e3d8724b85ea72fe29dd6f4989a076664..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11327 zcmbt)bySpX*RM&bpn&v%N(o3v!w`x=cS|WBg_0@6}a0y7}O z(9F<7b1t9vTkE{%{mxnITkHJ68t&THzV98^-oO0|)6!79LBT|E;lhO*%1TdlE?l^{ z`{$4B5;*g;S_un&7(JgEdFr~_dct41+gx~T?P_UrNBQ+DI~yIFSJu96JvK5IF7VAM zKYgs{GqsMjP)qX-BDitA8i%6x8GmjG{8H+9FdY`9QEAukR+c{3{G}%HwP1LCN}8qn z!_{YZ4RgOF>#eehNp9@t=x0k5sl1DwN~1W=*)XTo(k~IUn=2Sr^ZXi3qMq~i)4gl5 z`@dxezOEmp+I{HZxVXOL8#FjeRHd`5de6+-p3peo> zF0?@|JVIT*KnA~XVUF@b2=u~VFw%d&08ZY)T>Os<|8@7jUHCu6{MUv5iF_dH-^Bda z6aQU4xbSak{y*h|3;&`2|5g5Gv3KePyxiL-pQ3$ER)Py%U-!IAx;RIP5*&iY_mn=( zVW+#cyN}*%DJ(9<3-WL9^WWOt%ty!_IF4PGG`_>sEGj2Z5%iGOaa)lCCt+vD$H!OA zN(TQLHs%MH=I<#bbaDQc$jdAEJ;#R8dVlSTRfW@G6W*GB?#-LEYu94+!aJ|bQA)n$ za6iXj90J$+8yP6}uxPA=ta^MKJ$<9-MV8F&H0CpSgUoLK2gj z+ZjiY5a`R8N1|T@-g3^a1e4BD{(KbIe7F@YZJLsvutU0Wy$wOk>IhELhuU%YwpGQO`!J*TeX(`dCgHST~BdM^d=pw_C zlPI&WEB%yh5Usu=4Oj#AG3xSauEEwFM(&g6f5ActMzfdyd;&wMY}PxNH{vEPuHNOF zV&M7LC=)R<>i=!kOas2e;&Y^8A_YGckhVM&oi2Ny&cPQbrI46-Ti%opxYr5N*7sIm zIa;IY9gK8z%H)Og7XzTev8t*l(CKS^ zfq`KO&orD24rJPh=jA;(;7_Zn3LW1kTn>Q-l%Q)kdx~}qyE`rh3In~0lu<=%=~7^U zdP(58fnk<-;mxYwZsLImUT{qM;IqFk z<3Hx3q=Yy3^;K70x(L3g|J+O~#g)xa5DBF;ksY3b7wK3T4ziq_rik2q45Q)CN@y&O z>9N=1FAi+|AXV%B5MLCdRlv@Q5T$yW3+b}pUlT=S%YQMT8lT`i!YRDrPX}5&A2D5B zdnq%c1mzj>K*KysV_{>3SAf@jI9~zgDASXhxEeU2r5#jgIoYpkOy`qTens0917^({pNr zs5AzQPfSYkc9&{!dW34fdTH3++Q-N;L#J6eaZEqVhukmqQV5iVX${fY#X0Ff0a?Xu zFRrh<$Z6^VopeJ;NjXQtyym07jBS`|Q1~{?KSs4{v>L6ubJ4IeWb^#(a}&RLN&3}; zzYqE+jg@`>2rC|9rBJTXC^mVA23O19>a9hFRG8a%>EFxT!-2;G%)&xw*PUe@bFm6@ z+TyB;GGy>%_M1`r>Y5%CqvXqfgE#gVqMCmM6y%vpnF_Zx4UnMzbbGV<90Q>V8j`>&>67^GdFprbQl?3^PE?**6-w2EFOgNy2yt6D3; zhG+-4?JT57cWmFlx}^Mmten+LQFu=zZf=)e&C&j&cjg!?g;_>Qy^K^(v#taM)pb(~ zqh%Eidy1R*105l{#-zbx-!u-Yk5${uaDsV{^`8s&%gXs>{11enJT^T zU__CyztAfyeev<4?-8D+%}0yBEq!1g^BytBCkNcW8D*Z4GB@KO;)wk53b~C_e#qke ztnoFbp(EVt4(61TA!2W^-;J=Fa;41mHKe#~qR-}Vu|UVcmZBh?9d~!)5u_q{zd3i@ z;U_;W$N)YbOf*z%=iVH_M8PflHISdC;3Cc-Se*2=K5)cD*j!A|enH!i-7G z?3g(>*_G-+=p^SlM=$PG|I~x17eO$sw`jiD@--c00hRF|4%->9P`f>K&13KQ8$G+t zNaSh9GiDKu?PihKa!wph7}xskic{1r{GCZz1%=n#h4=PL2xyTOX{X){fu^gb5trxa?_VSicmIvRXNa$4 z8=0!+!>?U^HaP3H=NK%|#oZk*fMyOGq9`3tR61F;I75b7WIvtmA~X|M=DYUK7(s|7 zx&|K?=p3&1(C`J9oiv=zSEc5dNty?3)I1VxAhgirFV&1(Ddh?qk&xY(qeqFzp9`hc ztWPNaB~E8Y*cgl3UDpnqGGN^+;rG=uFmzg5TWyGB(yi{r@j324MD)q|l5g`JJn|)f zau*w5OZmPOx5GMfWh@o)zWTjyO&Lj+iV2VTTXXc6WPu{jvP4n|SG;x$4IXysFdgbh zWP@`yuG;t@OA#%zyEZ&yIOw}sa=2t$qFSE6XM(k>{vDT0{;81zx%Wi z1ZO-5f7_WEAx-VdP>@;1H&Q9GO9TbW`VyA)5CnH#UUjw2TkM!umt9@mOYTi_jtfS` zKtEkuD|mq&z^T=H72<__JeLN<=h?~OMg%`O!k8F|nx^+_lk55Fmp<~EZ(|Sm^brK2 z;`8MIIF##Q{r5z*&Y~W)h`g&yCGqpf#I>uW8U%{n{e3L@b-;eh0-+rW*E@OdD&#SC zn*42n%Pj00u18rDT@6xGy!;_eRi?Vi)WPi8>xH`D)1ofn(Gm<$*V5#w; zm`$%}R%ZbA{rl3{gBynCkNa#Uj|qx8Jc058`JGW}ox6K)aAm7iunp4Wll@`-`2be@ z$H|l|37b(fA-ZEW`7^iUqOyil+EV`;Wt!k{*G@j(PKc=KhufQ2N&n;?%4@#yu`p33 zO+=(Ki~FRRa7qk52t}9&O#1ACuVar zJ0dIn#a;{)RB~e(8vgFjW;N`K|P!LI*0b@$GCkk~Vb8gO>!)+6GBKMBA9(pZTK&pP{jtm`-i*(%|_?8(-PM;n$&u z4BFaTtYFjj;l@0kJhQp&@Yz_QW#5T~RhonyPe+k(Cj@$bTE7s{*U(j~nr@~o#Mc!i z@Ie8~Pe*XC`FwAd=O4+;{L`ER0b=`G&ax|>MIDVf*zM$U71TRbtT@)DF?8Z(d9e?o z6T!zlavnGE>27Be4Sv&W5)D%Au>o%ne&KfpJQSu#GbbmbHhC5>iJ!B5sM7@JiswJ= z2EMYKZBxV82C*aWv;;+c8M*;%JQPp-RTtk`YCjuPo8E%lngNA+&`AhLX?rDjKF&`o z(6@fiv+L@{$cr!roS0W)$`7gFa?1k=1J>L35GVOgUWG(iu{i-kEc)5fW7H0hmoE-o zsi0h-U>AW9+kReP6rSBbQWrr6XZSrQ$EZvbcjcdl`j)KJ z1{sVS%r{hg#H36U{`hvsaqCe-PD@DNgEoj9?{w5>Wy6RkrzeGDS1-`&jo=cwduWi`a)67MeaWvMEhKzdZW)Uu>X9qr z+xwC!e)Yw!A&sF+9w`D05jA=-Y{g}K4ZLwGHtn2IT!;@-kYD>+1@jSUKQ`uIiX##Q zYbGXB;Y{35NIpkP>4`9e!QgYgVzjF)Oxy0LH8V{vh8PbY(Zbx0iz3hWRi&mo=9TTj zpO36*Y5jpzRiw^$X1(WnY6(83BF`>w z7(pH5^ll9|x1b>-)zzKr?^(U!qgs55q^0rqDHyOBg7cmQs|;B0IMsJvzbev4~}bwB2~@uLmDzYA*8ii zF!{oMvy8=j$P9v;yK!U%l%&trglO;y8@(&cq&--@u{nW`+y)VQyL+Gx7^7dN#!a>F zNSJ*-J$9K*QaEe<7SccsG%ESJb>cJ%A9a76o0?8O`o2+I6nPl0&fZT-(h#T2HuDTY zAH<)92$0wEK%~Ly@<%Nnk;w$;Hv}#QEpK!|mBoayYw-uEQuO|RlE<7I{J8*q{-gH?4w6(mMNw7L`%;_k9 zZkduyu>s@79~=;Wvxi1~ZWHFnxEwRkFz1J6_}7HCON*%D3}EJ!vwn*FPi)d{+2gf$ zzlSuwf3;LaKG`r)JW+S}g^iCmKKRzz6L%lTUX>mvgI{YO2!4mzGb`4rm&i32SnIy( z9p*Mv@9U+n?F!0G-0qEJ0GSML1PMR_g|8>Njn*FmANgVN7zJ&P+*?weF%(*#uo{@@ z9r)(KuLjpE;l(ng!9tH<6HxId!v_}!3ldeN=~%Pf;YyWdQBlT19};1q3R8J9(m`63 zfqu5%`KPBDNLQ{i>*|hw*SLfEgz}j%;m0rc3T7n)NtZhRWa_!q6SOv-sc#k?(&*(G zbG&bd8WFK_nVd;c8uHxFj3dNE8u{wc;K#R??pK3+8+iGI3Mt1=E9sm$NESFDYSzP1 zVmIGtt1b`T$7#pRwfH{d>iSHjS=arDN20xC@WxRUWX$vD#THlphK0JD`9ZI&nwZcM zEF3<%8_$xLMaVIxt%C{;Ig&@He2QvkOl+LVWDF`Q z1_hZ5KZB#Rn&bmdmYMBuMRqL5R~Y5SpLX8xSEXr#7%Xe#M(5=VdF~-cyP|rtF3aIvb zvLvfr8>Rz;886QFT+eGu;3|e3iI(^{o2$o)?CjIgDFKQolddG_;=r(!sI_(e-%*7; z!QKM_4RypV!Z{kxmao~F`ZjQWoS)|>WRH;>Lk?dvWnz=~;U~AAeu&G@qMHpgB#NOE zHqcX(!*tM{9b%j^sYZdzQnR*-<5;|VB4prRdpq?|gQmNC>-4RNp7?|O4pwZvmGyQ+ zY!%OdzOh;2HI**9*CCB_bl2ZY|K94Hn8#7oOn-<{%eR!~bn%QivWK!t(L{Cy3YWWj z*xD`;&dtvY6DrMYid9p7Z}PXBAN?hJ+obp#bM6PLhb0_#H}oO+=F{3(OU2aFqqet8 zuGIMRwU(qH0x?piJuM<4q*2}~1Lms2-aGHcKNRL(CCBPyWkoWZ02*DYCI7wI^V9Q_ z0RlslLXKuK}rkQmEiM0P4R*A(;m(7U?Mz9=86A( z4jX7_sj>I9tG+0gS?{(}5756aT*cLkfmTemop0#5P9b`_u5dDI0yH8;(*vu~Kd=Gj zmRRIGCLr+1-e(2wA%42$4FDy&!0dAaHlulOlM4?f6r3NzgNZ#^rzu;xsn!y|L5*+n zV#?yhl*ggK2D%7ydAPvfvud^n*0Jo^_JR9G${DdgC8fXRkU6*G#eGlytR=ZGXtjwX z+i43^ncZ)mQY|5kpX;st?C!O?5m=(suYWfRH`s0#O!FcfbX&;zR&Ip`9~`iq4= z#WXqeipx?q^*k7!^u}CUs{Zo(WuV!rXOAb-=x7_u4qi|?47(&1z&cs%fOrYOQ|v*PQ$_5lyZULjzLKKFhaY^ zvtx6UCwf0HgV&^e?_z2OJdeyVeZ>Rtx`fTf_iee(RYB1HIzF?ld4X%Y5e|@8C+crGbVORh6;Fj)s6yeHcZI9^PG4@k1zMI{qPZ zol6SZ<%{X4DmfwK3DR6ZLPN^7-$2hhA+2g=&%Xd*v3Bzzl?N>lMKGdIM4U3wQo*? zDsq-ZzbK9@eA_Jdi1OrYyK*%wI&S^6KE0jvsxmZzi%atJ#&3)ZW0+Tc!lG^AtkN&A z*Yfleo9Atwh@+G1oO>PJrkWUDm*%eatd%Nx-@VbcrH0ceZeKk*Wu)GnIy0X7x>_}F zo^w*JBb7q0YhqF7EJj_&;m+Gi7oHQy)J_t`As)IQuU*ivvuBeeXJ`;VF+ zrgb9Z5aA#yVy5TOj|0j1akmfn;bG9p$Mzi5QhUxTpr=*^%41(+g}2=joxTI?hyyw> zCM60Sor+cP{xaY8!}`p@MmH~jb!L445XA&N9Yb?8on>hqajNYti`1EK4+zWvH4KVe zxkPV!$32qrl~-M)zl8o@G~GyZyL%wv;x^V{$5Hoty=V3DQPZdOEIpL$3vUSx`KmrV zKg)1CrL30OmUki5y$x>o%*k#B4IU~(LpGZ#0}W3det=u`SYymjK_%wj!_k#*!An%) z^?Lp4jdf@}XA_HF;K;}ZUcPjJ6J$~ZA2pTf1YU&j{Vr*uSP#DRZUZc~dlP1OuOg#w zW5Hbj!pFn*k&l&0{CQU7llz1uw_nlgo1b$X$GmP4n)k$)nt(Nc zA6U(u=Vzu}McS~(iH!-`9MJV2QlcC&xsLkVX1&V(q+{Kj&Hz?DvBkS9a85Q`)Jx>4 zi^z~fYYQU4tYh3cZ_6{IbmM3tzDC3NE0#VHI&IXh&0(&2^n|ylDDH6$XiJ7vvqMQq zs>|eL0^L6!-oY4uVAdETn-z>RyjKYD_(D&;5?0y>#YB}Ih~&m6Ek&8qjagcmv(CZO zkDv}=c`-vpeEFa=lbL@K0Afr=%Kb^<=!%*d5B{>(pW&S=Z}R+8)0v3$^bVwi(8dK? z{%H>K*wD#hy=XACh@E4JylUT5>ty%w7M?#y=%fx`i?&oOwXSPnpl_F{{jzq&XuguI#ozZjpy_{|mSK@thv1=CHN34~ zY>H|XZG2un!jdG$E$SqzX0x%_HC#5af+BK#LN~k@mz2GE;qRH!ZaKxw%} zCO+FIv~D%bJ>^szKp9Q#PRk$fVqQTCKmYV*88_t;w&~fJa=1kAb{wKFB?6(1*j5J+ zT(Mr}8NxPZLTlN2@r4j;3j>ANVx^SNn3TkqM3vo(et-4Z7PRrx7;xSJH zYqnYMNlBS4Vu<7)34_VikyV;sAFQgP+F2=0d3E@{GV|Fd_0{a{C55|JRd zsAJBQ%4Nnn1So7lPl%h3Ta5A&%}7|Zi_f0WnMo2;%y6yK`UxhP5Hk4BJnjs%jFf{_ z_H?CJ*vgU;Gd;pP8~9t2hKRxkSZIGS=2cDXV%M6Ge+{3(wWEQjIm1!&eVKj@QvgbR ze-&En$oJegTgg>fh%UZ1F`KC0J2Iw$YJXh1w8MKubCR+$c#eeL>2mmqo&Sx3H*#;TdkoMWJIC};!L}&C3pXTKD%Z`|N1Y3v1OV3e; zuBK%s6+5gbG9mpwef@ox#34|Oq%7U}PbisIY{>yN3X&E@mGfK&2BbZ{rPT&~WlXPs zS9&rTrGW0(DcV4V0XXgIfZ4}i%RU_y8Kwg>tPDMmU*pO;9WA=nf>+F`vkiD52E0)= zVC*&>O`u@a=M~=rd!j&|4d%|s}m?XzV-^a6?Gd*?m zcF6&H$LEJWdofuz<0a!Xdz-IXX}F;db^ozzYrl2a0bfewNT+%!7S$T%*#;5Fy%CYH z;Fr+ zzqgJ1j~VjP>oIpRZ|wdV{8?*CZ)_ml5(U1nzxHvk%<=aeO+s`kY=l5JZ|mg4RSNO7 zk1@|dQAE83txpdxEde!`RD1;r@nP;ExW^`iQ5gyLM0wXIUtD}i>PZ?vxvegEqelaE zISY{#w}R#!8{}W${0(xYhyTLmVf)$L>Q(AY{y!se<9TTorH*ACB&W<1;CgLX!o9+T zCD$Zr@!w;Ko7Wxw^hXw54SLZ*cq6#dx2#5Kts;gWlx-PCq3rkM7$TYI(h%?Z@;Pnj}Erx1I`lBXhZX0Z1>Lk z_d!JPF8d5btN!?JF?P{_<$@Q1K17-MIzrx5WExg4saR(YT4| zdlQv|^P?WkRh+xwy~maBU|q(a(?5H3{-!p+G}XP+&8Q$y&oP@-zi@BTjpTXXfi@U2 z)|S7VAA48pqpZfEcUS;L{0W48OH@nVIp^BYu1P%9jr%Hj~;<}y$rk7w? zm~s8n-O0zO`KxMKgdh^-&EDSdgsixgaPPt-r&~Sf&Q6TG_V4au37ZEe%IJ77#drI% zcG%R=(Z&(TF;o-U!N^e)VAYO)bCHy!d8-+}u#I!)+PR;``A6oc@X+o6 zy8>kuBC*RVTp3l1oX;cxsBdSm6!`Q_RDW8j4Z?( zGx{Dr)f@ry;?(42RtVA=_{OrEu<25DMVR};twV_<3$=n7e*=MJabdni0Zlp|NNEe1Uf*l8;4Q=0e{tQ=X`4zG0;Z5FuxbXjS#8pdS0q}l$Y<-Wb}`s zk1Yj+Wgbw4o@e9<=7355o=sK8lPCS>-HYqRGLp7{Loj@=P!A-l^b(;|P$hGktFITu z(xGIeCcg*w2)6)Qg1t_KN-?yYw6pYYs!mH#houiQ<*k1L<8m#AHF1G#`vwqGLTO?) zmI>8r!2-m#2nMcf;2?07IztvO7$0TG=zc-V{L26%CQC9z|;?@+n za!DP(K6kII>Fh{Cm&ezEJA!3dUX#VuYJ1hhHN%t8HnhJ~ z{RLfv+mMn3l@^%mlay&FdEdmtvO3ex6k6K_%jZ}1>!rg!>oiTkc#bfibiHhFV;1Lo zAieZgz1O@ml&GY1Dp0lyRQBltq$Uf=VgoRLA8h#!x}aczrDo=CKo!vi7FIlC=*7a1_iwZ9K79itWuhz^ z1BG*t57M2|3MUA77_lJkmnQC)C91GRMGE;rT!uAhzS2_T0o-uE zS>n1aU@R}0sRChTAbXnI>Vx@xdts75TiU*TSx7y;k6MYmDQ!@-!nK@&l8RDgyw30W z@Efx&V0=OYb(jQxCUEXtAJ~3`^S-*VF)^h9#8iR>_J=oI-IBm@6aT1v=UQqSx&+I} z;-Wq0{T`3VuQlTQ_uX;=dw5 zjGbfBIdb*TdGIz-!JARNHX+e}+d+TYtwapq||q zKyX!{S~1KEsC zt@kl3tT8UmP;=zz0^2`Q%QuHkEPLM2C?I!uXouWgHe z%3ZYau&GrbL2=Sqh;?=VmmEk@W?6lmMemEnfOTdH){m*rwi!@Mva=Fa4Y{}nAzu!z z(>YzyXt!tlNl@V$fggJp^~`uTUD^Zy9-vE!Ujc5bI=kyhTrR+~xvslNODLiNv5SQx zPDO08C&(M!@=#=C#&3=akgg6d4KFA5D0^gnsjCxALn>cvgX}xmRv;F=C~ttm)XHh;p;5*X`qzzNQx2)mwpkLOZPKc+$L>=o|fR*2$plc z4u3X?If+&UOrqpSDMj!@)llHxc1uJ4lhk}6N~)!U`g+gZ*LB1+A0NP=7&Z56Djp)OmVg5G z{VsB@9J4jn@_=fm43wDPJ_TJ{^ck^tbrqn&9MH`sgxud<4p$|=A-A?NJsVPNIu_K* zrJ#KfJ#ag;`Va5Q+VCELig(-802;Xd4-sLWj%bhp$|3`ezwhXTS= 0 && j < len ? [ this[j] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(null); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[0] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction(target) ) { - target = {}; - } - - // extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - // Only deal with non-null/undefined values - if ( (options = arguments[ i ]) != null ) { - // Extend the base object - for ( name in options ) { - src = target[ name ]; - copy = options[ name ]; - - // Prevent never-ending loop - if ( target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { - if ( copyIsArray ) { - copyIsArray = false; - clone = src && jQuery.isArray(src) ? src : []; - - } else { - clone = src && jQuery.isPlainObject(src) ? src : {}; - } - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend({ - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - // See test/unit/core.js for details concerning isFunction. - // Since version 1.3, DOM methods and functions like alert - // aren't supported. They return false on IE (#2968). - isFunction: function( obj ) { - return jQuery.type(obj) === "function"; - }, - - isArray: Array.isArray, - - isWindow: function( obj ) { - return obj != null && obj === obj.window; - }, - - isNumeric: function( obj ) { - // parseFloat NaNs numeric-cast false positives (null|true|false|"") - // ...but misinterprets leading-number strings, particularly hex literals ("0x...") - // subtraction forces infinities to NaN - return !jQuery.isArray( obj ) && obj - parseFloat( obj ) >= 0; - }, - - isPlainObject: function( obj ) { - // Not plain objects: - // - Any object or value whose internal [[Class]] property is not "[object Object]" - // - DOM nodes - // - window - if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { - return false; - } - - if ( obj.constructor && - !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) { - return false; - } - - // If the function hasn't returned already, we're confident that - // |obj| is a plain object, created by {} or constructed with new Object - return true; - }, - - isEmptyObject: function( obj ) { - var name; - for ( name in obj ) { - return false; - } - return true; - }, - - type: function( obj ) { - if ( obj == null ) { - return obj + ""; - } - // Support: Android < 4.0, iOS < 6 (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call(obj) ] || "object" : - typeof obj; - }, - - // Evaluates a script in a global context - globalEval: function( code ) { - var script, - indirect = eval; - - code = jQuery.trim( code ); - - if ( code ) { - // If the code includes a valid, prologue position - // strict mode pragma, execute code by injecting a - // script tag into the document. - if ( code.indexOf("use strict") === 1 ) { - script = document.createElement("script"); - script.text = code; - document.head.appendChild( script ).parentNode.removeChild( script ); - } else { - // Otherwise, avoid the DOM node creation, insertion - // and removal by using an indirect global eval - indirect( code ); - } - } - }, - - // Convert dashed to camelCase; used by the css and data modules - // Microsoft forgot to hump their vendor prefix (#9572) - camelCase: function( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); - }, - - nodeName: function( elem, name ) { - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - }, - - // args is for internal usage only - each: function( obj, callback, args ) { - var value, - i = 0, - length = obj.length, - isArray = isArraylike( obj ); - - if ( args ) { - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback.apply( obj[ i ], args ); - - if ( value === false ) { - break; - } - } - } else { - for ( i in obj ) { - value = callback.apply( obj[ i ], args ); - - if ( value === false ) { - break; - } - } - } - - // A special, fast, case for the most common use of each - } else { - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback.call( obj[ i ], i, obj[ i ] ); - - if ( value === false ) { - break; - } - } - } else { - for ( i in obj ) { - value = callback.call( obj[ i ], i, obj[ i ] ); - - if ( value === false ) { - break; - } - } - } - } - - return obj; - }, - - // Support: Android<4.1 - trim: function( text ) { - return text == null ? - "" : - ( text + "" ).replace( rtrim, "" ); - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArraylike( Object(arr) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var value, - i = 0, - length = elems.length, - isArray = isArraylike( elems ), - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return concat.apply( [], ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // Bind a function to a context, optionally partially applying any - // arguments. - proxy: function( fn, context ) { - var tmp, args, proxy; - - if ( typeof context === "string" ) { - tmp = fn[ context ]; - context = fn; - fn = tmp; - } - - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if ( !jQuery.isFunction( fn ) ) { - return undefined; - } - - // Simulated bind - args = slice.call( arguments, 2 ); - proxy = function() { - return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || jQuery.guid++; - - return proxy; - }, - - now: Date.now, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -}); - -// Populate the class2type map -jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -}); - -function isArraylike( obj ) { - var length = obj.length, - type = jQuery.type( obj ); - - if ( type === "function" || jQuery.isWindow( obj ) ) { - return false; - } - - if ( obj.nodeType === 1 && length ) { - return true; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} -var Sizzle = -/*! - * Sizzle CSS Selector Engine v1.10.19 - * http://sizzlejs.com/ - * - * Copyright 2013 jQuery Foundation, Inc. and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2014-04-18 - */ -(function( window ) { - -var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + -(new Date()), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // General-purpose constants - strundefined = typeof undefined, - MAX_NEGATIVE = 1 << 31, - - // Instance methods - hasOwn = ({}).hasOwnProperty, - arr = [], - pop = arr.pop, - push_native = arr.push, - push = arr.push, - slice = arr.slice, - // Use a stripped-down indexOf if we can't use a native one - indexOf = arr.indexOf || function( elem ) { - var i = 0, - len = this.length; - for ( ; i < len; i++ ) { - if ( this[i] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - // http://www.w3.org/TR/css3-syntax/#characters - characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", - - // Loosely modeled on CSS identifier characters - // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors - // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier - identifier = characterEncoding.replace( "w", "w#" ), - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace + - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + - "*\\]", - - pseudos = ":(" + characterEncoding + ")(?:\\((" + - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), - - rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + characterEncoding + ")" ), - "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), - "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + - "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + - "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + - whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - rescape = /'|\\/g, - - // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), - funescape = function( _, escaped, escapedWhitespace ) { - var high = "0x" + escaped - 0x10000; - // NaN means non-codepoint - // Support: Firefox<24 - // Workaround erroneous numeric interpretation of +"0x" - return high !== high || escapedWhitespace ? - escaped : - high < 0 ? - // BMP codepoint - String.fromCharCode( high + 0x10000 ) : - // Supplemental Plane codepoint (surrogate pair) - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }; - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - (arr = slice.call( preferredDoc.childNodes )), - preferredDoc.childNodes - ); - // Support: Android<4.0 - // Detect silently failing push.apply - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - push_native.apply( target, slice.call(els) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - // Can't trust NodeList.length - while ( (target[j++] = els[i++]) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var match, elem, m, nodeType, - // QSA vars - i, groups, old, nid, newContext, newSelector; - - if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { - setDocument( context ); - } - - context = context || document; - results = results || []; - - if ( !selector || typeof selector !== "string" ) { - return results; - } - - if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) { - return []; - } - - if ( documentIsHTML && !seed ) { - - // Shortcuts - if ( (match = rquickExpr.exec( selector )) ) { - // Speed-up: Sizzle("#ID") - if ( (m = match[1]) ) { - if ( nodeType === 9 ) { - elem = context.getElementById( m ); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document (jQuery #6963) - if ( elem && elem.parentNode ) { - // Handle the case where IE, Opera, and Webkit return items - // by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - } else { - // Context is not a document - if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && - contains( context, elem ) && elem.id === m ) { - results.push( elem ); - return results; - } - } - - // Speed-up: Sizzle("TAG") - } else if ( match[2] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Speed-up: Sizzle(".CLASS") - } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) { - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // QSA path - if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { - nid = old = expando; - newContext = context; - newSelector = nodeType === 9 && selector; - - // qSA works strangely on Element-rooted queries - // We can work around this by specifying an extra ID on the root - // and working up from there (Thanks to Andrew Dupont for the technique) - // IE 8 doesn't work on object elements - if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { - groups = tokenize( selector ); - - if ( (old = context.getAttribute("id")) ) { - nid = old.replace( rescape, "\\$&" ); - } else { - context.setAttribute( "id", nid ); - } - nid = "[id='" + nid + "'] "; - - i = groups.length; - while ( i-- ) { - groups[i] = nid + toSelector( groups[i] ); - } - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context; - newSelector = groups.join(","); - } - - if ( newSelector ) { - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch(qsaError) { - } finally { - if ( !old ) { - context.removeAttribute("id"); - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {Function(string, Object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return (cache[ key + " " ] = value); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created div and expects a boolean result - */ -function assert( fn ) { - var div = document.createElement("div"); - - try { - return !!fn( div ); - } catch (e) { - return false; - } finally { - // Remove from its parent by default - if ( div.parentNode ) { - div.parentNode.removeChild( div ); - } - // release memory in IE - div = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split("|"), - i = attrs.length; - - while ( i-- ) { - Expr.attrHandle[ arr[i] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - ( ~b.sourceIndex || MAX_NEGATIVE ) - - ( ~a.sourceIndex || MAX_NEGATIVE ); - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( (cur = cur.nextSibling) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction(function( argument ) { - argument = +argument; - return markFunction(function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ (j = matchIndexes[i]) ] ) { - seed[j] = !(matches[j] = seed[j]); - } - } - }); - }); -} - -/** - * Checks a node for validity as a Sizzle context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ -function testContext( context ) { - return context && typeof context.getElementsByTagName !== strundefined && context; -} - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ -isXML = Sizzle.isXML = function( elem ) { - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = elem && (elem.ownerDocument || elem).documentElement; - return documentElement ? documentElement.nodeName !== "HTML" : false; -}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, - doc = node ? node.ownerDocument || node : preferredDoc, - parent = doc.defaultView; - - // If no document and documentElement is available, return - if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Set our document - document = doc; - docElem = doc.documentElement; - - // Support tests - documentIsHTML = !isXML( doc ); - - // Support: IE>8 - // If iframe document is assigned to "document" variable and if iframe has been reloaded, - // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936 - // IE6-8 do not support the defaultView property so parent will be undefined - if ( parent && parent !== parent.top ) { - // IE11 does not have attachEvent, so all must suffer - if ( parent.addEventListener ) { - parent.addEventListener( "unload", function() { - setDocument(); - }, false ); - } else if ( parent.attachEvent ) { - parent.attachEvent( "onunload", function() { - setDocument(); - }); - } - } - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans) - support.attributes = assert(function( div ) { - div.className = "i"; - return !div.getAttribute("className"); - }); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert(function( div ) { - div.appendChild( doc.createComment("") ); - return !div.getElementsByTagName("*").length; - }); - - // Check if getElementsByClassName can be trusted - support.getElementsByClassName = rnative.test( doc.getElementsByClassName ) && assert(function( div ) { - div.innerHTML = "
    "; - - // Support: Safari<4 - // Catch class over-caching - div.firstChild.className = "i"; - // Support: Opera<10 - // Catch gEBCN failure to find non-leading classes - return div.getElementsByClassName("i").length === 2; - }); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert(function( div ) { - docElem.appendChild( div ).id = expando; - return !doc.getElementsByName || !doc.getElementsByName( expando ).length; - }); - - // ID find and filter - if ( support.getById ) { - Expr.find["ID"] = function( id, context ) { - if ( typeof context.getElementById !== strundefined && documentIsHTML ) { - var m = context.getElementById( id ); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - return m && m.parentNode ? [ m ] : []; - } - }; - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute("id") === attrId; - }; - }; - } else { - // Support: IE6/7 - // getElementById is not reliable as a find shortcut - delete Expr.find["ID"]; - - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id"); - return node && node.value === attrId; - }; - }; - } - - // Tag - Expr.find["TAG"] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== strundefined ) { - return context.getElementsByTagName( tag ); - } - } : - function( tag, context ) { - var elem, - tmp = [], - i = 0, - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( (elem = results[i++]) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See http://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) { - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert(function( div ) { - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // http://bugs.jquery.com/ticket/12359 - div.innerHTML = ""; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( div.querySelectorAll("[msallowclip^='']").length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !div.querySelectorAll("[selected]").length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !div.querySelectorAll(":checked").length ) { - rbuggyQSA.push(":checked"); - } - }); - - assert(function( div ) { - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = doc.createElement("input"); - input.setAttribute( "type", "hidden" ); - div.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( div.querySelectorAll("[name=d]").length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( !div.querySelectorAll(":enabled").length ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Opera 10-11 does not throw on post-comma invalid pseudos - div.querySelectorAll("*,:x"); - rbuggyQSA.push(",.*:"); - }); - } - - if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector) )) ) { - - assert(function( div ) { - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( div, "div" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( div, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - }); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully does not implement inclusive descendent - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - )); - } : - function( a, b ) { - if ( b ) { - while ( (b = b.parentNode) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { - - // Choose the first element that is related to our preferred document - if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { - return -1; - } - if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function( a, b ) { - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - return a === doc ? -1 : - b === doc ? 1 : - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( (cur = cur.parentNode) ) { - ap.unshift( cur ); - } - cur = b; - while ( (cur = cur.parentNode) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[i] === bp[i] ) { - i++; - } - - return i ? - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[i], bp[i] ) : - - // Otherwise nodes in our document sort first - ap[i] === preferredDoc ? -1 : - bp[i] === preferredDoc ? 1 : - 0; - }; - - return doc; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - // Make sure that attribute selectors are quoted - expr = expr.replace( rattributeQuotes, "='$1']" ); - - if ( support.matchesSelector && documentIsHTML && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch(e) {} - } - - return Sizzle( expr, document, null, [ elem ] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - // Set document vars if needed - if ( ( context.ownerDocument || context ) !== document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - (val = elem.getAttributeNode(name)) && val.specified ? - val.value : - null; -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( (elem = results[i++]) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - // If no nodeType, this is expected to be an array - while ( (node = elem[i++]) ) { - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[1] = match[1].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); - - if ( match[2] === "~=" ) { - match[3] = " " + match[3] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[1] = match[1].toLowerCase(); - - if ( match[1].slice( 0, 3 ) === "nth" ) { - // nth-* requires argument - if ( !match[3] ) { - Sizzle.error( match[0] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); - match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); - - // other types prohibit arguments - } else if ( match[3] ) { - Sizzle.error( match[0] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[6] && match[2]; - - if ( matchExpr["CHILD"].test( match[0] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[3] ) { - match[2] = match[4] || match[5] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - // Get excess from tokenize (recursively) - (excess = tokenize( unquoted, true )) && - // advance to the next closing parenthesis - (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { - - // excess is a negative index - match[0] = match[0].slice( 0, excess ); - match[2] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { return true; } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && - classCache( className, function( elem ) { - return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" ); - }); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - }; - }, - - "CHILD": function( type, what, argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, context, xml ) { - var cache, outerCache, node, diff, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( (node = node[ dir ]) ) { - if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { - return false; - } - } - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - // Seek `elem` from a previously-cached index - outerCache = parent[ expando ] || (parent[ expando ] = {}); - cache = outerCache[ type ] || []; - nodeIndex = cache[0] === dirruns && cache[1]; - diff = cache[0] === dirruns && cache[2]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( (node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - (diff = nodeIndex = 0) || start.pop()) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - outerCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - // Use previously-cached element index if available - } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { - diff = cache[1]; - - // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) - } else { - // Use the same loop as above to seek `elem` from the start - while ( (node = ++nodeIndex && node && node[ dir ] || - (diff = nodeIndex = 0) || start.pop()) ) { - - if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { - // Cache the index of each encountered element - if ( useCache ) { - (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction(function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf.call( seed, matched[i] ); - seed[ idx ] = !( matches[ idx ] = matched[i] ); - } - }) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - // Potentially complex pseudos - "not": markFunction(function( selector ) { - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction(function( seed, matches, context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( (elem = unmatched[i]) ) { - seed[i] = !(matches[i] = elem); - } - } - }) : - function( elem, context, xml ) { - input[0] = elem; - matcher( input, null, xml, results ); - return !results.pop(); - }; - }), - - "has": markFunction(function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - }), - - "contains": markFunction(function( text ) { - return function( elem ) { - return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; - }; - }), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - // lang value must be a valid identifier - if ( !ridentifier.test(lang || "") ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( (elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); - return false; - }; - }), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); - }, - - // Boolean properties - "enabled": function( elem ) { - return elem.disabled === false; - }, - - "disabled": function( elem ) { - return elem.disabled === true; - }, - - "checked": function( elem ) { - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); - }, - - "selected": function( elem ) { - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos["empty"]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - "first": createPositionalPseudo(function() { - return [ 0 ]; - }), - - "last": createPositionalPseudo(function( matchIndexes, length ) { - return [ length - 1 ]; - }), - - "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - }), - - "even": createPositionalPseudo(function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "odd": createPositionalPseudo(function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }) - } -}; - -Expr.pseudos["nth"] = Expr.pseudos["eq"]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -tokenize = Sizzle.tokenize = function( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || (match = rcomma.exec( soFar )) ) { - if ( match ) { - // Don't consume trailing commas as valid - soFar = soFar.slice( match[0].length ) || soFar; - } - groups.push( (tokens = []) ); - } - - matched = false; - - // Combinators - if ( (match = rcombinators.exec( soFar )) ) { - matched = match.shift(); - tokens.push({ - value: matched, - // Cast descendant combinators to space - type: match[0].replace( rtrim, " " ) - }); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || - (match = preFilters[ type ]( match ))) ) { - matched = match.shift(); - tokens.push({ - value: matched, - type: type, - matches: match - }); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -}; - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[i].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - checkNonElements = base && dir === "parentNode", - doneName = done++; - - return combinator.first ? - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching - if ( xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || (elem[ expando ] = {}); - if ( (oldCache = outerCache[ dir ]) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return (newCache[ 2 ] = oldCache[ 2 ]); - } else { - // Reuse newcache so results back-propagate to previous elements - outerCache[ dir ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { - return true; - } - } - } - } - } - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[i]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[0]; -} - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[i], results ); - } - return results; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( (elem = unmatched[i]) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction(function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( (elem = temp[i]) ) { - matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) ) { - // Restore matcherIn since elem is not yet a final match - temp.push( (matcherIn[i] = elem) ); - } - } - postFinder( null, (matcherOut = []), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) && - (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) { - - seed[temp] = !(results[temp] = elem); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - }); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[0].type ], - implicitRelative = leadingRelative || Expr.relative[" "], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf.call( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - return ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - (checkContext = context).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - } ]; - - for ( ; i < len; i++ ) { - if ( (matcher = Expr.relative[ tokens[i].type ]) ) { - matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; - } else { - matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[j].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), - len = elems.length; - - if ( outermost ) { - outermostContext = context !== document && context; - } - - // Add elements passing elementMatchers directly to results - // Keep `i` a string if there are no elements so `matchedCount` will be "00" below - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id - for ( ; i !== len && (elem = elems[i]) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - while ( (matcher = elementMatchers[j++]) ) { - if ( matcher( elem, context, xml ) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - // They will have gone through all possible matchers - if ( (elem = !matcher && elem) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // Apply set filters to unmatched elements - matchedCount += i; - if ( bySet && i !== matchedCount ) { - j = 0; - while ( (matcher = setMatchers[j++]) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !(unmatched[i] || setMatched[i]) ) { - setMatched[i] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[i] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; -}; - -/** - * A low-level selection function that works with Sizzle's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -select = Sizzle.select = function( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( (selector = compiled.selector || selector) ); - - results = results || []; - - // Try to minimize operations if there is no seed and only one group - if ( match.length === 1 ) { - - // Take a shortcut and set the context if the root selector is an ID - tokens = match[0] = match[0].slice( 0 ); - if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && - support.getById && context.nodeType === 9 && documentIsHTML && - Expr.relative[ tokens[1].type ] ) { - - context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[i]; - - // Abort if we hit a combinator - if ( Expr.relative[ (type = token.type) ] ) { - break; - } - if ( (find = Expr.find[ type ]) ) { - // Search, expanding context for leading sibling combinators - if ( (seed = find( - token.matches[0].replace( runescape, funescape ), - rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context - )) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; -}; - -// One-time assignments - -// Sort stability -support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; - -// Support: Chrome<14 -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = !!hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert(function( div1 ) { - // Should return 1, but returns 4 (following) - return div1.compareDocumentPosition( document.createElement("div") ) & 1; -}); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert(function( div ) { - div.innerHTML = ""; - return div.firstChild.getAttribute("href") === "#" ; -}) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - }); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert(function( div ) { - div.innerHTML = ""; - div.firstChild.setAttribute( "value", "" ); - return div.firstChild.getAttribute( "value" ) === ""; -}) ) { - addHandle( "value", function( elem, name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - }); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert(function( div ) { - return div.getAttribute("disabled") == null; -}) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - (val = elem.getAttributeNode( name )) && val.specified ? - val.value : - null; - } - }); -} - -return Sizzle; - -})( window ); - - - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; -jQuery.expr[":"] = jQuery.expr.pseudos; -jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; - - - -var rneedsContext = jQuery.expr.match.needsContext; - -var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/); - - - -var risSimple = /^.[^:#\[\.,]*$/; - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( jQuery.isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - /* jshint -W018 */ - return !!qualifier.call( elem, i, elem ) !== not; - }); - - } - - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - }); - - } - - if ( typeof qualifier === "string" ) { - if ( risSimple.test( qualifier ) ) { - return jQuery.filter( qualifier, elements, not ); - } - - qualifier = jQuery.filter( qualifier, elements ); - } - - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) >= 0 ) !== not; - }); -} - -jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - return elems.length === 1 && elem.nodeType === 1 ? - jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : - jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - })); -}; - -jQuery.fn.extend({ - find: function( selector ) { - var i, - len = this.length, - ret = [], - self = this; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter(function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - }) ); - } - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - // Needed because $( selector, context ) becomes $( context ).find( selector ) - ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); - ret.selector = this.selector ? this.selector + " " + selector : selector; - return ret; - }, - filter: function( selector ) { - return this.pushStack( winnow(this, selector || [], false) ); - }, - not: function( selector ) { - return this.pushStack( winnow(this, selector || [], true) ); - }, - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } -}); - - -// Initialize a jQuery object - - -// A central reference to the root jQuery(document) -var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, - - init = jQuery.fn.init = function( selector, context ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector[0] === "<" && selector[ selector.length - 1 ] === ">" && selector.length >= 3 ) { - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && (match[1] || !context) ) { - - // HANDLE: $(html) -> $(array) - if ( match[1] ) { - context = context instanceof jQuery ? context[0] : context; - - // scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[1], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - // Properties of context are called as methods if possible - if ( jQuery.isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[2] ); - - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if ( elem && elem.parentNode ) { - // Inject the element directly into the jQuery object - this.length = 1; - this[0] = elem; - } - - this.context = document; - this.selector = selector; - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || rootjQuery ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this.context = this[0] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( jQuery.isFunction( selector ) ) { - return typeof rootjQuery.ready !== "undefined" ? - rootjQuery.ready( selector ) : - // Execute immediately if ready is not present - selector( jQuery ); - } - - if ( selector.selector !== undefined ) { - this.selector = selector.selector; - this.context = selector.context; - } - - return jQuery.makeArray( selector, this ); - }; - -// Give the init function the jQuery prototype for later instantiation -init.prototype = jQuery.fn; - -// Initialize central reference -rootjQuery = jQuery( document ); - - -var rparentsprev = /^(?:parents|prev(?:Until|All))/, - // methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.extend({ - dir: function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; - }, - - sibling: function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; - } -}); - -jQuery.fn.extend({ - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter(function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[i] ) ) { - return true; - } - } - }); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? - jQuery( selectors, context || this.context ) : - 0; - - for ( ; i < l; i++ ) { - for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) { - // Always skip document fragments - if ( cur.nodeType < 11 && (pos ? - pos.index(cur) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector(cur, selectors)) ) { - - matched.push( cur ); - break; - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched ); - }, - - // Determine the position of an element within - // the matched set of elements - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // index in selector - if ( typeof elem === "string" ) { - return indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - return this.pushStack( - jQuery.unique( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter(selector) - ); - } -}); - -function sibling( cur, dir ) { - while ( (cur = cur[dir]) && cur.nodeType !== 1 ) {} - return cur; -} - -jQuery.each({ - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return jQuery.dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, i, until ) { - return jQuery.dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return jQuery.dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return jQuery.dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, i, until ) { - return jQuery.dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, i, until ) { - return jQuery.dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return jQuery.sibling( elem.firstChild ); - }, - contents: function( elem ) { - return elem.contentDocument || jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.unique( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; -}); -var rnotwhite = (/\S+/g); - - - -// String to Object options format cache -var optionsCache = {}; - -// Convert String-formatted options into Object-formatted ones and store in cache -function createOptions( options ) { - var object = optionsCache[ options ] = {}; - jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { - object[ flag ] = true; - }); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - ( optionsCache[ options ] || createOptions( options ) ) : - jQuery.extend( {}, options ); - - var // Last fire value (for non-forgettable lists) - memory, - // Flag to know if list was already fired - fired, - // Flag to know if list is currently firing - firing, - // First callback to fire (used internally by add and fireWith) - firingStart, - // End of the loop when firing - firingLength, - // Index of currently firing callback (modified by remove if needed) - firingIndex, - // Actual callback list - list = [], - // Stack of fire calls for repeatable lists - stack = !options.once && [], - // Fire callbacks - fire = function( data ) { - memory = options.memory && data; - fired = true; - firingIndex = firingStart || 0; - firingStart = 0; - firingLength = list.length; - firing = true; - for ( ; list && firingIndex < firingLength; firingIndex++ ) { - if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) { - memory = false; // To prevent further calls using add - break; - } - } - firing = false; - if ( list ) { - if ( stack ) { - if ( stack.length ) { - fire( stack.shift() ); - } - } else if ( memory ) { - list = []; - } else { - self.disable(); - } - } - }, - // Actual Callbacks object - self = { - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - // First, we save the current length - var start = list.length; - (function add( args ) { - jQuery.each( args, function( _, arg ) { - var type = jQuery.type( arg ); - if ( type === "function" ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && type !== "string" ) { - // Inspect recursively - add( arg ); - } - }); - })( arguments ); - // Do we need to add the callbacks to the - // current firing batch? - if ( firing ) { - firingLength = list.length; - // With memory, if we're not firing then - // we should call right away - } else if ( memory ) { - firingStart = start; - fire( memory ); - } - } - return this; - }, - // Remove a callback from the list - remove: function() { - if ( list ) { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - // Handle firing indexes - if ( firing ) { - if ( index <= firingLength ) { - firingLength--; - } - if ( index <= firingIndex ) { - firingIndex--; - } - } - } - }); - } - return this; - }, - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length ); - }, - // Remove all callbacks from the list - empty: function() { - list = []; - firingLength = 0; - return this; - }, - // Have the list do nothing anymore - disable: function() { - list = stack = memory = undefined; - return this; - }, - // Is it disabled? - disabled: function() { - return !list; - }, - // Lock the list in its current state - lock: function() { - stack = undefined; - if ( !memory ) { - self.disable(); - } - return this; - }, - // Is it locked? - locked: function() { - return !stack; - }, - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( list && ( !fired || stack ) ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - if ( firing ) { - stack.push( args ); - } else { - fire( args ); - } - } - return this; - }, - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - -jQuery.extend({ - - Deferred: function( func ) { - var tuples = [ - // action, add listener, listener list, final state - [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], - [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], - [ "notify", "progress", jQuery.Callbacks("memory") ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - then: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - return jQuery.Deferred(function( newDefer ) { - jQuery.each( tuples, function( i, tuple ) { - var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; - // deferred[ done | fail | progress ] for forwarding actions to newDefer - deferred[ tuple[1] ](function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && jQuery.isFunction( returned.promise ) ) { - returned.promise() - .done( newDefer.resolve ) - .fail( newDefer.reject ) - .progress( newDefer.notify ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments ); - } - }); - }); - fns = null; - }).promise(); - }, - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Keep pipe for back-compat - promise.pipe = promise.then; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 3 ]; - - // promise[ done | fail | progress ] = list.add - promise[ tuple[1] ] = list.add; - - // Handle state - if ( stateString ) { - list.add(function() { - // state = [ resolved | rejected ] - state = stateString; - - // [ reject_list | resolve_list ].disable; progress_list.lock - }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); - } - - // deferred[ resolve | reject | notify ] - deferred[ tuple[0] ] = function() { - deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments ); - return this; - }; - deferred[ tuple[0] + "With" ] = list.fireWith; - }); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( subordinate /* , ..., subordinateN */ ) { - var i = 0, - resolveValues = slice.call( arguments ), - length = resolveValues.length, - - // the count of uncompleted subordinates - remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, - - // the master Deferred. If resolveValues consist of only a single Deferred, just use that. - deferred = remaining === 1 ? subordinate : jQuery.Deferred(), - - // Update function for both resolve and progress values - updateFunc = function( i, contexts, values ) { - return function( value ) { - contexts[ i ] = this; - values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( values === progressValues ) { - deferred.notifyWith( contexts, values ); - } else if ( !( --remaining ) ) { - deferred.resolveWith( contexts, values ); - } - }; - }, - - progressValues, progressContexts, resolveContexts; - - // add listeners to Deferred subordinates; treat others as resolved - if ( length > 1 ) { - progressValues = new Array( length ); - progressContexts = new Array( length ); - resolveContexts = new Array( length ); - for ( ; i < length; i++ ) { - if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { - resolveValues[ i ].promise() - .done( updateFunc( i, resolveContexts, resolveValues ) ) - .fail( deferred.reject ) - .progress( updateFunc( i, progressContexts, progressValues ) ); - } else { - --remaining; - } - } - } - - // if we're not waiting on anything, resolve the master - if ( !remaining ) { - deferred.resolveWith( resolveContexts, resolveValues ); - } - - return deferred.promise(); - } -}); - - -// The deferred used on DOM ready -var readyList; - -jQuery.fn.ready = function( fn ) { - // Add the callback - jQuery.ready.promise().done( fn ); - - return this; -}; - -jQuery.extend({ - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Hold (or release) the ready event - holdReady: function( hold ) { - if ( hold ) { - jQuery.readyWait++; - } else { - jQuery.ready( true ); - } - }, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - - // Trigger any bound ready events - if ( jQuery.fn.triggerHandler ) { - jQuery( document ).triggerHandler( "ready" ); - jQuery( document ).off( "ready" ); - } - } -}); - -/** - * The ready event handler and self cleanup method - */ -function completed() { - document.removeEventListener( "DOMContentLoaded", completed, false ); - window.removeEventListener( "load", completed, false ); - jQuery.ready(); -} - -jQuery.ready.promise = function( obj ) { - if ( !readyList ) { - - readyList = jQuery.Deferred(); - - // Catch cases where $(document).ready() is called after the browser event has already occurred. - // we once tried to use readyState "interactive" here, but it caused issues like the one - // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 - if ( document.readyState === "complete" ) { - // Handle it asynchronously to allow scripts the opportunity to delay ready - setTimeout( jQuery.ready ); - - } else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed, false ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed, false ); - } - } - return readyList.promise( obj ); -}; - -// Kick off the DOM ready check even if the user does not -jQuery.ready.promise(); - - - - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( jQuery.type( key ) === "object" ) { - chainable = true; - for ( i in key ) { - jQuery.access( elems, fn, i, key[i], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !jQuery.isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) ); - } - } - } - - return chainable ? - elems : - - // Gets - bulk ? - fn.call( elems ) : - len ? fn( elems[0], key ) : emptyGet; -}; - - -/** - * Determines whether an object can have data - */ -jQuery.acceptData = function( owner ) { - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - /* jshint -W018 */ - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); -}; - - -function Data() { - // Support: Android < 4, - // Old WebKit does not have Object.preventExtensions/freeze method, - // return new empty object instead with no [[set]] accessor - Object.defineProperty( this.cache = {}, 0, { - get: function() { - return {}; - } - }); - - this.expando = jQuery.expando + Math.random(); -} - -Data.uid = 1; -Data.accepts = jQuery.acceptData; - -Data.prototype = { - key: function( owner ) { - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return the key for a frozen object. - if ( !Data.accepts( owner ) ) { - return 0; - } - - var descriptor = {}, - // Check if the owner object already has a cache key - unlock = owner[ this.expando ]; - - // If not, create one - if ( !unlock ) { - unlock = Data.uid++; - - // Secure it in a non-enumerable, non-writable property - try { - descriptor[ this.expando ] = { value: unlock }; - Object.defineProperties( owner, descriptor ); - - // Support: Android < 4 - // Fallback to a less secure definition - } catch ( e ) { - descriptor[ this.expando ] = unlock; - jQuery.extend( owner, descriptor ); - } - } - - // Ensure the cache object - if ( !this.cache[ unlock ] ) { - this.cache[ unlock ] = {}; - } - - return unlock; - }, - set: function( owner, data, value ) { - var prop, - // There may be an unlock assigned to this node, - // if there is no entry for this "owner", create one inline - // and set the unlock as though an owner entry had always existed - unlock = this.key( owner ), - cache = this.cache[ unlock ]; - - // Handle: [ owner, key, value ] args - if ( typeof data === "string" ) { - cache[ data ] = value; - - // Handle: [ owner, { properties } ] args - } else { - // Fresh assignments by object are shallow copied - if ( jQuery.isEmptyObject( cache ) ) { - jQuery.extend( this.cache[ unlock ], data ); - // Otherwise, copy the properties one-by-one to the cache object - } else { - for ( prop in data ) { - cache[ prop ] = data[ prop ]; - } - } - } - return cache; - }, - get: function( owner, key ) { - // Either a valid cache is found, or will be created. - // New caches will be created and the unlock returned, - // allowing direct access to the newly created - // empty data object. A valid owner object must be provided. - var cache = this.cache[ this.key( owner ) ]; - - return key === undefined ? - cache : cache[ key ]; - }, - access: function( owner, key, value ) { - var stored; - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ((key && typeof key === "string") && value === undefined) ) { - - stored = this.get( owner, key ); - - return stored !== undefined ? - stored : this.get( owner, jQuery.camelCase(key) ); - } - - // [*]When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, name, camel, - unlock = this.key( owner ), - cache = this.cache[ unlock ]; - - if ( key === undefined ) { - this.cache[ unlock ] = {}; - - } else { - // Support array or space separated string of keys - if ( jQuery.isArray( key ) ) { - // If "name" is an array of keys... - // When data is initially created, via ("key", "val") signature, - // keys will be converted to camelCase. - // Since there is no way to tell _how_ a key was added, remove - // both plain key and camelCase key. #12786 - // This will only penalize the array argument path. - name = key.concat( key.map( jQuery.camelCase ) ); - } else { - camel = jQuery.camelCase( key ); - // Try the string as a key before any manipulation - if ( key in cache ) { - name = [ key, camel ]; - } else { - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - name = camel; - name = name in cache ? - [ name ] : ( name.match( rnotwhite ) || [] ); - } - } - - i = name.length; - while ( i-- ) { - delete cache[ name[ i ] ]; - } - } - }, - hasData: function( owner ) { - return !jQuery.isEmptyObject( - this.cache[ owner[ this.expando ] ] || {} - ); - }, - discard: function( owner ) { - if ( owner[ this.expando ] ) { - delete this.cache[ owner[ this.expando ] ]; - } - } -}; -var data_priv = new Data(); - -var data_user = new Data(); - - - -/* - Implementation Summary - - 1. Enforce API surface and semantic compatibility with 1.9.x branch - 2. Improve the module's maintainability by reducing the storage - paths to a single mechanism. - 3. Use the same single mechanism to support "private" and "user" data. - 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) - 5. Avoid exposing implementation details on user objects (eg. expando properties) - 6. Provide a clear path for implementation upgrade to WeakMap in 2014 -*/ -var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /([A-Z])/g; - -function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = data === "true" ? true : - data === "false" ? false : - data === "null" ? null : - // Only convert to a number if it doesn't change the string - +data + "" === data ? +data : - rbrace.test( data ) ? jQuery.parseJSON( data ) : - data; - } catch( e ) {} - - // Make sure we set the data so it isn't changed later - data_user.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; -} - -jQuery.extend({ - hasData: function( elem ) { - return data_user.hasData( elem ) || data_priv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return data_user.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - data_user.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to data_priv methods, these can be deprecated. - _data: function( elem, name, data ) { - return data_priv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - data_priv.remove( elem, name ); - } -}); - -jQuery.fn.extend({ - data: function( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = data_user.get( elem ); - - if ( elem.nodeType === 1 && !data_priv.get( elem, "hasDataAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE11+ - // The attrs elements can be null (#14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = jQuery.camelCase( name.slice(5) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - data_priv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each(function() { - data_user.set( this, key ); - }); - } - - return access( this, function( value ) { - var data, - camelKey = jQuery.camelCase( key ); - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - // Attempt to get data from the cache - // with the key as-is - data = data_user.get( elem, key ); - if ( data !== undefined ) { - return data; - } - - // Attempt to get data from the cache - // with the key camelized - data = data_user.get( elem, camelKey ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, camelKey, undefined ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - this.each(function() { - // First, attempt to store a copy or reference of any - // data that might've been store with a camelCased key. - var data = data_user.get( this, camelKey ); - - // For HTML5 data-* attribute interop, we have to - // store property names with dashes in a camelCase form. - // This might not apply to all properties...* - data_user.set( this, camelKey, value ); - - // *... In the case of properties that might _actually_ - // have dashes, we need to also store a copy of that - // unchanged property. - if ( key.indexOf("-") !== -1 && data !== undefined ) { - data_user.set( this, key, value ); - } - }); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each(function() { - data_user.remove( this, key ); - }); - } -}); - - -jQuery.extend({ - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = data_priv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || jQuery.isArray( data ) ) { - queue = data_priv.access( elem, type, jQuery.makeArray(data) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // not intended for public consumption - generates a queueHooks object, or returns the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return data_priv.get( elem, key ) || data_priv.access( elem, key, { - empty: jQuery.Callbacks("once memory").add(function() { - data_priv.remove( elem, [ type + "queue", key ] ); - }) - }); - } -}); - -jQuery.fn.extend({ - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[0], type ); - } - - return data === undefined ? - this : - this.each(function() { - var queue = jQuery.queue( this, type, data ); - - // ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[0] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - }); - }, - dequeue: function( type ) { - return this.each(function() { - jQuery.dequeue( this, type ); - }); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = data_priv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -}); -var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source; - -var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - -var isHidden = function( elem, el ) { - // isHidden might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); - }; - -var rcheckableType = (/^(?:checkbox|radio)$/i); - - - -(function() { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ), - input = document.createElement( "input" ); - - // #11217 - WebKit loses check when the name is after the checked attribute - // Support: Windows Web Apps (WWA) - // `name` and `type` need .setAttribute for WWA - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3 - // old WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Make sure textarea (and checkbox) defaultValue is properly cloned - // Support: IE9-IE11+ - div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; -})(); -var strundefined = typeof undefined; - - - -support.focusinBubbles = "onfocusin" in window; - - -var - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/, - rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)$/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = data_priv.get( elem ); - - // Don't attach events to noData or text/comment nodes (but allow plain objects) - if ( !elemData ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !(events = elemData.events) ) { - events = elemData.events = {}; - } - if ( !(eventHandle = elemData.handle) ) { - eventHandle = elemData.handle = function( e ) { - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnotwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[t] ) || []; - type = origType = tmp[1]; - namespaces = ( tmp[2] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend({ - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join(".") - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !(handlers = events[ type ]) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle, false ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = data_priv.hasData( elem ) && data_priv.get( elem ); - - if ( !elemData || !(events = elemData.events) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnotwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[t] ) || []; - type = origType = tmp[1]; - namespaces = ( tmp[2] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - delete elemData.handle; - data_priv.remove( elem, "events" ); - } - }, - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : []; - - cur = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf(".") >= 0 ) { - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split("."); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf(":") < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join("."); - event.namespace_re = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === (elem.ownerDocument || document) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) { - - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( data_priv.get( cur, "events" ) || {} )[ event.type ] && data_priv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && jQuery.acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) && - jQuery.acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - elem[ type ](); - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - dispatch: function( event ) { - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( event ); - - var i, j, ret, matched, handleObj, - handlerQueue = [], - args = slice.call( arguments ), - handlers = ( data_priv.get( this, "events" ) || {} )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[0] = event; - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) { - - // Triggered event must either 1) have no namespace, or - // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). - if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) - .apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( (event.result = ret) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, matches, sel, handleObj, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - // Black-hole SVG instance trees (#13180) - // Avoid non-left-click bubbling in Firefox (#3861) - if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.disabled !== true || event.type !== "click" ) { - matches = []; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matches[ sel ] === undefined ) { - matches[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) >= 0 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matches[ sel ] ) { - matches.push( handleObj ); - } - } - if ( matches.length ) { - handlerQueue.push({ elem: cur, handlers: matches }); - } - } - } - } - - // Add the remaining (directly-bound) handlers - if ( delegateCount < handlers.length ) { - handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) }); - } - - return handlerQueue; - }, - - // Includes some event props shared by KeyEvent and MouseEvent - props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), - - fixHooks: {}, - - keyHooks: { - props: "char charCode key keyCode".split(" "), - filter: function( event, original ) { - - // Add which for key events - if ( event.which == null ) { - event.which = original.charCode != null ? original.charCode : original.keyCode; - } - - return event; - } - }, - - mouseHooks: { - props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "), - filter: function( event, original ) { - var eventDoc, doc, body, - button = original.button; - - // Calculate pageX/Y if missing and clientX/Y available - if ( event.pageX == null && original.clientX != null ) { - eventDoc = event.target.ownerDocument || document; - doc = eventDoc.documentElement; - body = eventDoc.body; - - event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); - event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - // Note: button is not normalized, so don't use it - if ( !event.which && button !== undefined ) { - event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); - } - - return event; - } - }, - - fix: function( event ) { - if ( event[ jQuery.expando ] ) { - return event; - } - - // Create a writable copy of the event object and normalize some properties - var i, prop, copy, - type = event.type, - originalEvent = event, - fixHook = this.fixHooks[ type ]; - - if ( !fixHook ) { - this.fixHooks[ type ] = fixHook = - rmouseEvent.test( type ) ? this.mouseHooks : - rkeyEvent.test( type ) ? this.keyHooks : - {}; - } - copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; - - event = new jQuery.Event( originalEvent ); - - i = copy.length; - while ( i-- ) { - prop = copy[ i ]; - event[ prop ] = originalEvent[ prop ]; - } - - // Support: Cordova 2.5 (WebKit) (#13255) - // All events should have a target; Cordova deviceready doesn't - if ( !event.target ) { - event.target = document; - } - - // Support: Safari 6.0+, Chrome < 28 - // Target should not be a text node (#504, #13143) - if ( event.target.nodeType === 3 ) { - event.target = event.target.parentNode; - } - - return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; - }, - - special: { - load: { - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - focus: { - // Fire native event if possible so blur/focus sequence is correct - trigger: function() { - if ( this !== safeActiveElement() && this.focus ) { - this.focus(); - return false; - } - }, - delegateType: "focusin" - }, - blur: { - trigger: function() { - if ( this === safeActiveElement() && this.blur ) { - this.blur(); - return false; - } - }, - delegateType: "focusout" - }, - click: { - // For checkbox, fire native event so checked state will be right - trigger: function() { - if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) { - this.click(); - return false; - } - }, - - // For cross-browser consistency, don't fire native .click() on links - _default: function( event ) { - return jQuery.nodeName( event.target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - }, - - simulate: function( type, elem, event, bubble ) { - // Piggyback on a donor event to simulate a different one. - // Fake originalEvent to avoid donor's stopPropagation, but if the - // simulated event prevents default then we do the same on the donor. - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true, - originalEvent: {} - } - ); - if ( bubble ) { - jQuery.event.trigger( e, null, elem ); - } else { - jQuery.event.dispatch.call( elem, e ); - } - if ( e.isDefaultPrevented() ) { - event.preventDefault(); - } - } -}; - -jQuery.removeEvent = function( elem, type, handle ) { - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle, false ); - } -}; - -jQuery.Event = function( src, props ) { - // Allow instantiation without the 'new' keyword - if ( !(this instanceof jQuery.Event) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - // Support: Android < 4.0 - src.returnValue === false ? - returnTrue : - returnFalse; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || jQuery.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && e.preventDefault ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && e.stopPropagation ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && e.stopImmediatePropagation ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } -}; - -// Create mouseenter/leave events using mouseover/out and event-time checks -// Support: Chrome 15+ -jQuery.each({ - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mousenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || (related !== target && !jQuery.contains( target, related )) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -}); - -// Create "bubbling" focus and blur events -// Support: Firefox, Chrome, Safari -if ( !support.focusinBubbles ) { - jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - var doc = this.ownerDocument || this, - attaches = data_priv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - data_priv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this, - attaches = data_priv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - data_priv.remove( doc, fix ); - - } else { - data_priv.access( doc, fix, attaches ); - } - } - }; - }); -} - -jQuery.fn.extend({ - - on: function( types, selector, data, fn, /*INTERNAL*/ one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - this.on( type, selector, data, types[ type ], one ); - } - return this; - } - - if ( data == null && fn == null ) { - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return this; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return this.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - }); - }, - one: function( types, selector, data, fn ) { - return this.on( types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each(function() { - jQuery.event.remove( this, types, fn, selector ); - }); - }, - - trigger: function( type, data ) { - return this.each(function() { - jQuery.event.trigger( type, data, this ); - }); - }, - triggerHandler: function( type, data ) { - var elem = this[0]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -}); - - -var - rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, - rtagName = /<([\w:]+)/, - rhtml = /<|&#?\w+;/, - rnoInnerhtml = /<(?:script|style|link)/i, - // checked="checked" or checked - rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, - rscriptType = /^$|\/(?:java|ecma)script/i, - rscriptTypeMasked = /^true\/(.*)/, - rcleanScript = /^\s*\s*$/g, - - // We have to close these tags to support XHTML (#13200) - wrapMap = { - - // Support: IE 9 - option: [ 1, "" ], - - thead: [ 1, "", "
    " ], - col: [ 2, "", "
    " ], - tr: [ 2, "", "
    " ], - td: [ 3, "", "
    " ], - - _default: [ 0, "", "" ] - }; - -// Support: IE 9 -wrapMap.optgroup = wrapMap.option; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -// Support: 1.x compatibility -// Manipulating tables requires a tbody -function manipulationTarget( elem, content ) { - return jQuery.nodeName( elem, "table" ) && - jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? - - elem.getElementsByTagName("tbody")[0] || - elem.appendChild( elem.ownerDocument.createElement("tbody") ) : - elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - var match = rscriptTypeMasked.exec( elem.type ); - - if ( match ) { - elem.type = match[ 1 ]; - } else { - elem.removeAttribute("type"); - } - - return elem; -} - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - data_priv.set( - elems[ i ], "globalEval", !refElements || data_priv.get( refElements[ i ], "globalEval" ) - ); - } -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( data_priv.hasData( src ) ) { - pdataOld = data_priv.access( src ); - pdataCur = data_priv.set( dest, pdataOld ); - events = pdataOld.events; - - if ( events ) { - delete pdataCur.handle; - pdataCur.events = {}; - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( data_user.hasData( src ) ) { - udataOld = data_user.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - data_user.set( dest, udataCur ); - } -} - -function getAll( context, tag ) { - var ret = context.getElementsByTagName ? context.getElementsByTagName( tag || "*" ) : - context.querySelectorAll ? context.querySelectorAll( tag || "*" ) : - []; - - return tag === undefined || tag && jQuery.nodeName( context, tag ) ? - jQuery.merge( [ context ], ret ) : - ret; -} - -// Support: IE >= 9 -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -jQuery.extend({ - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = jQuery.contains( elem.ownerDocument, elem ); - - // Support: IE >= 9 - // Fix Cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - buildFragment: function( elems, context, scripts, selection ) { - var elem, tmp, tag, wrap, contains, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( jQuery.type( elem ) === "object" ) { - // Support: QtWebKit - // jQuery.merge because push.apply(_, arraylike) throws - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement("div") ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1>" ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: QtWebKit - // jQuery.merge because push.apply(_, arraylike) throws - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Fixes #12346 - // Support: Webkit, IE - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( (elem = nodes[ i++ ]) ) { - - // #4087 - If origin and destination elements are the same, and this is - // that element, do not do anything - if ( selection && jQuery.inArray( elem, selection ) !== -1 ) { - continue; - } - - contains = jQuery.contains( elem.ownerDocument, elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( contains ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( (elem = tmp[ j++ ]) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; - }, - - cleanData: function( elems ) { - var data, elem, type, key, - special = jQuery.event.special, - i = 0; - - for ( ; (elem = elems[ i ]) !== undefined; i++ ) { - if ( jQuery.acceptData( elem ) ) { - key = elem[ data_priv.expando ]; - - if ( key && (data = data_priv.cache[ key ]) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - if ( data_priv.cache[ key ] ) { - // Discard any remaining `private` data - delete data_priv.cache[ key ]; - } - } - } - // Discard any remaining `user` data - delete data_user.cache[ elem[ data_user.expando ] ]; - } - } -}); - -jQuery.fn.extend({ - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each(function() { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - }); - }, null, value, arguments.length ); - }, - - append: function() { - return this.domManip( arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - }); - }, - - prepend: function() { - return this.domManip( arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - }); - }, - - before: function() { - return this.domManip( arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - }); - }, - - after: function() { - return this.domManip( arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - }); - }, - - remove: function( selector, keepData /* Internal Use Only */ ) { - var elem, - elems = selector ? jQuery.filter( selector, this ) : this, - i = 0; - - for ( ; (elem = elems[i]) != null; i++ ) { - if ( !keepData && elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem ) ); - } - - if ( elem.parentNode ) { - if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { - setGlobalEval( getAll( elem, "script" ) ); - } - elem.parentNode.removeChild( elem ); - } - } - - return this; - }, - - empty: function() { - var elem, - i = 0; - - for ( ; (elem = this[i]) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map(function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - }); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = value.replace( rxhtmlTag, "<$1>" ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var arg = arguments[ 0 ]; - - // Make the changes, replacing each context element with the new content - this.domManip( arguments, function( elem ) { - arg = this.parentNode; - - jQuery.cleanData( getAll( this ) ); - - if ( arg ) { - arg.replaceChild( elem, this ); - } - }); - - // Force removal if there was no new content (e.g., from empty arguments) - return arg && (arg.length || arg.nodeType) ? this : this.remove(); - }, - - detach: function( selector ) { - return this.remove( selector, true ); - }, - - domManip: function( args, callback ) { - - // Flatten any nested arrays - args = concat.apply( [], args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = this.length, - set = this, - iNoClone = l - 1, - value = args[ 0 ], - isFunction = jQuery.isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( isFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return this.each(function( index ) { - var self = set.eq( index ); - if ( isFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - self.domManip( args, callback ); - }); - } - - if ( l ) { - fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - if ( first ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - // Support: QtWebKit - // jQuery.merge because push.apply(_, arraylike) throws - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( this[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !data_priv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) { - - if ( node.src ) { - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl ) { - jQuery._evalUrl( node.src ); - } - } else { - jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) ); - } - } - } - } - } - } - - return this; - } -}); - -jQuery.each({ - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: QtWebKit - // .get() because push.apply(_, arraylike) throws - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -}); - - -var iframe, - elemdisplay = {}; - -/** - * Retrieve the actual display of a element - * @param {String} name nodeName of the element - * @param {Object} doc Document object - */ -// Called only from within defaultDisplay -function actualDisplay( name, doc ) { - var style, - elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), - - // getDefaultComputedStyle might be reliably used only on attached element - display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ? - - // Use of this method is a temporary fix (more like optmization) until something better comes along, - // since it was removed from specification and supported only in FF - style.display : jQuery.css( elem[ 0 ], "display" ); - - // We don't have any data stored on the element, - // so use "detach" method as fast way to get rid of the element - elem.detach(); - - return display; -} - -/** - * Try to determine the default display value of an element - * @param {String} nodeName - */ -function defaultDisplay( nodeName ) { - var doc = document, - display = elemdisplay[ nodeName ]; - - if ( !display ) { - display = actualDisplay( nodeName, doc ); - - // If the simple way fails, read from inside an iframe - if ( display === "none" || !display ) { - - // Use the already-created iframe if possible - iframe = (iframe || jQuery( "