• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2006 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.internal.telephony;
18 
19 import android.app.ActivityManager;
20 import android.app.AlarmManager;
21 import android.content.Context;
22 import android.content.res.Configuration;
23 import android.net.wifi.WifiManager;
24 import android.os.Build;
25 import android.os.RemoteException;
26 import android.os.SystemProperties;
27 import android.telephony.TelephonyManager;
28 import android.text.TextUtils;
29 import android.util.Slog;
30 
31 import com.android.internal.app.LocaleStore;
32 import com.android.internal.app.LocaleStore.LocaleInfo;
33 
34 import libcore.icu.ICU;
35 import libcore.icu.TimeZoneNames;
36 
37 import java.util.ArrayList;
38 import java.util.Arrays;
39 import java.util.Collections;
40 import java.util.HashMap;
41 import java.util.List;
42 import java.util.Locale;
43 import java.util.Map;
44 
45 /**
46  * Mobile Country Code
47  *
48  * {@hide}
49  */
50 public final class MccTable {
51     static final String LOG_TAG = "MccTable";
52 
53     static ArrayList<MccEntry> sTable;
54 
55     static class MccEntry implements Comparable<MccEntry> {
56         final int mMcc;
57         final String mIso;
58         final int mSmallestDigitsMnc;
59 
MccEntry(int mnc, String iso, int smallestDigitsMCC)60         MccEntry(int mnc, String iso, int smallestDigitsMCC) {
61             if (iso == null) {
62                 throw new NullPointerException();
63             }
64             mMcc = mnc;
65             mIso = iso;
66             mSmallestDigitsMnc = smallestDigitsMCC;
67         }
68 
69         @Override
compareTo(MccEntry o)70         public int compareTo(MccEntry o) {
71             return mMcc - o.mMcc;
72         }
73     }
74 
entryForMcc(int mcc)75     private static MccEntry entryForMcc(int mcc) {
76         MccEntry m = new MccEntry(mcc, "", 0);
77 
78         int index = Collections.binarySearch(sTable, m);
79 
80         if (index < 0) {
81             return null;
82         } else {
83             return sTable.get(index);
84         }
85     }
86 
87     /**
88      * Returns a default time zone ID for the given MCC.
89      * @param mcc Mobile Country Code
90      * @return default TimeZone ID, or null if not specified
91      */
defaultTimeZoneForMcc(int mcc)92     public static String defaultTimeZoneForMcc(int mcc) {
93         MccEntry entry = entryForMcc(mcc);
94         if (entry == null) {
95             return null;
96         }
97         Locale locale = new Locale("", entry.mIso);
98         String[] tz = TimeZoneNames.forLocale(locale);
99         if (tz.length == 0) return null;
100 
101         String zoneName = tz[0];
102 
103         /* Use Australia/Sydney instead of Australia/Lord_Howe for Australia.
104          * http://b/33228250
105          * Todo: remove the code, see b/62418027
106          */
107         if (mcc == 505  /* Australia / Norfolk Island */) {
108             for (String zone : tz) {
109                 if (zone.contains("Sydney")) {
110                     zoneName = zone;
111                 }
112             }
113         }
114         return zoneName;
115     }
116 
117     /**
118      * Given a GSM Mobile Country Code, returns
119      * an ISO two-character country code if available.
120      * Returns "" if unavailable.
121      */
countryCodeForMcc(int mcc)122     public static String countryCodeForMcc(int mcc) {
123         MccEntry entry = entryForMcc(mcc);
124 
125         if (entry == null) {
126             return "";
127         } else {
128             return entry.mIso;
129         }
130     }
131 
132     /**
133      * Given a GSM Mobile Country Code, returns
134      * an ISO 2-3 character language code if available.
135      * Returns null if unavailable.
136      */
defaultLanguageForMcc(int mcc)137     public static String defaultLanguageForMcc(int mcc) {
138         MccEntry entry = entryForMcc(mcc);
139         if (entry == null) {
140             Slog.d(LOG_TAG, "defaultLanguageForMcc(" + mcc + "): no country for mcc");
141             return null;
142         }
143 
144         final String country = entry.mIso;
145 
146         // Choose English as the default language for India.
147         if ("in".equals(country)) {
148             return "en";
149         }
150 
151         // Ask CLDR for the language this country uses...
152         Locale likelyLocale = ICU.addLikelySubtags(new Locale("und", country));
153         String likelyLanguage = likelyLocale.getLanguage();
154         Slog.d(LOG_TAG, "defaultLanguageForMcc(" + mcc + "): country " + country + " uses " +
155                likelyLanguage);
156         return likelyLanguage;
157     }
158 
159     /**
160      * Given a GSM Mobile Country Code, returns
161      * the smallest number of digits that M if available.
162      * Returns 2 if unavailable.
163      */
smallestDigitsMccForMnc(int mcc)164     public static int smallestDigitsMccForMnc(int mcc) {
165         MccEntry entry = entryForMcc(mcc);
166 
167         if (entry == null) {
168             return 2;
169         } else {
170             return entry.mSmallestDigitsMnc;
171         }
172     }
173 
174     /**
175      * Updates MCC and MNC device configuration information for application retrieving
176      * correct version of resources.  If MCC is 0, MCC and MNC will be ignored (not set).
177      * @param context Context to act on.
178      * @param mccmnc truncated imsi with just the MCC and MNC - MNC assumed to be from 4th to end
179      * @param fromServiceState true if coming from the radio service state, false if from SIM
180      */
updateMccMncConfiguration(Context context, String mccmnc, boolean fromServiceState)181     public static void updateMccMncConfiguration(Context context, String mccmnc,
182             boolean fromServiceState) {
183         Slog.d(LOG_TAG, "updateMccMncConfiguration mccmnc='" + mccmnc + "' fromServiceState=" + fromServiceState);
184 
185         if (Build.IS_DEBUGGABLE) {
186             String overrideMcc = SystemProperties.get("persist.sys.override_mcc");
187             if (!TextUtils.isEmpty(overrideMcc)) {
188                 mccmnc = overrideMcc;
189                 Slog.d(LOG_TAG, "updateMccMncConfiguration overriding mccmnc='" + mccmnc + "'");
190             }
191         }
192 
193         if (!TextUtils.isEmpty(mccmnc)) {
194             int mcc, mnc;
195 
196             String defaultMccMnc = TelephonyManager.getDefault().getSimOperatorNumeric();
197             Slog.d(LOG_TAG, "updateMccMncConfiguration defaultMccMnc=" + defaultMccMnc);
198             //Update mccmnc only for default subscription in case of MultiSim.
199 //            if (!defaultMccMnc.equals(mccmnc)) {
200 //                Slog.d(LOG_TAG, "Not a Default subscription, ignoring mccmnc config update.");
201 //                return;
202 //            }
203 
204             try {
205                 mcc = Integer.parseInt(mccmnc.substring(0,3));
206                 mnc = Integer.parseInt(mccmnc.substring(3));
207             } catch (NumberFormatException e) {
208                 Slog.e(LOG_TAG, "Error parsing IMSI: " + mccmnc);
209                 return;
210             }
211 
212             Slog.d(LOG_TAG, "updateMccMncConfiguration: mcc=" + mcc + ", mnc=" + mnc);
213             if (mcc != 0) {
214                 setTimezoneFromMccIfNeeded(context, mcc);
215             }
216             if (fromServiceState) {
217                 setWifiCountryCodeFromMcc(context, mcc);
218             } else {
219                 // from SIM
220                 try {
221                     Configuration config = new Configuration();
222                     boolean updateConfig = false;
223                     if (mcc != 0) {
224                         config.mcc = mcc;
225                         config.mnc = mnc == 0 ? Configuration.MNC_ZERO : mnc;
226                         updateConfig = true;
227                     }
228 
229                     if (updateConfig) {
230                         Slog.d(LOG_TAG, "updateMccMncConfiguration updateConfig config=" + config);
231                         ActivityManager.getService().updateConfiguration(config);
232                     } else {
233                         Slog.d(LOG_TAG, "updateMccMncConfiguration nothing to update");
234                     }
235                 } catch (RemoteException e) {
236                     Slog.e(LOG_TAG, "Can't update configuration", e);
237                 }
238             }
239         } else {
240             if (fromServiceState) {
241                 // an empty mccmnc means no signal - tell wifi we don't know
242                 setWifiCountryCodeFromMcc(context, 0);
243             }
244         }
245     }
246 
247     /**
248      * Maps a given locale to a fallback locale that approximates it. This is a hack.
249      */
250     private static final Map<Locale, Locale> FALLBACKS = new HashMap<Locale, Locale>();
251 
252     static {
253         // If we have English (without a country) explicitly prioritize en_US. http://b/28998094
FALLBACKS.put(Locale.ENGLISH, Locale.US)254         FALLBACKS.put(Locale.ENGLISH, Locale.US);
255     }
256 
257     /**
258      * Finds a suitable locale among {@code candidates} to use as the fallback locale for
259      * {@code target}. This looks through the list of {@link #FALLBACKS}, and follows the chain
260      * until a locale in {@code candidates} is found.
261      * This function assumes that {@code target} is not in {@code candidates}.
262      *
263      * TODO: This should really follow the CLDR chain of parent locales! That might be a bit
264      * of a problem because we don't really have an en-001 locale on android.
265      *
266      * @return The fallback locale or {@code null} if there is no suitable fallback defined in the
267      *         lookup.
268      */
lookupFallback(Locale target, List<Locale> candidates)269     private static Locale lookupFallback(Locale target, List<Locale> candidates) {
270         Locale fallback = target;
271         while ((fallback = FALLBACKS.get(fallback)) != null) {
272             if (candidates.contains(fallback)) {
273                 return fallback;
274             }
275         }
276 
277         return null;
278     }
279 
280     /**
281      * Return Locale for the language and country or null if no good match.
282      *
283      * @param context Context to act on.
284      * @param language Two character language code desired
285      * @param country Two character country code desired
286      *
287      * @return Locale or null if no appropriate value
288      */
getLocaleForLanguageCountry(Context context, String language, String country)289     private static Locale getLocaleForLanguageCountry(Context context, String language,
290             String country) {
291         if (language == null) {
292             Slog.d(LOG_TAG, "getLocaleForLanguageCountry: skipping no language");
293             return null; // no match possible
294         }
295         if (country == null) {
296             country = ""; // The Locale constructor throws if passed null.
297         }
298 
299         final Locale target = new Locale(language, country);
300         try {
301             String[] localeArray = context.getAssets().getLocales();
302             List<String> locales = new ArrayList<>(Arrays.asList(localeArray));
303 
304             // Even in developer mode, you don't want the pseudolocales.
305             locales.remove("ar-XB");
306             locales.remove("en-XA");
307 
308             List<Locale> languageMatches = new ArrayList<>();
309             for (String locale : locales) {
310                 final Locale l = Locale.forLanguageTag(locale.replace('_', '-'));
311 
312                 // Only consider locales with both language and country.
313                 if (l == null || "und".equals(l.getLanguage()) ||
314                         l.getLanguage().isEmpty() || l.getCountry().isEmpty()) {
315                     continue;
316                 }
317                 if (l.getLanguage().equals(target.getLanguage())) {
318                     // If we got a perfect match, we're done.
319                     if (l.getCountry().equals(target.getCountry())) {
320                         Slog.d(LOG_TAG, "getLocaleForLanguageCountry: got perfect match: " +
321                                l.toLanguageTag());
322                         return l;
323                     }
324 
325                     // We've only matched the language, not the country.
326                     languageMatches.add(l);
327                 }
328             }
329 
330             if (languageMatches.isEmpty()) {
331                 Slog.d(LOG_TAG, "getLocaleForLanguageCountry: no locales for language " + language);
332                 return null;
333             }
334 
335             Locale bestMatch = lookupFallback(target, languageMatches);
336             if (bestMatch != null) {
337                 Slog.d(LOG_TAG, "getLocaleForLanguageCountry: got a fallback match: "
338                         + bestMatch.toLanguageTag());
339                 return bestMatch;
340             } else {
341                 // Ask {@link LocaleStore} whether this locale is considered "translated".
342                 // LocaleStore has a broader definition of translated than just the asset locales
343                 // above: a locale is "translated" if it has translation assets, or another locale
344                 // with the same language and script has translation assets.
345                 // If a locale is "translated", it is selectable in setup wizard, and can therefore
346                 // be considerd a valid result for this method.
347                 if (!TextUtils.isEmpty(target.getCountry())) {
348                     LocaleStore.fillCache(context);
349                     LocaleInfo targetInfo = LocaleStore.getLocaleInfo(target);
350                     if (targetInfo.isTranslated()) {
351                         Slog.d(LOG_TAG, "getLocaleForLanguageCountry: "
352                                 + "target locale is translated: " + target);
353                         return target;
354                     }
355                 }
356 
357                 // Somewhat arbitrarily take the first locale for the language,
358                 // unless we get a perfect match later. Note that these come back in no
359                 // particular order, so there's no reason to think the first match is
360                 // a particularly good match.
361                 Slog.d(LOG_TAG, "getLocaleForLanguageCountry: got language-only match: "
362                         + language);
363                 return languageMatches.get(0);
364             }
365         } catch (Exception e) {
366             Slog.d(LOG_TAG, "getLocaleForLanguageCountry: exception", e);
367         }
368 
369         return null;
370     }
371 
372     /**
373      * If the timezone is not already set, set it based on the MCC of the SIM.
374      * @param context Context to act on.
375      * @param mcc Mobile Country Code of the SIM or SIM-like entity (build prop on CDMA)
376      */
setTimezoneFromMccIfNeeded(Context context, int mcc)377     private static void setTimezoneFromMccIfNeeded(Context context, int mcc) {
378         String timezone = SystemProperties.get(ServiceStateTracker.TIMEZONE_PROPERTY);
379         // timezone.equals("GMT") will be true and only true if the timezone was
380         // set to a default value by the system server (when starting, system server.
381         // sets the persist.sys.timezone to "GMT" if it's not set)."GMT" is not used by
382         // any code that sets it explicitly (in case where something sets GMT explicitly,
383         // "Etc/GMT" Olsen ID would be used).
384         // TODO(b/64056758): Remove "timezone.equals("GMT")" hack when there's a
385         // better way of telling if the value has been defaulted.
386         if (timezone == null || timezone.length() == 0 || timezone.equals("GMT")) {
387             String zoneId = defaultTimeZoneForMcc(mcc);
388             if (zoneId != null && zoneId.length() > 0) {
389                 // Set time zone based on MCC
390                 AlarmManager alarm =
391                         (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
392                 alarm.setTimeZone(zoneId);
393                 Slog.d(LOG_TAG, "timezone set to " + zoneId);
394             }
395         }
396     }
397 
398     /**
399      * Get Locale based on the MCC of the SIM.
400      *
401      * @param context Context to act on.
402      * @param mcc Mobile Country Code of the SIM or SIM-like entity (build prop on CDMA)
403      * @param simLanguage (nullable) the language from the SIM records (if present).
404      *
405      * @return locale for the mcc or null if none
406      */
getLocaleFromMcc(Context context, int mcc, String simLanguage)407     public static Locale getLocaleFromMcc(Context context, int mcc, String simLanguage) {
408         boolean hasSimLanguage = !TextUtils.isEmpty(simLanguage);
409         String language = hasSimLanguage ? simLanguage : MccTable.defaultLanguageForMcc(mcc);
410         String country = MccTable.countryCodeForMcc(mcc);
411 
412         Slog.d(LOG_TAG, "getLocaleFromMcc(" + language + ", " + country + ", " + mcc);
413         final Locale locale = getLocaleForLanguageCountry(context, language, country);
414 
415         // If we couldn't find a locale that matches the SIM language, give it a go again
416         // with the "likely" language for the given country.
417         if (locale == null && hasSimLanguage) {
418             language = MccTable.defaultLanguageForMcc(mcc);
419             Slog.d(LOG_TAG, "[retry ] getLocaleFromMcc(" + language + ", " + country + ", " + mcc);
420             return getLocaleForLanguageCountry(context, language, country);
421         }
422 
423         return locale;
424     }
425 
426     /**
427      * Set the country code for wifi.  This sets allowed wifi channels based on the
428      * country of the carrier we see.  If we can't see any, reset to 0 so we don't
429      * broadcast on forbidden channels.
430      * @param context Context to act on.
431      * @param mcc Mobile Country Code of the operator.  0 if not known
432      */
setWifiCountryCodeFromMcc(Context context, int mcc)433     private static void setWifiCountryCodeFromMcc(Context context, int mcc) {
434         String country = MccTable.countryCodeForMcc(mcc);
435         Slog.d(LOG_TAG, "WIFI_COUNTRY_CODE set to " + country);
436         WifiManager wM = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
437         wM.setCountryCode(country, false);
438     }
439 
440     static {
441         sTable = new ArrayList<MccEntry>(240);
442 
443 
444         /*
445          * The table below is built from two resources:
446          *
447          * 1) ITU "Mobile Network Code (MNC) for the international
448          *   identification plan for mobile terminals and mobile users"
449          *   which is available as an annex to the ITU operational bulletin
450          *   available here: http://www.itu.int/itu-t/bulletin/annex.html
451          *
452          * 2) The ISO 3166 country codes list, available here:
453          *    http://www.iso.org/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/index.html
454          *
455          * This table has not been verified.
456          */
457 
sTable.add(new MccEntry(202,"gr",2))458 		sTable.add(new MccEntry(202,"gr",2));	//Greece
sTable.add(new MccEntry(204,"nl",2))459 		sTable.add(new MccEntry(204,"nl",2));	//Netherlands (Kingdom of the)
sTable.add(new MccEntry(206,"be",2))460 		sTable.add(new MccEntry(206,"be",2));	//Belgium
sTable.add(new MccEntry(208,"fr",2))461 		sTable.add(new MccEntry(208,"fr",2));	//France
sTable.add(new MccEntry(212,"mc",2))462 		sTable.add(new MccEntry(212,"mc",2));	//Monaco (Principality of)
sTable.add(new MccEntry(213,"ad",2))463 		sTable.add(new MccEntry(213,"ad",2));	//Andorra (Principality of)
sTable.add(new MccEntry(214,"es",2))464 		sTable.add(new MccEntry(214,"es",2));	//Spain
sTable.add(new MccEntry(216,"hu",2))465 		sTable.add(new MccEntry(216,"hu",2));	//Hungary (Republic of)
sTable.add(new MccEntry(218,"ba",2))466 		sTable.add(new MccEntry(218,"ba",2));	//Bosnia and Herzegovina
sTable.add(new MccEntry(219,"hr",2))467 		sTable.add(new MccEntry(219,"hr",2));	//Croatia (Republic of)
sTable.add(new MccEntry(220,"rs",2))468 		sTable.add(new MccEntry(220,"rs",2));	//Serbia and Montenegro
sTable.add(new MccEntry(222,"it",2))469 		sTable.add(new MccEntry(222,"it",2));	//Italy
sTable.add(new MccEntry(225,"va",2))470 		sTable.add(new MccEntry(225,"va",2));	//Vatican City State
sTable.add(new MccEntry(226,"ro",2))471 		sTable.add(new MccEntry(226,"ro",2));	//Romania
sTable.add(new MccEntry(228,"ch",2))472 		sTable.add(new MccEntry(228,"ch",2));	//Switzerland (Confederation of)
sTable.add(new MccEntry(230,"cz",2))473 		sTable.add(new MccEntry(230,"cz",2));	//Czechia
sTable.add(new MccEntry(231,"sk",2))474 		sTable.add(new MccEntry(231,"sk",2));	//Slovak Republic
sTable.add(new MccEntry(232,"at",2))475 		sTable.add(new MccEntry(232,"at",2));	//Austria
sTable.add(new MccEntry(234,"gb",2))476 		sTable.add(new MccEntry(234,"gb",2));	//United Kingdom of Great Britain and Northern Ireland
sTable.add(new MccEntry(235,"gb",2))477 		sTable.add(new MccEntry(235,"gb",2));	//United Kingdom of Great Britain and Northern Ireland
sTable.add(new MccEntry(238,"dk",2))478 		sTable.add(new MccEntry(238,"dk",2));	//Denmark
sTable.add(new MccEntry(240,"se",2))479 		sTable.add(new MccEntry(240,"se",2));	//Sweden
sTable.add(new MccEntry(242,"no",2))480 		sTable.add(new MccEntry(242,"no",2));	//Norway
sTable.add(new MccEntry(244,"fi",2))481 		sTable.add(new MccEntry(244,"fi",2));	//Finland
sTable.add(new MccEntry(246,"lt",2))482 		sTable.add(new MccEntry(246,"lt",2));	//Lithuania (Republic of)
sTable.add(new MccEntry(247,"lv",2))483 		sTable.add(new MccEntry(247,"lv",2));	//Latvia (Republic of)
sTable.add(new MccEntry(248,"ee",2))484 		sTable.add(new MccEntry(248,"ee",2));	//Estonia (Republic of)
sTable.add(new MccEntry(250,"ru",2))485 		sTable.add(new MccEntry(250,"ru",2));	//Russian Federation
sTable.add(new MccEntry(255,"ua",2))486 		sTable.add(new MccEntry(255,"ua",2));	//Ukraine
sTable.add(new MccEntry(257,"by",2))487 		sTable.add(new MccEntry(257,"by",2));	//Belarus (Republic of)
sTable.add(new MccEntry(259,"md",2))488 		sTable.add(new MccEntry(259,"md",2));	//Moldova (Republic of)
sTable.add(new MccEntry(260,"pl",2))489 		sTable.add(new MccEntry(260,"pl",2));	//Poland (Republic of)
sTable.add(new MccEntry(262,"de",2))490 		sTable.add(new MccEntry(262,"de",2));	//Germany (Federal Republic of)
sTable.add(new MccEntry(266,"gi",2))491 		sTable.add(new MccEntry(266,"gi",2));	//Gibraltar
sTable.add(new MccEntry(268,"pt",2))492 		sTable.add(new MccEntry(268,"pt",2));	//Portugal
sTable.add(new MccEntry(270,"lu",2))493 		sTable.add(new MccEntry(270,"lu",2));	//Luxembourg
sTable.add(new MccEntry(272,"ie",2))494 		sTable.add(new MccEntry(272,"ie",2));	//Ireland
sTable.add(new MccEntry(274,"is",2))495 		sTable.add(new MccEntry(274,"is",2));	//Iceland
sTable.add(new MccEntry(276,"al",2))496 		sTable.add(new MccEntry(276,"al",2));	//Albania (Republic of)
sTable.add(new MccEntry(278,"mt",2))497 		sTable.add(new MccEntry(278,"mt",2));	//Malta
sTable.add(new MccEntry(280,"cy",2))498 		sTable.add(new MccEntry(280,"cy",2));	//Cyprus (Republic of)
sTable.add(new MccEntry(282,"ge",2))499 		sTable.add(new MccEntry(282,"ge",2));	//Georgia
sTable.add(new MccEntry(283,"am",2))500 		sTable.add(new MccEntry(283,"am",2));	//Armenia (Republic of)
sTable.add(new MccEntry(284,"bg",2))501 		sTable.add(new MccEntry(284,"bg",2));	//Bulgaria (Republic of)
sTable.add(new MccEntry(286,"tr",2))502 		sTable.add(new MccEntry(286,"tr",2));	//Turkey
sTable.add(new MccEntry(288,"fo",2))503 		sTable.add(new MccEntry(288,"fo",2));	//Faroe Islands
sTable.add(new MccEntry(289,"ge",2))504                 sTable.add(new MccEntry(289,"ge",2));    //Abkhazia (Georgia)
sTable.add(new MccEntry(290,"gl",2))505 		sTable.add(new MccEntry(290,"gl",2));	//Greenland (Denmark)
sTable.add(new MccEntry(292,"sm",2))506 		sTable.add(new MccEntry(292,"sm",2));	//San Marino (Republic of)
sTable.add(new MccEntry(293,"si",2))507 		sTable.add(new MccEntry(293,"si",2));	//Slovenia (Republic of)
sTable.add(new MccEntry(294,"mk",2))508                 sTable.add(new MccEntry(294,"mk",2));   //The Former Yugoslav Republic of Macedonia
sTable.add(new MccEntry(295,"li",2))509 		sTable.add(new MccEntry(295,"li",2));	//Liechtenstein (Principality of)
sTable.add(new MccEntry(297,"me",2))510                 sTable.add(new MccEntry(297,"me",2));    //Montenegro (Republic of)
sTable.add(new MccEntry(302,"ca",3))511 		sTable.add(new MccEntry(302,"ca",3));	//Canada
sTable.add(new MccEntry(308,"pm",2))512 		sTable.add(new MccEntry(308,"pm",2));	//Saint Pierre and Miquelon (Collectivit territoriale de la Rpublique franaise)
sTable.add(new MccEntry(310,"us",3))513 		sTable.add(new MccEntry(310,"us",3));	//United States of America
sTable.add(new MccEntry(311,"us",3))514 		sTable.add(new MccEntry(311,"us",3));	//United States of America
sTable.add(new MccEntry(312,"us",3))515 		sTable.add(new MccEntry(312,"us",3));	//United States of America
sTable.add(new MccEntry(313,"us",3))516 		sTable.add(new MccEntry(313,"us",3));	//United States of America
sTable.add(new MccEntry(314,"us",3))517 		sTable.add(new MccEntry(314,"us",3));	//United States of America
sTable.add(new MccEntry(315,"us",3))518 		sTable.add(new MccEntry(315,"us",3));	//United States of America
sTable.add(new MccEntry(316,"us",3))519 		sTable.add(new MccEntry(316,"us",3));	//United States of America
sTable.add(new MccEntry(330,"pr",2))520 		sTable.add(new MccEntry(330,"pr",2));	//Puerto Rico
sTable.add(new MccEntry(332,"vi",2))521 		sTable.add(new MccEntry(332,"vi",2));	//United States Virgin Islands
sTable.add(new MccEntry(334,"mx",3))522 		sTable.add(new MccEntry(334,"mx",3));	//Mexico
sTable.add(new MccEntry(338,"jm",3))523 		sTable.add(new MccEntry(338,"jm",3));	//Jamaica
sTable.add(new MccEntry(340,"gp",2))524 		sTable.add(new MccEntry(340,"gp",2));	//Guadeloupe (French Department of)
sTable.add(new MccEntry(342,"bb",3))525 		sTable.add(new MccEntry(342,"bb",3));	//Barbados
sTable.add(new MccEntry(344,"ag",3))526 		sTable.add(new MccEntry(344,"ag",3));	//Antigua and Barbuda
sTable.add(new MccEntry(346,"ky",3))527 		sTable.add(new MccEntry(346,"ky",3));	//Cayman Islands
sTable.add(new MccEntry(348,"vg",3))528 		sTable.add(new MccEntry(348,"vg",3));	//British Virgin Islands
sTable.add(new MccEntry(350,"bm",2))529 		sTable.add(new MccEntry(350,"bm",2));	//Bermuda
sTable.add(new MccEntry(352,"gd",2))530 		sTable.add(new MccEntry(352,"gd",2));	//Grenada
sTable.add(new MccEntry(354,"ms",2))531 		sTable.add(new MccEntry(354,"ms",2));	//Montserrat
sTable.add(new MccEntry(356,"kn",2))532 		sTable.add(new MccEntry(356,"kn",2));	//Saint Kitts and Nevis
sTable.add(new MccEntry(358,"lc",2))533 		sTable.add(new MccEntry(358,"lc",2));	//Saint Lucia
sTable.add(new MccEntry(360,"vc",2))534 		sTable.add(new MccEntry(360,"vc",2));	//Saint Vincent and the Grenadines
sTable.add(new MccEntry(362,"ai",2))535 		sTable.add(new MccEntry(362,"ai",2));	//Netherlands Antilles
sTable.add(new MccEntry(363,"aw",2))536 		sTable.add(new MccEntry(363,"aw",2));	//Aruba
sTable.add(new MccEntry(364,"bs",2))537 		sTable.add(new MccEntry(364,"bs",2));	//Bahamas (Commonwealth of the)
sTable.add(new MccEntry(365,"ai",3))538 		sTable.add(new MccEntry(365,"ai",3));	//Anguilla
sTable.add(new MccEntry(366,"dm",2))539 		sTable.add(new MccEntry(366,"dm",2));	//Dominica (Commonwealth of)
sTable.add(new MccEntry(368,"cu",2))540 		sTable.add(new MccEntry(368,"cu",2));	//Cuba
sTable.add(new MccEntry(370,"do",2))541 		sTable.add(new MccEntry(370,"do",2));	//Dominican Republic
sTable.add(new MccEntry(372,"ht",2))542 		sTable.add(new MccEntry(372,"ht",2));	//Haiti (Republic of)
sTable.add(new MccEntry(374,"tt",2))543 		sTable.add(new MccEntry(374,"tt",2));	//Trinidad and Tobago
sTable.add(new MccEntry(376,"tc",2))544 		sTable.add(new MccEntry(376,"tc",2));	//Turks and Caicos Islands
sTable.add(new MccEntry(400,"az",2))545 		sTable.add(new MccEntry(400,"az",2));	//Azerbaijani Republic
sTable.add(new MccEntry(401,"kz",2))546 		sTable.add(new MccEntry(401,"kz",2));	//Kazakhstan (Republic of)
sTable.add(new MccEntry(402,"bt",2))547 		sTable.add(new MccEntry(402,"bt",2));	//Bhutan (Kingdom of)
sTable.add(new MccEntry(404,"in",2))548 		sTable.add(new MccEntry(404,"in",2));	//India (Republic of)
sTable.add(new MccEntry(405,"in",2))549 		sTable.add(new MccEntry(405,"in",2));	//India (Republic of)
sTable.add(new MccEntry(406,"in",2))550 		sTable.add(new MccEntry(406,"in",2));	//India (Republic of)
sTable.add(new MccEntry(410,"pk",2))551 		sTable.add(new MccEntry(410,"pk",2));	//Pakistan (Islamic Republic of)
sTable.add(new MccEntry(412,"af",2))552 		sTable.add(new MccEntry(412,"af",2));	//Afghanistan
sTable.add(new MccEntry(413,"lk",2))553 		sTable.add(new MccEntry(413,"lk",2));	//Sri Lanka (Democratic Socialist Republic of)
sTable.add(new MccEntry(414,"mm",2))554 		sTable.add(new MccEntry(414,"mm",2));	//Myanmar (Union of)
sTable.add(new MccEntry(415,"lb",2))555 		sTable.add(new MccEntry(415,"lb",2));	//Lebanon
sTable.add(new MccEntry(416,"jo",2))556 		sTable.add(new MccEntry(416,"jo",2));	//Jordan (Hashemite Kingdom of)
sTable.add(new MccEntry(417,"sy",2))557 		sTable.add(new MccEntry(417,"sy",2));	//Syrian Arab Republic
sTable.add(new MccEntry(418,"iq",2))558 		sTable.add(new MccEntry(418,"iq",2));	//Iraq (Republic of)
sTable.add(new MccEntry(419,"kw",2))559 		sTable.add(new MccEntry(419,"kw",2));	//Kuwait (State of)
sTable.add(new MccEntry(420,"sa",2))560 		sTable.add(new MccEntry(420,"sa",2));	//Saudi Arabia (Kingdom of)
sTable.add(new MccEntry(421,"ye",2))561 		sTable.add(new MccEntry(421,"ye",2));	//Yemen (Republic of)
sTable.add(new MccEntry(422,"om",2))562 		sTable.add(new MccEntry(422,"om",2));	//Oman (Sultanate of)
sTable.add(new MccEntry(423,"ps",2))563                 sTable.add(new MccEntry(423,"ps",2));    //Palestine
sTable.add(new MccEntry(424,"ae",2))564 		sTable.add(new MccEntry(424,"ae",2));	//United Arab Emirates
sTable.add(new MccEntry(425,"il",2))565 		sTable.add(new MccEntry(425,"il",2));	//Israel (State of)
sTable.add(new MccEntry(426,"bh",2))566 		sTable.add(new MccEntry(426,"bh",2));	//Bahrain (Kingdom of)
sTable.add(new MccEntry(427,"qa",2))567 		sTable.add(new MccEntry(427,"qa",2));	//Qatar (State of)
sTable.add(new MccEntry(428,"mn",2))568 		sTable.add(new MccEntry(428,"mn",2));	//Mongolia
sTable.add(new MccEntry(429,"np",2))569 		sTable.add(new MccEntry(429,"np",2));	//Nepal
sTable.add(new MccEntry(430,"ae",2))570 		sTable.add(new MccEntry(430,"ae",2));	//United Arab Emirates
sTable.add(new MccEntry(431,"ae",2))571 		sTable.add(new MccEntry(431,"ae",2));	//United Arab Emirates
sTable.add(new MccEntry(432,"ir",2))572 		sTable.add(new MccEntry(432,"ir",2));	//Iran (Islamic Republic of)
sTable.add(new MccEntry(434,"uz",2))573 		sTable.add(new MccEntry(434,"uz",2));	//Uzbekistan (Republic of)
sTable.add(new MccEntry(436,"tj",2))574 		sTable.add(new MccEntry(436,"tj",2));	//Tajikistan (Republic of)
sTable.add(new MccEntry(437,"kg",2))575 		sTable.add(new MccEntry(437,"kg",2));	//Kyrgyz Republic
sTable.add(new MccEntry(438,"tm",2))576 		sTable.add(new MccEntry(438,"tm",2));	//Turkmenistan
sTable.add(new MccEntry(440,"jp",2))577 		sTable.add(new MccEntry(440,"jp",2));	//Japan
sTable.add(new MccEntry(441,"jp",2))578 		sTable.add(new MccEntry(441,"jp",2));	//Japan
sTable.add(new MccEntry(450,"kr",2))579 		sTable.add(new MccEntry(450,"kr",2));	//Korea (Republic of)
sTable.add(new MccEntry(452,"vn",2))580 		sTable.add(new MccEntry(452,"vn",2));	//Viet Nam (Socialist Republic of)
sTable.add(new MccEntry(454,"hk",2))581 		sTable.add(new MccEntry(454,"hk",2));	//"Hong Kong, China"
sTable.add(new MccEntry(455,"mo",2))582 		sTable.add(new MccEntry(455,"mo",2));	//"Macao, China"
sTable.add(new MccEntry(456,"kh",2))583 		sTable.add(new MccEntry(456,"kh",2));	//Cambodia (Kingdom of)
sTable.add(new MccEntry(457,"la",2))584 		sTable.add(new MccEntry(457,"la",2));	//Lao People's Democratic Republic
sTable.add(new MccEntry(460,"cn",2))585 		sTable.add(new MccEntry(460,"cn",2));	//China (People's Republic of)
sTable.add(new MccEntry(461,"cn",2))586 		sTable.add(new MccEntry(461,"cn",2));	//China (People's Republic of)
sTable.add(new MccEntry(466,"tw",2))587 		sTable.add(new MccEntry(466,"tw",2));	//Taiwan
sTable.add(new MccEntry(467,"kp",2))588 		sTable.add(new MccEntry(467,"kp",2));	//Democratic People's Republic of Korea
sTable.add(new MccEntry(470,"bd",2))589 		sTable.add(new MccEntry(470,"bd",2));	//Bangladesh (People's Republic of)
sTable.add(new MccEntry(472,"mv",2))590 		sTable.add(new MccEntry(472,"mv",2));	//Maldives (Republic of)
sTable.add(new MccEntry(502,"my",2))591 		sTable.add(new MccEntry(502,"my",2));	//Malaysia
sTable.add(new MccEntry(505,"au",2))592 		sTable.add(new MccEntry(505,"au",2));	//Australia
sTable.add(new MccEntry(510,"id",2))593 		sTable.add(new MccEntry(510,"id",2));	//Indonesia (Republic of)
sTable.add(new MccEntry(514,"tl",2))594 		sTable.add(new MccEntry(514,"tl",2));	//Democratic Republic of Timor-Leste
sTable.add(new MccEntry(515,"ph",2))595 		sTable.add(new MccEntry(515,"ph",2));	//Philippines (Republic of the)
sTable.add(new MccEntry(520,"th",2))596 		sTable.add(new MccEntry(520,"th",2));	//Thailand
sTable.add(new MccEntry(525,"sg",2))597 		sTable.add(new MccEntry(525,"sg",2));	//Singapore (Republic of)
sTable.add(new MccEntry(528,"bn",2))598 		sTable.add(new MccEntry(528,"bn",2));	//Brunei Darussalam
sTable.add(new MccEntry(530,"nz",2))599 		sTable.add(new MccEntry(530,"nz",2));	//New Zealand
sTable.add(new MccEntry(534,"mp",2))600 		sTable.add(new MccEntry(534,"mp",2));	//Northern Mariana Islands (Commonwealth of the)
sTable.add(new MccEntry(535,"gu",2))601 		sTable.add(new MccEntry(535,"gu",2));	//Guam
sTable.add(new MccEntry(536,"nr",2))602 		sTable.add(new MccEntry(536,"nr",2));	//Nauru (Republic of)
sTable.add(new MccEntry(537,"pg",2))603 		sTable.add(new MccEntry(537,"pg",2));	//Papua New Guinea
sTable.add(new MccEntry(539,"to",2))604 		sTable.add(new MccEntry(539,"to",2));	//Tonga (Kingdom of)
sTable.add(new MccEntry(540,"sb",2))605 		sTable.add(new MccEntry(540,"sb",2));	//Solomon Islands
sTable.add(new MccEntry(541,"vu",2))606 		sTable.add(new MccEntry(541,"vu",2));	//Vanuatu (Republic of)
sTable.add(new MccEntry(542,"fj",2))607 		sTable.add(new MccEntry(542,"fj",2));	//Fiji (Republic of)
sTable.add(new MccEntry(543,"wf",2))608 		sTable.add(new MccEntry(543,"wf",2));	//Wallis and Futuna (Territoire franais d'outre-mer)
sTable.add(new MccEntry(544,"as",2))609 		sTable.add(new MccEntry(544,"as",2));	//American Samoa
sTable.add(new MccEntry(545,"ki",2))610 		sTable.add(new MccEntry(545,"ki",2));	//Kiribati (Republic of)
sTable.add(new MccEntry(546,"nc",2))611 		sTable.add(new MccEntry(546,"nc",2));	//New Caledonia (Territoire franais d'outre-mer)
sTable.add(new MccEntry(547,"pf",2))612 		sTable.add(new MccEntry(547,"pf",2));	//French Polynesia (Territoire franais d'outre-mer)
sTable.add(new MccEntry(548,"ck",2))613 		sTable.add(new MccEntry(548,"ck",2));	//Cook Islands
sTable.add(new MccEntry(549,"ws",2))614 		sTable.add(new MccEntry(549,"ws",2));	//Samoa (Independent State of)
sTable.add(new MccEntry(550,"fm",2))615 		sTable.add(new MccEntry(550,"fm",2));	//Micronesia (Federated States of)
sTable.add(new MccEntry(551,"mh",2))616 		sTable.add(new MccEntry(551,"mh",2));	//Marshall Islands (Republic of the)
sTable.add(new MccEntry(552,"pw",2))617 		sTable.add(new MccEntry(552,"pw",2));	//Palau (Republic of)
sTable.add(new MccEntry(553,"tv",2))618 		sTable.add(new MccEntry(553,"tv",2));	//Tuvalu
sTable.add(new MccEntry(555,"nu",2))619 		sTable.add(new MccEntry(555,"nu",2));	//Niue
sTable.add(new MccEntry(602,"eg",2))620 		sTable.add(new MccEntry(602,"eg",2));	//Egypt (Arab Republic of)
sTable.add(new MccEntry(603,"dz",2))621 		sTable.add(new MccEntry(603,"dz",2));	//Algeria (People's Democratic Republic of)
sTable.add(new MccEntry(604,"ma",2))622 		sTable.add(new MccEntry(604,"ma",2));	//Morocco (Kingdom of)
sTable.add(new MccEntry(605,"tn",2))623 		sTable.add(new MccEntry(605,"tn",2));	//Tunisia
sTable.add(new MccEntry(606,"ly",2))624 		sTable.add(new MccEntry(606,"ly",2));	//Libya (Socialist People's Libyan Arab Jamahiriya)
sTable.add(new MccEntry(607,"gm",2))625 		sTable.add(new MccEntry(607,"gm",2));	//Gambia (Republic of the)
sTable.add(new MccEntry(608,"sn",2))626 		sTable.add(new MccEntry(608,"sn",2));	//Senegal (Republic of)
sTable.add(new MccEntry(609,"mr",2))627 		sTable.add(new MccEntry(609,"mr",2));	//Mauritania (Islamic Republic of)
sTable.add(new MccEntry(610,"ml",2))628 		sTable.add(new MccEntry(610,"ml",2));	//Mali (Republic of)
sTable.add(new MccEntry(611,"gn",2))629 		sTable.add(new MccEntry(611,"gn",2));	//Guinea (Republic of)
sTable.add(new MccEntry(612,"ci",2))630 		sTable.add(new MccEntry(612,"ci",2));	//Côte d'Ivoire (Republic of)
sTable.add(new MccEntry(613,"bf",2))631 		sTable.add(new MccEntry(613,"bf",2));	//Burkina Faso
sTable.add(new MccEntry(614,"ne",2))632 		sTable.add(new MccEntry(614,"ne",2));	//Niger (Republic of the)
sTable.add(new MccEntry(615,"tg",2))633 		sTable.add(new MccEntry(615,"tg",2));	//Togolese Republic
sTable.add(new MccEntry(616,"bj",2))634 		sTable.add(new MccEntry(616,"bj",2));	//Benin (Republic of)
sTable.add(new MccEntry(617,"mu",2))635 		sTable.add(new MccEntry(617,"mu",2));	//Mauritius (Republic of)
sTable.add(new MccEntry(618,"lr",2))636 		sTable.add(new MccEntry(618,"lr",2));	//Liberia (Republic of)
sTable.add(new MccEntry(619,"sl",2))637 		sTable.add(new MccEntry(619,"sl",2));	//Sierra Leone
sTable.add(new MccEntry(620,"gh",2))638 		sTable.add(new MccEntry(620,"gh",2));	//Ghana
sTable.add(new MccEntry(621,"ng",2))639 		sTable.add(new MccEntry(621,"ng",2));	//Nigeria (Federal Republic of)
sTable.add(new MccEntry(622,"td",2))640 		sTable.add(new MccEntry(622,"td",2));	//Chad (Republic of)
sTable.add(new MccEntry(623,"cf",2))641 		sTable.add(new MccEntry(623,"cf",2));	//Central African Republic
sTable.add(new MccEntry(624,"cm",2))642 		sTable.add(new MccEntry(624,"cm",2));	//Cameroon (Republic of)
sTable.add(new MccEntry(625,"cv",2))643 		sTable.add(new MccEntry(625,"cv",2));	//Cape Verde (Republic of)
sTable.add(new MccEntry(626,"st",2))644 		sTable.add(new MccEntry(626,"st",2));	//Sao Tome and Principe (Democratic Republic of)
sTable.add(new MccEntry(627,"gq",2))645 		sTable.add(new MccEntry(627,"gq",2));	//Equatorial Guinea (Republic of)
sTable.add(new MccEntry(628,"ga",2))646 		sTable.add(new MccEntry(628,"ga",2));	//Gabonese Republic
sTable.add(new MccEntry(629,"cg",2))647 		sTable.add(new MccEntry(629,"cg",2));	//Congo (Republic of the)
sTable.add(new MccEntry(630,"cd",2))648 		sTable.add(new MccEntry(630,"cd",2));	//Democratic Republic of the Congo
sTable.add(new MccEntry(631,"ao",2))649 		sTable.add(new MccEntry(631,"ao",2));	//Angola (Republic of)
sTable.add(new MccEntry(632,"gw",2))650 		sTable.add(new MccEntry(632,"gw",2));	//Guinea-Bissau (Republic of)
sTable.add(new MccEntry(633,"sc",2))651 		sTable.add(new MccEntry(633,"sc",2));	//Seychelles (Republic of)
sTable.add(new MccEntry(634,"sd",2))652 		sTable.add(new MccEntry(634,"sd",2));	//Sudan (Republic of the)
sTable.add(new MccEntry(635,"rw",2))653 		sTable.add(new MccEntry(635,"rw",2));	//Rwanda (Republic of)
sTable.add(new MccEntry(636,"et",2))654 		sTable.add(new MccEntry(636,"et",2));	//Ethiopia (Federal Democratic Republic of)
sTable.add(new MccEntry(637,"so",2))655 		sTable.add(new MccEntry(637,"so",2));	//Somali Democratic Republic
sTable.add(new MccEntry(638,"dj",2))656 		sTable.add(new MccEntry(638,"dj",2));	//Djibouti (Republic of)
sTable.add(new MccEntry(639,"ke",2))657 		sTable.add(new MccEntry(639,"ke",2));	//Kenya (Republic of)
sTable.add(new MccEntry(640,"tz",2))658 		sTable.add(new MccEntry(640,"tz",2));	//Tanzania (United Republic of)
sTable.add(new MccEntry(641,"ug",2))659 		sTable.add(new MccEntry(641,"ug",2));	//Uganda (Republic of)
sTable.add(new MccEntry(642,"bi",2))660 		sTable.add(new MccEntry(642,"bi",2));	//Burundi (Republic of)
sTable.add(new MccEntry(643,"mz",2))661 		sTable.add(new MccEntry(643,"mz",2));	//Mozambique (Republic of)
sTable.add(new MccEntry(645,"zm",2))662 		sTable.add(new MccEntry(645,"zm",2));	//Zambia (Republic of)
sTable.add(new MccEntry(646,"mg",2))663 		sTable.add(new MccEntry(646,"mg",2));	//Madagascar (Republic of)
sTable.add(new MccEntry(647,"re",2))664 		sTable.add(new MccEntry(647,"re",2));	//Reunion (French Department of)
sTable.add(new MccEntry(648,"zw",2))665 		sTable.add(new MccEntry(648,"zw",2));	//Zimbabwe (Republic of)
sTable.add(new MccEntry(649,"na",2))666 		sTable.add(new MccEntry(649,"na",2));	//Namibia (Republic of)
sTable.add(new MccEntry(650,"mw",2))667 		sTable.add(new MccEntry(650,"mw",2));	//Malawi
sTable.add(new MccEntry(651,"ls",2))668 		sTable.add(new MccEntry(651,"ls",2));	//Lesotho (Kingdom of)
sTable.add(new MccEntry(652,"bw",2))669 		sTable.add(new MccEntry(652,"bw",2));	//Botswana (Republic of)
sTable.add(new MccEntry(653,"sz",2))670 		sTable.add(new MccEntry(653,"sz",2));	//Swaziland (Kingdom of)
sTable.add(new MccEntry(654,"km",2))671 		sTable.add(new MccEntry(654,"km",2));	//Comoros (Union of the)
sTable.add(new MccEntry(655,"za",2))672 		sTable.add(new MccEntry(655,"za",2));	//South Africa (Republic of)
sTable.add(new MccEntry(657,"er",2))673 		sTable.add(new MccEntry(657,"er",2));	//Eritrea
sTable.add(new MccEntry(658,"sh",2))674 		sTable.add(new MccEntry(658,"sh",2));	//Saint Helena, Ascension and Tristan da Cunha
sTable.add(new MccEntry(659,"ss",2))675 		sTable.add(new MccEntry(659,"ss",2));	//South Sudan (Republic of)
sTable.add(new MccEntry(702,"bz",2))676 		sTable.add(new MccEntry(702,"bz",2));	//Belize
sTable.add(new MccEntry(704,"gt",2))677 		sTable.add(new MccEntry(704,"gt",2));	//Guatemala (Republic of)
sTable.add(new MccEntry(706,"sv",2))678 		sTable.add(new MccEntry(706,"sv",2));	//El Salvador (Republic of)
sTable.add(new MccEntry(708,"hn",3))679 		sTable.add(new MccEntry(708,"hn",3));	//Honduras (Republic of)
sTable.add(new MccEntry(710,"ni",2))680 		sTable.add(new MccEntry(710,"ni",2));	//Nicaragua
sTable.add(new MccEntry(712,"cr",2))681 		sTable.add(new MccEntry(712,"cr",2));	//Costa Rica
sTable.add(new MccEntry(714,"pa",2))682 		sTable.add(new MccEntry(714,"pa",2));	//Panama (Republic of)
sTable.add(new MccEntry(716,"pe",2))683 		sTable.add(new MccEntry(716,"pe",2));	//Peru
sTable.add(new MccEntry(722,"ar",3))684 		sTable.add(new MccEntry(722,"ar",3));	//Argentine Republic
sTable.add(new MccEntry(724,"br",2))685 		sTable.add(new MccEntry(724,"br",2));	//Brazil (Federative Republic of)
sTable.add(new MccEntry(730,"cl",2))686 		sTable.add(new MccEntry(730,"cl",2));	//Chile
sTable.add(new MccEntry(732,"co",3))687 		sTable.add(new MccEntry(732,"co",3));	//Colombia (Republic of)
sTable.add(new MccEntry(734,"ve",2))688 		sTable.add(new MccEntry(734,"ve",2));	//Venezuela (Bolivarian Republic of)
sTable.add(new MccEntry(736,"bo",2))689 		sTable.add(new MccEntry(736,"bo",2));	//Bolivia (Republic of)
sTable.add(new MccEntry(738,"gy",2))690 		sTable.add(new MccEntry(738,"gy",2));	//Guyana
sTable.add(new MccEntry(740,"ec",2))691 		sTable.add(new MccEntry(740,"ec",2));	//Ecuador
sTable.add(new MccEntry(742,"gf",2))692 		sTable.add(new MccEntry(742,"gf",2));	//French Guiana (French Department of)
sTable.add(new MccEntry(744,"py",2))693 		sTable.add(new MccEntry(744,"py",2));	//Paraguay (Republic of)
sTable.add(new MccEntry(746,"sr",2))694 		sTable.add(new MccEntry(746,"sr",2));	//Suriname (Republic of)
sTable.add(new MccEntry(748,"uy",2))695 		sTable.add(new MccEntry(748,"uy",2));	//Uruguay (Eastern Republic of)
sTable.add(new MccEntry(750,"fk",2))696 		sTable.add(new MccEntry(750,"fk",2));	//Falkland Islands (Malvinas)
697         //table.add(new MccEntry(901,"",2));	//"International Mobile, shared code"
698 
699         Collections.sort(sTable);
700     }
701 }
702