saved = wifi.getConfiguredNetworks();
+ for ( WifiConfiguration w : saved )
+ {
+ if ( w.SSID.equals('"' + router.ssid +'"') )
+ {
+ wifi.disableNetwork(w.networkId);
+ wifi.removeNetwork(w.networkId);
+ }
+ }
+ testKey();
+ }
+
+ public void attemptConnect(){
+ if ( this.config != null )
+ {
+ boolean b = wifi.disableNetwork(this.config.networkId);
+ Log.d("WifiPreference", "disableNetwork " +this.config.networkId + " returned " + b );
+ b = wifi.removeNetwork(this.config.networkId);
+ Log.d("WifiPreference", "rmeoveNetwork " +this.config.networkId + " returned " + b );
+
+ }
+ WifiConfiguration config = new WifiConfiguration();
+ config.priority = 90 -keys.size(); ;
+ config.status = WifiConfiguration.Status.ENABLED;
+ config.SSID = '"' + router.ssid + '"';
+ config.hiddenSSID = true;
+ if ( router.encryption.contains("WEP") )
+ {
+ config.allowedKeyManagement.clear();
+ config.allowedAuthAlgorithms.clear();
+ config.allowedProtocols.clear();
+ config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
+ config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
+ config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);
+ config.wepTxKeyIndex = 0;
+ if (tryingKey.length() != 0) {
+ int length = tryingKey.length();
+ // WEP-40, WEP-104, and 256-bit WEP (WEP-232?)
+ if ((length == 10 || length == 26 || length == 58) &&
+ tryingKey.matches("[0-9A-Fa-f]*")) {
+ config.wepKeys[0] = tryingKey;
+ config.preSharedKey = null;
+ }
+ else {
+ config.wepKeys[0] = '"' + tryingKey + '"';
+ config.preSharedKey = null;
+ }
+ }
+ }
+ else
+ if ( router.encryption.contains("PSK") )
+ {
+ config.allowedKeyManagement.clear();
+ config.allowedAuthAlgorithms.clear();
+ config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
+ config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
+ config.preSharedKey = '"' + tryingKey +'"';
+ }
+
+ int res = 0;
+ res = wifi.addNetwork(config);
+ config.networkId = res;
+ this.config = config;
+ Log.d("WifiPreference", "add Network returned " + res );
+ boolean b = wifi.enableNetwork(res, true);
+ Log.d("WifiPreference", "enableNetwork returned " + b );
+
+ }
+
+ public void testKey(){
+ attempts = 0;
+ if ( !keys.isEmpty() )
+ {
+ tryingKey = keys.get(0);
+ keys.remove(0);
+ mess.sendEmptyMessage(2);
+ }
+ attemptConnect();
+ }
+
+}
diff --git a/android/src/org/exobel/routerkeygen/DiscusKeygen.java b/android/src/org/exobel/routerkeygen/DiscusKeygen.java
new file mode 100644
index 0000000..f41118b
--- /dev/null
+++ b/android/src/org/exobel/routerkeygen/DiscusKeygen.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+package org.exobel.routerkeygen;
+
+import android.content.res.Resources;
+import android.os.Handler;
+
+public class DiscusKeygen extends KeygenThread {
+
+ public DiscusKeygen(Handler h, Resources res) {
+ super(h, res);
+ }
+
+ static final int essidConst = 0xD0EC31;
+
+ public void run(){
+ int routerEssid = Integer.parseInt( router.getSSIDsubpart() , 16);
+ int result = ( routerEssid - essidConst )>>2;
+ pwList.add("YW0" + Integer.toString(result));
+ handler.sendEmptyMessage(RESULTS_READY);
+ return;
+
+ }
+
+}
diff --git a/android/src/org/exobel/routerkeygen/DlinkKeygen.java b/android/src/org/exobel/routerkeygen/DlinkKeygen.java
new file mode 100644
index 0000000..2dd47f4
--- /dev/null
+++ b/android/src/org/exobel/routerkeygen/DlinkKeygen.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+package org.exobel.routerkeygen;
+
+import android.content.res.Resources;
+import android.os.Handler;
+import android.os.Message;
+
+public class DlinkKeygen extends KeygenThread {
+
+ public DlinkKeygen(Handler h, Resources res) {
+ super(h, res);
+ }
+
+ public void run(){
+ char hash[] = { 'X', 'r', 'q', 'a', 'H', 'N',
+ 'p', 'd', 'S', 'Y', 'w',
+ '8', '6', '2', '1', '5'};
+
+ if ( router.mac.equals("") )
+ {
+ handler.sendMessage(Message.obtain(handler, ERROR_MSG ,
+ resources.getString(R.string.msg_nomac)));
+ return;
+ }
+ char[] key = new char[20];
+ String mac = router.getMac();
+ key[0]=mac.charAt(11);
+ key[1]=mac.charAt(0);
+
+ key[2]=mac.charAt(10);
+ key[3]=mac.charAt(1);
+
+ key[4]=mac.charAt(9);
+ key[5]=mac.charAt(2);
+
+ key[6]=mac.charAt(8);
+ key[7]=mac.charAt(3);
+
+ key[8]=mac.charAt(7);
+ key[9]=mac.charAt(4);
+
+ key[10]=mac.charAt(6);
+ key[11]=mac.charAt(5);
+
+ key[12]=mac.charAt(1);
+ key[13]=mac.charAt(6);
+
+ key[14]=mac.charAt(8);
+ key[15]=mac.charAt(9);
+
+ key[16]=mac.charAt(11);
+ key[17]=mac.charAt(2);
+
+ key[18]=mac.charAt(4);
+ key[19]=mac.charAt(10);
+ char [] newkey = new char[20];
+ char t;
+ int index = 0;
+ for (int i=0; i < 20 ; i++)
+ {
+ t=key[i];
+ if ((t >= '0') && (t <= '9'))
+ index = t-'0';
+ else
+ {
+ t=Character.toUpperCase(t);
+ if ((t >= 'A') && (t <= 'F'))
+ index = t-'A'+10;
+ else
+ {
+ handler.sendMessage(Message.obtain(handler, ERROR_MSG ,
+ resources.getString(R.string.msg_dlinkerror)));
+ return;
+ }
+ }
+ newkey[i]=hash[index];
+ }
+ pwList.add(String.valueOf(newkey, 0, 20));
+ handler.sendEmptyMessage(RESULTS_READY);
+ return;
+ }
+}
diff --git a/android/src/org/exobel/routerkeygen/Downloader.java b/android/src/org/exobel/routerkeygen/Downloader.java
new file mode 100644
index 0000000..16b966a
--- /dev/null
+++ b/android/src/org/exobel/routerkeygen/Downloader.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+package org.exobel.routerkeygen;
+
+import java.io.DataInputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.net.URL;
+import java.net.URLConnection;
+
+import android.os.Environment;
+import android.os.Handler;
+import android.os.Message;
+
+public class Downloader extends Thread{
+ Handler messHand;
+ String urlDownload;
+ boolean stopRequested = false;
+ boolean deleteTemp = false;
+ public void run() {
+ File myDicFile;
+ URLConnection con;
+ DataInputStream dis;
+ FileOutputStream fos;
+ int myProgress = 0;
+ int fileLen, byteRead;
+ byte[] buf;
+ try {
+
+
+ con = new URL(urlDownload).openConnection();
+ myDicFile = new File(Environment.getExternalStorageDirectory().getPath() + File.separator + "DicTemp.dic");
+
+ // Append mode on
+ fos = new FileOutputStream(myDicFile, true);
+
+ // Resuming if possible
+ myProgress = byteRead = (int) myDicFile.length();
+ if(byteRead > 0)
+ con.setRequestProperty("Range", "bytes=" + byteRead + "-");
+
+ dis = new DataInputStream(con.getInputStream());
+ fileLen = myProgress + con.getContentLength();
+ messHand.sendMessage(Message.obtain(messHand, 2, myProgress, fileLen));
+ // Checking if external storage has enough memory ...
+ android.os.StatFs stat = new android.os.StatFs(Environment.getExternalStorageDirectory().getPath());
+ if((long)stat.getBlockSize() * (long)stat.getAvailableBlocks() < fileLen)
+ messHand.sendEmptyMessage(1);
+
+ buf = new byte[65536];
+ while (myProgress < fileLen) {
+ try{
+
+ if ((byteRead = dis.read(buf)) != -1)
+ {
+ fos.write(buf, 0, byteRead);
+ myProgress += byteRead;
+ }
+ else
+ {
+ dis.close();
+ fos.close();
+ myProgress = fileLen;
+ }
+ }
+ catch(Exception e){}
+ messHand.sendMessage(Message.obtain(messHand, 4, myProgress, fileLen));
+ if ( stopRequested )
+ {
+ if ( deleteTemp )
+ myDicFile.delete();
+ dis.close();
+ fos.close();
+ return;
+ }
+ }
+ messHand.sendEmptyMessage(3);
+ }
+ catch (FileNotFoundException e)
+ {
+ messHand.sendEmptyMessage(0);
+ }
+ catch(Exception e)
+ {
+ messHand.sendEmptyMessage(-1);
+ }
+ }
+
+ public Downloader(Handler messHand, String urlDownload) {
+ this.messHand = messHand;
+ this.urlDownload = urlDownload;
+ }
+
+}
diff --git a/android/src/org/exobel/routerkeygen/EircomKeygen.java b/android/src/org/exobel/routerkeygen/EircomKeygen.java
new file mode 100644
index 0000000..5977593
--- /dev/null
+++ b/android/src/org/exobel/routerkeygen/EircomKeygen.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+package org.exobel.routerkeygen;
+
+import java.io.UnsupportedEncodingException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+import android.content.res.Resources;
+import android.os.Handler;
+import android.os.Message;
+
+public class EircomKeygen extends KeygenThread {
+
+ public EircomKeygen(Handler h, Resources res) {
+ super(h, res);
+ }
+
+ public void run(){
+ String mac= router.getMacEnd();
+ try {
+ md = MessageDigest.getInstance("SHA1");
+ } catch (NoSuchAlgorithmException e1) {
+ handler.sendMessage(Message.obtain(handler, ERROR_MSG ,
+ resources.getString(R.string.msg_nosha1)));
+ return;
+ }
+ byte [] routerMAC = new byte[4];
+ routerMAC[0] = 1;
+ for (int i = 0; i < 6; i += 2)
+ routerMAC[i / 2 + 1] = (byte) ((Character.digit(mac.charAt(i), 16) << 4)
+ + Character.digit(mac.charAt(i + 1), 16));
+ int macDec = ( (0xFF & routerMAC[0]) << 24 ) | ( (0xFF & routerMAC[1]) << 16 ) |
+ ( (0xFF & routerMAC[2]) << 8 ) | (0xFF & routerMAC[3]);
+ mac = StringUtils.dectoString(macDec) + "Although your world wonders me, ";
+ md.reset();
+ md.update(mac.getBytes());
+ byte [] hash = md.digest();
+ try {
+ pwList.add(StringUtils.getHexString(hash).substring(0,26));
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ }
+ handler.sendEmptyMessage(RESULTS_READY);
+ return;
+ }
+
+}
diff --git a/android/src/org/exobel/routerkeygen/HuaweiKeygen.java b/android/src/org/exobel/routerkeygen/HuaweiKeygen.java
new file mode 100644
index 0000000..bce7432
--- /dev/null
+++ b/android/src/org/exobel/routerkeygen/HuaweiKeygen.java
@@ -0,0 +1,149 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+package org.exobel.routerkeygen;
+
+import android.content.res.Resources;
+import android.os.Handler;
+import android.os.Message;
+/*
+*
+* Algorithm:
+* Can be consulted here:
+* http://websec.ca/blog/view/mac2wepkey_huawei
+* It has nice graphics that explain it all.
+* */
+public class HuaweiKeygen extends KeygenThread {
+
+
+
+ public HuaweiKeygen(Handler h, Resources res) {
+ super(h, res);
+ }
+
+ // Java adaptation of mac2wepkey.py from
+ // http://websec.ca/blog/view/mac2wepkey_huawei
+ final int [] a0= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+ final int [] a1= {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
+ final int [] a2= {0,13,10,7,5,8,15,2,10,7,0,13,15,2,5,8};
+ final int [] a3= {0,1,3,2,7,6,4,5,15,14,12,13,8,9,11,10};
+ final int [] a4= {0,5,11,14,7,2,12,9,15,10,4,1,8,13,3,6};
+ final int [] a5= {0,4,8,12,0,4,8,12,0,4,8,12,0,4,8,12};
+ final int [] a6= {0,1,3,2,6,7,5,4,12,13,15,14,10,11,9,8};
+ final int [] a7= {0,8,0,8,1,9,1,9,2,10,2,10,3,11,3,11};
+ final int [] a8= {0,5,11,14,6,3,13,8,12,9,7,2,10,15,1,4};
+ final int [] a9= {0,9,2,11,5,12,7,14,10,3,8,1,15,6,13,4};
+ final int [] a10= {0,14,13,3,11,5,6,8,6,8,11,5,13,3,0,14};
+ final int [] a11= {0,12,8,4,1,13,9,5,2,14,10,6,3,15,11,7};
+ final int [] a12= {0,4,9,13,2,6,11,15,4,0,13,9,6,2,15,11};
+ final int [] a13= {0,8,1,9,3,11,2,10,6,14,7,15,5,13,4,12};
+ final int [] a14= {0,1,3,2,7,6,4,5,14,15,13,12,9,8,10,11};
+ final int [] a15= {0,1,3,2,6,7,5,4,13,12,14,15,11,10,8,9};
+ final int [] n1= {0,14,10,4,8,6,2,12,0,14,10,4,8,6,2,12};
+ final int [] n2= {0,8,0,8,3,11,3,11,6,14,6,14,5,13,5,13};
+ final int [] n3= {0,0,3,3,2,2,1,1,4,4,7,7,6,6,5,5};
+ final int [] n4= {0,11,12,7,15,4,3,8,14,5,2,9,1,10,13,6};
+ final int [] n5= {0,5,1,4,6,3,7,2,12,9,13,8,10,15,11,14};
+ final int [] n6= {0,14,4,10,11,5,15,1,6,8,2,12,13,3,9,7};
+ final int [] n7= {0,9,0,9,5,12,5,12,10,3,10,3,15,6,15,6};
+ final int [] n8= {0,5,11,14,2,7,9,12,12,9,7,2,14,11,5,0};
+ final int [] n9= {0,0,0,0,4,4,4,4,0,0,0,0,4,4,4,4};
+ final int [] n10= {0,8,1,9,3,11,2,10,5,13,4,12,6,14,7,15};
+ final int [] n11= {0,14,13,3,9,7,4,10,6,8,11,5,15,1,2,12};
+ final int [] n12= {0,13,10,7,4,9,14,3,10,7,0,13,14,3,4,9};
+ final int [] n13= {0,1,3,2,6,7,5,4,15,14,12,13,9,8,10,11};
+ final int [] n14= {0,1,3,2,4,5,7,6,12,13,15,14,8,9,11,10};
+ final int [] n15= {0,6,12,10,9,15,5,3,2,4,14,8,11,13,7,1};
+ final int [] n16= {0,11,6,13,13,6,11,0,11,0,13,6,6,13,0,11};
+ final int [] n17= {0,12,8,4,1,13,9,5,3,15,11,7,2,14,10,6};
+ final int [] n18= {0,12,9,5,2,14,11,7,5,9,12,0,7,11,14,2};
+ final int [] n19= {0,6,13,11,10,12,7,1,5,3,8,14,15,9,2,4};
+ final int [] n20= {0,9,3,10,7,14,4,13,14,7,13,4,9,0,10,3};
+ final int [] n21= {0,4,8,12,1,5,9,13,2,6,10,14,3,7,11,15};
+ final int [] n22= {0,1,2,3,5,4,7,6,11,10,9,8,14,15,12,13};
+ final int [] n23= {0,7,15,8,14,9,1,6,12,11,3,4,2,5,13,10};
+ final int [] n24= {0,5,10,15,4,1,14,11,8,13,2,7,12,9,6,3};
+ final int [] n25= {0,11,6,13,13,6,11,0,10,1,12,7,7,12,1,10};
+ final int [] n26= {0,13,10,7,4,9,14,3,8,5,2,15,12,1,6,11};
+ final int [] n27= {0,4,9,13,2,6,11,15,5,1,12,8,7,3,14,10};
+ final int [] n28= {0,14,12,2,8,6,4,10,0,14,12,2,8,6,4,10};
+ final int [] n29= {0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3};
+ final int [] n30= {0,15,14,1,12,3,2,13,8,7,6,9,4,11,10,5};
+ final int [] n31= {0,10,4,14,9,3,13,7,2,8,6,12,11,1,15,5};
+ final int [] n32= {0,10,5,15,11,1,14,4,6,12,3,9,13,7,8,2};
+ final int [] n33= {0,4,9,13,3,7,10,14,7,3,14,10,4,0,13,9};
+ final int [] key= {30,31,32,33,34,35,36,37,38,39,61,62,63,64,65,66};
+ final char [] ssid= {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
+
+ public void run(){
+ if ( router == null)
+ return;
+ if ( router.getMac().length() != 12 )
+ {
+ handler.sendMessage(Message.obtain(handler, ERROR_MSG ,
+ resources.getString(R.string.msg_errpirelli)));
+ return;
+ }
+ int [] mac = new int [12];
+ for ( int i = 0 ; i < 12 ; ++i)
+ {
+ mac[i] = Integer.parseInt(router.getMac().substring(i, i+1), 16);
+ }
+ int s1=(n1[mac[0]])^(a4[mac[1]])^(a6[mac[2]])^(a1[mac[3]])^(a11[mac[4]])^
+ (n20[mac[5]])^(a10[mac[6]])^(a4[mac[7]])^(a8[mac[8]])^(a2[mac[9]])^
+ (a5[mac[10]])^(a9[mac[11]])^5;
+ int s2=(n2[mac[0]])^(n8[mac[1]])^(n15[mac[2]])^(n17[mac[3]])^(a12[mac[4]])^
+ (n21[mac[5]])^(n24[mac[6]])^(a9[mac[7]])^(n27[mac[8]])^(n29[mac[9]])^
+ (a11[mac[10]])^(n32[mac[11]])^10;
+ int s3=(n3[mac[0]])^(n9[mac[1]])^(a5[mac[2]])^(a9[mac[3]])^(n19[mac[4]])^
+ (n22[mac[5]])^(a12[mac[6]])^(n25[mac[7]])^(a11[mac[8]])^
+ (a13[mac[9]])^(n30[mac[10]])^(n33[mac[11]])^11;
+ int s4=(n4[mac[0]])^(n10[mac[1]])^(n16[mac[2]])^(n18[mac[3]])^(a13[mac[4]])^
+ (n23[mac[5]])^(a1[mac[6]])^(n26[mac[7]])^(n28[mac[8]])^(a3[mac[9]])^
+ (a6[mac[10]])^(a0[mac[11]])^10;
+ String ssidFinal = Character.toString(ssid[s1]) + Character.toString(ssid[s2]) +
+ Character.toString(ssid[s3]) + Character.toString(ssid[s4]);
+ int ya=(a2[mac[0]])^(n11[mac[1]])^(a7[mac[2]])^(a8[mac[3]])^(a14[mac[4]])^
+ (a5[mac[5]])^(a5[mac[6]])^(a2[mac[7]])^(a0[mac[8]])^(a1[mac[9]])^
+ (a15[mac[10]])^(a0[mac[11]])^13;
+ int yb=(n5[mac[0]])^(n12[mac[1]])^(a5[mac[2]])^(a7[mac[3]])^(a2[mac[4]])^
+ (a14[mac[5]])^(a1[mac[6]])^(a5[mac[7]])^(a0[mac[8]])^(a0[mac[9]])^
+ (n31[mac[10]])^(a15[mac[11]])^4;
+ int yc=(a3[mac[0]])^(a5[mac[1]])^(a2[mac[2]])^(a10[mac[3]])^(a7[mac[4]])^
+ (a8[mac[5]])^(a14[mac[6]])^(a5[mac[7]])^(a5[mac[8]])^(a2[mac[9]])^
+ (a0[mac[10]])^(a1[mac[11]])^7;
+ int yd=(n6[mac[0]])^(n13[mac[1]])^(a8[mac[2]])^(a2[mac[3]])^(a5[mac[4]])^
+ (a7[mac[5]])^(a2[mac[6]])^(a14[mac[7]])^(a1[mac[8]])^(a5[mac[9]])^
+ (a0[mac[10]])^(a0[mac[11]])^14;
+ int ye=(n7[mac[0]])^(n14[mac[1]])^(a3[mac[2]])^(a5[mac[3]])^(a2[mac[4]])^
+ (a10[mac[5]])^(a7[mac[6]])^(a8[mac[7]])^(a14[mac[8]])^(a5[mac[9]])^
+ (a5[mac[10]])^(a2[mac[11]])^7;
+ pwList.add(Integer.toString(key[ya]) + Integer.toString(key[yb]) +
+ Integer.toString(key[yc]) + Integer.toString(key[yd]) +
+ Integer.toString(key[ye]) );
+ handler.sendEmptyMessage(RESULTS_READY);
+ if ( !router.getSSIDsubpart().equalsIgnoreCase(ssidFinal) &&
+ router.ssid.startsWith("INFINITUM") )
+ {
+
+ handler.sendMessage(Message.obtain(handler, ERROR_MSG ,
+ resources.getString(R.string.msg_err_essid_no_match)));
+ }
+ return;
+ }
+}
diff --git a/android/src/org/exobel/routerkeygen/InfostradaKeygen.java b/android/src/org/exobel/routerkeygen/InfostradaKeygen.java
new file mode 100644
index 0000000..f61abbc
--- /dev/null
+++ b/android/src/org/exobel/routerkeygen/InfostradaKeygen.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+package org.exobel.routerkeygen;
+
+import android.content.res.Resources;
+import android.os.Handler;
+import android.os.Message;
+
+/*
+ * This is not actual an algorithm
+ * as the key is calculated from the MAC
+ * address adding a '2' as the first character
+ */
+public class InfostradaKeygen extends KeygenThread {
+
+ public InfostradaKeygen(Handler h, Resources res) {
+ super(h, res);
+ }
+
+ public void run(){
+ if ( router == null)
+ return;
+ if ( router.getMac().length() != 12 )
+ {
+ handler.sendMessage(Message.obtain(handler, ERROR_MSG ,
+ resources.getString(R.string.msg_errpirelli)));
+ return;
+ }
+ pwList.add("2"+router.getMac().toUpperCase());
+ handler.sendEmptyMessage(RESULTS_READY);
+ return;
+ }
+
+}
diff --git a/android/src/org/exobel/routerkeygen/JenkinsHash.java b/android/src/org/exobel/routerkeygen/JenkinsHash.java
new file mode 100644
index 0000000..873364b
--- /dev/null
+++ b/android/src/org/exobel/routerkeygen/JenkinsHash.java
@@ -0,0 +1,205 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+package org.exobel.routerkeygen;
+
+
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Fast, well distributed, cross-platform hash functions.
+ *
+ *
+ * Development background: I was surprised to discovered that there isn't a good cross-platform hash function defined for strings. MD5, SHA, FVN, etc, all define hash functions over bytes, meaning that it's under-specified for strings.
+ *
+ *
+ * So I set out to create a standard 32 bit string hash that would be well defined for implementation in all languages, have very high performance, and have very good hash properties such as distribution. After evaluating all the options, I settled on using Bob Jenkins' lookup3 as a base. It's a well studied and very fast hash function, and the hashword variant can work with 32 bits at a time (perfect for hashing unicode code points). It's also even faster on the latest JVMs which can translate pairs of shifts into native rotate instructions.
+ *
+ * The only problem with using lookup3 hashword is that it includes a length in the initial value. This would suck some performance out since directly hashing a UTF8 or UTF16 string (Java) would require a pre-scan to get the actual number of unicode code points. The solution was to simply remove the length factor, which is equivalent to biasing initVal by -(numCodePoints*4). This slightly modified lookup3 I define as lookup3ycs.
+ *
+ * So the definition of the cross-platform string hash lookup3ycs is as follows:
+ *
+ * The hash value of a character sequence (a string) is defined to be the hash of its unicode code points, according to lookup3 hashword, with the initval biased by -(length*4).
+ *
+ *So by definition
+ *
+ *
+ * lookup3ycs(k,offset,length,initval) == lookup3(k,offset,length,initval-(length*4))
+ *
+ * AND
+ *
+ * lookup3ycs(k,offset,length,initval+(length*4)) == lookup3(k,offset,length,initval)
+ *
+ * An obvious advantage of this relationship is that you can use lookup3 if you don't have an implementation of lookup3ycs.
+ *
+ *
+ *
+ * @author yonik
+ */
+public class JenkinsHash {
+ /**
+ * A Java implementation of hashword from lookup3.c by Bob Jenkins
+ * (original source ).
+ *
+ * @param k the key to hash
+ * @param offset offset of the start of the key
+ * @param length length of the key
+ * @param initval initial value to fold into the hash
+ * @return the 32 bit hash code
+ */
+
+
+ // max value to limit it to 4 bytes
+ private static final long MAX_VALUE = 0xFFFFFFFFL;
+
+ // internal variables used in the various calculations
+ long a;
+ long b;
+ long c;
+
+
+ /**
+ * Do addition and turn into 4 bytes.
+ * @param val
+ * @param add
+ * @return
+ */
+ private long add(long val, long add) {
+ return (val + add) & MAX_VALUE;
+ }
+
+ /**
+ * Do subtraction and turn into 4 bytes.
+ * @param val
+ * @param subtract
+ * @return
+ */
+ private long subtract(long val, long subtract) {
+ return (val - subtract) & MAX_VALUE;
+ }
+
+ /**
+ * Left shift val by shift bits and turn in 4 bytes.
+ * @param val
+ * @param xor
+ * @return
+ */
+ private long xor(long val, long xor) {
+ return (val ^ xor) & MAX_VALUE;
+ }
+
+ /**
+ * Left shift val by shift bits. Cut down to 4 bytes.
+ * @param val
+ * @param shift
+ * @return
+ */
+ private long leftShift(long val, int shift) {
+ return (val << shift) & MAX_VALUE;
+ }
+
+
+ private long rot(long val, int shift){
+ return (leftShift(val, shift)|(val>>>(32-shift))) & MAX_VALUE;
+ }
+ /**
+ * Mix up the values in the hash function.
+ */
+ private void hashMix() {
+ a = subtract(a,c);
+ a = xor(a, rot(c, 4));
+ c = add(c, b);
+ b = subtract(b,a);
+ b = xor(b, rot(a, 6));
+ a = add(a, c);
+ c = subtract(c,b);
+ c = xor(c, rot(b, 8));
+ b = add(b, a);
+ a = subtract(a,c);
+ a = xor(a, rot(c, 16));
+ c = add(c, b);
+ b = subtract(b,a);
+ b = xor(b, rot(a, 19));
+ a = add(a, c);
+ c = subtract(c,b);
+ c = xor(c, rot(b, 4));
+ b = add(b, a);
+ }
+
+ @SuppressWarnings("fallthrough")
+ public long hashword(long[] k, int length, long initval) {
+
+ a = b = c = 0xdeadbeef + (length<<2) + ( initval & MAX_VALUE ) ;
+
+ int i=0;
+ while (length > 3)
+ {
+ a = add( a, k[i+0]);
+ b = add( b, k[i+1]);
+ c = add( c, k[i+2]);
+ hashMix();
+
+ length -= 3;
+ i += 3;
+ }
+
+ switch(length) {
+ case 3 : c = add( c, k[i+2]); // fall through
+ case 2 : b = add( b, k[i+1]); // fall through
+ case 1 : a = add( a, k[i+0]); // fall through
+ finalHash();
+ case 0:
+ break;
+ }
+ return c;
+ }
+
+ void finalHash(){
+ c = xor(c, b);
+ c = subtract(c,rot(b,14) );
+ a = xor(a, c);
+ a = subtract(a,rot(c,11) );
+ b = xor(b,a);
+ b = subtract(b, rot(a,25));
+ c = xor(c, b);
+ c = subtract(c,rot(b,16) );
+ a = xor(a, c);
+ a = subtract(a,rot(c,4) );
+ b = xor(b,a);
+ b = subtract(b, rot(a,14));
+ c = xor(c, b);
+ c = subtract(c,rot(b,24) );
+ }
+
+
+}
diff --git a/android/src/org/exobel/routerkeygen/KeygenThread.java b/android/src/org/exobel/routerkeygen/KeygenThread.java
new file mode 100644
index 0000000..879cea7
--- /dev/null
+++ b/android/src/org/exobel/routerkeygen/KeygenThread.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+package org.exobel.routerkeygen;
+
+import java.security.MessageDigest;
+import java.util.ArrayList;
+
+import android.content.res.Resources;
+import android.os.Handler;
+
+
+public class KeygenThread extends Thread {
+
+ MessageDigest md;
+ WifiNetwork router;
+ boolean stopRequested = false;
+ ArrayList pwList;
+ static final int RESULTS_READY = 1000;
+ static final int ERROR_MSG = 1001;
+ Handler handler;
+ Resources resources;
+
+
+ public KeygenThread( Handler h , Resources res)
+ {
+ this.handler = h;
+ this.resources = res;
+ this.pwList = new ArrayList();
+
+ }
+
+
+ public ArrayList getResults() {
+ return pwList;
+ }
+
+
+}
diff --git a/android/src/org/exobel/routerkeygen/NativeThomson.java b/android/src/org/exobel/routerkeygen/NativeThomson.java
new file mode 100644
index 0000000..6e5359f
--- /dev/null
+++ b/android/src/org/exobel/routerkeygen/NativeThomson.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+package org.exobel.routerkeygen;
+
+import android.content.res.Resources;
+import android.os.Handler;
+import android.os.Message;
+
+public class NativeThomson extends KeygenThread{
+
+ public NativeThomson(Handler h, Resources res) {
+ super(h, res);
+ }
+
+
+ static {
+ System.loadLibrary("thomson");
+ }
+
+
+ /**
+ * Native processing without a dictionary.
+ */
+ public native String[] thomson( byte [] essid );
+
+
+ public void run(){
+ if ( router == null)
+ return;
+ if ( router.getSSIDsubpart().length() != 6 )
+ {
+ handler.sendMessage(Message.obtain(handler, ERROR_MSG ,
+ resources.getString(R.string.msg_shortessid6)));
+ return;
+ }
+ byte [] routerESSID = new byte[3];
+
+ for (int i = 0; i < 6; i += 2)
+ routerESSID[i / 2] = (byte) ((Character.digit(router.getSSIDsubpart().charAt(i), 16) << 4)
+ + Character.digit(router.getSSIDsubpart().charAt(i + 1), 16));
+ String [] results;
+ try{
+ results = this.thomson(routerESSID);
+ }catch (Exception e) {
+ handler.sendMessage(Message.obtain(handler, ERROR_MSG ,
+ resources.getString(R.string.msg_err_native)));
+ return;
+ }
+ if ( stopRequested )
+ return;
+ for (int i = 0 ; i < results.length ; ++i )
+ pwList.add(results[i]);
+
+ if(pwList.toArray().length == 0)
+ {
+ handler.sendMessage(Message.obtain(handler, ERROR_MSG ,
+ resources.getString(R.string.msg_errnomatches)));
+ return;
+ }
+ handler.sendEmptyMessage(RESULTS_READY);
+ return;
+ }
+
+}
diff --git a/android/src/org/exobel/routerkeygen/OnoKeygen.java b/android/src/org/exobel/routerkeygen/OnoKeygen.java
new file mode 100644
index 0000000..8780a17
--- /dev/null
+++ b/android/src/org/exobel/routerkeygen/OnoKeygen.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+package org.exobel.routerkeygen;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+import android.content.res.Resources;
+import android.os.Handler;
+import android.os.Message;
+/*
+ * The algorithm for the type of network
+ * whose SSID must be in the form of [pP]1XXXXXX0000X
+ * where X means a digit.
+ * Algorithm:
+ * Adding +1 to the last digit and use the resulting
+ * string as the passphrase for WEP key generation.
+ * Use the first of the 64 bit keys and the 128 bit one
+ * as possible keys.
+ * Credit:
+ * pulido from http://foro.elhacker.net
+ * http://foro.elhacker.net/hacking_wireless/desencriptando_wep_por_defecto_de_las_redes_ono_wifi_instantaneamente-t160928.0.html
+ * */
+public class OnoKeygen extends KeygenThread {
+
+ public OnoKeygen(Handler h, Resources res) {
+ super(h, res);
+ }
+
+ public void run(){
+ if ( router == null)
+ return;
+ if ( router.ssid.length() != 13 )
+ {
+ handler.sendMessage(Message.obtain(handler, ERROR_MSG ,
+ resources.getString(R.string.msg_shortessid6)));
+ return;
+ }
+ String val = router.ssid.substring(0,11)+
+ Integer.toString(Integer.parseInt(router.ssid.substring(11))+1);
+ if ( val.length() < 13 )
+ val = router.ssid.substring(0,11)+ "0" + router.ssid.substring(11);
+ int [] pseed = new int[4];
+ pseed[0] = 0;
+ pseed[1] = 0;
+ pseed[2] = 0;
+ pseed[3] = 0;
+ int randNumber = 0;
+ String key = "";
+ for (int i = 0; i < val.length(); i++)
+ {
+ pseed[i%4] ^= (int) val.charAt(i);
+ }
+ randNumber = pseed[0] | (pseed[1] << 8) | (pseed[2] << 16) | (pseed[3] << 24);
+ short tmp = 0;
+ for (int j = 0; j < 5; j++)
+ {
+ randNumber = (randNumber * 0x343fd + 0x269ec3) & 0xffffffff;
+ tmp = (short) ((randNumber >> 16) & 0xff);
+ key += StringUtils.getHexString(tmp).toUpperCase();
+ }
+ pwList.add(key);
+ key = "";
+ try {
+ md = MessageDigest.getInstance("MD5");
+ } catch (NoSuchAlgorithmException e1) {
+ handler.sendMessage(Message.obtain(handler, ERROR_MSG ,
+ resources.getString(R.string.msg_nomd5)));
+ return;
+ }
+ md.reset();
+ md.update(padto64(val).getBytes());
+ byte [] hash = md.digest();
+ for ( int i = 0 ; i < 13 ; ++i )
+ key += StringUtils.getHexString((short)hash[i]);
+ pwList.add(key.toUpperCase());
+ handler.sendEmptyMessage(RESULTS_READY);
+ return;
+ }
+
+
+ private String padto64( String val ){
+ if ( val.equals("") )
+ return "";
+ String ret = "";
+ for ( int i = 0; i < ( 1 + (64 / (val.length())) ) ; ++i)
+ ret += val;
+ return ret.substring(0,64);
+ }
+
+
+}
diff --git a/android/src/org/exobel/routerkeygen/PirelliKeygen.java b/android/src/org/exobel/routerkeygen/PirelliKeygen.java
new file mode 100644
index 0000000..658d52f
--- /dev/null
+++ b/android/src/org/exobel/routerkeygen/PirelliKeygen.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+package org.exobel.routerkeygen;
+
+import java.io.UnsupportedEncodingException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+import android.content.res.Resources;
+import android.os.Handler;
+import android.os.Message;
+
+
+public class PirelliKeygen extends KeygenThread{
+
+ public PirelliKeygen(Handler h, Resources res) {
+ super(h, res);
+ }
+
+ final byte[] saltMD5 = {
+ 0x22, 0x33, 0x11, 0x34, 0x02,
+ (byte) 0x81, (byte) 0xFA, 0x22, 0x11, 0x41,
+ 0x68, 0x11, 0x12, 0x01, 0x05,
+ 0x22, 0x71, 0x42, 0x10, 0x66 };
+
+ public void run(){
+
+ if ( router == null)
+ return;
+ try {
+ md = MessageDigest.getInstance("MD5");
+ } catch (NoSuchAlgorithmException e1) {
+ handler.sendMessage(Message.obtain(handler, ERROR_MSG ,
+ resources.getString(R.string.msg_nomd5)));
+ return;
+ }
+ if ( router.getSSIDsubpart().length() != 12 )
+ {
+ handler.sendMessage(Message.obtain(handler, ERROR_MSG ,
+ resources.getString(R.string.msg_errpirelli)));
+ return;
+ }
+
+ byte [] routerESSID = new byte[6];
+ for (int i = 0; i < 12; i += 2)
+ routerESSID[i / 2] = (byte) ((Character.digit(router.getSSIDsubpart().charAt(i), 16) << 4)
+ + Character.digit(router.getSSIDsubpart().charAt(i + 1), 16));
+
+ md.reset();
+ md.update(routerESSID);
+ md.update(saltMD5);
+ byte [] hash = md.digest();
+ short [] key = new short[5];
+ /*Grouping in five groups fo five bits*/
+ key[0] = (short)( (hash[0] & 0xF8) >> 3 );
+ key[1] = (short)(( (hash[0] & 0x07) << 2) | ( (hash[1] & 0xC0) >>6 ));
+ key[2] = (short)((hash[1] & 0x3E) >> 1 );
+ key[3] = (short)(( (hash[1] & 0x01) << 4) | ((hash[2] & 0xF0) >> 4));
+ key[4] = (short)(( (hash[2] & 0x0F) << 1) | ((hash[3] & 0x80) >> 7) );
+ for ( int i = 0 ; i < 5 ; ++i )
+ if ( key[i] >= 0x0A )
+ key[i] += 0x57;
+ try {
+ pwList.add(StringUtils.getHexString(key));
+ } catch (UnsupportedEncodingException e) {}
+ handler.sendEmptyMessage(RESULTS_READY);
+ return;
+ }
+
+}
diff --git a/android/src/org/exobel/routerkeygen/Preferences.java b/android/src/org/exobel/routerkeygen/Preferences.java
new file mode 100644
index 0000000..829b5a3
--- /dev/null
+++ b/android/src/org/exobel/routerkeygen/Preferences.java
@@ -0,0 +1,782 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+
+package org.exobel.routerkeygen;
+
+import java.io.DataInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FilenameFilter;
+import java.io.InputStream;
+import java.net.URL;
+import java.net.URLConnection;
+import java.net.UnknownHostException;
+import java.security.DigestInputStream;
+import java.security.MessageDigest;
+import java.util.Stack;
+import java.util.TreeSet;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.AlertDialog.Builder;
+import android.app.ProgressDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.DialogInterface.OnDismissListener;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.DialogInterface.OnClickListener;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
+import android.net.Uri;
+import android.net.wifi.WifiManager;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Environment;
+import android.os.Message;
+import android.preference.Preference;
+import android.preference.PreferenceActivity;
+import android.preference.PreferenceManager;
+import android.preference.Preference.OnPreferenceClickListener;
+import android.text.method.LinkMovementMethod;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TabHost;
+import android.widget.TextView;
+import android.widget.Toast;
+import android.widget.TabHost.TabSpec;
+
+public class Preferences extends PreferenceActivity {
+
+ /** The maximum supported dictionary version */
+ public static final int MAX_DIC_VERSION = 3;
+
+ ProgressDialog pbarDialog;
+ Downloader downloader;
+ long myProgress = 0, fileLen;
+ long lastt, now = 0, downloadBegin = 0;
+
+ byte[] dicVersion = new byte [2];
+ static byte[] cfvTable = new byte[18];
+
+ public static final String PUB_DOWNLOAD =
+ "http://android-thomson-key-solver.googlecode.com/files/RKDictionary.dic";
+ private static final String PUB_DIC_CFV =
+ "http://android-thomson-key-solver.googlecode.com/svn/trunk/RKDictionary.cfv";
+ private static final String PUB_VERSION =
+ "http://android-thomson-key-solver.googlecode.com/svn/trunk/RouterKeygenVersion.txt";
+
+ private static final String folderSelectPref = "folderSelect";
+ private static final String VERSION = "2.9.1";
+ private static final String LAUNCH_DATE = "04/01/2012";
+ private String version ="";
+
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ addPreferencesFromResource(R.layout.preferences);
+
+
+ findPreference("download").setOnPreferenceClickListener(
+ new OnPreferenceClickListener() {
+ public boolean onPreferenceClick(Preference preference)
+ {
+ ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
+ NetworkInfo netInfo = cm.getActiveNetworkInfo();
+ if (netInfo == null || !netInfo.isConnectedOrConnecting()) {
+ Toast.makeText(getBaseContext(),getString(R.string.pref_msg_no_network),
+ Toast.LENGTH_SHORT).show();
+ return true;
+ }
+
+ showDialog(DIALOG_ASK_DOWNLOAD);
+ return true;
+ }
+ });
+
+ findPreference("donate").setOnPreferenceClickListener(
+ new OnPreferenceClickListener() {
+ public boolean onPreferenceClick(Preference preference)
+ {
+ String donateLink = "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=V3FFBTRTTV5DN";
+ Uri uri = Uri.parse(donateLink );
+ startActivity( new Intent( Intent.ACTION_VIEW, uri ) );
+
+ return true;
+ }
+ });
+ findPreference("update").setOnPreferenceClickListener(
+ new OnPreferenceClickListener() {
+ public boolean onPreferenceClick(Preference preference) {
+ new AsyncTask() {
+ protected void onPreExecute(){
+ showDialog(DIALOG_CHECK_DOWNLOAD_SERVER);
+ }
+
+ protected Integer doInBackground(Void... params) {
+
+ // Comparing this version with the online version
+ try {
+ URLConnection con = new URL(PUB_VERSION).openConnection();
+ DataInputStream dis = new DataInputStream(con.getInputStream());
+ final byte [] versionData = new byte[6];
+ dis.read(versionData);
+ version = new String(versionData).trim();
+
+ // Check our version
+ if(VERSION.equals(version))
+ {
+ // All is well
+ return 1;
+ }
+ return 0;
+
+ } catch ( UnknownHostException e ){
+ return -1;
+ }
+ catch (Exception e)
+ {
+ return null;
+ }
+ }
+
+ protected void onPostExecute(Integer result ){
+ removeDialog(DIALOG_CHECK_DOWNLOAD_SERVER);
+ if (isFinishing())
+ return;
+ if ( result == null )
+ {
+ showDialog(DIALOG_ERROR);
+ return;
+ }
+ switch ( result )
+ {
+ case -1:
+ Toast.makeText(Preferences.this,
+ R.string.msg_errthomson3g,
+ Toast.LENGTH_SHORT).show();
+ break;
+ case 0:
+ showDialog(DIALOG_UPDATE_NEEDED);
+ break;
+ case 1:
+ Toast.makeText(Preferences.this,
+ R.string.msg_app_updated,
+ Toast.LENGTH_SHORT).show();
+ break;
+ }
+
+ }
+ }.execute();
+ return true;
+ }
+ });
+ findPreference("about").setOnPreferenceClickListener(
+ new OnPreferenceClickListener() {
+ public boolean onPreferenceClick(Preference preference) {
+ showDialog(DIALOG_ABOUT);
+ return true;
+ }
+ });
+ findPreference("folderSelect").setOnPreferenceClickListener(new OnPreferenceClickListener() {
+ public boolean onPreferenceClick(Preference preference) {
+ mPath = new File(Environment.getExternalStorageDirectory() + File.separator);
+ mChosenFile = File.separator;
+ directoryTree.clear();
+ showDialog(DIALOG_LOAD_FOLDER);
+ return true;
+ }
+ });
+ }
+
+ private void checkDownload(){
+ showDialog(DIALOG_CHECKING_DOWNLOAD);
+ new Thread(new Runnable() {
+ public void run() {
+ try
+ {
+ String folderSelect = PreferenceManager
+ .getDefaultSharedPreferences(getBaseContext()).getString(folderSelectPref,
+ Environment.getExternalStorageDirectory().getAbsolutePath());
+
+ String dicTemp = Environment.getExternalStorageDirectory().getPath() + File.separator + "DicTemp.dic";
+ if(!checkDicMD5(dicTemp))
+ {
+ new File(dicTemp).delete();
+ messHand.sendEmptyMessage(-1);
+ return;
+ }
+ if (!renameFile(Environment.getExternalStorageDirectory().getPath() + File.separator + "DicTemp.dic" ,
+ folderSelect + File.separator + "RouterKeygen.dic" , true ))
+ {
+ messHand.sendEmptyMessage(8);
+ return;
+ }
+ }
+ catch (Exception e)
+ {
+ messHand.sendEmptyMessage(-1);
+ return;
+ }
+ messHand.sendEmptyMessage(9);
+ }
+ }).start();
+ }
+
+ // Check RouterKeygen.dic file through md5
+ private boolean checkDicMD5(String dicFile)
+ {
+ try
+ {
+ MessageDigest md = MessageDigest.getInstance("MD5");
+ InputStream is = new FileInputStream(dicFile);
+ try {
+ is = new DigestInputStream(is, md);
+ byte [] buffer = new byte [16384] ;
+ while ( is.read ( buffer ) != -1 );
+ }
+ finally {
+ is.close();
+ }
+ byte[] digest = md.digest();
+
+ URLConnection con = new URL(PUB_DIC_CFV).openConnection();
+ DataInputStream dis = new DataInputStream(con.getInputStream());
+ if(con.getContentLength() != 18)
+ throw new Exception();
+
+ dis.read(Preferences.cfvTable);
+
+ for(int i = 0; i < 16; ++i)
+ if(digest[i] != cfvTable[i + 2])
+ return false;
+ }
+ catch(Exception e)
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ // Download the dictionary
+ private void startDownload() {
+ showDialog(DIALOG_DOWNLOAD);
+ myProgress = 0;
+ downloader = new Downloader(messHand , PUB_DOWNLOAD);
+ downloader.start();
+ lastt = downloadBegin = System.currentTimeMillis();
+ }
+ int downloadBefore = 0;
+ Handler messHand = new Handler() {
+
+ public void handleMessage(Message msg) {
+
+ switch(msg.what)
+ {
+ case -1:
+ removeDialog(DIALOG_CHECK_DOWNLOAD_SERVER);
+ removeDialog(DIALOG_CHECKING_DOWNLOAD);
+ removeDialog(DIALOG_DOWNLOAD);
+ if (!isFinishing()) {
+ showDialog(DIALOG_ERROR);
+ }
+ break;
+ case 0:
+ removeDialog(DIALOG_DOWNLOAD);
+ if (!isFinishing()) {
+ showDialog(DIALOG_ERROR_NOSD);
+ }
+ break;
+ case 1:
+ removeDialog(DIALOG_DOWNLOAD);
+ if (!isFinishing()) {
+ showDialog(DIALOG_ERROR_NOMEMORYONSD);
+ }
+ break;
+ case 2:
+ downloadBefore = msg.arg1;
+ fileLen = msg.arg2;
+ break;
+ case 3:
+ removeDialog(DIALOG_DOWNLOAD);
+ checkDownload();
+ break;
+ case 4:
+ now = System.currentTimeMillis();
+ if(now - lastt < 1000 )
+ break;
+
+ myProgress = msg.arg1 ;
+ fileLen = msg.arg2;
+ if ( fileLen == 0 )
+ break;
+
+ long kbs = 0;
+ try{
+ kbs = (((myProgress- downloadBefore) / (now - downloadBegin))*1000/1024);
+
+ }catch(ArithmeticException e){
+ kbs = 0;
+ }
+ if(kbs == 0)
+ break;
+ long eta = (fileLen - myProgress) / kbs / 1024;
+ long progress = ( 100L * myProgress )/ fileLen;
+ pbarDialog.setProgress((int)progress);
+ pbarDialog.setMessage(getString(R.string.msg_dl_speed) + ": "
+ + kbs + "kb/s\n"
+ + getString(R.string.msg_dl_eta) + ": "
+ + (eta > 60 ? eta/60 + "m" : eta + "s"));
+ lastt = now;
+ break;
+ case 5:
+ removeDialog(DIALOG_CHECK_DOWNLOAD_SERVER);
+ if (!isFinishing()) {
+ showDialog(DIALOG_ERROR_TOO_ADVANCED);
+ }
+ break;
+ case 6:
+ removeDialog(DIALOG_CHECK_DOWNLOAD_SERVER);
+ if (!isFinishing()) {
+ Toast.makeText(getBaseContext(),getResources().getString(R.string.msg_dic_updated),
+ Toast.LENGTH_SHORT).show();
+ }
+ break;
+ case 7:
+ removeDialog(DIALOG_CHECK_DOWNLOAD_SERVER);
+ startDownload();
+ break;
+ case 8:
+ removeDialog(DIALOG_CHECKING_DOWNLOAD);
+ if (!isFinishing()) {
+ Toast.makeText(getBaseContext(),getResources().getString(R.string.pref_msg_err_rename_dic),
+ Toast.LENGTH_SHORT).show();
+ }
+ break;
+
+ case 9:
+ removeDialog(DIALOG_CHECKING_DOWNLOAD);
+ if (!isFinishing()) {
+ Toast.makeText(Preferences.this, R.string.msg_dic_updated_finished, Toast.LENGTH_SHORT).show();
+ }
+ break;
+ case 10:
+ removeDialog(DIALOG_CHECK_DOWNLOAD_SERVER);
+ if (!isFinishing()) {
+ Toast.makeText(Preferences.this, R.string.msg_errthomson3g, Toast.LENGTH_SHORT).show();
+ }
+ break;
+ }
+ }
+ };
+
+ private boolean renameFile(String file, String toFile , boolean saveOld) {
+
+ File toBeRenamed = new File(file);
+ File newFile = new File(toFile);
+
+ if (!toBeRenamed.exists() || toBeRenamed.isDirectory())
+ return false;
+
+
+ if (newFile.exists() && !newFile.isDirectory() && saveOld) {
+ if ( !renameFile(toFile,toFile+"_backup" , false) )
+ Toast.makeText(getBaseContext(),getResources().getString(R.string.pref_msg_err_backup_dic),
+ Toast.LENGTH_SHORT).show();
+ else
+ toFile +="_backup";
+ }
+ newFile = new File(toFile);
+
+ //Rename
+ if (!toBeRenamed.renameTo(newFile) )
+ return false;
+
+
+ return true;
+ }
+
+ private static final String TAG = "ThomsonPreferences";
+ private String[] mFileList;
+
+ private File mPath = new File(Environment.getExternalStorageDirectory() + File.separator);
+ private String mChosenFile = File.separator;
+ Stack directoryTree = new Stack();
+
+
+ private void loadFolderList() {
+ mPath = new File(Environment.getExternalStorageDirectory() + File.separator + mChosenFile);
+ if(mPath.exists()){
+ FilenameFilter filter = new FilenameFilter(){
+ public boolean accept(File dir, String filename){
+ File sel = new File(dir, filename);
+ return sel.isDirectory();
+ }
+ };
+ mFileList = mPath.list(filter);
+ if ( mFileList == null )
+ return;
+ TreeSet sorter = new TreeSet();
+ for ( int i = 0 ; i < mFileList.length ; ++i )
+ sorter.add(mFileList[i]);
+ mFileList = sorter.toArray(mFileList);
+ }
+ else{
+ if ( !directoryTree.empty() )
+ {
+ mChosenFile = directoryTree.pop();
+ loadFolderList();
+ }
+ else
+ mFileList = null;
+ }
+ }
+
+ private static final int DIALOG_LOAD_FOLDER = 1000;
+ private static final int DIALOG_ABOUT = 1001;
+ private static final int DIALOG_ASK_DOWNLOAD = 1002;
+ private static final int DIALOG_CHECK_DOWNLOAD_SERVER = 1003;
+ private static final int DIALOG_ERROR_TOO_ADVANCED = 1004;
+ private static final int DIALOG_DOWNLOAD = 1005;
+ private static final int DIALOG_ERROR = 1006;
+ private static final int DIALOG_ERROR_NOSD = 1007;
+ private static final int DIALOG_ERROR_NOMEMORYONSD = 1008;
+ private static final int DIALOG_CHECKING_DOWNLOAD = 1009;
+ private static final int DIALOG_UPDATE_NEEDED = 1011;
+
+
+
+ protected Dialog onCreateDialog(int id) {
+ AlertDialog.Builder builder = new Builder(this);
+ switch(id) {
+ case DIALOG_LOAD_FOLDER:
+ {
+ loadFolderList();
+ builder.setTitle(getString(R.string.folder_chooser_title));
+ if(mFileList == null || mFileList.length == 0) {
+ Log.e(TAG, "Showing file picker before loading the file list");
+ mFileList = new String[1];
+ mFileList[0] = getString(R.string.folder_chooser_no_dir);
+ builder.setItems(mFileList, new DialogInterface.OnClickListener(){
+ public void onClick(DialogInterface dialog,int which) {}}
+ );
+ }
+ else
+ builder.setItems(mFileList, new DialogInterface.OnClickListener(){
+ public void onClick(DialogInterface dialog, int which){
+ directoryTree.push(mChosenFile);
+ mChosenFile += File.separator + mFileList[which];
+ removeDialog(DIALOG_LOAD_FOLDER);
+ showDialog(DIALOG_LOAD_FOLDER);
+ }
+ });
+ if ( !mChosenFile.equals(File.separator))
+ builder.setNegativeButton(R.string.bt_choose_back,new OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ if ( !directoryTree.empty())
+ mChosenFile = directoryTree.pop();
+ else
+ mChosenFile = File.separator;
+ removeDialog(DIALOG_LOAD_FOLDER);
+ showDialog(DIALOG_LOAD_FOLDER);
+ }
+ });
+ builder.setNeutralButton(R.string.bt_choose,new OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ SharedPreferences customSharedPreference = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
+ SharedPreferences.Editor editor = customSharedPreference
+ .edit();
+
+ editor.putString(folderSelectPref,mPath.toString());
+ editor.commit();
+ String path = mPath.toString();
+ mPath = new File(path + File.separator + "RouterKeygen.dic");
+ File second = new File(path + File.separator + "RKDictionary.dic");
+ if ( !mPath.exists() && !second.exists())
+ {
+ Toast.makeText(getBaseContext(),getResources().getString(R.string.pref_msg_notfound) + " " + path,
+ Toast.LENGTH_SHORT).show();
+ }
+ else
+ {
+ if ( mPath.exists() )
+ Toast.makeText(getBaseContext(),mPath.toString() + " " + getResources().getString(R.string.pref_msg_found),
+ Toast.LENGTH_SHORT).show();
+ else
+ Toast.makeText(getBaseContext(),second.toString() + " " + getResources().getString(R.string.pref_msg_found),
+ Toast.LENGTH_SHORT).show();
+ }
+ }
+ });
+
+ break;
+ }
+ case DIALOG_ABOUT:
+ {
+ LayoutInflater inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE);
+ View layout = inflater.inflate(R.layout.about_dialog,
+ (ViewGroup) findViewById(R.id.tabhost));
+ TabHost tabs = (TabHost) layout.findViewById(R.id.tabhost);
+ tabs.setup();
+ TabSpec tspec1 = tabs.newTabSpec("about");
+ tspec1.setIndicator(getString(R.string.pref_about));
+
+ tspec1.setContent(R.id.text_about_scroll);
+ TextView text = ((TextView)layout.findViewById(R.id.text_about));
+ text.setMovementMethod(LinkMovementMethod.getInstance());
+ text.append(VERSION + "\n" + LAUNCH_DATE);
+ tabs.addTab(tspec1);
+ TabSpec tspec2 = tabs.newTabSpec("credits");
+ tspec2.setIndicator(getString(R.string.dialog_about_credits));
+ tspec2.setContent(R.id.about_credits_scroll);
+ ((TextView)layout.findViewById(R.id.about_credits))
+ .setMovementMethod(LinkMovementMethod.getInstance());
+ tabs.addTab(tspec2);
+ TabSpec tspec3 = tabs.newTabSpec("license");
+ tspec3.setIndicator(getString(R.string.dialog_about_license));
+ tspec3.setContent(R.id.about_license_scroll);
+ ((TextView)layout.findViewById(R.id.about_license))
+ .setMovementMethod(LinkMovementMethod.getInstance());
+ tabs.addTab(tspec3);
+ builder.setNeutralButton(R.string.bt_close, new OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ removeDialog(DIALOG_ABOUT);
+
+ }
+ });
+ builder.setView(layout);
+ break;
+ }
+ case DIALOG_ASK_DOWNLOAD:
+ {
+ DialogInterface.OnClickListener diOnClickListener = new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int id) {
+ // Check if we have the latest dictionary version.
+ try
+ {
+ final File myDicFile = getDictionaryFile();
+ if( myDicFile == null )
+ {
+ messHand.sendEmptyMessage(7);
+ }
+ else
+ {
+ removeDialog(DIALOG_ASK_DOWNLOAD);
+ showDialog(DIALOG_CHECK_DOWNLOAD_SERVER);
+ new Thread(new Runnable() {
+ public void run() {
+
+ // Comparing this version with the online version
+ try {
+ InputStream is = new FileInputStream(myDicFile);
+ URLConnection con = new URL(PUB_DIC_CFV).openConnection();
+ DataInputStream dis = new DataInputStream(con.getInputStream());
+ if(con.getContentLength() != 18)
+ throw new Exception();
+
+ dis.read(Preferences.cfvTable);
+
+ // Check our version
+ is.read(dicVersion);
+
+ int thisVersion, onlineVersion;
+ thisVersion = dicVersion[0] << 8 | dicVersion[1];
+ onlineVersion = cfvTable[0] << 8 | cfvTable[1];
+
+ if(thisVersion == onlineVersion)
+ {
+ // It is the latest version, but is it not corrupt?
+ if(checkDicMD5(myDicFile.getPath()))
+ {
+ // All is well
+ messHand.sendEmptyMessage(6);
+ return;
+ }
+ }
+ if(onlineVersion > thisVersion && onlineVersion > MAX_DIC_VERSION)
+ {
+ // Online version is too advanced
+ messHand.sendEmptyMessage(5);
+ return;
+ }
+ messHand.sendEmptyMessage(7);
+ return;
+
+ } catch ( FileNotFoundException e ){
+ messHand.sendEmptyMessage(7);
+ return;
+ } catch ( UnknownHostException e ){
+ messHand.sendEmptyMessage(10);
+ return;
+ }
+ catch (Exception e)
+ {
+ messHand.sendEmptyMessage(-1);
+ return;
+ }
+ }
+ }).start();
+ }
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ };
+ // Don't complain about dictionary size if user is on a wifi connection
+ if((((WifiManager) getBaseContext().getSystemService(Context.WIFI_SERVICE))).getConnectionInfo().getSSID() != null)
+ {
+ diOnClickListener.onClick(null, -1);
+ break;
+ }
+
+ builder.setTitle(R.string.pref_download);
+ builder.setMessage(R.string.msg_dicislarge);
+ builder.setCancelable(false);
+ builder.setPositiveButton(R.string.bt_yes, diOnClickListener);
+ builder.setNegativeButton(R.string.bt_no, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int id) {
+ removeDialog(DIALOG_ASK_DOWNLOAD);
+ }
+ });
+ break;
+ }
+ case DIALOG_UPDATE_NEEDED:
+ {
+ builder.setTitle(R.string.update_title)
+ .setMessage(getString(R.string.update_message,version))
+ .setNegativeButton(R.string.bt_close,new OnClickListener() {
+
+ public void onClick(DialogInterface dialog, int which) {
+ removeDialog(DIALOG_UPDATE_NEEDED);
+ }
+ })
+ .setPositiveButton(R.string.bt_website, new OnClickListener() {
+
+ public void onClick(DialogInterface dialog, int which) {
+ String url = "http://code.google.com/p/android-thomson-key-solver/downloads/list";
+ Intent i = new Intent(Intent.ACTION_VIEW);
+ i.setData(Uri.parse(url));
+ startActivity(i);
+ }
+ });
+ break;
+ }
+ case DIALOG_CHECK_DOWNLOAD_SERVER:
+ {
+ pbarDialog = new ProgressDialog(Preferences.this);
+ pbarDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
+ pbarDialog.setMessage(getString(R.string.msg_wait));
+ return pbarDialog;
+ }
+ case DIALOG_ERROR_TOO_ADVANCED:
+ {
+ builder.setTitle(R.string.msg_error)
+ .setMessage(R.string.msg_err_online_too_adv);
+ break;
+ }
+ case DIALOG_DOWNLOAD:
+ {
+ pbarDialog = new ProgressDialog(Preferences.this);
+ pbarDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
+ pbarDialog.setMessage(getString(R.string.msg_dl_estimating));
+ pbarDialog.setMax(100);
+ pbarDialog.setTitle(R.string.msg_dl_dlingdic);
+ pbarDialog.setCancelable(true);
+ pbarDialog.setOnDismissListener(new OnDismissListener() {
+ public void onDismiss(DialogInterface dialog) {
+ if ( downloader != null )
+ downloader.stopRequested = true;
+ }
+ });
+ pbarDialog.setButton(getString(R.string.bt_pause), new OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ if ( downloader != null )
+ downloader.stopRequested = true;
+ removeDialog(DIALOG_DOWNLOAD);
+ }
+ });
+ pbarDialog.setButton2(getString(R.string.bt_manual_cancel), new OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ if ( downloader != null )
+ {
+ downloader.deleteTemp = true;
+ downloader.stopRequested = true;
+ }
+ removeDialog(DIALOG_DOWNLOAD);
+ }
+ });
+ return pbarDialog;
+ }
+ case DIALOG_ERROR:
+ {
+ builder.setTitle(R.string.msg_error)
+ .setMessage(R.string.msg_err_unkown);
+ break;
+ }
+ case DIALOG_ERROR_NOMEMORYONSD:
+ {
+ builder.setTitle(R.string.msg_error)
+ .setMessage(R.string.msg_nomemoryonsdcard);
+ break;
+ }
+ case DIALOG_ERROR_NOSD:
+ {
+ builder.setTitle(R.string.msg_error)
+ .setMessage(R.string.msg_nosdcard);
+ break;
+ }
+ case DIALOG_CHECKING_DOWNLOAD:
+ {
+ pbarDialog = new ProgressDialog(Preferences.this);
+ pbarDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
+ pbarDialog.setMessage(getString(R.string.msg_wait));
+ return pbarDialog;
+ }
+ }
+ return builder.create();
+ }
+
+ private File getDictionaryFile() throws FileNotFoundException {
+ String folderSelect = PreferenceManager.getDefaultSharedPreferences(getBaseContext())
+ .getString(folderSelectPref,
+ Environment.getExternalStorageDirectory().getAbsolutePath())
+ ;
+ String firstName = folderSelect + File.separator + "RouterKeygen.dic";
+ String secondName = folderSelect + File.separator + "RKDictionary.dic";
+ try{
+ File dic = new File(firstName);
+ if ( dic.exists() )
+ return dic;
+ dic = new File(secondName);
+ if ( dic.exists() )
+ return dic;
+ } catch(SecurityException e ){
+ e.printStackTrace();
+ throw new FileNotFoundException("Permissions Error");
+ }
+ return null;
+ }
+};
+
+
diff --git a/android/src/org/exobel/routerkeygen/RouterKeygen.java b/android/src/org/exobel/routerkeygen/RouterKeygen.java
new file mode 100644
index 0000000..ca3c1a4
--- /dev/null
+++ b/android/src/org/exobel/routerkeygen/RouterKeygen.java
@@ -0,0 +1,699 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+
+package org.exobel.routerkeygen;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import org.exobel.routerkeygen.WifiNetwork.TYPE;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.ProgressDialog;
+import android.app.AlertDialog.Builder;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.SharedPreferences;
+import android.content.DialogInterface.OnCancelListener;
+import android.content.DialogInterface.OnClickListener;
+import android.net.wifi.WifiManager;
+import android.os.Bundle;
+import android.os.Environment;
+import android.os.Handler;
+import android.os.Message;
+import android.preference.PreferenceManager;
+import android.provider.Settings;
+import android.text.ClipboardManager;
+import android.text.Editable;
+import android.text.InputFilter;
+import android.text.Spanned;
+import android.text.TextWatcher;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.AutoCompleteTextView;
+import android.widget.EditText;
+import android.widget.ListView;
+import android.widget.TextView;
+import android.widget.Toast;
+import android.widget.AdapterView.OnItemClickListener;
+import java.lang.Runnable;
+@SuppressWarnings("deprecation")
+public class RouterKeygen extends Activity {
+
+ WifiManager wifi;
+ boolean wifi_state;
+ ListView scanResuls;
+ KeygenThread calculator;
+ ArrayList list_key = null;
+ BroadcastReceiver scanFinished;
+ BroadcastReceiver stateChanged;
+ ArrayList vulnerable;
+ WifiNetwork router;
+ long begin;
+ static final String TAG = "RouterKeygen";
+ static final String welcomeScreenShownPref = "welcomeScreenShown";
+
+ /** Called when the activity is first created. */
+ @SuppressWarnings("unchecked")
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.main);
+ wifi = (WifiManager) getBaseContext().getSystemService(Context.WIFI_SERVICE);
+ wifi_state = wifi.getWifiState() == WifiManager.WIFI_STATE_ENABLED ||
+ wifi.getWifiState() == WifiManager.WIFI_STATE_ENABLING;
+ SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(this);
+ Boolean welcomeScreenShown = mPrefs.getBoolean( welcomeScreenShownPref, false);
+
+ if (!welcomeScreenShown) {
+
+ String whatsNewTitle = getString(R.string.msg_welcome_title);
+ String whatsNewText = getString(R.string.msg_welcome_text);
+ new AlertDialog.Builder(this).setIcon(android.R.drawable.ic_dialog_alert).setTitle(whatsNewTitle).setMessage(whatsNewText).setPositiveButton(
+ R.string.bt_ok, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ dialog.dismiss();
+ }
+ }).show();
+ SharedPreferences.Editor editor = mPrefs.edit();
+ editor.putBoolean(welcomeScreenShownPref, true);
+ editor.commit();
+ }
+
+
+ scanResuls = (ListView) findViewById(R.id.ListWifi);
+ scanResuls.setOnItemClickListener(new OnItemClickListener() {
+ public void onItemClick(AdapterView> parent, View view,
+ int position, long id) {
+ router = vulnerable.get(position);
+ if (router.newThomson)
+ {
+ Toast.makeText( RouterKeygen.this , getString(R.string.msg_newthomson) ,
+ Toast.LENGTH_SHORT).show();
+ return;
+ }
+ calcKeys(router);
+ }
+ });
+ stateChanged = new WifiStateReceiver(wifi);
+ scanFinished = new WiFiScanReceiver(this);
+ if ( savedInstanceState == null )
+ return;
+ Boolean warning = (Boolean)savedInstanceState.getSerializable("warning");
+ if ( warning != null )
+ {
+ removeDialog(DIALOG_NATIVE_CALC);
+ if ( calculator != null )
+ calculator.stopRequested = true;
+ }
+ ArrayList list_networks =(ArrayList) savedInstanceState.getSerializable("networks");
+ if ( list_networks != null )
+ {
+ vulnerable = list_networks;
+ scanResuls.setAdapter(new WifiListAdapter(vulnerable, this));
+ }
+ WifiNetwork r = (WifiNetwork) savedInstanceState.getSerializable("router");
+ if ( r != null )
+ {
+ router = r;
+ }
+ else
+ router = new WifiNetwork("","",0,"",this);
+ ArrayList list_k = (ArrayList) savedInstanceState.getSerializable("keys");
+ if ( list_k != null )
+ {
+ list_key = list_k;
+ }
+ }
+
+ protected void onSaveInstanceState (Bundle outState){
+ try {
+ if ( calculator instanceof NativeThomson )
+ {
+ outState.putSerializable("warning", true);
+ }
+ outState.putSerializable("router", router);
+ outState.putSerializable("keys", list_key );
+ outState.putSerializable("networks", vulnerable );
+ }
+ catch(Exception e){}
+ }
+
+
+ public void onStart() {
+ try{
+ super.onStart();
+ getPrefs();
+ if ( wifiOn )
+ {
+ if ( !wifi.setWifiEnabled(true))
+ Toast.makeText( RouterKeygen.this , getString(R.string.msg_wifibroken),
+ Toast.LENGTH_SHORT).show();
+ else
+ wifi_state = true;
+ }
+ scan();
+ }
+ catch (Exception e) {}
+ }
+
+ public void onStop() {
+ try{
+ super.onStop();
+ unregisterReceiver(scanFinished);
+ unregisterReceiver(stateChanged);
+ removeDialog(DIALOG_KEY_LIST);
+ removeDialog(DIALOG_MANUAL_CALC);
+ }
+ catch (Exception e) {}
+ }
+ ProgressDialog progressDialog;
+ private static final int DIALOG_THOMSON3G = 0;
+ private static final int DIALOG_KEY_LIST = 1;
+ private static final int DIALOG_MANUAL_CALC = 2;
+ private static final int DIALOG_NATIVE_CALC = 3;
+ private static final int DIALOG_AUTO_CONNECT = 4;
+ protected Dialog onCreateDialog(int id ) {
+ switch (id) {
+ case DIALOG_THOMSON3G: {
+ progressDialog = new ProgressDialog(RouterKeygen.this);
+ progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
+ progressDialog.setTitle(getString(R.string.dialog_thomson3g));
+ progressDialog.setMessage(getString(R.string.dialog_thomson3g_msg));
+ progressDialog.setCancelable(false);
+ progressDialog.setProgress(0);
+ progressDialog.setButton(getString(R.string.bt_manual_cancel),
+ new DialogInterface.OnClickListener(){
+ public void onClick(DialogInterface dialog, int which) {
+ if ( RouterKeygen.this.calculator != null )
+ RouterKeygen.this.calculator.stopRequested = true;
+ removeDialog(DIALOG_THOMSON3G);
+ }
+ });
+ progressDialog.setIndeterminate(false);
+ return progressDialog;
+ }
+ case DIALOG_KEY_LIST: {
+ AlertDialog.Builder builder = new Builder(this);
+ builder.setTitle(router.ssid);
+ LayoutInflater inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE);
+ View layout = inflater.inflate(R.layout.results,
+ (ViewGroup) findViewById(R.id.layout_root));
+ ListView list = (ListView) layout.findViewById(R.id.list_keys);
+ list.setOnItemClickListener(new OnItemClickListener() {
+ public void onItemClick(AdapterView> parent, View view,
+ int position, long id) {
+ String key = ((TextView)view).getText().toString();
+ Toast.makeText(getApplicationContext(), key + " "
+ + getString(R.string.msg_copied),
+ Toast.LENGTH_SHORT).show();
+ ClipboardManager clipboard =
+ (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
+
+ clipboard.setText(key);
+ startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS));
+ }
+ });
+
+ list.setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, list_key));
+ /*
+ * TODO: Auto connect
+ * Still not working as wished though it works +-.
+
+ builder.setPositiveButton(RouterKeygen.this.getResources().getString(R.string.bt_connect),
+ new OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ wifi.disconnect();
+ AutoConnectManager auto = new AutoConnectManager(wifi, list_key ,
+ router , RouterKeygen.this , handler);
+ auto.activate();
+ registerReceiver( auto, new IntentFilter(
+ WifiManager.NETWORK_STATE_CHANGED_ACTION));showDialog(DIALOG_AUTO_CONNECT);
+ }
+ });*/
+ builder.setNeutralButton(RouterKeygen.this.getResources().getString(R.string.bt_share),
+ new OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ try
+ {
+ Intent i = new Intent(Intent.ACTION_SEND);
+ i.setType("text/plain");
+ i.putExtra(Intent.EXTRA_SUBJECT, router.ssid + getString(R.string.share_msg_begin));
+ Iterator it = list_key.iterator();
+ String message = router.ssid + getString(R.string.share_msg_begin) + ":\n";
+ while ( it.hasNext() )
+ message += it.next() + "\n";
+
+ i.putExtra(Intent.EXTRA_TEXT, message);
+ message = getString(R.string.share_title);
+ startActivity(Intent.createChooser(i, message));
+ }
+ catch(Exception e)
+ {
+ Toast.makeText( RouterKeygen.this , getString(R.string.msg_err_sendto) ,
+ Toast.LENGTH_SHORT).show();
+ return;
+ }
+ }
+ });
+ builder.setNegativeButton(getString(R.string.bt_save_sd), new OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ removeDialog(DIALOG_MANUAL_CALC);
+ if ( !Environment.getExternalStorageState().equals("mounted") &&
+ !Environment.getExternalStorageState().equals("mounted_ro") )
+ {
+ Toast.makeText( RouterKeygen.this , getString(R.string.msg_nosdcard),
+ Toast.LENGTH_SHORT).show();
+ return ;
+ }
+ try {
+ BufferedWriter out = new BufferedWriter(
+ new FileWriter(folderSelect + File.separator + router.ssid + ".txt"));
+ out.write(router.ssid + " KEYS");
+ out.newLine();
+ for ( String s : list_key )
+ {
+ out.write(s);
+ out.newLine();
+ }
+ out.close();
+ }
+ catch (IOException e)
+ {
+ Toast.makeText( RouterKeygen.this , getString(R.string.msg_err_saving_key_file),
+ Toast.LENGTH_SHORT).show();
+ return ;
+ }
+ Toast.makeText( RouterKeygen.this , router.ssid + ".txt " + getString(R.string.msg_saved_key_file),
+ Toast.LENGTH_SHORT).show();
+ }
+ });
+
+ builder.setView(layout);
+ return builder.create();
+ }
+ case DIALOG_MANUAL_CALC: {
+ AlertDialog.Builder builder = new Builder(this);
+ final LayoutInflater inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE);
+ final View layout = inflater.inflate(R.layout.manual_input,
+ (ViewGroup) findViewById(R.id.manual_root));
+ builder.setTitle(getString(R.string.menu_manual));
+ /*Need to do this to renew the dialog to show the MAC input*/
+ builder.setOnCancelListener(new OnCancelListener() {
+ public void onCancel(DialogInterface dialog) {
+ removeDialog(DIALOG_MANUAL_CALC);
+ }
+ });
+ String[] routers = getResources().getStringArray(R.array.supported_routers);
+ ArrayAdapter adapter = new ArrayAdapter(this,
+ android.R.layout.simple_dropdown_item_1line, routers);
+ final AutoCompleteTextView edit = (AutoCompleteTextView) layout.findViewById(R.id.manual_autotext);
+ edit.setAdapter(adapter);
+ edit.setThreshold(1);
+ InputFilter filterMAC = new InputFilter() {
+ public CharSequence filter(CharSequence source, int start, int end,
+ Spanned dest, int dstart, int dend) {
+ for (int i = start; i < end; i++) {
+ if (!Character.isLetterOrDigit(source.charAt(i)) &&
+ source.charAt(i) != '-' && source.charAt(i) != '_' && source.charAt(i) != ' ') {
+ return "";
+ }
+ }
+ return null;
+ }
+ };
+ edit.setFilters(new InputFilter[]{ filterMAC});
+ if ( manualMac )
+ {
+ layout.findViewById(R.id.manual_mac_root).setVisibility(View.VISIBLE);
+ edit.setImeOptions(EditorInfo.IME_ACTION_NEXT);
+ final EditText macs[] = new EditText[6];
+ macs[0] = (EditText) layout.findViewById(R.id.input_mac_pair1);
+ macs[1] = (EditText) layout.findViewById(R.id.input_mac_pair2);
+ macs[2] = (EditText) layout.findViewById(R.id.input_mac_pair3);
+ macs[3] = (EditText) layout.findViewById(R.id.input_mac_pair4);
+ macs[4] = (EditText) layout.findViewById(R.id.input_mac_pair5);
+ macs[5] = (EditText) layout.findViewById(R.id.input_mac_pair6);
+ final InputFilter maxSize = new InputFilter.LengthFilter(2);
+ InputFilter filterMac = new InputFilter() {
+ public CharSequence filter(CharSequence source, int start, int end,
+ Spanned dest, int dstart, int dend) {
+ try{/*TODO:Lazy mode programming, improve in the future*/
+ Integer.parseInt((String) source , 16);
+ }
+ catch( Exception e){
+ return "";
+ }
+ return null;
+ }
+ };
+ for(final EditText mac : macs)
+ {
+ mac.setFilters(new InputFilter[]{filterMac , maxSize});
+ mac.addTextChangedListener(new TextWatcher() {
+ public void onTextChanged(CharSequence s, int start, int before, int count) {}
+
+ public void beforeTextChanged(CharSequence s, int start, int count,int after) {}
+
+ public void afterTextChanged(Editable e) {
+ if(e.length() != 2)
+ return;
+
+ for(int i = 0; i < 6; ++i)
+ {
+ if(macs[i].getText().length() != 0)
+ continue;
+
+ macs[i].requestFocus();
+ return;
+ }
+ }
+ });
+ }
+ }
+ builder.setNeutralButton(getString(R.string.bt_manual_calc), new OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ String ssid = edit.getText().toString().trim();
+ String mac = "";
+ if ( manualMac )
+ {
+ EditText mac1 = (EditText) layout.findViewById(R.id.input_mac_pair1);
+ EditText mac2 = (EditText) layout.findViewById(R.id.input_mac_pair2);
+ EditText mac3 = (EditText) layout.findViewById(R.id.input_mac_pair3);
+ EditText mac4 = (EditText) layout.findViewById(R.id.input_mac_pair4);
+ EditText mac5 = (EditText) layout.findViewById(R.id.input_mac_pair5);
+ EditText mac6 = (EditText) layout.findViewById(R.id.input_mac_pair6);
+ mac= mac1.getText().toString()+':'+mac2.getText().toString()+':'+
+ mac3.getText().toString()+':'+mac4.getText().toString()+':'+
+ mac5.getText().toString()+':'+mac6.getText().toString();
+ if ( mac.length() < 17 )
+ mac = "";
+ }
+ if ( ssid.equals("") )
+ return;
+ begin = System.currentTimeMillis();
+ router = new WifiNetwork(ssid, mac , 0 ,"" , RouterKeygen.this);
+ calcKeys(router);
+ InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
+ imm.hideSoftInputFromWindow(edit.getWindowToken(), 0);
+ }
+ });
+ builder.setNegativeButton(getString(R.string.bt_manual_cancel), new OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ removeDialog(DIALOG_MANUAL_CALC);
+ }
+ });
+
+ builder.setView(layout);
+ return builder.create();
+ }
+ case DIALOG_NATIVE_CALC: {
+ progressDialog = new ProgressDialog(RouterKeygen.this);
+ progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
+ progressDialog.setTitle(RouterKeygen.this.getResources().getString(R.string.dialog_nativecalc));
+ progressDialog.setMessage(RouterKeygen.this.getResources().getString(R.string.dialog_nativecalc_msg));
+ progressDialog.setCancelable(false);
+ progressDialog.setProgress(0);
+ progressDialog.setButton(RouterKeygen.this.getResources().getString(R.string.bt_manual_cancel),
+ new DialogInterface.OnClickListener(){
+ public void onClick(DialogInterface dialog, int which) {
+ if ( RouterKeygen.this.calculator != null )
+ RouterKeygen.this.calculator.stopRequested = true;
+ removeDialog(DIALOG_THOMSON3G);
+ }
+ });
+ progressDialog.setIndeterminate(false);
+ return progressDialog;
+ }
+ case DIALOG_AUTO_CONNECT:
+ {
+ progressDialog = new ProgressDialog(RouterKeygen.this);
+ progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
+ progressDialog.setMessage("Connecting");
+ progressDialog.setMax(list_key.size() + 1);
+ progressDialog.setTitle(R.string.msg_dl_dlingdic);
+ progressDialog.setCancelable(false);
+ progressDialog.setButton(getString(R.string.bt_close), new OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ removeDialog(DIALOG_AUTO_CONNECT);
+ }
+ });
+ return progressDialog;
+ }
+ }
+ return null;
+ }
+
+
+ public boolean onCreateOptionsMenu(Menu menu) {
+
+ getMenuInflater().inflate(R.menu.wifi, menu);
+ return true;
+ }
+
+ public void scan(){
+ registerReceiver(scanFinished, new IntentFilter(
+ WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
+ if ( !wifi_state && !wifiOn )
+ {
+ Toast.makeText( RouterKeygen.this ,
+ RouterKeygen.this.getResources().getString(R.string.msg_nowifi),
+ Toast.LENGTH_SHORT).show();
+ return;
+ }
+ if ( wifi.getWifiState() == WifiManager.WIFI_STATE_ENABLING )
+ {
+ registerReceiver(stateChanged, new IntentFilter(
+ WifiManager.WIFI_STATE_CHANGED_ACTION));
+ Toast.makeText( RouterKeygen.this ,
+ RouterKeygen.this.getResources().getString(R.string.msg_wifienabling),
+ Toast.LENGTH_SHORT).show();
+ }
+ else{
+ Thread run = new Thread (new Runnable() {
+
+ public void run() {
+ if ( wifi.startScan() )
+ handler.sendMessage(Message.obtain(handler, KeygenThread.ERROR_MSG ,
+ getResources().getString(R.string.msg_scanstarted)));
+ else
+ handler.sendMessage(Message.obtain(handler, KeygenThread.ERROR_MSG ,
+ getResources().getString(R.string.msg_scanfailed)));
+ }
+ });
+ run.start();
+ }
+ }
+
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case R.id.wifi_scan:
+ scan();
+ return true;
+ case R.id.manual_input:
+ showDialog(DIALOG_MANUAL_CALC);
+ return true;
+ case R.id.pref:
+ startActivity( new Intent(this , Preferences.class ));
+ return true;
+ default:
+ return super.onOptionsItemSelected(item);
+ }
+ }
+
+ private void calcKeys(WifiNetwork wifi){
+ if ( !wifi.supported )
+ {
+ Toast.makeText( RouterKeygen.this ,
+ RouterKeygen.this.getResources().getString(R.string.msg_unspported),
+ Toast.LENGTH_SHORT).show();
+ return;
+ }
+ try {
+ switch( wifi.type )
+ {
+ case THOMSON: RouterKeygen.this.calculator =
+ new ThomsonKeygen(handler,getResources(), folderSelect , thomson3g);
+ break;
+ case DISCUS: RouterKeygen.this.calculator =
+ new DiscusKeygen(handler,getResources());
+ break;
+ case EIRCOM: RouterKeygen.this.calculator =
+ new EircomKeygen(handler,getResources());
+ break;
+ case DLINK: RouterKeygen.this.calculator =
+ new DlinkKeygen(handler,getResources());
+ break;
+ case VERIZON: RouterKeygen.this.calculator =
+ new VerizonKeygen(handler,getResources());
+ break;
+ case PIRELLI: RouterKeygen.this.calculator =
+ new PirelliKeygen(handler,getResources());
+ break;
+ case TELSEY: RouterKeygen.this.calculator =
+ new TelseyKeygen(handler,getResources());
+ break;
+ case ALICE: RouterKeygen.this.calculator =
+ new AliceKeygen(handler,getResources());
+ break;
+ case WLAN4: RouterKeygen.this.calculator =
+ new Wlan4Keygen(handler,getResources());
+ break;
+ case HUAWEI: RouterKeygen.this.calculator =
+ new HuaweiKeygen(handler,getResources());
+ break;
+ case WLAN2: RouterKeygen.this.calculator =
+ new Wlan2Keygen(handler,getResources());
+ break;
+ case ONO_WEP: RouterKeygen.this.calculator =
+ new OnoKeygen(handler,getResources());
+ break;
+ case SKY_V1: RouterKeygen.this.calculator =
+ new SkyV1Keygen(handler,getResources());
+ break;
+ case WLAN6: RouterKeygen.this.calculator =
+ new Wlan6Keygen(handler,getResources());
+ break;
+ case TECOM: RouterKeygen.this.calculator =
+ new TecomKeygen(handler,getResources());
+ break;
+ case INFOSTRADA: RouterKeygen.this.calculator =
+ new InfostradaKeygen(handler,getResources());
+ break;
+ }
+ }catch(LinkageError e){
+ Toast.makeText( RouterKeygen.this ,
+ RouterKeygen.this.getResources().getString(R.string.err_misbuilt_apk),
+ Toast.LENGTH_SHORT).show();
+ return;
+ }
+
+ RouterKeygen.this.calculator.router = wifi;
+ RouterKeygen.this.calculator.setPriority(Thread.MAX_PRIORITY);
+ begin = System.currentTimeMillis();//debugging
+ RouterKeygen.this.calculator.start();
+ removeDialog(DIALOG_KEY_LIST);
+ removeDialog(DIALOG_MANUAL_CALC);
+ if ( wifi.type == TYPE.THOMSON && thomson3g )
+ showDialog(DIALOG_THOMSON3G);
+ removeDialog(DIALOG_KEY_LIST);
+ }
+
+ boolean wifiOn;
+ boolean thomson3g;
+ boolean nativeCalc;
+ boolean manualMac;
+ String folderSelect;
+ final String folderSelectPref = "folderSelect";
+ final String wifiOnPref = "wifion";
+ final String thomson3gPref = "thomson3g";
+ final String nativeCalcPref = "nativethomson";
+ final String manualMacPref = "manual_mac";
+
+ private void getPrefs() {
+ SharedPreferences prefs = PreferenceManager
+ .getDefaultSharedPreferences(getBaseContext());
+ wifiOn = prefs.getBoolean(wifiOnPref , true);
+ thomson3g = prefs.getBoolean(thomson3gPref, false);
+ nativeCalc = prefs.getBoolean(nativeCalcPref, true);
+ manualMac = prefs.getBoolean(manualMacPref, false);
+ folderSelect = prefs.getString(folderSelectPref,
+ Environment.getExternalStorageDirectory().getAbsolutePath());
+ }
+
+ Handler handler = new Handler() {
+ public void handleMessage(Message msg) {
+ if ( thomson3g)
+ removeDialog(DIALOG_THOMSON3G);
+ if ( nativeCalc )
+ removeDialog(DIALOG_NATIVE_CALC);
+ if ( msg.what == KeygenThread.RESULTS_READY ) /*Got Keys*/
+ {
+ begin = System.currentTimeMillis()-begin;
+ list_key = RouterKeygen.this.calculator.getResults();
+ Log.d(TAG, "Time to solve:" + begin);
+ if (!isFinishing())
+ showDialog(DIALOG_KEY_LIST);
+ return;
+ }
+ if ( msg.what == KeygenThread.ERROR_MSG )
+ {
+ if ( nativeCalc && ( calculator instanceof ThomsonKeygen ) )
+ {
+ if ( ((ThomsonKeygen)calculator).errorDict )
+ {
+ Toast.makeText( RouterKeygen.this , getString(R.string.msg_startingnativecalc) ,
+ Toast.LENGTH_SHORT).show();
+
+ WifiNetwork tmp = RouterKeygen.this.calculator.router;
+ try{
+ RouterKeygen.this.calculator = new NativeThomson(this ,RouterKeygen.this.getResources() );
+ }catch(LinkageError e){
+ Toast.makeText( RouterKeygen.this ,getString(R.string.err_misbuilt_apk),
+ Toast.LENGTH_SHORT).show();
+ return;
+ }
+ if (isFinishing())
+ return;
+ RouterKeygen.this.calculator.router = tmp;
+ RouterKeygen.this.calculator.setPriority(Thread.MAX_PRIORITY);
+ RouterKeygen.this.calculator.start();
+ showDialog(DIALOG_NATIVE_CALC);
+ return;
+ }
+
+ }
+ if (!isFinishing())
+ Toast.makeText( RouterKeygen.this , msg.obj.toString() , Toast.LENGTH_SHORT).show();
+ return;
+ }
+ if ( msg.what == 2 )
+ {
+ progressDialog.setProgress(progressDialog.getProgress() +1);
+ return;
+ }
+ if ( msg.what == 3 )
+ {
+ removeDialog(DIALOG_AUTO_CONNECT);
+ if (!isFinishing())
+ Toast.makeText( RouterKeygen.this ,msg.obj.toString() , Toast.LENGTH_SHORT).show();
+ return;
+ }
+ }
+
+ };
+
+}
diff --git a/android/src/org/exobel/routerkeygen/SkyV1Keygen.java b/android/src/org/exobel/routerkeygen/SkyV1Keygen.java
new file mode 100644
index 0000000..dc21c09
--- /dev/null
+++ b/android/src/org/exobel/routerkeygen/SkyV1Keygen.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+package org.exobel.routerkeygen;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+import android.content.res.Resources;
+import android.os.Handler;
+import android.os.Message;
+
+
+/*
+ * This is the algorithm to generate the WPA passphrase
+ * for the SKYv1.
+ * Generate the md5 hash form the mac.
+ * Use the numbers in the following positions on the hash.
+ * Position 3,7,11,15,19,23,27,31 ,
+ * Use theses numbers, modulus 26, to find the correct letter
+ * and append to the key.
+ */
+public class SkyV1Keygen extends KeygenThread{
+
+ public SkyV1Keygen(Handler h, Resources res) {
+ super(h, res);
+ }
+
+ final static String ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+
+ public void run(){
+ if ( router == null)
+ return;
+ if ( router.getMac().length() != 12 )
+ {
+ handler.sendMessage(Message.obtain(handler, ERROR_MSG ,
+ resources.getString(R.string.msg_nomac)));
+ return;
+ }
+ try {
+ md = MessageDigest.getInstance("MD5");
+ } catch (NoSuchAlgorithmException e1) {
+ handler.sendMessage(Message.obtain(handler, ERROR_MSG ,
+ resources.getString(R.string.msg_nomd5)));
+ return;
+ }
+ md.reset();
+ md.update(router.getMac().getBytes());
+ byte [] hash = md.digest();
+ String key ="";
+ for ( int i = 1 ; i <= 15 ; i += 2 )
+ {
+ int index = hash[i] & 0xFF;
+ index %= 26;
+ key += ALPHABET.substring(index,index+1 );
+ }
+
+ pwList.add(key);
+ handler.sendEmptyMessage(RESULTS_READY);
+ return;
+ }
+}
diff --git a/android/src/org/exobel/routerkeygen/StringUtils.java b/android/src/org/exobel/routerkeygen/StringUtils.java
new file mode 100644
index 0000000..ca28bd3
--- /dev/null
+++ b/android/src/org/exobel/routerkeygen/StringUtils.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+package org.exobel.routerkeygen;
+import java.io.UnsupportedEncodingException;
+
+public class StringUtils {
+
+ static public String dectoString( int mac){
+ String ret = "";
+ while ( mac > 0 ){
+ switch (mac %10){
+ case 0: ret = "Zero" + ret;
+ break;
+ case 1: ret = "One" + ret;
+ break;
+ case 2: ret = "Two" + ret;
+ break;
+ case 3: ret = "Three" + ret;
+ break;
+ case 4: ret = "Four" + ret;
+ break;
+ case 5: ret = "Five" + ret ;
+ break;
+ case 6: ret = "Six" + ret;
+ break;
+ case 7: ret = "Seven" + ret;
+ break;
+ case 8: ret = "Eight" + ret;
+ break;
+ case 9: ret = "Nine" + ret;
+ break;
+ }
+ mac /=10;
+ }
+ return ret;
+ }
+
+
+ static final byte[] HEX_CHAR_TABLE = {
+ (byte)'0', (byte)'1', (byte)'2', (byte)'3',
+ (byte)'4', (byte)'5', (byte)'6', (byte)'7',
+ (byte)'8', (byte)'9', (byte)'a', (byte)'b',
+ (byte)'c', (byte)'d', (byte)'e', (byte)'f'
+ };
+
+ public static String getHexString(byte[] raw)
+ throws UnsupportedEncodingException
+ {
+ byte[] hex = new byte[2 * raw.length];
+ int index = 0;
+
+ for (byte b : raw) {
+ int v = b & 0xFF;
+ hex[index++] = HEX_CHAR_TABLE[v >>> 4];
+ hex[index++] = HEX_CHAR_TABLE[v & 0xF];
+ }
+ return new String(hex, "ASCII");
+ }
+ public static String getHexString(short[] raw)
+ throws UnsupportedEncodingException
+ {
+ byte[] hex = new byte[2 * raw.length];
+ int index = 0;
+
+ for (short b : raw) {
+ int v = b & 0xFF;
+ hex[index++] = HEX_CHAR_TABLE[v >>> 4];
+ hex[index++] = HEX_CHAR_TABLE[v & 0xF];
+ }
+ return new String(hex, "ASCII");
+ }
+ public static String getHexString(short raw) {
+ byte[] hex = new byte[2];
+ int v = raw & 0xFF;
+ hex[0] = HEX_CHAR_TABLE[v >>> 4];
+ hex[1] = HEX_CHAR_TABLE[v & 0xF];
+ try {
+ return new String(hex, "ASCII");
+ } catch (UnsupportedEncodingException e) {}
+ return "";
+ }
+}
\ No newline at end of file
diff --git a/android/src/org/exobel/routerkeygen/TecomKeygen.java b/android/src/org/exobel/routerkeygen/TecomKeygen.java
new file mode 100644
index 0000000..e43a50b
--- /dev/null
+++ b/android/src/org/exobel/routerkeygen/TecomKeygen.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+package org.exobel.routerkeygen;
+
+import java.io.UnsupportedEncodingException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import android.content.res.Resources;
+import android.os.Handler;
+import android.os.Message;
+
+/*
+ * This is the algorithm to generate the WPA passphrase
+ * for the Hitachi (TECOM) AH-4021 and Hitachi (TECOM) AH-4222.
+ * The key is the 26 first characters from the SSID SHA1 hash.
+ * Link : http://rafale.org/~mattoufoutu/ebooks/Rafale-Mag/Rafale12/Rafale12.08.HTML
+ */
+public class TecomKeygen extends KeygenThread {
+
+ public TecomKeygen(Handler h, Resources res) {
+ super(h, res);
+ }
+
+
+ public void run(){
+ if ( router == null)
+ return;
+ try {
+ md = MessageDigest.getInstance("SHA1");
+ } catch (NoSuchAlgorithmException e1) {
+ handler.sendMessage(Message.obtain(handler, ERROR_MSG ,
+ resources.getString(R.string.msg_nosha1)));
+ return;
+ }
+ md.reset();
+ md.update(router.ssid.getBytes());
+ byte [] hash = md.digest();
+ try {
+ pwList.add(StringUtils.getHexString(hash).substring(0,26));
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ }
+ handler.sendEmptyMessage(RESULTS_READY);
+ return;
+ }
+}
diff --git a/android/src/org/exobel/routerkeygen/TelseyKeygen.java b/android/src/org/exobel/routerkeygen/TelseyKeygen.java
new file mode 100644
index 0000000..34dd913
--- /dev/null
+++ b/android/src/org/exobel/routerkeygen/TelseyKeygen.java
@@ -0,0 +1,237 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+package org.exobel.routerkeygen;
+
+import android.content.res.Resources;
+import android.os.Handler;
+import android.os.Message;
+
+/*
+ * The algorithm for the FASTWEB Telsey
+ * SSID of the form:
+ * FASTWEB-1-002196XXXXXX
+ * FASTWEB-1-00036FXXXXXX
+ * where X is a hexadecimal digit.
+ * Algorithm:
+ * Get the mac as an array of bytes and scramble them
+ * as the mentioned on the link.
+ * Use the hashword from Bob Jenkins to compute recursively
+ * a hash from the array calculated above.
+ * Save the resulting hash as a hexadecimal string.
+ * Produce a second vector with the rules specified below
+ * Use the hashword from Bob Jenkins to compute recursively
+ * a hash from the array calculated above.
+ * Save the resulting hash as a hexadecimal string.
+ * The key will be the final 5 characters of the first string
+ * and first 5 from the second string.
+ * Credit:
+ * http://www.pcpedia.it/Hacking/algoritmi-di-generazione-wpa-alice-e-fastweb-e-lavidita-del-sapere.html
+ * http://wifiresearchers.wordpress.com/2010/09/09/telsey-fastweb-full-disclosure/
+ */
+public class TelseyKeygen extends KeygenThread {
+
+ public TelseyKeygen(Handler h, Resources res) {
+ super(h, res);
+ }
+
+ //Scramble Function
+ long[] scrambler(String mac){
+ long[]vector = new long [64];
+ byte [] macValue = new byte[6];
+ for (int i = 0; i < 12; i += 2)
+ macValue[i / 2] = (byte) ((Character.digit(mac.charAt(i), 16) << 4)
+ + Character.digit(mac.charAt(i + 1), 16));
+
+ vector[0] =0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[5] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
+ ( ( 0xFF & macValue[0] ) << 8 )|( 0xFF & macValue[5] ) ));
+ vector[1] =0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[1] ) << 24 )|( ( 0xFF & macValue[0] ) << 16 ) |
+ ( ( 0xFF & macValue[1] ) << 8 )|( 0xFF & macValue[5] ) ));
+ vector[2] =0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[4] ) << 24 )|( ( 0xFF & macValue[2] ) << 16 ) |
+ ( ( 0xFF & macValue[3] ) << 8 )|( 0xFF & macValue[2] ) ));
+ vector[3] =0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[4] ) << 24 )|( ( 0xFF & macValue[3] ) << 16 ) |
+ ( ( 0xFF & macValue[2] ) << 8 )|( 0xFF & macValue[2] ) ));
+ vector[4] =0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[2] ) << 24 )|( ( 0xFF & macValue[4] ) << 16 ) |
+ ( ( 0xFF & macValue[2] ) << 8 )|( 0xFF & macValue[0] ) ));
+ vector[5] =0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[2] ) << 24 )|( ( 0xFF & macValue[5] ) << 16 ) |
+ ( ( 0xFF & macValue[3] ) << 8 )|( 0xFF & macValue[1] ) ));
+ vector[6] =0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[0] ) << 24 )|( ( 0xFF & macValue[4] ) << 16 ) |
+ ( ( 0xFF & macValue[0] ) << 8 )|( 0xFF & macValue[1] ) ));
+ vector[7] =0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[1] ) << 24 )|( ( 0xFF & macValue[4] ) << 16 ) |
+ ( ( 0xFF & macValue[1] ) << 8 )|( 0xFF & macValue[0] ) ));
+ vector[8] =0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[2] ) << 24 )|( ( 0xFF & macValue[4] ) << 16 ) |
+ ( ( 0xFF & macValue[2] ) << 8 )|( 0xFF & macValue[2] ) ));
+ vector[9] =0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[3] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
+ ( ( 0xFF & macValue[3] ) << 8 )|( 0xFF & macValue[4] ) ));
+ vector[10]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[4] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
+ ( ( 0xFF & macValue[4] ) << 8 )|( 0xFF & macValue[3] ) ));
+ vector[11]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[5] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
+ ( ( 0xFF & macValue[5] ) << 8 )|( 0xFF & macValue[5] ) ));
+ vector[12]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[2] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
+ ( ( 0xFF & macValue[0] ) << 8 )|( 0xFF & macValue[5] ) ));
+ vector[13]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[1] ) << 24 )|( ( 0xFF & macValue[0] ) << 16 ) |
+ ( ( 0xFF & macValue[1] ) << 8 )|( 0xFF & macValue[1] ) ));
+ vector[14]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[4] ) << 24 )|( ( 0xFF & macValue[2] ) << 16 ) |
+ ( ( 0xFF & macValue[1] ) << 8 )|( 0xFF & macValue[3] ) ));
+ vector[15]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[3] ) << 24 )|( ( 0xFF & macValue[3] ) << 16 ) |
+ ( ( 0xFF & macValue[5] ) << 8 )|( 0xFF & macValue[2] ) ));
+ vector[16]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[4] ) << 24 )|( ( 0xFF & macValue[4] ) << 16 ) |
+ ( ( 0xFF & macValue[5] ) << 8 )|( 0xFF & macValue[4] ) ));
+ vector[17]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[5] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
+ ( ( 0xFF & macValue[4] ) << 8 )|( 0xFF & macValue[0] ) ));
+ vector[18]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[2] ) << 24 )|( ( 0xFF & macValue[5] ) << 16 ) |
+ ( ( 0xFF & macValue[0] ) << 8 )|( 0xFF & macValue[5] ) ));
+ vector[19]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[2] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
+ ( ( 0xFF & macValue[3] ) << 8 )|( 0xFF & macValue[5] ) ));
+ vector[20]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[5] ) << 24 )|( ( 0xFF & macValue[2] ) << 16 ) |
+ ( ( 0xFF & macValue[2] ) << 8 )|( 0xFF & macValue[4] ) ));
+ vector[21]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[2] ) << 24 )|( ( 0xFF & macValue[3] ) << 16 ) |
+ ( ( 0xFF & macValue[1] ) << 8 )|( 0xFF & macValue[4] ) ));
+ vector[22]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[0] ) << 24 )|( ( 0xFF & macValue[4] ) << 16 ) |
+ ( ( 0xFF & macValue[4] ) << 8 )|( 0xFF & macValue[3] ) ));
+ vector[23]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[3] ) << 24 )|( ( 0xFF & macValue[0] ) << 16 ) |
+ ( ( 0xFF & macValue[5] ) << 8 )|( 0xFF & macValue[3] ) ));
+ vector[24]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[4] ) << 24 )|( ( 0xFF & macValue[3] ) << 16 ) |
+ ( ( 0xFF & macValue[0] ) << 8 )|( 0xFF & macValue[0] ) ));
+ vector[25]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[3] ) << 24 )|( ( 0xFF & macValue[2] ) << 16 ) |
+ ( ( 0xFF & macValue[1] ) << 8 )|( 0xFF & macValue[1] ) ));
+ vector[26]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[2] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
+ ( ( 0xFF & macValue[2] ) << 8 )|( 0xFF & macValue[5] ) ));
+ vector[27]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[1] ) << 24 )|( ( 0xFF & macValue[3] ) << 16 ) |
+ ( ( 0xFF & macValue[4] ) << 8 )|( 0xFF & macValue[3] ) ));
+ vector[28]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[0] ) << 24 )|( ( 0xFF & macValue[2] ) << 16 ) |
+ ( ( 0xFF & macValue[3] ) << 8 )|( 0xFF & macValue[4] ) ));
+ vector[29]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[0] ) << 24 )|( ( 0xFF & macValue[0] ) << 16 ) |
+ ( ( 0xFF & macValue[2] ) << 8 )|( 0xFF & macValue[2] ) ));
+ vector[30]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[0] ) << 24 )|( ( 0xFF & macValue[0] ) << 16 ) |
+ ( ( 0xFF & macValue[0] ) << 8 )|( 0xFF & macValue[5] ) ));
+ vector[31]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[1] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
+ ( ( 0xFF & macValue[1] ) << 8 )|( 0xFF & macValue[4] ) ));
+ vector[32]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[4] ) << 24 )|( ( 0xFF & macValue[0] ) << 16 ) |
+ ( ( 0xFF & macValue[2] ) << 8 )|( 0xFF & macValue[2] ) ));
+ vector[33]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[3] ) << 24 )|( ( 0xFF & macValue[3] ) << 16 ) |
+ ( ( 0xFF & macValue[3] ) << 8 )|( 0xFF & macValue[0] ) ));
+ vector[34]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[0] ) << 24 )|( ( 0xFF & macValue[2] ) << 16 ) |
+ ( ( 0xFF & macValue[4] ) << 8 )|( 0xFF & macValue[1] ) ));
+ vector[35]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[5] ) << 24 )|( ( 0xFF & macValue[5] ) << 16 ) |
+ ( ( 0xFF & macValue[5] ) << 8 )|( 0xFF & macValue[0] ) ));
+ vector[36]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[0] ) << 24 )|( ( 0xFF & macValue[4] ) << 16 ) |
+ ( ( 0xFF & macValue[5] ) << 8 )|( 0xFF & macValue[0] ) ));
+ vector[37]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[1] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
+ ( ( 0xFF & macValue[5] ) << 8 )|( 0xFF & macValue[2] ) ));
+ vector[38]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[2] ) << 24 )|( ( 0xFF & macValue[2] ) << 16 ) |
+ ( ( 0xFF & macValue[5] ) << 8 )|( 0xFF & macValue[1] ) ));
+ vector[39]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[3] ) << 24 )|( ( 0xFF & macValue[3] ) << 16 ) |
+ ( ( 0xFF & macValue[2] ) << 8 )|( 0xFF & macValue[3] ) ));
+ vector[40]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[1] ) << 24 )|( ( 0xFF & macValue[0] ) << 16 ) |
+ ( ( 0xFF & macValue[2] ) << 8 )|( 0xFF & macValue[4] ) ));
+ vector[41]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[1] ) << 24 )|( ( 0xFF & macValue[5] ) << 16 ) |
+ ( ( 0xFF & macValue[2] ) << 8 )|( 0xFF & macValue[5] ) ));
+ vector[42]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[0] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
+ ( ( 0xFF & macValue[4] ) << 8 )|( 0xFF & macValue[0] ) ));
+ vector[43]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[1] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
+ ( ( 0xFF & macValue[1] ) << 8 )|( 0xFF & macValue[4] ) ));
+ vector[44]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[2] ) << 24 )|( ( 0xFF & macValue[2] ) << 16 ) |
+ ( ( 0xFF & macValue[2] ) << 8 )|( 0xFF & macValue[2] ) ));
+ vector[45]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[3] ) << 24 )|( ( 0xFF & macValue[3] ) << 16 ) |
+ ( ( 0xFF & macValue[3] ) << 8 )|( 0xFF & macValue[3] ) ));
+ vector[46]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[5] ) << 24 )|( ( 0xFF & macValue[4] ) << 16 ) |
+ ( ( 0xFF & macValue[0] ) << 8 )|( 0xFF & macValue[1] ) ));
+ vector[47]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[4] ) << 24 )|( ( 0xFF & macValue[0] ) << 16 ) |
+ ( ( 0xFF & macValue[5] ) << 8 )|( 0xFF & macValue[5] ) ));
+ vector[48]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[1] ) << 24 )|( ( 0xFF & macValue[0] ) << 16 ) |
+ ( ( 0xFF & macValue[5] ) << 8 )|( 0xFF & macValue[0] ) ));
+ vector[49]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[0] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
+ ( ( 0xFF & macValue[5] ) << 8 )|( 0xFF & macValue[1] ) ));
+ vector[50]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[2] ) << 24 )|( ( 0xFF & macValue[2] ) << 16 ) |
+ ( ( 0xFF & macValue[4] ) << 8 )|( 0xFF & macValue[2] ) ));
+ vector[51]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[3] ) << 24 )|( ( 0xFF & macValue[4] ) << 16 ) |
+ ( ( 0xFF & macValue[4] ) << 8 )|( 0xFF & macValue[3] ) ));
+ vector[52]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[4] ) << 24 )|( ( 0xFF & macValue[3] ) << 16 ) |
+ ( ( 0xFF & macValue[1] ) << 8 )|( 0xFF & macValue[5] ) ));
+ vector[53]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[5] ) << 24 )|( ( 0xFF & macValue[5] ) << 16 ) |
+ ( ( 0xFF & macValue[1] ) << 8 )|( 0xFF & macValue[4] ) ));
+ vector[54]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[3] ) << 24 )|( ( 0xFF & macValue[0] ) << 16 ) |
+ ( ( 0xFF & macValue[1] ) << 8 )|( 0xFF & macValue[5] ) ));
+ vector[55]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[3] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
+ ( ( 0xFF & macValue[0] ) << 8 )|( 0xFF & macValue[4] ) ));
+ vector[56]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[4] ) << 24 )|( ( 0xFF & macValue[2] ) << 16 ) |
+ ( ( 0xFF & macValue[2] ) << 8 )|( 0xFF & macValue[5] ) ));
+ vector[57]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[4] ) << 24 )|( ( 0xFF & macValue[3] ) << 16 ) |
+ ( ( 0xFF & macValue[3] ) << 8 )|( 0xFF & macValue[1] ) ));
+ vector[58]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[2] ) << 24 )|( ( 0xFF & macValue[4] ) << 16 ) |
+ ( ( 0xFF & macValue[3] ) << 8 )|( 0xFF & macValue[0] ) ));
+ vector[59]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[2] ) << 24 )|( ( 0xFF & macValue[3] ) << 16 ) |
+ ( ( 0xFF & macValue[5] ) << 8 )|( 0xFF & macValue[1] ) ));
+ vector[60]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[3] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
+ ( ( 0xFF & macValue[2] ) << 8 )|( 0xFF & macValue[3] ) ));
+ vector[61]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[5] ) << 24 )|( ( 0xFF & macValue[0] ) << 16 ) |
+ ( ( 0xFF & macValue[1] ) << 8 )|( 0xFF & macValue[2] ) ));
+ vector[62]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[5] ) << 24 )|( ( 0xFF & macValue[3] ) << 16 ) |
+ ( ( 0xFF & macValue[4] ) << 8 )|( 0xFF & macValue[1] ) ));
+ vector[63]=0xFFFFFFFFL & ((long)( ( ( 0xFF & macValue[0] ) << 24 )|( ( 0xFF & macValue[2] ) << 16 ) |
+ ( ( 0xFF & macValue[3] ) << 8 )|( 0xFF & macValue[0] ) ));
+
+ return vector;
+ }
+
+ public void run(){
+ JenkinsHash hash = new JenkinsHash();
+ if ( router.getMac().equals("") )
+ {
+ handler.sendMessage(Message.obtain(handler, ERROR_MSG ,
+ resources.getString(R.string.msg_nomac)));
+ return;
+ }
+ long [] key = scrambler(router.getMac());
+ long seed = 0;
+
+ for (int x = 0; x < 64; x++) {
+ seed = hash.hashword(key,x, seed);
+ }
+
+ String S1 = Long.toHexString(seed);
+ while ( S1.length() < 8 )
+ S1 = "0" + S1;
+
+
+ for ( int x = 0; x <64; x++) {
+ if (x <8)
+ key[x] =( key[x]<< 3 ) & 0xFFFFFFFF;
+ else if ( x<16)
+ key[x] >>>= 5;
+ else if (x < 32 )
+ key[x] >>>= 2;
+ else
+ key[x] =( key[x]<< 7 ) & 0xFFFFFFFF;
+ }
+
+ seed = 0;
+ for (int x = 0; x < 64; x++) {
+ seed = hash.hashword(key, x, seed);
+ }
+ String S2 = Long.toHexString(seed);
+ while ( S2.length() < 8 )
+ S2 = "0" + S2;
+ pwList.add(S1.substring(S1.length() - 5) + S2.substring(0, 5));
+ handler.sendEmptyMessage(RESULTS_READY);
+ return;
+ }
+
+
+}
diff --git a/android/src/org/exobel/routerkeygen/ThomsonKeygen.java b/android/src/org/exobel/routerkeygen/ThomsonKeygen.java
new file mode 100644
index 0000000..cd1a473
--- /dev/null
+++ b/android/src/org/exobel/routerkeygen/ThomsonKeygen.java
@@ -0,0 +1,471 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+package org.exobel.routerkeygen;
+
+import java.io.DataInputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.RandomAccessFile;
+import java.io.UnsupportedEncodingException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.zip.ZipInputStream;
+
+import android.content.res.Resources;
+import android.os.Environment;
+import android.os.Handler;
+import android.os.Message;
+
+public class ThomsonKeygen extends KeygenThread {
+
+ byte[] cp;
+ byte[] hash;
+ byte[] entry;
+ byte[] table;
+ int a, b, c;
+ int year;
+ int week;
+ int sequenceNumber;
+ byte[] routerESSID;
+ boolean thomson3g;
+ boolean errorDict;
+ int len = 0;
+ String folderSelect;
+
+ public ThomsonKeygen(Handler h, Resources res , String folder , boolean thomson3g ) {
+ super(h, res);
+ this.folderSelect = folder;
+ this.cp = new byte[12];
+ this.hash = new byte[19];
+ this.table= new byte[1282];
+ this.routerESSID = new byte[3];
+ this.thomson3g = thomson3g;
+ this.errorDict = false;
+ }
+
+ public void run(){
+ if ( router == null)
+ return;
+ try {
+ md = MessageDigest.getInstance("SHA1");
+ } catch (NoSuchAlgorithmException e1) {
+ handler.sendMessage(Message.obtain(handler, ERROR_MSG ,
+ resources.getString(R.string.msg_nosha1)));
+ return;
+ }
+ if ( router.getSSIDsubpart().length() != 6 )
+ {
+ handler.sendMessage(Message.obtain(handler, ERROR_MSG ,
+ resources.getString(R.string.msg_shortessid6)));
+ return;
+ }
+
+ for (int i = 0; i < 6; i += 2)
+ routerESSID[i / 2] = (byte) ((Character.digit(router.getSSIDsubpart().charAt(i), 16) << 4)
+ + Character.digit(router.getSSIDsubpart().charAt(i + 1), 16));
+
+
+ if ( !thomson3g )
+ {
+ if (!localCalc() )
+ return;
+ }
+ else
+ {
+ if (!internetCalc())
+ return;
+ }
+
+ if(pwList.toArray().length == 0)
+ {
+ handler.sendMessage(Message.obtain(handler, ERROR_MSG ,
+ resources.getString(R.string.msg_errnomatches)));
+ return;
+ }
+ handler.sendEmptyMessage(RESULTS_READY);
+ return;
+ }
+ private boolean internetCalc(){
+ try{
+ DataInputStream onlineFile = null;
+ int lenght =0 ;
+ URL url;
+ InputStream file = resources.openRawResource(R.raw.webdic);
+ ZipInputStream fis = new ZipInputStream(file);
+ fis.getNextEntry();
+ int check = 0 , ret = 0 ;
+ while ( check != 1024 )/*ZipInputStream doens't seems to block.*/
+ {
+ ret = fis.read(table , check , 1024 - check);
+ if ( ret == -1 )
+ {
+ handler.sendMessage(Message.obtain(handler, ERROR_MSG ,
+ resources.getString(R.string.msg_err_webdic_table)));
+ errorDict = true;
+ return false;
+ }
+ else
+ check += ret;
+ }
+ int totalOffset = 0;
+ int offset = 0;
+ int lastLength = 0 ;
+ int i = ( 0xFF &routerESSID[0] )*4;
+ offset =( (0xFF & table[i]) << 24 ) | ( (0xFF & table[i + 1]) << 16 ) |
+ ( (0xFF & table[i + 2]) << 8 ) | (0xFF & table[i + 3]);
+ if ( i != 1020 ) // routerESSID[0] != 0xFF ( 255*4 == 1020 )
+ lastLength = ( (0xFF & table[i + 4]) << 24 ) | ( (0xFF & table[i + 5]) << 16 ) |
+ ( (0xFF & table[i + 6]) << 8 ) | (0xFF & table[i + 7]);
+ totalOffset += offset;
+ long checkLong = 0 , retLong ;
+ while ( checkLong != (i/4)*768 )/*ZipInputStream doens't seems to block.*/
+ {
+ retLong = fis.skip((i/4)*768 - checkLong);
+ if ( retLong == -1 )
+ {
+ handler.sendMessage(Message.obtain(handler, ERROR_MSG ,
+ resources.getString(R.string.msg_err_webdic_table)));
+ errorDict = true;
+ return false;
+ }
+ else
+ checkLong += retLong;
+ }
+ check = 0 ;
+ while ( check != 768 )
+ {
+ ret = fis.read(table , check , 768 - check);
+ if ( ret == -1 )
+ {
+ handler.sendMessage(Message.obtain(handler, ERROR_MSG ,
+ resources.getString(R.string.msg_err_webdic_table)));
+ errorDict = true;
+ return false;
+ }
+ else
+ check += ret;
+ }
+ i = ( 0xFF &routerESSID[1] )*3;
+ offset =( (0xFF & table[i]) << 16 ) |
+ ( (0xFF & table[i + 1 ]) << 8 ) | (0xFF & table[i + 2]);
+ /*There's no check here because humans are lazy people and because it doesn't matter*/
+ lenght = ( (0xFF & table[i + 3]) << 16 ) |
+ ( (0xFF & table[i + 4]) << 8 ) | (0xFF & table[i + 5]);
+ totalOffset += offset;
+ lenght -= offset;
+ if ( ( lastLength != 0 ) && ( (0xFF & routerESSID[1] ) == 0xFF ) )
+ {
+ /*Only for SSID starting with XXFF. We use the next item on the main table
+ to know the length of the sector we are looking for. */
+ lastLength -= totalOffset;
+ lenght = lastLength;
+ }
+ if ( ( (0xFF & routerESSID[0] ) == 0xFF ) && ( (0xFF & routerESSID[1] ) == 0xFF ) )
+ {
+ /*Only for SSID starting with FFFF as we don't have a marker of the end.*/
+ lenght = 2000;
+ }
+ url = new URL(Preferences.PUB_DOWNLOAD);
+ URLConnection con= url.openConnection();
+ con.setRequestProperty("Range", "bytes=" + totalOffset + "-");
+ onlineFile = new DataInputStream(con.getInputStream());
+ if ( onlineFile == null )
+ {
+ handler.sendMessage(Message.obtain(handler, ERROR_MSG ,
+ resources.getString(R.string.msg_errthomson3g)));
+ return false;
+ }
+ len = 0;
+ this.entry = new byte[lenght];
+ if ( ( len = onlineFile.read(this.entry , 0 , lenght ) ) != -1 ){
+ lenght = len;;
+ }
+
+ onlineFile.close();
+ fis.close();
+ return thirdDic();
+ } catch ( IOException e) {
+ handler.sendMessage(Message.obtain(handler, ERROR_MSG ,
+ resources.getString(R.string.msg_err_webdic_table)));
+ errorDict = true;
+ return false;
+ }
+ }
+
+ private boolean localCalc(){
+
+ if ( !Environment.getExternalStorageState().equals("mounted") &&
+ !Environment.getExternalStorageState().equals("mounted_ro") )
+ {
+ handler.sendMessage(Message.obtain(handler, ERROR_MSG ,
+ resources.getString(R.string.msg_nosdcard)));
+ errorDict = true;
+ return false;
+ }
+ RandomAccessFile fis;
+ try {
+ File dictionay = getDictionaryFile();
+ fis = new RandomAccessFile(dictionay, "r");
+ } catch (FileNotFoundException e2) {
+ handler.sendMessage(Message.obtain(handler, ERROR_MSG ,
+ resources.getString(R.string.msg_dictnotfound)));
+ errorDict = true;
+ return false;
+ }
+ int version = 0;
+ try {
+ if ( fis.read(table) == -1 )
+ {
+ handler.sendMessage(Message.obtain(handler, ERROR_MSG ,
+ resources.getString(R.string.msg_errordict)));
+ errorDict = true;
+ return false;
+ }
+ version = table[0] << 8 | table[1];
+ int totalOffset = 0;
+ int offset = 0;
+ int lastLength = 0 , length = 0;
+ if ( table[( 0xFF &routerESSID[0] )*5 + 2 ] == routerESSID[0] )
+ {
+ int i = ( 0xFF &routerESSID[0] )*5 + 2;
+ offset =( (0xFF & table[i + 1]) << 24 ) | ( (0xFF & table[i + 2]) << 16 ) |
+ ( (0xFF & table[i + 3]) << 8 ) | (0xFF & table[i + 4]);
+ if ( (0xFF & table[i]) != 0xFF )
+ lastLength = ( (0xFF & table[i + 6]) << 24 ) | ( (0xFF & table[i + 7]) << 16 ) |
+ ( (0xFF & table[i + 8]) << 8 ) | (0xFF & table[i + 9]);
+ }
+ totalOffset += offset;
+ fis.seek(totalOffset);
+ if ( fis.read(table,0,1024) == -1 )
+ {
+ handler.sendMessage(Message.obtain(handler, ERROR_MSG ,
+ resources.getString(R.string.msg_errordict)));
+ errorDict = true;
+ return false;
+ }
+ if ( table[( 0xFF &routerESSID[1] )*4] == routerESSID[1] )
+ {
+ int i = ( 0xFF &routerESSID[1] )*4;
+ offset =( (0xFF & table[i + 1]) << 16 ) |
+ ( (0xFF & table[i + 2]) << 8 ) | (0xFF & table[i + 3]);
+ length = ( (0xFF & table[i + 5]) << 16 ) |
+ ( (0xFF & table[i + 6]) << 8 ) | (0xFF & table[i + 7]);
+
+ }
+ totalOffset += offset;
+ length -= offset;
+ if ( ( lastLength != 0 ) && ( (0xFF & routerESSID[1] ) == 0xFF ) )
+ {
+ /*Only for SSID starting with XXFF. We use the next item on the main table
+ to know the length of the sector we are looking for. */
+ lastLength -= totalOffset;
+ length = lastLength;
+ }
+ fis.seek(totalOffset );
+ if ( ( (0xFF & routerESSID[0] ) != 0xFF ) || ( (0xFF & routerESSID[1] ) != 0xFF ) )
+ {
+ this.entry = new byte[length];
+ len = fis.read(entry,0, length);
+ }
+ else
+ { /*Only for SSID starting with FFFF as we don't have a marker of the end.*/
+ this.entry = new byte[2000];
+ len = fis.read( entry );
+ }
+ if ( len == -1 )
+ {
+ handler.sendMessage(Message.obtain(handler, ERROR_MSG ,
+ resources.getString(R.string.msg_errordict)));
+ errorDict = true;
+ return false;
+ }
+ } catch (IOException e1) {
+ errorDict = true;
+ handler.sendMessage(Message.obtain(handler, ERROR_MSG ,
+ resources.getString(R.string.msg_errordict)));
+ return false;
+ }
+ if ( version > 3 )
+ {
+ handler.sendMessage(Message.obtain(handler, ERROR_MSG ,
+ resources.getString(R.string.msg_errversion)));
+ errorDict = true;
+ return false;
+ }
+
+ if ( version == 1 )
+ firstDic();
+ else if ( version == 2 )
+ secondDic();
+ else if ( version == 3 )
+ return thirdDic();
+
+ return true;
+ }
+
+
+ private File getDictionaryFile() throws FileNotFoundException {
+ String firstName = folderSelect + File.separator + "RouterKeygen.dic";
+ String secondName = folderSelect + File.separator + "RKDictionary.dic";
+ try{
+ File dic = new File(firstName);
+ if ( dic.exists() )
+ return dic;
+ dic = new File(secondName);
+ if ( dic.exists() )
+ return dic;
+ else
+ throw new FileNotFoundException("Permissions Error");
+ } catch(SecurityException e ){
+ e.printStackTrace();
+ throw new FileNotFoundException("Permissions Error");
+ }
+ }
+
+
+ static {
+ System.loadLibrary("thomson");
+ }
+
+ private native String [] thirdDicNative( byte [] essid ,
+ byte [] entry , int size);
+
+ //This has been implemented natively for instant resolution!
+ private boolean thirdDic(){
+ String [] results;
+ try{
+ results = this.thirdDicNative(routerESSID , entry , entry.length);
+ }catch (Exception e) {
+ handler.sendMessage(Message.obtain(handler, ERROR_MSG ,
+ resources.getString(R.string.msg_err_native)));
+ return false;
+ }catch (LinkageError e) {
+ handler.sendMessage(Message.obtain(handler, ERROR_MSG ,
+ resources.getString(R.string.err_misbuilt_apk)));
+ return false;
+ }
+ if ( stopRequested )
+ return false;
+ for (int i = 0 ; i < results.length ; ++i )
+ pwList.add(results[i]);
+ return true;
+ }
+
+
+ private void secondDic(){
+ cp[0] = (byte) (char) 'C';
+ cp[1] = (byte) (char) 'P';
+ for (int offset = 0; offset < len ; offset += 3 )
+ {
+ if ( stopRequested )
+ return;
+ sequenceNumber = ( (0xFF & entry[offset + 0]) << 16 ) |
+ ( (0xFF & entry[offset + 1]) << 8 ) | (0xFF & entry[offset + 2]) ;
+ c = sequenceNumber % 36;
+ b = sequenceNumber/36 % 36;
+ a = sequenceNumber/(36*36) % 36;
+ year = sequenceNumber / ( 36*36*36*52 ) + 4 ;
+ week = ( sequenceNumber / ( 36*36*36 ) ) % 52 + 1 ;
+ cp[2] = (byte) Character.forDigit((year / 10), 10);
+ cp[3] = (byte) Character.forDigit((year % 10), 10);
+ cp[4] = (byte) Character.forDigit((week / 10), 10);
+ cp[5] = (byte) Character.forDigit((week % 10), 10);
+ cp[6] = charectbytes0[a];
+ cp[7] = charectbytes1[a];
+ cp[8] = charectbytes0[b];
+ cp[9] = charectbytes1[b];
+ cp[10] = charectbytes0[c];
+ cp[11] = charectbytes1[c];
+ md.reset();
+ md.update(cp);
+ hash = md.digest();
+ if ( hash[19] != routerESSID[2])
+ continue;
+ if ( hash[18] != routerESSID[1])
+ continue;
+ if ( hash[17] != routerESSID[0])
+ continue;
+
+ try {
+ pwList.add(StringUtils.getHexString(hash).substring(0, 10).toUpperCase());
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ private void firstDic(){
+ cp[0] = (byte) (char) 'C';
+ cp[1] = (byte) (char) 'P';
+ for (int offset = 0; offset < len ; offset += 4 )
+ {
+ if ( stopRequested )
+ return;
+
+ if ( entry[offset] != routerESSID[2])
+ continue;
+ sequenceNumber = ( (0xFF & entry[offset + 1]) << 16 ) |
+ ( (0xFF & entry[offset + 2]) << 8 ) | (0xFF & entry[offset + 3]) ;
+ c = sequenceNumber % 36;
+ b = sequenceNumber/36 % 36;
+ a = sequenceNumber/(36*36) % 36;
+ year = sequenceNumber / ( 36*36*36*52 ) + 4 ;
+ week = ( sequenceNumber / ( 36*36*36 ) ) % 52 + 1 ;
+ cp[2] = (byte) Character.forDigit((year / 10), 10);
+ cp[3] = (byte) Character.forDigit((year % 10), 10);
+ cp[4] = (byte) Character.forDigit((week / 10), 10);
+ cp[5] = (byte) Character.forDigit((week % 10), 10);
+ cp[6] = charectbytes0[a];
+ cp[7] = charectbytes1[a];
+ cp[8] = charectbytes0[b];
+ cp[9] = charectbytes1[b];
+ cp[10] = charectbytes0[c];
+ cp[11] = charectbytes1[c];
+ md.reset();
+ md.update(cp);
+ hash = md.digest();
+
+ try {
+ pwList.add(StringUtils.getHexString(hash).substring(0, 10).toUpperCase());
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ static byte[] charectbytes0 = {
+ '3','3','3','3','3','3',
+ '3','3','3','3','4','4',
+ '4','4','4','4','4','4',
+ '4','4','4','4','4','4',
+ '4','5','5','5','5','5',
+ '5','5','5','5','5','5',
+ };
+
+ static byte[] charectbytes1 = {
+ '0','1','2','3','4','5',
+ '6','7','8','9','1','2',
+ '3','4','5','6','7','8',
+ '9','A','B','C','D','E',
+ 'F','0','1','2','3','4',
+ '5','6','7','8','9','A',
+ };
+}
diff --git a/android/src/org/exobel/routerkeygen/VerizonKeygen.java b/android/src/org/exobel/routerkeygen/VerizonKeygen.java
new file mode 100644
index 0000000..037fd1b
--- /dev/null
+++ b/android/src/org/exobel/routerkeygen/VerizonKeygen.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+package org.exobel.routerkeygen;
+
+import android.content.res.Resources;
+import android.os.Handler;
+import android.os.Message;
+
+public class VerizonKeygen extends KeygenThread {
+
+ public VerizonKeygen(Handler h, Resources res) {
+ super(h, res);
+ }
+
+ public void run(){
+ String ssid = router.ssid;
+ if ( ssid.length() != 5 )
+ {
+ handler.sendMessage(Message.obtain(handler, ERROR_MSG ,
+ resources.getString(R.string.msg_shortessid5)));
+ return;
+ }
+ char [] inverse = new char[5];
+ inverse[0] = ssid.charAt(4);
+ inverse[1] = ssid.charAt(3);
+ inverse[2] = ssid.charAt(2);
+ inverse[3] = ssid.charAt(1);
+ inverse[4] = ssid.charAt(0);
+
+ int result = 0;
+ try{
+ result = Integer.valueOf(String.copyValueOf(inverse), 36);
+ }catch(NumberFormatException e){
+ handler.sendMessage(Message.obtain(handler, ERROR_MSG ,
+ resources.getString(R.string.msg_err_verizon_ssid)));
+ return;
+ }
+
+ ssid = Integer.toHexString(result).toUpperCase();
+ while ( ssid.length() < 6 )
+ ssid = "0" + ssid;
+ if ( !router.mac.equals(""))
+ {
+ pwList.add(router.mac.substring(3,5) + router.mac.substring(6,8) +
+ Integer.toHexString(result).toUpperCase());
+ }
+ else
+ {
+ pwList.add("1801" + Integer.toHexString(result).toUpperCase());
+ pwList.add("1F90" + Integer.toHexString(result).toUpperCase());
+ }
+ handler.sendEmptyMessage(RESULTS_READY);
+ return;
+ }
+}
diff --git a/android/src/org/exobel/routerkeygen/WifiListAdapter.java b/android/src/org/exobel/routerkeygen/WifiListAdapter.java
new file mode 100644
index 0000000..1031983
--- /dev/null
+++ b/android/src/org/exobel/routerkeygen/WifiListAdapter.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+package org.exobel.routerkeygen;
+
+import java.util.ArrayList;
+import java.util.List;
+import android.content.Context;
+import android.net.wifi.WifiManager;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.ImageView;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+public class WifiListAdapter extends BaseAdapter {
+ private List listNetworks;
+ private Context context;
+ public WifiListAdapter(List list, Context context) {
+ if ( list != null )
+ this.listNetworks = list;
+ else
+ this.listNetworks = new ArrayList();
+ this.context = context;
+ }
+
+ public int getCount() {
+ return listNetworks.size();
+ }
+
+ public Object getItem(int position) {
+ return listNetworks.get(position);
+ }
+
+ public long getItemId(int position) {
+ return listNetworks.get(position).hashCode();
+ }
+
+ public View getView(int position, View convertView, ViewGroup parent) {
+ RelativeLayout itemLayout;
+ WifiNetwork wifi = listNetworks.get(position);
+ int strenght = listNetworks.get(position).getLevel();
+ itemLayout= (RelativeLayout) LayoutInflater.from(context).inflate(R.layout.item_list_wifi, parent, false);
+
+ TextView ssid = (TextView) itemLayout.findViewById(R.id.wifiName);
+ ssid.setText(wifi.ssid);
+
+ TextView bssid = (TextView) itemLayout.findViewById(R.id.wifiMAC);
+ bssid.setText(wifi.mac);
+
+ ImageView icon = (ImageView)itemLayout.findViewById(R.id.icon);
+ if ( wifi.supported && !wifi.newThomson)
+ icon.setImageDrawable(context.getResources().getDrawable(R.drawable.ic_possible));
+
+ ImageView networkS = (ImageView)itemLayout.findViewById(R.id.strenght);
+ int pic = WifiManager.calculateSignalLevel(strenght, 4);
+ switch (pic){
+ case 0: networkS.setImageDrawable(context.getResources().
+ getDrawable(R.drawable.ic_wifi_weak));
+ break;
+ case 1: networkS.setImageDrawable(context.getResources().
+ getDrawable(R.drawable.ic_wifi_medium));
+ break;
+ case 2: networkS.setImageDrawable(context.getResources().
+ getDrawable(R.drawable.ic_wifi_strong));
+ break;
+ case 3: networkS.setImageDrawable(context.getResources().
+ getDrawable(R.drawable.ic_wifi_verystrong));
+ break;
+ }
+ return itemLayout;
+ }
+
+}
diff --git a/android/src/org/exobel/routerkeygen/WifiNetwork.java b/android/src/org/exobel/routerkeygen/WifiNetwork.java
new file mode 100644
index 0000000..a555a40
--- /dev/null
+++ b/android/src/org/exobel/routerkeygen/WifiNetwork.java
@@ -0,0 +1,279 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+package org.exobel.routerkeygen;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import android.content.Context;
+
+
+public class WifiNetwork implements Comparable, Serializable{
+
+ private static final long serialVersionUID = 9017619358450514547L;
+ String ssid;
+ String mac;
+ String ssidSubpart;
+ String encryption;
+ boolean supported;
+ boolean newThomson;
+ int level;
+ ArrayList supportedAlice;
+ TYPE type;
+ static enum TYPE {
+ THOMSON , DLINK , DISCUS , VERIZON ,
+ EIRCOM , PIRELLI , TELSEY , ALICE ,
+ WLAN4 , HUAWEI, WLAN2 , ONO_WEP ,
+ SKY_V1 , WLAN6 ,TECOM , INFOSTRADA };
+ public WifiNetwork(String ssid, String mac, int level , String enc , Context con ){
+ this.ssid = ssid;
+ this.mac = mac.toUpperCase();
+ this.level = level;
+ this.encryption = enc;
+ if ( this.encryption.equals(""))
+ this.encryption = "Open";
+ this.newThomson = false;
+ this.supported = essidFilter(con);
+ }
+
+ public int getLevel(){
+ return level;
+ }
+
+ public String getSSIDsubpart(){
+ return ssidSubpart;
+ }
+
+ public String getMacEnd(){
+ if ( mac.replace(":", "").length() < 12 )
+ return mac.replace(":", "");
+ return mac.replace(":", "").substring(6);
+ }
+
+ public String getMac(){
+ return mac.replace(":", "");
+ }
+
+ private boolean essidFilter(Context con) {
+ if ( ( ssid.startsWith("Thomson") && ssid.length() == 13 ) ||
+ ( ssid.startsWith("SpeedTouch") && ssid.length() == 16 ) ||
+ ( ssid.startsWith("O2Wireless") && ssid.length() == 16 ) ||
+ ( ssid.startsWith("Orange-") && ssid.length() == 13 ) ||
+ ( ssid.startsWith("INFINITUM") && ssid.length() == 15 ) ||
+ ( ssid.startsWith("BigPond") && ssid.length() == 13 ) ||
+ ( ssid.startsWith("Otenet") && ssid.length() == 12 ) ||
+ ( ssid.startsWith("Bbox-") && ssid.length() == 11 ) ||
+ ( ssid.startsWith("DMAX") && ssid.length() == 10 ) ||
+ ( ssid.startsWith("privat") && ssid.length() == 12 ) ||
+ ( ssid.startsWith("TN_private_") && ssid.length() == 17 ) ||
+ ( ssid.startsWith("CYTA") && ssid.length() == 10 ) ||
+ ( ssid.startsWith("Blink") && ssid.length() == 11 ))
+ {
+ ssidSubpart = ssid.substring(ssid.length()-6);
+ if ( !mac.equals("") )
+ if ( ssidSubpart.equals(getMacEnd()) )
+ newThomson = true;
+ type = TYPE.THOMSON;
+ return true;
+ }
+ if ( ssid.matches("DLink-[0-9a-fA-F]{6}") )
+ {
+ ssidSubpart = new String ( ssid.substring(ssid.length()-6));
+ type = TYPE.DLINK;
+ return true;
+ }
+ if ( ssid.matches("Discus--?[0-9a-fA-F]{6}") )
+ {
+ ssidSubpart = ssid.substring(ssid.length()-6);
+ type = TYPE.DISCUS;
+ return true;
+ }
+ if (( ssid.matches("eircom[0-7]{8}|eircom[0-7]{4} [0-7]{4}") ) )
+ {
+ if ( ssid.length() == 14 )
+ ssidSubpart = ssid.substring(ssid.length()-8);
+ else
+ ssidSubpart = ssid.substring(6, 10) + ssid.substring(ssid.length()-4);
+ if ( mac.equals("") )
+ calcEircomMAC();
+ type = TYPE.EIRCOM;
+ return true;
+ }
+ if ( ssid.length() == 5 &&
+ ( mac.startsWith("00:1F:90") || mac.startsWith("A8:39:44") ||
+ mac.startsWith("00:18:01") || mac.startsWith("00:20:E0") ||
+ mac.startsWith("00:0F:B3") || mac.startsWith("00:1E:A7") ||
+ mac.startsWith("00:15:05") || mac.startsWith("00:24:7B") ||
+ mac.startsWith("00:26:62") || mac.startsWith("00:26:B8") ) )
+ {
+ ssidSubpart = ssid;
+ type = TYPE.VERIZON;
+ return true;
+ }
+ if ( ( ssid.toUpperCase().startsWith("FASTWEB-1-000827") && ssid.length() == 22 ) ||
+ ( ssid.toUpperCase().startsWith("FASTWEB-1-0013C8") && ssid.length() == 22 ) ||
+ ( ssid.toUpperCase().startsWith("FASTWEB-1-0017C2") && ssid.length() == 22 ) ||
+ ( ssid.toUpperCase().startsWith("FASTWEB-1-00193E") && ssid.length() == 22 ) ||
+ ( ssid.toUpperCase().startsWith("FASTWEB-1-001CA2") && ssid.length() == 22 ) ||
+ ( ssid.toUpperCase().startsWith("FASTWEB-1-001D8B") && ssid.length() == 22 ) ||
+ ( ssid.toUpperCase().startsWith("FASTWEB-1-002233") && ssid.length() == 22 ) ||
+ ( ssid.toUpperCase().startsWith("FASTWEB-1-00238E") && ssid.length() == 22 ) ||
+ ( ssid.toUpperCase().startsWith("FASTWEB-1-002553") && ssid.length() == 22 ) ||
+ ( ssid.toUpperCase().startsWith("FASTWEB-1-00A02F") && ssid.length() == 22 ) ||
+ ( ssid.toUpperCase().startsWith("FASTWEB-1-080018") && ssid.length() == 22 ) ||
+ ( ssid.toUpperCase().startsWith("FASTWEB-1-3039F2") && ssid.length() == 22 ) ||
+ ( ssid.toUpperCase().startsWith("FASTWEB-1-38229D") && ssid.length() == 22 ) ||
+ ( ssid.toUpperCase().startsWith("FASTWEB-1-6487D7") && ssid.length() == 22 ))
+ {
+ ssidSubpart = ssid.substring(ssid.length()-12);
+ if ( mac.equals("") )
+ calcFastwebMAC();
+ type = TYPE.PIRELLI;
+ return true;
+ }
+ if ( ssid.matches("FASTWEB-[1-2]-002196[0-9A-Fa-f]{6}|FASTWEB-[1-2]-00036F[0-9A-Fa-f]{6}") )
+ {
+ ssidSubpart = ssid.substring(ssid.length()-12);
+ if ( mac.equals("") )
+ calcFastwebMAC();
+ type = TYPE.TELSEY;
+ return true;
+ }
+ if ( ssid.matches("[aA]lice-[0-9]{8}") )
+ {
+ AliceHandle aliceReader = new AliceHandle(ssid.substring(0,9));
+ SAXParserFactory factory = SAXParserFactory.newInstance();
+ SAXParser saxParser;
+ try {
+ saxParser = factory.newSAXParser();
+ saxParser.parse(con.getResources().openRawResource(R.raw.alice), aliceReader);
+ }
+ catch (Exception e) {}
+ ssidSubpart = ssid.substring(ssid.length()-8);
+ type = TYPE.ALICE;
+ if( aliceReader.supportedAlice.isEmpty() )
+ return false;
+ supportedAlice = aliceReader.supportedAlice;
+ if ( getMac().length() < 6 )
+ mac = supportedAlice.get(0).mac;
+ return true;
+ }
+ if ( ssid.matches("WLAN_[0-9a-fA-F]{4}|JAZZTEL_[0-9a-fA-F]{4}") &&
+ ( mac.startsWith("00:1F:A4") || mac.startsWith("64:68:0C") ||
+ mac.startsWith("00:1D:20") ) )
+ {
+ ssidSubpart = ssid.substring(ssid.length()-4);
+ type = TYPE.WLAN4;
+ return true;
+ }
+ if ( ssid.matches("INFINITUM[0-9a-zA-Z]{4}") && (
+ mac.startsWith("00:25:9E") || mac.startsWith("00:25:68") ||
+ mac.startsWith("00:22:A1") || mac.startsWith("00:1E:10") ||
+ mac.startsWith("00:18:82") || mac.startsWith("00:0F:F2") ||
+ mac.startsWith("00:E0:FC") || mac.startsWith("28:6E:D4") ||
+ mac.startsWith("54:A5:1B") || mac.startsWith("F4:C7:14") ||
+ mac.startsWith("28:5F:DB") || mac.startsWith("30:87:30") ||
+ mac.startsWith("4C:54:99") || mac.startsWith("40:4D:8E") ||
+ mac.startsWith("64:16:F0") || mac.startsWith("78:1D:BA") ||
+ mac.startsWith("84:A8:E4") || mac.startsWith("04:C0:6F") ||
+ mac.startsWith("5C:4C:A9") || mac.startsWith("1C:1D:67") ||
+ mac.startsWith("CC:96:A0") || mac.startsWith("20:2B:C1") ) )
+ {
+ if ( ssid.startsWith("INFINITUM") )
+ ssidSubpart = ssid.substring(ssid.length()-4);
+ else
+ ssidSubpart = "";
+ type = TYPE.HUAWEI;
+ return true;
+ }
+ if ( ssid.startsWith("WLAN_") && ssid.length() == 7 &&
+ ( mac.startsWith("00:01:38") || mac.startsWith("00:16:38") ||
+ mac.startsWith("00:01:13") || mac.startsWith("00:01:1B") ||
+ mac.startsWith("00:19:5B") ) )
+ {
+ ssidSubpart = ssid.substring(ssid.length()-2);
+ type = TYPE.WLAN2;
+ return true;
+ }
+ /*ssid must be of the form P1XXXXXX0000X or p1XXXXXX0000X*/
+ if ( ssid.matches("[Pp]1[0-9]{6}0{4}[0-9]") )
+ {
+ ssidSubpart = "";
+ type = TYPE.ONO_WEP;
+ return true;
+ }
+ if ( ssid.matches("WLAN[0-9a-zA-Z]{6}|WiFi[0-9a-zA-Z]{6}|YaCom[0-9a-zA-Z]{6}") )
+ {
+ ssidSubpart = ssid.substring(ssid.length()-6);
+ type = TYPE.WLAN6;
+ return true;
+ }
+ if ( ssid.matches("SKY[0-9]{5}") && (mac.startsWith("C4:3D:C7") ||
+ mac.startsWith("E0:46:9A") || mac.startsWith("E0:91:F5") ||
+ mac.startsWith("00:09:5B") || mac.startsWith("00:0F:B5") ||
+ mac.startsWith("00:14:6C") || mac.startsWith("00:18:4D") ||
+ mac.startsWith("00:26:F2") || mac.startsWith("C0:3F:0E") ||
+ mac.startsWith("30:46:9A") || mac.startsWith("00:1B:2F") ||
+ mac.startsWith("A0:21:B7") || mac.startsWith("00:1E:2A") ||
+ mac.startsWith("00:1F:33") || mac.startsWith("00:22:3F") ||
+ mac.startsWith("00:24:B2") ) )
+ {
+ ssidSubpart = ssid.substring(ssid.length()-5);
+ type = TYPE.SKY_V1;
+ return true;
+ }
+ if ( ssid.matches("TECOM-AH4021-[0-9a-zA-Z]{6}|TECOM-AH4222-[0-9a-zA-Z]{6}") )
+ {
+ ssidSubpart = ssid;
+ type = TYPE.TECOM;
+ return true;
+ }
+ if ( ssid.matches("InfostradaWiFi-[0-9a-zA-Z]{6}") )
+ {
+ ssidSubpart = ssid;
+ type = TYPE.INFOSTRADA;
+ return true;
+ }
+ return false;
+ }
+
+ public void calcFastwebMAC(){
+ this.mac = ssidSubpart.substring(0,2) + ":" + ssidSubpart.substring(2,4) + ":" +
+ ssidSubpart.substring(4,6) + ":" + ssidSubpart.substring(6,8) + ":" +
+ ssidSubpart.substring(8,10) + ":" + ssidSubpart.substring(10,12);
+ }
+
+ public void calcEircomMAC(){
+ String end = Integer.toHexString( Integer.parseInt(ssidSubpart, 8) ^ 0x000fcc );
+ this.mac = "00:0F:CC" + ":" + end.substring(0,2)+ ":" +
+ end.substring(2,4)+ ":" + end.substring(4,6);
+ }
+
+ public int compareTo(WifiNetwork another) {
+ if ( another.level == this.level && this.ssid.equals(another.ssid) && this.mac.equals(another.mac) )
+ return 0;
+ if ( this.supported && !this.newThomson )
+ return -1;
+ return 1;
+ }
+
+}
diff --git a/android/src/org/exobel/routerkeygen/WifiScanReceiver.java b/android/src/org/exobel/routerkeygen/WifiScanReceiver.java
new file mode 100644
index 0000000..86ef914
--- /dev/null
+++ b/android/src/org/exobel/routerkeygen/WifiScanReceiver.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+package org.exobel.routerkeygen;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.net.wifi.ScanResult;
+import android.widget.Toast;
+
+class WiFiScanReceiver extends BroadcastReceiver {
+ RouterKeygen solver;
+
+ public WiFiScanReceiver( RouterKeygen wifiDemo) {
+ super();
+ this.solver = wifiDemo;
+ }
+
+ public void onReceive(Context c, Intent intent) {
+
+ if ( solver == null )
+ return;
+ if ( solver.wifi == null )
+ return;
+ List results = solver.wifi.getScanResults();
+ ArrayList list = new ArrayList();
+ Set set = new TreeSet();
+ if ( results == null )/*He have had reports of this returning null instead of empty*/
+ return;
+ for (int i = 0; i < results.size() - 1; ++i)
+ for (int j = i+1; j < results.size(); ++j)
+ if(results.get(i).SSID.equals(results.get(j).SSID))
+ results.remove(j--);
+
+ for (ScanResult result : results) {
+ set.add(new WifiNetwork(result.SSID, result.BSSID, result.level , result.capabilities , solver));
+ }
+ Iterator it = set.iterator();
+ while( it.hasNext())
+ list.add(it.next());
+ solver.vulnerable = list;
+ if ( list.isEmpty() )
+ {
+ Toast.makeText( solver , solver.getResources().getString(R.string.msg_nowifidetected) ,
+ Toast.LENGTH_SHORT).show();
+ }
+ solver.scanResuls.setAdapter(new WifiListAdapter(list , solver));
+ try{
+ solver.unregisterReceiver(this);
+ }catch(Exception e ){}
+
+ }
+
+}
diff --git a/android/src/org/exobel/routerkeygen/WifiStateReceiver.java b/android/src/org/exobel/routerkeygen/WifiStateReceiver.java
new file mode 100644
index 0000000..14655b0
--- /dev/null
+++ b/android/src/org/exobel/routerkeygen/WifiStateReceiver.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+package org.exobel.routerkeygen;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.net.wifi.WifiManager;
+import android.widget.Toast;
+
+public class WifiStateReceiver extends BroadcastReceiver {
+
+ WifiManager wifi;
+ public WifiStateReceiver(WifiManager wifi ){
+ this.wifi = wifi;
+ }
+ @Override
+ public void onReceive(Context context, Intent arg1) {
+ if ( wifi.getWifiState() == WifiManager.WIFI_STATE_ENABLED )
+ {
+ wifi.startScan();
+ try{
+ context.unregisterReceiver(this);
+ }catch(Exception e ){}
+ Toast.makeText( context ,
+ context.getResources().getString(R.string.msg_scanstarted),
+ Toast.LENGTH_SHORT).show();
+ return;
+ }
+ if ( wifi.getWifiState() != WifiManager.WIFI_STATE_ENABLING )
+ {
+ Toast.makeText( context ,
+ context.getResources().getString(R.string.msg_nowifi),
+ Toast.LENGTH_SHORT).show();
+ return;
+ }
+ }
+
+}
diff --git a/android/src/org/exobel/routerkeygen/Wlan2Keygen.java b/android/src/org/exobel/routerkeygen/Wlan2Keygen.java
new file mode 100644
index 0000000..c7d9194
--- /dev/null
+++ b/android/src/org/exobel/routerkeygen/Wlan2Keygen.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+package org.exobel.routerkeygen;
+
+import android.content.res.Resources;
+import android.os.Handler;
+import android.os.Message;
+
+/**
+ * This only calculates the keys for some WLAN_xx
+ *
+ *
+ * Many WLAN_XX don't use this algorithm.
+ * Code by Kampanita
+ */
+
+public class Wlan2Keygen extends KeygenThread {
+
+ public Wlan2Keygen(Handler h, Resources res) {
+ super(h, res);
+ // TODO Auto-generated constructor stub
+ }
+
+ public void run() {
+ char[] key = new char[26];
+
+ if (router == null)
+ return;
+ String mac = router.getMac();
+
+ if (mac.length() != 12) {
+ handler.sendMessage(Message.obtain(handler, ERROR_MSG ,
+ resources.getString(R.string.msg_errpirelli)));
+ return;
+ }
+
+
+ key[0] = mac.charAt(10);
+ key[1] = mac.charAt(11);
+ key[2] = mac.charAt(0);
+ key[3] = mac.charAt(1);
+ key[4] = mac.charAt(8);
+ key[5] = mac.charAt(9);
+ key[6] = mac.charAt(2);
+ key[7] = mac.charAt(3);
+ key[8] = mac.charAt(4);
+ key[9] = mac.charAt(5);
+ key[10] = mac.charAt(6);
+ key[11] = mac.charAt(7);
+ key[12] = mac.charAt(10);
+ key[13] = mac.charAt(11);
+ key[14] = mac.charAt(8);
+ key[15] = mac.charAt(9);
+ key[16] = mac.charAt(2);
+ key[17] = mac.charAt(3);
+ key[18] = mac.charAt(4);
+ key[19] = mac.charAt(5);
+ key[20] = mac.charAt(6);
+ key[21] = mac.charAt(7);
+ key[22] = mac.charAt(0);
+ key[23] = mac.charAt(1);
+ key[24] = mac.charAt(4);
+ key[25] = mac.charAt(5);
+
+ int max = 9;
+ String begin = router.ssidSubpart.substring(0,1);
+ int primer_n = Integer.parseInt(begin, 16);
+ if (primer_n > max) {
+ String cadena = String.valueOf(key, 0, 2);
+ int value = Integer.parseInt(cadena,16);
+ value=value-1;
+ String cadena2 = Integer.toHexString(value);
+ if ( cadena2.length() < 2 )
+ cadena2 = "0" + cadena2;
+ key[0]=cadena2.charAt(0);
+ key[1]=cadena2.charAt(1);
+ }
+
+ pwList.add(String.valueOf(key, 0, 26));
+ handler.sendEmptyMessage(RESULTS_READY);
+ return;
+ }
+}
diff --git a/android/src/org/exobel/routerkeygen/Wlan4Keygen.java b/android/src/org/exobel/routerkeygen/Wlan4Keygen.java
new file mode 100644
index 0000000..8c092e9
--- /dev/null
+++ b/android/src/org/exobel/routerkeygen/Wlan4Keygen.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+package org.exobel.routerkeygen;
+
+import java.io.UnsupportedEncodingException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+import android.content.res.Resources;
+import android.os.Handler;
+import android.os.Message;
+
+public class Wlan4Keygen extends KeygenThread {
+
+ public Wlan4Keygen(Handler h, Resources res) {
+ super(h, res);
+ }
+
+ static final String magic = "bcgbghgg";
+ public void run(){
+ if ( router == null)
+ return;
+ try {
+ md = MessageDigest.getInstance("MD5");
+ } catch (NoSuchAlgorithmException e1) {
+ handler.sendMessage(Message.obtain(handler, ERROR_MSG ,
+ resources.getString(R.string.msg_nomd5)));
+ return;
+ }
+ if ( router.getMac().length() != 12 )
+ {
+ handler.sendMessage(Message.obtain(handler, ERROR_MSG ,
+ resources.getString(R.string.msg_errpirelli)));
+ return;
+ }
+ String macMod = router.getMac().substring(0,8) + router.getSSIDsubpart();
+ md.reset();
+ try {
+ if ( !router.getMac().toUpperCase().startsWith("001FA4") )
+ md.update(magic.getBytes("ASCII"));
+ if ( !router.getMac().toUpperCase().startsWith("001FA4") )
+ md.update(macMod.toUpperCase().getBytes("ASCII"));
+ else
+ md.update(macMod.toLowerCase().getBytes("ASCII"));
+ if ( !router.getMac().toUpperCase().startsWith("001FA4") )
+ md.update(router.getMac().toUpperCase().getBytes("ASCII"));
+ byte [] hash = md.digest();
+ if ( !router.getMac().toUpperCase().startsWith("001FA4") )
+ pwList.add(StringUtils.getHexString(hash).substring(0,20));
+ else
+ pwList.add(StringUtils.getHexString(hash).substring(0,20).toUpperCase());
+ handler.sendEmptyMessage(RESULTS_READY);
+ return;
+ } catch (UnsupportedEncodingException e) {}
+
+ }
+
+}
diff --git a/android/src/org/exobel/routerkeygen/Wlan6Keygen.java b/android/src/org/exobel/routerkeygen/Wlan6Keygen.java
new file mode 100644
index 0000000..b219dfd
--- /dev/null
+++ b/android/src/org/exobel/routerkeygen/Wlan6Keygen.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+package org.exobel.routerkeygen;
+
+import android.content.res.Resources;
+import android.os.Handler;
+import android.os.Message;
+
+public class Wlan6Keygen extends KeygenThread {
+
+ public Wlan6Keygen(Handler h, Resources res) {
+ super(h, res);
+ }
+
+ public void run()
+ {
+ if ( router == null )
+ return;
+ if ( router.getMac().equals("") )
+ {
+ handler.sendMessage(Message.obtain(handler, ERROR_MSG ,
+ resources.getString(R.string.msg_nomac)));
+ return;
+ }
+ String ssidStr = router.getSSIDsubpart();
+ String macStr = router.mac;
+ char [] ssidSubPart = {'1', '2','3', '4', '5','6' };/*These values are not revelant.*/
+ char [] bssidLastByte = { '6', '6' };
+ ssidSubPart[0] = ssidStr.charAt(0);
+ ssidSubPart[1] = ssidStr.charAt(1);
+ ssidSubPart[2] = ssidStr.charAt(2);
+ ssidSubPart[3] = ssidStr.charAt(3);
+ ssidSubPart[4] = ssidStr.charAt(4);
+ ssidSubPart[5] = ssidStr.charAt(5);
+ bssidLastByte[0] = macStr.charAt(15);
+ bssidLastByte[1] = macStr.charAt(16);
+ for ( int k = 0; k < 6 ; ++k )
+ if( ssidSubPart[k] >= 'A')
+ ssidSubPart[k] = (char)(ssidSubPart[k] - 55);
+
+ if(bssidLastByte[0] >= 'A' )
+ bssidLastByte[0] = (char)(bssidLastByte[0] - 55);
+ if(bssidLastByte[1] >= 'A' )
+ bssidLastByte[1] = (char)(bssidLastByte[1] - 55);
+
+ for ( int i = 0; i < 10 ; ++i )
+ {
+ /*Do not change the order of this instructions*/
+ int aux = i + ( ssidSubPart[3] & 0xf ) + ( bssidLastByte[0] & 0xf ) + ( bssidLastByte[1] & 0xf );
+ int aux1 = ( ssidSubPart[1] & 0xf ) + ( ssidSubPart[2] & 0xf ) + ( ssidSubPart[4] & 0xf ) + ( ssidSubPart[5] & 0xf );
+ int second = aux ^ ( ssidSubPart[5] & 0xf );
+ int sixth = aux ^ ( ssidSubPart[4] & 0xf );
+ int tenth = aux ^ ( ssidSubPart[3] & 0xf );
+ int third = aux1 ^ ( ssidSubPart[2] & 0xf );
+ int seventh = aux1 ^ ( bssidLastByte[0] & 0xf );
+ int eleventh = aux1 ^ ( bssidLastByte[1] & 0xf );
+ int fourth = ( bssidLastByte[0] & 0xf ) ^ ( ssidSubPart[5] & 0xf );
+ int eighth = ( bssidLastByte[1] & 0xf ) ^ ( ssidSubPart[4] & 0xf );
+ int twelfth = aux ^ aux1;
+ int fifth = second ^ eighth;
+ int ninth = seventh ^ eleventh;
+ int thirteenth = third ^ tenth;
+ int first = twelfth ^ sixth;
+ String key = Integer.toHexString(first & 0xf) + Integer.toHexString(second & 0xf)+
+ Integer.toHexString(third & 0xf) + Integer.toHexString(fourth & 0xf) +
+ Integer.toHexString(fifth & 0xf) + Integer.toHexString(sixth & 0xf) +
+ Integer.toHexString(seventh & 0xf) + Integer.toHexString(eighth & 0xf) +
+ Integer.toHexString(ninth & 0xf) + Integer.toHexString(tenth & 0xf) +
+ Integer.toHexString(eleventh & 0xf) + Integer.toHexString(twelfth & 0xf) +
+ Integer.toHexString(thirteenth & 0xf);
+
+ pwList.add(key.toUpperCase());
+ }
+ handler.sendEmptyMessage(RESULTS_READY);
+ if ( ( ( ssidSubPart[0] != macStr.charAt(10) ) || ( ssidSubPart[1] != macStr.charAt(12) ) ||( ssidSubPart[2] != macStr.charAt(13) ) )
+ && !router.ssid.startsWith("WiFi"))
+ {
+ handler.sendMessage(Message.obtain(handler, ERROR_MSG ,
+ resources.getString(R.string.msg_err_essid_no_match)));
+ }
+ return;
+ }
+
+
+}
diff --git a/icon/high.xcf b/icon/high.xcf
new file mode 100644
index 0000000..c93dd1f
Binary files /dev/null and b/icon/high.xcf differ
diff --git a/icon/high_resolution.png b/icon/high_resolution.png
new file mode 100644
index 0000000..a611f71
Binary files /dev/null and b/icon/high_resolution.png differ
diff --git a/icon/icon.svg b/icon/icon.svg
new file mode 100644
index 0000000..47097d0
--- /dev/null
+++ b/icon/icon.svg
@@ -0,0 +1,349 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/icon/low.xcf b/icon/low.xcf
new file mode 100644
index 0000000..fb98653
Binary files /dev/null and b/icon/low.xcf differ
diff --git a/icon/medium.xcf b/icon/medium.xcf
new file mode 100644
index 0000000..a819d6f
Binary files /dev/null and b/icon/medium.xcf differ
diff --git a/qt/alice/alice.xml b/qt/alice/alice.xml
new file mode 100644
index 0000000..0c0f5f5
--- /dev/null
+++ b/qt/alice/alice.xml
@@ -0,0 +1,305 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/qt/alicehandler.cpp b/qt/alicehandler.cpp
new file mode 100644
index 0000000..1d958a4
--- /dev/null
+++ b/qt/alicehandler.cpp
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+#include "alicehandler.h"
+#include
+
+AliceHandler::AliceHandler(QString a) : alice(a)
+{
+
+}
+AliceHandler::~AliceHandler(){
+ // cleanInfo();
+}
+bool AliceHandler::isSupported(){
+ return !this->supportedAlice.isEmpty();
+}
+
+QVector & AliceHandler::getSupportedAlice(){
+ return this->supportedAlice;
+}
+
+
+bool AliceHandler::startElement(const QString & ,
+ const QString & localName ,
+ const QString &,
+ const QXmlAttributes &attributes)
+{
+ int magic[2];
+ QString serial;
+ QString mac;
+ bool status;
+ if ( alice.toLower() == localName.toLower() )
+ {
+ serial = attributes.value("sn");
+ mac = attributes.value("mac");
+ magic[0] = attributes.value("q").toInt(&status, 10);
+ magic[1] = attributes.value("k").toInt(&status, 10);
+ supportedAlice.append(new AliceMagicInfo(alice, magic, serial, mac));
+ }
+
+ return true;
+}
+
+
+bool AliceHandler::fatalError(const QXmlParseException &exception)
+{
+ std::cerr << "Parse error at line " << exception.lineNumber()
+ << ", " << "column " << exception.columnNumber() << ": "
+ << qPrintable(exception.message()) << std::endl;
+ return false;
+}
+bool AliceHandler::readFile(const QString &fileName)
+{
+ if ( !supportedAlice.isEmpty() )
+ cleanInfo();
+ QFile file(fileName);
+ QXmlInputSource inputSource(&file);
+ QXmlSimpleReader reader;
+ reader.setContentHandler(this);
+ reader.setErrorHandler(this);
+ return reader.parse(inputSource);
+}
+
+void AliceHandler::cleanInfo(){
+ for ( int i = 0 ; i < supportedAlice.size();++i )
+ delete supportedAlice.at(i);
+ supportedAlice.clear();
+}
diff --git a/qt/alicehandler.h b/qt/alicehandler.h
new file mode 100644
index 0000000..d3ba7b9
--- /dev/null
+++ b/qt/alicehandler.h
@@ -0,0 +1,33 @@
+#ifndef ALICEHANDLE_H
+#define ALICEHANDLE_H
+#include "alicemagicinfo.h"
+#include
+#include
+
+class AliceHandler : public QXmlDefaultHandler
+{
+ public:
+ AliceHandler(QString alice);
+ ~AliceHandler();
+ bool readFile(const QString &fileName);
+ bool isSupported();
+ QVector & getSupportedAlice();
+ protected:
+ bool startElement(const QString &,
+ const QString &localName,
+ const QString &,
+ const QXmlAttributes &attributes);
+ bool endElement(const QString &,
+ const QString &,
+ const QString &){return true;} /*Not used*/
+ bool characters(const QString &){ return true;}/*Not used*/
+ bool fatalError(const QXmlParseException &exception);
+
+ private:
+ void cleanInfo();
+ QVector supportedAlice;
+ QString alice;
+
+};
+
+#endif // ALICEHANDLE_H
diff --git a/qt/alicekeygen.cpp b/qt/alicekeygen.cpp
new file mode 100644
index 0000000..f2f1863
--- /dev/null
+++ b/qt/alicekeygen.cpp
@@ -0,0 +1,125 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+#include "alicekeygen.h"
+#include "sha256.h"
+AliceKeygen::AliceKeygen(WifiNetwork * router ) : KeygenThread(router){}
+
+
+void AliceKeygen::run(){
+ QString preInitCharset =
+ "0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvWxyz0123";
+ char specialSeq[/*32*/]= {
+ 0x64, 0xC6, 0xDD, 0xE3,
+ 0xE5, 0x79, 0xB6, 0xD9,
+ 0x86, 0x96, 0x8D, 0x34,
+ 0x45, 0xD2, 0x3B, 0x15,
+ 0xCA, 0xAF, 0x12, 0x84,
+ 0x02, 0xAC, 0x56, 0x00,
+ 0x05, 0xCE, 0x20, 0x75,
+ 0x91, 0x3F, 0xDC, 0xE8};
+
+
+ if ( router == NULL)
+ return;
+ if ( router->getSupportedAlice().isEmpty() )
+ {
+ //TODO
+ return;
+ }
+ SHA256 sha;
+ char hash[32];
+
+ bool status;
+
+ for ( int j = 0 ; j getSupportedAlice().size() ; ++j )
+ {/*For pre AGPF 4.5.0sx*/
+ QString serialStr = router->getSupportedAlice().at(j)->serial + "X";
+ int Q = router->getSupportedAlice().at(j)->magic[0];
+ int k = router->getSupportedAlice().at(j)->magic[1] ;
+ int serial = ( router->getSSIDsubpart().toInt(&status,10) - Q ) / k;
+ QString tmp = "";
+ tmp.setNum(serial);
+ for (int i = 0; i < 7 - tmp.length(); i++){
+ serialStr += "0";
+ }
+ serialStr += tmp;
+
+ char mac[6];
+ QString key = "";
+
+
+ if ( router->getMac().size() == 12 ) {
+
+ for (int i = 0; i < 12; i += 2)
+ mac[i / 2] = (router->getMac().mid(i,1).toInt(&status, 16) << 4)
+ + router->getMac().mid(i + 1,1).toInt(&status, 16);
+
+ /* Compute the hash */
+ sha.reset();
+ sha.addData(specialSeq , sizeof(specialSeq));
+ sha.addData(serialStr.toAscii() , serialStr.size());
+ sha.addData(mac , sizeof(mac));
+ sha.result((unsigned char *) hash);
+
+
+ for ( int i = 0 ; i < 24 ; ++i )
+ {
+ key += preInitCharset.at(hash[i] & 0xFF);
+ }
+ if ( !results.contains(key))
+ results.append(key);
+ }
+
+ /*For post AGPF 4.5.0sx*/
+ QString macEth = router->getMac().left(6);
+ int extraNumber = 0;
+ while ( extraNumber <= 9 )
+ {
+ QString calc = "";
+ calc.setNum( extraNumber );
+ calc += router->getSSIDsubpart();
+ calc.setNum( calc.toInt(&status , 10) , 16);
+ calc = calc.toUpper();
+ if ( macEth.at(5) == calc.at(0))
+ {
+ macEth += calc.right(6);
+ break;
+ }
+ extraNumber++;
+ }
+
+ for (int i = 0; i < 12; i += 2)
+ mac[i / 2] = (macEth.mid(i,1).toInt(&status, 16) << 4)
+ + macEth.mid(i + 1,1).toInt(&status, 16);
+ /* Compute the hash */
+ sha.reset();
+ sha.addData(specialSeq , sizeof(specialSeq));
+ sha.addData(serialStr.toAscii() , serialStr.size());
+ sha.addData(mac , sizeof(mac));
+ sha.result((unsigned char *) hash);
+
+ key = "";
+ for ( int i = 0 ; i < 24 ; ++i )
+ key += preInitCharset.at(hash[i] & 0xFF);
+ if ( !results.contains(key))
+ results.append(key);
+ }
+ return;
+
+}
diff --git a/qt/alicekeygen.h b/qt/alicekeygen.h
new file mode 100644
index 0000000..7d80702
--- /dev/null
+++ b/qt/alicekeygen.h
@@ -0,0 +1,13 @@
+#ifndef ALICEKEYGEN_H
+#define ALICEKEYGEN_H
+#include "keygenthread.h"
+
+
+class AliceKeygen : public KeygenThread
+{
+ public:
+ AliceKeygen(WifiNetwork * router );
+ void run();
+};
+
+#endif // ALICEKEYGEN_H
diff --git a/qt/alicemagicinfo.cpp b/qt/alicemagicinfo.cpp
new file mode 100644
index 0000000..ba45824
--- /dev/null
+++ b/qt/alicemagicinfo.cpp
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+#include "alicemagicinfo.h"
+
+AliceMagicInfo::AliceMagicInfo( QString a , int ma[2] , QString s , QString m ) :
+ alice(a) , serial(s) , mac(m)
+{
+ this->magic[0] = ma[0];
+ this->magic[1] = ma[1];
+}
diff --git a/qt/alicemagicinfo.h b/qt/alicemagicinfo.h
new file mode 100644
index 0000000..54e4acf
--- /dev/null
+++ b/qt/alicemagicinfo.h
@@ -0,0 +1,14 @@
+#ifndef ALICEMAGICINFO_H
+#define ALICEMAGICINFO_H
+#include
+
+struct AliceMagicInfo
+{
+ QString alice;
+ int magic[2];
+ QString serial;
+ QString mac;
+ AliceMagicInfo( QString alice , int magic[2] , QString serial , QString mac );
+};
+
+#endif // ALICEMAGICINFO_H
diff --git a/qt/discuskeygen.cpp b/qt/discuskeygen.cpp
new file mode 100644
index 0000000..d298859
--- /dev/null
+++ b/qt/discuskeygen.cpp
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+#include "discuskeygen.h"
+
+DiscusKeygen::DiscusKeygen(WifiNetwork * router ) : KeygenThread(router){}
+
+void DiscusKeygen::run(){
+ bool status;
+ unsigned int routerSSIDint = router->getSSIDsubpart().toInt( &status , 16);
+ if ( !status )
+ return;
+ QString result;
+ result.setNum((routerSSIDint- 0xD0EC31)>>2);
+ result = "YW0" + result;
+ results.append(result);
+}
diff --git a/qt/discuskeygen.h b/qt/discuskeygen.h
new file mode 100644
index 0000000..7a2e3c2
--- /dev/null
+++ b/qt/discuskeygen.h
@@ -0,0 +1,12 @@
+#ifndef DISCUSKEYGEN_H
+#define DISCUSKEYGEN_H
+#include "keygenthread.h"
+
+class DiscusKeygen : public KeygenThread
+{
+ public:
+ DiscusKeygen(WifiNetwork * router );
+ void run();
+};
+
+#endif // DISCUSKEYGEN_H
diff --git a/qt/division.c b/qt/division.c
new file mode 100644
index 0000000..92f0745
--- /dev/null
+++ b/qt/division.c
@@ -0,0 +1,21 @@
+// This code was suggested by Julian Brown from CodeSourcery. It is in public domain.
+ // Many thanks!
+
+
+ #if __GCCE__
+// #if __SERIES60_32__
+ extern unsigned int __aeabi_uidivmod(unsigned numerator, unsigned denominator);
+ int __aeabi_idiv(int numerator, int denominator)
+ {
+ int neg_result = (numerator ^ denominator) & 0x80000000;
+ int result = __aeabi_uidivmod ((numerator < 0) ? -numerator : numerator, (denominator < 0) ? -denominator : denominator);
+ return neg_result ? -result : result;
+ }
+ unsigned __aeabi_uidiv(unsigned numerator, unsigned denominator)
+ {
+ return __aeabi_uidivmod (numerator, denominator);
+ }
+ #endif // __SERIES60_30__
+ //#endif // __GCCE__
+
+
diff --git a/qt/dlinkkeygen.cpp b/qt/dlinkkeygen.cpp
new file mode 100644
index 0000000..f22b863
--- /dev/null
+++ b/qt/dlinkkeygen.cpp
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+#include "dlinkkeygen.h"
+
+DlinkKeygen::DlinkKeygen(WifiNetwork * router ) : KeygenThread(router){}
+
+void DlinkKeygen::run(){
+ char hash[] = {
+ 'X', 'r', 'q', 'a', 'H', 'N',
+ 'p', 'd', 'S', 'Y', 'w',
+ '8', '6', '2', '1', '5'};
+
+ if ( router->getMac().size() < 12 )
+ {
+ return;
+ }
+ char * key = new char[21];
+ QString mac = router->getMac();
+ key[0]=mac.at(11).toAscii();
+ key[1]=mac.at(0).toAscii();
+
+ key[2]=mac.at(10).toAscii();
+ key[3]=mac.at(1).toAscii();
+
+ key[4]=mac.at(9).toAscii();
+ key[5]=mac.at(2).toAscii();
+
+ key[6]=mac.at(8).toAscii();
+ key[7]=mac.at(3).toAscii();
+
+ key[8]=mac.at(7).toAscii();
+ key[9]=mac.at(4).toAscii();
+
+ key[10]=mac.at(6).toAscii();
+ key[11]=mac.at(5).toAscii();
+
+ key[12]=mac.at(1).toAscii();
+ key[13]=mac.at(6).toAscii();
+
+ key[14]=mac.at(8).toAscii();
+ key[15]=mac.at(9).toAscii();
+
+ key[16]=mac.at(11).toAscii();
+ key[17]=mac.at(2).toAscii();
+
+ key[18]=mac.at(4).toAscii();
+ key[19]=mac.at(10).toAscii();
+ char * newkey = new char[20];
+ char t;
+ int index = 0;
+ for (int i=0; i < 20 ; i++)
+ {
+ t=key[i];
+ if ((t >= '0') && (t <= '9'))
+ index = t-'0';
+ else
+ {
+ t= QChar::toUpper((ushort)t);
+ if ((t >= 'A') && (t <= 'F'))
+ index = t-'A'+10;
+ else
+ {
+ return;
+ }
+ }
+ newkey[i]=hash[index];
+ }
+ newkey[21] = '\0';
+ results.append(QString(newkey));
+ delete [] newkey;
+ delete [] key;
+}
diff --git a/qt/dlinkkeygen.h b/qt/dlinkkeygen.h
new file mode 100644
index 0000000..420fa0f
--- /dev/null
+++ b/qt/dlinkkeygen.h
@@ -0,0 +1,12 @@
+#ifndef DLINKKEYGEN_H
+#define DLINKKEYGEN_H
+#include "keygenthread.h"
+
+class DlinkKeygen : public KeygenThread
+{
+public:
+ DlinkKeygen(WifiNetwork * router );
+ void run();
+};
+
+#endif // DLINKKEYGEN_H
diff --git a/qt/eircomkeygen.cpp b/qt/eircomkeygen.cpp
new file mode 100644
index 0000000..738cb13
--- /dev/null
+++ b/qt/eircomkeygen.cpp
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+#include "eircomkeygen.h"
+#include
+EircomKeygen::EircomKeygen( WifiNetwork * router ) : KeygenThread(router){}
+
+
+void EircomKeygen::run(){
+
+ if ( router == NULL)
+ return;
+ if ( router->getMac().size() != 12 )
+ {
+ //TODO:error messages
+ return;
+ }
+ bool status = false;
+ QString result = "Although your world wonders me, ";
+ if ( !status )
+ {
+ //TODO:error messages
+ return;
+ }
+ result = QString::fromAscii(QCryptographicHash::hash(
+ result.toAscii() ,
+ QCryptographicHash::Sha1 )
+ .toHex().data());
+ result.truncate(26);
+ results.append(result);
+ return;
+}
+ QString EircomKeygen::dectoString( int mac){
+ QByteArray ret;
+ while ( mac > 0 ){
+ switch (mac %10){
+ case 0: ret.prepend("Zero");
+ break;
+ case 1: ret.prepend("One");
+ break;
+ case 2: ret.prepend("Two");
+ break;
+ case 3: ret.prepend("Three");
+ break;
+ case 4: ret.prepend("Four");
+ break;
+ case 5: ret.prepend("Five");
+ break;
+ case 6: ret.prepend("Six");
+ break;
+ case 7: ret.prepend("Seven");
+ break;
+ case 8: ret.prepend("Eight");
+ break;
+ case 9: ret.prepend("Nine");
+ break;
+ }
+ // mac /=10;
+ }
+ return ret;
+}
diff --git a/qt/eircomkeygen.h b/qt/eircomkeygen.h
new file mode 100644
index 0000000..624362a
--- /dev/null
+++ b/qt/eircomkeygen.h
@@ -0,0 +1,16 @@
+#ifndef EIRCOMKEYGEN_H
+#define EIRCOMKEYGEN_H
+#include "keygenthread.h"
+
+class EircomKeygen : public KeygenThread
+{
+ Q_OBJECT
+ private:
+ QString dectoString( int mac);
+
+ public:
+ EircomKeygen(WifiNetwork * router );
+ void run();
+};
+
+#endif // EIRCOMKEYGEN_H
diff --git a/qt/huaweikeygen.cpp b/qt/huaweikeygen.cpp
new file mode 100644
index 0000000..e5ed099
--- /dev/null
+++ b/qt/huaweikeygen.cpp
@@ -0,0 +1,142 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+#include "huaweikeygen.h"
+
+HuaweiKeygen::HuaweiKeygen( WifiNetwork * router ) : KeygenThread(router){}
+
+void HuaweiKeygen::run(){
+ int a0[]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+ int a1[]= {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
+ int a2[]= {0,13,10,7,5,8,15,2,10,7,0,13,15,2,5,8};
+ int a3[]= {0,1,3,2,7,6,4,5,15,14,12,13,8,9,11,10};
+ // int a4[]= {0,5,11,14,7,2,12,9,15,10,4,1,8,13,3,6};
+ int a5[]= {0,4,8,12,0,4,8,12,0,4,8,12,0,4,8,12};
+ // int a6[]= {0,1,3,2,6,7,5,4,12,13,15,14,10,11,9,8};
+ int a7[]= {0,8,0,8,1,9,1,9,2,10,2,10,3,11,3,11};
+ int a8[]= {0,5,11,14,6,3,13,8,12,9,7,2,10,15,1,4};
+ // int a9[]= {0,9,2,11,5,12,7,14,10,3,8,1,15,6,13,4};
+ int a10[]= {0,14,13,3,11,5,6,8,6,8,11,5,13,3,0,14};
+ // int a11[]= {0,12,8,4,1,13,9,5,2,14,10,6,3,15,11,7};
+ // int a12[]= {0,4,9,13,2,6,11,15,4,0,13,9,6,2,15,11};
+ // int a13[]= {0,8,1,9,3,11,2,10,6,14,7,15,5,13,4,12};
+ int a14[]= {0,1,3,2,7,6,4,5,14,15,13,12,9,8,10,11};
+ int a15[]= {0,1,3,2,6,7,5,4,13,12,14,15,11,10,8,9};
+ // int n1[]= {0,14,10,4,8,6,2,12,0,14,10,4,8,6,2,12};
+ // int n2[]= {0,8,0,8,3,11,3,11,6,14,6,14,5,13,5,13};
+ // int n3[]= {0,0,3,3,2,2,1,1,4,4,7,7,6,6,5,5};
+ // int n4[]= {0,11,12,7,15,4,3,8,14,5,2,9,1,10,13,6};
+ int n5[]= {0,5,1,4,6,3,7,2,12,9,13,8,10,15,11,14};
+ int n6[]= {0,14,4,10,11,5,15,1,6,8,2,12,13,3,9,7};
+ int n7[]= {0,9,0,9,5,12,5,12,10,3,10,3,15,6,15,6};
+ // int n8[]= {0,5,11,14,2,7,9,12,12,9,7,2,14,11,5,0};
+ // int n9[]= {0,0,0,0,4,4,4,4,0,0,0,0,4,4,4,4};
+ // int n10[]= {0,8,1,9,3,11,2,10,5,13,4,12,6,14,7,15};
+ int n11[]= {0,14,13,3,9,7,4,10,6,8,11,5,15,1,2,12};
+ int n12[]= {0,13,10,7,4,9,14,3,10,7,0,13,14,3,4,9};
+ int n13[]= {0,1,3,2,6,7,5,4,15,14,12,13,9,8,10,11};
+ int n14[]= {0,1,3,2,4,5,7,6,12,13,15,14,8,9,11,10};
+ /* int n15[]= {0,6,12,10,9,15,5,3,2,4,14,8,11,13,7,1};
+ int n16[]= {0,11,6,13,13,6,11,0,11,0,13,6,6,13,0,11};
+ int n17[]= {0,12,8,4,1,13,9,5,3,15,11,7,2,14,10,6};
+ int n18[]= {0,12,9,5,2,14,11,7,5,9,12,0,7,11,14,2};
+ int n19[]= {0,6,13,11,10,12,7,1,5,3,8,14,15,9,2,4};
+ int n20[]= {0,9,3,10,7,14,4,13,14,7,13,4,9,0,10,3};
+ int n21[]= {0,4,8,12,1,5,9,13,2,6,10,14,3,7,11,15};
+ int n22[]= {0,1,2,3,5,4,7,6,11,10,9,8,14,15,12,13};
+ int n23[]= {0,7,15,8,14,9,1,6,12,11,3,4,2,5,13,10};
+ int n24[]= {0,5,10,15,4,1,14,11,8,13,2,7,12,9,6,3};
+ int n25[]= {0,11,6,13,13,6,11,0,10,1,12,7,7,12,1,10};
+ int n26[]= {0,13,10,7,4,9,14,3,8,5,2,15,12,1,6,11};
+ int n27[]= {0,4,9,13,2,6,11,15,5,1,12,8,7,3,14,10};
+ int n28[]= {0,14,12,2,8,6,4,10,0,14,12,2,8,6,4,10};
+ int n29[]= {0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3};
+ int n30[]= {0,15,14,1,12,3,2,13,8,7,6,9,4,11,10,5};*/
+ int n31[]= {0,10,4,14,9,3,13,7,2,8,6,12,11,1,15,5};
+ // int n32[]= {0,10,5,15,11,1,14,4,6,12,3,9,13,7,8,2};
+ // int n33[]= {0,4,9,13,3,7,10,14,7,3,14,10,4,0,13,9};
+ int key[]= {30,31,32,33,34,35,36,37,38,39,61,62,63,64,65,66};
+ //char ssid[]= {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
+ if ( router == NULL)
+ return;
+ if ( router->getMac().size() != 12 )
+ {
+ //TODO
+ return;
+ }
+ int mac[12];
+ bool status;
+ for ( int i = 0 ; i < 12 ; ++i)
+ {
+ mac[i] = router->getMac().mid(i, 1).toInt(&status, 16);
+ if ( !status )
+ return; //TODO
+ }
+ /* int s1=(n1[mac[0]])^(a4[mac[1]])^(a6[mac[2]])^(a1[mac[3]])^(a11[mac[4]])^
+ (n20[mac[5]])^(a10[mac[6]])^(a4[mac[7]])^(a8[mac[8]])^(a2[mac[9]])^
+ (a5[mac[10]])^(a9[mac[11]])^5;
+ int s2=(n2[mac[0]])^(n8[mac[1]])^(n15[mac[2]])^(n17[mac[3]])^(a12[mac[4]])^
+ (n21[mac[5]])^(n24[mac[6]])^(a9[mac[7]])^(n27[mac[8]])^(n29[mac[9]])^
+ (a11[mac[10]])^(n32[mac[11]])^10;
+ int s3=(n3[mac[0]])^(n9[mac[1]])^(a5[mac[2]])^(a9[mac[3]])^(n19[mac[4]])^
+ (n22[mac[5]])^(a12[mac[6]])^(n25[mac[7]])^(a11[mac[8]])^
+ (a13[mac[9]])^(n30[mac[10]])^(n33[mac[11]])^11;
+ int s4=(n4[mac[0]])^(n10[mac[1]])^(n16[mac[2]])^(n18[mac[3]])^(a13[mac[4]])^
+ (n23[mac[5]])^(a1[mac[6]])^(n26[mac[7]])^(n28[mac[8]])^(a3[mac[9]])^
+ (a6[mac[10]])^(a0[mac[11]])^10;
+ // QString ssidFinal = Character.toString(ssid[s1]) + Character.toString(ssid[s2]) +
+ Character.toString(ssid[s3]) + Character.toString(ssid[s4]);
+
+ */
+ int ya=(a2[mac[0]])^(n11[mac[1]])^(a7[mac[2]])^(a8[mac[3]])^(a14[mac[4]])^
+ (a5[mac[5]])^(a5[mac[6]])^(a2[mac[7]])^(a0[mac[8]])^(a1[mac[9]])^
+ (a15[mac[10]])^(a0[mac[11]])^13;
+ int yb=(n5[mac[0]])^(n12[mac[1]])^(a5[mac[2]])^(a7[mac[3]])^(a2[mac[4]])^
+ (a14[mac[5]])^(a1[mac[6]])^(a5[mac[7]])^(a0[mac[8]])^(a0[mac[9]])^
+ (n31[mac[10]])^(a15[mac[11]])^4;
+ int yc=(a3[mac[0]])^(a5[mac[1]])^(a2[mac[2]])^(a10[mac[3]])^(a7[mac[4]])^
+ (a8[mac[5]])^(a14[mac[6]])^(a5[mac[7]])^(a5[mac[8]])^(a2[mac[9]])^
+ (a0[mac[10]])^(a1[mac[11]])^7;
+ int yd=(n6[mac[0]])^(n13[mac[1]])^(a8[mac[2]])^(a2[mac[3]])^(a5[mac[4]])^
+ (a7[mac[5]])^(a2[mac[6]])^(a14[mac[7]])^(a1[mac[8]])^(a5[mac[9]])^
+ (a0[mac[10]])^(a0[mac[11]])^14;
+ int ye=(n7[mac[0]])^(n14[mac[1]])^(a3[mac[2]])^(a5[mac[3]])^(a2[mac[4]])^
+ (a10[mac[5]])^(a7[mac[6]])^(a8[mac[7]])^(a14[mac[8]])^(a5[mac[9]])^
+ (a5[mac[10]])^(a2[mac[11]])^7;
+ QString num , keyString ="";
+ num.setNum(key[ya]);
+ keyString += num;
+ num.setNum(key[yb]);
+ keyString += num;
+ num.setNum(key[yc]);
+ keyString += num;
+ num.setNum(key[yd]);
+ keyString += num;
+ num.setNum(key[ye]);
+ keyString += num;
+ results.append(keyString);
+/* if ( !router.getSSIDsubpart().equalsIgnoreCase(ssidFinal) &&
+ router.ssid.startsWith("INFINITUM") )
+ {
+
+ handler.sendMessage(Message.obtain(handler, ERROR_MSG ,
+ resources.getString(R.string.msg_err_essid_no_match)));
+ }*/
+ return;
+
+}
diff --git a/qt/huaweikeygen.h b/qt/huaweikeygen.h
new file mode 100644
index 0000000..610a3b5
--- /dev/null
+++ b/qt/huaweikeygen.h
@@ -0,0 +1,12 @@
+#ifndef HUAWEIKEYGEN_H
+#define HUAWEIKEYGEN_H
+#include "keygenthread.h"
+
+class HuaweiKeygen : public KeygenThread
+{
+ public:
+ HuaweiKeygen(WifiNetwork * router );
+ void run();
+};
+
+#endif // HUAWEIKEYGEN_H
diff --git a/qt/images/icon.png b/qt/images/icon.png
new file mode 100644
index 0000000..257f45b
Binary files /dev/null and b/qt/images/icon.png differ
diff --git a/qt/infostradakeygen.cpp b/qt/infostradakeygen.cpp
new file mode 100644
index 0000000..355e6c9
--- /dev/null
+++ b/qt/infostradakeygen.cpp
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+#include "infostradakeygen.h"
+
+InfostradaKeygen::InfostradaKeygen( WifiNetwork * router ) : KeygenThread(router){}
+
+void InfostradaKeygen::run(){
+
+ if ( router == NULL)
+ return;
+ if ( router->getMac().size() != 12 )
+ {
+ //TODO:error messages
+ return;
+ }
+ results.append("2"+router->getMac().toUpper());
+ return;
+}
diff --git a/qt/infostradakeygen.h b/qt/infostradakeygen.h
new file mode 100644
index 0000000..3143c4e
--- /dev/null
+++ b/qt/infostradakeygen.h
@@ -0,0 +1,12 @@
+#ifndef INFOSTRADAKEYGEN_H
+#define INFOSTRADAKEYGEN_H
+#include "keygenthread.h"
+
+class InfostradaKeygen : public KeygenThread
+{
+ public:
+ InfostradaKeygen(WifiNetwork * router );
+ void run();
+};
+
+#endif // INFOSTRADAKEYGEN_H
diff --git a/qt/keygenthread.cpp b/qt/keygenthread.cpp
new file mode 100644
index 0000000..dee466d
--- /dev/null
+++ b/qt/keygenthread.cpp
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+#include "keygenthread.h"
+
+KeygenThread::KeygenThread( WifiNetwork * r ) : router(r), stopRequested(false)
+{
+}
+
+QVector KeygenThread::getResults() const{
+ return this->results;
+}
+
+void KeygenThread::stop(){
+ stopRequested = true;
+}
+
+bool KeygenThread::isStopped(){
+ return this->stopRequested ;
+ }
diff --git a/qt/keygenthread.h b/qt/keygenthread.h
new file mode 100644
index 0000000..7348998
--- /dev/null
+++ b/qt/keygenthread.h
@@ -0,0 +1,24 @@
+#ifndef KEYGENTHREAD_H
+#define KEYGENTHREAD_H
+#include
+#include
+#include
+#include "wifinetwork.h"
+
+class KeygenThread : public QThread
+{
+ public:
+ KeygenThread( WifiNetwork * router );
+ QVector getResults() const;
+ void stop();
+ bool isStopped();
+ protected:
+ QCryptographicHash * hash;
+ QVector results;
+ WifiNetwork * router;
+ bool stopRequested;
+
+
+};
+
+#endif // KEYGENTHREAD_H
diff --git a/qt/main.cpp b/qt/main.cpp
new file mode 100644
index 0000000..8983672
--- /dev/null
+++ b/qt/main.cpp
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+#include
+#include "routerkeygen.h"
+
+int main(int argc, char *argv[])
+{
+ QApplication a(argc, argv);
+ RouterKeygen w;
+#if defined(Q_WS_S60)
+ w.showMaximized();
+#else
+ w.show();
+#endif
+
+ return a.exec();
+}
diff --git a/qt/onokeygen.cpp b/qt/onokeygen.cpp
new file mode 100644
index 0000000..b14ef94
--- /dev/null
+++ b/qt/onokeygen.cpp
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+#include "onokeygen.h"
+
+OnoKeygen::OnoKeygen(WifiNetwork * router ) : KeygenThread(router){}
+
+
+void OnoKeygen::run(){
+ if ( router == NULL)
+ return;
+ if ( router->getSSID().size() != 13 )
+ {
+ //TODO
+ return;
+ }
+ QString val = "";
+ val.setNum(router->getSSID().at(12).digitValue() + 1, 10);
+ if ( val.size() < 2 )
+ val = router->getSSID().left(11) + "0" + val;
+ else
+ val = router->getSSID().left(11) + val;
+ int pseed[4];
+ pseed[0] = 0;
+ pseed[1] = 0;
+ pseed[2] = 0;
+ pseed[3] = 0;
+ int randNumber = 0;
+ for (int i = 0; i < val.length(); i++)
+ {
+ pseed[i%4] ^= (int) val.at(i).toAscii();
+ }
+ randNumber = pseed[0] | (pseed[1] << 8) | (pseed[2] << 16) | (pseed[3] << 24);
+ short tmp = 0;
+ QString key = "", aux= "";
+
+ for (int j = 0; j < 5; j++)
+ {
+ randNumber = (randNumber * 0x343fd + 0x269ec3) & 0xffffffff;
+ tmp = (short) ((randNumber >> 16) & 0xff);
+ aux.setNum(tmp,16);
+ key += aux.toUpper();
+ }
+ results.append(key);
+ key = QString::fromAscii(QCryptographicHash::hash(
+ padto64(val).toAscii() ,
+ QCryptographicHash::Md5 )
+ .toHex().data());
+ key.truncate(26);
+ results.append(key.toUpper());
+ return;
+}
+
+
+QString OnoKeygen::padto64( QString val ){
+ if ( val == "" )
+ return "";
+ QString ret = "";
+ for ( int i = 0; i < ( 1 + (64 / (val.length())) ) ; ++i)
+ ret += val;
+ return ret.left(64);
+}
diff --git a/qt/onokeygen.h b/qt/onokeygen.h
new file mode 100644
index 0000000..d9c4ee5
--- /dev/null
+++ b/qt/onokeygen.h
@@ -0,0 +1,14 @@
+#ifndef ONOKEYGEN_H
+#define ONOKEYGEN_H
+#include "keygenthread.h"
+
+class OnoKeygen : public KeygenThread
+{
+ private:
+ QString padto64( QString val );
+ public:
+ OnoKeygen(WifiNetwork * router );
+ void run();
+};
+
+#endif // ONOKEYGEN_H
diff --git a/qt/pirellikeygen.cpp b/qt/pirellikeygen.cpp
new file mode 100644
index 0000000..a7950ea
--- /dev/null
+++ b/qt/pirellikeygen.cpp
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+#include "pirellikeygen.h"
+
+PirelliKeygen::PirelliKeygen(WifiNetwork * router ) : KeygenThread(router){
+ this->hash = new QCryptographicHash(QCryptographicHash::Md5);
+}
+
+void PirelliKeygen::run(){
+ char saltMD5[] = {
+ 0x22, 0x33, 0x11, 0x34, 0x02,
+ 0x81, 0xFA, 0x22, 0x11, 0x41,
+ 0x68, 0x11, 0x12, 0x01, 0x05,
+ 0x22, 0x71, 0x42, 0x10, 0x66 };
+ bool status;
+ char macBytes[6];
+ for (int i = 0; i < 12; i += 2)
+ macBytes[i / 2] = (router->getSSIDsubpart().mid(i,1).toInt(&status, 16) << 4)
+ + router->getSSIDsubpart().mid(i + 1,1).toInt(&status, 16);
+ if ( !status )
+ return;
+ hash->reset();
+ hash->addData(macBytes,6);
+ hash->addData(saltMD5 , 20);
+ QByteArray resultHash = hash->result();
+ char key[5];
+ /*Grouping in five groups fo five bits*/
+ key[0] = ( resultHash.at(0) & 0xF8) >> 3 ;
+ key[1] = ( (resultHash.at(0) & 0x07) << 2) | ( (resultHash.at(1)& 0xC0) >>6 );
+ key[2] = ( resultHash.at(1) & 0x3E) >> 1;
+ key[3] = ( ( resultHash.at(1) & 0x01) << 4) | ((resultHash.at(2) & 0xF0) >> 4);
+ key[4] = ( (resultHash.at(2) & 0x0F) << 1) | ((resultHash.at(3) & 0x80) >> 7);
+ for ( int i = 0 ; i < 5 ; ++i )
+ if ( key[i] >= 0x0A )
+ key[i] += 0x57;
+ results.append(QString::fromAscii( QByteArray(key,5).toHex().data() ) );
+}
diff --git a/qt/pirellikeygen.h b/qt/pirellikeygen.h
new file mode 100644
index 0000000..5835a53
--- /dev/null
+++ b/qt/pirellikeygen.h
@@ -0,0 +1,12 @@
+#ifndef PIRELLIKEYGEN_H
+#define PIRELLIKEYGEN_H
+#include "keygenthread.h"
+
+class PirelliKeygen : public KeygenThread
+{
+ public:
+ PirelliKeygen(WifiNetwork * router );
+ void run();
+};
+
+#endif // PIRELLIKEYGEN_H
diff --git a/qt/resources.qrc b/qt/resources.qrc
new file mode 100644
index 0000000..49e63a8
--- /dev/null
+++ b/qt/resources.qrc
@@ -0,0 +1,6 @@
+
+
+ alice/alice.xml
+ images/icon.png
+
+
diff --git a/qt/rkqt.pro b/qt/rkqt.pro
new file mode 100644
index 0000000..7c34587
--- /dev/null
+++ b/qt/rkqt.pro
@@ -0,0 +1,75 @@
+#-------------------------------------------------
+#
+# Project created by QtCreator 2011-04-12T00:20:13
+#
+#-------------------------------------------------
+
+QT += core gui xml
+
+TARGET = RouterKeygen
+TEMPLATE = app
+
+
+SOURCES += main.cpp\
+ routerkeygen.cpp \
+ keygenthread.cpp \
+ wifinetwork.cpp \
+ alicehandler.cpp \
+ alicemagicinfo.cpp\
+ discuskeygen.cpp \
+ wlan6keygen.cpp \
+ wlan4keygen.cpp \
+ wlan2keygen.cpp\
+ verizonkeygen.cpp \
+ thomsonkeygen.cpp \
+ telseykeygen.cpp \
+ tecomkeygen.cpp \
+ skyv1keygen.cpp \
+ sha256.cpp \
+ pirellikeygen.cpp \
+ onokeygen.cpp \
+ infostradakeygen.cpp \
+ huaweikeygen.cpp \
+ eircomkeygen.cpp \
+ dlinkkeygen.cpp \
+ alicekeygen.cpp\
+ division.c
+
+
+HEADERS += routerkeygen.h \
+ keygenthread.h \
+ wifinetwork.h \
+ alicehandler.h \
+ alicemagicinfo.h \
+ discuskeygen.h \
+ wlan6keygen.h \
+ wlan4keygen.h \
+ wlan2keygen.h \
+ verizonkeygen.h \
+ thomsonkeygen.h \
+ unknown.h \
+ telseykeygen.h \
+ tecomkeygen.h \
+ skyv1keygen.h \
+ sha256.h \
+ pirellikeygen.h \
+ onokeygen.h \
+ infostradakeygen.h \
+ huaweikeygen.h \
+ eircomkeygen.h \
+ dlinkkeygen.h \
+ alicekeygen.h
+
+FORMS += routerkeygen.ui
+
+symbian {
+ TARGET.UID3 = 0xed94ef91
+ QMAKE_CXXFLAGS.GCCE -= -fvisibility-inlines-hidden
+ #other fix for the other option here: http://wiki.forum.nokia.com/index.php/How_to_use_GCCE_and_Open_C
+ # TARGET.CAPABILITY +=
+ TARGET.EPOCSTACKSIZE = 0x14000
+ TARGET.EPOCHEAPSIZE = 0x020000 0x800000
+}
+
+RESOURCES += \
+ resources.qrc
diff --git a/qt/routerkeygen.cpp b/qt/routerkeygen.cpp
new file mode 100644
index 0000000..d6bd734
--- /dev/null
+++ b/qt/routerkeygen.cpp
@@ -0,0 +1,162 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+#include "routerkeygen.h"
+#include "ui_routerkeygen.h"
+#include
+#include "tecomkeygen.h"
+#include "thomsonkeygen.h"
+#include "verizonkeygen.h"
+#include "infostradakeygen.h"
+#include "eircomkeygen.h"
+#include "skyv1keygen.h"
+#include "wlan2keygen.h"
+#include "wlan4keygen.h"
+#include "wlan6keygen.h"
+#include "discuskeygen.h"
+#include "dlinkkeygen.h"
+#include "pirellikeygen.h"
+#include "telseykeygen.h"
+#include "onokeygen.h"
+#include "huaweikeygen.h"
+#include "alicekeygen.h"
+#include
+#include
+
+RouterKeygen::RouterKeygen(QWidget *parent) :
+ QMainWindow(parent),
+ ui(new Ui::RouterKeygen)
+{
+ ui->setupUi(this);
+ connect( ui->calcButton , SIGNAL( clicked() ), this , SLOT( calculateKeys() ) );
+ this->setWindowIcon(QIcon(":/images/icon.png"));
+ /*Auto-Complete!*/
+ QStringList wordList;
+ wordList << "TECOM-AH4222-" << "TECOM-AH4021-" << "Thomson" << "WLAN" << "WLAN_"
+ << "eircom" << "InfostradaWiFi-" << "SKY" << "DLink-" << "WiFi" << "YaCom"
+ << "Discus--" << "FASTWEB-1-";
+ QCompleter *completer = new QCompleter(wordList, this);
+ completer->setCaseSensitivity(Qt::CaseInsensitive);
+ completer->setModelSorting(QCompleter::CaseInsensitivelySortedModel);
+ ui->inputSSID->setCompleter(completer);
+ this->calculator = NULL;
+ this->router = NULL;
+
+}
+
+RouterKeygen::~RouterKeygen()
+{
+ delete ui;
+ if ( calculator != NULL )
+ {
+ calculator->stop();
+ delete calculator;
+ }
+ delete router;
+}
+
+void RouterKeygen::calculateKeys()
+{//TECOM-AH4222-527A92
+ ///router= new WifiNetwork(ui->inputSSID->text(), "00:1F:90:E2:7E:61");
+ //router= new WifiNetwork(ui->inputSSID->text());
+ if ( calculator != NULL )
+ {
+ if ( calculator->isRunning() )
+ return;
+ }
+ delete router;
+ router= new WifiNetwork(ui->inputSSID->text(), "00:23:8e:48:e7:d4");
+ if ( !router->isSupported() )
+ {
+ ui->listWidget->insertItem(0, "Not supported");
+ return;
+ }
+ switch ( router->getType() )
+ {
+ case WifiNetwork::THOMSON:
+ this->calculator = new ThomsonKeygen(router , false );
+ break;
+ case WifiNetwork::EIRCOM:
+ this->calculator = new EircomKeygen(router);
+ break;
+ case WifiNetwork::VERIZON:
+ this->calculator = new VerizonKeygen(router);
+ break;
+ case WifiNetwork::TECOM:
+ this->calculator = new TecomKeygen(router);
+ break;
+ case WifiNetwork::INFOSTRADA:
+ this->calculator = new InfostradaKeygen(router);
+ break;
+ case WifiNetwork::SKY_V1:
+ this->calculator = new SkyV1Keygen(router);
+ break;
+ case WifiNetwork::WLAN2:
+ this->calculator = new Wlan2Keygen(router);
+ break;
+ case WifiNetwork::WLAN4:
+ this->calculator = new Wlan4Keygen(router);
+ break;
+ case WifiNetwork::WLAN6:
+ this->calculator = new Wlan6Keygen(router);
+ break;
+ case WifiNetwork::DISCUS:
+ this->calculator = new DiscusKeygen(router);
+ break;
+ case WifiNetwork::DLINK:
+ this->calculator = new DlinkKeygen(router);
+ break;
+ case WifiNetwork::PIRELLI:
+ this->calculator = new PirelliKeygen(router);
+ break;
+ case WifiNetwork::TELSEY:
+ this->calculator = new TelseyKeygen(router);
+ break;
+ case WifiNetwork::ONO_WEP:
+ this->calculator = new OnoKeygen(router);
+ break;
+ case WifiNetwork::HUAWEI:
+ this->calculator = new HuaweiKeygen(router);
+ break;
+ case WifiNetwork::ALICE:
+ this->calculator = new AliceKeygen(router);
+ break;
+ default: this->calculator = NULL;
+ break;
+ }
+ if ( this->calculator == NULL )
+ return;
+ connect( this->calculator , SIGNAL( finished() ), this , SLOT( getResults() ) );
+ this->calculator->start();
+}
+
+
+void RouterKeygen::getResults()
+{
+ ui->listWidget->clear();
+ listKeys = this->calculator->getResults();
+ if ( listKeys.isEmpty() )
+ {
+ ui->listWidget->insertItem(0, "No results.");
+ }
+ for ( int i = 0 ; i < listKeys.size() ;++i)
+ ui->listWidget->insertItem(0,listKeys.at(i) );
+ delete calculator;
+ calculator = NULL;
+
+}
diff --git a/qt/routerkeygen.h b/qt/routerkeygen.h
new file mode 100644
index 0000000..d17977a
--- /dev/null
+++ b/qt/routerkeygen.h
@@ -0,0 +1,28 @@
+#ifndef ROUTERKEYGEN_H
+#define ROUTERKEYGEN_H
+#include "keygenthread.h"
+#include "wifinetwork.h"
+#include
+
+namespace Ui {
+ class RouterKeygen;
+}
+
+class RouterKeygen : public QMainWindow
+{
+ Q_OBJECT
+
+public:
+ explicit RouterKeygen(QWidget *parent = 0);
+ ~RouterKeygen();
+public slots:
+ void calculateKeys();
+ void getResults();
+private:
+ Ui::RouterKeygen *ui;
+ KeygenThread * calculator;
+ QVector listKeys;
+ WifiNetwork * router;
+};
+
+#endif // ROUTERKEYGEN_H
diff --git a/qt/routerkeygen.ui b/qt/routerkeygen.ui
new file mode 100644
index 0000000..ce3e50e
--- /dev/null
+++ b/qt/routerkeygen.ui
@@ -0,0 +1,68 @@
+
+
+ RouterKeygen
+
+
+
+ 0
+ 0
+ 288
+ 318
+
+
+
+ RouterKeygen
+
+
+
+
+
+ 10
+ 110
+ 256
+ 192
+
+
+
+
+
+
+ 134
+ 50
+ 91
+ 31
+
+
+
+ Calculate
+
+
+
+
+
+ 100
+ 20
+ 113
+ 20
+
+
+
+
+
+
+ 30
+ 20
+ 46
+ 13
+
+
+
+ SSID:
+
+
+
+
+
+
+
+
diff --git a/qt/sha256.cpp b/qt/sha256.cpp
new file mode 100644
index 0000000..36c9241
--- /dev/null
+++ b/qt/sha256.cpp
@@ -0,0 +1,354 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+/*
+ * sha256.c - Implementation of the Secure Hash Algorithm-256 (SHA-256).
+ *
+ * Implemented from the description on the NIST Web site:
+ * http://csrc.nist.gov/cryptval/shs.html
+ *
+ * Copyright (C) 2002 Southern Storm Software, Pty Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+#include
+#include
+#include "sha256.h"
+
+
+
+/*
+ * Some helper macros for processing 32-bit values, while
+ * being careful about 32-bit vs 64-bit system differences.
+ */
+#if SIZEOF_LONG > 4
+ #define TRUNCLONG(x) ((x) & 0xFFFFFFFF)
+ #define ROTATE(x,n) (TRUNCLONG(((x) >> (n))) | ((x) << (32 - (n))))
+ #define SHIFT(x,n) (TRUNCLONG(((x) >> (n))))
+#else
+ #define TRUNCLONG(x) (x)
+ #define ROTATE(x,n) (((x) >> (n)) | ((x) << (32 - (n))))
+ #define SHIFT(x,n) ((x) >> (n))
+#endif
+
+/*
+ * Helper macros used by the SHA-256 computation.
+ */
+#define CH(x,y,z) (((x) & (y)) ^ (TRUNCLONG(~(x)) & (z)))
+#define MAJ(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
+#define SUM0(x) (ROTATE((x), 2) ^ ROTATE((x), 13) ^ ROTATE((x), 22))
+#define SUM1(x) (ROTATE((x), 6) ^ ROTATE((x), 11) ^ ROTATE((x), 25))
+#define RHO0(x) (ROTATE((x), 7) ^ ROTATE((x), 18) ^ SHIFT((x), 3))
+#define RHO1(x) (ROTATE((x), 17) ^ ROTATE((x), 19) ^ SHIFT((x), 10))
+
+/*
+ * Constants used in each of the SHA-256 rounds.
+ */
+static uint32_t const K[64] = {
+ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
+ 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
+ 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
+ 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
+ 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
+ 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
+ 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
+ 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
+ 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
+ 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
+ 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
+ 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
+ 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
+ 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
+ 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
+ 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
+};
+
+SHA256::SHA256(){
+ this->reset();
+}
+
+void SHA256::reset()
+{
+ this->inputLen = 0;
+ this->A = 0x6a09e667;
+ this->B = 0xbb67ae85;
+ this->C = 0x3c6ef372;
+ this->D = 0xa54ff53a;
+ this->E = 0x510e527f;
+ this->F = 0x9b05688c;
+ this->G = 0x1f83d9ab;
+ this->H = 0x5be0cd19;
+ this->totalLen = 0;
+}
+
+/*
+ * Process a single block of input using the hash algorithm.
+ */
+void SHA256::ProcessBlock(const unsigned char *block)
+{
+ uint32_t W[64];
+ uint32_t a, b, c, d, e, f, g, h;
+ uint32_t temp, temp2;
+ int t;
+
+ /* Unpack the block into 64 32-bit words */
+ for(t = 0; t < 16; ++t)
+ {
+ W[t] = (((uint32_t)(block[t * 4 + 0])) << 24) |
+ (((uint32_t)(block[t * 4 + 1])) << 16) |
+ (((uint32_t)(block[t * 4 + 2])) << 8) |
+ ((uint32_t)(block[t * 4 + 3]));
+ }
+ for(t = 16; t < 64; ++t)
+ {
+ W[t] = TRUNCLONG(RHO1(W[t - 2]) + W[t - 7] +
+ RHO0(W[t - 15]) + W[t - 16]);
+ }
+
+ /* Load the SHA-256 state into local variables */
+ a = this->A;
+ b = this->B;
+ c = this->C;
+ d = this->D;
+ e = this->E;
+ f = this->F;
+ g = this->G;
+ h = this->H;
+
+ /* Perform 64 rounds of hash computations */
+ for(t = 0; t < 64; ++t)
+ {
+ temp = TRUNCLONG(h + SUM1(e) + CH(e, f, g) + K[t] + W[t]);
+ temp2 = TRUNCLONG(SUM0(a) + MAJ(a, b, c));
+ h = g;
+ g = f;
+ f = e;
+ e = TRUNCLONG(d + temp);
+ d = c;
+ c = b;
+ b = a;
+ a = TRUNCLONG(temp + temp2);
+ }
+
+ /* Combine the previous SHA-256 state with the new state */
+ this->A = TRUNCLONG(this->A + a);
+ this->B = TRUNCLONG(this->B + b);
+ this->C = TRUNCLONG(this->C + c);
+ this->D = TRUNCLONG(this->D + d);
+ this->E = TRUNCLONG(this->E + e);
+ this->F = TRUNCLONG(this->F + f);
+ this->G = TRUNCLONG(this->G + g);
+ this->H = TRUNCLONG(this->H + h);
+
+ /* Clear the temporary state */
+ memset(W, 0 , sizeof(uint32_t) * 64);
+ a = b = c = d = e = f = g = h = temp = temp2 = 0;
+}
+
+void SHA256::addData(const void *buffer, unsigned long len)
+{
+ unsigned long templen;
+
+ /* Add to the total length of the input stream */
+ this->totalLen += (uint64_t)len;
+
+ /* Copy the blocks into the input buffer and process them */
+ while(len > 0)
+ {
+ if(!(this->inputLen) && len >= 64)
+ {
+ /* Short cut: no point copying the data twice */
+ ProcessBlock((const unsigned char *)buffer);
+ buffer = (const void *)(((const unsigned char *)buffer) + 64);
+ len -= 64;
+ }
+ else
+ {
+ templen = len;
+ if(templen > (64 - this->inputLen))
+ {
+ templen = 64 - this->inputLen;
+ }
+ memcpy(this->input + this->inputLen, buffer, templen);
+ if((this->inputLen += templen) >= 64)
+ {
+ ProcessBlock(this->input);
+ this->inputLen = 0;
+ }
+ buffer = (const void *)(((const unsigned char *)buffer) + templen);
+ len -= templen;
+ }
+ }
+}
+
+/*
+ * Write a 32-bit big-endian long value to a buffer.
+ */
+void SHA256::WriteLong(unsigned char *buf, uint32_t value)
+{
+ buf[0] = (unsigned char)(value >> 24);
+ buf[1] = (unsigned char)(value >> 16);
+ buf[2] = (unsigned char)(value >> 8);
+ buf[3] = (unsigned char)value;
+}
+
+void SHA256::result( unsigned char hash[SHA256_HASH_SIZE])
+{
+ uint64_t totalBits;
+
+ /* Compute the final hash if necessary */
+ if(hash)
+ {
+ /* Pad the input data to a multiple of 512 bits */
+ if(this->inputLen >= 56)
+ {
+ /* Need two blocks worth of padding */
+ this->input[(this->inputLen)++] = (unsigned char)0x80;
+ while(this->inputLen < 64)
+ {
+ this->input[(this->inputLen)++] = (unsigned char)0x00;
+ }
+ ProcessBlock( this->input);
+ this->inputLen = 0;
+ }
+ else
+ {
+ /* Need one block worth of padding */
+ this->input[(this->inputLen)++] = (unsigned char)0x80;
+ }
+ while(this->inputLen < 56)
+ {
+ this->input[(this->inputLen)++] = (unsigned char)0x00;
+ }
+ totalBits = (this->totalLen << 3);
+ WriteLong(this->input + 56, (uint32_t)(totalBits >> 32));
+ WriteLong(this->input + 60, (uint32_t)totalBits);
+ ProcessBlock( this->input);
+
+ /* Write the final hash value to the supplied buffer */
+ WriteLong(hash, this->A);
+ WriteLong(hash + 4, this->B);
+ WriteLong(hash + 8, this->C);
+ WriteLong(hash + 12, this->D);
+ WriteLong(hash + 16, this->E);
+ WriteLong(hash + 20, this->F);
+ WriteLong(hash + 24, this->G);
+ WriteLong(hash + 28, this->H);
+ }
+
+ /* Fill the entire context structure with zeros to blank it */
+ memset(this,0, sizeof(SHA256));
+}
+//#define TEST_SHA256
+#ifdef TEST_SHA256
+
+#include
+
+/*
+ * Define the test vectors and the expected answers.
+ */
+typedef struct
+{
+ const char *value;
+ unsigned char expected[32];
+
+} SHATestVector;
+static SHATestVector vector1 = {
+ "abc",
+ {0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea,
+ 0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23,
+ 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c,
+ 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad}
+};
+static SHATestVector vector2 = {
+ "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
+ {0x24, 0x8d, 0x6a, 0x61, 0xd2, 0x06, 0x38, 0xb8,
+ 0xe5, 0xc0, 0x26, 0x93, 0x0c, 0x3e, 0x60, 0x39,
+ 0xa3, 0x3c, 0xe4, 0x59, 0x64, 0xff, 0x21, 0x67,
+ 0xf6, 0xec, 0xed, 0xd4, 0x19, 0xdb, 0x06, 0xc1}
+};
+
+/*
+ * Print a 32-byte hash value.
+ */
+static void PrintHash(unsigned char *hash)
+{
+ printf("%02X%02X %02X%02X %02X%02X %02X%02X "
+ "%02X%02X %02X%02X %02X%02X %02X%02X "
+ "%02X%02X %02X%02X %02X%02X %02X%02X "
+ "%02X%02X %02X%02X %02X%02X %02X%02X\n",
+ hash[0], hash[1], hash[2], hash[3],
+ hash[4], hash[5], hash[6], hash[7],
+ hash[8], hash[9], hash[10], hash[11],
+ hash[12], hash[13], hash[14], hash[15],
+ hash[16], hash[17], hash[18], hash[19],
+ hash[20], hash[21], hash[22], hash[23],
+ hash[24], hash[25], hash[26], hash[27],
+ hash[28], hash[29], hash[30], hash[31]);
+}
+
+/*
+ * Process a test vector.
+ */
+static void ProcessVector(SHATestVector *vector)
+{
+ SHA256 sha;
+ unsigned char hash[32];
+
+ /* Compute the hash */
+
+ sha.addData(vector->value, strlen(vector->value));
+ sha.result(hash);
+
+ /* Report the results */
+ printf("Value = %s\n", vector->value);
+ printf("Expected = ");
+ PrintHash(vector->expected);
+ printf("Actual = ");
+ PrintHash(hash);
+ if(memcmp(vector->expected, hash, 32) != 0)
+ {
+ printf("*** test failed ***\n");
+ }
+ printf("\n");
+}
+
+int main(int argc, char *argv[])
+{
+ printf("\n");
+ ProcessVector(&vector1);
+ ProcessVector(&vector2);
+ return 0;
+}
+
+#endif /* TEST_SHA256 */
+
diff --git a/qt/sha256.h b/qt/sha256.h
new file mode 100644
index 0000000..9fed55d
--- /dev/null
+++ b/qt/sha256.h
@@ -0,0 +1,30 @@
+#ifndef SHA256_H
+#define SHA256_H
+#include
+#define SHA256_HASH_SIZE 32
+
+/*
+ * Context block for SHA-256.
+ */
+class SHA256
+{
+ private:
+ unsigned char input[64];
+ uint32_t inputLen;
+ uint32_t A, B, C, D, E, F, G, H;
+ uint64_t totalLen;
+ void ProcessBlock(const unsigned char *block);
+ void WriteLong(unsigned char *buf, uint32_t value);
+ public:
+ SHA256();
+ void reset();
+ void result(unsigned char hash[SHA256_HASH_SIZE]);
+ void addData( const void *buffer, unsigned long len);
+} ;
+
+
+
+
+
+
+#endif
diff --git a/qt/skyv1keygen.cpp b/qt/skyv1keygen.cpp
new file mode 100644
index 0000000..45fec6a
--- /dev/null
+++ b/qt/skyv1keygen.cpp
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+#include "skyv1keygen.h"
+
+SkyV1Keygen::SkyV1Keygen( WifiNetwork * router ) : KeygenThread(router) ,
+ ALPHABET("ABCDEFGHIJKLMNOPQRSTUVWXYZ") {}
+
+void SkyV1Keygen::run(){
+ if ( router == NULL)
+ return;
+ if ( router->getMac().size() != 12 )
+ {
+ //TODO:error messages
+ return;
+ }
+ QByteArray hash = QCryptographicHash::hash( router->getMac().toAscii() ,
+ QCryptographicHash::Md5 );
+
+ if ( stopRequested )
+ return;
+ QString key = "";
+ for ( int i = 1 ; i <= 15 ; i += 2 )
+ {
+ unsigned char index = hash[i];
+ index %= 26;
+ key += ALPHABET.at(index);
+ }
+ this->results.append(key);
+}
diff --git a/qt/skyv1keygen.h b/qt/skyv1keygen.h
new file mode 100644
index 0000000..66bf8a9
--- /dev/null
+++ b/qt/skyv1keygen.h
@@ -0,0 +1,15 @@
+#ifndef SKYV1KEYGEN_H
+#define SKYV1KEYGEN_H
+#include "keygenthread.h"
+
+class SkyV1Keygen : public KeygenThread
+{
+ private:
+ QString ALPHABET;
+
+ public:
+ SkyV1Keygen( WifiNetwork * router );
+ void run();
+};
+
+#endif // SKYV1KEYGEN_H
diff --git a/qt/tecomkeygen.cpp b/qt/tecomkeygen.cpp
new file mode 100644
index 0000000..59ca483
--- /dev/null
+++ b/qt/tecomkeygen.cpp
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+#include "tecomkeygen.h"
+
+TecomKeygen::TecomKeygen( WifiNetwork * router ) : KeygenThread(router) {}
+
+void TecomKeygen::run(){
+ QString result;
+ result = QString::fromAscii(QCryptographicHash::hash(
+ router->getSSID().toUpper().toAscii() ,
+ QCryptographicHash::Sha1 )
+ .toHex().data());
+ result.truncate(26);
+ if ( stopRequested )
+ return;
+ this->results.append(result);
+}
diff --git a/qt/tecomkeygen.h b/qt/tecomkeygen.h
new file mode 100644
index 0000000..b40ee5d
--- /dev/null
+++ b/qt/tecomkeygen.h
@@ -0,0 +1,12 @@
+#ifndef TECOMKEYGEN_H
+#define TECOMKEYGEN_H
+#include "keygenthread.h"
+
+class TecomKeygen : public KeygenThread
+{
+ public:
+ TecomKeygen( WifiNetwork * router );
+ void run();
+};
+
+#endif // TECOMKEYGEN_H
diff --git a/qt/telseykeygen.cpp b/qt/telseykeygen.cpp
new file mode 100644
index 0000000..21accbe
--- /dev/null
+++ b/qt/telseykeygen.cpp
@@ -0,0 +1,261 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+#include "telseykeygen.h"
+#include
+TelseyKeygen::TelseyKeygen( WifiNetwork * router ) : KeygenThread(router) {}
+
+void TelseyKeygen::run(){
+ if ( router->getMac() == "" )
+ {
+ return;
+ }
+ uint32_t * key = scrambler(router->getMac());
+ uint32_t seed = 0;
+
+ for (int x = 0; x < 64; x++) {
+ seed = hashword(key,x, seed);
+ }
+
+ QString S1 = "";
+ S1.setNum(seed,16);
+ while ( S1.length() < 8 )
+ S1 = "0" + S1;
+
+
+ for ( int x = 0; x <64; x++) {
+ if (x <8)
+ key[x] =( key[x]<< 3 ) & 0xFFFFFFFF;
+ else if ( x<16)
+ key[x] >>= 5;
+ else if (x < 32 )
+ key[x] >>= 2;
+ else
+ key[x] =( key[x]<< 7 ) & 0xFFFFFFFF;
+ }
+
+ seed = 0;
+ for (int x = 0; x < 64; x++) {
+ seed = hashword(key, x, seed);
+ }
+ QString S2 = "";
+ S2.setNum(seed,16);
+ while ( S2.length() < 8 )
+ S2 = "0" + S2;
+ results.append(S1.right(5) + S2.left(5));
+ return;
+}
+
+//Scramble Function
+uint32_t * TelseyKeygen::scrambler(QString mac){
+ uint32_t * vector = new uint32_t [64];
+ bool status;
+ char macValue[6];
+ for (int i = 0; i < 12; i += 2)
+ macValue[i / 2] = (mac.mid(i,1).toInt(&status, 16) << 4)
+ + mac.mid(i + 1,1).toInt(&status, 16);
+
+ vector[0] =( ( ( 0xFF & macValue[5] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
+ ( ( 0xFF & macValue[0] ) << 8 )|( 0xFF & macValue[5] ) );
+ vector[1] =( ( ( 0xFF & macValue[1] ) << 24 )|( ( 0xFF & macValue[0] ) << 16 ) |
+ ( ( 0xFF & macValue[1] ) << 8 )|( 0xFF & macValue[5] ) );
+ vector[2] =( ( ( 0xFF & macValue[4] ) << 24 )|( ( 0xFF & macValue[2] ) << 16 ) |
+ ( ( 0xFF & macValue[3] ) << 8 )|( 0xFF & macValue[2] ) );
+ vector[3] =( ( ( 0xFF & macValue[4] ) << 24 )|( ( 0xFF & macValue[3] ) << 16 ) |
+ ( ( 0xFF & macValue[2] ) << 8 )|( 0xFF & macValue[2] ) );
+ vector[4] =( ( ( 0xFF & macValue[2] ) << 24 )|( ( 0xFF & macValue[4] ) << 16 ) |
+ ( ( 0xFF & macValue[2] ) << 8 )|( 0xFF & macValue[0] ) );
+ vector[5] =( ( ( 0xFF & macValue[2] ) << 24 )|( ( 0xFF & macValue[5] ) << 16 ) |
+ ( ( 0xFF & macValue[3] ) << 8 )|( 0xFF & macValue[1] ) );
+ vector[6] =( ( ( 0xFF & macValue[0] ) << 24 )|( ( 0xFF & macValue[4] ) << 16 ) |
+ ( ( 0xFF & macValue[0] ) << 8 )|( 0xFF & macValue[1] ) );
+ vector[7] =( ( ( 0xFF & macValue[1] ) << 24 )|( ( 0xFF & macValue[4] ) << 16 ) |
+ ( ( 0xFF & macValue[1] ) << 8 )|( 0xFF & macValue[0] ) );
+ vector[8] =( ( ( 0xFF & macValue[2] ) << 24 )|( ( 0xFF & macValue[4] ) << 16 ) |
+ ( ( 0xFF & macValue[2] ) << 8 )|( 0xFF & macValue[2] ) );
+ vector[9] =( ( ( 0xFF & macValue[3] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
+ ( ( 0xFF & macValue[3] ) << 8 )|( 0xFF & macValue[4] ) );
+ vector[10]=( ( ( 0xFF & macValue[4] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
+ ( ( 0xFF & macValue[4] ) << 8 )|( 0xFF & macValue[3] ) );
+ vector[11]=( ( ( 0xFF & macValue[5] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
+ ( ( 0xFF & macValue[5] ) << 8 )|( 0xFF & macValue[5] ) );
+ vector[12]=( ( ( 0xFF & macValue[2] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
+ ( ( 0xFF & macValue[0] ) << 8 )|( 0xFF & macValue[5] ) );
+ vector[13]=( ( ( 0xFF & macValue[1] ) << 24 )|( ( 0xFF & macValue[0] ) << 16 ) |
+ ( ( 0xFF & macValue[1] ) << 8 )|( 0xFF & macValue[1] ) );
+ vector[14]=( ( ( 0xFF & macValue[4] ) << 24 )|( ( 0xFF & macValue[2] ) << 16 ) |
+ ( ( 0xFF & macValue[1] ) << 8 )|( 0xFF & macValue[3] ) );
+ vector[15]=( ( ( 0xFF & macValue[3] ) << 24 )|( ( 0xFF & macValue[3] ) << 16 ) |
+ ( ( 0xFF & macValue[5] ) << 8 )|( 0xFF & macValue[2] ) );
+ vector[16]=( ( ( 0xFF & macValue[4] ) << 24 )|( ( 0xFF & macValue[4] ) << 16 ) |
+ ( ( 0xFF & macValue[5] ) << 8 )|( 0xFF & macValue[4] ) );
+ vector[17]=( ( ( 0xFF & macValue[5] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
+ ( ( 0xFF & macValue[4] ) << 8 )|( 0xFF & macValue[0] ) );
+ vector[18]=( ( ( 0xFF & macValue[2] ) << 24 )|( ( 0xFF & macValue[5] ) << 16 ) |
+ ( ( 0xFF & macValue[0] ) << 8 )|( 0xFF & macValue[5] ) );
+ vector[19]=( ( ( 0xFF & macValue[2] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
+ ( ( 0xFF & macValue[3] ) << 8 )|( 0xFF & macValue[5] ) );
+ vector[20]=( ( ( 0xFF & macValue[5] ) << 24 )|( ( 0xFF & macValue[2] ) << 16 ) |
+ ( ( 0xFF & macValue[2] ) << 8 )|( 0xFF & macValue[4] ) );
+ vector[21]=( ( ( 0xFF & macValue[2] ) << 24 )|( ( 0xFF & macValue[3] ) << 16 ) |
+ ( ( 0xFF & macValue[1] ) << 8 )|( 0xFF & macValue[4] ) );
+ vector[22]=( ( ( 0xFF & macValue[0] ) << 24 )|( ( 0xFF & macValue[4] ) << 16 ) |
+ ( ( 0xFF & macValue[4] ) << 8 )|( 0xFF & macValue[3] ) );
+ vector[23]=( ( ( 0xFF & macValue[3] ) << 24 )|( ( 0xFF & macValue[0] ) << 16 ) |
+ ( ( 0xFF & macValue[5] ) << 8 )|( 0xFF & macValue[3] ) );
+ vector[24]=( ( ( 0xFF & macValue[4] ) << 24 )|( ( 0xFF & macValue[3] ) << 16 ) |
+ ( ( 0xFF & macValue[0] ) << 8 )|( 0xFF & macValue[0] ) );
+ vector[25]=( ( ( 0xFF & macValue[3] ) << 24 )|( ( 0xFF & macValue[2] ) << 16 ) |
+ ( ( 0xFF & macValue[1] ) << 8 )|( 0xFF & macValue[1] ) );
+ vector[26]=( ( ( 0xFF & macValue[2] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
+ ( ( 0xFF & macValue[2] ) << 8 )|( 0xFF & macValue[5] ) );
+ vector[27]=( ( ( 0xFF & macValue[1] ) << 24 )|( ( 0xFF & macValue[3] ) << 16 ) |
+ ( ( 0xFF & macValue[4] ) << 8 )|( 0xFF & macValue[3] ) );
+ vector[28]=( ( ( 0xFF & macValue[0] ) << 24 )|( ( 0xFF & macValue[2] ) << 16 ) |
+ ( ( 0xFF & macValue[3] ) << 8 )|( 0xFF & macValue[4] ) );
+ vector[29]=( ( ( 0xFF & macValue[0] ) << 24 )|( ( 0xFF & macValue[0] ) << 16 ) |
+ ( ( 0xFF & macValue[2] ) << 8 )|( 0xFF & macValue[2] ) );
+ vector[30]=( ( ( 0xFF & macValue[0] ) << 24 )|( ( 0xFF & macValue[0] ) << 16 ) |
+ ( ( 0xFF & macValue[0] ) << 8 )|( 0xFF & macValue[5] ) );
+ vector[31]=( ( ( 0xFF & macValue[1] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
+ ( ( 0xFF & macValue[1] ) << 8 )|( 0xFF & macValue[4] ) );
+ vector[32]=( ( ( 0xFF & macValue[4] ) << 24 )|( ( 0xFF & macValue[0] ) << 16 ) |
+ ( ( 0xFF & macValue[2] ) << 8 )|( 0xFF & macValue[2] ) );
+ vector[33]=( ( ( 0xFF & macValue[3] ) << 24 )|( ( 0xFF & macValue[3] ) << 16 ) |
+ ( ( 0xFF & macValue[3] ) << 8 )|( 0xFF & macValue[0] ) );
+ vector[34]=( ( ( 0xFF & macValue[0] ) << 24 )|( ( 0xFF & macValue[2] ) << 16 ) |
+ ( ( 0xFF & macValue[4] ) << 8 )|( 0xFF & macValue[1] ) );
+ vector[35]=( ( ( 0xFF & macValue[5] ) << 24 )|( ( 0xFF & macValue[5] ) << 16 ) |
+ ( ( 0xFF & macValue[5] ) << 8 )|( 0xFF & macValue[0] ) );
+ vector[36]=( ( ( 0xFF & macValue[0] ) << 24 )|( ( 0xFF & macValue[4] ) << 16 ) |
+ ( ( 0xFF & macValue[5] ) << 8 )|( 0xFF & macValue[0] ) );
+ vector[37]=( ( ( 0xFF & macValue[1] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
+ ( ( 0xFF & macValue[5] ) << 8 )|( 0xFF & macValue[2] ) );
+ vector[38]=( ( ( 0xFF & macValue[2] ) << 24 )|( ( 0xFF & macValue[2] ) << 16 ) |
+ ( ( 0xFF & macValue[5] ) << 8 )|( 0xFF & macValue[1] ) );
+ vector[39]=( ( ( 0xFF & macValue[3] ) << 24 )|( ( 0xFF & macValue[3] ) << 16 ) |
+ ( ( 0xFF & macValue[2] ) << 8 )|( 0xFF & macValue[3] ) );
+ vector[40]=( ( ( 0xFF & macValue[1] ) << 24 )|( ( 0xFF & macValue[0] ) << 16 ) |
+ ( ( 0xFF & macValue[2] ) << 8 )|( 0xFF & macValue[4] ) );
+ vector[41]=( ( ( 0xFF & macValue[1] ) << 24 )|( ( 0xFF & macValue[5] ) << 16 ) |
+ ( ( 0xFF & macValue[2] ) << 8 )|( 0xFF & macValue[5] ) );
+ vector[42]=( ( ( 0xFF & macValue[0] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
+ ( ( 0xFF & macValue[4] ) << 8 )|( 0xFF & macValue[0] ) );
+ vector[43]=( ( ( 0xFF & macValue[1] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
+ ( ( 0xFF & macValue[1] ) << 8 )|( 0xFF & macValue[4] ) );
+ vector[44]=( ( ( 0xFF & macValue[2] ) << 24 )|( ( 0xFF & macValue[2] ) << 16 ) |
+ ( ( 0xFF & macValue[2] ) << 8 )|( 0xFF & macValue[2] ) );
+ vector[45]=( ( ( 0xFF & macValue[3] ) << 24 )|( ( 0xFF & macValue[3] ) << 16 ) |
+ ( ( 0xFF & macValue[3] ) << 8 )|( 0xFF & macValue[3] ) );
+ vector[46]=( ( ( 0xFF & macValue[5] ) << 24 )|( ( 0xFF & macValue[4] ) << 16 ) |
+ ( ( 0xFF & macValue[0] ) << 8 )|( 0xFF & macValue[1] ) );
+ vector[47]=( ( ( 0xFF & macValue[4] ) << 24 )|( ( 0xFF & macValue[0] ) << 16 ) |
+ ( ( 0xFF & macValue[5] ) << 8 )|( 0xFF & macValue[5] ) );
+ vector[48]=( ( ( 0xFF & macValue[1] ) << 24 )|( ( 0xFF & macValue[0] ) << 16 ) |
+ ( ( 0xFF & macValue[5] ) << 8 )|( 0xFF & macValue[0] ) );
+ vector[49]=( ( ( 0xFF & macValue[0] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
+ ( ( 0xFF & macValue[5] ) << 8 )|( 0xFF & macValue[1] ) );
+ vector[50]=( ( ( 0xFF & macValue[2] ) << 24 )|( ( 0xFF & macValue[2] ) << 16 ) |
+ ( ( 0xFF & macValue[4] ) << 8 )|( 0xFF & macValue[2] ) );
+ vector[51]=( ( ( 0xFF & macValue[3] ) << 24 )|( ( 0xFF & macValue[4] ) << 16 ) |
+ ( ( 0xFF & macValue[4] ) << 8 )|( 0xFF & macValue[3] ) );
+ vector[52]=( ( ( 0xFF & macValue[4] ) << 24 )|( ( 0xFF & macValue[3] ) << 16 ) |
+ ( ( 0xFF & macValue[1] ) << 8 )|( 0xFF & macValue[5] ) );
+ vector[53]=( ( ( 0xFF & macValue[5] ) << 24 )|( ( 0xFF & macValue[5] ) << 16 ) |
+ ( ( 0xFF & macValue[1] ) << 8 )|( 0xFF & macValue[4] ) );
+ vector[54]=( ( ( 0xFF & macValue[3] ) << 24 )|( ( 0xFF & macValue[0] ) << 16 ) |
+ ( ( 0xFF & macValue[1] ) << 8 )|( 0xFF & macValue[5] ) );
+ vector[55]=( ( ( 0xFF & macValue[3] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
+ ( ( 0xFF & macValue[0] ) << 8 )|( 0xFF & macValue[4] ) );
+ vector[56]=( ( ( 0xFF & macValue[4] ) << 24 )|( ( 0xFF & macValue[2] ) << 16 ) |
+ ( ( 0xFF & macValue[2] ) << 8 )|( 0xFF & macValue[5] ) );
+ vector[57]=( ( ( 0xFF & macValue[4] ) << 24 )|( ( 0xFF & macValue[3] ) << 16 ) |
+ ( ( 0xFF & macValue[3] ) << 8 )|( 0xFF & macValue[1] ) );
+ vector[58]=( ( ( 0xFF & macValue[2] ) << 24 )|( ( 0xFF & macValue[4] ) << 16 ) |
+ ( ( 0xFF & macValue[3] ) << 8 )|( 0xFF & macValue[0] ) );
+ vector[59]=( ( ( 0xFF & macValue[2] ) << 24 )|( ( 0xFF & macValue[3] ) << 16 ) |
+ ( ( 0xFF & macValue[5] ) << 8 )|( 0xFF & macValue[1] ) );
+ vector[60]=( ( ( 0xFF & macValue[3] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
+ ( ( 0xFF & macValue[2] ) << 8 )|( 0xFF & macValue[3] ) );
+ vector[61]=( ( ( 0xFF & macValue[5] ) << 24 )|( ( 0xFF & macValue[0] ) << 16 ) |
+ ( ( 0xFF & macValue[1] ) << 8 )|( 0xFF & macValue[2] ) );
+ vector[62]=( ( ( 0xFF & macValue[5] ) << 24 )|( ( 0xFF & macValue[3] ) << 16 ) |
+ ( ( 0xFF & macValue[4] ) << 8 )|( 0xFF & macValue[1] ) );
+ vector[63]=( ( ( 0xFF & macValue[0] ) << 24 )|( ( 0xFF & macValue[2] ) << 16 ) |
+ ( ( 0xFF & macValue[3] ) << 8 )|( 0xFF & macValue[0] ) );
+
+ return vector;
+}
+
+//lookup3.c, by Bob Jenkins, May 2006, Public Domain.
+#define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k))))
+
+#define mix(a,b,c) \
+{ \
+ a -= c; a ^= rot(c, 4); c += b; \
+ b -= a; b ^= rot(a, 6); a += c; \
+ c -= b; c ^= rot(b, 8); b += a; \
+ a -= c; a ^= rot(c,16); c += b; \
+ b -= a; b ^= rot(a,19); a += c; \
+ c -= b; c ^= rot(b, 4); b += a; \
+}
+
+#define final(a,b,c) \
+{ \
+ c ^= b; c -= rot(b,14); \
+ a ^= c; a -= rot(c,11); \
+ b ^= a; b -= rot(a,25); \
+ c ^= b; c -= rot(b,16); \
+ a ^= c; a -= rot(c,4); \
+ b ^= a; b -= rot(a,14); \
+ c ^= b; c -= rot(b,24); \
+}
+uint32_t TelseyKeygen::hashword(
+const uint32_t * k, /* the key, an array of uint32_t values */
+size_t length, /* the length of the key, in uint32_ts */
+uint32_t initval) /* the previous hash, or an arbitrary value */
+{
+ uint32_t a,b,c;
+
+ /* Set up the internal state */
+ a = b = c = 0xdeadbeef + (((uint32_t)length)<<2) + initval;
+
+ /*------------------------------------------------- handle most of the key */
+ while (length > 3)
+ {
+ a += k[0];
+ b += k[1];
+ c += k[2];
+ mix(a,b,c);
+ length -= 3;
+ k += 3;
+ }
+
+ /*------------------------------------------- handle the last 3 uint32_t's */
+ switch(length) /* all the case statements fall through */
+ {
+ case 3 : c+=k[2];
+ case 2 : b+=k[1];
+ case 1 : a+=k[0];
+ final(a,b,c);
+ case 0: /* case 0: nothing left to add */
+ break;
+ }
+ /*------------------------------------------------------ report the result */
+ return c;
+ }
diff --git a/qt/telseykeygen.h b/qt/telseykeygen.h
new file mode 100644
index 0000000..0d4c15f
--- /dev/null
+++ b/qt/telseykeygen.h
@@ -0,0 +1,16 @@
+#ifndef TELSEYKEYGEN_H
+#define TELSEYKEYGEN_H
+#include "keygenthread.h"
+#include
+
+class TelseyKeygen : public KeygenThread
+{
+ private:
+ unsigned int * scrambler(QString mac);
+ uint32_t hashword(const uint32_t * k, size_t length, uint32_t initval);
+ public:
+ TelseyKeygen( WifiNetwork * router );
+ void run();
+};
+
+#endif // TELSEYKEYGEN_H
diff --git a/qt/thomsonkeygen.cpp b/qt/thomsonkeygen.cpp
new file mode 100644
index 0000000..8bb75f8
--- /dev/null
+++ b/qt/thomsonkeygen.cpp
@@ -0,0 +1,226 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+#include "thomsonkeygen.h"
+#include "unknown.h"
+#include
+#include
+#include
+#include
+
+static char charectbytes0[] = {
+ '3','3','3','3','3','3',
+ '3','3','3','3','4','4',
+ '4','4','4','4','4','4',
+ '4','4','4','4','4','4',
+ '4','5','5','5','5','5',
+ '5','5','5','5','5','5',
+ };
+
+static char charectbytes1[] = {
+ '0','1','2','3','4','5',
+ '6','7','8','9','1','2',
+ '3','4','5','6','7','8',
+ '9','A','B','C','D','E',
+ 'F','0','1','2','3','4',
+ '5','6','7','8','9','A',
+ };
+
+ThomsonKeygen::ThomsonKeygen( WifiNetwork * router , bool t) : KeygenThread(router) ,
+ table(NULL) , entry(NULL) , len(0) , thomson3g(t){
+ this->hash = new QCryptographicHash(QCryptographicHash::Sha1);
+ table = NULL;
+}
+
+ThomsonKeygen::~ThomsonKeygen(){
+ delete hash;
+ delete [] table;
+ delete [] entry;
+}
+
+void ThomsonKeygen::run(){
+ if ( !localCalc() )
+ {
+ nativeCalc();
+ return;
+ }
+ if ( results.isEmpty() )
+ results.append("keine results");
+
+}
+
+
+void ThomsonKeygen::nativeCalc(){
+ QString result;
+ int n = sizeof(dic)/sizeof("AAA");
+ char input[13];
+ input[0] = 'C';
+ input[1] = 'P';
+ for( int i = 0 ; i < n; ++i )
+ {
+ sprintf( input + 6 , "%02X%02X%02X" , (int)dic[i][0]
+ , (int)dic[i][1], (int)dic[i][2] );
+ if ( stopRequested )
+ return;
+ for ( int year = 4 ; year <= 9 ; ++year )
+ {
+ for ( int week = 1 ; week <= 52 ; ++week )
+ {
+ input[2] = '0' + year/10;
+ input[3] = '0' + year % 10 ;
+ input[4] = '0' + week / 10;
+ input[5] = '0' + week % 10;
+ hash->reset();
+ hash->addData(input,12);
+ result = QString::fromAscii(hash->result().toHex().data());
+
+ if ( result.right(6) == router->getSSID().right(6) )
+ {
+ this->results.append(result.toUpper().left(10));
+ }
+
+
+ }
+ }
+ }
+}
+
+bool ThomsonKeygen::localCalc(){
+
+ QFile file("RouterKeygen.dic");
+
+
+ if ( !file.open(QIODevice::ReadOnly) ) {
+ return false;
+ }
+
+ unsigned char routerESSID[3];
+ unsigned int routerSSIDint = strtol( router->getSSIDsubpart().toUtf8().data(), NULL , 16);
+ routerESSID[0] = routerSSIDint >> 16;
+ routerESSID[1] = (routerSSIDint >> 8) & 0xFF;
+ routerESSID[2] = routerSSIDint & 0xFF;
+ QDataStream fis( &file );
+ int version = 0;
+ table = new char[1282];
+ if ( fis.readRawData(table, 1282) == -1 )
+ {
+
+ return false;
+ }
+ version = table[0] << 8 | table[1];
+ int totalOffset = 0;
+ int offset = 0;
+ int lastLength = 0 , length = 0;
+ if ( table[( 0xFF &routerESSID[0] )*5 + 2 ] == routerESSID[0] )
+ {
+ int i = ( 0xFF &routerESSID[0] )*5 + 2;
+ offset =( (0xFF & table[i + 1]) << 24 ) | ( (0xFF & table[i + 2]) << 16 ) |
+ ( (0xFF & table[i + 3]) << 8 ) | (0xFF & table[i + 4]);
+ if ( (0xFF & table[i]) != 0xFF )
+ lastLength = ( (0xFF & table[i + 6]) << 24 ) | ( (0xFF & table[i + 7]) << 16 ) |
+ ( (0xFF & table[i + 8]) << 8 ) | (0xFF & table[i + 9]);
+ }
+ totalOffset += offset;
+ fis.skipRawData(totalOffset-1282);
+ if ( fis.readRawData(table,1024) == -1 )
+ {
+ return false;
+ }
+ if ( table[( 0xFF &routerESSID[1] )*4] == routerESSID[1] )
+ {
+ int i = ( 0xFF &routerESSID[1] )*4;
+ offset =( (0xFF & table[i + 1]) << 16 ) |
+ ( (0xFF & table[i + 2]) << 8 ) | (0xFF & table[i + 3]);
+ length = ( (0xFF & table[i + 5]) << 16 ) |
+ ( (0xFF & table[i + 6]) << 8 ) | (0xFF & table[i + 7]);
+
+ }
+ totalOffset += offset;
+ length -= offset;
+ if ( ( lastLength != 0 ) && ( (0xFF & routerESSID[1] ) == 0xFF ) )
+ {
+ /*Only for SSID starting with XXFF. We use the next item on the main table
+ to know the length of the sector we are looking for. */
+ lastLength -= totalOffset;
+ length = lastLength;
+ }
+ fis.skipRawData( offset - 1024 );
+ if ( ( (0xFF & routerESSID[0] ) != 0xFF ) || ( (0xFF & routerESSID[1] ) != 0xFF ) )
+ {
+ entry = new char[length];
+ len = fis.readRawData(entry,length);
+ }
+ else
+ { /*Only for SSID starting with FFFF as we don't have a marker of the end.*/
+ entry = new char[2000];
+ len = fis.readRawData( entry , 2000);
+ }
+ if ( len == -1 )
+ {
+ //problems
+ return false;
+ }
+
+ int year = 4;
+ int week = 1;
+ int i = 0 , j = 0;
+ char input[13];
+ unsigned int sequenceNumber;
+ unsigned int inc = 0;
+ char * message_digest;
+ int a,b,c;
+ input[0] = 'C';
+ input[1] = 'P';
+ input[2] = '0';
+ sequenceNumber =0;
+ QString result;
+ for( i = 0; i < len; i+=2 )
+ {
+ sequenceNumber += ( (0xFF & entry[i]) << 8 ) | (0xFF & entry[i+1]);
+ for ( j = 0 ; j < 18 ; ++j )
+ {
+ inc = j* ( 36*36*36*6*3);
+ year = ( (sequenceNumber+inc) / ( 36*36*36 )% 6) + 4 ;
+ week = (sequenceNumber+inc) / ( 36*36*36*6 ) + 1 ;
+ c = sequenceNumber % 36;
+ b = sequenceNumber/36 % 36;
+ a = sequenceNumber/(36*36) % 36;
+
+ input[3] = '0' + year % 10 ;
+ input[4] = '0' + week / 10;
+ input[5] = '0' + week % 10;
+ input[6] = charectbytes0[a];
+ input[7] = charectbytes1[a];
+ input[8] = charectbytes0[b];
+ input[9] = charectbytes1[b];
+ input[10] = charectbytes0[c];
+ input[11] = charectbytes1[c];
+ hash->reset();
+ hash->addData(input,12);
+ message_digest = hash->result().data();
+
+ if( ( memcmp(&message_digest[17],&routerESSID[0],3) == 0) ){
+ result = QString::fromAscii(hash->result().toHex().data());
+ this->results.append(result.toUpper().left(10));
+ }
+ }
+ }
+
+ return true;
+}
+
diff --git a/qt/thomsonkeygen.h b/qt/thomsonkeygen.h
new file mode 100644
index 0000000..6508251
--- /dev/null
+++ b/qt/thomsonkeygen.h
@@ -0,0 +1,21 @@
+#ifndef THOMSONKEYGEN_H
+#define THOMSONKEYGEN_H
+#include "keygenthread.h"
+
+class ThomsonKeygen : public KeygenThread
+{
+ private:
+ char * table;
+ char * entry;
+ int len;
+ bool thomson3g;
+ bool nativeTry;
+ bool localCalc();
+ void nativeCalc();
+ public:
+ ThomsonKeygen( WifiNetwork * router , bool thomson3g);
+ ~ThomsonKeygen();
+ void run();
+};
+
+#endif // THOMSONKEYGEN_H
diff --git a/qt/unknown.h b/qt/unknown.h
new file mode 100644
index 0000000..8b3e2ed
--- /dev/null
+++ b/qt/unknown.h
@@ -0,0 +1,5834 @@
+static char dic[][4] = {
+"AAA" , "AAB" , "AAC" , "AAD" , "AAE" , "AAF" , "AAG" , "AAH" ,
+"AAI" , "AAJ" , "AAK" , "AAL" , "AAM" , "AAN" , "AAO" , "AAP" ,
+"AAQ" , "AAR" , "AAS" , "AAT" , "AAU" , "AAV" , "AAW" , "AAX" ,
+"AAY" , "AAZ" , "AA0" , "AA1" , "AA2" , "AA3" , "AA4" , "AA5" ,
+"AA6" , "AA7" , "AA8" , "AA9" , "ABA" , "ABB" , "ABC" , "ABD" ,
+"ABE" , "ABF" , "ABG" , "ABH" , "ABI" , "ABJ" , "ABK" , "ABL" ,
+"ABM" , "ABN" , "ABO" , "ABP" , "ABQ" , "ABR" , "ABS" , "ABT" ,
+"ABU" , "ABV" , "ABW" , "ABX" , "ABY" , "ABZ" , "AB0" , "AB1" ,
+"AB2" , "AB3" , "AB4" , "AB5" , "AB6" , "AB7" , "AB8" , "AB9" ,
+"ACA" , "ACB" , "ACC" , "ACD" , "ACE" , "ACF" , "ACG" , "ACH" ,
+"ACI" , "ACJ" , "ACK" , "ACL" , "ACM" , "ACN" , "ACO" , "ACP" ,
+"ACQ" , "ACR" , "ACS" , "ACT" , "ACU" , "ACV" , "ACW" , "ACX" ,
+"ACY" , "ACZ" , "AC0" , "AC1" , "AC2" , "AC3" , "AC4" , "AC5" ,
+"AC6" , "AC7" , "AC8" , "AC9" , "ADA" , "ADB" , "ADC" , "ADD" ,
+"ADE" , "ADF" , "ADG" , "ADH" , "ADI" , "ADJ" , "ADK" , "ADL" ,
+"ADM" , "ADN" , "ADO" , "ADP" , "ADQ" , "ADR" , "ADS" , "ADT" ,
+"ADU" , "ADV" , "ADW" , "ADX" , "ADY" , "ADZ" , "AD0" , "AD1" ,
+"AD2" , "AD3" , "AD4" , "AD5" , "AD6" , "AD7" , "AD8" , "AD9" ,
+"AEA" , "AEB" , "AEC" , "AED" , "AEE" , "AEF" , "AEG" , "AEH" ,
+"AEI" , "AEJ" , "AEK" , "AEL" , "AEM" , "AEN" , "AEO" , "AEP" ,
+"AEQ" , "AER" , "AES" , "AET" , "AEU" , "AEV" , "AEW" , "AEX" ,
+"AEY" , "AEZ" , "AE0" , "AE1" , "AE2" , "AE3" , "AE4" , "AE5" ,
+"AE6" , "AE7" , "AE8" , "AE9" , "AFA" , "AFB" , "AFC" , "AFD" ,
+"AFE" , "AFF" , "AFG" , "AFH" , "AFI" , "AFJ" , "AFK" , "AFL" ,
+"AFM" , "AFN" , "AFO" , "AFP" , "AFQ" , "AFR" , "AFS" , "AFT" ,
+"AFU" , "AFV" , "AFW" , "AFX" , "AFY" , "AFZ" , "AF0" , "AF1" ,
+"AF2" , "AF3" , "AF4" , "AF5" , "AF6" , "AF7" , "AF8" , "AF9" ,
+"AGA" , "AGB" , "AGC" , "AGD" , "AGE" , "AGF" , "AGG" , "AGH" ,
+"AGI" , "AGJ" , "AGK" , "AGL" , "AGM" , "AGN" , "AGO" , "AGP" ,
+"AGQ" , "AGR" , "AGS" , "AGT" , "AGU" , "AGV" , "AGW" , "AGX" ,
+"AGY" , "AGZ" , "AG0" , "AG1" , "AG2" , "AG3" , "AG4" , "AG5" ,
+"AG6" , "AG7" , "AG8" , "AG9" , "AHA" , "AHB" , "AHC" , "AHD" ,
+"AHE" , "AHF" , "AHG" , "AHH" , "AHI" , "AHJ" , "AHK" , "AHL" ,
+"AHM" , "AHN" , "AHO" , "AHP" , "AHQ" , "AHR" , "AHS" , "AHT" ,
+"AHU" , "AHV" , "AHW" , "AHX" , "AHY" , "AHZ" , "AH0" , "AH1" ,
+"AH2" , "AH3" , "AH4" , "AH5" , "AH6" , "AH7" , "AH8" , "AH9" ,
+"AIA" , "AIB" , "AIC" , "AID" , "AIE" , "AIF" , "AIG" , "AIH" ,
+"AII" , "AIJ" , "AIK" , "AIL" , "AIM" , "AIN" , "AIO" , "AIP" ,
+"AIQ" , "AIR" , "AIS" , "AIT" , "AIU" , "AIV" , "AIW" , "AIX" ,
+"AIY" , "AIZ" , "AI0" , "AI1" , "AI2" , "AI3" , "AI4" , "AI5" ,
+"AI6" , "AI7" , "AI8" , "AI9" , "AJA" , "AJB" , "AJC" , "AJD" ,
+"AJE" , "AJF" , "AJG" , "AJH" , "AJI" , "AJJ" , "AJK" , "AJL" ,
+"AJM" , "AJN" , "AJO" , "AJP" , "AJQ" , "AJR" , "AJS" , "AJT" ,
+"AJU" , "AJV" , "AJW" , "AJX" , "AJY" , "AJZ" , "AJ0" , "AJ1" ,
+"AJ2" , "AJ3" , "AJ4" , "AJ5" , "AJ6" , "AJ7" , "AJ8" , "AJ9" ,
+"AKA" , "AKB" , "AKC" , "AKD" , "AKE" , "AKF" , "AKG" , "AKH" ,
+"AKI" , "AKJ" , "AKK" , "AKL" , "AKM" , "AKN" , "AKO" , "AKP" ,
+"AKQ" , "AKR" , "AKS" , "AKT" , "AKU" , "AKV" , "AKW" , "AKX" ,
+"AKY" , "AKZ" , "AK0" , "AK1" , "AK2" , "AK3" , "AK4" , "AK5" ,
+"AK6" , "AK7" , "AK8" , "AK9" , "ALA" , "ALB" , "ALC" , "ALD" ,
+"ALE" , "ALF" , "ALG" , "ALH" , "ALI" , "ALJ" , "ALK" , "ALL" ,
+"ALM" , "ALN" , "ALO" , "ALP" , "ALQ" , "ALR" , "ALS" , "ALT" ,
+"ALU" , "ALV" , "ALW" , "ALX" , "ALY" , "ALZ" , "AL0" , "AL1" ,
+"AL2" , "AL3" , "AL4" , "AL5" , "AL6" , "AL7" , "AL8" , "AL9" ,
+"AMA" , "AMB" , "AMC" , "AMD" , "AME" , "AMF" , "AMG" , "AMH" ,
+"AMI" , "AMJ" , "AMK" , "AML" , "AMM" , "AMN" , "AMO" , "AMP" ,
+"AMQ" , "AMR" , "AMS" , "AMT" , "AMU" , "AMV" , "AMW" , "AMX" ,
+"AMY" , "AMZ" , "AM0" , "AM1" , "AM2" , "AM3" , "AM4" , "AM5" ,
+"AM6" , "AM7" , "AM8" , "AM9" , "ANA" , "ANB" , "ANC" , "AND" ,
+"ANE" , "ANF" , "ANG" , "ANH" , "ANI" , "ANJ" , "ANK" , "ANL" ,
+"ANM" , "ANN" , "ANO" , "ANP" , "ANQ" , "ANR" , "ANS" , "ANT" ,
+"ANU" , "ANV" , "ANW" , "ANX" , "ANY" , "ANZ" , "AN0" , "AN1" ,
+"AN2" , "AN3" , "AN4" , "AN5" , "AN6" , "AN7" , "AN8" , "AN9" ,
+"AOA" , "AOB" , "AOC" , "AOD" , "AOE" , "AOF" , "AOG" , "AOH" ,
+"AOI" , "AOJ" , "AOK" , "AOL" , "AOM" , "AON" , "AOO" , "AOP" ,
+"AOQ" , "AOR" , "AOS" , "AOT" , "AOU" , "AOV" , "AOW" , "AOX" ,
+"AOY" , "AOZ" , "AO0" , "AO1" , "AO2" , "AO3" , "AO4" , "AO5" ,
+"AO6" , "AO7" , "AO8" , "AO9" , "APA" , "APB" , "APC" , "APD" ,
+"APE" , "APF" , "APG" , "APH" , "API" , "APJ" , "APK" , "APL" ,
+"APM" , "APN" , "APO" , "APP" , "APQ" , "APR" , "APS" , "APT" ,
+"APU" , "APV" , "APW" , "APX" , "APY" , "APZ" , "AP0" , "AP1" ,
+"AP2" , "AP3" , "AP4" , "AP5" , "AP6" , "AP7" , "AP8" , "AP9" ,
+"AQA" , "AQB" , "AQC" , "AQD" , "AQE" , "AQF" , "AQG" , "AQH" ,
+"AQI" , "AQJ" , "AQK" , "AQL" , "AQM" , "AQN" , "AQO" , "AQP" ,
+"AQQ" , "AQR" , "AQS" , "AQT" , "AQU" , "AQV" , "AQW" , "AQX" ,
+"AQY" , "AQZ" , "AQ0" , "AQ1" , "AQ2" , "AQ3" , "AQ4" , "AQ5" ,
+"AQ6" , "AQ7" , "AQ8" , "AQ9" , "ARA" , "ARB" , "ARC" , "ARD" ,
+"ARE" , "ARF" , "ARG" , "ARH" , "ARI" , "ARJ" , "ARK" , "ARL" ,
+"ARM" , "ARN" , "ARO" , "ARP" , "ARQ" , "ARR" , "ARS" , "ART" ,
+"ARU" , "ARV" , "ARW" , "ARX" , "ARY" , "ARZ" , "AR0" , "AR1" ,
+"AR2" , "AR3" , "AR4" , "AR5" , "AR6" , "AR7" , "AR8" , "AR9" ,
+"ASA" , "ASB" , "ASC" , "ASD" , "ASE" , "ASF" , "ASG" , "ASH" ,
+"ASI" , "ASJ" , "ASK" , "ASL" , "ASM" , "ASN" , "ASO" , "ASP" ,
+"ASQ" , "ASR" , "ASS" , "AST" , "ASU" , "ASV" , "ASW" , "ASX" ,
+"ASY" , "ASZ" , "AS0" , "AS1" , "AS2" , "AS3" , "AS4" , "AS5" ,
+"AS6" , "AS7" , "AS8" , "AS9" , "ATA" , "ATB" , "ATC" , "ATD" ,
+"ATE" , "ATF" , "ATG" , "ATH" , "ATI" , "ATJ" , "ATK" , "ATL" ,
+"ATM" , "ATN" , "ATO" , "ATP" , "ATQ" , "ATR" , "ATS" , "ATT" ,
+"ATU" , "ATV" , "ATW" , "ATX" , "ATY" , "ATZ" , "AT0" , "AT1" ,
+"AT2" , "AT3" , "AT4" , "AT5" , "AT6" , "AT7" , "AT8" , "AT9" ,
+"AUA" , "AUB" , "AUC" , "AUD" , "AUE" , "AUF" , "AUG" , "AUH" ,
+"AUI" , "AUJ" , "AUK" , "AUL" , "AUM" , "AUN" , "AUO" , "AUP" ,
+"AUQ" , "AUR" , "AUS" , "AUT" , "AUU" , "AUV" , "AUW" , "AUX" ,
+"AUY" , "AUZ" , "AU0" , "AU1" , "AU2" , "AU3" , "AU4" , "AU5" ,
+"AU6" , "AU7" , "AU8" , "AU9" , "AVA" , "AVB" , "AVC" , "AVD" ,
+"AVE" , "AVF" , "AVG" , "AVH" , "AVI" , "AVJ" , "AVK" , "AVL" ,
+"AVM" , "AVN" , "AVO" , "AVP" , "AVQ" , "AVR" , "AVS" , "AVT" ,
+"AVU" , "AVV" , "AVW" , "AVX" , "AVY" , "AVZ" , "AV0" , "AV1" ,
+"AV2" , "AV3" , "AV4" , "AV5" , "AV6" , "AV7" , "AV8" , "AV9" ,
+"AWA" , "AWB" , "AWC" , "AWD" , "AWE" , "AWF" , "AWG" , "AWH" ,
+"AWI" , "AWJ" , "AWK" , "AWL" , "AWM" , "AWN" , "AWO" , "AWP" ,
+"AWQ" , "AWR" , "AWS" , "AWT" , "AWU" , "AWV" , "AWW" , "AWX" ,
+"AWY" , "AWZ" , "AW0" , "AW1" , "AW2" , "AW3" , "AW4" , "AW5" ,
+"AW6" , "AW7" , "AW8" , "AW9" , "AXA" , "AXB" , "AXC" , "AXD" ,
+"AXE" , "AXF" , "AXG" , "AXH" , "AXI" , "AXJ" , "AXK" , "AXL" ,
+"AXM" , "AXN" , "AXO" , "AXP" , "AXQ" , "AXR" , "AXS" , "AXT" ,
+"AXU" , "AXV" , "AXW" , "AXX" , "AXY" , "AXZ" , "AX0" , "AX1" ,
+"AX2" , "AX3" , "AX4" , "AX5" , "AX6" , "AX7" , "AX8" , "AX9" ,
+"AYA" , "AYB" , "AYC" , "AYD" , "AYE" , "AYF" , "AYG" , "AYH" ,
+"AYI" , "AYJ" , "AYK" , "AYL" , "AYM" , "AYN" , "AYO" , "AYP" ,
+"AYQ" , "AYR" , "AYS" , "AYT" , "AYU" , "AYV" , "AYW" , "AYX" ,
+"AYY" , "AYZ" , "AY0" , "AY1" , "AY2" , "AY3" , "AY4" , "AY5" ,
+"AY6" , "AY7" , "AY8" , "AY9" , "AZA" , "AZB" , "AZC" , "AZD" ,
+"AZE" , "AZF" , "AZG" , "AZH" , "AZI" , "AZJ" , "AZK" , "AZL" ,
+"AZM" , "AZN" , "AZO" , "AZP" , "AZQ" , "AZR" , "AZS" , "AZT" ,
+"AZU" , "AZV" , "AZW" , "AZX" , "AZY" , "AZZ" , "AZ0" , "AZ1" ,
+"AZ2" , "AZ3" , "AZ4" , "AZ5" , "AZ6" , "AZ7" , "AZ8" , "AZ9" ,
+"A0A" , "A0B" , "A0C" , "A0D" , "A0E" , "A0F" , "A0G" , "A0H" ,
+"A0I" , "A0J" , "A0K" , "A0L" , "A0M" , "A0N" , "A0O" , "A0P" ,
+"A0Q" , "A0R" , "A0S" , "A0T" , "A0U" , "A0V" , "A0W" , "A0X" ,
+"A0Y" , "A0Z" , "A00" , "A01" , "A02" , "A03" , "A04" , "A05" ,
+"A06" , "A07" , "A08" , "A09" , "A1A" , "A1B" , "A1C" , "A1D" ,
+"A1E" , "A1F" , "A1G" , "A1H" , "A1I" , "A1J" , "A1K" , "A1L" ,
+"A1M" , "A1N" , "A1O" , "A1P" , "A1Q" , "A1R" , "A1S" , "A1T" ,
+"A1U" , "A1V" , "A1W" , "A1X" , "A1Y" , "A1Z" , "A10" , "A11" ,
+"A12" , "A13" , "A14" , "A15" , "A16" , "A17" , "A18" , "A19" ,
+"A2A" , "A2B" , "A2C" , "A2D" , "A2E" , "A2F" , "A2G" , "A2H" ,
+"A2I" , "A2J" , "A2K" , "A2L" , "A2M" , "A2N" , "A2O" , "A2P" ,
+"A2Q" , "A2R" , "A2S" , "A2T" , "A2U" , "A2V" , "A2W" , "A2X" ,
+"A2Y" , "A2Z" , "A20" , "A21" , "A22" , "A23" , "A24" , "A25" ,
+"A26" , "A27" , "A28" , "A29" , "A3A" , "A3B" , "A3C" , "A3D" ,
+"A3E" , "A3F" , "A3G" , "A3H" , "A3I" , "A3J" , "A3K" , "A3L" ,
+"A3M" , "A3N" , "A3O" , "A3P" , "A3Q" , "A3R" , "A3S" , "A3T" ,
+"A3U" , "A3V" , "A3W" , "A3X" , "A3Y" , "A3Z" , "A30" , "A31" ,
+"A32" , "A33" , "A34" , "A35" , "A36" , "A37" , "A38" , "A39" ,
+"A4A" , "A4B" , "A4C" , "A4D" , "A4E" , "A4F" , "A4G" , "A4H" ,
+"A4I" , "A4J" , "A4K" , "A4L" , "A4M" , "A4N" , "A4O" , "A4P" ,
+"A4Q" , "A4R" , "A4S" , "A4T" , "A4U" , "A4V" , "A4W" , "A4X" ,
+"A4Y" , "A4Z" , "A40" , "A41" , "A42" , "A43" , "A44" , "A45" ,
+"A46" , "A47" , "A48" , "A49" , "A5A" , "A5B" , "A5C" , "A5D" ,
+"A5E" , "A5F" , "A5G" , "A5H" , "A5I" , "A5J" , "A5K" , "A5L" ,
+"A5M" , "A5N" , "A5O" , "A5P" , "A5Q" , "A5R" , "A5S" , "A5T" ,
+"A5U" , "A5V" , "A5W" , "A5X" , "A5Y" , "A5Z" , "A50" , "A51" ,
+"A52" , "A53" , "A54" , "A55" , "A56" , "A57" , "A58" , "A59" ,
+"A6A" , "A6B" , "A6C" , "A6D" , "A6E" , "A6F" , "A6G" , "A6H" ,
+"A6I" , "A6J" , "A6K" , "A6L" , "A6M" , "A6N" , "A6O" , "A6P" ,
+"A6Q" , "A6R" , "A6S" , "A6T" , "A6U" , "A6V" , "A6W" , "A6X" ,
+"A6Y" , "A6Z" , "A60" , "A61" , "A62" , "A63" , "A64" , "A65" ,
+"A66" , "A67" , "A68" , "A69" , "A7A" , "A7B" , "A7C" , "A7D" ,
+"A7E" , "A7F" , "A7G" , "A7H" , "A7I" , "A7J" , "A7K" , "A7L" ,
+"A7M" , "A7N" , "A7O" , "A7P" , "A7Q" , "A7R" , "A7S" , "A7T" ,
+"A7U" , "A7V" , "A7W" , "A7X" , "A7Y" , "A7Z" , "A70" , "A71" ,
+"A72" , "A73" , "A74" , "A75" , "A76" , "A77" , "A78" , "A79" ,
+"A8A" , "A8B" , "A8C" , "A8D" , "A8E" , "A8F" , "A8G" , "A8H" ,
+"A8I" , "A8J" , "A8K" , "A8L" , "A8M" , "A8N" , "A8O" , "A8P" ,
+"A8Q" , "A8R" , "A8S" , "A8T" , "A8U" , "A8V" , "A8W" , "A8X" ,
+"A8Y" , "A8Z" , "A80" , "A81" , "A82" , "A83" , "A84" , "A85" ,
+"A86" , "A87" , "A88" , "A89" , "A9A" , "A9B" , "A9C" , "A9D" ,
+"A9E" , "A9F" , "A9G" , "A9H" , "A9I" , "A9J" , "A9K" , "A9L" ,
+"A9M" , "A9N" , "A9O" , "A9P" , "A9Q" , "A9R" , "A9S" , "A9T" ,
+"A9U" , "A9V" , "A9W" , "A9X" , "A9Y" , "A9Z" , "A90" , "A91" ,
+"A92" , "A93" , "A94" , "A95" , "A96" , "A97" , "A98" , "A99" ,
+"BAA" , "BAB" , "BAC" , "BAD" , "BAE" , "BAF" , "BAG" , "BAH" ,
+"BAI" , "BAJ" , "BAK" , "BAL" , "BAM" , "BAN" , "BAO" , "BAP" ,
+"BAQ" , "BAR" , "BAS" , "BAT" , "BAU" , "BAV" , "BAW" , "BAX" ,
+"BAY" , "BAZ" , "BA0" , "BA1" , "BA2" , "BA3" , "BA4" , "BA5" ,
+"BA6" , "BA7" , "BA8" , "BA9" , "BBA" , "BBB" , "BBC" , "BBD" ,
+"BBE" , "BBF" , "BBG" , "BBH" , "BBI" , "BBJ" , "BBK" , "BBL" ,
+"BBM" , "BBN" , "BBO" , "BBP" , "BBQ" , "BBR" , "BBS" , "BBT" ,
+"BBU" , "BBV" , "BBW" , "BBX" , "BBY" , "BBZ" , "BB0" , "BB1" ,
+"BB2" , "BB3" , "BB4" , "BB5" , "BB6" , "BB7" , "BB8" , "BB9" ,
+"BCA" , "BCB" , "BCC" , "BCD" , "BCE" , "BCF" , "BCG" , "BCH" ,
+"BCI" , "BCJ" , "BCK" , "BCL" , "BCM" , "BCN" , "BCO" , "BCP" ,
+"BCQ" , "BCR" , "BCS" , "BCT" , "BCU" , "BCV" , "BCW" , "BCX" ,
+"BCY" , "BCZ" , "BC0" , "BC1" , "BC2" , "BC3" , "BC4" , "BC5" ,
+"BC6" , "BC7" , "BC8" , "BC9" , "BDA" , "BDB" , "BDC" , "BDD" ,
+"BDE" , "BDF" , "BDG" , "BDH" , "BDI" , "BDJ" , "BDK" , "BDL" ,
+"BDM" , "BDN" , "BDO" , "BDP" , "BDQ" , "BDR" , "BDS" , "BDT" ,
+"BDU" , "BDV" , "BDW" , "BDX" , "BDY" , "BDZ" , "BD0" , "BD1" ,
+"BD2" , "BD3" , "BD4" , "BD5" , "BD6" , "BD7" , "BD8" , "BD9" ,
+"BEA" , "BEB" , "BEC" , "BED" , "BEE" , "BEF" , "BEG" , "BEH" ,
+"BEI" , "BEJ" , "BEK" , "BEL" , "BEM" , "BEN" , "BEO" , "BEP" ,
+"BEQ" , "BER" , "BES" , "BET" , "BEU" , "BEV" , "BEW" , "BEX" ,
+"BEY" , "BEZ" , "BE0" , "BE1" , "BE2" , "BE3" , "BE4" , "BE5" ,
+"BE6" , "BE7" , "BE8" , "BE9" , "BFA" , "BFB" , "BFC" , "BFD" ,
+"BFE" , "BFF" , "BFG" , "BFH" , "BFI" , "BFJ" , "BFK" , "BFL" ,
+"BFM" , "BFN" , "BFO" , "BFP" , "BFQ" , "BFR" , "BFS" , "BFT" ,
+"BFU" , "BFV" , "BFW" , "BFX" , "BFY" , "BFZ" , "BF0" , "BF1" ,
+"BF2" , "BF3" , "BF4" , "BF5" , "BF6" , "BF7" , "BF8" , "BF9" ,
+"BGA" , "BGB" , "BGC" , "BGD" , "BGE" , "BGF" , "BGG" , "BGH" ,
+"BGI" , "BGJ" , "BGK" , "BGL" , "BGM" , "BGN" , "BGO" , "BGP" ,
+"BGQ" , "BGR" , "BGS" , "BGT" , "BGU" , "BGV" , "BGW" , "BGX" ,
+"BGY" , "BGZ" , "BG0" , "BG1" , "BG2" , "BG3" , "BG4" , "BG5" ,
+"BG6" , "BG7" , "BG8" , "BG9" , "BHA" , "BHB" , "BHC" , "BHD" ,
+"BHE" , "BHF" , "BHG" , "BHH" , "BHI" , "BHJ" , "BHK" , "BHL" ,
+"BHM" , "BHN" , "BHO" , "BHP" , "BHQ" , "BHR" , "BHS" , "BHT" ,
+"BHU" , "BHV" , "BHW" , "BHX" , "BHY" , "BHZ" , "BH0" , "BH1" ,
+"BH2" , "BH3" , "BH4" , "BH5" , "BH6" , "BH7" , "BH8" , "BH9" ,
+"BIA" , "BIB" , "BIC" , "BID" , "BIE" , "BIF" , "BIG" , "BIH" ,
+"BII" , "BIJ" , "BIK" , "BIL" , "BIM" , "BIN" , "BIO" , "BIP" ,
+"BIQ" , "BIR" , "BIS" , "BIT" , "BIU" , "BIV" , "BIW" , "BIX" ,
+"BIY" , "BIZ" , "BI0" , "BI1" , "BI2" , "BI3" , "BI4" , "BI5" ,
+"BI6" , "BI7" , "BI8" , "BI9" , "BJA" , "BJB" , "BJC" , "BJD" ,
+"BJE" , "BJF" , "BJG" , "BJH" , "BJI" , "BJJ" , "BJK" , "BJL" ,
+"BJM" , "BJN" , "BJO" , "BJP" , "BJQ" , "BJR" , "BJS" , "BJT" ,
+"BJU" , "BJV" , "BJW" , "BJX" , "BJY" , "BJZ" , "BJ0" , "BJ1" ,
+"BJ2" , "BJ3" , "BJ4" , "BJ5" , "BJ6" , "BJ7" , "BJ8" , "BJ9" ,
+"BKA" , "BKB" , "BKC" , "BKD" , "BKE" , "BKF" , "BKG" , "BKH" ,
+"BKI" , "BKJ" , "BKK" , "BKL" , "BKM" , "BKN" , "BKO" , "BKP" ,
+"BKQ" , "BKR" , "BKS" , "BKT" , "BKU" , "BKV" , "BKW" , "BKX" ,
+"BKY" , "BKZ" , "BK0" , "BK1" , "BK2" , "BK3" , "BK4" , "BK5" ,
+"BK6" , "BK7" , "BK8" , "BK9" , "BLA" , "BLB" , "BLC" , "BLD" ,
+"BLE" , "BLF" , "BLG" , "BLH" , "BLI" , "BLJ" , "BLK" , "BLL" ,
+"BLM" , "BLN" , "BLO" , "BLP" , "BLQ" , "BLR" , "BLS" , "BLT" ,
+"BLU" , "BLV" , "BLW" , "BLX" , "BLY" , "BLZ" , "BL0" , "BL1" ,
+"BL2" , "BL3" , "BL4" , "BL5" , "BL6" , "BL7" , "BL8" , "BL9" ,
+"BMA" , "BMB" , "BMC" , "BMD" , "BME" , "BMF" , "BMG" , "BMH" ,
+"BMI" , "BMJ" , "BMK" , "BML" , "BMM" , "BMN" , "BMO" , "BMP" ,
+"BMQ" , "BMR" , "BMS" , "BMT" , "BMU" , "BMV" , "BMW" , "BMX" ,
+"BMY" , "BMZ" , "BM0" , "BM1" , "BM2" , "BM3" , "BM4" , "BM5" ,
+"BM6" , "BM7" , "BM8" , "BM9" , "BNA" , "BNB" , "BNC" , "BND" ,
+"BNE" , "BNF" , "BNG" , "BNH" , "BNI" , "BNJ" , "BNK" , "BNL" ,
+"BNM" , "BNN" , "BNO" , "BNP" , "BNQ" , "BNR" , "BNS" , "BNT" ,
+"BNU" , "BNV" , "BNW" , "BNX" , "BNY" , "BNZ" , "BN0" , "BN1" ,
+"BN2" , "BN3" , "BN4" , "BN5" , "BN6" , "BN7" , "BN8" , "BN9" ,
+"BOA" , "BOB" , "BOC" , "BOD" , "BOE" , "BOF" , "BOG" , "BOH" ,
+"BOI" , "BOJ" , "BOK" , "BOL" , "BOM" , "BON" , "BOO" , "BOP" ,
+"BOQ" , "BOR" , "BOS" , "BOT" , "BOU" , "BOV" , "BOW" , "BOX" ,
+"BOY" , "BOZ" , "BO0" , "BO1" , "BO2" , "BO3" , "BO4" , "BO5" ,
+"BO6" , "BO7" , "BO8" , "BO9" , "BPA" , "BPB" , "BPC" , "BPD" ,
+"BPE" , "BPF" , "BPG" , "BPH" , "BPI" , "BPJ" , "BPK" , "BPL" ,
+"BPM" , "BPN" , "BPO" , "BPP" , "BPQ" , "BPR" , "BPS" , "BPT" ,
+"BPU" , "BPV" , "BPW" , "BPX" , "BPY" , "BPZ" , "BP0" , "BP1" ,
+"BP2" , "BP3" , "BP4" , "BP5" , "BP6" , "BP7" , "BP8" , "BP9" ,
+"BQA" , "BQB" , "BQC" , "BQD" , "BQE" , "BQF" , "BQG" , "BQH" ,
+"BQI" , "BQJ" , "BQK" , "BQL" , "BQM" , "BQN" , "BQO" , "BQP" ,
+"BQQ" , "BQR" , "BQS" , "BQT" , "BQU" , "BQV" , "BQW" , "BQX" ,
+"BQY" , "BQZ" , "BQ0" , "BQ1" , "BQ2" , "BQ3" , "BQ4" , "BQ5" ,
+"BQ6" , "BQ7" , "BQ8" , "BQ9" , "BRA" , "BRB" , "BRC" , "BRD" ,
+"BRE" , "BRF" , "BRG" , "BRH" , "BRI" , "BRJ" , "BRK" , "BRL" ,
+"BRM" , "BRN" , "BRO" , "BRP" , "BRQ" , "BRR" , "BRS" , "BRT" ,
+"BRU" , "BRV" , "BRW" , "BRX" , "BRY" , "BRZ" , "BR0" , "BR1" ,
+"BR2" , "BR3" , "BR4" , "BR5" , "BR6" , "BR7" , "BR8" , "BR9" ,
+"BSA" , "BSB" , "BSC" , "BSD" , "BSE" , "BSF" , "BSG" , "BSH" ,
+"BSI" , "BSJ" , "BSK" , "BSL" , "BSM" , "BSN" , "BSO" , "BSP" ,
+"BSQ" , "BSR" , "BSS" , "BST" , "BSU" , "BSV" , "BSW" , "BSX" ,
+"BSY" , "BSZ" , "BS0" , "BS1" , "BS2" , "BS3" , "BS4" , "BS5" ,
+"BS6" , "BS7" , "BS8" , "BS9" , "BTA" , "BTB" , "BTC" , "BTD" ,
+"BTE" , "BTF" , "BTG" , "BTH" , "BTI" , "BTJ" , "BTK" , "BTL" ,
+"BTM" , "BTN" , "BTO" , "BTP" , "BTQ" , "BTR" , "BTS" , "BTT" ,
+"BTU" , "BTV" , "BTW" , "BTX" , "BTY" , "BTZ" , "BT0" , "BT1" ,
+"BT2" , "BT3" , "BT4" , "BT5" , "BT6" , "BT7" , "BT8" , "BT9" ,
+"BUA" , "BUB" , "BUC" , "BUD" , "BUE" , "BUF" , "BUG" , "BUH" ,
+"BUI" , "BUJ" , "BUK" , "BUL" , "BUM" , "BUN" , "BUO" , "BUP" ,
+"BUQ" , "BUR" , "BUS" , "BUT" , "BUU" , "BUV" , "BUW" , "BUX" ,
+"BUY" , "BUZ" , "BU0" , "BU1" , "BU2" , "BU3" , "BU4" , "BU5" ,
+"BU6" , "BU7" , "BU8" , "BU9" , "BVA" , "BVB" , "BVC" , "BVD" ,
+"BVE" , "BVF" , "BVG" , "BVH" , "BVI" , "BVJ" , "BVK" , "BVL" ,
+"BVM" , "BVN" , "BVO" , "BVP" , "BVQ" , "BVR" , "BVS" , "BVT" ,
+"BVU" , "BVV" , "BVW" , "BVX" , "BVY" , "BVZ" , "BV0" , "BV1" ,
+"BV2" , "BV3" , "BV4" , "BV5" , "BV6" , "BV7" , "BV8" , "BV9" ,
+"BWA" , "BWB" , "BWC" , "BWD" , "BWE" , "BWF" , "BWG" , "BWH" ,
+"BWI" , "BWJ" , "BWK" , "BWL" , "BWM" , "BWN" , "BWO" , "BWP" ,
+"BWQ" , "BWR" , "BWS" , "BWT" , "BWU" , "BWV" , "BWW" , "BWX" ,
+"BWY" , "BWZ" , "BW0" , "BW1" , "BW2" , "BW3" , "BW4" , "BW5" ,
+"BW6" , "BW7" , "BW8" , "BW9" , "BXA" , "BXB" , "BXC" , "BXD" ,
+"BXE" , "BXF" , "BXG" , "BXH" , "BXI" , "BXJ" , "BXK" , "BXL" ,
+"BXM" , "BXN" , "BXO" , "BXP" , "BXQ" , "BXR" , "BXS" , "BXT" ,
+"BXU" , "BXV" , "BXW" , "BXX" , "BXY" , "BXZ" , "BX0" , "BX1" ,
+"BX2" , "BX3" , "BX4" , "BX5" , "BX6" , "BX7" , "BX8" , "BX9" ,
+"BYA" , "BYB" , "BYC" , "BYD" , "BYE" , "BYF" , "BYG" , "BYH" ,
+"BYI" , "BYJ" , "BYK" , "BYL" , "BYM" , "BYN" , "BYO" , "BYP" ,
+"BYQ" , "BYR" , "BYS" , "BYT" , "BYU" , "BYV" , "BYW" , "BYX" ,
+"BYY" , "BYZ" , "BY0" , "BY1" , "BY2" , "BY3" , "BY4" , "BY5" ,
+"BY6" , "BY7" , "BY8" , "BY9" , "BZA" , "BZB" , "BZC" , "BZD" ,
+"BZE" , "BZF" , "BZG" , "BZH" , "BZI" , "BZJ" , "BZK" , "BZL" ,
+"BZM" , "BZN" , "BZO" , "BZP" , "BZQ" , "BZR" , "BZS" , "BZT" ,
+"BZU" , "BZV" , "BZW" , "BZX" , "BZY" , "BZZ" , "BZ0" , "BZ1" ,
+"BZ2" , "BZ3" , "BZ4" , "BZ5" , "BZ6" , "BZ7" , "BZ8" , "BZ9" ,
+"B0A" , "B0B" , "B0C" , "B0D" , "B0E" , "B0F" , "B0G" , "B0H" ,
+"B0I" , "B0J" , "B0K" , "B0L" , "B0M" , "B0N" , "B0O" , "B0P" ,
+"B0Q" , "B0R" , "B0S" , "B0T" , "B0U" , "B0V" , "B0W" , "B0X" ,
+"B0Y" , "B0Z" , "B00" , "B01" , "B02" , "B03" , "B04" , "B05" ,
+"B06" , "B07" , "B08" , "B09" , "B1A" , "B1B" , "B1C" , "B1D" ,
+"B1E" , "B1F" , "B1G" , "B1H" , "B1I" , "B1J" , "B1K" , "B1L" ,
+"B1M" , "B1N" , "B1O" , "B1P" , "B1Q" , "B1R" , "B1S" , "B1T" ,
+"B1U" , "B1V" , "B1W" , "B1X" , "B1Y" , "B1Z" , "B10" , "B11" ,
+"B12" , "B13" , "B14" , "B15" , "B16" , "B17" , "B18" , "B19" ,
+"B2A" , "B2B" , "B2C" , "B2D" , "B2E" , "B2F" , "B2G" , "B2H" ,
+"B2I" , "B2J" , "B2K" , "B2L" , "B2M" , "B2N" , "B2O" , "B2P" ,
+"B2Q" , "B2R" , "B2S" , "B2T" , "B2U" , "B2V" , "B2W" , "B2X" ,
+"B2Y" , "B2Z" , "B20" , "B21" , "B22" , "B23" , "B24" , "B25" ,
+"B26" , "B27" , "B28" , "B29" , "B3A" , "B3B" , "B3C" , "B3D" ,
+"B3E" , "B3F" , "B3G" , "B3H" , "B3I" , "B3J" , "B3K" , "B3L" ,
+"B3M" , "B3N" , "B3O" , "B3P" , "B3Q" , "B3R" , "B3S" , "B3T" ,
+"B3U" , "B3V" , "B3W" , "B3X" , "B3Y" , "B3Z" , "B30" , "B31" ,
+"B32" , "B33" , "B34" , "B35" , "B36" , "B37" , "B38" , "B39" ,
+"B4A" , "B4B" , "B4C" , "B4D" , "B4E" , "B4F" , "B4G" , "B4H" ,
+"B4I" , "B4J" , "B4K" , "B4L" , "B4M" , "B4N" , "B4O" , "B4P" ,
+"B4Q" , "B4R" , "B4S" , "B4T" , "B4U" , "B4V" , "B4W" , "B4X" ,
+"B4Y" , "B4Z" , "B40" , "B41" , "B42" , "B43" , "B44" , "B45" ,
+"B46" , "B47" , "B48" , "B49" , "B5A" , "B5B" , "B5C" , "B5D" ,
+"B5E" , "B5F" , "B5G" , "B5H" , "B5I" , "B5J" , "B5K" , "B5L" ,
+"B5M" , "B5N" , "B5O" , "B5P" , "B5Q" , "B5R" , "B5S" , "B5T" ,
+"B5U" , "B5V" , "B5W" , "B5X" , "B5Y" , "B5Z" , "B50" , "B51" ,
+"B52" , "B53" , "B54" , "B55" , "B56" , "B57" , "B58" , "B59" ,
+"B6A" , "B6B" , "B6C" , "B6D" , "B6E" , "B6F" , "B6G" , "B6H" ,
+"B6I" , "B6J" , "B6K" , "B6L" , "B6M" , "B6N" , "B6O" , "B6P" ,
+"B6Q" , "B6R" , "B6S" , "B6T" , "B6U" , "B6V" , "B6W" , "B6X" ,
+"B6Y" , "B6Z" , "B60" , "B61" , "B62" , "B63" , "B64" , "B65" ,
+"B66" , "B67" , "B68" , "B69" , "B7A" , "B7B" , "B7C" , "B7D" ,
+"B7E" , "B7F" , "B7G" , "B7H" , "B7I" , "B7J" , "B7K" , "B7L" ,
+"B7M" , "B7N" , "B7O" , "B7P" , "B7Q" , "B7R" , "B7S" , "B7T" ,
+"B7U" , "B7V" , "B7W" , "B7X" , "B7Y" , "B7Z" , "B70" , "B71" ,
+"B72" , "B73" , "B74" , "B75" , "B76" , "B77" , "B78" , "B79" ,
+"B8A" , "B8B" , "B8C" , "B8D" , "B8E" , "B8F" , "B8G" , "B8H" ,
+"B8I" , "B8J" , "B8K" , "B8L" , "B8M" , "B8N" , "B8O" , "B8P" ,
+"B8Q" , "B8R" , "B8S" , "B8T" , "B8U" , "B8V" , "B8W" , "B8X" ,
+"B8Y" , "B8Z" , "B80" , "B81" , "B82" , "B83" , "B84" , "B85" ,
+"B86" , "B87" , "B88" , "B89" , "B9A" , "B9B" , "B9C" , "B9D" ,
+"B9E" , "B9F" , "B9G" , "B9H" , "B9I" , "B9J" , "B9K" , "B9L" ,
+"B9M" , "B9N" , "B9O" , "B9P" , "B9Q" , "B9R" , "B9S" , "B9T" ,
+"B9U" , "B9V" , "B9W" , "B9X" , "B9Y" , "B9Z" , "B90" , "B91" ,
+"B92" , "B93" , "B94" , "B95" , "B96" , "B97" , "B98" , "B99" ,
+"CAA" , "CAB" , "CAC" , "CAD" , "CAE" , "CAF" , "CAG" , "CAH" ,
+"CAI" , "CAJ" , "CAK" , "CAL" , "CAM" , "CAN" , "CAO" , "CAP" ,
+"CAQ" , "CAR" , "CAS" , "CAT" , "CAU" , "CAV" , "CAW" , "CAX" ,
+"CAY" , "CAZ" , "CA0" , "CA1" , "CA2" , "CA3" , "CA4" , "CA5" ,
+"CA6" , "CA7" , "CA8" , "CA9" , "CBA" , "CBB" , "CBC" , "CBD" ,
+"CBE" , "CBF" , "CBG" , "CBH" , "CBI" , "CBJ" , "CBK" , "CBL" ,
+"CBM" , "CBN" , "CBO" , "CBP" , "CBQ" , "CBR" , "CBS" , "CBT" ,
+"CBU" , "CBV" , "CBW" , "CBX" , "CBY" , "CBZ" , "CB0" , "CB1" ,
+"CB2" , "CB3" , "CB4" , "CB5" , "CB6" , "CB7" , "CB8" , "CB9" ,
+"CCA" , "CCB" , "CCC" , "CCD" , "CCE" , "CCF" , "CCG" , "CCH" ,
+"CCI" , "CCJ" , "CCK" , "CCL" , "CCM" , "CCN" , "CCO" , "CCP" ,
+"CCQ" , "CCR" , "CCS" , "CCT" , "CCU" , "CCV" , "CCW" , "CCX" ,
+"CCY" , "CCZ" , "CC0" , "CC1" , "CC2" , "CC3" , "CC4" , "CC5" ,
+"CC6" , "CC7" , "CC8" , "CC9" , "CDA" , "CDB" , "CDC" , "CDD" ,
+"CDE" , "CDF" , "CDG" , "CDH" , "CDI" , "CDJ" , "CDK" , "CDL" ,
+"CDM" , "CDN" , "CDO" , "CDP" , "CDQ" , "CDR" , "CDS" , "CDT" ,
+"CDU" , "CDV" , "CDW" , "CDX" , "CDY" , "CDZ" , "CD0" , "CD1" ,
+"CD2" , "CD3" , "CD4" , "CD5" , "CD6" , "CD7" , "CD8" , "CD9" ,
+"CEA" , "CEB" , "CEC" , "CED" , "CEE" , "CEF" , "CEG" , "CEH" ,
+"CEI" , "CEJ" , "CEK" , "CEL" , "CEM" , "CEN" , "CEO" , "CEP" ,
+"CEQ" , "CER" , "CES" , "CET" , "CEU" , "CEV" , "CEW" , "CEX" ,
+"CEY" , "CEZ" , "CE0" , "CE1" , "CE2" , "CE3" , "CE4" , "CE5" ,
+"CE6" , "CE7" , "CE8" , "CE9" , "CFA" , "CFB" , "CFC" , "CFD" ,
+"CFE" , "CFF" , "CFG" , "CFH" , "CFI" , "CFJ" , "CFK" , "CFL" ,
+"CFM" , "CFN" , "CFO" , "CFP" , "CFQ" , "CFR" , "CFS" , "CFT" ,
+"CFU" , "CFV" , "CFW" , "CFX" , "CFY" , "CFZ" , "CF0" , "CF1" ,
+"CF2" , "CF3" , "CF4" , "CF5" , "CF6" , "CF7" , "CF8" , "CF9" ,
+"CGA" , "CGB" , "CGC" , "CGD" , "CGE" , "CGF" , "CGG" , "CGH" ,
+"CGI" , "CGJ" , "CGK" , "CGL" , "CGM" , "CGN" , "CGO" , "CGP" ,
+"CGQ" , "CGR" , "CGS" , "CGT" , "CGU" , "CGV" , "CGW" , "CGX" ,
+"CGY" , "CGZ" , "CG0" , "CG1" , "CG2" , "CG3" , "CG4" , "CG5" ,
+"CG6" , "CG7" , "CG8" , "CG9" , "CHA" , "CHB" , "CHC" , "CHD" ,
+"CHE" , "CHF" , "CHG" , "CHH" , "CHI" , "CHJ" , "CHK" , "CHL" ,
+"CHM" , "CHN" , "CHO" , "CHP" , "CHQ" , "CHR" , "CHS" , "CHT" ,
+"CHU" , "CHV" , "CHW" , "CHX" , "CHY" , "CHZ" , "CH0" , "CH1" ,
+"CH2" , "CH3" , "CH4" , "CH5" , "CH6" , "CH7" , "CH8" , "CH9" ,
+"CIA" , "CIB" , "CIC" , "CID" , "CIE" , "CIF" , "CIG" , "CIH" ,
+"CII" , "CIJ" , "CIK" , "CIL" , "CIM" , "CIN" , "CIO" , "CIP" ,
+"CIQ" , "CIR" , "CIS" , "CIT" , "CIU" , "CIV" , "CIW" , "CIX" ,
+"CIY" , "CIZ" , "CI0" , "CI1" , "CI2" , "CI3" , "CI4" , "CI5" ,
+"CI6" , "CI7" , "CI8" , "CI9" , "CJA" , "CJB" , "CJC" , "CJD" ,
+"CJE" , "CJF" , "CJG" , "CJH" , "CJI" , "CJJ" , "CJK" , "CJL" ,
+"CJM" , "CJN" , "CJO" , "CJP" , "CJQ" , "CJR" , "CJS" , "CJT" ,
+"CJU" , "CJV" , "CJW" , "CJX" , "CJY" , "CJZ" , "CJ0" , "CJ1" ,
+"CJ2" , "CJ3" , "CJ4" , "CJ5" , "CJ6" , "CJ7" , "CJ8" , "CJ9" ,
+"CKA" , "CKB" , "CKC" , "CKD" , "CKE" , "CKF" , "CKG" , "CKH" ,
+"CKI" , "CKJ" , "CKK" , "CKL" , "CKM" , "CKN" , "CKO" , "CKP" ,
+"CKQ" , "CKR" , "CKS" , "CKT" , "CKU" , "CKV" , "CKW" , "CKX" ,
+"CKY" , "CKZ" , "CK0" , "CK1" , "CK2" , "CK3" , "CK4" , "CK5" ,
+"CK6" , "CK7" , "CK8" , "CK9" , "CLA" , "CLB" , "CLC" , "CLD" ,
+"CLE" , "CLF" , "CLG" , "CLH" , "CLI" , "CLJ" , "CLK" , "CLL" ,
+"CLM" , "CLN" , "CLO" , "CLP" , "CLQ" , "CLR" , "CLS" , "CLT" ,
+"CLU" , "CLV" , "CLW" , "CLX" , "CLY" , "CLZ" , "CL0" , "CL1" ,
+"CL2" , "CL3" , "CL4" , "CL5" , "CL6" , "CL7" , "CL8" , "CL9" ,
+"CMA" , "CMB" , "CMC" , "CMD" , "CME" , "CMF" , "CMG" , "CMH" ,
+"CMI" , "CMJ" , "CMK" , "CML" , "CMM" , "CMN" , "CMO" , "CMP" ,
+"CMQ" , "CMR" , "CMS" , "CMT" , "CMU" , "CMV" , "CMW" , "CMX" ,
+"CMY" , "CMZ" , "CM0" , "CM1" , "CM2" , "CM3" , "CM4" , "CM5" ,
+"CM6" , "CM7" , "CM8" , "CM9" , "CNA" , "CNB" , "CNC" , "CND" ,
+"CNE" , "CNF" , "CNG" , "CNH" , "CNI" , "CNJ" , "CNK" , "CNL" ,
+"CNM" , "CNN" , "CNO" , "CNP" , "CNQ" , "CNR" , "CNS" , "CNT" ,
+"CNU" , "CNV" , "CNW" , "CNX" , "CNY" , "CNZ" , "CN0" , "CN1" ,
+"CN2" , "CN3" , "CN4" , "CN5" , "CN6" , "CN7" , "CN8" , "CN9" ,
+"COA" , "COB" , "COC" , "COD" , "COE" , "COF" , "COG" , "COH" ,
+"COI" , "COJ" , "COK" , "COL" , "COM" , "CON" , "COO" , "COP" ,
+"COQ" , "COR" , "COS" , "COT" , "COU" , "COV" , "COW" , "COX" ,
+"COY" , "COZ" , "CO0" , "CO1" , "CO2" , "CO3" , "CO4" , "CO5" ,
+"CO6" , "CO7" , "CO8" , "CO9" , "CPA" , "CPB" , "CPC" , "CPD" ,
+"CPE" , "CPF" , "CPG" , "CPH" , "CPI" , "CPJ" , "CPK" , "CPL" ,
+"CPM" , "CPN" , "CPO" , "CPP" , "CPQ" , "CPR" , "CPS" , "CPT" ,
+"CPU" , "CPV" , "CPW" , "CPX" , "CPY" , "CPZ" , "CP0" , "CP1" ,
+"CP2" , "CP3" , "CP4" , "CP5" , "CP6" , "CP7" , "CP8" , "CP9" ,
+"CQA" , "CQB" , "CQC" , "CQD" , "CQE" , "CQF" , "CQG" , "CQH" ,
+"CQI" , "CQJ" , "CQK" , "CQL" , "CQM" , "CQN" , "CQO" , "CQP" ,
+"CQQ" , "CQR" , "CQS" , "CQT" , "CQU" , "CQV" , "CQW" , "CQX" ,
+"CQY" , "CQZ" , "CQ0" , "CQ1" , "CQ2" , "CQ3" , "CQ4" , "CQ5" ,
+"CQ6" , "CQ7" , "CQ8" , "CQ9" , "CRA" , "CRB" , "CRC" , "CRD" ,
+"CRE" , "CRF" , "CRG" , "CRH" , "CRI" , "CRJ" , "CRK" , "CRL" ,
+"CRM" , "CRN" , "CRO" , "CRP" , "CRQ" , "CRR" , "CRS" , "CRT" ,
+"CRU" , "CRV" , "CRW" , "CRX" , "CRY" , "CRZ" , "CR0" , "CR1" ,
+"CR2" , "CR3" , "CR4" , "CR5" , "CR6" , "CR7" , "CR8" , "CR9" ,
+"CSA" , "CSB" , "CSC" , "CSD" , "CSE" , "CSF" , "CSG" , "CSH" ,
+"CSI" , "CSJ" , "CSK" , "CSL" , "CSM" , "CSN" , "CSO" , "CSP" ,
+"CSQ" , "CSR" , "CSS" , "CST" , "CSU" , "CSV" , "CSW" , "CSX" ,
+"CSY" , "CSZ" , "CS0" , "CS1" , "CS2" , "CS3" , "CS4" , "CS5" ,
+"CS6" , "CS7" , "CS8" , "CS9" , "CTA" , "CTB" , "CTC" , "CTD" ,
+"CTE" , "CTF" , "CTG" , "CTH" , "CTI" , "CTJ" , "CTK" , "CTL" ,
+"CTM" , "CTN" , "CTO" , "CTP" , "CTQ" , "CTR" , "CTS" , "CTT" ,
+"CTU" , "CTV" , "CTW" , "CTX" , "CTY" , "CTZ" , "CT0" , "CT1" ,
+"CT2" , "CT3" , "CT4" , "CT5" , "CT6" , "CT7" , "CT8" , "CT9" ,
+"CUA" , "CUB" , "CUC" , "CUD" , "CUE" , "CUF" , "CUG" , "CUH" ,
+"CUI" , "CUJ" , "CUK" , "CUL" , "CUM" , "CUN" , "CUO" , "CUP" ,
+"CUQ" , "CUR" , "CUS" , "CUT" , "CUU" , "CUV" , "CUW" , "CUX" ,
+"CUY" , "CUZ" , "CU0" , "CU1" , "CU2" , "CU3" , "CU4" , "CU5" ,
+"CU6" , "CU7" , "CU8" , "CU9" , "CVA" , "CVB" , "CVC" , "CVD" ,
+"CVE" , "CVF" , "CVG" , "CVH" , "CVI" , "CVJ" , "CVK" , "CVL" ,
+"CVM" , "CVN" , "CVO" , "CVP" , "CVQ" , "CVR" , "CVS" , "CVT" ,
+"CVU" , "CVV" , "CVW" , "CVX" , "CVY" , "CVZ" , "CV0" , "CV1" ,
+"CV2" , "CV3" , "CV4" , "CV5" , "CV6" , "CV7" , "CV8" , "CV9" ,
+"CWA" , "CWB" , "CWC" , "CWD" , "CWE" , "CWF" , "CWG" , "CWH" ,
+"CWI" , "CWJ" , "CWK" , "CWL" , "CWM" , "CWN" , "CWO" , "CWP" ,
+"CWQ" , "CWR" , "CWS" , "CWT" , "CWU" , "CWV" , "CWW" , "CWX" ,
+"CWY" , "CWZ" , "CW0" , "CW1" , "CW2" , "CW3" , "CW4" , "CW5" ,
+"CW6" , "CW7" , "CW8" , "CW9" , "CXA" , "CXB" , "CXC" , "CXD" ,
+"CXE" , "CXF" , "CXG" , "CXH" , "CXI" , "CXJ" , "CXK" , "CXL" ,
+"CXM" , "CXN" , "CXO" , "CXP" , "CXQ" , "CXR" , "CXS" , "CXT" ,
+"CXU" , "CXV" , "CXW" , "CXX" , "CXY" , "CXZ" , "CX0" , "CX1" ,
+"CX2" , "CX3" , "CX4" , "CX5" , "CX6" , "CX7" , "CX8" , "CX9" ,
+"CYA" , "CYB" , "CYC" , "CYD" , "CYE" , "CYF" , "CYG" , "CYH" ,
+"CYI" , "CYJ" , "CYK" , "CYL" , "CYM" , "CYN" , "CYO" , "CYP" ,
+"CYQ" , "CYR" , "CYS" , "CYT" , "CYU" , "CYV" , "CYW" , "CYX" ,
+"CYY" , "CYZ" , "CY0" , "CY1" , "CY2" , "CY3" , "CY4" , "CY5" ,
+"CY6" , "CY7" , "CY8" , "CY9" , "CZA" , "CZB" , "CZC" , "CZD" ,
+"CZE" , "CZF" , "CZG" , "CZH" , "CZI" , "CZJ" , "CZK" , "CZL" ,
+"CZM" , "CZN" , "CZO" , "CZP" , "CZQ" , "CZR" , "CZS" , "CZT" ,
+"CZU" , "CZV" , "CZW" , "CZX" , "CZY" , "CZZ" , "CZ0" , "CZ1" ,
+"CZ2" , "CZ3" , "CZ4" , "CZ5" , "CZ6" , "CZ7" , "CZ8" , "CZ9" ,
+"C0A" , "C0B" , "C0C" , "C0D" , "C0E" , "C0F" , "C0G" , "C0H" ,
+"C0I" , "C0J" , "C0K" , "C0L" , "C0M" , "C0N" , "C0O" , "C0P" ,
+"C0Q" , "C0R" , "C0S" , "C0T" , "C0U" , "C0V" , "C0W" , "C0X" ,
+"C0Y" , "C0Z" , "C00" , "C01" , "C02" , "C03" , "C04" , "C05" ,
+"C06" , "C07" , "C08" , "C09" , "C1A" , "C1B" , "C1C" , "C1D" ,
+"C1E" , "C1F" , "C1G" , "C1H" , "C1I" , "C1J" , "C1K" , "C1L" ,
+"C1M" , "C1N" , "C1O" , "C1P" , "C1Q" , "C1R" , "C1S" , "C1T" ,
+"C1U" , "C1V" , "C1W" , "C1X" , "C1Y" , "C1Z" , "C10" , "C11" ,
+"C12" , "C13" , "C14" , "C15" , "C16" , "C17" , "C18" , "C19" ,
+"C2A" , "C2B" , "C2C" , "C2D" , "C2E" , "C2F" , "C2G" , "C2H" ,
+"C2I" , "C2J" , "C2K" , "C2L" , "C2M" , "C2N" , "C2O" , "C2P" ,
+"C2Q" , "C2R" , "C2S" , "C2T" , "C2U" , "C2V" , "C2W" , "C2X" ,
+"C2Y" , "C2Z" , "C20" , "C21" , "C22" , "C23" , "C24" , "C25" ,
+"C26" , "C27" , "C28" , "C29" , "C3A" , "C3B" , "C3C" , "C3D" ,
+"C3E" , "C3F" , "C3G" , "C3H" , "C3I" , "C3J" , "C3K" , "C3L" ,
+"C3M" , "C3N" , "C3O" , "C3P" , "C3Q" , "C3R" , "C3S" , "C3T" ,
+"C3U" , "C3V" , "C3W" , "C3X" , "C3Y" , "C3Z" , "C30" , "C31" ,
+"C32" , "C33" , "C34" , "C35" , "C36" , "C37" , "C38" , "C39" ,
+"C4A" , "C4B" , "C4C" , "C4D" , "C4E" , "C4F" , "C4G" , "C4H" ,
+"C4I" , "C4J" , "C4K" , "C4L" , "C4M" , "C4N" , "C4O" , "C4P" ,
+"C4Q" , "C4R" , "C4S" , "C4T" , "C4U" , "C4V" , "C4W" , "C4X" ,
+"C4Y" , "C4Z" , "C40" , "C41" , "C42" , "C43" , "C44" , "C45" ,
+"C46" , "C47" , "C48" , "C49" , "C5A" , "C5B" , "C5C" , "C5D" ,
+"C5E" , "C5F" , "C5G" , "C5H" , "C5I" , "C5J" , "C5K" , "C5L" ,
+"C5M" , "C5N" , "C5O" , "C5P" , "C5Q" , "C5R" , "C5S" , "C5T" ,
+"C5U" , "C5V" , "C5W" , "C5X" , "C5Y" , "C5Z" , "C50" , "C51" ,
+"C52" , "C53" , "C54" , "C55" , "C56" , "C57" , "C58" , "C59" ,
+"C6A" , "C6B" , "C6C" , "C6D" , "C6E" , "C6F" , "C6G" , "C6H" ,
+"C6I" , "C6J" , "C6K" , "C6L" , "C6M" , "C6N" , "C6O" , "C6P" ,
+"C6Q" , "C6R" , "C6S" , "C6T" , "C6U" , "C6V" , "C6W" , "C6X" ,
+"C6Y" , "C6Z" , "C60" , "C61" , "C62" , "C63" , "C64" , "C65" ,
+"C66" , "C67" , "C68" , "C69" , "C7A" , "C7B" , "C7C" , "C7D" ,
+"C7E" , "C7F" , "C7G" , "C7H" , "C7I" , "C7J" , "C7K" , "C7L" ,
+"C7M" , "C7N" , "C7O" , "C7P" , "C7Q" , "C7R" , "C7S" , "C7T" ,
+"C7U" , "C7V" , "C7W" , "C7X" , "C7Y" , "C7Z" , "C70" , "C71" ,
+"C72" , "C73" , "C74" , "C75" , "C76" , "C77" , "C78" , "C79" ,
+"C8A" , "C8B" , "C8C" , "C8D" , "C8E" , "C8F" , "C8G" , "C8H" ,
+"C8I" , "C8J" , "C8K" , "C8L" , "C8M" , "C8N" , "C8O" , "C8P" ,
+"C8Q" , "C8R" , "C8S" , "C8T" , "C8U" , "C8V" , "C8W" , "C8X" ,
+"C8Y" , "C8Z" , "C80" , "C81" , "C82" , "C83" , "C84" , "C85" ,
+"C86" , "C87" , "C88" , "C89" , "C9A" , "C9B" , "C9C" , "C9D" ,
+"C9E" , "C9F" , "C9G" , "C9H" , "C9I" , "C9J" , "C9K" , "C9L" ,
+"C9M" , "C9N" , "C9O" , "C9P" , "C9Q" , "C9R" , "C9S" , "C9T" ,
+"C9U" , "C9V" , "C9W" , "C9X" , "C9Y" , "C9Z" , "C90" , "C91" ,
+"C92" , "C93" , "C94" , "C95" , "C96" , "C97" , "C98" , "C99" ,
+"DAA" , "DAB" , "DAC" , "DAD" , "DAE" , "DAF" , "DAG" , "DAH" ,
+"DAI" , "DAJ" , "DAK" , "DAL" , "DAM" , "DAN" , "DAO" , "DAP" ,
+"DAQ" , "DAR" , "DAS" , "DAT" , "DAU" , "DAV" , "DAW" , "DAX" ,
+"DAY" , "DAZ" , "DA0" , "DA1" , "DA2" , "DA3" , "DA4" , "DA5" ,
+"DA6" , "DA7" , "DA8" , "DA9" , "DBA" , "DBB" , "DBC" , "DBD" ,
+"DBE" , "DBF" , "DBG" , "DBH" , "DBI" , "DBJ" , "DBK" , "DBL" ,
+"DBM" , "DBN" , "DBO" , "DBP" , "DBQ" , "DBR" , "DBS" , "DBT" ,
+"DBU" , "DBV" , "DBW" , "DBX" , "DBY" , "DBZ" , "DB0" , "DB1" ,
+"DB2" , "DB3" , "DB4" , "DB5" , "DB6" , "DB7" , "DB8" , "DB9" ,
+"DCA" , "DCB" , "DCC" , "DCD" , "DCE" , "DCF" , "DCG" , "DCH" ,
+"DCI" , "DCJ" , "DCK" , "DCL" , "DCM" , "DCN" , "DCO" , "DCP" ,
+"DCQ" , "DCR" , "DCS" , "DCT" , "DCU" , "DCV" , "DCW" , "DCX" ,
+"DCY" , "DCZ" , "DC0" , "DC1" , "DC2" , "DC3" , "DC4" , "DC5" ,
+"DC6" , "DC7" , "DC8" , "DC9" , "DDA" , "DDB" , "DDC" , "DDD" ,
+"DDE" , "DDF" , "DDG" , "DDH" , "DDI" , "DDJ" , "DDK" , "DDL" ,
+"DDM" , "DDN" , "DDO" , "DDP" , "DDQ" , "DDR" , "DDS" , "DDT" ,
+"DDU" , "DDV" , "DDW" , "DDX" , "DDY" , "DDZ" , "DD0" , "DD1" ,
+"DD2" , "DD3" , "DD4" , "DD5" , "DD6" , "DD7" , "DD8" , "DD9" ,
+"DEA" , "DEB" , "DEC" , "DED" , "DEE" , "DEF" , "DEG" , "DEH" ,
+"DEI" , "DEJ" , "DEK" , "DEL" , "DEM" , "DEN" , "DEO" , "DEP" ,
+"DEQ" , "DER" , "DES" , "DET" , "DEU" , "DEV" , "DEW" , "DEX" ,
+"DEY" , "DEZ" , "DE0" , "DE1" , "DE2" , "DE3" , "DE4" , "DE5" ,
+"DE6" , "DE7" , "DE8" , "DE9" , "DFA" , "DFB" , "DFC" , "DFD" ,
+"DFE" , "DFF" , "DFG" , "DFH" , "DFI" , "DFJ" , "DFK" , "DFL" ,
+"DFM" , "DFN" , "DFO" , "DFP" , "DFQ" , "DFR" , "DFS" , "DFT" ,
+"DFU" , "DFV" , "DFW" , "DFX" , "DFY" , "DFZ" , "DF0" , "DF1" ,
+"DF2" , "DF3" , "DF4" , "DF5" , "DF6" , "DF7" , "DF8" , "DF9" ,
+"DGA" , "DGB" , "DGC" , "DGD" , "DGE" , "DGF" , "DGG" , "DGH" ,
+"DGI" , "DGJ" , "DGK" , "DGL" , "DGM" , "DGN" , "DGO" , "DGP" ,
+"DGQ" , "DGR" , "DGS" , "DGT" , "DGU" , "DGV" , "DGW" , "DGX" ,
+"DGY" , "DGZ" , "DG0" , "DG1" , "DG2" , "DG3" , "DG4" , "DG5" ,
+"DG6" , "DG7" , "DG8" , "DG9" , "DHA" , "DHB" , "DHC" , "DHD" ,
+"DHE" , "DHF" , "DHG" , "DHH" , "DHI" , "DHJ" , "DHK" , "DHL" ,
+"DHM" , "DHN" , "DHO" , "DHP" , "DHQ" , "DHR" , "DHS" , "DHT" ,
+"DHU" , "DHV" , "DHW" , "DHX" , "DHY" , "DHZ" , "DH0" , "DH1" ,
+"DH2" , "DH3" , "DH4" , "DH5" , "DH6" , "DH7" , "DH8" , "DH9" ,
+"DIA" , "DIB" , "DIC" , "DID" , "DIE" , "DIF" , "DIG" , "DIH" ,
+"DII" , "DIJ" , "DIK" , "DIL" , "DIM" , "DIN" , "DIO" , "DIP" ,
+"DIQ" , "DIR" , "DIS" , "DIT" , "DIU" , "DIV" , "DIW" , "DIX" ,
+"DIY" , "DIZ" , "DI0" , "DI1" , "DI2" , "DI3" , "DI4" , "DI5" ,
+"DI6" , "DI7" , "DI8" , "DI9" , "DJA" , "DJB" , "DJC" , "DJD" ,
+"DJE" , "DJF" , "DJG" , "DJH" , "DJI" , "DJJ" , "DJK" , "DJL" ,
+"DJM" , "DJN" , "DJO" , "DJP" , "DJQ" , "DJR" , "DJS" , "DJT" ,
+"DJU" , "DJV" , "DJW" , "DJX" , "DJY" , "DJZ" , "DJ0" , "DJ1" ,
+"DJ2" , "DJ3" , "DJ4" , "DJ5" , "DJ6" , "DJ7" , "DJ8" , "DJ9" ,
+"DKA" , "DKB" , "DKC" , "DKD" , "DKE" , "DKF" , "DKG" , "DKH" ,
+"DKI" , "DKJ" , "DKK" , "DKL" , "DKM" , "DKN" , "DKO" , "DKP" ,
+"DKQ" , "DKR" , "DKS" , "DKT" , "DKU" , "DKV" , "DKW" , "DKX" ,
+"DKY" , "DKZ" , "DK0" , "DK1" , "DK2" , "DK3" , "DK4" , "DK5" ,
+"DK6" , "DK7" , "DK8" , "DK9" , "DLA" , "DLB" , "DLC" , "DLD" ,
+"DLE" , "DLF" , "DLG" , "DLH" , "DLI" , "DLJ" , "DLK" , "DLL" ,
+"DLM" , "DLN" , "DLO" , "DLP" , "DLQ" , "DLR" , "DLS" , "DLT" ,
+"DLU" , "DLV" , "DLW" , "DLX" , "DLY" , "DLZ" , "DL0" , "DL1" ,
+"DL2" , "DL3" , "DL4" , "DL5" , "DL6" , "DL7" , "DL8" , "DL9" ,
+"DMA" , "DMB" , "DMC" , "DMD" , "DME" , "DMF" , "DMG" , "DMH" ,
+"DMI" , "DMJ" , "DMK" , "DML" , "DMM" , "DMN" , "DMO" , "DMP" ,
+"DMQ" , "DMR" , "DMS" , "DMT" , "DMU" , "DMV" , "DMW" , "DMX" ,
+"DMY" , "DMZ" , "DM0" , "DM1" , "DM2" , "DM3" , "DM4" , "DM5" ,
+"DM6" , "DM7" , "DM8" , "DM9" , "DNA" , "DNB" , "DNC" , "DND" ,
+"DNE" , "DNF" , "DNG" , "DNH" , "DNI" , "DNJ" , "DNK" , "DNL" ,
+"DNM" , "DNN" , "DNO" , "DNP" , "DNQ" , "DNR" , "DNS" , "DNT" ,
+"DNU" , "DNV" , "DNW" , "DNX" , "DNY" , "DNZ" , "DN0" , "DN1" ,
+"DN2" , "DN3" , "DN4" , "DN5" , "DN6" , "DN7" , "DN8" , "DN9" ,
+"DOA" , "DOB" , "DOC" , "DOD" , "DOE" , "DOF" , "DOG" , "DOH" ,
+"DOI" , "DOJ" , "DOK" , "DOL" , "DOM" , "DON" , "DOO" , "DOP" ,
+"DOQ" , "DOR" , "DOS" , "DOT" , "DOU" , "DOV" , "DOW" , "DOX" ,
+"DOY" , "DOZ" , "DO0" , "DO1" , "DO2" , "DO3" , "DO4" , "DO5" ,
+"DO6" , "DO7" , "DO8" , "DO9" , "DPA" , "DPB" , "DPC" , "DPD" ,
+"DPE" , "DPF" , "DPG" , "DPH" , "DPI" , "DPJ" , "DPK" , "DPL" ,
+"DPM" , "DPN" , "DPO" , "DPP" , "DPQ" , "DPR" , "DPS" , "DPT" ,
+"DPU" , "DPV" , "DPW" , "DPX" , "DPY" , "DPZ" , "DP0" , "DP1" ,
+"DP2" , "DP3" , "DP4" , "DP5" , "DP6" , "DP7" , "DP8" , "DP9" ,
+"DQA" , "DQB" , "DQC" , "DQD" , "DQE" , "DQF" , "DQG" , "DQH" ,
+"DQI" , "DQJ" , "DQK" , "DQL" , "DQM" , "DQN" , "DQO" , "DQP" ,
+"DQQ" , "DQR" , "DQS" , "DQT" , "DQU" , "DQV" , "DQW" , "DQX" ,
+"DQY" , "DQZ" , "DQ0" , "DQ1" , "DQ2" , "DQ3" , "DQ4" , "DQ5" ,
+"DQ6" , "DQ7" , "DQ8" , "DQ9" , "DRA" , "DRB" , "DRC" , "DRD" ,
+"DRE" , "DRF" , "DRG" , "DRH" , "DRI" , "DRJ" , "DRK" , "DRL" ,
+"DRM" , "DRN" , "DRO" , "DRP" , "DRQ" , "DRR" , "DRS" , "DRT" ,
+"DRU" , "DRV" , "DRW" , "DRX" , "DRY" , "DRZ" , "DR0" , "DR1" ,
+"DR2" , "DR3" , "DR4" , "DR5" , "DR6" , "DR7" , "DR8" , "DR9" ,
+"DSA" , "DSB" , "DSC" , "DSD" , "DSE" , "DSF" , "DSG" , "DSH" ,
+"DSI" , "DSJ" , "DSK" , "DSL" , "DSM" , "DSN" , "DSO" , "DSP" ,
+"DSQ" , "DSR" , "DSS" , "DST" , "DSU" , "DSV" , "DSW" , "DSX" ,
+"DSY" , "DSZ" , "DS0" , "DS1" , "DS2" , "DS3" , "DS4" , "DS5" ,
+"DS6" , "DS7" , "DS8" , "DS9" , "DTA" , "DTB" , "DTC" , "DTD" ,
+"DTE" , "DTF" , "DTG" , "DTH" , "DTI" , "DTJ" , "DTK" , "DTL" ,
+"DTM" , "DTN" , "DTO" , "DTP" , "DTQ" , "DTR" , "DTS" , "DTT" ,
+"DTU" , "DTV" , "DTW" , "DTX" , "DTY" , "DTZ" , "DT0" , "DT1" ,
+"DT2" , "DT3" , "DT4" , "DT5" , "DT6" , "DT7" , "DT8" , "DT9" ,
+"DUA" , "DUB" , "DUC" , "DUD" , "DUE" , "DUF" , "DUG" , "DUH" ,
+"DUI" , "DUJ" , "DUK" , "DUL" , "DUM" , "DUN" , "DUO" , "DUP" ,
+"DUQ" , "DUR" , "DUS" , "DUT" , "DUU" , "DUV" , "DUW" , "DUX" ,
+"DUY" , "DUZ" , "DU0" , "DU1" , "DU2" , "DU3" , "DU4" , "DU5" ,
+"DU6" , "DU7" , "DU8" , "DU9" , "DVA" , "DVB" , "DVC" , "DVD" ,
+"DVE" , "DVF" , "DVG" , "DVH" , "DVI" , "DVJ" , "DVK" , "DVL" ,
+"DVM" , "DVN" , "DVO" , "DVP" , "DVQ" , "DVR" , "DVS" , "DVT" ,
+"DVU" , "DVV" , "DVW" , "DVX" , "DVY" , "DVZ" , "DV0" , "DV1" ,
+"DV2" , "DV3" , "DV4" , "DV5" , "DV6" , "DV7" , "DV8" , "DV9" ,
+"DWA" , "DWB" , "DWC" , "DWD" , "DWE" , "DWF" , "DWG" , "DWH" ,
+"DWI" , "DWJ" , "DWK" , "DWL" , "DWM" , "DWN" , "DWO" , "DWP" ,
+"DWQ" , "DWR" , "DWS" , "DWT" , "DWU" , "DWV" , "DWW" , "DWX" ,
+"DWY" , "DWZ" , "DW0" , "DW1" , "DW2" , "DW3" , "DW4" , "DW5" ,
+"DW6" , "DW7" , "DW8" , "DW9" , "DXA" , "DXB" , "DXC" , "DXD" ,
+"DXE" , "DXF" , "DXG" , "DXH" , "DXI" , "DXJ" , "DXK" , "DXL" ,
+"DXM" , "DXN" , "DXO" , "DXP" , "DXQ" , "DXR" , "DXS" , "DXT" ,
+"DXU" , "DXV" , "DXW" , "DXX" , "DXY" , "DXZ" , "DX0" , "DX1" ,
+"DX2" , "DX3" , "DX4" , "DX5" , "DX6" , "DX7" , "DX8" , "DX9" ,
+"DYA" , "DYB" , "DYC" , "DYD" , "DYE" , "DYF" , "DYG" , "DYH" ,
+"DYI" , "DYJ" , "DYK" , "DYL" , "DYM" , "DYN" , "DYO" , "DYP" ,
+"DYQ" , "DYR" , "DYS" , "DYT" , "DYU" , "DYV" , "DYW" , "DYX" ,
+"DYY" , "DYZ" , "DY0" , "DY1" , "DY2" , "DY3" , "DY4" , "DY5" ,
+"DY6" , "DY7" , "DY8" , "DY9" , "DZA" , "DZB" , "DZC" , "DZD" ,
+"DZE" , "DZF" , "DZG" , "DZH" , "DZI" , "DZJ" , "DZK" , "DZL" ,
+"DZM" , "DZN" , "DZO" , "DZP" , "DZQ" , "DZR" , "DZS" , "DZT" ,
+"DZU" , "DZV" , "DZW" , "DZX" , "DZY" , "DZZ" , "DZ0" , "DZ1" ,
+"DZ2" , "DZ3" , "DZ4" , "DZ5" , "DZ6" , "DZ7" , "DZ8" , "DZ9" ,
+"D0A" , "D0B" , "D0C" , "D0D" , "D0E" , "D0F" , "D0G" , "D0H" ,
+"D0I" , "D0J" , "D0K" , "D0L" , "D0M" , "D0N" , "D0O" , "D0P" ,
+"D0Q" , "D0R" , "D0S" , "D0T" , "D0U" , "D0V" , "D0W" , "D0X" ,
+"D0Y" , "D0Z" , "D00" , "D01" , "D02" , "D03" , "D04" , "D05" ,
+"D06" , "D07" , "D08" , "D09" , "D1A" , "D1B" , "D1C" , "D1D" ,
+"D1E" , "D1F" , "D1G" , "D1H" , "D1I" , "D1J" , "D1K" , "D1L" ,
+"D1M" , "D1N" , "D1O" , "D1P" , "D1Q" , "D1R" , "D1S" , "D1T" ,
+"D1U" , "D1V" , "D1W" , "D1X" , "D1Y" , "D1Z" , "D10" , "D11" ,
+"D12" , "D13" , "D14" , "D15" , "D16" , "D17" , "D18" , "D19" ,
+"D2A" , "D2B" , "D2C" , "D2D" , "D2E" , "D2F" , "D2G" , "D2H" ,
+"D2I" , "D2J" , "D2K" , "D2L" , "D2M" , "D2N" , "D2O" , "D2P" ,
+"D2Q" , "D2R" , "D2S" , "D2T" , "D2U" , "D2V" , "D2W" , "D2X" ,
+"D2Y" , "D2Z" , "D20" , "D21" , "D22" , "D23" , "D24" , "D25" ,
+"D26" , "D27" , "D28" , "D29" , "D3A" , "D3B" , "D3C" , "D3D" ,
+"D3E" , "D3F" , "D3G" , "D3H" , "D3I" , "D3J" , "D3K" , "D3L" ,
+"D3M" , "D3N" , "D3O" , "D3P" , "D3Q" , "D3R" , "D3S" , "D3T" ,
+"D3U" , "D3V" , "D3W" , "D3X" , "D3Y" , "D3Z" , "D30" , "D31" ,
+"D32" , "D33" , "D34" , "D35" , "D36" , "D37" , "D38" , "D39" ,
+"D4A" , "D4B" , "D4C" , "D4D" , "D4E" , "D4F" , "D4G" , "D4H" ,
+"D4I" , "D4J" , "D4K" , "D4L" , "D4M" , "D4N" , "D4O" , "D4P" ,
+"D4Q" , "D4R" , "D4S" , "D4T" , "D4U" , "D4V" , "D4W" , "D4X" ,
+"D4Y" , "D4Z" , "D40" , "D41" , "D42" , "D43" , "D44" , "D45" ,
+"D46" , "D47" , "D48" , "D49" , "D5A" , "D5B" , "D5C" , "D5D" ,
+"D5E" , "D5F" , "D5G" , "D5H" , "D5I" , "D5J" , "D5K" , "D5L" ,
+"D5M" , "D5N" , "D5O" , "D5P" , "D5Q" , "D5R" , "D5S" , "D5T" ,
+"D5U" , "D5V" , "D5W" , "D5X" , "D5Y" , "D5Z" , "D50" , "D51" ,
+"D52" , "D53" , "D54" , "D55" , "D56" , "D57" , "D58" , "D59" ,
+"D6A" , "D6B" , "D6C" , "D6D" , "D6E" , "D6F" , "D6G" , "D6H" ,
+"D6I" , "D6J" , "D6K" , "D6L" , "D6M" , "D6N" , "D6O" , "D6P" ,
+"D6Q" , "D6R" , "D6S" , "D6T" , "D6U" , "D6V" , "D6W" , "D6X" ,
+"D6Y" , "D6Z" , "D60" , "D61" , "D62" , "D63" , "D64" , "D65" ,
+"D66" , "D67" , "D68" , "D69" , "D7A" , "D7B" , "D7C" , "D7D" ,
+"D7E" , "D7F" , "D7G" , "D7H" , "D7I" , "D7J" , "D7K" , "D7L" ,
+"D7M" , "D7N" , "D7O" , "D7P" , "D7Q" , "D7R" , "D7S" , "D7T" ,
+"D7U" , "D7V" , "D7W" , "D7X" , "D7Y" , "D7Z" , "D70" , "D71" ,
+"D72" , "D73" , "D74" , "D75" , "D76" , "D77" , "D78" , "D79" ,
+"D8A" , "D8B" , "D8C" , "D8D" , "D8E" , "D8F" , "D8G" , "D8H" ,
+"D8I" , "D8J" , "D8K" , "D8L" , "D8M" , "D8N" , "D8O" , "D8P" ,
+"D8Q" , "D8R" , "D8S" , "D8T" , "D8U" , "D8V" , "D8W" , "D8X" ,
+"D8Y" , "D8Z" , "D80" , "D81" , "D82" , "D83" , "D84" , "D85" ,
+"D86" , "D87" , "D88" , "D89" , "D9A" , "D9B" , "D9C" , "D9D" ,
+"D9E" , "D9F" , "D9G" , "D9H" , "D9I" , "D9J" , "D9K" , "D9L" ,
+"D9M" , "D9N" , "D9O" , "D9P" , "D9Q" , "D9R" , "D9S" , "D9T" ,
+"D9U" , "D9V" , "D9W" , "D9X" , "D9Y" , "D9Z" , "D90" , "D91" ,
+"D92" , "D93" , "D94" , "D95" , "D96" , "D97" , "D98" , "D99" ,
+"EAA" , "EAB" , "EAC" , "EAD" , "EAE" , "EAF" , "EAG" , "EAH" ,
+"EAI" , "EAJ" , "EAK" , "EAL" , "EAM" , "EAN" , "EAO" , "EAP" ,
+"EAQ" , "EAR" , "EAS" , "EAT" , "EAU" , "EAV" , "EAW" , "EAX" ,
+"EAY" , "EAZ" , "EA0" , "EA1" , "EA2" , "EA3" , "EA4" , "EA5" ,
+"EA6" , "EA7" , "EA8" , "EA9" , "EBA" , "EBB" , "EBC" , "EBD" ,
+"EBE" , "EBF" , "EBG" , "EBH" , "EBI" , "EBJ" , "EBK" , "EBL" ,
+"EBM" , "EBN" , "EBO" , "EBP" , "EBQ" , "EBR" , "EBS" , "EBT" ,
+"EBU" , "EBV" , "EBW" , "EBX" , "EBY" , "EBZ" , "EB0" , "EB1" ,
+"EB2" , "EB3" , "EB4" , "EB5" , "EB6" , "EB7" , "EB8" , "EB9" ,
+"ECA" , "ECB" , "ECC" , "ECD" , "ECE" , "ECF" , "ECG" , "ECH" ,
+"ECI" , "ECJ" , "ECK" , "ECL" , "ECM" , "ECN" , "ECO" , "ECP" ,
+"ECQ" , "ECR" , "ECS" , "ECT" , "ECU" , "ECV" , "ECW" , "ECX" ,
+"ECY" , "ECZ" , "EC0" , "EC1" , "EC2" , "EC3" , "EC4" , "EC5" ,
+"EC6" , "EC7" , "EC8" , "EC9" , "EDA" , "EDB" , "EDC" , "EDD" ,
+"EDE" , "EDF" , "EDG" , "EDH" , "EDI" , "EDJ" , "EDK" , "EDL" ,
+"EDM" , "EDN" , "EDO" , "EDP" , "EDQ" , "EDR" , "EDS" , "EDT" ,
+"EDU" , "EDV" , "EDW" , "EDX" , "EDY" , "EDZ" , "ED0" , "ED1" ,
+"ED2" , "ED3" , "ED4" , "ED5" , "ED6" , "ED7" , "ED8" , "ED9" ,
+"EEA" , "EEB" , "EEC" , "EED" , "EEE" , "EEF" , "EEG" , "EEH" ,
+"EEI" , "EEJ" , "EEK" , "EEL" , "EEM" , "EEN" , "EEO" , "EEP" ,
+"EEQ" , "EER" , "EES" , "EET" , "EEU" , "EEV" , "EEW" , "EEX" ,
+"EEY" , "EEZ" , "EE0" , "EE1" , "EE2" , "EE3" , "EE4" , "EE5" ,
+"EE6" , "EE7" , "EE8" , "EE9" , "EFA" , "EFB" , "EFC" , "EFD" ,
+"EFE" , "EFF" , "EFG" , "EFH" , "EFI" , "EFJ" , "EFK" , "EFL" ,
+"EFM" , "EFN" , "EFO" , "EFP" , "EFQ" , "EFR" , "EFS" , "EFT" ,
+"EFU" , "EFV" , "EFW" , "EFX" , "EFY" , "EFZ" , "EF0" , "EF1" ,
+"EF2" , "EF3" , "EF4" , "EF5" , "EF6" , "EF7" , "EF8" , "EF9" ,
+"EGA" , "EGB" , "EGC" , "EGD" , "EGE" , "EGF" , "EGG" , "EGH" ,
+"EGI" , "EGJ" , "EGK" , "EGL" , "EGM" , "EGN" , "EGO" , "EGP" ,
+"EGQ" , "EGR" , "EGS" , "EGT" , "EGU" , "EGV" , "EGW" , "EGX" ,
+"EGY" , "EGZ" , "EG0" , "EG1" , "EG2" , "EG3" , "EG4" , "EG5" ,
+"EG6" , "EG7" , "EG8" , "EG9" , "EHA" , "EHB" , "EHC" , "EHD" ,
+"EHE" , "EHF" , "EHG" , "EHH" , "EHI" , "EHJ" , "EHK" , "EHL" ,
+"EHM" , "EHN" , "EHO" , "EHP" , "EHQ" , "EHR" , "EHS" , "EHT" ,
+"EHU" , "EHV" , "EHW" , "EHX" , "EHY" , "EHZ" , "EH0" , "EH1" ,
+"EH2" , "EH3" , "EH4" , "EH5" , "EH6" , "EH7" , "EH8" , "EH9" ,
+"EIA" , "EIB" , "EIC" , "EID" , "EIE" , "EIF" , "EIG" , "EIH" ,
+"EII" , "EIJ" , "EIK" , "EIL" , "EIM" , "EIN" , "EIO" , "EIP" ,
+"EIQ" , "EIR" , "EIS" , "EIT" , "EIU" , "EIV" , "EIW" , "EIX" ,
+"EIY" , "EIZ" , "EI0" , "EI1" , "EI2" , "EI3" , "EI4" , "EI5" ,
+"EI6" , "EI7" , "EI8" , "EI9" , "EJA" , "EJB" , "EJC" , "EJD" ,
+"EJE" , "EJF" , "EJG" , "EJH" , "EJI" , "EJJ" , "EJK" , "EJL" ,
+"EJM" , "EJN" , "EJO" , "EJP" , "EJQ" , "EJR" , "EJS" , "EJT" ,
+"EJU" , "EJV" , "EJW" , "EJX" , "EJY" , "EJZ" , "EJ0" , "EJ1" ,
+"EJ2" , "EJ3" , "EJ4" , "EJ5" , "EJ6" , "EJ7" , "EJ8" , "EJ9" ,
+"EKA" , "EKB" , "EKC" , "EKD" , "EKE" , "EKF" , "EKG" , "EKH" ,
+"EKI" , "EKJ" , "EKK" , "EKL" , "EKM" , "EKN" , "EKO" , "EKP" ,
+"EKQ" , "EKR" , "EKS" , "EKT" , "EKU" , "EKV" , "EKW" , "EKX" ,
+"EKY" , "EKZ" , "EK0" , "EK1" , "EK2" , "EK3" , "EK4" , "EK5" ,
+"EK6" , "EK7" , "EK8" , "EK9" , "ELA" , "ELB" , "ELC" , "ELD" ,
+"ELE" , "ELF" , "ELG" , "ELH" , "ELI" , "ELJ" , "ELK" , "ELL" ,
+"ELM" , "ELN" , "ELO" , "ELP" , "ELQ" , "ELR" , "ELS" , "ELT" ,
+"ELU" , "ELV" , "ELW" , "ELX" , "ELY" , "ELZ" , "EL0" , "EL1" ,
+"EL2" , "EL3" , "EL4" , "EL5" , "EL6" , "EL7" , "EL8" , "EL9" ,
+"EMA" , "EMB" , "EMC" , "EMD" , "EME" , "EMF" , "EMG" , "EMH" ,
+"EMI" , "EMJ" , "EMK" , "EML" , "EMM" , "EMN" , "EMO" , "EMP" ,
+"EMQ" , "EMR" , "EMS" , "EMT" , "EMU" , "EMV" , "EMW" , "EMX" ,
+"EMY" , "EMZ" , "EM0" , "EM1" , "EM2" , "EM3" , "EM4" , "EM5" ,
+"EM6" , "EM7" , "EM8" , "EM9" , "ENA" , "ENB" , "ENC" , "END" ,
+"ENE" , "ENF" , "ENG" , "ENH" , "ENI" , "ENJ" , "ENK" , "ENL" ,
+"ENM" , "ENN" , "ENO" , "ENP" , "ENQ" , "ENR" , "ENS" , "ENT" ,
+"ENU" , "ENV" , "ENW" , "ENX" , "ENY" , "ENZ" , "EN0" , "EN1" ,
+"EN2" , "EN3" , "EN4" , "EN5" , "EN6" , "EN7" , "EN8" , "EN9" ,
+"EOA" , "EOB" , "EOC" , "EOD" , "EOE" , "EOF" , "EOG" , "EOH" ,
+"EOI" , "EOJ" , "EOK" , "EOL" , "EOM" , "EON" , "EOO" , "EOP" ,
+"EOQ" , "EOR" , "EOS" , "EOT" , "EOU" , "EOV" , "EOW" , "EOX" ,
+"EOY" , "EOZ" , "EO0" , "EO1" , "EO2" , "EO3" , "EO4" , "EO5" ,
+"EO6" , "EO7" , "EO8" , "EO9" , "EPA" , "EPB" , "EPC" , "EPD" ,
+"EPE" , "EPF" , "EPG" , "EPH" , "EPI" , "EPJ" , "EPK" , "EPL" ,
+"EPM" , "EPN" , "EPO" , "EPP" , "EPQ" , "EPR" , "EPS" , "EPT" ,
+"EPU" , "EPV" , "EPW" , "EPX" , "EPY" , "EPZ" , "EP0" , "EP1" ,
+"EP2" , "EP3" , "EP4" , "EP5" , "EP6" , "EP7" , "EP8" , "EP9" ,
+"EQA" , "EQB" , "EQC" , "EQD" , "EQE" , "EQF" , "EQG" , "EQH" ,
+"EQI" , "EQJ" , "EQK" , "EQL" , "EQM" , "EQN" , "EQO" , "EQP" ,
+"EQQ" , "EQR" , "EQS" , "EQT" , "EQU" , "EQV" , "EQW" , "EQX" ,
+"EQY" , "EQZ" , "EQ0" , "EQ1" , "EQ2" , "EQ3" , "EQ4" , "EQ5" ,
+"EQ6" , "EQ7" , "EQ8" , "EQ9" , "ERA" , "ERB" , "ERC" , "ERD" ,
+"ERE" , "ERF" , "ERG" , "ERH" , "ERI" , "ERJ" , "ERK" , "ERL" ,
+"ERM" , "ERN" , "ERO" , "ERP" , "ERQ" , "ERR" , "ERS" , "ERT" ,
+"ERU" , "ERV" , "ERW" , "ERX" , "ERY" , "ERZ" , "ER0" , "ER1" ,
+"ER2" , "ER3" , "ER4" , "ER5" , "ER6" , "ER7" , "ER8" , "ER9" ,
+"ESA" , "ESB" , "ESC" , "ESD" , "ESE" , "ESF" , "ESG" , "ESH" ,
+"ESI" , "ESJ" , "ESK" , "ESL" , "ESM" , "ESN" , "ESO" , "ESP" ,
+"ESQ" , "ESR" , "ESS" , "EST" , "ESU" , "ESV" , "ESW" , "ESX" ,
+"ESY" , "ESZ" , "ES0" , "ES1" , "ES2" , "ES3" , "ES4" , "ES5" ,
+"ES6" , "ES7" , "ES8" , "ES9" , "ETA" , "ETB" , "ETC" , "ETD" ,
+"ETE" , "ETF" , "ETG" , "ETH" , "ETI" , "ETJ" , "ETK" , "ETL" ,
+"ETM" , "ETN" , "ETO" , "ETP" , "ETQ" , "ETR" , "ETS" , "ETT" ,
+"ETU" , "ETV" , "ETW" , "ETX" , "ETY" , "ETZ" , "ET0" , "ET1" ,
+"ET2" , "ET3" , "ET4" , "ET5" , "ET6" , "ET7" , "ET8" , "ET9" ,
+"EUA" , "EUB" , "EUC" , "EUD" , "EUE" , "EUF" , "EUG" , "EUH" ,
+"EUI" , "EUJ" , "EUK" , "EUL" , "EUM" , "EUN" , "EUO" , "EUP" ,
+"EUQ" , "EUR" , "EUS" , "EUT" , "EUU" , "EUV" , "EUW" , "EUX" ,
+"EUY" , "EUZ" , "EU0" , "EU1" , "EU2" , "EU3" , "EU4" , "EU5" ,
+"EU6" , "EU7" , "EU8" , "EU9" , "EVA" , "EVB" , "EVC" , "EVD" ,
+"EVE" , "EVF" , "EVG" , "EVH" , "EVI" , "EVJ" , "EVK" , "EVL" ,
+"EVM" , "EVN" , "EVO" , "EVP" , "EVQ" , "EVR" , "EVS" , "EVT" ,
+"EVU" , "EVV" , "EVW" , "EVX" , "EVY" , "EVZ" , "EV0" , "EV1" ,
+"EV2" , "EV3" , "EV4" , "EV5" , "EV6" , "EV7" , "EV8" , "EV9" ,
+"EWA" , "EWB" , "EWC" , "EWD" , "EWE" , "EWF" , "EWG" , "EWH" ,
+"EWI" , "EWJ" , "EWK" , "EWL" , "EWM" , "EWN" , "EWO" , "EWP" ,
+"EWQ" , "EWR" , "EWS" , "EWT" , "EWU" , "EWV" , "EWW" , "EWX" ,
+"EWY" , "EWZ" , "EW0" , "EW1" , "EW2" , "EW3" , "EW4" , "EW5" ,
+"EW6" , "EW7" , "EW8" , "EW9" , "EXA" , "EXB" , "EXC" , "EXD" ,
+"EXE" , "EXF" , "EXG" , "EXH" , "EXI" , "EXJ" , "EXK" , "EXL" ,
+"EXM" , "EXN" , "EXO" , "EXP" , "EXQ" , "EXR" , "EXS" , "EXT" ,
+"EXU" , "EXV" , "EXW" , "EXX" , "EXY" , "EXZ" , "EX0" , "EX1" ,
+"EX2" , "EX3" , "EX4" , "EX5" , "EX6" , "EX7" , "EX8" , "EX9" ,
+"EYA" , "EYB" , "EYC" , "EYD" , "EYE" , "EYF" , "EYG" , "EYH" ,
+"EYI" , "EYJ" , "EYK" , "EYL" , "EYM" , "EYN" , "EYO" , "EYP" ,
+"EYQ" , "EYR" , "EYS" , "EYT" , "EYU" , "EYV" , "EYW" , "EYX" ,
+"EYY" , "EYZ" , "EY0" , "EY1" , "EY2" , "EY3" , "EY4" , "EY5" ,
+"EY6" , "EY7" , "EY8" , "EY9" , "EZA" , "EZB" , "EZC" , "EZD" ,
+"EZE" , "EZF" , "EZG" , "EZH" , "EZI" , "EZJ" , "EZK" , "EZL" ,
+"EZM" , "EZN" , "EZO" , "EZP" , "EZQ" , "EZR" , "EZS" , "EZT" ,
+"EZU" , "EZV" , "EZW" , "EZX" , "EZY" , "EZZ" , "EZ0" , "EZ1" ,
+"EZ2" , "EZ3" , "EZ4" , "EZ5" , "EZ6" , "EZ7" , "EZ8" , "EZ9" ,
+"E0A" , "E0B" , "E0C" , "E0D" , "E0E" , "E0F" , "E0G" , "E0H" ,
+"E0I" , "E0J" , "E0K" , "E0L" , "E0M" , "E0N" , "E0O" , "E0P" ,
+"E0Q" , "E0R" , "E0S" , "E0T" , "E0U" , "E0V" , "E0W" , "E0X" ,
+"E0Y" , "E0Z" , "E00" , "E01" , "E02" , "E03" , "E04" , "E05" ,
+"E06" , "E07" , "E08" , "E09" , "E1A" , "E1B" , "E1C" , "E1D" ,
+"E1E" , "E1F" , "E1G" , "E1H" , "E1I" , "E1J" , "E1K" , "E1L" ,
+"E1M" , "E1N" , "E1O" , "E1P" , "E1Q" , "E1R" , "E1S" , "E1T" ,
+"E1U" , "E1V" , "E1W" , "E1X" , "E1Y" , "E1Z" , "E10" , "E11" ,
+"E12" , "E13" , "E14" , "E15" , "E16" , "E17" , "E18" , "E19" ,
+"E2A" , "E2B" , "E2C" , "E2D" , "E2E" , "E2F" , "E2G" , "E2H" ,
+"E2I" , "E2J" , "E2K" , "E2L" , "E2M" , "E2N" , "E2O" , "E2P" ,
+"E2Q" , "E2R" , "E2S" , "E2T" , "E2U" , "E2V" , "E2W" , "E2X" ,
+"E2Y" , "E2Z" , "E20" , "E21" , "E22" , "E23" , "E24" , "E25" ,
+"E26" , "E27" , "E28" , "E29" , "E3A" , "E3B" , "E3C" , "E3D" ,
+"E3E" , "E3F" , "E3G" , "E3H" , "E3I" , "E3J" , "E3K" , "E3L" ,
+"E3M" , "E3N" , "E3O" , "E3P" , "E3Q" , "E3R" , "E3S" , "E3T" ,
+"E3U" , "E3V" , "E3W" , "E3X" , "E3Y" , "E3Z" , "E30" , "E31" ,
+"E32" , "E33" , "E34" , "E35" , "E36" , "E37" , "E38" , "E39" ,
+"E4A" , "E4B" , "E4C" , "E4D" , "E4E" , "E4F" , "E4G" , "E4H" ,
+"E4I" , "E4J" , "E4K" , "E4L" , "E4M" , "E4N" , "E4O" , "E4P" ,
+"E4Q" , "E4R" , "E4S" , "E4T" , "E4U" , "E4V" , "E4W" , "E4X" ,
+"E4Y" , "E4Z" , "E40" , "E41" , "E42" , "E43" , "E44" , "E45" ,
+"E46" , "E47" , "E48" , "E49" , "E5A" , "E5B" , "E5C" , "E5D" ,
+"E5E" , "E5F" , "E5G" , "E5H" , "E5I" , "E5J" , "E5K" , "E5L" ,
+"E5M" , "E5N" , "E5O" , "E5P" , "E5Q" , "E5R" , "E5S" , "E5T" ,
+"E5U" , "E5V" , "E5W" , "E5X" , "E5Y" , "E5Z" , "E50" , "E51" ,
+"E52" , "E53" , "E54" , "E55" , "E56" , "E57" , "E58" , "E59" ,
+"E6A" , "E6B" , "E6C" , "E6D" , "E6E" , "E6F" , "E6G" , "E6H" ,
+"E6I" , "E6J" , "E6K" , "E6L" , "E6M" , "E6N" , "E6O" , "E6P" ,
+"E6Q" , "E6R" , "E6S" , "E6T" , "E6U" , "E6V" , "E6W" , "E6X" ,
+"E6Y" , "E6Z" , "E60" , "E61" , "E62" , "E63" , "E64" , "E65" ,
+"E66" , "E67" , "E68" , "E69" , "E7A" , "E7B" , "E7C" , "E7D" ,
+"E7E" , "E7F" , "E7G" , "E7H" , "E7I" , "E7J" , "E7K" , "E7L" ,
+"E7M" , "E7N" , "E7O" , "E7P" , "E7Q" , "E7R" , "E7S" , "E7T" ,
+"E7U" , "E7V" , "E7W" , "E7X" , "E7Y" , "E7Z" , "E70" , "E71" ,
+"E72" , "E73" , "E74" , "E75" , "E76" , "E77" , "E78" , "E79" ,
+"E8A" , "E8B" , "E8C" , "E8D" , "E8E" , "E8F" , "E8G" , "E8H" ,
+"E8I" , "E8J" , "E8K" , "E8L" , "E8M" , "E8N" , "E8O" , "E8P" ,
+"E8Q" , "E8R" , "E8S" , "E8T" , "E8U" , "E8V" , "E8W" , "E8X" ,
+"E8Y" , "E8Z" , "E80" , "E81" , "E82" , "E83" , "E84" , "E85" ,
+"E86" , "E87" , "E88" , "E89" , "E9A" , "E9B" , "E9C" , "E9D" ,
+"E9E" , "E9F" , "E9G" , "E9H" , "E9I" , "E9J" , "E9K" , "E9L" ,
+"E9M" , "E9N" , "E9O" , "E9P" , "E9Q" , "E9R" , "E9S" , "E9T" ,
+"E9U" , "E9V" , "E9W" , "E9X" , "E9Y" , "E9Z" , "E90" , "E91" ,
+"E92" , "E93" , "E94" , "E95" , "E96" , "E97" , "E98" , "E99" ,
+"FAA" , "FAB" , "FAC" , "FAD" , "FAE" , "FAF" , "FAG" , "FAH" ,
+"FAI" , "FAJ" , "FAK" , "FAL" , "FAM" , "FAN" , "FAO" , "FAP" ,
+"FAQ" , "FAR" , "FAS" , "FAT" , "FAU" , "FAV" , "FAW" , "FAX" ,
+"FAY" , "FAZ" , "FA0" , "FA1" , "FA2" , "FA3" , "FA4" , "FA5" ,
+"FA6" , "FA7" , "FA8" , "FA9" , "FBA" , "FBB" , "FBC" , "FBD" ,
+"FBE" , "FBF" , "FBG" , "FBH" , "FBI" , "FBJ" , "FBK" , "FBL" ,
+"FBM" , "FBN" , "FBO" , "FBP" , "FBQ" , "FBR" , "FBS" , "FBT" ,
+"FBU" , "FBV" , "FBW" , "FBX" , "FBY" , "FBZ" , "FB0" , "FB1" ,
+"FB2" , "FB3" , "FB4" , "FB5" , "FB6" , "FB7" , "FB8" , "FB9" ,
+"FCA" , "FCB" , "FCC" , "FCD" , "FCE" , "FCF" , "FCG" , "FCH" ,
+"FCI" , "FCJ" , "FCK" , "FCL" , "FCM" , "FCN" , "FCO" , "FCP" ,
+"FCQ" , "FCR" , "FCS" , "FCT" , "FCU" , "FCV" , "FCW" , "FCX" ,
+"FCY" , "FCZ" , "FC0" , "FC1" , "FC2" , "FC3" , "FC4" , "FC5" ,
+"FC6" , "FC7" , "FC8" , "FC9" , "FDA" , "FDB" , "FDC" , "FDD" ,
+"FDE" , "FDF" , "FDG" , "FDH" , "FDI" , "FDJ" , "FDK" , "FDL" ,
+"FDM" , "FDN" , "FDO" , "FDP" , "FDQ" , "FDR" , "FDS" , "FDT" ,
+"FDU" , "FDV" , "FDW" , "FDX" , "FDY" , "FDZ" , "FD0" , "FD1" ,
+"FD2" , "FD3" , "FD4" , "FD5" , "FD6" , "FD7" , "FD8" , "FD9" ,
+"FEA" , "FEB" , "FEC" , "FED" , "FEE" , "FEF" , "FEG" , "FEH" ,
+"FEI" , "FEJ" , "FEK" , "FEL" , "FEM" , "FEN" , "FEO" , "FEP" ,
+"FEQ" , "FER" , "FES" , "FET" , "FEU" , "FEV" , "FEW" , "FEX" ,
+"FEY" , "FEZ" , "FE0" , "FE1" , "FE2" , "FE3" , "FE4" , "FE5" ,
+"FE6" , "FE7" , "FE8" , "FE9" , "FFA" , "FFB" , "FFC" , "FFD" ,
+"FFE" , "FFF" , "FFG" , "FFH" , "FFI" , "FFJ" , "FFK" , "FFL" ,
+"FFM" , "FFN" , "FFO" , "FFP" , "FFQ" , "FFR" , "FFS" , "FFT" ,
+"FFU" , "FFV" , "FFW" , "FFX" , "FFY" , "FFZ" , "FF0" , "FF1" ,
+"FF2" , "FF3" , "FF4" , "FF5" , "FF6" , "FF7" , "FF8" , "FF9" ,
+"FGA" , "FGB" , "FGC" , "FGD" , "FGE" , "FGF" , "FGG" , "FGH" ,
+"FGI" , "FGJ" , "FGK" , "FGL" , "FGM" , "FGN" , "FGO" , "FGP" ,
+"FGQ" , "FGR" , "FGS" , "FGT" , "FGU" , "FGV" , "FGW" , "FGX" ,
+"FGY" , "FGZ" , "FG0" , "FG1" , "FG2" , "FG3" , "FG4" , "FG5" ,
+"FG6" , "FG7" , "FG8" , "FG9" , "FHA" , "FHB" , "FHC" , "FHD" ,
+"FHE" , "FHF" , "FHG" , "FHH" , "FHI" , "FHJ" , "FHK" , "FHL" ,
+"FHM" , "FHN" , "FHO" , "FHP" , "FHQ" , "FHR" , "FHS" , "FHT" ,
+"FHU" , "FHV" , "FHW" , "FHX" , "FHY" , "FHZ" , "FH0" , "FH1" ,
+"FH2" , "FH3" , "FH4" , "FH5" , "FH6" , "FH7" , "FH8" , "FH9" ,
+"FIA" , "FIB" , "FIC" , "FID" , "FIE" , "FIF" , "FIG" , "FIH" ,
+"FII" , "FIJ" , "FIK" , "FIL" , "FIM" , "FIN" , "FIO" , "FIP" ,
+"FIQ" , "FIR" , "FIS" , "FIT" , "FIU" , "FIV" , "FIW" , "FIX" ,
+"FIY" , "FIZ" , "FI0" , "FI1" , "FI2" , "FI3" , "FI4" , "FI5" ,
+"FI6" , "FI7" , "FI8" , "FI9" , "FJA" , "FJB" , "FJC" , "FJD" ,
+"FJE" , "FJF" , "FJG" , "FJH" , "FJI" , "FJJ" , "FJK" , "FJL" ,
+"FJM" , "FJN" , "FJO" , "FJP" , "FJQ" , "FJR" , "FJS" , "FJT" ,
+"FJU" , "FJV" , "FJW" , "FJX" , "FJY" , "FJZ" , "FJ0" , "FJ1" ,
+"FJ2" , "FJ3" , "FJ4" , "FJ5" , "FJ6" , "FJ7" , "FJ8" , "FJ9" ,
+"FKA" , "FKB" , "FKC" , "FKD" , "FKE" , "FKF" , "FKG" , "FKH" ,
+"FKI" , "FKJ" , "FKK" , "FKL" , "FKM" , "FKN" , "FKO" , "FKP" ,
+"FKQ" , "FKR" , "FKS" , "FKT" , "FKU" , "FKV" , "FKW" , "FKX" ,
+"FKY" , "FKZ" , "FK0" , "FK1" , "FK2" , "FK3" , "FK4" , "FK5" ,
+"FK6" , "FK7" , "FK8" , "FK9" , "FLA" , "FLB" , "FLC" , "FLD" ,
+"FLE" , "FLF" , "FLG" , "FLH" , "FLI" , "FLJ" , "FLK" , "FLL" ,
+"FLM" , "FLN" , "FLO" , "FLP" , "FLQ" , "FLR" , "FLS" , "FLT" ,
+"FLU" , "FLV" , "FLW" , "FLX" , "FLY" , "FLZ" , "FL0" , "FL1" ,
+"FL2" , "FL3" , "FL4" , "FL5" , "FL6" , "FL7" , "FL8" , "FL9" ,
+"FMA" , "FMB" , "FMC" , "FMD" , "FME" , "FMF" , "FMG" , "FMH" ,
+"FMI" , "FMJ" , "FMK" , "FML" , "FMM" , "FMN" , "FMO" , "FMP" ,
+"FMQ" , "FMR" , "FMS" , "FMT" , "FMU" , "FMV" , "FMW" , "FMX" ,
+"FMY" , "FMZ" , "FM0" , "FM1" , "FM2" , "FM3" , "FM4" , "FM5" ,
+"FM6" , "FM7" , "FM8" , "FM9" , "FNA" , "FNB" , "FNC" , "FND" ,
+"FNE" , "FNF" , "FNG" , "FNH" , "FNI" , "FNJ" , "FNK" , "FNL" ,
+"FNM" , "FNN" , "FNO" , "FNP" , "FNQ" , "FNR" , "FNS" , "FNT" ,
+"FNU" , "FNV" , "FNW" , "FNX" , "FNY" , "FNZ" , "FN0" , "FN1" ,
+"FN2" , "FN3" , "FN4" , "FN5" , "FN6" , "FN7" , "FN8" , "FN9" ,
+"FOA" , "FOB" , "FOC" , "FOD" , "FOE" , "FOF" , "FOG" , "FOH" ,
+"FOI" , "FOJ" , "FOK" , "FOL" , "FOM" , "FON" , "FOO" , "FOP" ,
+"FOQ" , "FOR" , "FOS" , "FOT" , "FOU" , "FOV" , "FOW" , "FOX" ,
+"FOY" , "FOZ" , "FO0" , "FO1" , "FO2" , "FO3" , "FO4" , "FO5" ,
+"FO6" , "FO7" , "FO8" , "FO9" , "FPA" , "FPB" , "FPC" , "FPD" ,
+"FPE" , "FPF" , "FPG" , "FPH" , "FPI" , "FPJ" , "FPK" , "FPL" ,
+"FPM" , "FPN" , "FPO" , "FPP" , "FPQ" , "FPR" , "FPS" , "FPT" ,
+"FPU" , "FPV" , "FPW" , "FPX" , "FPY" , "FPZ" , "FP0" , "FP1" ,
+"FP2" , "FP3" , "FP4" , "FP5" , "FP6" , "FP7" , "FP8" , "FP9" ,
+"FQA" , "FQB" , "FQC" , "FQD" , "FQE" , "FQF" , "FQG" , "FQH" ,
+"FQI" , "FQJ" , "FQK" , "FQL" , "FQM" , "FQN" , "FQO" , "FQP" ,
+"FQQ" , "FQR" , "FQS" , "FQT" , "FQU" , "FQV" , "FQW" , "FQX" ,
+"FQY" , "FQZ" , "FQ0" , "FQ1" , "FQ2" , "FQ3" , "FQ4" , "FQ5" ,
+"FQ6" , "FQ7" , "FQ8" , "FQ9" , "FRA" , "FRB" , "FRC" , "FRD" ,
+"FRE" , "FRF" , "FRG" , "FRH" , "FRI" , "FRJ" , "FRK" , "FRL" ,
+"FRM" , "FRN" , "FRO" , "FRP" , "FRQ" , "FRR" , "FRS" , "FRT" ,
+"FRU" , "FRV" , "FRW" , "FRX" , "FRY" , "FRZ" , "FR0" , "FR1" ,
+"FR2" , "FR3" , "FR4" , "FR5" , "FR6" , "FR7" , "FR8" , "FR9" ,
+"FSA" , "FSB" , "FSC" , "FSD" , "FSE" , "FSF" , "FSG" , "FSH" ,
+"FSI" , "FSJ" , "FSK" , "FSL" , "FSM" , "FSN" , "FSO" , "FSP" ,
+"FSQ" , "FSR" , "FSS" , "FST" , "FSU" , "FSV" , "FSW" , "FSX" ,
+"FSY" , "FSZ" , "FS0" , "FS1" , "FS2" , "FS3" , "FS4" , "FS5" ,
+"FS6" , "FS7" , "FS8" , "FS9" , "FTA" , "FTB" , "FTC" , "FTD" ,
+"FTE" , "FTF" , "FTG" , "FTH" , "FTI" , "FTJ" , "FTK" , "FTL" ,
+"FTM" , "FTN" , "FTO" , "FTP" , "FTQ" , "FTR" , "FTS" , "FTT" ,
+"FTU" , "FTV" , "FTW" , "FTX" , "FTY" , "FTZ" , "FT0" , "FT1" ,
+"FT2" , "FT3" , "FT4" , "FT5" , "FT6" , "FT7" , "FT8" , "FT9" ,
+"FUA" , "FUB" , "FUC" , "FUD" , "FUE" , "FUF" , "FUG" , "FUH" ,
+"FUI" , "FUJ" , "FUK" , "FUL" , "FUM" , "FUN" , "FUO" , "FUP" ,
+"FUQ" , "FUR" , "FUS" , "FUT" , "FUU" , "FUV" , "FUW" , "FUX" ,
+"FUY" , "FUZ" , "FU0" , "FU1" , "FU2" , "FU3" , "FU4" , "FU5" ,
+"FU6" , "FU7" , "FU8" , "FU9" , "FVA" , "FVB" , "FVC" , "FVD" ,
+"FVE" , "FVF" , "FVG" , "FVH" , "FVI" , "FVJ" , "FVK" , "FVL" ,
+"FVM" , "FVN" , "FVO" , "FVP" , "FVQ" , "FVR" , "FVS" , "FVT" ,
+"FVU" , "FVV" , "FVW" , "FVX" , "FVY" , "FVZ" , "FV0" , "FV1" ,
+"FV2" , "FV3" , "FV4" , "FV5" , "FV6" , "FV7" , "FV8" , "FV9" ,
+"FWA" , "FWB" , "FWC" , "FWD" , "FWE" , "FWF" , "FWG" , "FWH" ,
+"FWI" , "FWJ" , "FWK" , "FWL" , "FWM" , "FWN" , "FWO" , "FWP" ,
+"FWQ" , "FWR" , "FWS" , "FWT" , "FWU" , "FWV" , "FWW" , "FWX" ,
+"FWY" , "FWZ" , "FW0" , "FW1" , "FW2" , "FW3" , "FW4" , "FW5" ,
+"FW6" , "FW7" , "FW8" , "FW9" , "FXA" , "FXB" , "FXC" , "FXD" ,
+"FXE" , "FXF" , "FXG" , "FXH" , "FXI" , "FXJ" , "FXK" , "FXL" ,
+"FXM" , "FXN" , "FXO" , "FXP" , "FXQ" , "FXR" , "FXS" , "FXT" ,
+"FXU" , "FXV" , "FXW" , "FXX" , "FXY" , "FXZ" , "FX0" , "FX1" ,
+"FX2" , "FX3" , "FX4" , "FX5" , "FX6" , "FX7" , "FX8" , "FX9" ,
+"FYA" , "FYB" , "FYC" , "FYD" , "FYE" , "FYF" , "FYG" , "FYH" ,
+"FYI" , "FYJ" , "FYK" , "FYL" , "FYM" , "FYN" , "FYO" , "FYP" ,
+"FYQ" , "FYR" , "FYS" , "FYT" , "FYU" , "FYV" , "FYW" , "FYX" ,
+"FYY" , "FYZ" , "FY0" , "FY1" , "FY2" , "FY3" , "FY4" , "FY5" ,
+"FY6" , "FY7" , "FY8" , "FY9" , "FZA" , "FZB" , "FZC" , "FZD" ,
+"FZE" , "FZF" , "FZG" , "FZH" , "FZI" , "FZJ" , "FZK" , "FZL" ,
+"FZM" , "FZN" , "FZO" , "FZP" , "FZQ" , "FZR" , "FZS" , "FZT" ,
+"FZU" , "FZV" , "FZW" , "FZX" , "FZY" , "FZZ" , "FZ0" , "FZ1" ,
+"FZ2" , "FZ3" , "FZ4" , "FZ5" , "FZ6" , "FZ7" , "FZ8" , "FZ9" ,
+"F0A" , "F0B" , "F0C" , "F0D" , "F0E" , "F0F" , "F0G" , "F0H" ,
+"F0I" , "F0J" , "F0K" , "F0L" , "F0M" , "F0N" , "F0O" , "F0P" ,
+"F0Q" , "F0R" , "F0S" , "F0T" , "F0U" , "F0V" , "F0W" , "F0X" ,
+"F0Y" , "F0Z" , "F00" , "F01" , "F02" , "F03" , "F04" , "F05" ,
+"F06" , "F07" , "F08" , "F09" , "F1A" , "F1B" , "F1C" , "F1D" ,
+"F1E" , "F1F" , "F1G" , "F1H" , "F1I" , "F1J" , "F1K" , "F1L" ,
+"F1M" , "F1N" , "F1O" , "F1P" , "F1Q" , "F1R" , "F1S" , "F1T" ,
+"F1U" , "F1V" , "F1W" , "F1X" , "F1Y" , "F1Z" , "F10" , "F11" ,
+"F12" , "F13" , "F14" , "F15" , "F16" , "F17" , "F18" , "F19" ,
+"F2A" , "F2B" , "F2C" , "F2D" , "F2E" , "F2F" , "F2G" , "F2H" ,
+"F2I" , "F2J" , "F2K" , "F2L" , "F2M" , "F2N" , "F2O" , "F2P" ,
+"F2Q" , "F2R" , "F2S" , "F2T" , "F2U" , "F2V" , "F2W" , "F2X" ,
+"F2Y" , "F2Z" , "F20" , "F21" , "F22" , "F23" , "F24" , "F25" ,
+"F26" , "F27" , "F28" , "F29" , "F3A" , "F3B" , "F3C" , "F3D" ,
+"F3E" , "F3F" , "F3G" , "F3H" , "F3I" , "F3J" , "F3K" , "F3L" ,
+"F3M" , "F3N" , "F3O" , "F3P" , "F3Q" , "F3R" , "F3S" , "F3T" ,
+"F3U" , "F3V" , "F3W" , "F3X" , "F3Y" , "F3Z" , "F30" , "F31" ,
+"F32" , "F33" , "F34" , "F35" , "F36" , "F37" , "F38" , "F39" ,
+"F4A" , "F4B" , "F4C" , "F4D" , "F4E" , "F4F" , "F4G" , "F4H" ,
+"F4I" , "F4J" , "F4K" , "F4L" , "F4M" , "F4N" , "F4O" , "F4P" ,
+"F4Q" , "F4R" , "F4S" , "F4T" , "F4U" , "F4V" , "F4W" , "F4X" ,
+"F4Y" , "F4Z" , "F40" , "F41" , "F42" , "F43" , "F44" , "F45" ,
+"F46" , "F47" , "F48" , "F49" , "F5A" , "F5B" , "F5C" , "F5D" ,
+"F5E" , "F5F" , "F5G" , "F5H" , "F5I" , "F5J" , "F5K" , "F5L" ,
+"F5M" , "F5N" , "F5O" , "F5P" , "F5Q" , "F5R" , "F5S" , "F5T" ,
+"F5U" , "F5V" , "F5W" , "F5X" , "F5Y" , "F5Z" , "F50" , "F51" ,
+"F52" , "F53" , "F54" , "F55" , "F56" , "F57" , "F58" , "F59" ,
+"F6A" , "F6B" , "F6C" , "F6D" , "F6E" , "F6F" , "F6G" , "F6H" ,
+"F6I" , "F6J" , "F6K" , "F6L" , "F6M" , "F6N" , "F6O" , "F6P" ,
+"F6Q" , "F6R" , "F6S" , "F6T" , "F6U" , "F6V" , "F6W" , "F6X" ,
+"F6Y" , "F6Z" , "F60" , "F61" , "F62" , "F63" , "F64" , "F65" ,
+"F66" , "F67" , "F68" , "F69" , "F7A" , "F7B" , "F7C" , "F7D" ,
+"F7E" , "F7F" , "F7G" , "F7H" , "F7I" , "F7J" , "F7K" , "F7L" ,
+"F7M" , "F7N" , "F7O" , "F7P" , "F7Q" , "F7R" , "F7S" , "F7T" ,
+"F7U" , "F7V" , "F7W" , "F7X" , "F7Y" , "F7Z" , "F70" , "F71" ,
+"F72" , "F73" , "F74" , "F75" , "F76" , "F77" , "F78" , "F79" ,
+"F8A" , "F8B" , "F8C" , "F8D" , "F8E" , "F8F" , "F8G" , "F8H" ,
+"F8I" , "F8J" , "F8K" , "F8L" , "F8M" , "F8N" , "F8O" , "F8P" ,
+"F8Q" , "F8R" , "F8S" , "F8T" , "F8U" , "F8V" , "F8W" , "F8X" ,
+"F8Y" , "F8Z" , "F80" , "F81" , "F82" , "F83" , "F84" , "F85" ,
+"F86" , "F87" , "F88" , "F89" , "F9A" , "F9B" , "F9C" , "F9D" ,
+"F9E" , "F9F" , "F9G" , "F9H" , "F9I" , "F9J" , "F9K" , "F9L" ,
+"F9M" , "F9N" , "F9O" , "F9P" , "F9Q" , "F9R" , "F9S" , "F9T" ,
+"F9U" , "F9V" , "F9W" , "F9X" , "F9Y" , "F9Z" , "F90" , "F91" ,
+"F92" , "F93" , "F94" , "F95" , "F96" , "F97" , "F98" , "F99" ,
+"GAA" , "GAB" , "GAC" , "GAD" , "GAE" , "GAF" , "GAG" , "GAH" ,
+"GAI" , "GAJ" , "GAK" , "GAL" , "GAM" , "GAN" , "GAO" , "GAP" ,
+"GAQ" , "GAR" , "GAS" , "GAT" , "GAU" , "GAV" , "GAW" , "GAX" ,
+"GAY" , "GAZ" , "GA0" , "GA1" , "GA2" , "GA3" , "GA4" , "GA5" ,
+"GA6" , "GA7" , "GA8" , "GA9" , "GBA" , "GBB" , "GBC" , "GBD" ,
+"GBE" , "GBF" , "GBG" , "GBH" , "GBI" , "GBJ" , "GBK" , "GBL" ,
+"GBM" , "GBN" , "GBO" , "GBP" , "GBQ" , "GBR" , "GBS" , "GBT" ,
+"GBU" , "GBV" , "GBW" , "GBX" , "GBY" , "GBZ" , "GB0" , "GB1" ,
+"GB2" , "GB3" , "GB4" , "GB5" , "GB6" , "GB7" , "GB8" , "GB9" ,
+"GCA" , "GCB" , "GCC" , "GCD" , "GCE" , "GCF" , "GCG" , "GCH" ,
+"GCI" , "GCJ" , "GCK" , "GCL" , "GCM" , "GCN" , "GCO" , "GCP" ,
+"GCQ" , "GCR" , "GCS" , "GCT" , "GCU" , "GCV" , "GCW" , "GCX" ,
+"GCY" , "GCZ" , "GC0" , "GC1" , "GC2" , "GC3" , "GC4" , "GC5" ,
+"GC6" , "GC7" , "GC8" , "GC9" , "GDA" , "GDB" , "GDC" , "GDD" ,
+"GDE" , "GDF" , "GDG" , "GDH" , "GDI" , "GDJ" , "GDK" , "GDL" ,
+"GDM" , "GDN" , "GDO" , "GDP" , "GDQ" , "GDR" , "GDS" , "GDT" ,
+"GDU" , "GDV" , "GDW" , "GDX" , "GDY" , "GDZ" , "GD0" , "GD1" ,
+"GD2" , "GD3" , "GD4" , "GD5" , "GD6" , "GD7" , "GD8" , "GD9" ,
+"GEA" , "GEB" , "GEC" , "GED" , "GEE" , "GEF" , "GEG" , "GEH" ,
+"GEI" , "GEJ" , "GEK" , "GEL" , "GEM" , "GEN" , "GEO" , "GEP" ,
+"GEQ" , "GER" , "GES" , "GET" , "GEU" , "GEV" , "GEW" , "GEX" ,
+"GEY" , "GEZ" , "GE0" , "GE1" , "GE2" , "GE3" , "GE4" , "GE5" ,
+"GE6" , "GE7" , "GE8" , "GE9" , "GFA" , "GFB" , "GFC" , "GFD" ,
+"GFE" , "GFF" , "GFG" , "GFH" , "GFI" , "GFJ" , "GFK" , "GFL" ,
+"GFM" , "GFN" , "GFO" , "GFP" , "GFQ" , "GFR" , "GFS" , "GFT" ,
+"GFU" , "GFV" , "GFW" , "GFX" , "GFY" , "GFZ" , "GF0" , "GF1" ,
+"GF2" , "GF3" , "GF4" , "GF5" , "GF6" , "GF7" , "GF8" , "GF9" ,
+"GGA" , "GGB" , "GGC" , "GGD" , "GGE" , "GGF" , "GGG" , "GGH" ,
+"GGI" , "GGJ" , "GGK" , "GGL" , "GGM" , "GGN" , "GGO" , "GGP" ,
+"GGQ" , "GGR" , "GGS" , "GGT" , "GGU" , "GGV" , "GGW" , "GGX" ,
+"GGY" , "GGZ" , "GG0" , "GG1" , "GG2" , "GG3" , "GG4" , "GG5" ,
+"GG6" , "GG7" , "GG8" , "GG9" , "GHA" , "GHB" , "GHC" , "GHD" ,
+"GHE" , "GHF" , "GHG" , "GHH" , "GHI" , "GHJ" , "GHK" , "GHL" ,
+"GHM" , "GHN" , "GHO" , "GHP" , "GHQ" , "GHR" , "GHS" , "GHT" ,
+"GHU" , "GHV" , "GHW" , "GHX" , "GHY" , "GHZ" , "GH0" , "GH1" ,
+"GH2" , "GH3" , "GH4" , "GH5" , "GH6" , "GH7" , "GH8" , "GH9" ,
+"GIA" , "GIB" , "GIC" , "GID" , "GIE" , "GIF" , "GIG" , "GIH" ,
+"GII" , "GIJ" , "GIK" , "GIL" , "GIM" , "GIN" , "GIO" , "GIP" ,
+"GIQ" , "GIR" , "GIS" , "GIT" , "GIU" , "GIV" , "GIW" , "GIX" ,
+"GIY" , "GIZ" , "GI0" , "GI1" , "GI2" , "GI3" , "GI4" , "GI5" ,
+"GI6" , "GI7" , "GI8" , "GI9" , "GJA" , "GJB" , "GJC" , "GJD" ,
+"GJE" , "GJF" , "GJG" , "GJH" , "GJI" , "GJJ" , "GJK" , "GJL" ,
+"GJM" , "GJN" , "GJO" , "GJP" , "GJQ" , "GJR" , "GJS" , "GJT" ,
+"GJU" , "GJV" , "GJW" , "GJX" , "GJY" , "GJZ" , "GJ0" , "GJ1" ,
+"GJ2" , "GJ3" , "GJ4" , "GJ5" , "GJ6" , "GJ7" , "GJ8" , "GJ9" ,
+"GKA" , "GKB" , "GKC" , "GKD" , "GKE" , "GKF" , "GKG" , "GKH" ,
+"GKI" , "GKJ" , "GKK" , "GKL" , "GKM" , "GKN" , "GKO" , "GKP" ,
+"GKQ" , "GKR" , "GKS" , "GKT" , "GKU" , "GKV" , "GKW" , "GKX" ,
+"GKY" , "GKZ" , "GK0" , "GK1" , "GK2" , "GK3" , "GK4" , "GK5" ,
+"GK6" , "GK7" , "GK8" , "GK9" , "GLA" , "GLB" , "GLC" , "GLD" ,
+"GLE" , "GLF" , "GLG" , "GLH" , "GLI" , "GLJ" , "GLK" , "GLL" ,
+"GLM" , "GLN" , "GLO" , "GLP" , "GLQ" , "GLR" , "GLS" , "GLT" ,
+"GLU" , "GLV" , "GLW" , "GLX" , "GLY" , "GLZ" , "GL0" , "GL1" ,
+"GL2" , "GL3" , "GL4" , "GL5" , "GL6" , "GL7" , "GL8" , "GL9" ,
+"GMA" , "GMB" , "GMC" , "GMD" , "GME" , "GMF" , "GMG" , "GMH" ,
+"GMI" , "GMJ" , "GMK" , "GML" , "GMM" , "GMN" , "GMO" , "GMP" ,
+"GMQ" , "GMR" , "GMS" , "GMT" , "GMU" , "GMV" , "GMW" , "GMX" ,
+"GMY" , "GMZ" , "GM0" , "GM1" , "GM2" , "GM3" , "GM4" , "GM5" ,
+"GM6" , "GM7" , "GM8" , "GM9" , "GNA" , "GNB" , "GNC" , "GND" ,
+"GNE" , "GNF" , "GNG" , "GNH" , "GNI" , "GNJ" , "GNK" , "GNL" ,
+"GNM" , "GNN" , "GNO" , "GNP" , "GNQ" , "GNR" , "GNS" , "GNT" ,
+"GNU" , "GNV" , "GNW" , "GNX" , "GNY" , "GNZ" , "GN0" , "GN1" ,
+"GN2" , "GN3" , "GN4" , "GN5" , "GN6" , "GN7" , "GN8" , "GN9" ,
+"GOA" , "GOB" , "GOC" , "GOD" , "GOE" , "GOF" , "GOG" , "GOH" ,
+"GOI" , "GOJ" , "GOK" , "GOL" , "GOM" , "GON" , "GOO" , "GOP" ,
+"GOQ" , "GOR" , "GOS" , "GOT" , "GOU" , "GOV" , "GOW" , "GOX" ,
+"GOY" , "GOZ" , "GO0" , "GO1" , "GO2" , "GO3" , "GO4" , "GO5" ,
+"GO6" , "GO7" , "GO8" , "GO9" , "GPA" , "GPB" , "GPC" , "GPD" ,
+"GPE" , "GPF" , "GPG" , "GPH" , "GPI" , "GPJ" , "GPK" , "GPL" ,
+"GPM" , "GPN" , "GPO" , "GPP" , "GPQ" , "GPR" , "GPS" , "GPT" ,
+"GPU" , "GPV" , "GPW" , "GPX" , "GPY" , "GPZ" , "GP0" , "GP1" ,
+"GP2" , "GP3" , "GP4" , "GP5" , "GP6" , "GP7" , "GP8" , "GP9" ,
+"GQA" , "GQB" , "GQC" , "GQD" , "GQE" , "GQF" , "GQG" , "GQH" ,
+"GQI" , "GQJ" , "GQK" , "GQL" , "GQM" , "GQN" , "GQO" , "GQP" ,
+"GQQ" , "GQR" , "GQS" , "GQT" , "GQU" , "GQV" , "GQW" , "GQX" ,
+"GQY" , "GQZ" , "GQ0" , "GQ1" , "GQ2" , "GQ3" , "GQ4" , "GQ5" ,
+"GQ6" , "GQ7" , "GQ8" , "GQ9" , "GRA" , "GRB" , "GRC" , "GRD" ,
+"GRE" , "GRF" , "GRG" , "GRH" , "GRI" , "GRJ" , "GRK" , "GRL" ,
+"GRM" , "GRN" , "GRO" , "GRP" , "GRQ" , "GRR" , "GRS" , "GRT" ,
+"GRU" , "GRV" , "GRW" , "GRX" , "GRY" , "GRZ" , "GR0" , "GR1" ,
+"GR2" , "GR3" , "GR4" , "GR5" , "GR6" , "GR7" , "GR8" , "GR9" ,
+"GSA" , "GSB" , "GSC" , "GSD" , "GSE" , "GSF" , "GSG" , "GSH" ,
+"GSI" , "GSJ" , "GSK" , "GSL" , "GSM" , "GSN" , "GSO" , "GSP" ,
+"GSQ" , "GSR" , "GSS" , "GST" , "GSU" , "GSV" , "GSW" , "GSX" ,
+"GSY" , "GSZ" , "GS0" , "GS1" , "GS2" , "GS3" , "GS4" , "GS5" ,
+"GS6" , "GS7" , "GS8" , "GS9" , "GTA" , "GTB" , "GTC" , "GTD" ,
+"GTE" , "GTF" , "GTG" , "GTH" , "GTI" , "GTJ" , "GTK" , "GTL" ,
+"GTM" , "GTN" , "GTO" , "GTP" , "GTQ" , "GTR" , "GTS" , "GTT" ,
+"GTU" , "GTV" , "GTW" , "GTX" , "GTY" , "GTZ" , "GT0" , "GT1" ,
+"GT2" , "GT3" , "GT4" , "GT5" , "GT6" , "GT7" , "GT8" , "GT9" ,
+"GUA" , "GUB" , "GUC" , "GUD" , "GUE" , "GUF" , "GUG" , "GUH" ,
+"GUI" , "GUJ" , "GUK" , "GUL" , "GUM" , "GUN" , "GUO" , "GUP" ,
+"GUQ" , "GUR" , "GUS" , "GUT" , "GUU" , "GUV" , "GUW" , "GUX" ,
+"GUY" , "GUZ" , "GU0" , "GU1" , "GU2" , "GU3" , "GU4" , "GU5" ,
+"GU6" , "GU7" , "GU8" , "GU9" , "GVA" , "GVB" , "GVC" , "GVD" ,
+"GVE" , "GVF" , "GVG" , "GVH" , "GVI" , "GVJ" , "GVK" , "GVL" ,
+"GVM" , "GVN" , "GVO" , "GVP" , "GVQ" , "GVR" , "GVS" , "GVT" ,
+"GVU" , "GVV" , "GVW" , "GVX" , "GVY" , "GVZ" , "GV0" , "GV1" ,
+"GV2" , "GV3" , "GV4" , "GV5" , "GV6" , "GV7" , "GV8" , "GV9" ,
+"GWA" , "GWB" , "GWC" , "GWD" , "GWE" , "GWF" , "GWG" , "GWH" ,
+"GWI" , "GWJ" , "GWK" , "GWL" , "GWM" , "GWN" , "GWO" , "GWP" ,
+"GWQ" , "GWR" , "GWS" , "GWT" , "GWU" , "GWV" , "GWW" , "GWX" ,
+"GWY" , "GWZ" , "GW0" , "GW1" , "GW2" , "GW3" , "GW4" , "GW5" ,
+"GW6" , "GW7" , "GW8" , "GW9" , "GXA" , "GXB" , "GXC" , "GXD" ,
+"GXE" , "GXF" , "GXG" , "GXH" , "GXI" , "GXJ" , "GXK" , "GXL" ,
+"GXM" , "GXN" , "GXO" , "GXP" , "GXQ" , "GXR" , "GXS" , "GXT" ,
+"GXU" , "GXV" , "GXW" , "GXX" , "GXY" , "GXZ" , "GX0" , "GX1" ,
+"GX2" , "GX3" , "GX4" , "GX5" , "GX6" , "GX7" , "GX8" , "GX9" ,
+"GYA" , "GYB" , "GYC" , "GYD" , "GYE" , "GYF" , "GYG" , "GYH" ,
+"GYI" , "GYJ" , "GYK" , "GYL" , "GYM" , "GYN" , "GYO" , "GYP" ,
+"GYQ" , "GYR" , "GYS" , "GYT" , "GYU" , "GYV" , "GYW" , "GYX" ,
+"GYY" , "GYZ" , "GY0" , "GY1" , "GY2" , "GY3" , "GY4" , "GY5" ,
+"GY6" , "GY7" , "GY8" , "GY9" , "GZA" , "GZB" , "GZC" , "GZD" ,
+"GZE" , "GZF" , "GZG" , "GZH" , "GZI" , "GZJ" , "GZK" , "GZL" ,
+"GZM" , "GZN" , "GZO" , "GZP" , "GZQ" , "GZR" , "GZS" , "GZT" ,
+"GZU" , "GZV" , "GZW" , "GZX" , "GZY" , "GZZ" , "GZ0" , "GZ1" ,
+"GZ2" , "GZ3" , "GZ4" , "GZ5" , "GZ6" , "GZ7" , "GZ8" , "GZ9" ,
+"G0A" , "G0B" , "G0C" , "G0D" , "G0E" , "G0F" , "G0G" , "G0H" ,
+"G0I" , "G0J" , "G0K" , "G0L" , "G0M" , "G0N" , "G0O" , "G0P" ,
+"G0Q" , "G0R" , "G0S" , "G0T" , "G0U" , "G0V" , "G0W" , "G0X" ,
+"G0Y" , "G0Z" , "G00" , "G01" , "G02" , "G03" , "G04" , "G05" ,
+"G06" , "G07" , "G08" , "G09" , "G1A" , "G1B" , "G1C" , "G1D" ,
+"G1E" , "G1F" , "G1G" , "G1H" , "G1I" , "G1J" , "G1K" , "G1L" ,
+"G1M" , "G1N" , "G1O" , "G1P" , "G1Q" , "G1R" , "G1S" , "G1T" ,
+"G1U" , "G1V" , "G1W" , "G1X" , "G1Y" , "G1Z" , "G10" , "G11" ,
+"G12" , "G13" , "G14" , "G15" , "G16" , "G17" , "G18" , "G19" ,
+"G2A" , "G2B" , "G2C" , "G2D" , "G2E" , "G2F" , "G2G" , "G2H" ,
+"G2I" , "G2J" , "G2K" , "G2L" , "G2M" , "G2N" , "G2O" , "G2P" ,
+"G2Q" , "G2R" , "G2S" , "G2T" , "G2U" , "G2V" , "G2W" , "G2X" ,
+"G2Y" , "G2Z" , "G20" , "G21" , "G22" , "G23" , "G24" , "G25" ,
+"G26" , "G27" , "G28" , "G29" , "G3A" , "G3B" , "G3C" , "G3D" ,
+"G3E" , "G3F" , "G3G" , "G3H" , "G3I" , "G3J" , "G3K" , "G3L" ,
+"G3M" , "G3N" , "G3O" , "G3P" , "G3Q" , "G3R" , "G3S" , "G3T" ,
+"G3U" , "G3V" , "G3W" , "G3X" , "G3Y" , "G3Z" , "G30" , "G31" ,
+"G32" , "G33" , "G34" , "G35" , "G36" , "G37" , "G38" , "G39" ,
+"G4A" , "G4B" , "G4C" , "G4D" , "G4E" , "G4F" , "G4G" , "G4H" ,
+"G4I" , "G4J" , "G4K" , "G4L" , "G4M" , "G4N" , "G4O" , "G4P" ,
+"G4Q" , "G4R" , "G4S" , "G4T" , "G4U" , "G4V" , "G4W" , "G4X" ,
+"G4Y" , "G4Z" , "G40" , "G41" , "G42" , "G43" , "G44" , "G45" ,
+"G46" , "G47" , "G48" , "G49" , "G5A" , "G5B" , "G5C" , "G5D" ,
+"G5E" , "G5F" , "G5G" , "G5H" , "G5I" , "G5J" , "G5K" , "G5L" ,
+"G5M" , "G5N" , "G5O" , "G5P" , "G5Q" , "G5R" , "G5S" , "G5T" ,
+"G5U" , "G5V" , "G5W" , "G5X" , "G5Y" , "G5Z" , "G50" , "G51" ,
+"G52" , "G53" , "G54" , "G55" , "G56" , "G57" , "G58" , "G59" ,
+"G6A" , "G6B" , "G6C" , "G6D" , "G6E" , "G6F" , "G6G" , "G6H" ,
+"G6I" , "G6J" , "G6K" , "G6L" , "G6M" , "G6N" , "G6O" , "G6P" ,
+"G6Q" , "G6R" , "G6S" , "G6T" , "G6U" , "G6V" , "G6W" , "G6X" ,
+"G6Y" , "G6Z" , "G60" , "G61" , "G62" , "G63" , "G64" , "G65" ,
+"G66" , "G67" , "G68" , "G69" , "G7A" , "G7B" , "G7C" , "G7D" ,
+"G7E" , "G7F" , "G7G" , "G7H" , "G7I" , "G7J" , "G7K" , "G7L" ,
+"G7M" , "G7N" , "G7O" , "G7P" , "G7Q" , "G7R" , "G7S" , "G7T" ,
+"G7U" , "G7V" , "G7W" , "G7X" , "G7Y" , "G7Z" , "G70" , "G71" ,
+"G72" , "G73" , "G74" , "G75" , "G76" , "G77" , "G78" , "G79" ,
+"G8A" , "G8B" , "G8C" , "G8D" , "G8E" , "G8F" , "G8G" , "G8H" ,
+"G8I" , "G8J" , "G8K" , "G8L" , "G8M" , "G8N" , "G8O" , "G8P" ,
+"G8Q" , "G8R" , "G8S" , "G8T" , "G8U" , "G8V" , "G8W" , "G8X" ,
+"G8Y" , "G8Z" , "G80" , "G81" , "G82" , "G83" , "G84" , "G85" ,
+"G86" , "G87" , "G88" , "G89" , "G9A" , "G9B" , "G9C" , "G9D" ,
+"G9E" , "G9F" , "G9G" , "G9H" , "G9I" , "G9J" , "G9K" , "G9L" ,
+"G9M" , "G9N" , "G9O" , "G9P" , "G9Q" , "G9R" , "G9S" , "G9T" ,
+"G9U" , "G9V" , "G9W" , "G9X" , "G9Y" , "G9Z" , "G90" , "G91" ,
+"G92" , "G93" , "G94" , "G95" , "G96" , "G97" , "G98" , "G99" ,
+"HAA" , "HAB" , "HAC" , "HAD" , "HAE" , "HAF" , "HAG" , "HAH" ,
+"HAI" , "HAJ" , "HAK" , "HAL" , "HAM" , "HAN" , "HAO" , "HAP" ,
+"HAQ" , "HAR" , "HAS" , "HAT" , "HAU" , "HAV" , "HAW" , "HAX" ,
+"HAY" , "HAZ" , "HA0" , "HA1" , "HA2" , "HA3" , "HA4" , "HA5" ,
+"HA6" , "HA7" , "HA8" , "HA9" , "HBA" , "HBB" , "HBC" , "HBD" ,
+"HBE" , "HBF" , "HBG" , "HBH" , "HBI" , "HBJ" , "HBK" , "HBL" ,
+"HBM" , "HBN" , "HBO" , "HBP" , "HBQ" , "HBR" , "HBS" , "HBT" ,
+"HBU" , "HBV" , "HBW" , "HBX" , "HBY" , "HBZ" , "HB0" , "HB1" ,
+"HB2" , "HB3" , "HB4" , "HB5" , "HB6" , "HB7" , "HB8" , "HB9" ,
+"HCA" , "HCB" , "HCC" , "HCD" , "HCE" , "HCF" , "HCG" , "HCH" ,
+"HCI" , "HCJ" , "HCK" , "HCL" , "HCM" , "HCN" , "HCO" , "HCP" ,
+"HCQ" , "HCR" , "HCS" , "HCT" , "HCU" , "HCV" , "HCW" , "HCX" ,
+"HCY" , "HCZ" , "HC0" , "HC1" , "HC2" , "HC3" , "HC4" , "HC5" ,
+"HC6" , "HC7" , "HC8" , "HC9" , "HDA" , "HDB" , "HDC" , "HDD" ,
+"HDE" , "HDF" , "HDG" , "HDH" , "HDI" , "HDJ" , "HDK" , "HDL" ,
+"HDM" , "HDN" , "HDO" , "HDP" , "HDQ" , "HDR" , "HDS" , "HDT" ,
+"HDU" , "HDV" , "HDW" , "HDX" , "HDY" , "HDZ" , "HD0" , "HD1" ,
+"HD2" , "HD3" , "HD4" , "HD5" , "HD6" , "HD7" , "HD8" , "HD9" ,
+"HEA" , "HEB" , "HEC" , "HED" , "HEE" , "HEF" , "HEG" , "HEH" ,
+"HEI" , "HEJ" , "HEK" , "HEL" , "HEM" , "HEN" , "HEO" , "HEP" ,
+"HEQ" , "HER" , "HES" , "HET" , "HEU" , "HEV" , "HEW" , "HEX" ,
+"HEY" , "HEZ" , "HE0" , "HE1" , "HE2" , "HE3" , "HE4" , "HE5" ,
+"HE6" , "HE7" , "HE8" , "HE9" , "HFA" , "HFB" , "HFC" , "HFD" ,
+"HFE" , "HFF" , "HFG" , "HFH" , "HFI" , "HFJ" , "HFK" , "HFL" ,
+"HFM" , "HFN" , "HFO" , "HFP" , "HFQ" , "HFR" , "HFS" , "HFT" ,
+"HFU" , "HFV" , "HFW" , "HFX" , "HFY" , "HFZ" , "HF0" , "HF1" ,
+"HF2" , "HF3" , "HF4" , "HF5" , "HF6" , "HF7" , "HF8" , "HF9" ,
+"HGA" , "HGB" , "HGC" , "HGD" , "HGE" , "HGF" , "HGG" , "HGH" ,
+"HGI" , "HGJ" , "HGK" , "HGL" , "HGM" , "HGN" , "HGO" , "HGP" ,
+"HGQ" , "HGR" , "HGS" , "HGT" , "HGU" , "HGV" , "HGW" , "HGX" ,
+"HGY" , "HGZ" , "HG0" , "HG1" , "HG2" , "HG3" , "HG4" , "HG5" ,
+"HG6" , "HG7" , "HG8" , "HG9" , "HHA" , "HHB" , "HHC" , "HHD" ,
+"HHE" , "HHF" , "HHG" , "HHH" , "HHI" , "HHJ" , "HHK" , "HHL" ,
+"HHM" , "HHN" , "HHO" , "HHP" , "HHQ" , "HHR" , "HHS" , "HHT" ,
+"HHU" , "HHV" , "HHW" , "HHX" , "HHY" , "HHZ" , "HH0" , "HH1" ,
+"HH2" , "HH3" , "HH4" , "HH5" , "HH6" , "HH7" , "HH8" , "HH9" ,
+"HIA" , "HIB" , "HIC" , "HID" , "HIE" , "HIF" , "HIG" , "HIH" ,
+"HII" , "HIJ" , "HIK" , "HIL" , "HIM" , "HIN" , "HIO" , "HIP" ,
+"HIQ" , "HIR" , "HIS" , "HIT" , "HIU" , "HIV" , "HIW" , "HIX" ,
+"HIY" , "HIZ" , "HI0" , "HI1" , "HI2" , "HI3" , "HI4" , "HI5" ,
+"HI6" , "HI7" , "HI8" , "HI9" , "HJA" , "HJB" , "HJC" , "HJD" ,
+"HJE" , "HJF" , "HJG" , "HJH" , "HJI" , "HJJ" , "HJK" , "HJL" ,
+"HJM" , "HJN" , "HJO" , "HJP" , "HJQ" , "HJR" , "HJS" , "HJT" ,
+"HJU" , "HJV" , "HJW" , "HJX" , "HJY" , "HJZ" , "HJ0" , "HJ1" ,
+"HJ2" , "HJ3" , "HJ4" , "HJ5" , "HJ6" , "HJ7" , "HJ8" , "HJ9" ,
+"HKA" , "HKB" , "HKC" , "HKD" , "HKE" , "HKF" , "HKG" , "HKH" ,
+"HKI" , "HKJ" , "HKK" , "HKL" , "HKM" , "HKN" , "HKO" , "HKP" ,
+"HKQ" , "HKR" , "HKS" , "HKT" , "HKU" , "HKV" , "HKW" , "HKX" ,
+"HKY" , "HKZ" , "HK0" , "HK1" , "HK2" , "HK3" , "HK4" , "HK5" ,
+"HK6" , "HK7" , "HK8" , "HK9" , "HLA" , "HLB" , "HLC" , "HLD" ,
+"HLE" , "HLF" , "HLG" , "HLH" , "HLI" , "HLJ" , "HLK" , "HLL" ,
+"HLM" , "HLN" , "HLO" , "HLP" , "HLQ" , "HLR" , "HLS" , "HLT" ,
+"HLU" , "HLV" , "HLW" , "HLX" , "HLY" , "HLZ" , "HL0" , "HL1" ,
+"HL2" , "HL3" , "HL4" , "HL5" , "HL6" , "HL7" , "HL8" , "HL9" ,
+"HMA" , "HMB" , "HMC" , "HMD" , "HME" , "HMF" , "HMG" , "HMH" ,
+"HMI" , "HMJ" , "HMK" , "HML" , "HMM" , "HMN" , "HMO" , "HMP" ,
+"HMQ" , "HMR" , "HMS" , "HMT" , "HMU" , "HMV" , "HMW" , "HMX" ,
+"HMY" , "HMZ" , "HM0" , "HM1" , "HM2" , "HM3" , "HM4" , "HM5" ,
+"HM6" , "HM7" , "HM8" , "HM9" , "HNA" , "HNB" , "HNC" , "HND" ,
+"HNE" , "HNF" , "HNG" , "HNH" , "HNI" , "HNJ" , "HNK" , "HNL" ,
+"HNM" , "HNN" , "HNO" , "HNP" , "HNQ" , "HNR" , "HNS" , "HNT" ,
+"HNU" , "HNV" , "HNW" , "HNX" , "HNY" , "HNZ" , "HN0" , "HN1" ,
+"HN2" , "HN3" , "HN4" , "HN5" , "HN6" , "HN7" , "HN8" , "HN9" ,
+"HOA" , "HOB" , "HOC" , "HOD" , "HOE" , "HOF" , "HOG" , "HOH" ,
+"HOI" , "HOJ" , "HOK" , "HOL" , "HOM" , "HON" , "HOO" , "HOP" ,
+"HOQ" , "HOR" , "HOS" , "HOT" , "HOU" , "HOV" , "HOW" , "HOX" ,
+"HOY" , "HOZ" , "HO0" , "HO1" , "HO2" , "HO3" , "HO4" , "HO5" ,
+"HO6" , "HO7" , "HO8" , "HO9" , "HPA" , "HPB" , "HPC" , "HPD" ,
+"HPE" , "HPF" , "HPG" , "HPH" , "HPI" , "HPJ" , "HPK" , "HPL" ,
+"HPM" , "HPN" , "HPO" , "HPP" , "HPQ" , "HPR" , "HPS" , "HPT" ,
+"HPU" , "HPV" , "HPW" , "HPX" , "HPY" , "HPZ" , "HP0" , "HP1" ,
+"HP2" , "HP3" , "HP4" , "HP5" , "HP6" , "HP7" , "HP8" , "HP9" ,
+"HQA" , "HQB" , "HQC" , "HQD" , "HQE" , "HQF" , "HQG" , "HQH" ,
+"HQI" , "HQJ" , "HQK" , "HQL" , "HQM" , "HQN" , "HQO" , "HQP" ,
+"HQQ" , "HQR" , "HQS" , "HQT" , "HQU" , "HQV" , "HQW" , "HQX" ,
+"HQY" , "HQZ" , "HQ0" , "HQ1" , "HQ2" , "HQ3" , "HQ4" , "HQ5" ,
+"HQ6" , "HQ7" , "HQ8" , "HQ9" , "HRA" , "HRB" , "HRC" , "HRD" ,
+"HRE" , "HRF" , "HRG" , "HRH" , "HRI" , "HRJ" , "HRK" , "HRL" ,
+"HRM" , "HRN" , "HRO" , "HRP" , "HRQ" , "HRR" , "HRS" , "HRT" ,
+"HRU" , "HRV" , "HRW" , "HRX" , "HRY" , "HRZ" , "HR0" , "HR1" ,
+"HR2" , "HR3" , "HR4" , "HR5" , "HR6" , "HR7" , "HR8" , "HR9" ,
+"HSA" , "HSB" , "HSC" , "HSD" , "HSE" , "HSF" , "HSG" , "HSH" ,
+"HSI" , "HSJ" , "HSK" , "HSL" , "HSM" , "HSN" , "HSO" , "HSP" ,
+"HSQ" , "HSR" , "HSS" , "HST" , "HSU" , "HSV" , "HSW" , "HSX" ,
+"HSY" , "HSZ" , "HS0" , "HS1" , "HS2" , "HS3" , "HS4" , "HS5" ,
+"HS6" , "HS7" , "HS8" , "HS9" , "HTA" , "HTB" , "HTC" , "HTD" ,
+"HTE" , "HTF" , "HTG" , "HTH" , "HTI" , "HTJ" , "HTK" , "HTL" ,
+"HTM" , "HTN" , "HTO" , "HTP" , "HTQ" , "HTR" , "HTS" , "HTT" ,
+"HTU" , "HTV" , "HTW" , "HTX" , "HTY" , "HTZ" , "HT0" , "HT1" ,
+"HT2" , "HT3" , "HT4" , "HT5" , "HT6" , "HT7" , "HT8" , "HT9" ,
+"HUA" , "HUB" , "HUC" , "HUD" , "HUE" , "HUF" , "HUG" , "HUH" ,
+"HUI" , "HUJ" , "HUK" , "HUL" , "HUM" , "HUN" , "HUO" , "HUP" ,
+"HUQ" , "HUR" , "HUS" , "HUT" , "HUU" , "HUV" , "HUW" , "HUX" ,
+"HUY" , "HUZ" , "HU0" , "HU1" , "HU2" , "HU3" , "HU4" , "HU5" ,
+"HU6" , "HU7" , "HU8" , "HU9" , "HVA" , "HVB" , "HVC" , "HVD" ,
+"HVE" , "HVF" , "HVG" , "HVH" , "HVI" , "HVJ" , "HVK" , "HVL" ,
+"HVM" , "HVN" , "HVO" , "HVP" , "HVQ" , "HVR" , "HVS" , "HVT" ,
+"HVU" , "HVV" , "HVW" , "HVX" , "HVY" , "HVZ" , "HV0" , "HV1" ,
+"HV2" , "HV3" , "HV4" , "HV5" , "HV6" , "HV7" , "HV8" , "HV9" ,
+"HWA" , "HWB" , "HWC" , "HWD" , "HWE" , "HWF" , "HWG" , "HWH" ,
+"HWI" , "HWJ" , "HWK" , "HWL" , "HWM" , "HWN" , "HWO" , "HWP" ,
+"HWQ" , "HWR" , "HWS" , "HWT" , "HWU" , "HWV" , "HWW" , "HWX" ,
+"HWY" , "HWZ" , "HW0" , "HW1" , "HW2" , "HW3" , "HW4" , "HW5" ,
+"HW6" , "HW7" , "HW8" , "HW9" , "HXA" , "HXB" , "HXC" , "HXD" ,
+"HXE" , "HXF" , "HXG" , "HXH" , "HXI" , "HXJ" , "HXK" , "HXL" ,
+"HXM" , "HXN" , "HXO" , "HXP" , "HXQ" , "HXR" , "HXS" , "HXT" ,
+"HXU" , "HXV" , "HXW" , "HXX" , "HXY" , "HXZ" , "HX0" , "HX1" ,
+"HX2" , "HX3" , "HX4" , "HX5" , "HX6" , "HX7" , "HX8" , "HX9" ,
+"HYA" , "HYB" , "HYC" , "HYD" , "HYE" , "HYF" , "HYG" , "HYH" ,
+"HYI" , "HYJ" , "HYK" , "HYL" , "HYM" , "HYN" , "HYO" , "HYP" ,
+"HYQ" , "HYR" , "HYS" , "HYT" , "HYU" , "HYV" , "HYW" , "HYX" ,
+"HYY" , "HYZ" , "HY0" , "HY1" , "HY2" , "HY3" , "HY4" , "HY5" ,
+"HY6" , "HY7" , "HY8" , "HY9" , "HZA" , "HZB" , "HZC" , "HZD" ,
+"HZE" , "HZF" , "HZG" , "HZH" , "HZI" , "HZJ" , "HZK" , "HZL" ,
+"HZM" , "HZN" , "HZO" , "HZP" , "HZQ" , "HZR" , "HZS" , "HZT" ,
+"HZU" , "HZV" , "HZW" , "HZX" , "HZY" , "HZZ" , "HZ0" , "HZ1" ,
+"HZ2" , "HZ3" , "HZ4" , "HZ5" , "HZ6" , "HZ7" , "HZ8" , "HZ9" ,
+"H0A" , "H0B" , "H0C" , "H0D" , "H0E" , "H0F" , "H0G" , "H0H" ,
+"H0I" , "H0J" , "H0K" , "H0L" , "H0M" , "H0N" , "H0O" , "H0P" ,
+"H0Q" , "H0R" , "H0S" , "H0T" , "H0U" , "H0V" , "H0W" , "H0X" ,
+"H0Y" , "H0Z" , "H00" , "H01" , "H02" , "H03" , "H04" , "H05" ,
+"H06" , "H07" , "H08" , "H09" , "H1A" , "H1B" , "H1C" , "H1D" ,
+"H1E" , "H1F" , "H1G" , "H1H" , "H1I" , "H1J" , "H1K" , "H1L" ,
+"H1M" , "H1N" , "H1O" , "H1P" , "H1Q" , "H1R" , "H1S" , "H1T" ,
+"H1U" , "H1V" , "H1W" , "H1X" , "H1Y" , "H1Z" , "H10" , "H11" ,
+"H12" , "H13" , "H14" , "H15" , "H16" , "H17" , "H18" , "H19" ,
+"H2A" , "H2B" , "H2C" , "H2D" , "H2E" , "H2F" , "H2G" , "H2H" ,
+"H2I" , "H2J" , "H2K" , "H2L" , "H2M" , "H2N" , "H2O" , "H2P" ,
+"H2Q" , "H2R" , "H2S" , "H2T" , "H2U" , "H2V" , "H2W" , "H2X" ,
+"H2Y" , "H2Z" , "H20" , "H21" , "H22" , "H23" , "H24" , "H25" ,
+"H26" , "H27" , "H28" , "H29" , "H3A" , "H3B" , "H3C" , "H3D" ,
+"H3E" , "H3F" , "H3G" , "H3H" , "H3I" , "H3J" , "H3K" , "H3L" ,
+"H3M" , "H3N" , "H3O" , "H3P" , "H3Q" , "H3R" , "H3S" , "H3T" ,
+"H3U" , "H3V" , "H3W" , "H3X" , "H3Y" , "H3Z" , "H30" , "H31" ,
+"H32" , "H33" , "H34" , "H35" , "H36" , "H37" , "H38" , "H39" ,
+"H4A" , "H4B" , "H4C" , "H4D" , "H4E" , "H4F" , "H4G" , "H4H" ,
+"H4I" , "H4J" , "H4K" , "H4L" , "H4M" , "H4N" , "H4O" , "H4P" ,
+"H4Q" , "H4R" , "H4S" , "H4T" , "H4U" , "H4V" , "H4W" , "H4X" ,
+"H4Y" , "H4Z" , "H40" , "H41" , "H42" , "H43" , "H44" , "H45" ,
+"H46" , "H47" , "H48" , "H49" , "H5A" , "H5B" , "H5C" , "H5D" ,
+"H5E" , "H5F" , "H5G" , "H5H" , "H5I" , "H5J" , "H5K" , "H5L" ,
+"H5M" , "H5N" , "H5O" , "H5P" , "H5Q" , "H5R" , "H5S" , "H5T" ,
+"H5U" , "H5V" , "H5W" , "H5X" , "H5Y" , "H5Z" , "H50" , "H51" ,
+"H52" , "H53" , "H54" , "H55" , "H56" , "H57" , "H58" , "H59" ,
+"H6A" , "H6B" , "H6C" , "H6D" , "H6E" , "H6F" , "H6G" , "H6H" ,
+"H6I" , "H6J" , "H6K" , "H6L" , "H6M" , "H6N" , "H6O" , "H6P" ,
+"H6Q" , "H6R" , "H6S" , "H6T" , "H6U" , "H6V" , "H6W" , "H6X" ,
+"H6Y" , "H6Z" , "H60" , "H61" , "H62" , "H63" , "H64" , "H65" ,
+"H66" , "H67" , "H68" , "H69" , "H7A" , "H7B" , "H7C" , "H7D" ,
+"H7E" , "H7F" , "H7G" , "H7H" , "H7I" , "H7J" , "H7K" , "H7L" ,
+"H7M" , "H7N" , "H7O" , "H7P" , "H7Q" , "H7R" , "H7S" , "H7T" ,
+"H7U" , "H7V" , "H7W" , "H7X" , "H7Y" , "H7Z" , "H70" , "H71" ,
+"H72" , "H73" , "H74" , "H75" , "H76" , "H77" , "H78" , "H79" ,
+"H8A" , "H8B" , "H8C" , "H8D" , "H8E" , "H8F" , "H8G" , "H8H" ,
+"H8I" , "H8J" , "H8K" , "H8L" , "H8M" , "H8N" , "H8O" , "H8P" ,
+"H8Q" , "H8R" , "H8S" , "H8T" , "H8U" , "H8V" , "H8W" , "H8X" ,
+"H8Y" , "H8Z" , "H80" , "H81" , "H82" , "H83" , "H84" , "H85" ,
+"H86" , "H87" , "H88" , "H89" , "H9A" , "H9B" , "H9C" , "H9D" ,
+"H9E" , "H9F" , "H9G" , "H9H" , "H9I" , "H9J" , "H9K" , "H9L" ,
+"H9M" , "H9N" , "H9O" , "H9P" , "H9Q" , "H9R" , "H9S" , "H9T" ,
+"H9U" , "H9V" , "H9W" , "H9X" , "H9Y" , "H9Z" , "H90" , "H91" ,
+"H92" , "H93" , "H94" , "H95" , "H96" , "H97" , "H98" , "H99" ,
+"IAA" , "IAB" , "IAC" , "IAD" , "IAE" , "IAF" , "IAG" , "IAH" ,
+"IAI" , "IAJ" , "IAK" , "IAL" , "IAM" , "IAN" , "IAO" , "IAP" ,
+"IAQ" , "IAR" , "IAS" , "IAT" , "IAU" , "IAV" , "IAW" , "IAX" ,
+"IAY" , "IAZ" , "IA0" , "IA1" , "IA2" , "IA3" , "IA4" , "IA5" ,
+"IA6" , "IA7" , "IA8" , "IA9" , "IBA" , "IBB" , "IBC" , "IBD" ,
+"IBE" , "IBF" , "IBG" , "IBH" , "IBI" , "IBJ" , "IBK" , "IBL" ,
+"IBM" , "IBN" , "IBO" , "IBP" , "IBQ" , "IBR" , "IBS" , "IBT" ,
+"IBU" , "IBV" , "IBW" , "IBX" , "IBY" , "IBZ" , "IB0" , "IB1" ,
+"IB2" , "IB3" , "IB4" , "IB5" , "IB6" , "IB7" , "IB8" , "IB9" ,
+"ICA" , "ICB" , "ICC" , "ICD" , "ICE" , "ICF" , "ICG" , "ICH" ,
+"ICI" , "ICJ" , "ICK" , "ICL" , "ICM" , "ICN" , "ICO" , "ICP" ,
+"ICQ" , "ICR" , "ICS" , "ICT" , "ICU" , "ICV" , "ICW" , "ICX" ,
+"ICY" , "ICZ" , "IC0" , "IC1" , "IC2" , "IC3" , "IC4" , "IC5" ,
+"IC6" , "IC7" , "IC8" , "IC9" , "IDA" , "IDB" , "IDC" , "IDD" ,
+"IDE" , "IDF" , "IDG" , "IDH" , "IDI" , "IDJ" , "IDK" , "IDL" ,
+"IDM" , "IDN" , "IDO" , "IDP" , "IDQ" , "IDR" , "IDS" , "IDT" ,
+"IDU" , "IDV" , "IDW" , "IDX" , "IDY" , "IDZ" , "ID0" , "ID1" ,
+"ID2" , "ID3" , "ID4" , "ID5" , "ID6" , "ID7" , "ID8" , "ID9" ,
+"IEA" , "IEB" , "IEC" , "IED" , "IEE" , "IEF" , "IEG" , "IEH" ,
+"IEI" , "IEJ" , "IEK" , "IEL" , "IEM" , "IEN" , "IEO" , "IEP" ,
+"IEQ" , "IER" , "IES" , "IET" , "IEU" , "IEV" , "IEW" , "IEX" ,
+"IEY" , "IEZ" , "IE0" , "IE1" , "IE2" , "IE3" , "IE4" , "IE5" ,
+"IE6" , "IE7" , "IE8" , "IE9" , "IFA" , "IFB" , "IFC" , "IFD" ,
+"IFE" , "IFF" , "IFG" , "IFH" , "IFI" , "IFJ" , "IFK" , "IFL" ,
+"IFM" , "IFN" , "IFO" , "IFP" , "IFQ" , "IFR" , "IFS" , "IFT" ,
+"IFU" , "IFV" , "IFW" , "IFX" , "IFY" , "IFZ" , "IF0" , "IF1" ,
+"IF2" , "IF3" , "IF4" , "IF5" , "IF6" , "IF7" , "IF8" , "IF9" ,
+"IGA" , "IGB" , "IGC" , "IGD" , "IGE" , "IGF" , "IGG" , "IGH" ,
+"IGI" , "IGJ" , "IGK" , "IGL" , "IGM" , "IGN" , "IGO" , "IGP" ,
+"IGQ" , "IGR" , "IGS" , "IGT" , "IGU" , "IGV" , "IGW" , "IGX" ,
+"IGY" , "IGZ" , "IG0" , "IG1" , "IG2" , "IG3" , "IG4" , "IG5" ,
+"IG6" , "IG7" , "IG8" , "IG9" , "IHA" , "IHB" , "IHC" , "IHD" ,
+"IHE" , "IHF" , "IHG" , "IHH" , "IHI" , "IHJ" , "IHK" , "IHL" ,
+"IHM" , "IHN" , "IHO" , "IHP" , "IHQ" , "IHR" , "IHS" , "IHT" ,
+"IHU" , "IHV" , "IHW" , "IHX" , "IHY" , "IHZ" , "IH0" , "IH1" ,
+"IH2" , "IH3" , "IH4" , "IH5" , "IH6" , "IH7" , "IH8" , "IH9" ,
+"IIA" , "IIB" , "IIC" , "IID" , "IIE" , "IIF" , "IIG" , "IIH" ,
+"III" , "IIJ" , "IIK" , "IIL" , "IIM" , "IIN" , "IIO" , "IIP" ,
+"IIQ" , "IIR" , "IIS" , "IIT" , "IIU" , "IIV" , "IIW" , "IIX" ,
+"IIY" , "IIZ" , "II0" , "II1" , "II2" , "II3" , "II4" , "II5" ,
+"II6" , "II7" , "II8" , "II9" , "IJA" , "IJB" , "IJC" , "IJD" ,
+"IJE" , "IJF" , "IJG" , "IJH" , "IJI" , "IJJ" , "IJK" , "IJL" ,
+"IJM" , "IJN" , "IJO" , "IJP" , "IJQ" , "IJR" , "IJS" , "IJT" ,
+"IJU" , "IJV" , "IJW" , "IJX" , "IJY" , "IJZ" , "IJ0" , "IJ1" ,
+"IJ2" , "IJ3" , "IJ4" , "IJ5" , "IJ6" , "IJ7" , "IJ8" , "IJ9" ,
+"IKA" , "IKB" , "IKC" , "IKD" , "IKE" , "IKF" , "IKG" , "IKH" ,
+"IKI" , "IKJ" , "IKK" , "IKL" , "IKM" , "IKN" , "IKO" , "IKP" ,
+"IKQ" , "IKR" , "IKS" , "IKT" , "IKU" , "IKV" , "IKW" , "IKX" ,
+"IKY" , "IKZ" , "IK0" , "IK1" , "IK2" , "IK3" , "IK4" , "IK5" ,
+"IK6" , "IK7" , "IK8" , "IK9" , "ILA" , "ILB" , "ILC" , "ILD" ,
+"ILE" , "ILF" , "ILG" , "ILH" , "ILI" , "ILJ" , "ILK" , "ILL" ,
+"ILM" , "ILN" , "ILO" , "ILP" , "ILQ" , "ILR" , "ILS" , "ILT" ,
+"ILU" , "ILV" , "ILW" , "ILX" , "ILY" , "ILZ" , "IL0" , "IL1" ,
+"IL2" , "IL3" , "IL4" , "IL5" , "IL6" , "IL7" , "IL8" , "IL9" ,
+"IMA" , "IMB" , "IMC" , "IMD" , "IME" , "IMF" , "IMG" , "IMH" ,
+"IMI" , "IMJ" , "IMK" , "IML" , "IMM" , "IMN" , "IMO" , "IMP" ,
+"IMQ" , "IMR" , "IMS" , "IMT" , "IMU" , "IMV" , "IMW" , "IMX" ,
+"IMY" , "IMZ" , "IM0" , "IM1" , "IM2" , "IM3" , "IM4" , "IM5" ,
+"IM6" , "IM7" , "IM8" , "IM9" , "INA" , "INB" , "INC" , "IND" ,
+"INE" , "INF" , "ING" , "INH" , "INI" , "INJ" , "INK" , "INL" ,
+"INM" , "INN" , "INO" , "INP" , "INQ" , "INR" , "INS" , "INT" ,
+"INU" , "INV" , "INW" , "INX" , "INY" , "INZ" , "IN0" , "IN1" ,
+"IN2" , "IN3" , "IN4" , "IN5" , "IN6" , "IN7" , "IN8" , "IN9" ,
+"IOA" , "IOB" , "IOC" , "IOD" , "IOE" , "IOF" , "IOG" , "IOH" ,
+"IOI" , "IOJ" , "IOK" , "IOL" , "IOM" , "ION" , "IOO" , "IOP" ,
+"IOQ" , "IOR" , "IOS" , "IOT" , "IOU" , "IOV" , "IOW" , "IOX" ,
+"IOY" , "IOZ" , "IO0" , "IO1" , "IO2" , "IO3" , "IO4" , "IO5" ,
+"IO6" , "IO7" , "IO8" , "IO9" , "IPA" , "IPB" , "IPC" , "IPD" ,
+"IPE" , "IPF" , "IPG" , "IPH" , "IPI" , "IPJ" , "IPK" , "IPL" ,
+"IPM" , "IPN" , "IPO" , "IPP" , "IPQ" , "IPR" , "IPS" , "IPT" ,
+"IPU" , "IPV" , "IPW" , "IPX" , "IPY" , "IPZ" , "IP0" , "IP1" ,
+"IP2" , "IP3" , "IP4" , "IP5" , "IP6" , "IP7" , "IP8" , "IP9" ,
+"IQA" , "IQB" , "IQC" , "IQD" , "IQE" , "IQF" , "IQG" , "IQH" ,
+"IQI" , "IQJ" , "IQK" , "IQL" , "IQM" , "IQN" , "IQO" , "IQP" ,
+"IQQ" , "IQR" , "IQS" , "IQT" , "IQU" , "IQV" , "IQW" , "IQX" ,
+"IQY" , "IQZ" , "IQ0" , "IQ1" , "IQ2" , "IQ3" , "IQ4" , "IQ5" ,
+"IQ6" , "IQ7" , "IQ8" , "IQ9" , "IRA" , "IRB" , "IRC" , "IRD" ,
+"IRE" , "IRF" , "IRG" , "IRH" , "IRI" , "IRJ" , "IRK" , "IRL" ,
+"IRM" , "IRN" , "IRO" , "IRP" , "IRQ" , "IRR" , "IRS" , "IRT" ,
+"IRU" , "IRV" , "IRW" , "IRX" , "IRY" , "IRZ" , "IR0" , "IR1" ,
+"IR2" , "IR3" , "IR4" , "IR5" , "IR6" , "IR7" , "IR8" , "IR9" ,
+"ISA" , "ISB" , "ISC" , "ISD" , "ISE" , "ISF" , "ISG" , "ISH" ,
+"ISI" , "ISJ" , "ISK" , "ISL" , "ISM" , "ISN" , "ISO" , "ISP" ,
+"ISQ" , "ISR" , "ISS" , "IST" , "ISU" , "ISV" , "ISW" , "ISX" ,
+"ISY" , "ISZ" , "IS0" , "IS1" , "IS2" , "IS3" , "IS4" , "IS5" ,
+"IS6" , "IS7" , "IS8" , "IS9" , "ITA" , "ITB" , "ITC" , "ITD" ,
+"ITE" , "ITF" , "ITG" , "ITH" , "ITI" , "ITJ" , "ITK" , "ITL" ,
+"ITM" , "ITN" , "ITO" , "ITP" , "ITQ" , "ITR" , "ITS" , "ITT" ,
+"ITU" , "ITV" , "ITW" , "ITX" , "ITY" , "ITZ" , "IT0" , "IT1" ,
+"IT2" , "IT3" , "IT4" , "IT5" , "IT6" , "IT7" , "IT8" , "IT9" ,
+"IUA" , "IUB" , "IUC" , "IUD" , "IUE" , "IUF" , "IUG" , "IUH" ,
+"IUI" , "IUJ" , "IUK" , "IUL" , "IUM" , "IUN" , "IUO" , "IUP" ,
+"IUQ" , "IUR" , "IUS" , "IUT" , "IUU" , "IUV" , "IUW" , "IUX" ,
+"IUY" , "IUZ" , "IU0" , "IU1" , "IU2" , "IU3" , "IU4" , "IU5" ,
+"IU6" , "IU7" , "IU8" , "IU9" , "IVA" , "IVB" , "IVC" , "IVD" ,
+"IVE" , "IVF" , "IVG" , "IVH" , "IVI" , "IVJ" , "IVK" , "IVL" ,
+"IVM" , "IVN" , "IVO" , "IVP" , "IVQ" , "IVR" , "IVS" , "IVT" ,
+"IVU" , "IVV" , "IVW" , "IVX" , "IVY" , "IVZ" , "IV0" , "IV1" ,
+"IV2" , "IV3" , "IV4" , "IV5" , "IV6" , "IV7" , "IV8" , "IV9" ,
+"IWA" , "IWB" , "IWC" , "IWD" , "IWE" , "IWF" , "IWG" , "IWH" ,
+"IWI" , "IWJ" , "IWK" , "IWL" , "IWM" , "IWN" , "IWO" , "IWP" ,
+"IWQ" , "IWR" , "IWS" , "IWT" , "IWU" , "IWV" , "IWW" , "IWX" ,
+"IWY" , "IWZ" , "IW0" , "IW1" , "IW2" , "IW3" , "IW4" , "IW5" ,
+"IW6" , "IW7" , "IW8" , "IW9" , "IXA" , "IXB" , "IXC" , "IXD" ,
+"IXE" , "IXF" , "IXG" , "IXH" , "IXI" , "IXJ" , "IXK" , "IXL" ,
+"IXM" , "IXN" , "IXO" , "IXP" , "IXQ" , "IXR" , "IXS" , "IXT" ,
+"IXU" , "IXV" , "IXW" , "IXX" , "IXY" , "IXZ" , "IX0" , "IX1" ,
+"IX2" , "IX3" , "IX4" , "IX5" , "IX6" , "IX7" , "IX8" , "IX9" ,
+"IYA" , "IYB" , "IYC" , "IYD" , "IYE" , "IYF" , "IYG" , "IYH" ,
+"IYI" , "IYJ" , "IYK" , "IYL" , "IYM" , "IYN" , "IYO" , "IYP" ,
+"IYQ" , "IYR" , "IYS" , "IYT" , "IYU" , "IYV" , "IYW" , "IYX" ,
+"IYY" , "IYZ" , "IY0" , "IY1" , "IY2" , "IY3" , "IY4" , "IY5" ,
+"IY6" , "IY7" , "IY8" , "IY9" , "IZA" , "IZB" , "IZC" , "IZD" ,
+"IZE" , "IZF" , "IZG" , "IZH" , "IZI" , "IZJ" , "IZK" , "IZL" ,
+"IZM" , "IZN" , "IZO" , "IZP" , "IZQ" , "IZR" , "IZS" , "IZT" ,
+"IZU" , "IZV" , "IZW" , "IZX" , "IZY" , "IZZ" , "IZ0" , "IZ1" ,
+"IZ2" , "IZ3" , "IZ4" , "IZ5" , "IZ6" , "IZ7" , "IZ8" , "IZ9" ,
+"I0A" , "I0B" , "I0C" , "I0D" , "I0E" , "I0F" , "I0G" , "I0H" ,
+"I0I" , "I0J" , "I0K" , "I0L" , "I0M" , "I0N" , "I0O" , "I0P" ,
+"I0Q" , "I0R" , "I0S" , "I0T" , "I0U" , "I0V" , "I0W" , "I0X" ,
+"I0Y" , "I0Z" , "I00" , "I01" , "I02" , "I03" , "I04" , "I05" ,
+"I06" , "I07" , "I08" , "I09" , "I1A" , "I1B" , "I1C" , "I1D" ,
+"I1E" , "I1F" , "I1G" , "I1H" , "I1I" , "I1J" , "I1K" , "I1L" ,
+"I1M" , "I1N" , "I1O" , "I1P" , "I1Q" , "I1R" , "I1S" , "I1T" ,
+"I1U" , "I1V" , "I1W" , "I1X" , "I1Y" , "I1Z" , "I10" , "I11" ,
+"I12" , "I13" , "I14" , "I15" , "I16" , "I17" , "I18" , "I19" ,
+"I2A" , "I2B" , "I2C" , "I2D" , "I2E" , "I2F" , "I2G" , "I2H" ,
+"I2I" , "I2J" , "I2K" , "I2L" , "I2M" , "I2N" , "I2O" , "I2P" ,
+"I2Q" , "I2R" , "I2S" , "I2T" , "I2U" , "I2V" , "I2W" , "I2X" ,
+"I2Y" , "I2Z" , "I20" , "I21" , "I22" , "I23" , "I24" , "I25" ,
+"I26" , "I27" , "I28" , "I29" , "I3A" , "I3B" , "I3C" , "I3D" ,
+"I3E" , "I3F" , "I3G" , "I3H" , "I3I" , "I3J" , "I3K" , "I3L" ,
+"I3M" , "I3N" , "I3O" , "I3P" , "I3Q" , "I3R" , "I3S" , "I3T" ,
+"I3U" , "I3V" , "I3W" , "I3X" , "I3Y" , "I3Z" , "I30" , "I31" ,
+"I32" , "I33" , "I34" , "I35" , "I36" , "I37" , "I38" , "I39" ,
+"I4A" , "I4B" , "I4C" , "I4D" , "I4E" , "I4F" , "I4G" , "I4H" ,
+"I4I" , "I4J" , "I4K" , "I4L" , "I4M" , "I4N" , "I4O" , "I4P" ,
+"I4Q" , "I4R" , "I4S" , "I4T" , "I4U" , "I4V" , "I4W" , "I4X" ,
+"I4Y" , "I4Z" , "I40" , "I41" , "I42" , "I43" , "I44" , "I45" ,
+"I46" , "I47" , "I48" , "I49" , "I5A" , "I5B" , "I5C" , "I5D" ,
+"I5E" , "I5F" , "I5G" , "I5H" , "I5I" , "I5J" , "I5K" , "I5L" ,
+"I5M" , "I5N" , "I5O" , "I5P" , "I5Q" , "I5R" , "I5S" , "I5T" ,
+"I5U" , "I5V" , "I5W" , "I5X" , "I5Y" , "I5Z" , "I50" , "I51" ,
+"I52" , "I53" , "I54" , "I55" , "I56" , "I57" , "I58" , "I59" ,
+"I6A" , "I6B" , "I6C" , "I6D" , "I6E" , "I6F" , "I6G" , "I6H" ,
+"I6I" , "I6J" , "I6K" , "I6L" , "I6M" , "I6N" , "I6O" , "I6P" ,
+"I6Q" , "I6R" , "I6S" , "I6T" , "I6U" , "I6V" , "I6W" , "I6X" ,
+"I6Y" , "I6Z" , "I60" , "I61" , "I62" , "I63" , "I64" , "I65" ,
+"I66" , "I67" , "I68" , "I69" , "I7A" , "I7B" , "I7C" , "I7D" ,
+"I7E" , "I7F" , "I7G" , "I7H" , "I7I" , "I7J" , "I7K" , "I7L" ,
+"I7M" , "I7N" , "I7O" , "I7P" , "I7Q" , "I7R" , "I7S" , "I7T" ,
+"I7U" , "I7V" , "I7W" , "I7X" , "I7Y" , "I7Z" , "I70" , "I71" ,
+"I72" , "I73" , "I74" , "I75" , "I76" , "I77" , "I78" , "I79" ,
+"I8A" , "I8B" , "I8C" , "I8D" , "I8E" , "I8F" , "I8G" , "I8H" ,
+"I8I" , "I8J" , "I8K" , "I8L" , "I8M" , "I8N" , "I8O" , "I8P" ,
+"I8Q" , "I8R" , "I8S" , "I8T" , "I8U" , "I8V" , "I8W" , "I8X" ,
+"I8Y" , "I8Z" , "I80" , "I81" , "I82" , "I83" , "I84" , "I85" ,
+"I86" , "I87" , "I88" , "I89" , "I9A" , "I9B" , "I9C" , "I9D" ,
+"I9E" , "I9F" , "I9G" , "I9H" , "I9I" , "I9J" , "I9K" , "I9L" ,
+"I9M" , "I9N" , "I9O" , "I9P" , "I9Q" , "I9R" , "I9S" , "I9T" ,
+"I9U" , "I9V" , "I9W" , "I9X" , "I9Y" , "I9Z" , "I90" , "I91" ,
+"I92" , "I93" , "I94" , "I95" , "I96" , "I97" , "I98" , "I99" ,
+"JAA" , "JAB" , "JAC" , "JAD" , "JAE" , "JAF" , "JAG" , "JAH" ,
+"JAI" , "JAJ" , "JAK" , "JAL" , "JAM" , "JAN" , "JAO" , "JAP" ,
+"JAQ" , "JAR" , "JAS" , "JAT" , "JAU" , "JAV" , "JAW" , "JAX" ,
+"JAY" , "JAZ" , "JA0" , "JA1" , "JA2" , "JA3" , "JA4" , "JA5" ,
+"JA6" , "JA7" , "JA8" , "JA9" , "JBA" , "JBB" , "JBC" , "JBD" ,
+"JBE" , "JBF" , "JBG" , "JBH" , "JBI" , "JBJ" , "JBK" , "JBL" ,
+"JBM" , "JBN" , "JBO" , "JBP" , "JBQ" , "JBR" , "JBS" , "JBT" ,
+"JBU" , "JBV" , "JBW" , "JBX" , "JBY" , "JBZ" , "JB0" , "JB1" ,
+"JB2" , "JB3" , "JB4" , "JB5" , "JB6" , "JB7" , "JB8" , "JB9" ,
+"JCA" , "JCB" , "JCC" , "JCD" , "JCE" , "JCF" , "JCG" , "JCH" ,
+"JCI" , "JCJ" , "JCK" , "JCL" , "JCM" , "JCN" , "JCO" , "JCP" ,
+"JCQ" , "JCR" , "JCS" , "JCT" , "JCU" , "JCV" , "JCW" , "JCX" ,
+"JCY" , "JCZ" , "JC0" , "JC1" , "JC2" , "JC3" , "JC4" , "JC5" ,
+"JC6" , "JC7" , "JC8" , "JC9" , "JDA" , "JDB" , "JDC" , "JDD" ,
+"JDE" , "JDF" , "JDG" , "JDH" , "JDI" , "JDJ" , "JDK" , "JDL" ,
+"JDM" , "JDN" , "JDO" , "JDP" , "JDQ" , "JDR" , "JDS" , "JDT" ,
+"JDU" , "JDV" , "JDW" , "JDX" , "JDY" , "JDZ" , "JD0" , "JD1" ,
+"JD2" , "JD3" , "JD4" , "JD5" , "JD6" , "JD7" , "JD8" , "JD9" ,
+"JEA" , "JEB" , "JEC" , "JED" , "JEE" , "JEF" , "JEG" , "JEH" ,
+"JEI" , "JEJ" , "JEK" , "JEL" , "JEM" , "JEN" , "JEO" , "JEP" ,
+"JEQ" , "JER" , "JES" , "JET" , "JEU" , "JEV" , "JEW" , "JEX" ,
+"JEY" , "JEZ" , "JE0" , "JE1" , "JE2" , "JE3" , "JE4" , "JE5" ,
+"JE6" , "JE7" , "JE8" , "JE9" , "JFA" , "JFB" , "JFC" , "JFD" ,
+"JFE" , "JFF" , "JFG" , "JFH" , "JFI" , "JFJ" , "JFK" , "JFL" ,
+"JFM" , "JFN" , "JFO" , "JFP" , "JFQ" , "JFR" , "JFS" , "JFT" ,
+"JFU" , "JFV" , "JFW" , "JFX" , "JFY" , "JFZ" , "JF0" , "JF1" ,
+"JF2" , "JF3" , "JF4" , "JF5" , "JF6" , "JF7" , "JF8" , "JF9" ,
+"JGA" , "JGB" , "JGC" , "JGD" , "JGE" , "JGF" , "JGG" , "JGH" ,
+"JGI" , "JGJ" , "JGK" , "JGL" , "JGM" , "JGN" , "JGO" , "JGP" ,
+"JGQ" , "JGR" , "JGS" , "JGT" , "JGU" , "JGV" , "JGW" , "JGX" ,
+"JGY" , "JGZ" , "JG0" , "JG1" , "JG2" , "JG3" , "JG4" , "JG5" ,
+"JG6" , "JG7" , "JG8" , "JG9" , "JHA" , "JHB" , "JHC" , "JHD" ,
+"JHE" , "JHF" , "JHG" , "JHH" , "JHI" , "JHJ" , "JHK" , "JHL" ,
+"JHM" , "JHN" , "JHO" , "JHP" , "JHQ" , "JHR" , "JHS" , "JHT" ,
+"JHU" , "JHV" , "JHW" , "JHX" , "JHY" , "JHZ" , "JH0" , "JH1" ,
+"JH2" , "JH3" , "JH4" , "JH5" , "JH6" , "JH7" , "JH8" , "JH9" ,
+"JIA" , "JIB" , "JIC" , "JID" , "JIE" , "JIF" , "JIG" , "JIH" ,
+"JII" , "JIJ" , "JIK" , "JIL" , "JIM" , "JIN" , "JIO" , "JIP" ,
+"JIQ" , "JIR" , "JIS" , "JIT" , "JIU" , "JIV" , "JIW" , "JIX" ,
+"JIY" , "JIZ" , "JI0" , "JI1" , "JI2" , "JI3" , "JI4" , "JI5" ,
+"JI6" , "JI7" , "JI8" , "JI9" , "JJA" , "JJB" , "JJC" , "JJD" ,
+"JJE" , "JJF" , "JJG" , "JJH" , "JJI" , "JJJ" , "JJK" , "JJL" ,
+"JJM" , "JJN" , "JJO" , "JJP" , "JJQ" , "JJR" , "JJS" , "JJT" ,
+"JJU" , "JJV" , "JJW" , "JJX" , "JJY" , "JJZ" , "JJ0" , "JJ1" ,
+"JJ2" , "JJ3" , "JJ4" , "JJ5" , "JJ6" , "JJ7" , "JJ8" , "JJ9" ,
+"JKA" , "JKB" , "JKC" , "JKD" , "JKE" , "JKF" , "JKG" , "JKH" ,
+"JKI" , "JKJ" , "JKK" , "JKL" , "JKM" , "JKN" , "JKO" , "JKP" ,
+"JKQ" , "JKR" , "JKS" , "JKT" , "JKU" , "JKV" , "JKW" , "JKX" ,
+"JKY" , "JKZ" , "JK0" , "JK1" , "JK2" , "JK3" , "JK4" , "JK5" ,
+"JK6" , "JK7" , "JK8" , "JK9" , "JLA" , "JLB" , "JLC" , "JLD" ,
+"JLE" , "JLF" , "JLG" , "JLH" , "JLI" , "JLJ" , "JLK" , "JLL" ,
+"JLM" , "JLN" , "JLO" , "JLP" , "JLQ" , "JLR" , "JLS" , "JLT" ,
+"JLU" , "JLV" , "JLW" , "JLX" , "JLY" , "JLZ" , "JL0" , "JL1" ,
+"JL2" , "JL3" , "JL4" , "JL5" , "JL6" , "JL7" , "JL8" , "JL9" ,
+"JMA" , "JMB" , "JMC" , "JMD" , "JME" , "JMF" , "JMG" , "JMH" ,
+"JMI" , "JMJ" , "JMK" , "JML" , "JMM" , "JMN" , "JMO" , "JMP" ,
+"JMQ" , "JMR" , "JMS" , "JMT" , "JMU" , "JMV" , "JMW" , "JMX" ,
+"JMY" , "JMZ" , "JM0" , "JM1" , "JM2" , "JM3" , "JM4" , "JM5" ,
+"JM6" , "JM7" , "JM8" , "JM9" , "JNA" , "JNB" , "JNC" , "JND" ,
+"JNE" , "JNF" , "JNG" , "JNH" , "JNI" , "JNJ" , "JNK" , "JNL" ,
+"JNM" , "JNN" , "JNO" , "JNP" , "JNQ" , "JNR" , "JNS" , "JNT" ,
+"JNU" , "JNV" , "JNW" , "JNX" , "JNY" , "JNZ" , "JN0" , "JN1" ,
+"JN2" , "JN3" , "JN4" , "JN5" , "JN6" , "JN7" , "JN8" , "JN9" ,
+"JOA" , "JOB" , "JOC" , "JOD" , "JOE" , "JOF" , "JOG" , "JOH" ,
+"JOI" , "JOJ" , "JOK" , "JOL" , "JOM" , "JON" , "JOO" , "JOP" ,
+"JOQ" , "JOR" , "JOS" , "JOT" , "JOU" , "JOV" , "JOW" , "JOX" ,
+"JOY" , "JOZ" , "JO0" , "JO1" , "JO2" , "JO3" , "JO4" , "JO5" ,
+"JO6" , "JO7" , "JO8" , "JO9" , "JPA" , "JPB" , "JPC" , "JPD" ,
+"JPE" , "JPF" , "JPG" , "JPH" , "JPI" , "JPJ" , "JPK" , "JPL" ,
+"JPM" , "JPN" , "JPO" , "JPP" , "JPQ" , "JPR" , "JPS" , "JPT" ,
+"JPU" , "JPV" , "JPW" , "JPX" , "JPY" , "JPZ" , "JP0" , "JP1" ,
+"JP2" , "JP3" , "JP4" , "JP5" , "JP6" , "JP7" , "JP8" , "JP9" ,
+"JQA" , "JQB" , "JQC" , "JQD" , "JQE" , "JQF" , "JQG" , "JQH" ,
+"JQI" , "JQJ" , "JQK" , "JQL" , "JQM" , "JQN" , "JQO" , "JQP" ,
+"JQQ" , "JQR" , "JQS" , "JQT" , "JQU" , "JQV" , "JQW" , "JQX" ,
+"JQY" , "JQZ" , "JQ0" , "JQ1" , "JQ2" , "JQ3" , "JQ4" , "JQ5" ,
+"JQ6" , "JQ7" , "JQ8" , "JQ9" , "JRA" , "JRB" , "JRC" , "JRD" ,
+"JRE" , "JRF" , "JRG" , "JRH" , "JRI" , "JRJ" , "JRK" , "JRL" ,
+"JRM" , "JRN" , "JRO" , "JRP" , "JRQ" , "JRR" , "JRS" , "JRT" ,
+"JRU" , "JRV" , "JRW" , "JRX" , "JRY" , "JRZ" , "JR0" , "JR1" ,
+"JR2" , "JR3" , "JR4" , "JR5" , "JR6" , "JR7" , "JR8" , "JR9" ,
+"JSA" , "JSB" , "JSC" , "JSD" , "JSE" , "JSF" , "JSG" , "JSH" ,
+"JSI" , "JSJ" , "JSK" , "JSL" , "JSM" , "JSN" , "JSO" , "JSP" ,
+"JSQ" , "JSR" , "JSS" , "JST" , "JSU" , "JSV" , "JSW" , "JSX" ,
+"JSY" , "JSZ" , "JS0" , "JS1" , "JS2" , "JS3" , "JS4" , "JS5" ,
+"JS6" , "JS7" , "JS8" , "JS9" , "JTA" , "JTB" , "JTC" , "JTD" ,
+"JTE" , "JTF" , "JTG" , "JTH" , "JTI" , "JTJ" , "JTK" , "JTL" ,
+"JTM" , "JTN" , "JTO" , "JTP" , "JTQ" , "JTR" , "JTS" , "JTT" ,
+"JTU" , "JTV" , "JTW" , "JTX" , "JTY" , "JTZ" , "JT0" , "JT1" ,
+"JT2" , "JT3" , "JT4" , "JT5" , "JT6" , "JT7" , "JT8" , "JT9" ,
+"JUA" , "JUB" , "JUC" , "JUD" , "JUE" , "JUF" , "JUG" , "JUH" ,
+"JUI" , "JUJ" , "JUK" , "JUL" , "JUM" , "JUN" , "JUO" , "JUP" ,
+"JUQ" , "JUR" , "JUS" , "JUT" , "JUU" , "JUV" , "JUW" , "JUX" ,
+"JUY" , "JUZ" , "JU0" , "JU1" , "JU2" , "JU3" , "JU4" , "JU5" ,
+"JU6" , "JU7" , "JU8" , "JU9" , "JVA" , "JVB" , "JVC" , "JVD" ,
+"JVE" , "JVF" , "JVG" , "JVH" , "JVI" , "JVJ" , "JVK" , "JVL" ,
+"JVM" , "JVN" , "JVO" , "JVP" , "JVQ" , "JVR" , "JVS" , "JVT" ,
+"JVU" , "JVV" , "JVW" , "JVX" , "JVY" , "JVZ" , "JV0" , "JV1" ,
+"JV2" , "JV3" , "JV4" , "JV5" , "JV6" , "JV7" , "JV8" , "JV9" ,
+"JWA" , "JWB" , "JWC" , "JWD" , "JWE" , "JWF" , "JWG" , "JWH" ,
+"JWI" , "JWJ" , "JWK" , "JWL" , "JWM" , "JWN" , "JWO" , "JWP" ,
+"JWQ" , "JWR" , "JWS" , "JWT" , "JWU" , "JWV" , "JWW" , "JWX" ,
+"JWY" , "JWZ" , "JW0" , "JW1" , "JW2" , "JW3" , "JW4" , "JW5" ,
+"JW6" , "JW7" , "JW8" , "JW9" , "JXA" , "JXB" , "JXC" , "JXD" ,
+"JXE" , "JXF" , "JXG" , "JXH" , "JXI" , "JXJ" , "JXK" , "JXL" ,
+"JXM" , "JXN" , "JXO" , "JXP" , "JXQ" , "JXR" , "JXS" , "JXT" ,
+"JXU" , "JXV" , "JXW" , "JXX" , "JXY" , "JXZ" , "JX0" , "JX1" ,
+"JX2" , "JX3" , "JX4" , "JX5" , "JX6" , "JX7" , "JX8" , "JX9" ,
+"JYA" , "JYB" , "JYC" , "JYD" , "JYE" , "JYF" , "JYG" , "JYH" ,
+"JYI" , "JYJ" , "JYK" , "JYL" , "JYM" , "JYN" , "JYO" , "JYP" ,
+"JYQ" , "JYR" , "JYS" , "JYT" , "JYU" , "JYV" , "JYW" , "JYX" ,
+"JYY" , "JYZ" , "JY0" , "JY1" , "JY2" , "JY3" , "JY4" , "JY5" ,
+"JY6" , "JY7" , "JY8" , "JY9" , "JZA" , "JZB" , "JZC" , "JZD" ,
+"JZE" , "JZF" , "JZG" , "JZH" , "JZI" , "JZJ" , "JZK" , "JZL" ,
+"JZM" , "JZN" , "JZO" , "JZP" , "JZQ" , "JZR" , "JZS" , "JZT" ,
+"JZU" , "JZV" , "JZW" , "JZX" , "JZY" , "JZZ" , "JZ0" , "JZ1" ,
+"JZ2" , "JZ3" , "JZ4" , "JZ5" , "JZ6" , "JZ7" , "JZ8" , "JZ9" ,
+"J0A" , "J0B" , "J0C" , "J0D" , "J0E" , "J0F" , "J0G" , "J0H" ,
+"J0I" , "J0J" , "J0K" , "J0L" , "J0M" , "J0N" , "J0O" , "J0P" ,
+"J0Q" , "J0R" , "J0S" , "J0T" , "J0U" , "J0V" , "J0W" , "J0X" ,
+"J0Y" , "J0Z" , "J00" , "J01" , "J02" , "J03" , "J04" , "J05" ,
+"J06" , "J07" , "J08" , "J09" , "J1A" , "J1B" , "J1C" , "J1D" ,
+"J1E" , "J1F" , "J1G" , "J1H" , "J1I" , "J1J" , "J1K" , "J1L" ,
+"J1M" , "J1N" , "J1O" , "J1P" , "J1Q" , "J1R" , "J1S" , "J1T" ,
+"J1U" , "J1V" , "J1W" , "J1X" , "J1Y" , "J1Z" , "J10" , "J11" ,
+"J12" , "J13" , "J14" , "J15" , "J16" , "J17" , "J18" , "J19" ,
+"J2A" , "J2B" , "J2C" , "J2D" , "J2E" , "J2F" , "J2G" , "J2H" ,
+"J2I" , "J2J" , "J2K" , "J2L" , "J2M" , "J2N" , "J2O" , "J2P" ,
+"J2Q" , "J2R" , "J2S" , "J2T" , "J2U" , "J2V" , "J2W" , "J2X" ,
+"J2Y" , "J2Z" , "J20" , "J21" , "J22" , "J23" , "J24" , "J25" ,
+"J26" , "J27" , "J28" , "J29" , "J3A" , "J3B" , "J3C" , "J3D" ,
+"J3E" , "J3F" , "J3G" , "J3H" , "J3I" , "J3J" , "J3K" , "J3L" ,
+"J3M" , "J3N" , "J3O" , "J3P" , "J3Q" , "J3R" , "J3S" , "J3T" ,
+"J3U" , "J3V" , "J3W" , "J3X" , "J3Y" , "J3Z" , "J30" , "J31" ,
+"J32" , "J33" , "J34" , "J35" , "J36" , "J37" , "J38" , "J39" ,
+"J4A" , "J4B" , "J4C" , "J4D" , "J4E" , "J4F" , "J4G" , "J4H" ,
+"J4I" , "J4J" , "J4K" , "J4L" , "J4M" , "J4N" , "J4O" , "J4P" ,
+"J4Q" , "J4R" , "J4S" , "J4T" , "J4U" , "J4V" , "J4W" , "J4X" ,
+"J4Y" , "J4Z" , "J40" , "J41" , "J42" , "J43" , "J44" , "J45" ,
+"J46" , "J47" , "J48" , "J49" , "J5A" , "J5B" , "J5C" , "J5D" ,
+"J5E" , "J5F" , "J5G" , "J5H" , "J5I" , "J5J" , "J5K" , "J5L" ,
+"J5M" , "J5N" , "J5O" , "J5P" , "J5Q" , "J5R" , "J5S" , "J5T" ,
+"J5U" , "J5V" , "J5W" , "J5X" , "J5Y" , "J5Z" , "J50" , "J51" ,
+"J52" , "J53" , "J54" , "J55" , "J56" , "J57" , "J58" , "J59" ,
+"J6A" , "J6B" , "J6C" , "J6D" , "J6E" , "J6F" , "J6G" , "J6H" ,
+"J6I" , "J6J" , "J6K" , "J6L" , "J6M" , "J6N" , "J6O" , "J6P" ,
+"J6Q" , "J6R" , "J6S" , "J6T" , "J6U" , "J6V" , "J6W" , "J6X" ,
+"J6Y" , "J6Z" , "J60" , "J61" , "J62" , "J63" , "J64" , "J65" ,
+"J66" , "J67" , "J68" , "J69" , "J7A" , "J7B" , "J7C" , "J7D" ,
+"J7E" , "J7F" , "J7G" , "J7H" , "J7I" , "J7J" , "J7K" , "J7L" ,
+"J7M" , "J7N" , "J7O" , "J7P" , "J7Q" , "J7R" , "J7S" , "J7T" ,
+"J7U" , "J7V" , "J7W" , "J7X" , "J7Y" , "J7Z" , "J70" , "J71" ,
+"J72" , "J73" , "J74" , "J75" , "J76" , "J77" , "J78" , "J79" ,
+"J8A" , "J8B" , "J8C" , "J8D" , "J8E" , "J8F" , "J8G" , "J8H" ,
+"J8I" , "J8J" , "J8K" , "J8L" , "J8M" , "J8N" , "J8O" , "J8P" ,
+"J8Q" , "J8R" , "J8S" , "J8T" , "J8U" , "J8V" , "J8W" , "J8X" ,
+"J8Y" , "J8Z" , "J80" , "J81" , "J82" , "J83" , "J84" , "J85" ,
+"J86" , "J87" , "J88" , "J89" , "J9A" , "J9B" , "J9C" , "J9D" ,
+"J9E" , "J9F" , "J9G" , "J9H" , "J9I" , "J9J" , "J9K" , "J9L" ,
+"J9M" , "J9N" , "J9O" , "J9P" , "J9Q" , "J9R" , "J9S" , "J9T" ,
+"J9U" , "J9V" , "J9W" , "J9X" , "J9Y" , "J9Z" , "J90" , "J91" ,
+"J92" , "J93" , "J94" , "J95" , "J96" , "J97" , "J98" , "J99" ,
+"KAA" , "KAB" , "KAC" , "KAD" , "KAE" , "KAF" , "KAG" , "KAH" ,
+"KAI" , "KAJ" , "KAK" , "KAL" , "KAM" , "KAN" , "KAO" , "KAP" ,
+"KAQ" , "KAR" , "KAS" , "KAT" , "KAU" , "KAV" , "KAW" , "KAX" ,
+"KAY" , "KAZ" , "KA0" , "KA1" , "KA2" , "KA3" , "KA4" , "KA5" ,
+"KA6" , "KA7" , "KA8" , "KA9" , "KBA" , "KBB" , "KBC" , "KBD" ,
+"KBE" , "KBF" , "KBG" , "KBH" , "KBI" , "KBJ" , "KBK" , "KBL" ,
+"KBM" , "KBN" , "KBO" , "KBP" , "KBQ" , "KBR" , "KBS" , "KBT" ,
+"KBU" , "KBV" , "KBW" , "KBX" , "KBY" , "KBZ" , "KB0" , "KB1" ,
+"KB2" , "KB3" , "KB4" , "KB5" , "KB6" , "KB7" , "KB8" , "KB9" ,
+"KCA" , "KCB" , "KCC" , "KCD" , "KCE" , "KCF" , "KCG" , "KCH" ,
+"KCI" , "KCJ" , "KCK" , "KCL" , "KCM" , "KCN" , "KCO" , "KCP" ,
+"KCQ" , "KCR" , "KCS" , "KCT" , "KCU" , "KCV" , "KCW" , "KCX" ,
+"KCY" , "KCZ" , "KC0" , "KC1" , "KC2" , "KC3" , "KC4" , "KC5" ,
+"KC6" , "KC7" , "KC8" , "KC9" , "KDA" , "KDB" , "KDC" , "KDD" ,
+"KDE" , "KDF" , "KDG" , "KDH" , "KDI" , "KDJ" , "KDK" , "KDL" ,
+"KDM" , "KDN" , "KDO" , "KDP" , "KDQ" , "KDR" , "KDS" , "KDT" ,
+"KDU" , "KDV" , "KDW" , "KDX" , "KDY" , "KDZ" , "KD0" , "KD1" ,
+"KD2" , "KD3" , "KD4" , "KD5" , "KD6" , "KD7" , "KD8" , "KD9" ,
+"KEA" , "KEB" , "KEC" , "KED" , "KEE" , "KEF" , "KEG" , "KEH" ,
+"KEI" , "KEJ" , "KEK" , "KEL" , "KEM" , "KEN" , "KEO" , "KEP" ,
+"KEQ" , "KER" , "KES" , "KET" , "KEU" , "KEV" , "KEW" , "KEX" ,
+"KEY" , "KEZ" , "KE0" , "KE1" , "KE2" , "KE3" , "KE4" , "KE5" ,
+"KE6" , "KE7" , "KE8" , "KE9" , "KFA" , "KFB" , "KFC" , "KFD" ,
+"KFE" , "KFF" , "KFG" , "KFH" , "KFI" , "KFJ" , "KFK" , "KFL" ,
+"KFM" , "KFN" , "KFO" , "KFP" , "KFQ" , "KFR" , "KFS" , "KFT" ,
+"KFU" , "KFV" , "KFW" , "KFX" , "KFY" , "KFZ" , "KF0" , "KF1" ,
+"KF2" , "KF3" , "KF4" , "KF5" , "KF6" , "KF7" , "KF8" , "KF9" ,
+"KGA" , "KGB" , "KGC" , "KGD" , "KGE" , "KGF" , "KGG" , "KGH" ,
+"KGI" , "KGJ" , "KGK" , "KGL" , "KGM" , "KGN" , "KGO" , "KGP" ,
+"KGQ" , "KGR" , "KGS" , "KGT" , "KGU" , "KGV" , "KGW" , "KGX" ,
+"KGY" , "KGZ" , "KG0" , "KG1" , "KG2" , "KG3" , "KG4" , "KG5" ,
+"KG6" , "KG7" , "KG8" , "KG9" , "KHA" , "KHB" , "KHC" , "KHD" ,
+"KHE" , "KHF" , "KHG" , "KHH" , "KHI" , "KHJ" , "KHK" , "KHL" ,
+"KHM" , "KHN" , "KHO" , "KHP" , "KHQ" , "KHR" , "KHS" , "KHT" ,
+"KHU" , "KHV" , "KHW" , "KHX" , "KHY" , "KHZ" , "KH0" , "KH1" ,
+"KH2" , "KH3" , "KH4" , "KH5" , "KH6" , "KH7" , "KH8" , "KH9" ,
+"KIA" , "KIB" , "KIC" , "KID" , "KIE" , "KIF" , "KIG" , "KIH" ,
+"KII" , "KIJ" , "KIK" , "KIL" , "KIM" , "KIN" , "KIO" , "KIP" ,
+"KIQ" , "KIR" , "KIS" , "KIT" , "KIU" , "KIV" , "KIW" , "KIX" ,
+"KIY" , "KIZ" , "KI0" , "KI1" , "KI2" , "KI3" , "KI4" , "KI5" ,
+"KI6" , "KI7" , "KI8" , "KI9" , "KJA" , "KJB" , "KJC" , "KJD" ,
+"KJE" , "KJF" , "KJG" , "KJH" , "KJI" , "KJJ" , "KJK" , "KJL" ,
+"KJM" , "KJN" , "KJO" , "KJP" , "KJQ" , "KJR" , "KJS" , "KJT" ,
+"KJU" , "KJV" , "KJW" , "KJX" , "KJY" , "KJZ" , "KJ0" , "KJ1" ,
+"KJ2" , "KJ3" , "KJ4" , "KJ5" , "KJ6" , "KJ7" , "KJ8" , "KJ9" ,
+"KKA" , "KKB" , "KKC" , "KKD" , "KKE" , "KKF" , "KKG" , "KKH" ,
+"KKI" , "KKJ" , "KKK" , "KKL" , "KKM" , "KKN" , "KKO" , "KKP" ,
+"KKQ" , "KKR" , "KKS" , "KKT" , "KKU" , "KKV" , "KKW" , "KKX" ,
+"KKY" , "KKZ" , "KK0" , "KK1" , "KK2" , "KK3" , "KK4" , "KK5" ,
+"KK6" , "KK7" , "KK8" , "KK9" , "KLA" , "KLB" , "KLC" , "KLD" ,
+"KLE" , "KLF" , "KLG" , "KLH" , "KLI" , "KLJ" , "KLK" , "KLL" ,
+"KLM" , "KLN" , "KLO" , "KLP" , "KLQ" , "KLR" , "KLS" , "KLT" ,
+"KLU" , "KLV" , "KLW" , "KLX" , "KLY" , "KLZ" , "KL0" , "KL1" ,
+"KL2" , "KL3" , "KL4" , "KL5" , "KL6" , "KL7" , "KL8" , "KL9" ,
+"KMA" , "KMB" , "KMC" , "KMD" , "KME" , "KMF" , "KMG" , "KMH" ,
+"KMI" , "KMJ" , "KMK" , "KML" , "KMM" , "KMN" , "KMO" , "KMP" ,
+"KMQ" , "KMR" , "KMS" , "KMT" , "KMU" , "KMV" , "KMW" , "KMX" ,
+"KMY" , "KMZ" , "KM0" , "KM1" , "KM2" , "KM3" , "KM4" , "KM5" ,
+"KM6" , "KM7" , "KM8" , "KM9" , "KNA" , "KNB" , "KNC" , "KND" ,
+"KNE" , "KNF" , "KNG" , "KNH" , "KNI" , "KNJ" , "KNK" , "KNL" ,
+"KNM" , "KNN" , "KNO" , "KNP" , "KNQ" , "KNR" , "KNS" , "KNT" ,
+"KNU" , "KNV" , "KNW" , "KNX" , "KNY" , "KNZ" , "KN0" , "KN1" ,
+"KN2" , "KN3" , "KN4" , "KN5" , "KN6" , "KN7" , "KN8" , "KN9" ,
+"KOA" , "KOB" , "KOC" , "KOD" , "KOE" , "KOF" , "KOG" , "KOH" ,
+"KOI" , "KOJ" , "KOK" , "KOL" , "KOM" , "KON" , "KOO" , "KOP" ,
+"KOQ" , "KOR" , "KOS" , "KOT" , "KOU" , "KOV" , "KOW" , "KOX" ,
+"KOY" , "KOZ" , "KO0" , "KO1" , "KO2" , "KO3" , "KO4" , "KO5" ,
+"KO6" , "KO7" , "KO8" , "KO9" , "KPA" , "KPB" , "KPC" , "KPD" ,
+"KPE" , "KPF" , "KPG" , "KPH" , "KPI" , "KPJ" , "KPK" , "KPL" ,
+"KPM" , "KPN" , "KPO" , "KPP" , "KPQ" , "KPR" , "KPS" , "KPT" ,
+"KPU" , "KPV" , "KPW" , "KPX" , "KPY" , "KPZ" , "KP0" , "KP1" ,
+"KP2" , "KP3" , "KP4" , "KP5" , "KP6" , "KP7" , "KP8" , "KP9" ,
+"KQA" , "KQB" , "KQC" , "KQD" , "KQE" , "KQF" , "KQG" , "KQH" ,
+"KQI" , "KQJ" , "KQK" , "KQL" , "KQM" , "KQN" , "KQO" , "KQP" ,
+"KQQ" , "KQR" , "KQS" , "KQT" , "KQU" , "KQV" , "KQW" , "KQX" ,
+"KQY" , "KQZ" , "KQ0" , "KQ1" , "KQ2" , "KQ3" , "KQ4" , "KQ5" ,
+"KQ6" , "KQ7" , "KQ8" , "KQ9" , "KRA" , "KRB" , "KRC" , "KRD" ,
+"KRE" , "KRF" , "KRG" , "KRH" , "KRI" , "KRJ" , "KRK" , "KRL" ,
+"KRM" , "KRN" , "KRO" , "KRP" , "KRQ" , "KRR" , "KRS" , "KRT" ,
+"KRU" , "KRV" , "KRW" , "KRX" , "KRY" , "KRZ" , "KR0" , "KR1" ,
+"KR2" , "KR3" , "KR4" , "KR5" , "KR6" , "KR7" , "KR8" , "KR9" ,
+"KSA" , "KSB" , "KSC" , "KSD" , "KSE" , "KSF" , "KSG" , "KSH" ,
+"KSI" , "KSJ" , "KSK" , "KSL" , "KSM" , "KSN" , "KSO" , "KSP" ,
+"KSQ" , "KSR" , "KSS" , "KST" , "KSU" , "KSV" , "KSW" , "KSX" ,
+"KSY" , "KSZ" , "KS0" , "KS1" , "KS2" , "KS3" , "KS4" , "KS5" ,
+"KS6" , "KS7" , "KS8" , "KS9" , "KTA" , "KTB" , "KTC" , "KTD" ,
+"KTE" , "KTF" , "KTG" , "KTH" , "KTI" , "KTJ" , "KTK" , "KTL" ,
+"KTM" , "KTN" , "KTO" , "KTP" , "KTQ" , "KTR" , "KTS" , "KTT" ,
+"KTU" , "KTV" , "KTW" , "KTX" , "KTY" , "KTZ" , "KT0" , "KT1" ,
+"KT2" , "KT3" , "KT4" , "KT5" , "KT6" , "KT7" , "KT8" , "KT9" ,
+"KUA" , "KUB" , "KUC" , "KUD" , "KUE" , "KUF" , "KUG" , "KUH" ,
+"KUI" , "KUJ" , "KUK" , "KUL" , "KUM" , "KUN" , "KUO" , "KUP" ,
+"KUQ" , "KUR" , "KUS" , "KUT" , "KUU" , "KUV" , "KUW" , "KUX" ,
+"KUY" , "KUZ" , "KU0" , "KU1" , "KU2" , "KU3" , "KU4" , "KU5" ,
+"KU6" , "KU7" , "KU8" , "KU9" , "KVA" , "KVB" , "KVC" , "KVD" ,
+"KVE" , "KVF" , "KVG" , "KVH" , "KVI" , "KVJ" , "KVK" , "KVL" ,
+"KVM" , "KVN" , "KVO" , "KVP" , "KVQ" , "KVR" , "KVS" , "KVT" ,
+"KVU" , "KVV" , "KVW" , "KVX" , "KVY" , "KVZ" , "KV0" , "KV1" ,
+"KV2" , "KV3" , "KV4" , "KV5" , "KV6" , "KV7" , "KV8" , "KV9" ,
+"KWA" , "KWB" , "KWC" , "KWD" , "KWE" , "KWF" , "KWG" , "KWH" ,
+"KWI" , "KWJ" , "KWK" , "KWL" , "KWM" , "KWN" , "KWO" , "KWP" ,
+"KWQ" , "KWR" , "KWS" , "KWT" , "KWU" , "KWV" , "KWW" , "KWX" ,
+"KWY" , "KWZ" , "KW0" , "KW1" , "KW2" , "KW3" , "KW4" , "KW5" ,
+"KW6" , "KW7" , "KW8" , "KW9" , "KXA" , "KXB" , "KXC" , "KXD" ,
+"KXE" , "KXF" , "KXG" , "KXH" , "KXI" , "KXJ" , "KXK" , "KXL" ,
+"KXM" , "KXN" , "KXO" , "KXP" , "KXQ" , "KXR" , "KXS" , "KXT" ,
+"KXU" , "KXV" , "KXW" , "KXX" , "KXY" , "KXZ" , "KX0" , "KX1" ,
+"KX2" , "KX3" , "KX4" , "KX5" , "KX6" , "KX7" , "KX8" , "KX9" ,
+"KYA" , "KYB" , "KYC" , "KYD" , "KYE" , "KYF" , "KYG" , "KYH" ,
+"KYI" , "KYJ" , "KYK" , "KYL" , "KYM" , "KYN" , "KYO" , "KYP" ,
+"KYQ" , "KYR" , "KYS" , "KYT" , "KYU" , "KYV" , "KYW" , "KYX" ,
+"KYY" , "KYZ" , "KY0" , "KY1" , "KY2" , "KY3" , "KY4" , "KY5" ,
+"KY6" , "KY7" , "KY8" , "KY9" , "KZA" , "KZB" , "KZC" , "KZD" ,
+"KZE" , "KZF" , "KZG" , "KZH" , "KZI" , "KZJ" , "KZK" , "KZL" ,
+"KZM" , "KZN" , "KZO" , "KZP" , "KZQ" , "KZR" , "KZS" , "KZT" ,
+"KZU" , "KZV" , "KZW" , "KZX" , "KZY" , "KZZ" , "KZ0" , "KZ1" ,
+"KZ2" , "KZ3" , "KZ4" , "KZ5" , "KZ6" , "KZ7" , "KZ8" , "KZ9" ,
+"K0A" , "K0B" , "K0C" , "K0D" , "K0E" , "K0F" , "K0G" , "K0H" ,
+"K0I" , "K0J" , "K0K" , "K0L" , "K0M" , "K0N" , "K0O" , "K0P" ,
+"K0Q" , "K0R" , "K0S" , "K0T" , "K0U" , "K0V" , "K0W" , "K0X" ,
+"K0Y" , "K0Z" , "K00" , "K01" , "K02" , "K03" , "K04" , "K05" ,
+"K06" , "K07" , "K08" , "K09" , "K1A" , "K1B" , "K1C" , "K1D" ,
+"K1E" , "K1F" , "K1G" , "K1H" , "K1I" , "K1J" , "K1K" , "K1L" ,
+"K1M" , "K1N" , "K1O" , "K1P" , "K1Q" , "K1R" , "K1S" , "K1T" ,
+"K1U" , "K1V" , "K1W" , "K1X" , "K1Y" , "K1Z" , "K10" , "K11" ,
+"K12" , "K13" , "K14" , "K15" , "K16" , "K17" , "K18" , "K19" ,
+"K2A" , "K2B" , "K2C" , "K2D" , "K2E" , "K2F" , "K2G" , "K2H" ,
+"K2I" , "K2J" , "K2K" , "K2L" , "K2M" , "K2N" , "K2O" , "K2P" ,
+"K2Q" , "K2R" , "K2S" , "K2T" , "K2U" , "K2V" , "K2W" , "K2X" ,
+"K2Y" , "K2Z" , "K20" , "K21" , "K22" , "K23" , "K24" , "K25" ,
+"K26" , "K27" , "K28" , "K29" , "K3A" , "K3B" , "K3C" , "K3D" ,
+"K3E" , "K3F" , "K3G" , "K3H" , "K3I" , "K3J" , "K3K" , "K3L" ,
+"K3M" , "K3N" , "K3O" , "K3P" , "K3Q" , "K3R" , "K3S" , "K3T" ,
+"K3U" , "K3V" , "K3W" , "K3X" , "K3Y" , "K3Z" , "K30" , "K31" ,
+"K32" , "K33" , "K34" , "K35" , "K36" , "K37" , "K38" , "K39" ,
+"K4A" , "K4B" , "K4C" , "K4D" , "K4E" , "K4F" , "K4G" , "K4H" ,
+"K4I" , "K4J" , "K4K" , "K4L" , "K4M" , "K4N" , "K4O" , "K4P" ,
+"K4Q" , "K4R" , "K4S" , "K4T" , "K4U" , "K4V" , "K4W" , "K4X" ,
+"K4Y" , "K4Z" , "K40" , "K41" , "K42" , "K43" , "K44" , "K45" ,
+"K46" , "K47" , "K48" , "K49" , "K5A" , "K5B" , "K5C" , "K5D" ,
+"K5E" , "K5F" , "K5G" , "K5H" , "K5I" , "K5J" , "K5K" , "K5L" ,
+"K5M" , "K5N" , "K5O" , "K5P" , "K5Q" , "K5R" , "K5S" , "K5T" ,
+"K5U" , "K5V" , "K5W" , "K5X" , "K5Y" , "K5Z" , "K50" , "K51" ,
+"K52" , "K53" , "K54" , "K55" , "K56" , "K57" , "K58" , "K59" ,
+"K6A" , "K6B" , "K6C" , "K6D" , "K6E" , "K6F" , "K6G" , "K6H" ,
+"K6I" , "K6J" , "K6K" , "K6L" , "K6M" , "K6N" , "K6O" , "K6P" ,
+"K6Q" , "K6R" , "K6S" , "K6T" , "K6U" , "K6V" , "K6W" , "K6X" ,
+"K6Y" , "K6Z" , "K60" , "K61" , "K62" , "K63" , "K64" , "K65" ,
+"K66" , "K67" , "K68" , "K69" , "K7A" , "K7B" , "K7C" , "K7D" ,
+"K7E" , "K7F" , "K7G" , "K7H" , "K7I" , "K7J" , "K7K" , "K7L" ,
+"K7M" , "K7N" , "K7O" , "K7P" , "K7Q" , "K7R" , "K7S" , "K7T" ,
+"K7U" , "K7V" , "K7W" , "K7X" , "K7Y" , "K7Z" , "K70" , "K71" ,
+"K72" , "K73" , "K74" , "K75" , "K76" , "K77" , "K78" , "K79" ,
+"K8A" , "K8B" , "K8C" , "K8D" , "K8E" , "K8F" , "K8G" , "K8H" ,
+"K8I" , "K8J" , "K8K" , "K8L" , "K8M" , "K8N" , "K8O" , "K8P" ,
+"K8Q" , "K8R" , "K8S" , "K8T" , "K8U" , "K8V" , "K8W" , "K8X" ,
+"K8Y" , "K8Z" , "K80" , "K81" , "K82" , "K83" , "K84" , "K85" ,
+"K86" , "K87" , "K88" , "K89" , "K9A" , "K9B" , "K9C" , "K9D" ,
+"K9E" , "K9F" , "K9G" , "K9H" , "K9I" , "K9J" , "K9K" , "K9L" ,
+"K9M" , "K9N" , "K9O" , "K9P" , "K9Q" , "K9R" , "K9S" , "K9T" ,
+"K9U" , "K9V" , "K9W" , "K9X" , "K9Y" , "K9Z" , "K90" , "K91" ,
+"K92" , "K93" , "K94" , "K95" , "K96" , "K97" , "K98" , "K99" ,
+"LAA" , "LAB" , "LAC" , "LAD" , "LAE" , "LAF" , "LAG" , "LAH" ,
+"LAI" , "LAJ" , "LAK" , "LAL" , "LAM" , "LAN" , "LAO" , "LAP" ,
+"LAQ" , "LAR" , "LAS" , "LAT" , "LAU" , "LAV" , "LAW" , "LAX" ,
+"LAY" , "LAZ" , "LA0" , "LA1" , "LA2" , "LA3" , "LA4" , "LA5" ,
+"LA6" , "LA7" , "LA8" , "LA9" , "LBA" , "LBB" , "LBC" , "LBD" ,
+"LBE" , "LBF" , "LBG" , "LBH" , "LBI" , "LBJ" , "LBK" , "LBL" ,
+"LBM" , "LBN" , "LBO" , "LBP" , "LBQ" , "LBR" , "LBS" , "LBT" ,
+"LBU" , "LBV" , "LBW" , "LBX" , "LBY" , "LBZ" , "LB0" , "LB1" ,
+"LB2" , "LB3" , "LB4" , "LB5" , "LB6" , "LB7" , "LB8" , "LB9" ,
+"LCA" , "LCB" , "LCC" , "LCD" , "LCE" , "LCF" , "LCG" , "LCH" ,
+"LCI" , "LCJ" , "LCK" , "LCL" , "LCM" , "LCN" , "LCO" , "LCP" ,
+"LCQ" , "LCR" , "LCS" , "LCT" , "LCU" , "LCV" , "LCW" , "LCX" ,
+"LCY" , "LCZ" , "LC0" , "LC1" , "LC2" , "LC3" , "LC4" , "LC5" ,
+"LC6" , "LC7" , "LC8" , "LC9" , "LDA" , "LDB" , "LDC" , "LDD" ,
+"LDE" , "LDF" , "LDG" , "LDH" , "LDI" , "LDJ" , "LDK" , "LDL" ,
+"LDM" , "LDN" , "LDO" , "LDP" , "LDQ" , "LDR" , "LDS" , "LDT" ,
+"LDU" , "LDV" , "LDW" , "LDX" , "LDY" , "LDZ" , "LD0" , "LD1" ,
+"LD2" , "LD3" , "LD4" , "LD5" , "LD6" , "LD7" , "LD8" , "LD9" ,
+"LEA" , "LEB" , "LEC" , "LED" , "LEE" , "LEF" , "LEG" , "LEH" ,
+"LEI" , "LEJ" , "LEK" , "LEL" , "LEM" , "LEN" , "LEO" , "LEP" ,
+"LEQ" , "LER" , "LES" , "LET" , "LEU" , "LEV" , "LEW" , "LEX" ,
+"LEY" , "LEZ" , "LE0" , "LE1" , "LE2" , "LE3" , "LE4" , "LE5" ,
+"LE6" , "LE7" , "LE8" , "LE9" , "LFA" , "LFB" , "LFC" , "LFD" ,
+"LFE" , "LFF" , "LFG" , "LFH" , "LFI" , "LFJ" , "LFK" , "LFL" ,
+"LFM" , "LFN" , "LFO" , "LFP" , "LFQ" , "LFR" , "LFS" , "LFT" ,
+"LFU" , "LFV" , "LFW" , "LFX" , "LFY" , "LFZ" , "LF0" , "LF1" ,
+"LF2" , "LF3" , "LF4" , "LF5" , "LF6" , "LF7" , "LF8" , "LF9" ,
+"LGA" , "LGB" , "LGC" , "LGD" , "LGE" , "LGF" , "LGG" , "LGH" ,
+"LGI" , "LGJ" , "LGK" , "LGL" , "LGM" , "LGN" , "LGO" , "LGP" ,
+"LGQ" , "LGR" , "LGS" , "LGT" , "LGU" , "LGV" , "LGW" , "LGX" ,
+"LGY" , "LGZ" , "LG0" , "LG1" , "LG2" , "LG3" , "LG4" , "LG5" ,
+"LG6" , "LG7" , "LG8" , "LG9" , "LHA" , "LHB" , "LHC" , "LHD" ,
+"LHE" , "LHF" , "LHG" , "LHH" , "LHI" , "LHJ" , "LHK" , "LHL" ,
+"LHM" , "LHN" , "LHO" , "LHP" , "LHQ" , "LHR" , "LHS" , "LHT" ,
+"LHU" , "LHV" , "LHW" , "LHX" , "LHY" , "LHZ" , "LH0" , "LH1" ,
+"LH2" , "LH3" , "LH4" , "LH5" , "LH6" , "LH7" , "LH8" , "LH9" ,
+"LIA" , "LIB" , "LIC" , "LID" , "LIE" , "LIF" , "LIG" , "LIH" ,
+"LII" , "LIJ" , "LIK" , "LIL" , "LIM" , "LIN" , "LIO" , "LIP" ,
+"LIQ" , "LIR" , "LIS" , "LIT" , "LIU" , "LIV" , "LIW" , "LIX" ,
+"LIY" , "LIZ" , "LI0" , "LI1" , "LI2" , "LI3" , "LI4" , "LI5" ,
+"LI6" , "LI7" , "LI8" , "LI9" , "LJA" , "LJB" , "LJC" , "LJD" ,
+"LJE" , "LJF" , "LJG" , "LJH" , "LJI" , "LJJ" , "LJK" , "LJL" ,
+"LJM" , "LJN" , "LJO" , "LJP" , "LJQ" , "LJR" , "LJS" , "LJT" ,
+"LJU" , "LJV" , "LJW" , "LJX" , "LJY" , "LJZ" , "LJ0" , "LJ1" ,
+"LJ2" , "LJ3" , "LJ4" , "LJ5" , "LJ6" , "LJ7" , "LJ8" , "LJ9" ,
+"LKA" , "LKB" , "LKC" , "LKD" , "LKE" , "LKF" , "LKG" , "LKH" ,
+"LKI" , "LKJ" , "LKK" , "LKL" , "LKM" , "LKN" , "LKO" , "LKP" ,
+"LKQ" , "LKR" , "LKS" , "LKT" , "LKU" , "LKV" , "LKW" , "LKX" ,
+"LKY" , "LKZ" , "LK0" , "LK1" , "LK2" , "LK3" , "LK4" , "LK5" ,
+"LK6" , "LK7" , "LK8" , "LK9" , "LLA" , "LLB" , "LLC" , "LLD" ,
+"LLE" , "LLF" , "LLG" , "LLH" , "LLI" , "LLJ" , "LLK" , "LLL" ,
+"LLM" , "LLN" , "LLO" , "LLP" , "LLQ" , "LLR" , "LLS" , "LLT" ,
+"LLU" , "LLV" , "LLW" , "LLX" , "LLY" , "LLZ" , "LL0" , "LL1" ,
+"LL2" , "LL3" , "LL4" , "LL5" , "LL6" , "LL7" , "LL8" , "LL9" ,
+"LMA" , "LMB" , "LMC" , "LMD" , "LME" , "LMF" , "LMG" , "LMH" ,
+"LMI" , "LMJ" , "LMK" , "LML" , "LMM" , "LMN" , "LMO" , "LMP" ,
+"LMQ" , "LMR" , "LMS" , "LMT" , "LMU" , "LMV" , "LMW" , "LMX" ,
+"LMY" , "LMZ" , "LM0" , "LM1" , "LM2" , "LM3" , "LM4" , "LM5" ,
+"LM6" , "LM7" , "LM8" , "LM9" , "LNA" , "LNB" , "LNC" , "LND" ,
+"LNE" , "LNF" , "LNG" , "LNH" , "LNI" , "LNJ" , "LNK" , "LNL" ,
+"LNM" , "LNN" , "LNO" , "LNP" , "LNQ" , "LNR" , "LNS" , "LNT" ,
+"LNU" , "LNV" , "LNW" , "LNX" , "LNY" , "LNZ" , "LN0" , "LN1" ,
+"LN2" , "LN3" , "LN4" , "LN5" , "LN6" , "LN7" , "LN8" , "LN9" ,
+"LOA" , "LOB" , "LOC" , "LOD" , "LOE" , "LOF" , "LOG" , "LOH" ,
+"LOI" , "LOJ" , "LOK" , "LOL" , "LOM" , "LON" , "LOO" , "LOP" ,
+"LOQ" , "LOR" , "LOS" , "LOT" , "LOU" , "LOV" , "LOW" , "LOX" ,
+"LOY" , "LOZ" , "LO0" , "LO1" , "LO2" , "LO3" , "LO4" , "LO5" ,
+"LO6" , "LO7" , "LO8" , "LO9" , "LPA" , "LPB" , "LPC" , "LPD" ,
+"LPE" , "LPF" , "LPG" , "LPH" , "LPI" , "LPJ" , "LPK" , "LPL" ,
+"LPM" , "LPN" , "LPO" , "LPP" , "LPQ" , "LPR" , "LPS" , "LPT" ,
+"LPU" , "LPV" , "LPW" , "LPX" , "LPY" , "LPZ" , "LP0" , "LP1" ,
+"LP2" , "LP3" , "LP4" , "LP5" , "LP6" , "LP7" , "LP8" , "LP9" ,
+"LQA" , "LQB" , "LQC" , "LQD" , "LQE" , "LQF" , "LQG" , "LQH" ,
+"LQI" , "LQJ" , "LQK" , "LQL" , "LQM" , "LQN" , "LQO" , "LQP" ,
+"LQQ" , "LQR" , "LQS" , "LQT" , "LQU" , "LQV" , "LQW" , "LQX" ,
+"LQY" , "LQZ" , "LQ0" , "LQ1" , "LQ2" , "LQ3" , "LQ4" , "LQ5" ,
+"LQ6" , "LQ7" , "LQ8" , "LQ9" , "LRA" , "LRB" , "LRC" , "LRD" ,
+"LRE" , "LRF" , "LRG" , "LRH" , "LRI" , "LRJ" , "LRK" , "LRL" ,
+"LRM" , "LRN" , "LRO" , "LRP" , "LRQ" , "LRR" , "LRS" , "LRT" ,
+"LRU" , "LRV" , "LRW" , "LRX" , "LRY" , "LRZ" , "LR0" , "LR1" ,
+"LR2" , "LR3" , "LR4" , "LR5" , "LR6" , "LR7" , "LR8" , "LR9" ,
+"LSA" , "LSB" , "LSC" , "LSD" , "LSE" , "LSF" , "LSG" , "LSH" ,
+"LSI" , "LSJ" , "LSK" , "LSL" , "LSM" , "LSN" , "LSO" , "LSP" ,
+"LSQ" , "LSR" , "LSS" , "LST" , "LSU" , "LSV" , "LSW" , "LSX" ,
+"LSY" , "LSZ" , "LS0" , "LS1" , "LS2" , "LS3" , "LS4" , "LS5" ,
+"LS6" , "LS7" , "LS8" , "LS9" , "LTA" , "LTB" , "LTC" , "LTD" ,
+"LTE" , "LTF" , "LTG" , "LTH" , "LTI" , "LTJ" , "LTK" , "LTL" ,
+"LTM" , "LTN" , "LTO" , "LTP" , "LTQ" , "LTR" , "LTS" , "LTT" ,
+"LTU" , "LTV" , "LTW" , "LTX" , "LTY" , "LTZ" , "LT0" , "LT1" ,
+"LT2" , "LT3" , "LT4" , "LT5" , "LT6" , "LT7" , "LT8" , "LT9" ,
+"LUA" , "LUB" , "LUC" , "LUD" , "LUE" , "LUF" , "LUG" , "LUH" ,
+"LUI" , "LUJ" , "LUK" , "LUL" , "LUM" , "LUN" , "LUO" , "LUP" ,
+"LUQ" , "LUR" , "LUS" , "LUT" , "LUU" , "LUV" , "LUW" , "LUX" ,
+"LUY" , "LUZ" , "LU0" , "LU1" , "LU2" , "LU3" , "LU4" , "LU5" ,
+"LU6" , "LU7" , "LU8" , "LU9" , "LVA" , "LVB" , "LVC" , "LVD" ,
+"LVE" , "LVF" , "LVG" , "LVH" , "LVI" , "LVJ" , "LVK" , "LVL" ,
+"LVM" , "LVN" , "LVO" , "LVP" , "LVQ" , "LVR" , "LVS" , "LVT" ,
+"LVU" , "LVV" , "LVW" , "LVX" , "LVY" , "LVZ" , "LV0" , "LV1" ,
+"LV2" , "LV3" , "LV4" , "LV5" , "LV6" , "LV7" , "LV8" , "LV9" ,
+"LWA" , "LWB" , "LWC" , "LWD" , "LWE" , "LWF" , "LWG" , "LWH" ,
+"LWI" , "LWJ" , "LWK" , "LWL" , "LWM" , "LWN" , "LWO" , "LWP" ,
+"LWQ" , "LWR" , "LWS" , "LWT" , "LWU" , "LWV" , "LWW" , "LWX" ,
+"LWY" , "LWZ" , "LW0" , "LW1" , "LW2" , "LW3" , "LW4" , "LW5" ,
+"LW6" , "LW7" , "LW8" , "LW9" , "LXA" , "LXB" , "LXC" , "LXD" ,
+"LXE" , "LXF" , "LXG" , "LXH" , "LXI" , "LXJ" , "LXK" , "LXL" ,
+"LXM" , "LXN" , "LXO" , "LXP" , "LXQ" , "LXR" , "LXS" , "LXT" ,
+"LXU" , "LXV" , "LXW" , "LXX" , "LXY" , "LXZ" , "LX0" , "LX1" ,
+"LX2" , "LX3" , "LX4" , "LX5" , "LX6" , "LX7" , "LX8" , "LX9" ,
+"LYA" , "LYB" , "LYC" , "LYD" , "LYE" , "LYF" , "LYG" , "LYH" ,
+"LYI" , "LYJ" , "LYK" , "LYL" , "LYM" , "LYN" , "LYO" , "LYP" ,
+"LYQ" , "LYR" , "LYS" , "LYT" , "LYU" , "LYV" , "LYW" , "LYX" ,
+"LYY" , "LYZ" , "LY0" , "LY1" , "LY2" , "LY3" , "LY4" , "LY5" ,
+"LY6" , "LY7" , "LY8" , "LY9" , "LZA" , "LZB" , "LZC" , "LZD" ,
+"LZE" , "LZF" , "LZG" , "LZH" , "LZI" , "LZJ" , "LZK" , "LZL" ,
+"LZM" , "LZN" , "LZO" , "LZP" , "LZQ" , "LZR" , "LZS" , "LZT" ,
+"LZU" , "LZV" , "LZW" , "LZX" , "LZY" , "LZZ" , "LZ0" , "LZ1" ,
+"LZ2" , "LZ3" , "LZ4" , "LZ5" , "LZ6" , "LZ7" , "LZ8" , "LZ9" ,
+"L0A" , "L0B" , "L0C" , "L0D" , "L0E" , "L0F" , "L0G" , "L0H" ,
+"L0I" , "L0J" , "L0K" , "L0L" , "L0M" , "L0N" , "L0O" , "L0P" ,
+"L0Q" , "L0R" , "L0S" , "L0T" , "L0U" , "L0V" , "L0W" , "L0X" ,
+"L0Y" , "L0Z" , "L00" , "L01" , "L02" , "L03" , "L04" , "L05" ,
+"L06" , "L07" , "L08" , "L09" , "L1A" , "L1B" , "L1C" , "L1D" ,
+"L1E" , "L1F" , "L1G" , "L1H" , "L1I" , "L1J" , "L1K" , "L1L" ,
+"L1M" , "L1N" , "L1O" , "L1P" , "L1Q" , "L1R" , "L1S" , "L1T" ,
+"L1U" , "L1V" , "L1W" , "L1X" , "L1Y" , "L1Z" , "L10" , "L11" ,
+"L12" , "L13" , "L14" , "L15" , "L16" , "L17" , "L18" , "L19" ,
+"L2A" , "L2B" , "L2C" , "L2D" , "L2E" , "L2F" , "L2G" , "L2H" ,
+"L2I" , "L2J" , "L2K" , "L2L" , "L2M" , "L2N" , "L2O" , "L2P" ,
+"L2Q" , "L2R" , "L2S" , "L2T" , "L2U" , "L2V" , "L2W" , "L2X" ,
+"L2Y" , "L2Z" , "L20" , "L21" , "L22" , "L23" , "L24" , "L25" ,
+"L26" , "L27" , "L28" , "L29" , "L3A" , "L3B" , "L3C" , "L3D" ,
+"L3E" , "L3F" , "L3G" , "L3H" , "L3I" , "L3J" , "L3K" , "L3L" ,
+"L3M" , "L3N" , "L3O" , "L3P" , "L3Q" , "L3R" , "L3S" , "L3T" ,
+"L3U" , "L3V" , "L3W" , "L3X" , "L3Y" , "L3Z" , "L30" , "L31" ,
+"L32" , "L33" , "L34" , "L35" , "L36" , "L37" , "L38" , "L39" ,
+"L4A" , "L4B" , "L4C" , "L4D" , "L4E" , "L4F" , "L4G" , "L4H" ,
+"L4I" , "L4J" , "L4K" , "L4L" , "L4M" , "L4N" , "L4O" , "L4P" ,
+"L4Q" , "L4R" , "L4S" , "L4T" , "L4U" , "L4V" , "L4W" , "L4X" ,
+"L4Y" , "L4Z" , "L40" , "L41" , "L42" , "L43" , "L44" , "L45" ,
+"L46" , "L47" , "L48" , "L49" , "L5A" , "L5B" , "L5C" , "L5D" ,
+"L5E" , "L5F" , "L5G" , "L5H" , "L5I" , "L5J" , "L5K" , "L5L" ,
+"L5M" , "L5N" , "L5O" , "L5P" , "L5Q" , "L5R" , "L5S" , "L5T" ,
+"L5U" , "L5V" , "L5W" , "L5X" , "L5Y" , "L5Z" , "L50" , "L51" ,
+"L52" , "L53" , "L54" , "L55" , "L56" , "L57" , "L58" , "L59" ,
+"L6A" , "L6B" , "L6C" , "L6D" , "L6E" , "L6F" , "L6G" , "L6H" ,
+"L6I" , "L6J" , "L6K" , "L6L" , "L6M" , "L6N" , "L6O" , "L6P" ,
+"L6Q" , "L6R" , "L6S" , "L6T" , "L6U" , "L6V" , "L6W" , "L6X" ,
+"L6Y" , "L6Z" , "L60" , "L61" , "L62" , "L63" , "L64" , "L65" ,
+"L66" , "L67" , "L68" , "L69" , "L7A" , "L7B" , "L7C" , "L7D" ,
+"L7E" , "L7F" , "L7G" , "L7H" , "L7I" , "L7J" , "L7K" , "L7L" ,
+"L7M" , "L7N" , "L7O" , "L7P" , "L7Q" , "L7R" , "L7S" , "L7T" ,
+"L7U" , "L7V" , "L7W" , "L7X" , "L7Y" , "L7Z" , "L70" , "L71" ,
+"L72" , "L73" , "L74" , "L75" , "L76" , "L77" , "L78" , "L79" ,
+"L8A" , "L8B" , "L8C" , "L8D" , "L8E" , "L8F" , "L8G" , "L8H" ,
+"L8I" , "L8J" , "L8K" , "L8L" , "L8M" , "L8N" , "L8O" , "L8P" ,
+"L8Q" , "L8R" , "L8S" , "L8T" , "L8U" , "L8V" , "L8W" , "L8X" ,
+"L8Y" , "L8Z" , "L80" , "L81" , "L82" , "L83" , "L84" , "L85" ,
+"L86" , "L87" , "L88" , "L89" , "L9A" , "L9B" , "L9C" , "L9D" ,
+"L9E" , "L9F" , "L9G" , "L9H" , "L9I" , "L9J" , "L9K" , "L9L" ,
+"L9M" , "L9N" , "L9O" , "L9P" , "L9Q" , "L9R" , "L9S" , "L9T" ,
+"L9U" , "L9V" , "L9W" , "L9X" , "L9Y" , "L9Z" , "L90" , "L91" ,
+"L92" , "L93" , "L94" , "L95" , "L96" , "L97" , "L98" , "L99" ,
+"MAA" , "MAB" , "MAC" , "MAD" , "MAE" , "MAF" , "MAG" , "MAH" ,
+"MAI" , "MAJ" , "MAK" , "MAL" , "MAM" , "MAN" , "MAO" , "MAP" ,
+"MAQ" , "MAR" , "MAS" , "MAT" , "MAU" , "MAV" , "MAW" , "MAX" ,
+"MAY" , "MAZ" , "MA0" , "MA1" , "MA2" , "MA3" , "MA4" , "MA5" ,
+"MA6" , "MA7" , "MA8" , "MA9" , "MBA" , "MBB" , "MBC" , "MBD" ,
+"MBE" , "MBF" , "MBG" , "MBH" , "MBI" , "MBJ" , "MBK" , "MBL" ,
+"MBM" , "MBN" , "MBO" , "MBP" , "MBQ" , "MBR" , "MBS" , "MBT" ,
+"MBU" , "MBV" , "MBW" , "MBX" , "MBY" , "MBZ" , "MB0" , "MB1" ,
+"MB2" , "MB3" , "MB4" , "MB5" , "MB6" , "MB7" , "MB8" , "MB9" ,
+"MCA" , "MCB" , "MCC" , "MCD" , "MCE" , "MCF" , "MCG" , "MCH" ,
+"MCI" , "MCJ" , "MCK" , "MCL" , "MCM" , "MCN" , "MCO" , "MCP" ,
+"MCQ" , "MCR" , "MCS" , "MCT" , "MCU" , "MCV" , "MCW" , "MCX" ,
+"MCY" , "MCZ" , "MC0" , "MC1" , "MC2" , "MC3" , "MC4" , "MC5" ,
+"MC6" , "MC7" , "MC8" , "MC9" , "MDA" , "MDB" , "MDC" , "MDD" ,
+"MDE" , "MDF" , "MDG" , "MDH" , "MDI" , "MDJ" , "MDK" , "MDL" ,
+"MDM" , "MDN" , "MDO" , "MDP" , "MDQ" , "MDR" , "MDS" , "MDT" ,
+"MDU" , "MDV" , "MDW" , "MDX" , "MDY" , "MDZ" , "MD0" , "MD1" ,
+"MD2" , "MD3" , "MD4" , "MD5" , "MD6" , "MD7" , "MD8" , "MD9" ,
+"MEA" , "MEB" , "MEC" , "MED" , "MEE" , "MEF" , "MEG" , "MEH" ,
+"MEI" , "MEJ" , "MEK" , "MEL" , "MEM" , "MEN" , "MEO" , "MEP" ,
+"MEQ" , "MER" , "MES" , "MET" , "MEU" , "MEV" , "MEW" , "MEX" ,
+"MEY" , "MEZ" , "ME0" , "ME1" , "ME2" , "ME3" , "ME4" , "ME5" ,
+"ME6" , "ME7" , "ME8" , "ME9" , "MFA" , "MFB" , "MFC" , "MFD" ,
+"MFE" , "MFF" , "MFG" , "MFH" , "MFI" , "MFJ" , "MFK" , "MFL" ,
+"MFM" , "MFN" , "MFO" , "MFP" , "MFQ" , "MFR" , "MFS" , "MFT" ,
+"MFU" , "MFV" , "MFW" , "MFX" , "MFY" , "MFZ" , "MF0" , "MF1" ,
+"MF2" , "MF3" , "MF4" , "MF5" , "MF6" , "MF7" , "MF8" , "MF9" ,
+"MGA" , "MGB" , "MGC" , "MGD" , "MGE" , "MGF" , "MGG" , "MGH" ,
+"MGI" , "MGJ" , "MGK" , "MGL" , "MGM" , "MGN" , "MGO" , "MGP" ,
+"MGQ" , "MGR" , "MGS" , "MGT" , "MGU" , "MGV" , "MGW" , "MGX" ,
+"MGY" , "MGZ" , "MG0" , "MG1" , "MG2" , "MG3" , "MG4" , "MG5" ,
+"MG6" , "MG7" , "MG8" , "MG9" , "MHA" , "MHB" , "MHC" , "MHD" ,
+"MHE" , "MHF" , "MHG" , "MHH" , "MHI" , "MHJ" , "MHK" , "MHL" ,
+"MHM" , "MHN" , "MHO" , "MHP" , "MHQ" , "MHR" , "MHS" , "MHT" ,
+"MHU" , "MHV" , "MHW" , "MHX" , "MHY" , "MHZ" , "MH0" , "MH1" ,
+"MH2" , "MH3" , "MH4" , "MH5" , "MH6" , "MH7" , "MH8" , "MH9" ,
+"MIA" , "MIB" , "MIC" , "MID" , "MIE" , "MIF" , "MIG" , "MIH" ,
+"MII" , "MIJ" , "MIK" , "MIL" , "MIM" , "MIN" , "MIO" , "MIP" ,
+"MIQ" , "MIR" , "MIS" , "MIT" , "MIU" , "MIV" , "MIW" , "MIX" ,
+"MIY" , "MIZ" , "MI0" , "MI1" , "MI2" , "MI3" , "MI4" , "MI5" ,
+"MI6" , "MI7" , "MI8" , "MI9" , "MJA" , "MJB" , "MJC" , "MJD" ,
+"MJE" , "MJF" , "MJG" , "MJH" , "MJI" , "MJJ" , "MJK" , "MJL" ,
+"MJM" , "MJN" , "MJO" , "MJP" , "MJQ" , "MJR" , "MJS" , "MJT" ,
+"MJU" , "MJV" , "MJW" , "MJX" , "MJY" , "MJZ" , "MJ0" , "MJ1" ,
+"MJ2" , "MJ3" , "MJ4" , "MJ5" , "MJ6" , "MJ7" , "MJ8" , "MJ9" ,
+"MKA" , "MKB" , "MKC" , "MKD" , "MKE" , "MKF" , "MKG" , "MKH" ,
+"MKI" , "MKJ" , "MKK" , "MKL" , "MKM" , "MKN" , "MKO" , "MKP" ,
+"MKQ" , "MKR" , "MKS" , "MKT" , "MKU" , "MKV" , "MKW" , "MKX" ,
+"MKY" , "MKZ" , "MK0" , "MK1" , "MK2" , "MK3" , "MK4" , "MK5" ,
+"MK6" , "MK7" , "MK8" , "MK9" , "MLA" , "MLB" , "MLC" , "MLD" ,
+"MLE" , "MLF" , "MLG" , "MLH" , "MLI" , "MLJ" , "MLK" , "MLL" ,
+"MLM" , "MLN" , "MLO" , "MLP" , "MLQ" , "MLR" , "MLS" , "MLT" ,
+"MLU" , "MLV" , "MLW" , "MLX" , "MLY" , "MLZ" , "ML0" , "ML1" ,
+"ML2" , "ML3" , "ML4" , "ML5" , "ML6" , "ML7" , "ML8" , "ML9" ,
+"MMA" , "MMB" , "MMC" , "MMD" , "MME" , "MMF" , "MMG" , "MMH" ,
+"MMI" , "MMJ" , "MMK" , "MML" , "MMM" , "MMN" , "MMO" , "MMP" ,
+"MMQ" , "MMR" , "MMS" , "MMT" , "MMU" , "MMV" , "MMW" , "MMX" ,
+"MMY" , "MMZ" , "MM0" , "MM1" , "MM2" , "MM3" , "MM4" , "MM5" ,
+"MM6" , "MM7" , "MM8" , "MM9" , "MNA" , "MNB" , "MNC" , "MND" ,
+"MNE" , "MNF" , "MNG" , "MNH" , "MNI" , "MNJ" , "MNK" , "MNL" ,
+"MNM" , "MNN" , "MNO" , "MNP" , "MNQ" , "MNR" , "MNS" , "MNT" ,
+"MNU" , "MNV" , "MNW" , "MNX" , "MNY" , "MNZ" , "MN0" , "MN1" ,
+"MN2" , "MN3" , "MN4" , "MN5" , "MN6" , "MN7" , "MN8" , "MN9" ,
+"MOA" , "MOB" , "MOC" , "MOD" , "MOE" , "MOF" , "MOG" , "MOH" ,
+"MOI" , "MOJ" , "MOK" , "MOL" , "MOM" , "MON" , "MOO" , "MOP" ,
+"MOQ" , "MOR" , "MOS" , "MOT" , "MOU" , "MOV" , "MOW" , "MOX" ,
+"MOY" , "MOZ" , "MO0" , "MO1" , "MO2" , "MO3" , "MO4" , "MO5" ,
+"MO6" , "MO7" , "MO8" , "MO9" , "MPA" , "MPB" , "MPC" , "MPD" ,
+"MPE" , "MPF" , "MPG" , "MPH" , "MPI" , "MPJ" , "MPK" , "MPL" ,
+"MPM" , "MPN" , "MPO" , "MPP" , "MPQ" , "MPR" , "MPS" , "MPT" ,
+"MPU" , "MPV" , "MPW" , "MPX" , "MPY" , "MPZ" , "MP0" , "MP1" ,
+"MP2" , "MP3" , "MP4" , "MP5" , "MP6" , "MP7" , "MP8" , "MP9" ,
+"MQA" , "MQB" , "MQC" , "MQD" , "MQE" , "MQF" , "MQG" , "MQH" ,
+"MQI" , "MQJ" , "MQK" , "MQL" , "MQM" , "MQN" , "MQO" , "MQP" ,
+"MQQ" , "MQR" , "MQS" , "MQT" , "MQU" , "MQV" , "MQW" , "MQX" ,
+"MQY" , "MQZ" , "MQ0" , "MQ1" , "MQ2" , "MQ3" , "MQ4" , "MQ5" ,
+"MQ6" , "MQ7" , "MQ8" , "MQ9" , "MRA" , "MRB" , "MRC" , "MRD" ,
+"MRE" , "MRF" , "MRG" , "MRH" , "MRI" , "MRJ" , "MRK" , "MRL" ,
+"MRM" , "MRN" , "MRO" , "MRP" , "MRQ" , "MRR" , "MRS" , "MRT" ,
+"MRU" , "MRV" , "MRW" , "MRX" , "MRY" , "MRZ" , "MR0" , "MR1" ,
+"MR2" , "MR3" , "MR4" , "MR5" , "MR6" , "MR7" , "MR8" , "MR9" ,
+"MSA" , "MSB" , "MSC" , "MSD" , "MSE" , "MSF" , "MSG" , "MSH" ,
+"MSI" , "MSJ" , "MSK" , "MSL" , "MSM" , "MSN" , "MSO" , "MSP" ,
+"MSQ" , "MSR" , "MSS" , "MST" , "MSU" , "MSV" , "MSW" , "MSX" ,
+"MSY" , "MSZ" , "MS0" , "MS1" , "MS2" , "MS3" , "MS4" , "MS5" ,
+"MS6" , "MS7" , "MS8" , "MS9" , "MTA" , "MTB" , "MTC" , "MTD" ,
+"MTE" , "MTF" , "MTG" , "MTH" , "MTI" , "MTJ" , "MTK" , "MTL" ,
+"MTM" , "MTN" , "MTO" , "MTP" , "MTQ" , "MTR" , "MTS" , "MTT" ,
+"MTU" , "MTV" , "MTW" , "MTX" , "MTY" , "MTZ" , "MT0" , "MT1" ,
+"MT2" , "MT3" , "MT4" , "MT5" , "MT6" , "MT7" , "MT8" , "MT9" ,
+"MUA" , "MUB" , "MUC" , "MUD" , "MUE" , "MUF" , "MUG" , "MUH" ,
+"MUI" , "MUJ" , "MUK" , "MUL" , "MUM" , "MUN" , "MUO" , "MUP" ,
+"MUQ" , "MUR" , "MUS" , "MUT" , "MUU" , "MUV" , "MUW" , "MUX" ,
+"MUY" , "MUZ" , "MU0" , "MU1" , "MU2" , "MU3" , "MU4" , "MU5" ,
+"MU6" , "MU7" , "MU8" , "MU9" , "MVA" , "MVB" , "MVC" , "MVD" ,
+"MVE" , "MVF" , "MVG" , "MVH" , "MVI" , "MVJ" , "MVK" , "MVL" ,
+"MVM" , "MVN" , "MVO" , "MVP" , "MVQ" , "MVR" , "MVS" , "MVT" ,
+"MVU" , "MVV" , "MVW" , "MVX" , "MVY" , "MVZ" , "MV0" , "MV1" ,
+"MV2" , "MV3" , "MV4" , "MV5" , "MV6" , "MV7" , "MV8" , "MV9" ,
+"MWA" , "MWB" , "MWC" , "MWD" , "MWE" , "MWF" , "MWG" , "MWH" ,
+"MWI" , "MWJ" , "MWK" , "MWL" , "MWM" , "MWN" , "MWO" , "MWP" ,
+"MWQ" , "MWR" , "MWS" , "MWT" , "MWU" , "MWV" , "MWW" , "MWX" ,
+"MWY" , "MWZ" , "MW0" , "MW1" , "MW2" , "MW3" , "MW4" , "MW5" ,
+"MW6" , "MW7" , "MW8" , "MW9" , "MXA" , "MXB" , "MXC" , "MXD" ,
+"MXE" , "MXF" , "MXG" , "MXH" , "MXI" , "MXJ" , "MXK" , "MXL" ,
+"MXM" , "MXN" , "MXO" , "MXP" , "MXQ" , "MXR" , "MXS" , "MXT" ,
+"MXU" , "MXV" , "MXW" , "MXX" , "MXY" , "MXZ" , "MX0" , "MX1" ,
+"MX2" , "MX3" , "MX4" , "MX5" , "MX6" , "MX7" , "MX8" , "MX9" ,
+"MYA" , "MYB" , "MYC" , "MYD" , "MYE" , "MYF" , "MYG" , "MYH" ,
+"MYI" , "MYJ" , "MYK" , "MYL" , "MYM" , "MYN" , "MYO" , "MYP" ,
+"MYQ" , "MYR" , "MYS" , "MYT" , "MYU" , "MYV" , "MYW" , "MYX" ,
+"MYY" , "MYZ" , "MY0" , "MY1" , "MY2" , "MY3" , "MY4" , "MY5" ,
+"MY6" , "MY7" , "MY8" , "MY9" , "MZA" , "MZB" , "MZC" , "MZD" ,
+"MZE" , "MZF" , "MZG" , "MZH" , "MZI" , "MZJ" , "MZK" , "MZL" ,
+"MZM" , "MZN" , "MZO" , "MZP" , "MZQ" , "MZR" , "MZS" , "MZT" ,
+"MZU" , "MZV" , "MZW" , "MZX" , "MZY" , "MZZ" , "MZ0" , "MZ1" ,
+"MZ2" , "MZ3" , "MZ4" , "MZ5" , "MZ6" , "MZ7" , "MZ8" , "MZ9" ,
+"M0A" , "M0B" , "M0C" , "M0D" , "M0E" , "M0F" , "M0G" , "M0H" ,
+"M0I" , "M0J" , "M0K" , "M0L" , "M0M" , "M0N" , "M0O" , "M0P" ,
+"M0Q" , "M0R" , "M0S" , "M0T" , "M0U" , "M0V" , "M0W" , "M0X" ,
+"M0Y" , "M0Z" , "M00" , "M01" , "M02" , "M03" , "M04" , "M05" ,
+"M06" , "M07" , "M08" , "M09" , "M1A" , "M1B" , "M1C" , "M1D" ,
+"M1E" , "M1F" , "M1G" , "M1H" , "M1I" , "M1J" , "M1K" , "M1L" ,
+"M1M" , "M1N" , "M1O" , "M1P" , "M1Q" , "M1R" , "M1S" , "M1T" ,
+"M1U" , "M1V" , "M1W" , "M1X" , "M1Y" , "M1Z" , "M10" , "M11" ,
+"M12" , "M13" , "M14" , "M15" , "M16" , "M17" , "M18" , "M19" ,
+"M2A" , "M2B" , "M2C" , "M2D" , "M2E" , "M2F" , "M2G" , "M2H" ,
+"M2I" , "M2J" , "M2K" , "M2L" , "M2M" , "M2N" , "M2O" , "M2P" ,
+"M2Q" , "M2R" , "M2S" , "M2T" , "M2U" , "M2V" , "M2W" , "M2X" ,
+"M2Y" , "M2Z" , "M20" , "M21" , "M22" , "M23" , "M24" , "M25" ,
+"M26" , "M27" , "M28" , "M29" , "M3A" , "M3B" , "M3C" , "M3D" ,
+"M3E" , "M3F" , "M3G" , "M3H" , "M3I" , "M3J" , "M3K" , "M3L" ,
+"M3M" , "M3N" , "M3O" , "M3P" , "M3Q" , "M3R" , "M3S" , "M3T" ,
+"M3U" , "M3V" , "M3W" , "M3X" , "M3Y" , "M3Z" , "M30" , "M31" ,
+"M32" , "M33" , "M34" , "M35" , "M36" , "M37" , "M38" , "M39" ,
+"M4A" , "M4B" , "M4C" , "M4D" , "M4E" , "M4F" , "M4G" , "M4H" ,
+"M4I" , "M4J" , "M4K" , "M4L" , "M4M" , "M4N" , "M4O" , "M4P" ,
+"M4Q" , "M4R" , "M4S" , "M4T" , "M4U" , "M4V" , "M4W" , "M4X" ,
+"M4Y" , "M4Z" , "M40" , "M41" , "M42" , "M43" , "M44" , "M45" ,
+"M46" , "M47" , "M48" , "M49" , "M5A" , "M5B" , "M5C" , "M5D" ,
+"M5E" , "M5F" , "M5G" , "M5H" , "M5I" , "M5J" , "M5K" , "M5L" ,
+"M5M" , "M5N" , "M5O" , "M5P" , "M5Q" , "M5R" , "M5S" , "M5T" ,
+"M5U" , "M5V" , "M5W" , "M5X" , "M5Y" , "M5Z" , "M50" , "M51" ,
+"M52" , "M53" , "M54" , "M55" , "M56" , "M57" , "M58" , "M59" ,
+"M6A" , "M6B" , "M6C" , "M6D" , "M6E" , "M6F" , "M6G" , "M6H" ,
+"M6I" , "M6J" , "M6K" , "M6L" , "M6M" , "M6N" , "M6O" , "M6P" ,
+"M6Q" , "M6R" , "M6S" , "M6T" , "M6U" , "M6V" , "M6W" , "M6X" ,
+"M6Y" , "M6Z" , "M60" , "M61" , "M62" , "M63" , "M64" , "M65" ,
+"M66" , "M67" , "M68" , "M69" , "M7A" , "M7B" , "M7C" , "M7D" ,
+"M7E" , "M7F" , "M7G" , "M7H" , "M7I" , "M7J" , "M7K" , "M7L" ,
+"M7M" , "M7N" , "M7O" , "M7P" , "M7Q" , "M7R" , "M7S" , "M7T" ,
+"M7U" , "M7V" , "M7W" , "M7X" , "M7Y" , "M7Z" , "M70" , "M71" ,
+"M72" , "M73" , "M74" , "M75" , "M76" , "M77" , "M78" , "M79" ,
+"M8A" , "M8B" , "M8C" , "M8D" , "M8E" , "M8F" , "M8G" , "M8H" ,
+"M8I" , "M8J" , "M8K" , "M8L" , "M8M" , "M8N" , "M8O" , "M8P" ,
+"M8Q" , "M8R" , "M8S" , "M8T" , "M8U" , "M8V" , "M8W" , "M8X" ,
+"M8Y" , "M8Z" , "M80" , "M81" , "M82" , "M83" , "M84" , "M85" ,
+"M86" , "M87" , "M88" , "M89" , "M9A" , "M9B" , "M9C" , "M9D" ,
+"M9E" , "M9F" , "M9G" , "M9H" , "M9I" , "M9J" , "M9K" , "M9L" ,
+"M9M" , "M9N" , "M9O" , "M9P" , "M9Q" , "M9R" , "M9S" , "M9T" ,
+"M9U" , "M9V" , "M9W" , "M9X" , "M9Y" , "M9Z" , "M90" , "M91" ,
+"M92" , "M93" , "M94" , "M95" , "M96" , "M97" , "M98" , "M99" ,
+"NAA" , "NAB" , "NAC" , "NAD" , "NAE" , "NAF" , "NAG" , "NAH" ,
+"NAI" , "NAJ" , "NAK" , "NAL" , "NAM" , "NAN" , "NAO" , "NAP" ,
+"NAQ" , "NAR" , "NAS" , "NAT" , "NAU" , "NAV" , "NAW" , "NAX" ,
+"NAY" , "NAZ" , "NA0" , "NA1" , "NA2" , "NA3" , "NA4" , "NA5" ,
+"NA6" , "NA7" , "NA8" , "NA9" , "NBA" , "NBB" , "NBC" , "NBD" ,
+"NBE" , "NBF" , "NBG" , "NBH" , "NBI" , "NBJ" , "NBK" , "NBL" ,
+"NBM" , "NBN" , "NBO" , "NBP" , "NBQ" , "NBR" , "NBS" , "NBT" ,
+"NBU" , "NBV" , "NBW" , "NBX" , "NBY" , "NBZ" , "NB0" , "NB1" ,
+"NB2" , "NB3" , "NB4" , "NB5" , "NB6" , "NB7" , "NB8" , "NB9" ,
+"NCA" , "NCB" , "NCC" , "NCD" , "NCE" , "NCF" , "NCG" , "NCH" ,
+"NCI" , "NCJ" , "NCK" , "NCL" , "NCM" , "NCN" , "NCO" , "NCP" ,
+"NCQ" , "NCR" , "NCS" , "NCT" , "NCU" , "NCV" , "NCW" , "NCX" ,
+"NCY" , "NCZ" , "NC0" , "NC1" , "NC2" , "NC3" , "NC4" , "NC5" ,
+"NC6" , "NC7" , "NC8" , "NC9" , "NDA" , "NDB" , "NDC" , "NDD" ,
+"NDE" , "NDF" , "NDG" , "NDH" , "NDI" , "NDJ" , "NDK" , "NDL" ,
+"NDM" , "NDN" , "NDO" , "NDP" , "NDQ" , "NDR" , "NDS" , "NDT" ,
+"NDU" , "NDV" , "NDW" , "NDX" , "NDY" , "NDZ" , "ND0" , "ND1" ,
+"ND2" , "ND3" , "ND4" , "ND5" , "ND6" , "ND7" , "ND8" , "ND9" ,
+"NEA" , "NEB" , "NEC" , "NED" , "NEE" , "NEF" , "NEG" , "NEH" ,
+"NEI" , "NEJ" , "NEK" , "NEL" , "NEM" , "NEN" , "NEO" , "NEP" ,
+"NEQ" , "NER" , "NES" , "NET" , "NEU" , "NEV" , "NEW" , "NEX" ,
+"NEY" , "NEZ" , "NE0" , "NE1" , "NE2" , "NE3" , "NE4" , "NE5" ,
+"NE6" , "NE7" , "NE8" , "NE9" , "NFA" , "NFB" , "NFC" , "NFD" ,
+"NFE" , "NFF" , "NFG" , "NFH" , "NFI" , "NFJ" , "NFK" , "NFL" ,
+"NFM" , "NFN" , "NFO" , "NFP" , "NFQ" , "NFR" , "NFS" , "NFT" ,
+"NFU" , "NFV" , "NFW" , "NFX" , "NFY" , "NFZ" , "NF0" , "NF1" ,
+"NF2" , "NF3" , "NF4" , "NF5" , "NF6" , "NF7" , "NF8" , "NF9" ,
+"NGA" , "NGB" , "NGC" , "NGD" , "NGE" , "NGF" , "NGG" , "NGH" ,
+"NGI" , "NGJ" , "NGK" , "NGL" , "NGM" , "NGN" , "NGO" , "NGP" ,
+"NGQ" , "NGR" , "NGS" , "NGT" , "NGU" , "NGV" , "NGW" , "NGX" ,
+"NGY" , "NGZ" , "NG0" , "NG1" , "NG2" , "NG3" , "NG4" , "NG5" ,
+"NG6" , "NG7" , "NG8" , "NG9" , "NHA" , "NHB" , "NHC" , "NHD" ,
+"NHE" , "NHF" , "NHG" , "NHH" , "NHI" , "NHJ" , "NHK" , "NHL" ,
+"NHM" , "NHN" , "NHO" , "NHP" , "NHQ" , "NHR" , "NHS" , "NHT" ,
+"NHU" , "NHV" , "NHW" , "NHX" , "NHY" , "NHZ" , "NH0" , "NH1" ,
+"NH2" , "NH3" , "NH4" , "NH5" , "NH6" , "NH7" , "NH8" , "NH9" ,
+"NIA" , "NIB" , "NIC" , "NID" , "NIE" , "NIF" , "NIG" , "NIH" ,
+"NII" , "NIJ" , "NIK" , "NIL" , "NIM" , "NIN" , "NIO" , "NIP" ,
+"NIQ" , "NIR" , "NIS" , "NIT" , "NIU" , "NIV" , "NIW" , "NIX" ,
+"NIY" , "NIZ" , "NI0" , "NI1" , "NI2" , "NI3" , "NI4" , "NI5" ,
+"NI6" , "NI7" , "NI8" , "NI9" , "NJA" , "NJB" , "NJC" , "NJD" ,
+"NJE" , "NJF" , "NJG" , "NJH" , "NJI" , "NJJ" , "NJK" , "NJL" ,
+"NJM" , "NJN" , "NJO" , "NJP" , "NJQ" , "NJR" , "NJS" , "NJT" ,
+"NJU" , "NJV" , "NJW" , "NJX" , "NJY" , "NJZ" , "NJ0" , "NJ1" ,
+"NJ2" , "NJ3" , "NJ4" , "NJ5" , "NJ6" , "NJ7" , "NJ8" , "NJ9" ,
+"NKA" , "NKB" , "NKC" , "NKD" , "NKE" , "NKF" , "NKG" , "NKH" ,
+"NKI" , "NKJ" , "NKK" , "NKL" , "NKM" , "NKN" , "NKO" , "NKP" ,
+"NKQ" , "NKR" , "NKS" , "NKT" , "NKU" , "NKV" , "NKW" , "NKX" ,
+"NKY" , "NKZ" , "NK0" , "NK1" , "NK2" , "NK3" , "NK4" , "NK5" ,
+"NK6" , "NK7" , "NK8" , "NK9" , "NLA" , "NLB" , "NLC" , "NLD" ,
+"NLE" , "NLF" , "NLG" , "NLH" , "NLI" , "NLJ" , "NLK" , "NLL" ,
+"NLM" , "NLN" , "NLO" , "NLP" , "NLQ" , "NLR" , "NLS" , "NLT" ,
+"NLU" , "NLV" , "NLW" , "NLX" , "NLY" , "NLZ" , "NL0" , "NL1" ,
+"NL2" , "NL3" , "NL4" , "NL5" , "NL6" , "NL7" , "NL8" , "NL9" ,
+"NMA" , "NMB" , "NMC" , "NMD" , "NME" , "NMF" , "NMG" , "NMH" ,
+"NMI" , "NMJ" , "NMK" , "NML" , "NMM" , "NMN" , "NMO" , "NMP" ,
+"NMQ" , "NMR" , "NMS" , "NMT" , "NMU" , "NMV" , "NMW" , "NMX" ,
+"NMY" , "NMZ" , "NM0" , "NM1" , "NM2" , "NM3" , "NM4" , "NM5" ,
+"NM6" , "NM7" , "NM8" , "NM9" , "NNA" , "NNB" , "NNC" , "NND" ,
+"NNE" , "NNF" , "NNG" , "NNH" , "NNI" , "NNJ" , "NNK" , "NNL" ,
+"NNM" , "NNN" , "NNO" , "NNP" , "NNQ" , "NNR" , "NNS" , "NNT" ,
+"NNU" , "NNV" , "NNW" , "NNX" , "NNY" , "NNZ" , "NN0" , "NN1" ,
+"NN2" , "NN3" , "NN4" , "NN5" , "NN6" , "NN7" , "NN8" , "NN9" ,
+"NOA" , "NOB" , "NOC" , "NOD" , "NOE" , "NOF" , "NOG" , "NOH" ,
+"NOI" , "NOJ" , "NOK" , "NOL" , "NOM" , "NON" , "NOO" , "NOP" ,
+"NOQ" , "NOR" , "NOS" , "NOT" , "NOU" , "NOV" , "NOW" , "NOX" ,
+"NOY" , "NOZ" , "NO0" , "NO1" , "NO2" , "NO3" , "NO4" , "NO5" ,
+"NO6" , "NO7" , "NO8" , "NO9" , "NPA" , "NPB" , "NPC" , "NPD" ,
+"NPE" , "NPF" , "NPG" , "NPH" , "NPI" , "NPJ" , "NPK" , "NPL" ,
+"NPM" , "NPN" , "NPO" , "NPP" , "NPQ" , "NPR" , "NPS" , "NPT" ,
+"NPU" , "NPV" , "NPW" , "NPX" , "NPY" , "NPZ" , "NP0" , "NP1" ,
+"NP2" , "NP3" , "NP4" , "NP5" , "NP6" , "NP7" , "NP8" , "NP9" ,
+"NQA" , "NQB" , "NQC" , "NQD" , "NQE" , "NQF" , "NQG" , "NQH" ,
+"NQI" , "NQJ" , "NQK" , "NQL" , "NQM" , "NQN" , "NQO" , "NQP" ,
+"NQQ" , "NQR" , "NQS" , "NQT" , "NQU" , "NQV" , "NQW" , "NQX" ,
+"NQY" , "NQZ" , "NQ0" , "NQ1" , "NQ2" , "NQ3" , "NQ4" , "NQ5" ,
+"NQ6" , "NQ7" , "NQ8" , "NQ9" , "NRA" , "NRB" , "NRC" , "NRD" ,
+"NRE" , "NRF" , "NRG" , "NRH" , "NRI" , "NRJ" , "NRK" , "NRL" ,
+"NRM" , "NRN" , "NRO" , "NRP" , "NRQ" , "NRR" , "NRS" , "NRT" ,
+"NRU" , "NRV" , "NRW" , "NRX" , "NRY" , "NRZ" , "NR0" , "NR1" ,
+"NR2" , "NR3" , "NR4" , "NR5" , "NR6" , "NR7" , "NR8" , "NR9" ,
+"NSA" , "NSB" , "NSC" , "NSD" , "NSE" , "NSF" , "NSG" , "NSH" ,
+"NSI" , "NSJ" , "NSK" , "NSL" , "NSM" , "NSN" , "NSO" , "NSP" ,
+"NSQ" , "NSR" , "NSS" , "NST" , "NSU" , "NSV" , "NSW" , "NSX" ,
+"NSY" , "NSZ" , "NS0" , "NS1" , "NS2" , "NS3" , "NS4" , "NS5" ,
+"NS6" , "NS7" , "NS8" , "NS9" , "NTA" , "NTB" , "NTC" , "NTD" ,
+"NTE" , "NTF" , "NTG" , "NTH" , "NTI" , "NTJ" , "NTK" , "NTL" ,
+"NTM" , "NTN" , "NTO" , "NTP" , "NTQ" , "NTR" , "NTS" , "NTT" ,
+"NTU" , "NTV" , "NTW" , "NTX" , "NTY" , "NTZ" , "NT0" , "NT1" ,
+"NT2" , "NT3" , "NT4" , "NT5" , "NT6" , "NT7" , "NT8" , "NT9" ,
+"NUA" , "NUB" , "NUC" , "NUD" , "NUE" , "NUF" , "NUG" , "NUH" ,
+"NUI" , "NUJ" , "NUK" , "NUL" , "NUM" , "NUN" , "NUO" , "NUP" ,
+"NUQ" , "NUR" , "NUS" , "NUT" , "NUU" , "NUV" , "NUW" , "NUX" ,
+"NUY" , "NUZ" , "NU0" , "NU1" , "NU2" , "NU3" , "NU4" , "NU5" ,
+"NU6" , "NU7" , "NU8" , "NU9" , "NVA" , "NVB" , "NVC" , "NVD" ,
+"NVE" , "NVF" , "NVG" , "NVH" , "NVI" , "NVJ" , "NVK" , "NVL" ,
+"NVM" , "NVN" , "NVO" , "NVP" , "NVQ" , "NVR" , "NVS" , "NVT" ,
+"NVU" , "NVV" , "NVW" , "NVX" , "NVY" , "NVZ" , "NV0" , "NV1" ,
+"NV2" , "NV3" , "NV4" , "NV5" , "NV6" , "NV7" , "NV8" , "NV9" ,
+"NWA" , "NWB" , "NWC" , "NWD" , "NWE" , "NWF" , "NWG" , "NWH" ,
+"NWI" , "NWJ" , "NWK" , "NWL" , "NWM" , "NWN" , "NWO" , "NWP" ,
+"NWQ" , "NWR" , "NWS" , "NWT" , "NWU" , "NWV" , "NWW" , "NWX" ,
+"NWY" , "NWZ" , "NW0" , "NW1" , "NW2" , "NW3" , "NW4" , "NW5" ,
+"NW6" , "NW7" , "NW8" , "NW9" , "NXA" , "NXB" , "NXC" , "NXD" ,
+"NXE" , "NXF" , "NXG" , "NXH" , "NXI" , "NXJ" , "NXK" , "NXL" ,
+"NXM" , "NXN" , "NXO" , "NXP" , "NXQ" , "NXR" , "NXS" , "NXT" ,
+"NXU" , "NXV" , "NXW" , "NXX" , "NXY" , "NXZ" , "NX0" , "NX1" ,
+"NX2" , "NX3" , "NX4" , "NX5" , "NX6" , "NX7" , "NX8" , "NX9" ,
+"NYA" , "NYB" , "NYC" , "NYD" , "NYE" , "NYF" , "NYG" , "NYH" ,
+"NYI" , "NYJ" , "NYK" , "NYL" , "NYM" , "NYN" , "NYO" , "NYP" ,
+"NYQ" , "NYR" , "NYS" , "NYT" , "NYU" , "NYV" , "NYW" , "NYX" ,
+"NYY" , "NYZ" , "NY0" , "NY1" , "NY2" , "NY3" , "NY4" , "NY5" ,
+"NY6" , "NY7" , "NY8" , "NY9" , "NZA" , "NZB" , "NZC" , "NZD" ,
+"NZE" , "NZF" , "NZG" , "NZH" , "NZI" , "NZJ" , "NZK" , "NZL" ,
+"NZM" , "NZN" , "NZO" , "NZP" , "NZQ" , "NZR" , "NZS" , "NZT" ,
+"NZU" , "NZV" , "NZW" , "NZX" , "NZY" , "NZZ" , "NZ0" , "NZ1" ,
+"NZ2" , "NZ3" , "NZ4" , "NZ5" , "NZ6" , "NZ7" , "NZ8" , "NZ9" ,
+"N0A" , "N0B" , "N0C" , "N0D" , "N0E" , "N0F" , "N0G" , "N0H" ,
+"N0I" , "N0J" , "N0K" , "N0L" , "N0M" , "N0N" , "N0O" , "N0P" ,
+"N0Q" , "N0R" , "N0S" , "N0T" , "N0U" , "N0V" , "N0W" , "N0X" ,
+"N0Y" , "N0Z" , "N00" , "N01" , "N02" , "N03" , "N04" , "N05" ,
+"N06" , "N07" , "N08" , "N09" , "N1A" , "N1B" , "N1C" , "N1D" ,
+"N1E" , "N1F" , "N1G" , "N1H" , "N1I" , "N1J" , "N1K" , "N1L" ,
+"N1M" , "N1N" , "N1O" , "N1P" , "N1Q" , "N1R" , "N1S" , "N1T" ,
+"N1U" , "N1V" , "N1W" , "N1X" , "N1Y" , "N1Z" , "N10" , "N11" ,
+"N12" , "N13" , "N14" , "N15" , "N16" , "N17" , "N18" , "N19" ,
+"N2A" , "N2B" , "N2C" , "N2D" , "N2E" , "N2F" , "N2G" , "N2H" ,
+"N2I" , "N2J" , "N2K" , "N2L" , "N2M" , "N2N" , "N2O" , "N2P" ,
+"N2Q" , "N2R" , "N2S" , "N2T" , "N2U" , "N2V" , "N2W" , "N2X" ,
+"N2Y" , "N2Z" , "N20" , "N21" , "N22" , "N23" , "N24" , "N25" ,
+"N26" , "N27" , "N28" , "N29" , "N3A" , "N3B" , "N3C" , "N3D" ,
+"N3E" , "N3F" , "N3G" , "N3H" , "N3I" , "N3J" , "N3K" , "N3L" ,
+"N3M" , "N3N" , "N3O" , "N3P" , "N3Q" , "N3R" , "N3S" , "N3T" ,
+"N3U" , "N3V" , "N3W" , "N3X" , "N3Y" , "N3Z" , "N30" , "N31" ,
+"N32" , "N33" , "N34" , "N35" , "N36" , "N37" , "N38" , "N39" ,
+"N4A" , "N4B" , "N4C" , "N4D" , "N4E" , "N4F" , "N4G" , "N4H" ,
+"N4I" , "N4J" , "N4K" , "N4L" , "N4M" , "N4N" , "N4O" , "N4P" ,
+"N4Q" , "N4R" , "N4S" , "N4T" , "N4U" , "N4V" , "N4W" , "N4X" ,
+"N4Y" , "N4Z" , "N40" , "N41" , "N42" , "N43" , "N44" , "N45" ,
+"N46" , "N47" , "N48" , "N49" , "N5A" , "N5B" , "N5C" , "N5D" ,
+"N5E" , "N5F" , "N5G" , "N5H" , "N5I" , "N5J" , "N5K" , "N5L" ,
+"N5M" , "N5N" , "N5O" , "N5P" , "N5Q" , "N5R" , "N5S" , "N5T" ,
+"N5U" , "N5V" , "N5W" , "N5X" , "N5Y" , "N5Z" , "N50" , "N51" ,
+"N52" , "N53" , "N54" , "N55" , "N56" , "N57" , "N58" , "N59" ,
+"N6A" , "N6B" , "N6C" , "N6D" , "N6E" , "N6F" , "N6G" , "N6H" ,
+"N6I" , "N6J" , "N6K" , "N6L" , "N6M" , "N6N" , "N6O" , "N6P" ,
+"N6Q" , "N6R" , "N6S" , "N6T" , "N6U" , "N6V" , "N6W" , "N6X" ,
+"N6Y" , "N6Z" , "N60" , "N61" , "N62" , "N63" , "N64" , "N65" ,
+"N66" , "N67" , "N68" , "N69" , "N7A" , "N7B" , "N7C" , "N7D" ,
+"N7E" , "N7F" , "N7G" , "N7H" , "N7I" , "N7J" , "N7K" , "N7L" ,
+"N7M" , "N7N" , "N7O" , "N7P" , "N7Q" , "N7R" , "N7S" , "N7T" ,
+"N7U" , "N7V" , "N7W" , "N7X" , "N7Y" , "N7Z" , "N70" , "N71" ,
+"N72" , "N73" , "N74" , "N75" , "N76" , "N77" , "N78" , "N79" ,
+"N8A" , "N8B" , "N8C" , "N8D" , "N8E" , "N8F" , "N8G" , "N8H" ,
+"N8I" , "N8J" , "N8K" , "N8L" , "N8M" , "N8N" , "N8O" , "N8P" ,
+"N8Q" , "N8R" , "N8S" , "N8T" , "N8U" , "N8V" , "N8W" , "N8X" ,
+"N8Y" , "N8Z" , "N80" , "N81" , "N82" , "N83" , "N84" , "N85" ,
+"N86" , "N87" , "N88" , "N89" , "N9A" , "N9B" , "N9C" , "N9D" ,
+"N9E" , "N9F" , "N9G" , "N9H" , "N9I" , "N9J" , "N9K" , "N9L" ,
+"N9M" , "N9N" , "N9O" , "N9P" , "N9Q" , "N9R" , "N9S" , "N9T" ,
+"N9U" , "N9V" , "N9W" , "N9X" , "N9Y" , "N9Z" , "N90" , "N91" ,
+"N92" , "N93" , "N94" , "N95" , "N96" , "N97" , "N98" , "N99" ,
+"OAA" , "OAB" , "OAC" , "OAD" , "OAE" , "OAF" , "OAG" , "OAH" ,
+"OAI" , "OAJ" , "OAK" , "OAL" , "OAM" , "OAN" , "OAO" , "OAP" ,
+"OAQ" , "OAR" , "OAS" , "OAT" , "OAU" , "OAV" , "OAW" , "OAX" ,
+"OAY" , "OAZ" , "OA0" , "OA1" , "OA2" , "OA3" , "OA4" , "OA5" ,
+"OA6" , "OA7" , "OA8" , "OA9" , "OBA" , "OBB" , "OBC" , "OBD" ,
+"OBE" , "OBF" , "OBG" , "OBH" , "OBI" , "OBJ" , "OBK" , "OBL" ,
+"OBM" , "OBN" , "OBO" , "OBP" , "OBQ" , "OBR" , "OBS" , "OBT" ,
+"OBU" , "OBV" , "OBW" , "OBX" , "OBY" , "OBZ" , "OB0" , "OB1" ,
+"OB2" , "OB3" , "OB4" , "OB5" , "OB6" , "OB7" , "OB8" , "OB9" ,
+"OCA" , "OCB" , "OCC" , "OCD" , "OCE" , "OCF" , "OCG" , "OCH" ,
+"OCI" , "OCJ" , "OCK" , "OCL" , "OCM" , "OCN" , "OCO" , "OCP" ,
+"OCQ" , "OCR" , "OCS" , "OCT" , "OCU" , "OCV" , "OCW" , "OCX" ,
+"OCY" , "OCZ" , "OC0" , "OC1" , "OC2" , "OC3" , "OC4" , "OC5" ,
+"OC6" , "OC7" , "OC8" , "OC9" , "ODA" , "ODB" , "ODC" , "ODD" ,
+"ODE" , "ODF" , "ODG" , "ODH" , "ODI" , "ODJ" , "ODK" , "ODL" ,
+"ODM" , "ODN" , "ODO" , "ODP" , "ODQ" , "ODR" , "ODS" , "ODT" ,
+"ODU" , "ODV" , "ODW" , "ODX" , "ODY" , "ODZ" , "OD0" , "OD1" ,
+"OD2" , "OD3" , "OD4" , "OD5" , "OD6" , "OD7" , "OD8" , "OD9" ,
+"OEA" , "OEB" , "OEC" , "OED" , "OEE" , "OEF" , "OEG" , "OEH" ,
+"OEI" , "OEJ" , "OEK" , "OEL" , "OEM" , "OEN" , "OEO" , "OEP" ,
+"OEQ" , "OER" , "OES" , "OET" , "OEU" , "OEV" , "OEW" , "OEX" ,
+"OEY" , "OEZ" , "OE0" , "OE1" , "OE2" , "OE3" , "OE4" , "OE5" ,
+"OE6" , "OE7" , "OE8" , "OE9" , "OFA" , "OFB" , "OFC" , "OFD" ,
+"OFE" , "OFF" , "OFG" , "OFH" , "OFI" , "OFJ" , "OFK" , "OFL" ,
+"OFM" , "OFN" , "OFO" , "OFP" , "OFQ" , "OFR" , "OFS" , "OFT" ,
+"OFU" , "OFV" , "OFW" , "OFX" , "OFY" , "OFZ" , "OF0" , "OF1" ,
+"OF2" , "OF3" , "OF4" , "OF5" , "OF6" , "OF7" , "OF8" , "OF9" ,
+"OGA" , "OGB" , "OGC" , "OGD" , "OGE" , "OGF" , "OGG" , "OGH" ,
+"OGI" , "OGJ" , "OGK" , "OGL" , "OGM" , "OGN" , "OGO" , "OGP" ,
+"OGQ" , "OGR" , "OGS" , "OGT" , "OGU" , "OGV" , "OGW" , "OGX" ,
+"OGY" , "OGZ" , "OG0" , "OG1" , "OG2" , "OG3" , "OG4" , "OG5" ,
+"OG6" , "OG7" , "OG8" , "OG9" , "OHA" , "OHB" , "OHC" , "OHD" ,
+"OHE" , "OHF" , "OHG" , "OHH" , "OHI" , "OHJ" , "OHK" , "OHL" ,
+"OHM" , "OHN" , "OHO" , "OHP" , "OHQ" , "OHR" , "OHS" , "OHT" ,
+"OHU" , "OHV" , "OHW" , "OHX" , "OHY" , "OHZ" , "OH0" , "OH1" ,
+"OH2" , "OH3" , "OH4" , "OH5" , "OH6" , "OH7" , "OH8" , "OH9" ,
+"OIA" , "OIB" , "OIC" , "OID" , "OIE" , "OIF" , "OIG" , "OIH" ,
+"OII" , "OIJ" , "OIK" , "OIL" , "OIM" , "OIN" , "OIO" , "OIP" ,
+"OIQ" , "OIR" , "OIS" , "OIT" , "OIU" , "OIV" , "OIW" , "OIX" ,
+"OIY" , "OIZ" , "OI0" , "OI1" , "OI2" , "OI3" , "OI4" , "OI5" ,
+"OI6" , "OI7" , "OI8" , "OI9" , "OJA" , "OJB" , "OJC" , "OJD" ,
+"OJE" , "OJF" , "OJG" , "OJH" , "OJI" , "OJJ" , "OJK" , "OJL" ,
+"OJM" , "OJN" , "OJO" , "OJP" , "OJQ" , "OJR" , "OJS" , "OJT" ,
+"OJU" , "OJV" , "OJW" , "OJX" , "OJY" , "OJZ" , "OJ0" , "OJ1" ,
+"OJ2" , "OJ3" , "OJ4" , "OJ5" , "OJ6" , "OJ7" , "OJ8" , "OJ9" ,
+"OKA" , "OKB" , "OKC" , "OKD" , "OKE" , "OKF" , "OKG" , "OKH" ,
+"OKI" , "OKJ" , "OKK" , "OKL" , "OKM" , "OKN" , "OKO" , "OKP" ,
+"OKQ" , "OKR" , "OKS" , "OKT" , "OKU" , "OKV" , "OKW" , "OKX" ,
+"OKY" , "OKZ" , "OK0" , "OK1" , "OK2" , "OK3" , "OK4" , "OK5" ,
+"OK6" , "OK7" , "OK8" , "OK9" , "OLA" , "OLB" , "OLC" , "OLD" ,
+"OLE" , "OLF" , "OLG" , "OLH" , "OLI" , "OLJ" , "OLK" , "OLL" ,
+"OLM" , "OLN" , "OLO" , "OLP" , "OLQ" , "OLR" , "OLS" , "OLT" ,
+"OLU" , "OLV" , "OLW" , "OLX" , "OLY" , "OLZ" , "OL0" , "OL1" ,
+"OL2" , "OL3" , "OL4" , "OL5" , "OL6" , "OL7" , "OL8" , "OL9" ,
+"OMA" , "OMB" , "OMC" , "OMD" , "OME" , "OMF" , "OMG" , "OMH" ,
+"OMI" , "OMJ" , "OMK" , "OML" , "OMM" , "OMN" , "OMO" , "OMP" ,
+"OMQ" , "OMR" , "OMS" , "OMT" , "OMU" , "OMV" , "OMW" , "OMX" ,
+"OMY" , "OMZ" , "OM0" , "OM1" , "OM2" , "OM3" , "OM4" , "OM5" ,
+"OM6" , "OM7" , "OM8" , "OM9" , "ONA" , "ONB" , "ONC" , "OND" ,
+"ONE" , "ONF" , "ONG" , "ONH" , "ONI" , "ONJ" , "ONK" , "ONL" ,
+"ONM" , "ONN" , "ONO" , "ONP" , "ONQ" , "ONR" , "ONS" , "ONT" ,
+"ONU" , "ONV" , "ONW" , "ONX" , "ONY" , "ONZ" , "ON0" , "ON1" ,
+"ON2" , "ON3" , "ON4" , "ON5" , "ON6" , "ON7" , "ON8" , "ON9" ,
+"OOA" , "OOB" , "OOC" , "OOD" , "OOE" , "OOF" , "OOG" , "OOH" ,
+"OOI" , "OOJ" , "OOK" , "OOL" , "OOM" , "OON" , "OOO" , "OOP" ,
+"OOQ" , "OOR" , "OOS" , "OOT" , "OOU" , "OOV" , "OOW" , "OOX" ,
+"OOY" , "OOZ" , "OO0" , "OO1" , "OO2" , "OO3" , "OO4" , "OO5" ,
+"OO6" , "OO7" , "OO8" , "OO9" , "OPA" , "OPB" , "OPC" , "OPD" ,
+"OPE" , "OPF" , "OPG" , "OPH" , "OPI" , "OPJ" , "OPK" , "OPL" ,
+"OPM" , "OPN" , "OPO" , "OPP" , "OPQ" , "OPR" , "OPS" , "OPT" ,
+"OPU" , "OPV" , "OPW" , "OPX" , "OPY" , "OPZ" , "OP0" , "OP1" ,
+"OP2" , "OP3" , "OP4" , "OP5" , "OP6" , "OP7" , "OP8" , "OP9" ,
+"OQA" , "OQB" , "OQC" , "OQD" , "OQE" , "OQF" , "OQG" , "OQH" ,
+"OQI" , "OQJ" , "OQK" , "OQL" , "OQM" , "OQN" , "OQO" , "OQP" ,
+"OQQ" , "OQR" , "OQS" , "OQT" , "OQU" , "OQV" , "OQW" , "OQX" ,
+"OQY" , "OQZ" , "OQ0" , "OQ1" , "OQ2" , "OQ3" , "OQ4" , "OQ5" ,
+"OQ6" , "OQ7" , "OQ8" , "OQ9" , "ORA" , "ORB" , "ORC" , "ORD" ,
+"ORE" , "ORF" , "ORG" , "ORH" , "ORI" , "ORJ" , "ORK" , "ORL" ,
+"ORM" , "ORN" , "ORO" , "ORP" , "ORQ" , "ORR" , "ORS" , "ORT" ,
+"ORU" , "ORV" , "ORW" , "ORX" , "ORY" , "ORZ" , "OR0" , "OR1" ,
+"OR2" , "OR3" , "OR4" , "OR5" , "OR6" , "OR7" , "OR8" , "OR9" ,
+"OSA" , "OSB" , "OSC" , "OSD" , "OSE" , "OSF" , "OSG" , "OSH" ,
+"OSI" , "OSJ" , "OSK" , "OSL" , "OSM" , "OSN" , "OSO" , "OSP" ,
+"OSQ" , "OSR" , "OSS" , "OST" , "OSU" , "OSV" , "OSW" , "OSX" ,
+"OSY" , "OSZ" , "OS0" , "OS1" , "OS2" , "OS3" , "OS4" , "OS5" ,
+"OS6" , "OS7" , "OS8" , "OS9" , "OTA" , "OTB" , "OTC" , "OTD" ,
+"OTE" , "OTF" , "OTG" , "OTH" , "OTI" , "OTJ" , "OTK" , "OTL" ,
+"OTM" , "OTN" , "OTO" , "OTP" , "OTQ" , "OTR" , "OTS" , "OTT" ,
+"OTU" , "OTV" , "OTW" , "OTX" , "OTY" , "OTZ" , "OT0" , "OT1" ,
+"OT2" , "OT3" , "OT4" , "OT5" , "OT6" , "OT7" , "OT8" , "OT9" ,
+"OUA" , "OUB" , "OUC" , "OUD" , "OUE" , "OUF" , "OUG" , "OUH" ,
+"OUI" , "OUJ" , "OUK" , "OUL" , "OUM" , "OUN" , "OUO" , "OUP" ,
+"OUQ" , "OUR" , "OUS" , "OUT" , "OUU" , "OUV" , "OUW" , "OUX" ,
+"OUY" , "OUZ" , "OU0" , "OU1" , "OU2" , "OU3" , "OU4" , "OU5" ,
+"OU6" , "OU7" , "OU8" , "OU9" , "OVA" , "OVB" , "OVC" , "OVD" ,
+"OVE" , "OVF" , "OVG" , "OVH" , "OVI" , "OVJ" , "OVK" , "OVL" ,
+"OVM" , "OVN" , "OVO" , "OVP" , "OVQ" , "OVR" , "OVS" , "OVT" ,
+"OVU" , "OVV" , "OVW" , "OVX" , "OVY" , "OVZ" , "OV0" , "OV1" ,
+"OV2" , "OV3" , "OV4" , "OV5" , "OV6" , "OV7" , "OV8" , "OV9" ,
+"OWA" , "OWB" , "OWC" , "OWD" , "OWE" , "OWF" , "OWG" , "OWH" ,
+"OWI" , "OWJ" , "OWK" , "OWL" , "OWM" , "OWN" , "OWO" , "OWP" ,
+"OWQ" , "OWR" , "OWS" , "OWT" , "OWU" , "OWV" , "OWW" , "OWX" ,
+"OWY" , "OWZ" , "OW0" , "OW1" , "OW2" , "OW3" , "OW4" , "OW5" ,
+"OW6" , "OW7" , "OW8" , "OW9" , "OXA" , "OXB" , "OXC" , "OXD" ,
+"OXE" , "OXF" , "OXG" , "OXH" , "OXI" , "OXJ" , "OXK" , "OXL" ,
+"OXM" , "OXN" , "OXO" , "OXP" , "OXQ" , "OXR" , "OXS" , "OXT" ,
+"OXU" , "OXV" , "OXW" , "OXX" , "OXY" , "OXZ" , "OX0" , "OX1" ,
+"OX2" , "OX3" , "OX4" , "OX5" , "OX6" , "OX7" , "OX8" , "OX9" ,
+"OYA" , "OYB" , "OYC" , "OYD" , "OYE" , "OYF" , "OYG" , "OYH" ,
+"OYI" , "OYJ" , "OYK" , "OYL" , "OYM" , "OYN" , "OYO" , "OYP" ,
+"OYQ" , "OYR" , "OYS" , "OYT" , "OYU" , "OYV" , "OYW" , "OYX" ,
+"OYY" , "OYZ" , "OY0" , "OY1" , "OY2" , "OY3" , "OY4" , "OY5" ,
+"OY6" , "OY7" , "OY8" , "OY9" , "OZA" , "OZB" , "OZC" , "OZD" ,
+"OZE" , "OZF" , "OZG" , "OZH" , "OZI" , "OZJ" , "OZK" , "OZL" ,
+"OZM" , "OZN" , "OZO" , "OZP" , "OZQ" , "OZR" , "OZS" , "OZT" ,
+"OZU" , "OZV" , "OZW" , "OZX" , "OZY" , "OZZ" , "OZ0" , "OZ1" ,
+"OZ2" , "OZ3" , "OZ4" , "OZ5" , "OZ6" , "OZ7" , "OZ8" , "OZ9" ,
+"O0A" , "O0B" , "O0C" , "O0D" , "O0E" , "O0F" , "O0G" , "O0H" ,
+"O0I" , "O0J" , "O0K" , "O0L" , "O0M" , "O0N" , "O0O" , "O0P" ,
+"O0Q" , "O0R" , "O0S" , "O0T" , "O0U" , "O0V" , "O0W" , "O0X" ,
+"O0Y" , "O0Z" , "O00" , "O01" , "O02" , "O03" , "O04" , "O05" ,
+"O06" , "O07" , "O08" , "O09" , "O1A" , "O1B" , "O1C" , "O1D" ,
+"O1E" , "O1F" , "O1G" , "O1H" , "O1I" , "O1J" , "O1K" , "O1L" ,
+"O1M" , "O1N" , "O1O" , "O1P" , "O1Q" , "O1R" , "O1S" , "O1T" ,
+"O1U" , "O1V" , "O1W" , "O1X" , "O1Y" , "O1Z" , "O10" , "O11" ,
+"O12" , "O13" , "O14" , "O15" , "O16" , "O17" , "O18" , "O19" ,
+"O2A" , "O2B" , "O2C" , "O2D" , "O2E" , "O2F" , "O2G" , "O2H" ,
+"O2I" , "O2J" , "O2K" , "O2L" , "O2M" , "O2N" , "O2O" , "O2P" ,
+"O2Q" , "O2R" , "O2S" , "O2T" , "O2U" , "O2V" , "O2W" , "O2X" ,
+"O2Y" , "O2Z" , "O20" , "O21" , "O22" , "O23" , "O24" , "O25" ,
+"O26" , "O27" , "O28" , "O29" , "O3A" , "O3B" , "O3C" , "O3D" ,
+"O3E" , "O3F" , "O3G" , "O3H" , "O3I" , "O3J" , "O3K" , "O3L" ,
+"O3M" , "O3N" , "O3O" , "O3P" , "O3Q" , "O3R" , "O3S" , "O3T" ,
+"O3U" , "O3V" , "O3W" , "O3X" , "O3Y" , "O3Z" , "O30" , "O31" ,
+"O32" , "O33" , "O34" , "O35" , "O36" , "O37" , "O38" , "O39" ,
+"O4A" , "O4B" , "O4C" , "O4D" , "O4E" , "O4F" , "O4G" , "O4H" ,
+"O4I" , "O4J" , "O4K" , "O4L" , "O4M" , "O4N" , "O4O" , "O4P" ,
+"O4Q" , "O4R" , "O4S" , "O4T" , "O4U" , "O4V" , "O4W" , "O4X" ,
+"O4Y" , "O4Z" , "O40" , "O41" , "O42" , "O43" , "O44" , "O45" ,
+"O46" , "O47" , "O48" , "O49" , "O5A" , "O5B" , "O5C" , "O5D" ,
+"O5E" , "O5F" , "O5G" , "O5H" , "O5I" , "O5J" , "O5K" , "O5L" ,
+"O5M" , "O5N" , "O5O" , "O5P" , "O5Q" , "O5R" , "O5S" , "O5T" ,
+"O5U" , "O5V" , "O5W" , "O5X" , "O5Y" , "O5Z" , "O50" , "O51" ,
+"O52" , "O53" , "O54" , "O55" , "O56" , "O57" , "O58" , "O59" ,
+"O6A" , "O6B" , "O6C" , "O6D" , "O6E" , "O6F" , "O6G" , "O6H" ,
+"O6I" , "O6J" , "O6K" , "O6L" , "O6M" , "O6N" , "O6O" , "O6P" ,
+"O6Q" , "O6R" , "O6S" , "O6T" , "O6U" , "O6V" , "O6W" , "O6X" ,
+"O6Y" , "O6Z" , "O60" , "O61" , "O62" , "O63" , "O64" , "O65" ,
+"O66" , "O67" , "O68" , "O69" , "O7A" , "O7B" , "O7C" , "O7D" ,
+"O7E" , "O7F" , "O7G" , "O7H" , "O7I" , "O7J" , "O7K" , "O7L" ,
+"O7M" , "O7N" , "O7O" , "O7P" , "O7Q" , "O7R" , "O7S" , "O7T" ,
+"O7U" , "O7V" , "O7W" , "O7X" , "O7Y" , "O7Z" , "O70" , "O71" ,
+"O72" , "O73" , "O74" , "O75" , "O76" , "O77" , "O78" , "O79" ,
+"O8A" , "O8B" , "O8C" , "O8D" , "O8E" , "O8F" , "O8G" , "O8H" ,
+"O8I" , "O8J" , "O8K" , "O8L" , "O8M" , "O8N" , "O8O" , "O8P" ,
+"O8Q" , "O8R" , "O8S" , "O8T" , "O8U" , "O8V" , "O8W" , "O8X" ,
+"O8Y" , "O8Z" , "O80" , "O81" , "O82" , "O83" , "O84" , "O85" ,
+"O86" , "O87" , "O88" , "O89" , "O9A" , "O9B" , "O9C" , "O9D" ,
+"O9E" , "O9F" , "O9G" , "O9H" , "O9I" , "O9J" , "O9K" , "O9L" ,
+"O9M" , "O9N" , "O9O" , "O9P" , "O9Q" , "O9R" , "O9S" , "O9T" ,
+"O9U" , "O9V" , "O9W" , "O9X" , "O9Y" , "O9Z" , "O90" , "O91" ,
+"O92" , "O93" , "O94" , "O95" , "O96" , "O97" , "O98" , "O99" ,
+"PAA" , "PAB" , "PAC" , "PAD" , "PAE" , "PAF" , "PAG" , "PAH" ,
+"PAI" , "PAJ" , "PAK" , "PAL" , "PAM" , "PAN" , "PAO" , "PAP" ,
+"PAQ" , "PAR" , "PAS" , "PAT" , "PAU" , "PAV" , "PAW" , "PAX" ,
+"PAY" , "PAZ" , "PA0" , "PA1" , "PA2" , "PA3" , "PA4" , "PA5" ,
+"PA6" , "PA7" , "PA8" , "PA9" , "PBA" , "PBB" , "PBC" , "PBD" ,
+"PBE" , "PBF" , "PBG" , "PBH" , "PBI" , "PBJ" , "PBK" , "PBL" ,
+"PBM" , "PBN" , "PBO" , "PBP" , "PBQ" , "PBR" , "PBS" , "PBT" ,
+"PBU" , "PBV" , "PBW" , "PBX" , "PBY" , "PBZ" , "PB0" , "PB1" ,
+"PB2" , "PB3" , "PB4" , "PB5" , "PB6" , "PB7" , "PB8" , "PB9" ,
+"PCA" , "PCB" , "PCC" , "PCD" , "PCE" , "PCF" , "PCG" , "PCH" ,
+"PCI" , "PCJ" , "PCK" , "PCL" , "PCM" , "PCN" , "PCO" , "PCP" ,
+"PCQ" , "PCR" , "PCS" , "PCT" , "PCU" , "PCV" , "PCW" , "PCX" ,
+"PCY" , "PCZ" , "PC0" , "PC1" , "PC2" , "PC3" , "PC4" , "PC5" ,
+"PC6" , "PC7" , "PC8" , "PC9" , "PDA" , "PDB" , "PDC" , "PDD" ,
+"PDE" , "PDF" , "PDG" , "PDH" , "PDI" , "PDJ" , "PDK" , "PDL" ,
+"PDM" , "PDN" , "PDO" , "PDP" , "PDQ" , "PDR" , "PDS" , "PDT" ,
+"PDU" , "PDV" , "PDW" , "PDX" , "PDY" , "PDZ" , "PD0" , "PD1" ,
+"PD2" , "PD3" , "PD4" , "PD5" , "PD6" , "PD7" , "PD8" , "PD9" ,
+"PEA" , "PEB" , "PEC" , "PED" , "PEE" , "PEF" , "PEG" , "PEH" ,
+"PEI" , "PEJ" , "PEK" , "PEL" , "PEM" , "PEN" , "PEO" , "PEP" ,
+"PEQ" , "PER" , "PES" , "PET" , "PEU" , "PEV" , "PEW" , "PEX" ,
+"PEY" , "PEZ" , "PE0" , "PE1" , "PE2" , "PE3" , "PE4" , "PE5" ,
+"PE6" , "PE7" , "PE8" , "PE9" , "PFA" , "PFB" , "PFC" , "PFD" ,
+"PFE" , "PFF" , "PFG" , "PFH" , "PFI" , "PFJ" , "PFK" , "PFL" ,
+"PFM" , "PFN" , "PFO" , "PFP" , "PFQ" , "PFR" , "PFS" , "PFT" ,
+"PFU" , "PFV" , "PFW" , "PFX" , "PFY" , "PFZ" , "PF0" , "PF1" ,
+"PF2" , "PF3" , "PF4" , "PF5" , "PF6" , "PF7" , "PF8" , "PF9" ,
+"PGA" , "PGB" , "PGC" , "PGD" , "PGE" , "PGF" , "PGG" , "PGH" ,
+"PGI" , "PGJ" , "PGK" , "PGL" , "PGM" , "PGN" , "PGO" , "PGP" ,
+"PGQ" , "PGR" , "PGS" , "PGT" , "PGU" , "PGV" , "PGW" , "PGX" ,
+"PGY" , "PGZ" , "PG0" , "PG1" , "PG2" , "PG3" , "PG4" , "PG5" ,
+"PG6" , "PG7" , "PG8" , "PG9" , "PHA" , "PHB" , "PHC" , "PHD" ,
+"PHE" , "PHF" , "PHG" , "PHH" , "PHI" , "PHJ" , "PHK" , "PHL" ,
+"PHM" , "PHN" , "PHO" , "PHP" , "PHQ" , "PHR" , "PHS" , "PHT" ,
+"PHU" , "PHV" , "PHW" , "PHX" , "PHY" , "PHZ" , "PH0" , "PH1" ,
+"PH2" , "PH3" , "PH4" , "PH5" , "PH6" , "PH7" , "PH8" , "PH9" ,
+"PIA" , "PIB" , "PIC" , "PID" , "PIE" , "PIF" , "PIG" , "PIH" ,
+"PII" , "PIJ" , "PIK" , "PIL" , "PIM" , "PIN" , "PIO" , "PIP" ,
+"PIQ" , "PIR" , "PIS" , "PIT" , "PIU" , "PIV" , "PIW" , "PIX" ,
+"PIY" , "PIZ" , "PI0" , "PI1" , "PI2" , "PI3" , "PI4" , "PI5" ,
+"PI6" , "PI7" , "PI8" , "PI9" , "PJA" , "PJB" , "PJC" , "PJD" ,
+"PJE" , "PJF" , "PJG" , "PJH" , "PJI" , "PJJ" , "PJK" , "PJL" ,
+"PJM" , "PJN" , "PJO" , "PJP" , "PJQ" , "PJR" , "PJS" , "PJT" ,
+"PJU" , "PJV" , "PJW" , "PJX" , "PJY" , "PJZ" , "PJ0" , "PJ1" ,
+"PJ2" , "PJ3" , "PJ4" , "PJ5" , "PJ6" , "PJ7" , "PJ8" , "PJ9" ,
+"PKA" , "PKB" , "PKC" , "PKD" , "PKE" , "PKF" , "PKG" , "PKH" ,
+"PKI" , "PKJ" , "PKK" , "PKL" , "PKM" , "PKN" , "PKO" , "PKP" ,
+"PKQ" , "PKR" , "PKS" , "PKT" , "PKU" , "PKV" , "PKW" , "PKX" ,
+"PKY" , "PKZ" , "PK0" , "PK1" , "PK2" , "PK3" , "PK4" , "PK5" ,
+"PK6" , "PK7" , "PK8" , "PK9" , "PLA" , "PLB" , "PLC" , "PLD" ,
+"PLE" , "PLF" , "PLG" , "PLH" , "PLI" , "PLJ" , "PLK" , "PLL" ,
+"PLM" , "PLN" , "PLO" , "PLP" , "PLQ" , "PLR" , "PLS" , "PLT" ,
+"PLU" , "PLV" , "PLW" , "PLX" , "PLY" , "PLZ" , "PL0" , "PL1" ,
+"PL2" , "PL3" , "PL4" , "PL5" , "PL6" , "PL7" , "PL8" , "PL9" ,
+"PMA" , "PMB" , "PMC" , "PMD" , "PME" , "PMF" , "PMG" , "PMH" ,
+"PMI" , "PMJ" , "PMK" , "PML" , "PMM" , "PMN" , "PMO" , "PMP" ,
+"PMQ" , "PMR" , "PMS" , "PMT" , "PMU" , "PMV" , "PMW" , "PMX" ,
+"PMY" , "PMZ" , "PM0" , "PM1" , "PM2" , "PM3" , "PM4" , "PM5" ,
+"PM6" , "PM7" , "PM8" , "PM9" , "PNA" , "PNB" , "PNC" , "PND" ,
+"PNE" , "PNF" , "PNG" , "PNH" , "PNI" , "PNJ" , "PNK" , "PNL" ,
+"PNM" , "PNN" , "PNO" , "PNP" , "PNQ" , "PNR" , "PNS" , "PNT" ,
+"PNU" , "PNV" , "PNW" , "PNX" , "PNY" , "PNZ" , "PN0" , "PN1" ,
+"PN2" , "PN3" , "PN4" , "PN5" , "PN6" , "PN7" , "PN8" , "PN9" ,
+"POA" , "POB" , "POC" , "POD" , "POE" , "POF" , "POG" , "POH" ,
+"POI" , "POJ" , "POK" , "POL" , "POM" , "PON" , "POO" , "POP" ,
+"POQ" , "POR" , "POS" , "POT" , "POU" , "POV" , "POW" , "POX" ,
+"POY" , "POZ" , "PO0" , "PO1" , "PO2" , "PO3" , "PO4" , "PO5" ,
+"PO6" , "PO7" , "PO8" , "PO9" , "PPA" , "PPB" , "PPC" , "PPD" ,
+"PPE" , "PPF" , "PPG" , "PPH" , "PPI" , "PPJ" , "PPK" , "PPL" ,
+"PPM" , "PPN" , "PPO" , "PPP" , "PPQ" , "PPR" , "PPS" , "PPT" ,
+"PPU" , "PPV" , "PPW" , "PPX" , "PPY" , "PPZ" , "PP0" , "PP1" ,
+"PP2" , "PP3" , "PP4" , "PP5" , "PP6" , "PP7" , "PP8" , "PP9" ,
+"PQA" , "PQB" , "PQC" , "PQD" , "PQE" , "PQF" , "PQG" , "PQH" ,
+"PQI" , "PQJ" , "PQK" , "PQL" , "PQM" , "PQN" , "PQO" , "PQP" ,
+"PQQ" , "PQR" , "PQS" , "PQT" , "PQU" , "PQV" , "PQW" , "PQX" ,
+"PQY" , "PQZ" , "PQ0" , "PQ1" , "PQ2" , "PQ3" , "PQ4" , "PQ5" ,
+"PQ6" , "PQ7" , "PQ8" , "PQ9" , "PRA" , "PRB" , "PRC" , "PRD" ,
+"PRE" , "PRF" , "PRG" , "PRH" , "PRI" , "PRJ" , "PRK" , "PRL" ,
+"PRM" , "PRN" , "PRO" , "PRP" , "PRQ" , "PRR" , "PRS" , "PRT" ,
+"PRU" , "PRV" , "PRW" , "PRX" , "PRY" , "PRZ" , "PR0" , "PR1" ,
+"PR2" , "PR3" , "PR4" , "PR5" , "PR6" , "PR7" , "PR8" , "PR9" ,
+"PSA" , "PSB" , "PSC" , "PSD" , "PSE" , "PSF" , "PSG" , "PSH" ,
+"PSI" , "PSJ" , "PSK" , "PSL" , "PSM" , "PSN" , "PSO" , "PSP" ,
+"PSQ" , "PSR" , "PSS" , "PST" , "PSU" , "PSV" , "PSW" , "PSX" ,
+"PSY" , "PSZ" , "PS0" , "PS1" , "PS2" , "PS3" , "PS4" , "PS5" ,
+"PS6" , "PS7" , "PS8" , "PS9" , "PTA" , "PTB" , "PTC" , "PTD" ,
+"PTE" , "PTF" , "PTG" , "PTH" , "PTI" , "PTJ" , "PTK" , "PTL" ,
+"PTM" , "PTN" , "PTO" , "PTP" , "PTQ" , "PTR" , "PTS" , "PTT" ,
+"PTU" , "PTV" , "PTW" , "PTX" , "PTY" , "PTZ" , "PT0" , "PT1" ,
+"PT2" , "PT3" , "PT4" , "PT5" , "PT6" , "PT7" , "PT8" , "PT9" ,
+"PUA" , "PUB" , "PUC" , "PUD" , "PUE" , "PUF" , "PUG" , "PUH" ,
+"PUI" , "PUJ" , "PUK" , "PUL" , "PUM" , "PUN" , "PUO" , "PUP" ,
+"PUQ" , "PUR" , "PUS" , "PUT" , "PUU" , "PUV" , "PUW" , "PUX" ,
+"PUY" , "PUZ" , "PU0" , "PU1" , "PU2" , "PU3" , "PU4" , "PU5" ,
+"PU6" , "PU7" , "PU8" , "PU9" , "PVA" , "PVB" , "PVC" , "PVD" ,
+"PVE" , "PVF" , "PVG" , "PVH" , "PVI" , "PVJ" , "PVK" , "PVL" ,
+"PVM" , "PVN" , "PVO" , "PVP" , "PVQ" , "PVR" , "PVS" , "PVT" ,
+"PVU" , "PVV" , "PVW" , "PVX" , "PVY" , "PVZ" , "PV0" , "PV1" ,
+"PV2" , "PV3" , "PV4" , "PV5" , "PV6" , "PV7" , "PV8" , "PV9" ,
+"PWA" , "PWB" , "PWC" , "PWD" , "PWE" , "PWF" , "PWG" , "PWH" ,
+"PWI" , "PWJ" , "PWK" , "PWL" , "PWM" , "PWN" , "PWO" , "PWP" ,
+"PWQ" , "PWR" , "PWS" , "PWT" , "PWU" , "PWV" , "PWW" , "PWX" ,
+"PWY" , "PWZ" , "PW0" , "PW1" , "PW2" , "PW3" , "PW4" , "PW5" ,
+"PW6" , "PW7" , "PW8" , "PW9" , "PXA" , "PXB" , "PXC" , "PXD" ,
+"PXE" , "PXF" , "PXG" , "PXH" , "PXI" , "PXJ" , "PXK" , "PXL" ,
+"PXM" , "PXN" , "PXO" , "PXP" , "PXQ" , "PXR" , "PXS" , "PXT" ,
+"PXU" , "PXV" , "PXW" , "PXX" , "PXY" , "PXZ" , "PX0" , "PX1" ,
+"PX2" , "PX3" , "PX4" , "PX5" , "PX6" , "PX7" , "PX8" , "PX9" ,
+"PYA" , "PYB" , "PYC" , "PYD" , "PYE" , "PYF" , "PYG" , "PYH" ,
+"PYI" , "PYJ" , "PYK" , "PYL" , "PYM" , "PYN" , "PYO" , "PYP" ,
+"PYQ" , "PYR" , "PYS" , "PYT" , "PYU" , "PYV" , "PYW" , "PYX" ,
+"PYY" , "PYZ" , "PY0" , "PY1" , "PY2" , "PY3" , "PY4" , "PY5" ,
+"PY6" , "PY7" , "PY8" , "PY9" , "PZA" , "PZB" , "PZC" , "PZD" ,
+"PZE" , "PZF" , "PZG" , "PZH" , "PZI" , "PZJ" , "PZK" , "PZL" ,
+"PZM" , "PZN" , "PZO" , "PZP" , "PZQ" , "PZR" , "PZS" , "PZT" ,
+"PZU" , "PZV" , "PZW" , "PZX" , "PZY" , "PZZ" , "PZ0" , "PZ1" ,
+"PZ2" , "PZ3" , "PZ4" , "PZ5" , "PZ6" , "PZ7" , "PZ8" , "PZ9" ,
+"P0A" , "P0B" , "P0C" , "P0D" , "P0E" , "P0F" , "P0G" , "P0H" ,
+"P0I" , "P0J" , "P0K" , "P0L" , "P0M" , "P0N" , "P0O" , "P0P" ,
+"P0Q" , "P0R" , "P0S" , "P0T" , "P0U" , "P0V" , "P0W" , "P0X" ,
+"P0Y" , "P0Z" , "P00" , "P01" , "P02" , "P03" , "P04" , "P05" ,
+"P06" , "P07" , "P08" , "P09" , "P1A" , "P1B" , "P1C" , "P1D" ,
+"P1E" , "P1F" , "P1G" , "P1H" , "P1I" , "P1J" , "P1K" , "P1L" ,
+"P1M" , "P1N" , "P1O" , "P1P" , "P1Q" , "P1R" , "P1S" , "P1T" ,
+"P1U" , "P1V" , "P1W" , "P1X" , "P1Y" , "P1Z" , "P10" , "P11" ,
+"P12" , "P13" , "P14" , "P15" , "P16" , "P17" , "P18" , "P19" ,
+"P2A" , "P2B" , "P2C" , "P2D" , "P2E" , "P2F" , "P2G" , "P2H" ,
+"P2I" , "P2J" , "P2K" , "P2L" , "P2M" , "P2N" , "P2O" , "P2P" ,
+"P2Q" , "P2R" , "P2S" , "P2T" , "P2U" , "P2V" , "P2W" , "P2X" ,
+"P2Y" , "P2Z" , "P20" , "P21" , "P22" , "P23" , "P24" , "P25" ,
+"P26" , "P27" , "P28" , "P29" , "P3A" , "P3B" , "P3C" , "P3D" ,
+"P3E" , "P3F" , "P3G" , "P3H" , "P3I" , "P3J" , "P3K" , "P3L" ,
+"P3M" , "P3N" , "P3O" , "P3P" , "P3Q" , "P3R" , "P3S" , "P3T" ,
+"P3U" , "P3V" , "P3W" , "P3X" , "P3Y" , "P3Z" , "P30" , "P31" ,
+"P32" , "P33" , "P34" , "P35" , "P36" , "P37" , "P38" , "P39" ,
+"P4A" , "P4B" , "P4C" , "P4D" , "P4E" , "P4F" , "P4G" , "P4H" ,
+"P4I" , "P4J" , "P4K" , "P4L" , "P4M" , "P4N" , "P4O" , "P4P" ,
+"P4Q" , "P4R" , "P4S" , "P4T" , "P4U" , "P4V" , "P4W" , "P4X" ,
+"P4Y" , "P4Z" , "P40" , "P41" , "P42" , "P43" , "P44" , "P45" ,
+"P46" , "P47" , "P48" , "P49" , "P5A" , "P5B" , "P5C" , "P5D" ,
+"P5E" , "P5F" , "P5G" , "P5H" , "P5I" , "P5J" , "P5K" , "P5L" ,
+"P5M" , "P5N" , "P5O" , "P5P" , "P5Q" , "P5R" , "P5S" , "P5T" ,
+"P5U" , "P5V" , "P5W" , "P5X" , "P5Y" , "P5Z" , "P50" , "P51" ,
+"P52" , "P53" , "P54" , "P55" , "P56" , "P57" , "P58" , "P59" ,
+"P6A" , "P6B" , "P6C" , "P6D" , "P6E" , "P6F" , "P6G" , "P6H" ,
+"P6I" , "P6J" , "P6K" , "P6L" , "P6M" , "P6N" , "P6O" , "P6P" ,
+"P6Q" , "P6R" , "P6S" , "P6T" , "P6U" , "P6V" , "P6W" , "P6X" ,
+"P6Y" , "P6Z" , "P60" , "P61" , "P62" , "P63" , "P64" , "P65" ,
+"P66" , "P67" , "P68" , "P69" , "P7A" , "P7B" , "P7C" , "P7D" ,
+"P7E" , "P7F" , "P7G" , "P7H" , "P7I" , "P7J" , "P7K" , "P7L" ,
+"P7M" , "P7N" , "P7O" , "P7P" , "P7Q" , "P7R" , "P7S" , "P7T" ,
+"P7U" , "P7V" , "P7W" , "P7X" , "P7Y" , "P7Z" , "P70" , "P71" ,
+"P72" , "P73" , "P74" , "P75" , "P76" , "P77" , "P78" , "P79" ,
+"P8A" , "P8B" , "P8C" , "P8D" , "P8E" , "P8F" , "P8G" , "P8H" ,
+"P8I" , "P8J" , "P8K" , "P8L" , "P8M" , "P8N" , "P8O" , "P8P" ,
+"P8Q" , "P8R" , "P8S" , "P8T" , "P8U" , "P8V" , "P8W" , "P8X" ,
+"P8Y" , "P8Z" , "P80" , "P81" , "P82" , "P83" , "P84" , "P85" ,
+"P86" , "P87" , "P88" , "P89" , "P9A" , "P9B" , "P9C" , "P9D" ,
+"P9E" , "P9F" , "P9G" , "P9H" , "P9I" , "P9J" , "P9K" , "P9L" ,
+"P9M" , "P9N" , "P9O" , "P9P" , "P9Q" , "P9R" , "P9S" , "P9T" ,
+"P9U" , "P9V" , "P9W" , "P9X" , "P9Y" , "P9Z" , "P90" , "P91" ,
+"P92" , "P93" , "P94" , "P95" , "P96" , "P97" , "P98" , "P99" ,
+"QAA" , "QAB" , "QAC" , "QAD" , "QAE" , "QAF" , "QAG" , "QAH" ,
+"QAI" , "QAJ" , "QAK" , "QAL" , "QAM" , "QAN" , "QAO" , "QAP" ,
+"QAQ" , "QAR" , "QAS" , "QAT" , "QAU" , "QAV" , "QAW" , "QAX" ,
+"QAY" , "QAZ" , "QA0" , "QA1" , "QA2" , "QA3" , "QA4" , "QA5" ,
+"QA6" , "QA7" , "QA8" , "QA9" , "QBA" , "QBB" , "QBC" , "QBD" ,
+"QBE" , "QBF" , "QBG" , "QBH" , "QBI" , "QBJ" , "QBK" , "QBL" ,
+"QBM" , "QBN" , "QBO" , "QBP" , "QBQ" , "QBR" , "QBS" , "QBT" ,
+"QBU" , "QBV" , "QBW" , "QBX" , "QBY" , "QBZ" , "QB0" , "QB1" ,
+"QB2" , "QB3" , "QB4" , "QB5" , "QB6" , "QB7" , "QB8" , "QB9" ,
+"QCA" , "QCB" , "QCC" , "QCD" , "QCE" , "QCF" , "QCG" , "QCH" ,
+"QCI" , "QCJ" , "QCK" , "QCL" , "QCM" , "QCN" , "QCO" , "QCP" ,
+"QCQ" , "QCR" , "QCS" , "QCT" , "QCU" , "QCV" , "QCW" , "QCX" ,
+"QCY" , "QCZ" , "QC0" , "QC1" , "QC2" , "QC3" , "QC4" , "QC5" ,
+"QC6" , "QC7" , "QC8" , "QC9" , "QDA" , "QDB" , "QDC" , "QDD" ,
+"QDE" , "QDF" , "QDG" , "QDH" , "QDI" , "QDJ" , "QDK" , "QDL" ,
+"QDM" , "QDN" , "QDO" , "QDP" , "QDQ" , "QDR" , "QDS" , "QDT" ,
+"QDU" , "QDV" , "QDW" , "QDX" , "QDY" , "QDZ" , "QD0" , "QD1" ,
+"QD2" , "QD3" , "QD4" , "QD5" , "QD6" , "QD7" , "QD8" , "QD9" ,
+"QEA" , "QEB" , "QEC" , "QED" , "QEE" , "QEF" , "QEG" , "QEH" ,
+"QEI" , "QEJ" , "QEK" , "QEL" , "QEM" , "QEN" , "QEO" , "QEP" ,
+"QEQ" , "QER" , "QES" , "QET" , "QEU" , "QEV" , "QEW" , "QEX" ,
+"QEY" , "QEZ" , "QE0" , "QE1" , "QE2" , "QE3" , "QE4" , "QE5" ,
+"QE6" , "QE7" , "QE8" , "QE9" , "QFA" , "QFB" , "QFC" , "QFD" ,
+"QFE" , "QFF" , "QFG" , "QFH" , "QFI" , "QFJ" , "QFK" , "QFL" ,
+"QFM" , "QFN" , "QFO" , "QFP" , "QFQ" , "QFR" , "QFS" , "QFT" ,
+"QFU" , "QFV" , "QFW" , "QFX" , "QFY" , "QFZ" , "QF0" , "QF1" ,
+"QF2" , "QF3" , "QF4" , "QF5" , "QF6" , "QF7" , "QF8" , "QF9" ,
+"QGA" , "QGB" , "QGC" , "QGD" , "QGE" , "QGF" , "QGG" , "QGH" ,
+"QGI" , "QGJ" , "QGK" , "QGL" , "QGM" , "QGN" , "QGO" , "QGP" ,
+"QGQ" , "QGR" , "QGS" , "QGT" , "QGU" , "QGV" , "QGW" , "QGX" ,
+"QGY" , "QGZ" , "QG0" , "QG1" , "QG2" , "QG3" , "QG4" , "QG5" ,
+"QG6" , "QG7" , "QG8" , "QG9" , "QHA" , "QHB" , "QHC" , "QHD" ,
+"QHE" , "QHF" , "QHG" , "QHH" , "QHI" , "QHJ" , "QHK" , "QHL" ,
+"QHM" , "QHN" , "QHO" , "QHP" , "QHQ" , "QHR" , "QHS" , "QHT" ,
+"QHU" , "QHV" , "QHW" , "QHX" , "QHY" , "QHZ" , "QH0" , "QH1" ,
+"QH2" , "QH3" , "QH4" , "QH5" , "QH6" , "QH7" , "QH8" , "QH9" ,
+"QIA" , "QIB" , "QIC" , "QID" , "QIE" , "QIF" , "QIG" , "QIH" ,
+"QII" , "QIJ" , "QIK" , "QIL" , "QIM" , "QIN" , "QIO" , "QIP" ,
+"QIQ" , "QIR" , "QIS" , "QIT" , "QIU" , "QIV" , "QIW" , "QIX" ,
+"QIY" , "QIZ" , "QI0" , "QI1" , "QI2" , "QI3" , "QI4" , "QI5" ,
+"QI6" , "QI7" , "QI8" , "QI9" , "QJA" , "QJB" , "QJC" , "QJD" ,
+"QJE" , "QJF" , "QJG" , "QJH" , "QJI" , "QJJ" , "QJK" , "QJL" ,
+"QJM" , "QJN" , "QJO" , "QJP" , "QJQ" , "QJR" , "QJS" , "QJT" ,
+"QJU" , "QJV" , "QJW" , "QJX" , "QJY" , "QJZ" , "QJ0" , "QJ1" ,
+"QJ2" , "QJ3" , "QJ4" , "QJ5" , "QJ6" , "QJ7" , "QJ8" , "QJ9" ,
+"QKA" , "QKB" , "QKC" , "QKD" , "QKE" , "QKF" , "QKG" , "QKH" ,
+"QKI" , "QKJ" , "QKK" , "QKL" , "QKM" , "QKN" , "QKO" , "QKP" ,
+"QKQ" , "QKR" , "QKS" , "QKT" , "QKU" , "QKV" , "QKW" , "QKX" ,
+"QKY" , "QKZ" , "QK0" , "QK1" , "QK2" , "QK3" , "QK4" , "QK5" ,
+"QK6" , "QK7" , "QK8" , "QK9" , "QLA" , "QLB" , "QLC" , "QLD" ,
+"QLE" , "QLF" , "QLG" , "QLH" , "QLI" , "QLJ" , "QLK" , "QLL" ,
+"QLM" , "QLN" , "QLO" , "QLP" , "QLQ" , "QLR" , "QLS" , "QLT" ,
+"QLU" , "QLV" , "QLW" , "QLX" , "QLY" , "QLZ" , "QL0" , "QL1" ,
+"QL2" , "QL3" , "QL4" , "QL5" , "QL6" , "QL7" , "QL8" , "QL9" ,
+"QMA" , "QMB" , "QMC" , "QMD" , "QME" , "QMF" , "QMG" , "QMH" ,
+"QMI" , "QMJ" , "QMK" , "QML" , "QMM" , "QMN" , "QMO" , "QMP" ,
+"QMQ" , "QMR" , "QMS" , "QMT" , "QMU" , "QMV" , "QMW" , "QMX" ,
+"QMY" , "QMZ" , "QM0" , "QM1" , "QM2" , "QM3" , "QM4" , "QM5" ,
+"QM6" , "QM7" , "QM8" , "QM9" , "QNA" , "QNB" , "QNC" , "QND" ,
+"QNE" , "QNF" , "QNG" , "QNH" , "QNI" , "QNJ" , "QNK" , "QNL" ,
+"QNM" , "QNN" , "QNO" , "QNP" , "QNQ" , "QNR" , "QNS" , "QNT" ,
+"QNU" , "QNV" , "QNW" , "QNX" , "QNY" , "QNZ" , "QN0" , "QN1" ,
+"QN2" , "QN3" , "QN4" , "QN5" , "QN6" , "QN7" , "QN8" , "QN9" ,
+"QOA" , "QOB" , "QOC" , "QOD" , "QOE" , "QOF" , "QOG" , "QOH" ,
+"QOI" , "QOJ" , "QOK" , "QOL" , "QOM" , "QON" , "QOO" , "QOP" ,
+"QOQ" , "QOR" , "QOS" , "QOT" , "QOU" , "QOV" , "QOW" , "QOX" ,
+"QOY" , "QOZ" , "QO0" , "QO1" , "QO2" , "QO3" , "QO4" , "QO5" ,
+"QO6" , "QO7" , "QO8" , "QO9" , "QPA" , "QPB" , "QPC" , "QPD" ,
+"QPE" , "QPF" , "QPG" , "QPH" , "QPI" , "QPJ" , "QPK" , "QPL" ,
+"QPM" , "QPN" , "QPO" , "QPP" , "QPQ" , "QPR" , "QPS" , "QPT" ,
+"QPU" , "QPV" , "QPW" , "QPX" , "QPY" , "QPZ" , "QP0" , "QP1" ,
+"QP2" , "QP3" , "QP4" , "QP5" , "QP6" , "QP7" , "QP8" , "QP9" ,
+"QQA" , "QQB" , "QQC" , "QQD" , "QQE" , "QQF" , "QQG" , "QQH" ,
+"QQI" , "QQJ" , "QQK" , "QQL" , "QQM" , "QQN" , "QQO" , "QQP" ,
+"QQQ" , "QQR" , "QQS" , "QQT" , "QQU" , "QQV" , "QQW" , "QQX" ,
+"QQY" , "QQZ" , "QQ0" , "QQ1" , "QQ2" , "QQ3" , "QQ4" , "QQ5" ,
+"QQ6" , "QQ7" , "QQ8" , "QQ9" , "QRA" , "QRB" , "QRC" , "QRD" ,
+"QRE" , "QRF" , "QRG" , "QRH" , "QRI" , "QRJ" , "QRK" , "QRL" ,
+"QRM" , "QRN" , "QRO" , "QRP" , "QRQ" , "QRR" , "QRS" , "QRT" ,
+"QRU" , "QRV" , "QRW" , "QRX" , "QRY" , "QRZ" , "QR0" , "QR1" ,
+"QR2" , "QR3" , "QR4" , "QR5" , "QR6" , "QR7" , "QR8" , "QR9" ,
+"QSA" , "QSB" , "QSC" , "QSD" , "QSE" , "QSF" , "QSG" , "QSH" ,
+"QSI" , "QSJ" , "QSK" , "QSL" , "QSM" , "QSN" , "QSO" , "QSP" ,
+"QSQ" , "QSR" , "QSS" , "QST" , "QSU" , "QSV" , "QSW" , "QSX" ,
+"QSY" , "QSZ" , "QS0" , "QS1" , "QS2" , "QS3" , "QS4" , "QS5" ,
+"QS6" , "QS7" , "QS8" , "QS9" , "QTA" , "QTB" , "QTC" , "QTD" ,
+"QTE" , "QTF" , "QTG" , "QTH" , "QTI" , "QTJ" , "QTK" , "QTL" ,
+"QTM" , "QTN" , "QTO" , "QTP" , "QTQ" , "QTR" , "QTS" , "QTT" ,
+"QTU" , "QTV" , "QTW" , "QTX" , "QTY" , "QTZ" , "QT0" , "QT1" ,
+"QT2" , "QT3" , "QT4" , "QT5" , "QT6" , "QT7" , "QT8" , "QT9" ,
+"QUA" , "QUB" , "QUC" , "QUD" , "QUE" , "QUF" , "QUG" , "QUH" ,
+"QUI" , "QUJ" , "QUK" , "QUL" , "QUM" , "QUN" , "QUO" , "QUP" ,
+"QUQ" , "QUR" , "QUS" , "QUT" , "QUU" , "QUV" , "QUW" , "QUX" ,
+"QUY" , "QUZ" , "QU0" , "QU1" , "QU2" , "QU3" , "QU4" , "QU5" ,
+"QU6" , "QU7" , "QU8" , "QU9" , "QVA" , "QVB" , "QVC" , "QVD" ,
+"QVE" , "QVF" , "QVG" , "QVH" , "QVI" , "QVJ" , "QVK" , "QVL" ,
+"QVM" , "QVN" , "QVO" , "QVP" , "QVQ" , "QVR" , "QVS" , "QVT" ,
+"QVU" , "QVV" , "QVW" , "QVX" , "QVY" , "QVZ" , "QV0" , "QV1" ,
+"QV2" , "QV3" , "QV4" , "QV5" , "QV6" , "QV7" , "QV8" , "QV9" ,
+"QWA" , "QWB" , "QWC" , "QWD" , "QWE" , "QWF" , "QWG" , "QWH" ,
+"QWI" , "QWJ" , "QWK" , "QWL" , "QWM" , "QWN" , "QWO" , "QWP" ,
+"QWQ" , "QWR" , "QWS" , "QWT" , "QWU" , "QWV" , "QWW" , "QWX" ,
+"QWY" , "QWZ" , "QW0" , "QW1" , "QW2" , "QW3" , "QW4" , "QW5" ,
+"QW6" , "QW7" , "QW8" , "QW9" , "QXA" , "QXB" , "QXC" , "QXD" ,
+"QXE" , "QXF" , "QXG" , "QXH" , "QXI" , "QXJ" , "QXK" , "QXL" ,
+"QXM" , "QXN" , "QXO" , "QXP" , "QXQ" , "QXR" , "QXS" , "QXT" ,
+"QXU" , "QXV" , "QXW" , "QXX" , "QXY" , "QXZ" , "QX0" , "QX1" ,
+"QX2" , "QX3" , "QX4" , "QX5" , "QX6" , "QX7" , "QX8" , "QX9" ,
+"QYA" , "QYB" , "QYC" , "QYD" , "QYE" , "QYF" , "QYG" , "QYH" ,
+"QYI" , "QYJ" , "QYK" , "QYL" , "QYM" , "QYN" , "QYO" , "QYP" ,
+"QYQ" , "QYR" , "QYS" , "QYT" , "QYU" , "QYV" , "QYW" , "QYX" ,
+"QYY" , "QYZ" , "QY0" , "QY1" , "QY2" , "QY3" , "QY4" , "QY5" ,
+"QY6" , "QY7" , "QY8" , "QY9" , "QZA" , "QZB" , "QZC" , "QZD" ,
+"QZE" , "QZF" , "QZG" , "QZH" , "QZI" , "QZJ" , "QZK" , "QZL" ,
+"QZM" , "QZN" , "QZO" , "QZP" , "QZQ" , "QZR" , "QZS" , "QZT" ,
+"QZU" , "QZV" , "QZW" , "QZX" , "QZY" , "QZZ" , "QZ0" , "QZ1" ,
+"QZ2" , "QZ3" , "QZ4" , "QZ5" , "QZ6" , "QZ7" , "QZ8" , "QZ9" ,
+"Q0A" , "Q0B" , "Q0C" , "Q0D" , "Q0E" , "Q0F" , "Q0G" , "Q0H" ,
+"Q0I" , "Q0J" , "Q0K" , "Q0L" , "Q0M" , "Q0N" , "Q0O" , "Q0P" ,
+"Q0Q" , "Q0R" , "Q0S" , "Q0T" , "Q0U" , "Q0V" , "Q0W" , "Q0X" ,
+"Q0Y" , "Q0Z" , "Q00" , "Q01" , "Q02" , "Q03" , "Q04" , "Q05" ,
+"Q06" , "Q07" , "Q08" , "Q09" , "Q1A" , "Q1B" , "Q1C" , "Q1D" ,
+"Q1E" , "Q1F" , "Q1G" , "Q1H" , "Q1I" , "Q1J" , "Q1K" , "Q1L" ,
+"Q1M" , "Q1N" , "Q1O" , "Q1P" , "Q1Q" , "Q1R" , "Q1S" , "Q1T" ,
+"Q1U" , "Q1V" , "Q1W" , "Q1X" , "Q1Y" , "Q1Z" , "Q10" , "Q11" ,
+"Q12" , "Q13" , "Q14" , "Q15" , "Q16" , "Q17" , "Q18" , "Q19" ,
+"Q2A" , "Q2B" , "Q2C" , "Q2D" , "Q2E" , "Q2F" , "Q2G" , "Q2H" ,
+"Q2I" , "Q2J" , "Q2K" , "Q2L" , "Q2M" , "Q2N" , "Q2O" , "Q2P" ,
+"Q2Q" , "Q2R" , "Q2S" , "Q2T" , "Q2U" , "Q2V" , "Q2W" , "Q2X" ,
+"Q2Y" , "Q2Z" , "Q20" , "Q21" , "Q22" , "Q23" , "Q24" , "Q25" ,
+"Q26" , "Q27" , "Q28" , "Q29" , "Q3A" , "Q3B" , "Q3C" , "Q3D" ,
+"Q3E" , "Q3F" , "Q3G" , "Q3H" , "Q3I" , "Q3J" , "Q3K" , "Q3L" ,
+"Q3M" , "Q3N" , "Q3O" , "Q3P" , "Q3Q" , "Q3R" , "Q3S" , "Q3T" ,
+"Q3U" , "Q3V" , "Q3W" , "Q3X" , "Q3Y" , "Q3Z" , "Q30" , "Q31" ,
+"Q32" , "Q33" , "Q34" , "Q35" , "Q36" , "Q37" , "Q38" , "Q39" ,
+"Q4A" , "Q4B" , "Q4C" , "Q4D" , "Q4E" , "Q4F" , "Q4G" , "Q4H" ,
+"Q4I" , "Q4J" , "Q4K" , "Q4L" , "Q4M" , "Q4N" , "Q4O" , "Q4P" ,
+"Q4Q" , "Q4R" , "Q4S" , "Q4T" , "Q4U" , "Q4V" , "Q4W" , "Q4X" ,
+"Q4Y" , "Q4Z" , "Q40" , "Q41" , "Q42" , "Q43" , "Q44" , "Q45" ,
+"Q46" , "Q47" , "Q48" , "Q49" , "Q5A" , "Q5B" , "Q5C" , "Q5D" ,
+"Q5E" , "Q5F" , "Q5G" , "Q5H" , "Q5I" , "Q5J" , "Q5K" , "Q5L" ,
+"Q5M" , "Q5N" , "Q5O" , "Q5P" , "Q5Q" , "Q5R" , "Q5S" , "Q5T" ,
+"Q5U" , "Q5V" , "Q5W" , "Q5X" , "Q5Y" , "Q5Z" , "Q50" , "Q51" ,
+"Q52" , "Q53" , "Q54" , "Q55" , "Q56" , "Q57" , "Q58" , "Q59" ,
+"Q6A" , "Q6B" , "Q6C" , "Q6D" , "Q6E" , "Q6F" , "Q6G" , "Q6H" ,
+"Q6I" , "Q6J" , "Q6K" , "Q6L" , "Q6M" , "Q6N" , "Q6O" , "Q6P" ,
+"Q6Q" , "Q6R" , "Q6S" , "Q6T" , "Q6U" , "Q6V" , "Q6W" , "Q6X" ,
+"Q6Y" , "Q6Z" , "Q60" , "Q61" , "Q62" , "Q63" , "Q64" , "Q65" ,
+"Q66" , "Q67" , "Q68" , "Q69" , "Q7A" , "Q7B" , "Q7C" , "Q7D" ,
+"Q7E" , "Q7F" , "Q7G" , "Q7H" , "Q7I" , "Q7J" , "Q7K" , "Q7L" ,
+"Q7M" , "Q7N" , "Q7O" , "Q7P" , "Q7Q" , "Q7R" , "Q7S" , "Q7T" ,
+"Q7U" , "Q7V" , "Q7W" , "Q7X" , "Q7Y" , "Q7Z" , "Q70" , "Q71" ,
+"Q72" , "Q73" , "Q74" , "Q75" , "Q76" , "Q77" , "Q78" , "Q79" ,
+"Q8A" , "Q8B" , "Q8C" , "Q8D" , "Q8E" , "Q8F" , "Q8G" , "Q8H" ,
+"Q8I" , "Q8J" , "Q8K" , "Q8L" , "Q8M" , "Q8N" , "Q8O" , "Q8P" ,
+"Q8Q" , "Q8R" , "Q8S" , "Q8T" , "Q8U" , "Q8V" , "Q8W" , "Q8X" ,
+"Q8Y" , "Q8Z" , "Q80" , "Q81" , "Q82" , "Q83" , "Q84" , "Q85" ,
+"Q86" , "Q87" , "Q88" , "Q89" , "Q9A" , "Q9B" , "Q9C" , "Q9D" ,
+"Q9E" , "Q9F" , "Q9G" , "Q9H" , "Q9I" , "Q9J" , "Q9K" , "Q9L" ,
+"Q9M" , "Q9N" , "Q9O" , "Q9P" , "Q9Q" , "Q9R" , "Q9S" , "Q9T" ,
+"Q9U" , "Q9V" , "Q9W" , "Q9X" , "Q9Y" , "Q9Z" , "Q90" , "Q91" ,
+"Q92" , "Q93" , "Q94" , "Q95" , "Q96" , "Q97" , "Q98" , "Q99" ,
+"RAA" , "RAB" , "RAC" , "RAD" , "RAE" , "RAF" , "RAG" , "RAH" ,
+"RAI" , "RAJ" , "RAK" , "RAL" , "RAM" , "RAN" , "RAO" , "RAP" ,
+"RAQ" , "RAR" , "RAS" , "RAT" , "RAU" , "RAV" , "RAW" , "RAX" ,
+"RAY" , "RAZ" , "RA0" , "RA1" , "RA2" , "RA3" , "RA4" , "RA5" ,
+"RA6" , "RA7" , "RA8" , "RA9" , "RBA" , "RBB" , "RBC" , "RBD" ,
+"RBE" , "RBF" , "RBG" , "RBH" , "RBI" , "RBJ" , "RBK" , "RBL" ,
+"RBM" , "RBN" , "RBO" , "RBP" , "RBQ" , "RBR" , "RBS" , "RBT" ,
+"RBU" , "RBV" , "RBW" , "RBX" , "RBY" , "RBZ" , "RB0" , "RB1" ,
+"RB2" , "RB3" , "RB4" , "RB5" , "RB6" , "RB7" , "RB8" , "RB9" ,
+"RCA" , "RCB" , "RCC" , "RCD" , "RCE" , "RCF" , "RCG" , "RCH" ,
+"RCI" , "RCJ" , "RCK" , "RCL" , "RCM" , "RCN" , "RCO" , "RCP" ,
+"RCQ" , "RCR" , "RCS" , "RCT" , "RCU" , "RCV" , "RCW" , "RCX" ,
+"RCY" , "RCZ" , "RC0" , "RC1" , "RC2" , "RC3" , "RC4" , "RC5" ,
+"RC6" , "RC7" , "RC8" , "RC9" , "RDA" , "RDB" , "RDC" , "RDD" ,
+"RDE" , "RDF" , "RDG" , "RDH" , "RDI" , "RDJ" , "RDK" , "RDL" ,
+"RDM" , "RDN" , "RDO" , "RDP" , "RDQ" , "RDR" , "RDS" , "RDT" ,
+"RDU" , "RDV" , "RDW" , "RDX" , "RDY" , "RDZ" , "RD0" , "RD1" ,
+"RD2" , "RD3" , "RD4" , "RD5" , "RD6" , "RD7" , "RD8" , "RD9" ,
+"REA" , "REB" , "REC" , "RED" , "REE" , "REF" , "REG" , "REH" ,
+"REI" , "REJ" , "REK" , "REL" , "REM" , "REN" , "REO" , "REP" ,
+"REQ" , "RER" , "RES" , "RET" , "REU" , "REV" , "REW" , "REX" ,
+"REY" , "REZ" , "RE0" , "RE1" , "RE2" , "RE3" , "RE4" , "RE5" ,
+"RE6" , "RE7" , "RE8" , "RE9" , "RFA" , "RFB" , "RFC" , "RFD" ,
+"RFE" , "RFF" , "RFG" , "RFH" , "RFI" , "RFJ" , "RFK" , "RFL" ,
+"RFM" , "RFN" , "RFO" , "RFP" , "RFQ" , "RFR" , "RFS" , "RFT" ,
+"RFU" , "RFV" , "RFW" , "RFX" , "RFY" , "RFZ" , "RF0" , "RF1" ,
+"RF2" , "RF3" , "RF4" , "RF5" , "RF6" , "RF7" , "RF8" , "RF9" ,
+"RGA" , "RGB" , "RGC" , "RGD" , "RGE" , "RGF" , "RGG" , "RGH" ,
+"RGI" , "RGJ" , "RGK" , "RGL" , "RGM" , "RGN" , "RGO" , "RGP" ,
+"RGQ" , "RGR" , "RGS" , "RGT" , "RGU" , "RGV" , "RGW" , "RGX" ,
+"RGY" , "RGZ" , "RG0" , "RG1" , "RG2" , "RG3" , "RG4" , "RG5" ,
+"RG6" , "RG7" , "RG8" , "RG9" , "RHA" , "RHB" , "RHC" , "RHD" ,
+"RHE" , "RHF" , "RHG" , "RHH" , "RHI" , "RHJ" , "RHK" , "RHL" ,
+"RHM" , "RHN" , "RHO" , "RHP" , "RHQ" , "RHR" , "RHS" , "RHT" ,
+"RHU" , "RHV" , "RHW" , "RHX" , "RHY" , "RHZ" , "RH0" , "RH1" ,
+"RH2" , "RH3" , "RH4" , "RH5" , "RH6" , "RH7" , "RH8" , "RH9" ,
+"RIA" , "RIB" , "RIC" , "RID" , "RIE" , "RIF" , "RIG" , "RIH" ,
+"RII" , "RIJ" , "RIK" , "RIL" , "RIM" , "RIN" , "RIO" , "RIP" ,
+"RIQ" , "RIR" , "RIS" , "RIT" , "RIU" , "RIV" , "RIW" , "RIX" ,
+"RIY" , "RIZ" , "RI0" , "RI1" , "RI2" , "RI3" , "RI4" , "RI5" ,
+"RI6" , "RI7" , "RI8" , "RI9" , "RJA" , "RJB" , "RJC" , "RJD" ,
+"RJE" , "RJF" , "RJG" , "RJH" , "RJI" , "RJJ" , "RJK" , "RJL" ,
+"RJM" , "RJN" , "RJO" , "RJP" , "RJQ" , "RJR" , "RJS" , "RJT" ,
+"RJU" , "RJV" , "RJW" , "RJX" , "RJY" , "RJZ" , "RJ0" , "RJ1" ,
+"RJ2" , "RJ3" , "RJ4" , "RJ5" , "RJ6" , "RJ7" , "RJ8" , "RJ9" ,
+"RKA" , "RKB" , "RKC" , "RKD" , "RKE" , "RKF" , "RKG" , "RKH" ,
+"RKI" , "RKJ" , "RKK" , "RKL" , "RKM" , "RKN" , "RKO" , "RKP" ,
+"RKQ" , "RKR" , "RKS" , "RKT" , "RKU" , "RKV" , "RKW" , "RKX" ,
+"RKY" , "RKZ" , "RK0" , "RK1" , "RK2" , "RK3" , "RK4" , "RK5" ,
+"RK6" , "RK7" , "RK8" , "RK9" , "RLA" , "RLB" , "RLC" , "RLD" ,
+"RLE" , "RLF" , "RLG" , "RLH" , "RLI" , "RLJ" , "RLK" , "RLL" ,
+"RLM" , "RLN" , "RLO" , "RLP" , "RLQ" , "RLR" , "RLS" , "RLT" ,
+"RLU" , "RLV" , "RLW" , "RLX" , "RLY" , "RLZ" , "RL0" , "RL1" ,
+"RL2" , "RL3" , "RL4" , "RL5" , "RL6" , "RL7" , "RL8" , "RL9" ,
+"RMA" , "RMB" , "RMC" , "RMD" , "RME" , "RMF" , "RMG" , "RMH" ,
+"RMI" , "RMJ" , "RMK" , "RML" , "RMM" , "RMN" , "RMO" , "RMP" ,
+"RMQ" , "RMR" , "RMS" , "RMT" , "RMU" , "RMV" , "RMW" , "RMX" ,
+"RMY" , "RMZ" , "RM0" , "RM1" , "RM2" , "RM3" , "RM4" , "RM5" ,
+"RM6" , "RM7" , "RM8" , "RM9" , "RNA" , "RNB" , "RNC" , "RND" ,
+"RNE" , "RNF" , "RNG" , "RNH" , "RNI" , "RNJ" , "RNK" , "RNL" ,
+"RNM" , "RNN" , "RNO" , "RNP" , "RNQ" , "RNR" , "RNS" , "RNT" ,
+"RNU" , "RNV" , "RNW" , "RNX" , "RNY" , "RNZ" , "RN0" , "RN1" ,
+"RN2" , "RN3" , "RN4" , "RN5" , "RN6" , "RN7" , "RN8" , "RN9" ,
+"ROA" , "ROB" , "ROC" , "ROD" , "ROE" , "ROF" , "ROG" , "ROH" ,
+"ROI" , "ROJ" , "ROK" , "ROL" , "ROM" , "RON" , "ROO" , "ROP" ,
+"ROQ" , "ROR" , "ROS" , "ROT" , "ROU" , "ROV" , "ROW" , "ROX" ,
+"ROY" , "ROZ" , "RO0" , "RO1" , "RO2" , "RO3" , "RO4" , "RO5" ,
+"RO6" , "RO7" , "RO8" , "RO9" , "RPA" , "RPB" , "RPC" , "RPD" ,
+"RPE" , "RPF" , "RPG" , "RPH" , "RPI" , "RPJ" , "RPK" , "RPL" ,
+"RPM" , "RPN" , "RPO" , "RPP" , "RPQ" , "RPR" , "RPS" , "RPT" ,
+"RPU" , "RPV" , "RPW" , "RPX" , "RPY" , "RPZ" , "RP0" , "RP1" ,
+"RP2" , "RP3" , "RP4" , "RP5" , "RP6" , "RP7" , "RP8" , "RP9" ,
+"RQA" , "RQB" , "RQC" , "RQD" , "RQE" , "RQF" , "RQG" , "RQH" ,
+"RQI" , "RQJ" , "RQK" , "RQL" , "RQM" , "RQN" , "RQO" , "RQP" ,
+"RQQ" , "RQR" , "RQS" , "RQT" , "RQU" , "RQV" , "RQW" , "RQX" ,
+"RQY" , "RQZ" , "RQ0" , "RQ1" , "RQ2" , "RQ3" , "RQ4" , "RQ5" ,
+"RQ6" , "RQ7" , "RQ8" , "RQ9" , "RRA" , "RRB" , "RRC" , "RRD" ,
+"RRE" , "RRF" , "RRG" , "RRH" , "RRI" , "RRJ" , "RRK" , "RRL" ,
+"RRM" , "RRN" , "RRO" , "RRP" , "RRQ" , "RRR" , "RRS" , "RRT" ,
+"RRU" , "RRV" , "RRW" , "RRX" , "RRY" , "RRZ" , "RR0" , "RR1" ,
+"RR2" , "RR3" , "RR4" , "RR5" , "RR6" , "RR7" , "RR8" , "RR9" ,
+"RSA" , "RSB" , "RSC" , "RSD" , "RSE" , "RSF" , "RSG" , "RSH" ,
+"RSI" , "RSJ" , "RSK" , "RSL" , "RSM" , "RSN" , "RSO" , "RSP" ,
+"RSQ" , "RSR" , "RSS" , "RST" , "RSU" , "RSV" , "RSW" , "RSX" ,
+"RSY" , "RSZ" , "RS0" , "RS1" , "RS2" , "RS3" , "RS4" , "RS5" ,
+"RS6" , "RS7" , "RS8" , "RS9" , "RTA" , "RTB" , "RTC" , "RTD" ,
+"RTE" , "RTF" , "RTG" , "RTH" , "RTI" , "RTJ" , "RTK" , "RTL" ,
+"RTM" , "RTN" , "RTO" , "RTP" , "RTQ" , "RTR" , "RTS" , "RTT" ,
+"RTU" , "RTV" , "RTW" , "RTX" , "RTY" , "RTZ" , "RT0" , "RT1" ,
+"RT2" , "RT3" , "RT4" , "RT5" , "RT6" , "RT7" , "RT8" , "RT9" ,
+"RUA" , "RUB" , "RUC" , "RUD" , "RUE" , "RUF" , "RUG" , "RUH" ,
+"RUI" , "RUJ" , "RUK" , "RUL" , "RUM" , "RUN" , "RUO" , "RUP" ,
+"RUQ" , "RUR" , "RUS" , "RUT" , "RUU" , "RUV" , "RUW" , "RUX" ,
+"RUY" , "RUZ" , "RU0" , "RU1" , "RU2" , "RU3" , "RU4" , "RU5" ,
+"RU6" , "RU7" , "RU8" , "RU9" , "RVA" , "RVB" , "RVC" , "RVD" ,
+"RVE" , "RVF" , "RVG" , "RVH" , "RVI" , "RVJ" , "RVK" , "RVL" ,
+"RVM" , "RVN" , "RVO" , "RVP" , "RVQ" , "RVR" , "RVS" , "RVT" ,
+"RVU" , "RVV" , "RVW" , "RVX" , "RVY" , "RVZ" , "RV0" , "RV1" ,
+"RV2" , "RV3" , "RV4" , "RV5" , "RV6" , "RV7" , "RV8" , "RV9" ,
+"RWA" , "RWB" , "RWC" , "RWD" , "RWE" , "RWF" , "RWG" , "RWH" ,
+"RWI" , "RWJ" , "RWK" , "RWL" , "RWM" , "RWN" , "RWO" , "RWP" ,
+"RWQ" , "RWR" , "RWS" , "RWT" , "RWU" , "RWV" , "RWW" , "RWX" ,
+"RWY" , "RWZ" , "RW0" , "RW1" , "RW2" , "RW3" , "RW4" , "RW5" ,
+"RW6" , "RW7" , "RW8" , "RW9" , "RXA" , "RXB" , "RXC" , "RXD" ,
+"RXE" , "RXF" , "RXG" , "RXH" , "RXI" , "RXJ" , "RXK" , "RXL" ,
+"RXM" , "RXN" , "RXO" , "RXP" , "RXQ" , "RXR" , "RXS" , "RXT" ,
+"RXU" , "RXV" , "RXW" , "RXX" , "RXY" , "RXZ" , "RX0" , "RX1" ,
+"RX2" , "RX3" , "RX4" , "RX5" , "RX6" , "RX7" , "RX8" , "RX9" ,
+"RYA" , "RYB" , "RYC" , "RYD" , "RYE" , "RYF" , "RYG" , "RYH" ,
+"RYI" , "RYJ" , "RYK" , "RYL" , "RYM" , "RYN" , "RYO" , "RYP" ,
+"RYQ" , "RYR" , "RYS" , "RYT" , "RYU" , "RYV" , "RYW" , "RYX" ,
+"RYY" , "RYZ" , "RY0" , "RY1" , "RY2" , "RY3" , "RY4" , "RY5" ,
+"RY6" , "RY7" , "RY8" , "RY9" , "RZA" , "RZB" , "RZC" , "RZD" ,
+"RZE" , "RZF" , "RZG" , "RZH" , "RZI" , "RZJ" , "RZK" , "RZL" ,
+"RZM" , "RZN" , "RZO" , "RZP" , "RZQ" , "RZR" , "RZS" , "RZT" ,
+"RZU" , "RZV" , "RZW" , "RZX" , "RZY" , "RZZ" , "RZ0" , "RZ1" ,
+"RZ2" , "RZ3" , "RZ4" , "RZ5" , "RZ6" , "RZ7" , "RZ8" , "RZ9" ,
+"R0A" , "R0B" , "R0C" , "R0D" , "R0E" , "R0F" , "R0G" , "R0H" ,
+"R0I" , "R0J" , "R0K" , "R0L" , "R0M" , "R0N" , "R0O" , "R0P" ,
+"R0Q" , "R0R" , "R0S" , "R0T" , "R0U" , "R0V" , "R0W" , "R0X" ,
+"R0Y" , "R0Z" , "R00" , "R01" , "R02" , "R03" , "R04" , "R05" ,
+"R06" , "R07" , "R08" , "R09" , "R1A" , "R1B" , "R1C" , "R1D" ,
+"R1E" , "R1F" , "R1G" , "R1H" , "R1I" , "R1J" , "R1K" , "R1L" ,
+"R1M" , "R1N" , "R1O" , "R1P" , "R1Q" , "R1R" , "R1S" , "R1T" ,
+"R1U" , "R1V" , "R1W" , "R1X" , "R1Y" , "R1Z" , "R10" , "R11" ,
+"R12" , "R13" , "R14" , "R15" , "R16" , "R17" , "R18" , "R19" ,
+"R2A" , "R2B" , "R2C" , "R2D" , "R2E" , "R2F" , "R2G" , "R2H" ,
+"R2I" , "R2J" , "R2K" , "R2L" , "R2M" , "R2N" , "R2O" , "R2P" ,
+"R2Q" , "R2R" , "R2S" , "R2T" , "R2U" , "R2V" , "R2W" , "R2X" ,
+"R2Y" , "R2Z" , "R20" , "R21" , "R22" , "R23" , "R24" , "R25" ,
+"R26" , "R27" , "R28" , "R29" , "R3A" , "R3B" , "R3C" , "R3D" ,
+"R3E" , "R3F" , "R3G" , "R3H" , "R3I" , "R3J" , "R3K" , "R3L" ,
+"R3M" , "R3N" , "R3O" , "R3P" , "R3Q" , "R3R" , "R3S" , "R3T" ,
+"R3U" , "R3V" , "R3W" , "R3X" , "R3Y" , "R3Z" , "R30" , "R31" ,
+"R32" , "R33" , "R34" , "R35" , "R36" , "R37" , "R38" , "R39" ,
+"R4A" , "R4B" , "R4C" , "R4D" , "R4E" , "R4F" , "R4G" , "R4H" ,
+"R4I" , "R4J" , "R4K" , "R4L" , "R4M" , "R4N" , "R4O" , "R4P" ,
+"R4Q" , "R4R" , "R4S" , "R4T" , "R4U" , "R4V" , "R4W" , "R4X" ,
+"R4Y" , "R4Z" , "R40" , "R41" , "R42" , "R43" , "R44" , "R45" ,
+"R46" , "R47" , "R48" , "R49" , "R5A" , "R5B" , "R5C" , "R5D" ,
+"R5E" , "R5F" , "R5G" , "R5H" , "R5I" , "R5J" , "R5K" , "R5L" ,
+"R5M" , "R5N" , "R5O" , "R5P" , "R5Q" , "R5R" , "R5S" , "R5T" ,
+"R5U" , "R5V" , "R5W" , "R5X" , "R5Y" , "R5Z" , "R50" , "R51" ,
+"R52" , "R53" , "R54" , "R55" , "R56" , "R57" , "R58" , "R59" ,
+"R6A" , "R6B" , "R6C" , "R6D" , "R6E" , "R6F" , "R6G" , "R6H" ,
+"R6I" , "R6J" , "R6K" , "R6L" , "R6M" , "R6N" , "R6O" , "R6P" ,
+"R6Q" , "R6R" , "R6S" , "R6T" , "R6U" , "R6V" , "R6W" , "R6X" ,
+"R6Y" , "R6Z" , "R60" , "R61" , "R62" , "R63" , "R64" , "R65" ,
+"R66" , "R67" , "R68" , "R69" , "R7A" , "R7B" , "R7C" , "R7D" ,
+"R7E" , "R7F" , "R7G" , "R7H" , "R7I" , "R7J" , "R7K" , "R7L" ,
+"R7M" , "R7N" , "R7O" , "R7P" , "R7Q" , "R7R" , "R7S" , "R7T" ,
+"R7U" , "R7V" , "R7W" , "R7X" , "R7Y" , "R7Z" , "R70" , "R71" ,
+"R72" , "R73" , "R74" , "R75" , "R76" , "R77" , "R78" , "R79" ,
+"R8A" , "R8B" , "R8C" , "R8D" , "R8E" , "R8F" , "R8G" , "R8H" ,
+"R8I" , "R8J" , "R8K" , "R8L" , "R8M" , "R8N" , "R8O" , "R8P" ,
+"R8Q" , "R8R" , "R8S" , "R8T" , "R8U" , "R8V" , "R8W" , "R8X" ,
+"R8Y" , "R8Z" , "R80" , "R81" , "R82" , "R83" , "R84" , "R85" ,
+"R86" , "R87" , "R88" , "R89" , "R9A" , "R9B" , "R9C" , "R9D" ,
+"R9E" , "R9F" , "R9G" , "R9H" , "R9I" , "R9J" , "R9K" , "R9L" ,
+"R9M" , "R9N" , "R9O" , "R9P" , "R9Q" , "R9R" , "R9S" , "R9T" ,
+"R9U" , "R9V" , "R9W" , "R9X" , "R9Y" , "R9Z" , "R90" , "R91" ,
+"R92" , "R93" , "R94" , "R95" , "R96" , "R97" , "R98" , "R99" ,
+"SAA" , "SAB" , "SAC" , "SAD" , "SAE" , "SAF" , "SAG" , "SAH" ,
+"SAI" , "SAJ" , "SAK" , "SAL" , "SAM" , "SAN" , "SAO" , "SAP" ,
+"SAQ" , "SAR" , "SAS" , "SAT" , "SAU" , "SAV" , "SAW" , "SAX" ,
+"SAY" , "SAZ" , "SA0" , "SA1" , "SA2" , "SA3" , "SA4" , "SA5" ,
+"SA6" , "SA7" , "SA8" , "SA9" , "SBA" , "SBB" , "SBC" , "SBD" ,
+"SBE" , "SBF" , "SBG" , "SBH" , "SBI" , "SBJ" , "SBK" , "SBL" ,
+"SBM" , "SBN" , "SBO" , "SBP" , "SBQ" , "SBR" , "SBS" , "SBT" ,
+"SBU" , "SBV" , "SBW" , "SBX" , "SBY" , "SBZ" , "SB0" , "SB1" ,
+"SB2" , "SB3" , "SB4" , "SB5" , "SB6" , "SB7" , "SB8" , "SB9" ,
+"SCA" , "SCB" , "SCC" , "SCD" , "SCE" , "SCF" , "SCG" , "SCH" ,
+"SCI" , "SCJ" , "SCK" , "SCL" , "SCM" , "SCN" , "SCO" , "SCP" ,
+"SCQ" , "SCR" , "SCS" , "SCT" , "SCU" , "SCV" , "SCW" , "SCX" ,
+"SCY" , "SCZ" , "SC0" , "SC1" , "SC2" , "SC3" , "SC4" , "SC5" ,
+"SC6" , "SC7" , "SC8" , "SC9" , "SDA" , "SDB" , "SDC" , "SDD" ,
+"SDE" , "SDF" , "SDG" , "SDH" , "SDI" , "SDJ" , "SDK" , "SDL" ,
+"SDM" , "SDN" , "SDO" , "SDP" , "SDQ" , "SDR" , "SDS" , "SDT" ,
+"SDU" , "SDV" , "SDW" , "SDX" , "SDY" , "SDZ" , "SD0" , "SD1" ,
+"SD2" , "SD3" , "SD4" , "SD5" , "SD6" , "SD7" , "SD8" , "SD9" ,
+"SEA" , "SEB" , "SEC" , "SED" , "SEE" , "SEF" , "SEG" , "SEH" ,
+"SEI" , "SEJ" , "SEK" , "SEL" , "SEM" , "SEN" , "SEO" , "SEP" ,
+"SEQ" , "SER" , "SES" , "SET" , "SEU" , "SEV" , "SEW" , "SEX" ,
+"SEY" , "SEZ" , "SE0" , "SE1" , "SE2" , "SE3" , "SE4" , "SE5" ,
+"SE6" , "SE7" , "SE8" , "SE9" , "SFA" , "SFB" , "SFC" , "SFD" ,
+"SFE" , "SFF" , "SFG" , "SFH" , "SFI" , "SFJ" , "SFK" , "SFL" ,
+"SFM" , "SFN" , "SFO" , "SFP" , "SFQ" , "SFR" , "SFS" , "SFT" ,
+"SFU" , "SFV" , "SFW" , "SFX" , "SFY" , "SFZ" , "SF0" , "SF1" ,
+"SF2" , "SF3" , "SF4" , "SF5" , "SF6" , "SF7" , "SF8" , "SF9" ,
+"SGA" , "SGB" , "SGC" , "SGD" , "SGE" , "SGF" , "SGG" , "SGH" ,
+"SGI" , "SGJ" , "SGK" , "SGL" , "SGM" , "SGN" , "SGO" , "SGP" ,
+"SGQ" , "SGR" , "SGS" , "SGT" , "SGU" , "SGV" , "SGW" , "SGX" ,
+"SGY" , "SGZ" , "SG0" , "SG1" , "SG2" , "SG3" , "SG4" , "SG5" ,
+"SG6" , "SG7" , "SG8" , "SG9" , "SHA" , "SHB" , "SHC" , "SHD" ,
+"SHE" , "SHF" , "SHG" , "SHH" , "SHI" , "SHJ" , "SHK" , "SHL" ,
+"SHM" , "SHN" , "SHO" , "SHP" , "SHQ" , "SHR" , "SHS" , "SHT" ,
+"SHU" , "SHV" , "SHW" , "SHX" , "SHY" , "SHZ" , "SH0" , "SH1" ,
+"SH2" , "SH3" , "SH4" , "SH5" , "SH6" , "SH7" , "SH8" , "SH9" ,
+"SIA" , "SIB" , "SIC" , "SID" , "SIE" , "SIF" , "SIG" , "SIH" ,
+"SII" , "SIJ" , "SIK" , "SIL" , "SIM" , "SIN" , "SIO" , "SIP" ,
+"SIQ" , "SIR" , "SIS" , "SIT" , "SIU" , "SIV" , "SIW" , "SIX" ,
+"SIY" , "SIZ" , "SI0" , "SI1" , "SI2" , "SI3" , "SI4" , "SI5" ,
+"SI6" , "SI7" , "SI8" , "SI9" , "SJA" , "SJB" , "SJC" , "SJD" ,
+"SJE" , "SJF" , "SJG" , "SJH" , "SJI" , "SJJ" , "SJK" , "SJL" ,
+"SJM" , "SJN" , "SJO" , "SJP" , "SJQ" , "SJR" , "SJS" , "SJT" ,
+"SJU" , "SJV" , "SJW" , "SJX" , "SJY" , "SJZ" , "SJ0" , "SJ1" ,
+"SJ2" , "SJ3" , "SJ4" , "SJ5" , "SJ6" , "SJ7" , "SJ8" , "SJ9" ,
+"SKA" , "SKB" , "SKC" , "SKD" , "SKE" , "SKF" , "SKG" , "SKH" ,
+"SKI" , "SKJ" , "SKK" , "SKL" , "SKM" , "SKN" , "SKO" , "SKP" ,
+"SKQ" , "SKR" , "SKS" , "SKT" , "SKU" , "SKV" , "SKW" , "SKX" ,
+"SKY" , "SKZ" , "SK0" , "SK1" , "SK2" , "SK3" , "SK4" , "SK5" ,
+"SK6" , "SK7" , "SK8" , "SK9" , "SLA" , "SLB" , "SLC" , "SLD" ,
+"SLE" , "SLF" , "SLG" , "SLH" , "SLI" , "SLJ" , "SLK" , "SLL" ,
+"SLM" , "SLN" , "SLO" , "SLP" , "SLQ" , "SLR" , "SLS" , "SLT" ,
+"SLU" , "SLV" , "SLW" , "SLX" , "SLY" , "SLZ" , "SL0" , "SL1" ,
+"SL2" , "SL3" , "SL4" , "SL5" , "SL6" , "SL7" , "SL8" , "SL9" ,
+"SMA" , "SMB" , "SMC" , "SMD" , "SME" , "SMF" , "SMG" , "SMH" ,
+"SMI" , "SMJ" , "SMK" , "SML" , "SMM" , "SMN" , "SMO" , "SMP" ,
+"SMQ" , "SMR" , "SMS" , "SMT" , "SMU" , "SMV" , "SMW" , "SMX" ,
+"SMY" , "SMZ" , "SM0" , "SM1" , "SM2" , "SM3" , "SM4" , "SM5" ,
+"SM6" , "SM7" , "SM8" , "SM9" , "SNA" , "SNB" , "SNC" , "SND" ,
+"SNE" , "SNF" , "SNG" , "SNH" , "SNI" , "SNJ" , "SNK" , "SNL" ,
+"SNM" , "SNN" , "SNO" , "SNP" , "SNQ" , "SNR" , "SNS" , "SNT" ,
+"SNU" , "SNV" , "SNW" , "SNX" , "SNY" , "SNZ" , "SN0" , "SN1" ,
+"SN2" , "SN3" , "SN4" , "SN5" , "SN6" , "SN7" , "SN8" , "SN9" ,
+"SOA" , "SOB" , "SOC" , "SOD" , "SOE" , "SOF" , "SOG" , "SOH" ,
+"SOI" , "SOJ" , "SOK" , "SOL" , "SOM" , "SON" , "SOO" , "SOP" ,
+"SOQ" , "SOR" , "SOS" , "SOT" , "SOU" , "SOV" , "SOW" , "SOX" ,
+"SOY" , "SOZ" , "SO0" , "SO1" , "SO2" , "SO3" , "SO4" , "SO5" ,
+"SO6" , "SO7" , "SO8" , "SO9" , "SPA" , "SPB" , "SPC" , "SPD" ,
+"SPE" , "SPF" , "SPG" , "SPH" , "SPI" , "SPJ" , "SPK" , "SPL" ,
+"SPM" , "SPN" , "SPO" , "SPP" , "SPQ" , "SPR" , "SPS" , "SPT" ,
+"SPU" , "SPV" , "SPW" , "SPX" , "SPY" , "SPZ" , "SP0" , "SP1" ,
+"SP2" , "SP3" , "SP4" , "SP5" , "SP6" , "SP7" , "SP8" , "SP9" ,
+"SQA" , "SQB" , "SQC" , "SQD" , "SQE" , "SQF" , "SQG" , "SQH" ,
+"SQI" , "SQJ" , "SQK" , "SQL" , "SQM" , "SQN" , "SQO" , "SQP" ,
+"SQQ" , "SQR" , "SQS" , "SQT" , "SQU" , "SQV" , "SQW" , "SQX" ,
+"SQY" , "SQZ" , "SQ0" , "SQ1" , "SQ2" , "SQ3" , "SQ4" , "SQ5" ,
+"SQ6" , "SQ7" , "SQ8" , "SQ9" , "SRA" , "SRB" , "SRC" , "SRD" ,
+"SRE" , "SRF" , "SRG" , "SRH" , "SRI" , "SRJ" , "SRK" , "SRL" ,
+"SRM" , "SRN" , "SRO" , "SRP" , "SRQ" , "SRR" , "SRS" , "SRT" ,
+"SRU" , "SRV" , "SRW" , "SRX" , "SRY" , "SRZ" , "SR0" , "SR1" ,
+"SR2" , "SR3" , "SR4" , "SR5" , "SR6" , "SR7" , "SR8" , "SR9" ,
+"SSA" , "SSB" , "SSC" , "SSD" , "SSE" , "SSF" , "SSG" , "SSH" ,
+"SSI" , "SSJ" , "SSK" , "SSL" , "SSM" , "SSN" , "SSO" , "SSP" ,
+"SSQ" , "SSR" , "SSS" , "SST" , "SSU" , "SSV" , "SSW" , "SSX" ,
+"SSY" , "SSZ" , "SS0" , "SS1" , "SS2" , "SS3" , "SS4" , "SS5" ,
+"SS6" , "SS7" , "SS8" , "SS9" , "STA" , "STB" , "STC" , "STD" ,
+"STE" , "STF" , "STG" , "STH" , "STI" , "STJ" , "STK" , "STL" ,
+"STM" , "STN" , "STO" , "STP" , "STQ" , "STR" , "STS" , "STT" ,
+"STU" , "STV" , "STW" , "STX" , "STY" , "STZ" , "ST0" , "ST1" ,
+"ST2" , "ST3" , "ST4" , "ST5" , "ST6" , "ST7" , "ST8" , "ST9" ,
+"SUA" , "SUB" , "SUC" , "SUD" , "SUE" , "SUF" , "SUG" , "SUH" ,
+"SUI" , "SUJ" , "SUK" , "SUL" , "SUM" , "SUN" , "SUO" , "SUP" ,
+"SUQ" , "SUR" , "SUS" , "SUT" , "SUU" , "SUV" , "SUW" , "SUX" ,
+"SUY" , "SUZ" , "SU0" , "SU1" , "SU2" , "SU3" , "SU4" , "SU5" ,
+"SU6" , "SU7" , "SU8" , "SU9" , "SVA" , "SVB" , "SVC" , "SVD" ,
+"SVE" , "SVF" , "SVG" , "SVH" , "SVI" , "SVJ" , "SVK" , "SVL" ,
+"SVM" , "SVN" , "SVO" , "SVP" , "SVQ" , "SVR" , "SVS" , "SVT" ,
+"SVU" , "SVV" , "SVW" , "SVX" , "SVY" , "SVZ" , "SV0" , "SV1" ,
+"SV2" , "SV3" , "SV4" , "SV5" , "SV6" , "SV7" , "SV8" , "SV9" ,
+"SWA" , "SWB" , "SWC" , "SWD" , "SWE" , "SWF" , "SWG" , "SWH" ,
+"SWI" , "SWJ" , "SWK" , "SWL" , "SWM" , "SWN" , "SWO" , "SWP" ,
+"SWQ" , "SWR" , "SWS" , "SWT" , "SWU" , "SWV" , "SWW" , "SWX" ,
+"SWY" , "SWZ" , "SW0" , "SW1" , "SW2" , "SW3" , "SW4" , "SW5" ,
+"SW6" , "SW7" , "SW8" , "SW9" , "SXA" , "SXB" , "SXC" , "SXD" ,
+"SXE" , "SXF" , "SXG" , "SXH" , "SXI" , "SXJ" , "SXK" , "SXL" ,
+"SXM" , "SXN" , "SXO" , "SXP" , "SXQ" , "SXR" , "SXS" , "SXT" ,
+"SXU" , "SXV" , "SXW" , "SXX" , "SXY" , "SXZ" , "SX0" , "SX1" ,
+"SX2" , "SX3" , "SX4" , "SX5" , "SX6" , "SX7" , "SX8" , "SX9" ,
+"SYA" , "SYB" , "SYC" , "SYD" , "SYE" , "SYF" , "SYG" , "SYH" ,
+"SYI" , "SYJ" , "SYK" , "SYL" , "SYM" , "SYN" , "SYO" , "SYP" ,
+"SYQ" , "SYR" , "SYS" , "SYT" , "SYU" , "SYV" , "SYW" , "SYX" ,
+"SYY" , "SYZ" , "SY0" , "SY1" , "SY2" , "SY3" , "SY4" , "SY5" ,
+"SY6" , "SY7" , "SY8" , "SY9" , "SZA" , "SZB" , "SZC" , "SZD" ,
+"SZE" , "SZF" , "SZG" , "SZH" , "SZI" , "SZJ" , "SZK" , "SZL" ,
+"SZM" , "SZN" , "SZO" , "SZP" , "SZQ" , "SZR" , "SZS" , "SZT" ,
+"SZU" , "SZV" , "SZW" , "SZX" , "SZY" , "SZZ" , "SZ0" , "SZ1" ,
+"SZ2" , "SZ3" , "SZ4" , "SZ5" , "SZ6" , "SZ7" , "SZ8" , "SZ9" ,
+"S0A" , "S0B" , "S0C" , "S0D" , "S0E" , "S0F" , "S0G" , "S0H" ,
+"S0I" , "S0J" , "S0K" , "S0L" , "S0M" , "S0N" , "S0O" , "S0P" ,
+"S0Q" , "S0R" , "S0S" , "S0T" , "S0U" , "S0V" , "S0W" , "S0X" ,
+"S0Y" , "S0Z" , "S00" , "S01" , "S02" , "S03" , "S04" , "S05" ,
+"S06" , "S07" , "S08" , "S09" , "S1A" , "S1B" , "S1C" , "S1D" ,
+"S1E" , "S1F" , "S1G" , "S1H" , "S1I" , "S1J" , "S1K" , "S1L" ,
+"S1M" , "S1N" , "S1O" , "S1P" , "S1Q" , "S1R" , "S1S" , "S1T" ,
+"S1U" , "S1V" , "S1W" , "S1X" , "S1Y" , "S1Z" , "S10" , "S11" ,
+"S12" , "S13" , "S14" , "S15" , "S16" , "S17" , "S18" , "S19" ,
+"S2A" , "S2B" , "S2C" , "S2D" , "S2E" , "S2F" , "S2G" , "S2H" ,
+"S2I" , "S2J" , "S2K" , "S2L" , "S2M" , "S2N" , "S2O" , "S2P" ,
+"S2Q" , "S2R" , "S2S" , "S2T" , "S2U" , "S2V" , "S2W" , "S2X" ,
+"S2Y" , "S2Z" , "S20" , "S21" , "S22" , "S23" , "S24" , "S25" ,
+"S26" , "S27" , "S28" , "S29" , "S3A" , "S3B" , "S3C" , "S3D" ,
+"S3E" , "S3F" , "S3G" , "S3H" , "S3I" , "S3J" , "S3K" , "S3L" ,
+"S3M" , "S3N" , "S3O" , "S3P" , "S3Q" , "S3R" , "S3S" , "S3T" ,
+"S3U" , "S3V" , "S3W" , "S3X" , "S3Y" , "S3Z" , "S30" , "S31" ,
+"S32" , "S33" , "S34" , "S35" , "S36" , "S37" , "S38" , "S39" ,
+"S4A" , "S4B" , "S4C" , "S4D" , "S4E" , "S4F" , "S4G" , "S4H" ,
+"S4I" , "S4J" , "S4K" , "S4L" , "S4M" , "S4N" , "S4O" , "S4P" ,
+"S4Q" , "S4R" , "S4S" , "S4T" , "S4U" , "S4V" , "S4W" , "S4X" ,
+"S4Y" , "S4Z" , "S40" , "S41" , "S42" , "S43" , "S44" , "S45" ,
+"S46" , "S47" , "S48" , "S49" , "S5A" , "S5B" , "S5C" , "S5D" ,
+"S5E" , "S5F" , "S5G" , "S5H" , "S5I" , "S5J" , "S5K" , "S5L" ,
+"S5M" , "S5N" , "S5O" , "S5P" , "S5Q" , "S5R" , "S5S" , "S5T" ,
+"S5U" , "S5V" , "S5W" , "S5X" , "S5Y" , "S5Z" , "S50" , "S51" ,
+"S52" , "S53" , "S54" , "S55" , "S56" , "S57" , "S58" , "S59" ,
+"S6A" , "S6B" , "S6C" , "S6D" , "S6E" , "S6F" , "S6G" , "S6H" ,
+"S6I" , "S6J" , "S6K" , "S6L" , "S6M" , "S6N" , "S6O" , "S6P" ,
+"S6Q" , "S6R" , "S6S" , "S6T" , "S6U" , "S6V" , "S6W" , "S6X" ,
+"S6Y" , "S6Z" , "S60" , "S61" , "S62" , "S63" , "S64" , "S65" ,
+"S66" , "S67" , "S68" , "S69" , "S7A" , "S7B" , "S7C" , "S7D" ,
+"S7E" , "S7F" , "S7G" , "S7H" , "S7I" , "S7J" , "S7K" , "S7L" ,
+"S7M" , "S7N" , "S7O" , "S7P" , "S7Q" , "S7R" , "S7S" , "S7T" ,
+"S7U" , "S7V" , "S7W" , "S7X" , "S7Y" , "S7Z" , "S70" , "S71" ,
+"S72" , "S73" , "S74" , "S75" , "S76" , "S77" , "S78" , "S79" ,
+"S8A" , "S8B" , "S8C" , "S8D" , "S8E" , "S8F" , "S8G" , "S8H" ,
+"S8I" , "S8J" , "S8K" , "S8L" , "S8M" , "S8N" , "S8O" , "S8P" ,
+"S8Q" , "S8R" , "S8S" , "S8T" , "S8U" , "S8V" , "S8W" , "S8X" ,
+"S8Y" , "S8Z" , "S80" , "S81" , "S82" , "S83" , "S84" , "S85" ,
+"S86" , "S87" , "S88" , "S89" , "S9A" , "S9B" , "S9C" , "S9D" ,
+"S9E" , "S9F" , "S9G" , "S9H" , "S9I" , "S9J" , "S9K" , "S9L" ,
+"S9M" , "S9N" , "S9O" , "S9P" , "S9Q" , "S9R" , "S9S" , "S9T" ,
+"S9U" , "S9V" , "S9W" , "S9X" , "S9Y" , "S9Z" , "S90" , "S91" ,
+"S92" , "S93" , "S94" , "S95" , "S96" , "S97" , "S98" , "S99" ,
+"TAA" , "TAB" , "TAC" , "TAD" , "TAE" , "TAF" , "TAG" , "TAH" ,
+"TAI" , "TAJ" , "TAK" , "TAL" , "TAM" , "TAN" , "TAO" , "TAP" ,
+"TAQ" , "TAR" , "TAS" , "TAT" , "TAU" , "TAV" , "TAW" , "TAX" ,
+"TAY" , "TAZ" , "TA0" , "TA1" , "TA2" , "TA3" , "TA4" , "TA5" ,
+"TA6" , "TA7" , "TA8" , "TA9" , "TBA" , "TBB" , "TBC" , "TBD" ,
+"TBE" , "TBF" , "TBG" , "TBH" , "TBI" , "TBJ" , "TBK" , "TBL" ,
+"TBM" , "TBN" , "TBO" , "TBP" , "TBQ" , "TBR" , "TBS" , "TBT" ,
+"TBU" , "TBV" , "TBW" , "TBX" , "TBY" , "TBZ" , "TB0" , "TB1" ,
+"TB2" , "TB3" , "TB4" , "TB5" , "TB6" , "TB7" , "TB8" , "TB9" ,
+"TCA" , "TCB" , "TCC" , "TCD" , "TCE" , "TCF" , "TCG" , "TCH" ,
+"TCI" , "TCJ" , "TCK" , "TCL" , "TCM" , "TCN" , "TCO" , "TCP" ,
+"TCQ" , "TCR" , "TCS" , "TCT" , "TCU" , "TCV" , "TCW" , "TCX" ,
+"TCY" , "TCZ" , "TC0" , "TC1" , "TC2" , "TC3" , "TC4" , "TC5" ,
+"TC6" , "TC7" , "TC8" , "TC9" , "TDA" , "TDB" , "TDC" , "TDD" ,
+"TDE" , "TDF" , "TDG" , "TDH" , "TDI" , "TDJ" , "TDK" , "TDL" ,
+"TDM" , "TDN" , "TDO" , "TDP" , "TDQ" , "TDR" , "TDS" , "TDT" ,
+"TDU" , "TDV" , "TDW" , "TDX" , "TDY" , "TDZ" , "TD0" , "TD1" ,
+"TD2" , "TD3" , "TD4" , "TD5" , "TD6" , "TD7" , "TD8" , "TD9" ,
+"TEA" , "TEB" , "TEC" , "TED" , "TEE" , "TEF" , "TEG" , "TEH" ,
+"TEI" , "TEJ" , "TEK" , "TEL" , "TEM" , "TEN" , "TEO" , "TEP" ,
+"TEQ" , "TER" , "TES" , "TET" , "TEU" , "TEV" , "TEW" , "TEX" ,
+"TEY" , "TEZ" , "TE0" , "TE1" , "TE2" , "TE3" , "TE4" , "TE5" ,
+"TE6" , "TE7" , "TE8" , "TE9" , "TFA" , "TFB" , "TFC" , "TFD" ,
+"TFE" , "TFF" , "TFG" , "TFH" , "TFI" , "TFJ" , "TFK" , "TFL" ,
+"TFM" , "TFN" , "TFO" , "TFP" , "TFQ" , "TFR" , "TFS" , "TFT" ,
+"TFU" , "TFV" , "TFW" , "TFX" , "TFY" , "TFZ" , "TF0" , "TF1" ,
+"TF2" , "TF3" , "TF4" , "TF5" , "TF6" , "TF7" , "TF8" , "TF9" ,
+"TGA" , "TGB" , "TGC" , "TGD" , "TGE" , "TGF" , "TGG" , "TGH" ,
+"TGI" , "TGJ" , "TGK" , "TGL" , "TGM" , "TGN" , "TGO" , "TGP" ,
+"TGQ" , "TGR" , "TGS" , "TGT" , "TGU" , "TGV" , "TGW" , "TGX" ,
+"TGY" , "TGZ" , "TG0" , "TG1" , "TG2" , "TG3" , "TG4" , "TG5" ,
+"TG6" , "TG7" , "TG8" , "TG9" , "THA" , "THB" , "THC" , "THD" ,
+"THE" , "THF" , "THG" , "THH" , "THI" , "THJ" , "THK" , "THL" ,
+"THM" , "THN" , "THO" , "THP" , "THQ" , "THR" , "THS" , "THT" ,
+"THU" , "THV" , "THW" , "THX" , "THY" , "THZ" , "TH0" , "TH1" ,
+"TH2" , "TH3" , "TH4" , "TH5" , "TH6" , "TH7" , "TH8" , "TH9" ,
+"TIA" , "TIB" , "TIC" , "TID" , "TIE" , "TIF" , "TIG" , "TIH" ,
+"TII" , "TIJ" , "TIK" , "TIL" , "TIM" , "TIN" , "TIO" , "TIP" ,
+"TIQ" , "TIR" , "TIS" , "TIT" , "TIU" , "TIV" , "TIW" , "TIX" ,
+"TIY" , "TIZ" , "TI0" , "TI1" , "TI2" , "TI3" , "TI4" , "TI5" ,
+"TI6" , "TI7" , "TI8" , "TI9" , "TJA" , "TJB" , "TJC" , "TJD" ,
+"TJE" , "TJF" , "TJG" , "TJH" , "TJI" , "TJJ" , "TJK" , "TJL" ,
+"TJM" , "TJN" , "TJO" , "TJP" , "TJQ" , "TJR" , "TJS" , "TJT" ,
+"TJU" , "TJV" , "TJW" , "TJX" , "TJY" , "TJZ" , "TJ0" , "TJ1" ,
+"TJ2" , "TJ3" , "TJ4" , "TJ5" , "TJ6" , "TJ7" , "TJ8" , "TJ9" ,
+"TKA" , "TKB" , "TKC" , "TKD" , "TKE" , "TKF" , "TKG" , "TKH" ,
+"TKI" , "TKJ" , "TKK" , "TKL" , "TKM" , "TKN" , "TKO" , "TKP" ,
+"TKQ" , "TKR" , "TKS" , "TKT" , "TKU" , "TKV" , "TKW" , "TKX" ,
+"TKY" , "TKZ" , "TK0" , "TK1" , "TK2" , "TK3" , "TK4" , "TK5" ,
+"TK6" , "TK7" , "TK8" , "TK9" , "TLA" , "TLB" , "TLC" , "TLD" ,
+"TLE" , "TLF" , "TLG" , "TLH" , "TLI" , "TLJ" , "TLK" , "TLL" ,
+"TLM" , "TLN" , "TLO" , "TLP" , "TLQ" , "TLR" , "TLS" , "TLT" ,
+"TLU" , "TLV" , "TLW" , "TLX" , "TLY" , "TLZ" , "TL0" , "TL1" ,
+"TL2" , "TL3" , "TL4" , "TL5" , "TL6" , "TL7" , "TL8" , "TL9" ,
+"TMA" , "TMB" , "TMC" , "TMD" , "TME" , "TMF" , "TMG" , "TMH" ,
+"TMI" , "TMJ" , "TMK" , "TML" , "TMM" , "TMN" , "TMO" , "TMP" ,
+"TMQ" , "TMR" , "TMS" , "TMT" , "TMU" , "TMV" , "TMW" , "TMX" ,
+"TMY" , "TMZ" , "TM0" , "TM1" , "TM2" , "TM3" , "TM4" , "TM5" ,
+"TM6" , "TM7" , "TM8" , "TM9" , "TNA" , "TNB" , "TNC" , "TND" ,
+"TNE" , "TNF" , "TNG" , "TNH" , "TNI" , "TNJ" , "TNK" , "TNL" ,
+"TNM" , "TNN" , "TNO" , "TNP" , "TNQ" , "TNR" , "TNS" , "TNT" ,
+"TNU" , "TNV" , "TNW" , "TNX" , "TNY" , "TNZ" , "TN0" , "TN1" ,
+"TN2" , "TN3" , "TN4" , "TN5" , "TN6" , "TN7" , "TN8" , "TN9" ,
+"TOA" , "TOB" , "TOC" , "TOD" , "TOE" , "TOF" , "TOG" , "TOH" ,
+"TOI" , "TOJ" , "TOK" , "TOL" , "TOM" , "TON" , "TOO" , "TOP" ,
+"TOQ" , "TOR" , "TOS" , "TOT" , "TOU" , "TOV" , "TOW" , "TOX" ,
+"TOY" , "TOZ" , "TO0" , "TO1" , "TO2" , "TO3" , "TO4" , "TO5" ,
+"TO6" , "TO7" , "TO8" , "TO9" , "TPA" , "TPB" , "TPC" , "TPD" ,
+"TPE" , "TPF" , "TPG" , "TPH" , "TPI" , "TPJ" , "TPK" , "TPL" ,
+"TPM" , "TPN" , "TPO" , "TPP" , "TPQ" , "TPR" , "TPS" , "TPT" ,
+"TPU" , "TPV" , "TPW" , "TPX" , "TPY" , "TPZ" , "TP0" , "TP1" ,
+"TP2" , "TP3" , "TP4" , "TP5" , "TP6" , "TP7" , "TP8" , "TP9" ,
+"TQA" , "TQB" , "TQC" , "TQD" , "TQE" , "TQF" , "TQG" , "TQH" ,
+"TQI" , "TQJ" , "TQK" , "TQL" , "TQM" , "TQN" , "TQO" , "TQP" ,
+"TQQ" , "TQR" , "TQS" , "TQT" , "TQU" , "TQV" , "TQW" , "TQX" ,
+"TQY" , "TQZ" , "TQ0" , "TQ1" , "TQ2" , "TQ3" , "TQ4" , "TQ5" ,
+"TQ6" , "TQ7" , "TQ8" , "TQ9" , "TRA" , "TRB" , "TRC" , "TRD" ,
+"TRE" , "TRF" , "TRG" , "TRH" , "TRI" , "TRJ" , "TRK" , "TRL" ,
+"TRM" , "TRN" , "TRO" , "TRP" , "TRQ" , "TRR" , "TRS" , "TRT" ,
+"TRU" , "TRV" , "TRW" , "TRX" , "TRY" , "TRZ" , "TR0" , "TR1" ,
+"TR2" , "TR3" , "TR4" , "TR5" , "TR6" , "TR7" , "TR8" , "TR9" ,
+"TSA" , "TSB" , "TSC" , "TSD" , "TSE" , "TSF" , "TSG" , "TSH" ,
+"TSI" , "TSJ" , "TSK" , "TSL" , "TSM" , "TSN" , "TSO" , "TSP" ,
+"TSQ" , "TSR" , "TSS" , "TST" , "TSU" , "TSV" , "TSW" , "TSX" ,
+"TSY" , "TSZ" , "TS0" , "TS1" , "TS2" , "TS3" , "TS4" , "TS5" ,
+"TS6" , "TS7" , "TS8" , "TS9" , "TTA" , "TTB" , "TTC" , "TTD" ,
+"TTE" , "TTF" , "TTG" , "TTH" , "TTI" , "TTJ" , "TTK" , "TTL" ,
+"TTM" , "TTN" , "TTO" , "TTP" , "TTQ" , "TTR" , "TTS" , "TTT" ,
+"TTU" , "TTV" , "TTW" , "TTX" , "TTY" , "TTZ" , "TT0" , "TT1" ,
+"TT2" , "TT3" , "TT4" , "TT5" , "TT6" , "TT7" , "TT8" , "TT9" ,
+"TUA" , "TUB" , "TUC" , "TUD" , "TUE" , "TUF" , "TUG" , "TUH" ,
+"TUI" , "TUJ" , "TUK" , "TUL" , "TUM" , "TUN" , "TUO" , "TUP" ,
+"TUQ" , "TUR" , "TUS" , "TUT" , "TUU" , "TUV" , "TUW" , "TUX" ,
+"TUY" , "TUZ" , "TU0" , "TU1" , "TU2" , "TU3" , "TU4" , "TU5" ,
+"TU6" , "TU7" , "TU8" , "TU9" , "TVA" , "TVB" , "TVC" , "TVD" ,
+"TVE" , "TVF" , "TVG" , "TVH" , "TVI" , "TVJ" , "TVK" , "TVL" ,
+"TVM" , "TVN" , "TVO" , "TVP" , "TVQ" , "TVR" , "TVS" , "TVT" ,
+"TVU" , "TVV" , "TVW" , "TVX" , "TVY" , "TVZ" , "TV0" , "TV1" ,
+"TV2" , "TV3" , "TV4" , "TV5" , "TV6" , "TV7" , "TV8" , "TV9" ,
+"TWA" , "TWB" , "TWC" , "TWD" , "TWE" , "TWF" , "TWG" , "TWH" ,
+"TWI" , "TWJ" , "TWK" , "TWL" , "TWM" , "TWN" , "TWO" , "TWP" ,
+"TWQ" , "TWR" , "TWS" , "TWT" , "TWU" , "TWV" , "TWW" , "TWX" ,
+"TWY" , "TWZ" , "TW0" , "TW1" , "TW2" , "TW3" , "TW4" , "TW5" ,
+"TW6" , "TW7" , "TW8" , "TW9" , "TXA" , "TXB" , "TXC" , "TXD" ,
+"TXE" , "TXF" , "TXG" , "TXH" , "TXI" , "TXJ" , "TXK" , "TXL" ,
+"TXM" , "TXN" , "TXO" , "TXP" , "TXQ" , "TXR" , "TXS" , "TXT" ,
+"TXU" , "TXV" , "TXW" , "TXX" , "TXY" , "TXZ" , "TX0" , "TX1" ,
+"TX2" , "TX3" , "TX4" , "TX5" , "TX6" , "TX7" , "TX8" , "TX9" ,
+"TYA" , "TYB" , "TYC" , "TYD" , "TYE" , "TYF" , "TYG" , "TYH" ,
+"TYI" , "TYJ" , "TYK" , "TYL" , "TYM" , "TYN" , "TYO" , "TYP" ,
+"TYQ" , "TYR" , "TYS" , "TYT" , "TYU" , "TYV" , "TYW" , "TYX" ,
+"TYY" , "TYZ" , "TY0" , "TY1" , "TY2" , "TY3" , "TY4" , "TY5" ,
+"TY6" , "TY7" , "TY8" , "TY9" , "TZA" , "TZB" , "TZC" , "TZD" ,
+"TZE" , "TZF" , "TZG" , "TZH" , "TZI" , "TZJ" , "TZK" , "TZL" ,
+"TZM" , "TZN" , "TZO" , "TZP" , "TZQ" , "TZR" , "TZS" , "TZT" ,
+"TZU" , "TZV" , "TZW" , "TZX" , "TZY" , "TZZ" , "TZ0" , "TZ1" ,
+"TZ2" , "TZ3" , "TZ4" , "TZ5" , "TZ6" , "TZ7" , "TZ8" , "TZ9" ,
+"T0A" , "T0B" , "T0C" , "T0D" , "T0E" , "T0F" , "T0G" , "T0H" ,
+"T0I" , "T0J" , "T0K" , "T0L" , "T0M" , "T0N" , "T0O" , "T0P" ,
+"T0Q" , "T0R" , "T0S" , "T0T" , "T0U" , "T0V" , "T0W" , "T0X" ,
+"T0Y" , "T0Z" , "T00" , "T01" , "T02" , "T03" , "T04" , "T05" ,
+"T06" , "T07" , "T08" , "T09" , "T1A" , "T1B" , "T1C" , "T1D" ,
+"T1E" , "T1F" , "T1G" , "T1H" , "T1I" , "T1J" , "T1K" , "T1L" ,
+"T1M" , "T1N" , "T1O" , "T1P" , "T1Q" , "T1R" , "T1S" , "T1T" ,
+"T1U" , "T1V" , "T1W" , "T1X" , "T1Y" , "T1Z" , "T10" , "T11" ,
+"T12" , "T13" , "T14" , "T15" , "T16" , "T17" , "T18" , "T19" ,
+"T2A" , "T2B" , "T2C" , "T2D" , "T2E" , "T2F" , "T2G" , "T2H" ,
+"T2I" , "T2J" , "T2K" , "T2L" , "T2M" , "T2N" , "T2O" , "T2P" ,
+"T2Q" , "T2R" , "T2S" , "T2T" , "T2U" , "T2V" , "T2W" , "T2X" ,
+"T2Y" , "T2Z" , "T20" , "T21" , "T22" , "T23" , "T24" , "T25" ,
+"T26" , "T27" , "T28" , "T29" , "T3A" , "T3B" , "T3C" , "T3D" ,
+"T3E" , "T3F" , "T3G" , "T3H" , "T3I" , "T3J" , "T3K" , "T3L" ,
+"T3M" , "T3N" , "T3O" , "T3P" , "T3Q" , "T3R" , "T3S" , "T3T" ,
+"T3U" , "T3V" , "T3W" , "T3X" , "T3Y" , "T3Z" , "T30" , "T31" ,
+"T32" , "T33" , "T34" , "T35" , "T36" , "T37" , "T38" , "T39" ,
+"T4A" , "T4B" , "T4C" , "T4D" , "T4E" , "T4F" , "T4G" , "T4H" ,
+"T4I" , "T4J" , "T4K" , "T4L" , "T4M" , "T4N" , "T4O" , "T4P" ,
+"T4Q" , "T4R" , "T4S" , "T4T" , "T4U" , "T4V" , "T4W" , "T4X" ,
+"T4Y" , "T4Z" , "T40" , "T41" , "T42" , "T43" , "T44" , "T45" ,
+"T46" , "T47" , "T48" , "T49" , "T5A" , "T5B" , "T5C" , "T5D" ,
+"T5E" , "T5F" , "T5G" , "T5H" , "T5I" , "T5J" , "T5K" , "T5L" ,
+"T5M" , "T5N" , "T5O" , "T5P" , "T5Q" , "T5R" , "T5S" , "T5T" ,
+"T5U" , "T5V" , "T5W" , "T5X" , "T5Y" , "T5Z" , "T50" , "T51" ,
+"T52" , "T53" , "T54" , "T55" , "T56" , "T57" , "T58" , "T59" ,
+"T6A" , "T6B" , "T6C" , "T6D" , "T6E" , "T6F" , "T6G" , "T6H" ,
+"T6I" , "T6J" , "T6K" , "T6L" , "T6M" , "T6N" , "T6O" , "T6P" ,
+"T6Q" , "T6R" , "T6S" , "T6T" , "T6U" , "T6V" , "T6W" , "T6X" ,
+"T6Y" , "T6Z" , "T60" , "T61" , "T62" , "T63" , "T64" , "T65" ,
+"T66" , "T67" , "T68" , "T69" , "T7A" , "T7B" , "T7C" , "T7D" ,
+"T7E" , "T7F" , "T7G" , "T7H" , "T7I" , "T7J" , "T7K" , "T7L" ,
+"T7M" , "T7N" , "T7O" , "T7P" , "T7Q" , "T7R" , "T7S" , "T7T" ,
+"T7U" , "T7V" , "T7W" , "T7X" , "T7Y" , "T7Z" , "T70" , "T71" ,
+"T72" , "T73" , "T74" , "T75" , "T76" , "T77" , "T78" , "T79" ,
+"T8A" , "T8B" , "T8C" , "T8D" , "T8E" , "T8F" , "T8G" , "T8H" ,
+"T8I" , "T8J" , "T8K" , "T8L" , "T8M" , "T8N" , "T8O" , "T8P" ,
+"T8Q" , "T8R" , "T8S" , "T8T" , "T8U" , "T8V" , "T8W" , "T8X" ,
+"T8Y" , "T8Z" , "T80" , "T81" , "T82" , "T83" , "T84" , "T85" ,
+"T86" , "T87" , "T88" , "T89" , "T9A" , "T9B" , "T9C" , "T9D" ,
+"T9E" , "T9F" , "T9G" , "T9H" , "T9I" , "T9J" , "T9K" , "T9L" ,
+"T9M" , "T9N" , "T9O" , "T9P" , "T9Q" , "T9R" , "T9S" , "T9T" ,
+"T9U" , "T9V" , "T9W" , "T9X" , "T9Y" , "T9Z" , "T90" , "T91" ,
+"T92" , "T93" , "T94" , "T95" , "T96" , "T97" , "T98" , "T99" ,
+"UAA" , "UAB" , "UAC" , "UAD" , "UAE" , "UAF" , "UAG" , "UAH" ,
+"UAI" , "UAJ" , "UAK" , "UAL" , "UAM" , "UAN" , "UAO" , "UAP" ,
+"UAQ" , "UAR" , "UAS" , "UAT" , "UAU" , "UAV" , "UAW" , "UAX" ,
+"UAY" , "UAZ" , "UA0" , "UA1" , "UA2" , "UA3" , "UA4" , "UA5" ,
+"UA6" , "UA7" , "UA8" , "UA9" , "UBA" , "UBB" , "UBC" , "UBD" ,
+"UBE" , "UBF" , "UBG" , "UBH" , "UBI" , "UBJ" , "UBK" , "UBL" ,
+"UBM" , "UBN" , "UBO" , "UBP" , "UBQ" , "UBR" , "UBS" , "UBT" ,
+"UBU" , "UBV" , "UBW" , "UBX" , "UBY" , "UBZ" , "UB0" , "UB1" ,
+"UB2" , "UB3" , "UB4" , "UB5" , "UB6" , "UB7" , "UB8" , "UB9" ,
+"UCA" , "UCB" , "UCC" , "UCD" , "UCE" , "UCF" , "UCG" , "UCH" ,
+"UCI" , "UCJ" , "UCK" , "UCL" , "UCM" , "UCN" , "UCO" , "UCP" ,
+"UCQ" , "UCR" , "UCS" , "UCT" , "UCU" , "UCV" , "UCW" , "UCX" ,
+"UCY" , "UCZ" , "UC0" , "UC1" , "UC2" , "UC3" , "UC4" , "UC5" ,
+"UC6" , "UC7" , "UC8" , "UC9" , "UDA" , "UDB" , "UDC" , "UDD" ,
+"UDE" , "UDF" , "UDG" , "UDH" , "UDI" , "UDJ" , "UDK" , "UDL" ,
+"UDM" , "UDN" , "UDO" , "UDP" , "UDQ" , "UDR" , "UDS" , "UDT" ,
+"UDU" , "UDV" , "UDW" , "UDX" , "UDY" , "UDZ" , "UD0" , "UD1" ,
+"UD2" , "UD3" , "UD4" , "UD5" , "UD6" , "UD7" , "UD8" , "UD9" ,
+"UEA" , "UEB" , "UEC" , "UED" , "UEE" , "UEF" , "UEG" , "UEH" ,
+"UEI" , "UEJ" , "UEK" , "UEL" , "UEM" , "UEN" , "UEO" , "UEP" ,
+"UEQ" , "UER" , "UES" , "UET" , "UEU" , "UEV" , "UEW" , "UEX" ,
+"UEY" , "UEZ" , "UE0" , "UE1" , "UE2" , "UE3" , "UE4" , "UE5" ,
+"UE6" , "UE7" , "UE8" , "UE9" , "UFA" , "UFB" , "UFC" , "UFD" ,
+"UFE" , "UFF" , "UFG" , "UFH" , "UFI" , "UFJ" , "UFK" , "UFL" ,
+"UFM" , "UFN" , "UFO" , "UFP" , "UFQ" , "UFR" , "UFS" , "UFT" ,
+"UFU" , "UFV" , "UFW" , "UFX" , "UFY" , "UFZ" , "UF0" , "UF1" ,
+"UF2" , "UF3" , "UF4" , "UF5" , "UF6" , "UF7" , "UF8" , "UF9" ,
+"UGA" , "UGB" , "UGC" , "UGD" , "UGE" , "UGF" , "UGG" , "UGH" ,
+"UGI" , "UGJ" , "UGK" , "UGL" , "UGM" , "UGN" , "UGO" , "UGP" ,
+"UGQ" , "UGR" , "UGS" , "UGT" , "UGU" , "UGV" , "UGW" , "UGX" ,
+"UGY" , "UGZ" , "UG0" , "UG1" , "UG2" , "UG3" , "UG4" , "UG5" ,
+"UG6" , "UG7" , "UG8" , "UG9" , "UHA" , "UHB" , "UHC" , "UHD" ,
+"UHE" , "UHF" , "UHG" , "UHH" , "UHI" , "UHJ" , "UHK" , "UHL" ,
+"UHM" , "UHN" , "UHO" , "UHP" , "UHQ" , "UHR" , "UHS" , "UHT" ,
+"UHU" , "UHV" , "UHW" , "UHX" , "UHY" , "UHZ" , "UH0" , "UH1" ,
+"UH2" , "UH3" , "UH4" , "UH5" , "UH6" , "UH7" , "UH8" , "UH9" ,
+"UIA" , "UIB" , "UIC" , "UID" , "UIE" , "UIF" , "UIG" , "UIH" ,
+"UII" , "UIJ" , "UIK" , "UIL" , "UIM" , "UIN" , "UIO" , "UIP" ,
+"UIQ" , "UIR" , "UIS" , "UIT" , "UIU" , "UIV" , "UIW" , "UIX" ,
+"UIY" , "UIZ" , "UI0" , "UI1" , "UI2" , "UI3" , "UI4" , "UI5" ,
+"UI6" , "UI7" , "UI8" , "UI9" , "UJA" , "UJB" , "UJC" , "UJD" ,
+"UJE" , "UJF" , "UJG" , "UJH" , "UJI" , "UJJ" , "UJK" , "UJL" ,
+"UJM" , "UJN" , "UJO" , "UJP" , "UJQ" , "UJR" , "UJS" , "UJT" ,
+"UJU" , "UJV" , "UJW" , "UJX" , "UJY" , "UJZ" , "UJ0" , "UJ1" ,
+"UJ2" , "UJ3" , "UJ4" , "UJ5" , "UJ6" , "UJ7" , "UJ8" , "UJ9" ,
+"UKA" , "UKB" , "UKC" , "UKD" , "UKE" , "UKF" , "UKG" , "UKH" ,
+"UKI" , "UKJ" , "UKK" , "UKL" , "UKM" , "UKN" , "UKO" , "UKP" ,
+"UKQ" , "UKR" , "UKS" , "UKT" , "UKU" , "UKV" , "UKW" , "UKX" ,
+"UKY" , "UKZ" , "UK0" , "UK1" , "UK2" , "UK3" , "UK4" , "UK5" ,
+"UK6" , "UK7" , "UK8" , "UK9" , "ULA" , "ULB" , "ULC" , "ULD" ,
+"ULE" , "ULF" , "ULG" , "ULH" , "ULI" , "ULJ" , "ULK" , "ULL" ,
+"ULM" , "ULN" , "ULO" , "ULP" , "ULQ" , "ULR" , "ULS" , "ULT" ,
+"ULU" , "ULV" , "ULW" , "ULX" , "ULY" , "ULZ" , "UL0" , "UL1" ,
+"UL2" , "UL3" , "UL4" , "UL5" , "UL6" , "UL7" , "UL8" , "UL9" ,
+"UMA" , "UMB" , "UMC" , "UMD" , "UME" , "UMF" , "UMG" , "UMH" ,
+"UMI" , "UMJ" , "UMK" , "UML" , "UMM" , "UMN" , "UMO" , "UMP" ,
+"UMQ" , "UMR" , "UMS" , "UMT" , "UMU" , "UMV" , "UMW" , "UMX" ,
+"UMY" , "UMZ" , "UM0" , "UM1" , "UM2" , "UM3" , "UM4" , "UM5" ,
+"UM6" , "UM7" , "UM8" , "UM9" , "UNA" , "UNB" , "UNC" , "UND" ,
+"UNE" , "UNF" , "UNG" , "UNH" , "UNI" , "UNJ" , "UNK" , "UNL" ,
+"UNM" , "UNN" , "UNO" , "UNP" , "UNQ" , "UNR" , "UNS" , "UNT" ,
+"UNU" , "UNV" , "UNW" , "UNX" , "UNY" , "UNZ" , "UN0" , "UN1" ,
+"UN2" , "UN3" , "UN4" , "UN5" , "UN6" , "UN7" , "UN8" , "UN9" ,
+"UOA" , "UOB" , "UOC" , "UOD" , "UOE" , "UOF" , "UOG" , "UOH" ,
+"UOI" , "UOJ" , "UOK" , "UOL" , "UOM" , "UON" , "UOO" , "UOP" ,
+"UOQ" , "UOR" , "UOS" , "UOT" , "UOU" , "UOV" , "UOW" , "UOX" ,
+"UOY" , "UOZ" , "UO0" , "UO1" , "UO2" , "UO3" , "UO4" , "UO5" ,
+"UO6" , "UO7" , "UO8" , "UO9" , "UPA" , "UPB" , "UPC" , "UPD" ,
+"UPE" , "UPF" , "UPG" , "UPH" , "UPI" , "UPJ" , "UPK" , "UPL" ,
+"UPM" , "UPN" , "UPO" , "UPP" , "UPQ" , "UPR" , "UPS" , "UPT" ,
+"UPU" , "UPV" , "UPW" , "UPX" , "UPY" , "UPZ" , "UP0" , "UP1" ,
+"UP2" , "UP3" , "UP4" , "UP5" , "UP6" , "UP7" , "UP8" , "UP9" ,
+"UQA" , "UQB" , "UQC" , "UQD" , "UQE" , "UQF" , "UQG" , "UQH" ,
+"UQI" , "UQJ" , "UQK" , "UQL" , "UQM" , "UQN" , "UQO" , "UQP" ,
+"UQQ" , "UQR" , "UQS" , "UQT" , "UQU" , "UQV" , "UQW" , "UQX" ,
+"UQY" , "UQZ" , "UQ0" , "UQ1" , "UQ2" , "UQ3" , "UQ4" , "UQ5" ,
+"UQ6" , "UQ7" , "UQ8" , "UQ9" , "URA" , "URB" , "URC" , "URD" ,
+"URE" , "URF" , "URG" , "URH" , "URI" , "URJ" , "URK" , "URL" ,
+"URM" , "URN" , "URO" , "URP" , "URQ" , "URR" , "URS" , "URT" ,
+"URU" , "URV" , "URW" , "URX" , "URY" , "URZ" , "UR0" , "UR1" ,
+"UR2" , "UR3" , "UR4" , "UR5" , "UR6" , "UR7" , "UR8" , "UR9" ,
+"USA" , "USB" , "USC" , "USD" , "USE" , "USF" , "USG" , "USH" ,
+"USI" , "USJ" , "USK" , "USL" , "USM" , "USN" , "USO" , "USP" ,
+"USQ" , "USR" , "USS" , "UST" , "USU" , "USV" , "USW" , "USX" ,
+"USY" , "USZ" , "US0" , "US1" , "US2" , "US3" , "US4" , "US5" ,
+"US6" , "US7" , "US8" , "US9" , "UTA" , "UTB" , "UTC" , "UTD" ,
+"UTE" , "UTF" , "UTG" , "UTH" , "UTI" , "UTJ" , "UTK" , "UTL" ,
+"UTM" , "UTN" , "UTO" , "UTP" , "UTQ" , "UTR" , "UTS" , "UTT" ,
+"UTU" , "UTV" , "UTW" , "UTX" , "UTY" , "UTZ" , "UT0" , "UT1" ,
+"UT2" , "UT3" , "UT4" , "UT5" , "UT6" , "UT7" , "UT8" , "UT9" ,
+"UUA" , "UUB" , "UUC" , "UUD" , "UUE" , "UUF" , "UUG" , "UUH" ,
+"UUI" , "UUJ" , "UUK" , "UUL" , "UUM" , "UUN" , "UUO" , "UUP" ,
+"UUQ" , "UUR" , "UUS" , "UUT" , "UUU" , "UUV" , "UUW" , "UUX" ,
+"UUY" , "UUZ" , "UU0" , "UU1" , "UU2" , "UU3" , "UU4" , "UU5" ,
+"UU6" , "UU7" , "UU8" , "UU9" , "UVA" , "UVB" , "UVC" , "UVD" ,
+"UVE" , "UVF" , "UVG" , "UVH" , "UVI" , "UVJ" , "UVK" , "UVL" ,
+"UVM" , "UVN" , "UVO" , "UVP" , "UVQ" , "UVR" , "UVS" , "UVT" ,
+"UVU" , "UVV" , "UVW" , "UVX" , "UVY" , "UVZ" , "UV0" , "UV1" ,
+"UV2" , "UV3" , "UV4" , "UV5" , "UV6" , "UV7" , "UV8" , "UV9" ,
+"UWA" , "UWB" , "UWC" , "UWD" , "UWE" , "UWF" , "UWG" , "UWH" ,
+"UWI" , "UWJ" , "UWK" , "UWL" , "UWM" , "UWN" , "UWO" , "UWP" ,
+"UWQ" , "UWR" , "UWS" , "UWT" , "UWU" , "UWV" , "UWW" , "UWX" ,
+"UWY" , "UWZ" , "UW0" , "UW1" , "UW2" , "UW3" , "UW4" , "UW5" ,
+"UW6" , "UW7" , "UW8" , "UW9" , "UXA" , "UXB" , "UXC" , "UXD" ,
+"UXE" , "UXF" , "UXG" , "UXH" , "UXI" , "UXJ" , "UXK" , "UXL" ,
+"UXM" , "UXN" , "UXO" , "UXP" , "UXQ" , "UXR" , "UXS" , "UXT" ,
+"UXU" , "UXV" , "UXW" , "UXX" , "UXY" , "UXZ" , "UX0" , "UX1" ,
+"UX2" , "UX3" , "UX4" , "UX5" , "UX6" , "UX7" , "UX8" , "UX9" ,
+"UYA" , "UYB" , "UYC" , "UYD" , "UYE" , "UYF" , "UYG" , "UYH" ,
+"UYI" , "UYJ" , "UYK" , "UYL" , "UYM" , "UYN" , "UYO" , "UYP" ,
+"UYQ" , "UYR" , "UYS" , "UYT" , "UYU" , "UYV" , "UYW" , "UYX" ,
+"UYY" , "UYZ" , "UY0" , "UY1" , "UY2" , "UY3" , "UY4" , "UY5" ,
+"UY6" , "UY7" , "UY8" , "UY9" , "UZA" , "UZB" , "UZC" , "UZD" ,
+"UZE" , "UZF" , "UZG" , "UZH" , "UZI" , "UZJ" , "UZK" , "UZL" ,
+"UZM" , "UZN" , "UZO" , "UZP" , "UZQ" , "UZR" , "UZS" , "UZT" ,
+"UZU" , "UZV" , "UZW" , "UZX" , "UZY" , "UZZ" , "UZ0" , "UZ1" ,
+"UZ2" , "UZ3" , "UZ4" , "UZ5" , "UZ6" , "UZ7" , "UZ8" , "UZ9" ,
+"U0A" , "U0B" , "U0C" , "U0D" , "U0E" , "U0F" , "U0G" , "U0H" ,
+"U0I" , "U0J" , "U0K" , "U0L" , "U0M" , "U0N" , "U0O" , "U0P" ,
+"U0Q" , "U0R" , "U0S" , "U0T" , "U0U" , "U0V" , "U0W" , "U0X" ,
+"U0Y" , "U0Z" , "U00" , "U01" , "U02" , "U03" , "U04" , "U05" ,
+"U06" , "U07" , "U08" , "U09" , "U1A" , "U1B" , "U1C" , "U1D" ,
+"U1E" , "U1F" , "U1G" , "U1H" , "U1I" , "U1J" , "U1K" , "U1L" ,
+"U1M" , "U1N" , "U1O" , "U1P" , "U1Q" , "U1R" , "U1S" , "U1T" ,
+"U1U" , "U1V" , "U1W" , "U1X" , "U1Y" , "U1Z" , "U10" , "U11" ,
+"U12" , "U13" , "U14" , "U15" , "U16" , "U17" , "U18" , "U19" ,
+"U2A" , "U2B" , "U2C" , "U2D" , "U2E" , "U2F" , "U2G" , "U2H" ,
+"U2I" , "U2J" , "U2K" , "U2L" , "U2M" , "U2N" , "U2O" , "U2P" ,
+"U2Q" , "U2R" , "U2S" , "U2T" , "U2U" , "U2V" , "U2W" , "U2X" ,
+"U2Y" , "U2Z" , "U20" , "U21" , "U22" , "U23" , "U24" , "U25" ,
+"U26" , "U27" , "U28" , "U29" , "U3A" , "U3B" , "U3C" , "U3D" ,
+"U3E" , "U3F" , "U3G" , "U3H" , "U3I" , "U3J" , "U3K" , "U3L" ,
+"U3M" , "U3N" , "U3O" , "U3P" , "U3Q" , "U3R" , "U3S" , "U3T" ,
+"U3U" , "U3V" , "U3W" , "U3X" , "U3Y" , "U3Z" , "U30" , "U31" ,
+"U32" , "U33" , "U34" , "U35" , "U36" , "U37" , "U38" , "U39" ,
+"U4A" , "U4B" , "U4C" , "U4D" , "U4E" , "U4F" , "U4G" , "U4H" ,
+"U4I" , "U4J" , "U4K" , "U4L" , "U4M" , "U4N" , "U4O" , "U4P" ,
+"U4Q" , "U4R" , "U4S" , "U4T" , "U4U" , "U4V" , "U4W" , "U4X" ,
+"U4Y" , "U4Z" , "U40" , "U41" , "U42" , "U43" , "U44" , "U45" ,
+"U46" , "U47" , "U48" , "U49" , "U5A" , "U5B" , "U5C" , "U5D" ,
+"U5E" , "U5F" , "U5G" , "U5H" , "U5I" , "U5J" , "U5K" , "U5L" ,
+"U5M" , "U5N" , "U5O" , "U5P" , "U5Q" , "U5R" , "U5S" , "U5T" ,
+"U5U" , "U5V" , "U5W" , "U5X" , "U5Y" , "U5Z" , "U50" , "U51" ,
+"U52" , "U53" , "U54" , "U55" , "U56" , "U57" , "U58" , "U59" ,
+"U6A" , "U6B" , "U6C" , "U6D" , "U6E" , "U6F" , "U6G" , "U6H" ,
+"U6I" , "U6J" , "U6K" , "U6L" , "U6M" , "U6N" , "U6O" , "U6P" ,
+"U6Q" , "U6R" , "U6S" , "U6T" , "U6U" , "U6V" , "U6W" , "U6X" ,
+"U6Y" , "U6Z" , "U60" , "U61" , "U62" , "U63" , "U64" , "U65" ,
+"U66" , "U67" , "U68" , "U69" , "U7A" , "U7B" , "U7C" , "U7D" ,
+"U7E" , "U7F" , "U7G" , "U7H" , "U7I" , "U7J" , "U7K" , "U7L" ,
+"U7M" , "U7N" , "U7O" , "U7P" , "U7Q" , "U7R" , "U7S" , "U7T" ,
+"U7U" , "U7V" , "U7W" , "U7X" , "U7Y" , "U7Z" , "U70" , "U71" ,
+"U72" , "U73" , "U74" , "U75" , "U76" , "U77" , "U78" , "U79" ,
+"U8A" , "U8B" , "U8C" , "U8D" , "U8E" , "U8F" , "U8G" , "U8H" ,
+"U8I" , "U8J" , "U8K" , "U8L" , "U8M" , "U8N" , "U8O" , "U8P" ,
+"U8Q" , "U8R" , "U8S" , "U8T" , "U8U" , "U8V" , "U8W" , "U8X" ,
+"U8Y" , "U8Z" , "U80" , "U81" , "U82" , "U83" , "U84" , "U85" ,
+"U86" , "U87" , "U88" , "U89" , "U9A" , "U9B" , "U9C" , "U9D" ,
+"U9E" , "U9F" , "U9G" , "U9H" , "U9I" , "U9J" , "U9K" , "U9L" ,
+"U9M" , "U9N" , "U9O" , "U9P" , "U9Q" , "U9R" , "U9S" , "U9T" ,
+"U9U" , "U9V" , "U9W" , "U9X" , "U9Y" , "U9Z" , "U90" , "U91" ,
+"U92" , "U93" , "U94" , "U95" , "U96" , "U97" , "U98" , "U99" ,
+"VAA" , "VAB" , "VAC" , "VAD" , "VAE" , "VAF" , "VAG" , "VAH" ,
+"VAI" , "VAJ" , "VAK" , "VAL" , "VAM" , "VAN" , "VAO" , "VAP" ,
+"VAQ" , "VAR" , "VAS" , "VAT" , "VAU" , "VAV" , "VAW" , "VAX" ,
+"VAY" , "VAZ" , "VA0" , "VA1" , "VA2" , "VA3" , "VA4" , "VA5" ,
+"VA6" , "VA7" , "VA8" , "VA9" , "VBA" , "VBB" , "VBC" , "VBD" ,
+"VBE" , "VBF" , "VBG" , "VBH" , "VBI" , "VBJ" , "VBK" , "VBL" ,
+"VBM" , "VBN" , "VBO" , "VBP" , "VBQ" , "VBR" , "VBS" , "VBT" ,
+"VBU" , "VBV" , "VBW" , "VBX" , "VBY" , "VBZ" , "VB0" , "VB1" ,
+"VB2" , "VB3" , "VB4" , "VB5" , "VB6" , "VB7" , "VB8" , "VB9" ,
+"VCA" , "VCB" , "VCC" , "VCD" , "VCE" , "VCF" , "VCG" , "VCH" ,
+"VCI" , "VCJ" , "VCK" , "VCL" , "VCM" , "VCN" , "VCO" , "VCP" ,
+"VCQ" , "VCR" , "VCS" , "VCT" , "VCU" , "VCV" , "VCW" , "VCX" ,
+"VCY" , "VCZ" , "VC0" , "VC1" , "VC2" , "VC3" , "VC4" , "VC5" ,
+"VC6" , "VC7" , "VC8" , "VC9" , "VDA" , "VDB" , "VDC" , "VDD" ,
+"VDE" , "VDF" , "VDG" , "VDH" , "VDI" , "VDJ" , "VDK" , "VDL" ,
+"VDM" , "VDN" , "VDO" , "VDP" , "VDQ" , "VDR" , "VDS" , "VDT" ,
+"VDU" , "VDV" , "VDW" , "VDX" , "VDY" , "VDZ" , "VD0" , "VD1" ,
+"VD2" , "VD3" , "VD4" , "VD5" , "VD6" , "VD7" , "VD8" , "VD9" ,
+"VEA" , "VEB" , "VEC" , "VED" , "VEE" , "VEF" , "VEG" , "VEH" ,
+"VEI" , "VEJ" , "VEK" , "VEL" , "VEM" , "VEN" , "VEO" , "VEP" ,
+"VEQ" , "VER" , "VES" , "VET" , "VEU" , "VEV" , "VEW" , "VEX" ,
+"VEY" , "VEZ" , "VE0" , "VE1" , "VE2" , "VE3" , "VE4" , "VE5" ,
+"VE6" , "VE7" , "VE8" , "VE9" , "VFA" , "VFB" , "VFC" , "VFD" ,
+"VFE" , "VFF" , "VFG" , "VFH" , "VFI" , "VFJ" , "VFK" , "VFL" ,
+"VFM" , "VFN" , "VFO" , "VFP" , "VFQ" , "VFR" , "VFS" , "VFT" ,
+"VFU" , "VFV" , "VFW" , "VFX" , "VFY" , "VFZ" , "VF0" , "VF1" ,
+"VF2" , "VF3" , "VF4" , "VF5" , "VF6" , "VF7" , "VF8" , "VF9" ,
+"VGA" , "VGB" , "VGC" , "VGD" , "VGE" , "VGF" , "VGG" , "VGH" ,
+"VGI" , "VGJ" , "VGK" , "VGL" , "VGM" , "VGN" , "VGO" , "VGP" ,
+"VGQ" , "VGR" , "VGS" , "VGT" , "VGU" , "VGV" , "VGW" , "VGX" ,
+"VGY" , "VGZ" , "VG0" , "VG1" , "VG2" , "VG3" , "VG4" , "VG5" ,
+"VG6" , "VG7" , "VG8" , "VG9" , "VHA" , "VHB" , "VHC" , "VHD" ,
+"VHE" , "VHF" , "VHG" , "VHH" , "VHI" , "VHJ" , "VHK" , "VHL" ,
+"VHM" , "VHN" , "VHO" , "VHP" , "VHQ" , "VHR" , "VHS" , "VHT" ,
+"VHU" , "VHV" , "VHW" , "VHX" , "VHY" , "VHZ" , "VH0" , "VH1" ,
+"VH2" , "VH3" , "VH4" , "VH5" , "VH6" , "VH7" , "VH8" , "VH9" ,
+"VIA" , "VIB" , "VIC" , "VID" , "VIE" , "VIF" , "VIG" , "VIH" ,
+"VII" , "VIJ" , "VIK" , "VIL" , "VIM" , "VIN" , "VIO" , "VIP" ,
+"VIQ" , "VIR" , "VIS" , "VIT" , "VIU" , "VIV" , "VIW" , "VIX" ,
+"VIY" , "VIZ" , "VI0" , "VI1" , "VI2" , "VI3" , "VI4" , "VI5" ,
+"VI6" , "VI7" , "VI8" , "VI9" , "VJA" , "VJB" , "VJC" , "VJD" ,
+"VJE" , "VJF" , "VJG" , "VJH" , "VJI" , "VJJ" , "VJK" , "VJL" ,
+"VJM" , "VJN" , "VJO" , "VJP" , "VJQ" , "VJR" , "VJS" , "VJT" ,
+"VJU" , "VJV" , "VJW" , "VJX" , "VJY" , "VJZ" , "VJ0" , "VJ1" ,
+"VJ2" , "VJ3" , "VJ4" , "VJ5" , "VJ6" , "VJ7" , "VJ8" , "VJ9" ,
+"VKA" , "VKB" , "VKC" , "VKD" , "VKE" , "VKF" , "VKG" , "VKH" ,
+"VKI" , "VKJ" , "VKK" , "VKL" , "VKM" , "VKN" , "VKO" , "VKP" ,
+"VKQ" , "VKR" , "VKS" , "VKT" , "VKU" , "VKV" , "VKW" , "VKX" ,
+"VKY" , "VKZ" , "VK0" , "VK1" , "VK2" , "VK3" , "VK4" , "VK5" ,
+"VK6" , "VK7" , "VK8" , "VK9" , "VLA" , "VLB" , "VLC" , "VLD" ,
+"VLE" , "VLF" , "VLG" , "VLH" , "VLI" , "VLJ" , "VLK" , "VLL" ,
+"VLM" , "VLN" , "VLO" , "VLP" , "VLQ" , "VLR" , "VLS" , "VLT" ,
+"VLU" , "VLV" , "VLW" , "VLX" , "VLY" , "VLZ" , "VL0" , "VL1" ,
+"VL2" , "VL3" , "VL4" , "VL5" , "VL6" , "VL7" , "VL8" , "VL9" ,
+"VMA" , "VMB" , "VMC" , "VMD" , "VME" , "VMF" , "VMG" , "VMH" ,
+"VMI" , "VMJ" , "VMK" , "VML" , "VMM" , "VMN" , "VMO" , "VMP" ,
+"VMQ" , "VMR" , "VMS" , "VMT" , "VMU" , "VMV" , "VMW" , "VMX" ,
+"VMY" , "VMZ" , "VM0" , "VM1" , "VM2" , "VM3" , "VM4" , "VM5" ,
+"VM6" , "VM7" , "VM8" , "VM9" , "VNA" , "VNB" , "VNC" , "VND" ,
+"VNE" , "VNF" , "VNG" , "VNH" , "VNI" , "VNJ" , "VNK" , "VNL" ,
+"VNM" , "VNN" , "VNO" , "VNP" , "VNQ" , "VNR" , "VNS" , "VNT" ,
+"VNU" , "VNV" , "VNW" , "VNX" , "VNY" , "VNZ" , "VN0" , "VN1" ,
+"VN2" , "VN3" , "VN4" , "VN5" , "VN6" , "VN7" , "VN8" , "VN9" ,
+"VOA" , "VOB" , "VOC" , "VOD" , "VOE" , "VOF" , "VOG" , "VOH" ,
+"VOI" , "VOJ" , "VOK" , "VOL" , "VOM" , "VON" , "VOO" , "VOP" ,
+"VOQ" , "VOR" , "VOS" , "VOT" , "VOU" , "VOV" , "VOW" , "VOX" ,
+"VOY" , "VOZ" , "VO0" , "VO1" , "VO2" , "VO3" , "VO4" , "VO5" ,
+"VO6" , "VO7" , "VO8" , "VO9" , "VPA" , "VPB" , "VPC" , "VPD" ,
+"VPE" , "VPF" , "VPG" , "VPH" , "VPI" , "VPJ" , "VPK" , "VPL" ,
+"VPM" , "VPN" , "VPO" , "VPP" , "VPQ" , "VPR" , "VPS" , "VPT" ,
+"VPU" , "VPV" , "VPW" , "VPX" , "VPY" , "VPZ" , "VP0" , "VP1" ,
+"VP2" , "VP3" , "VP4" , "VP5" , "VP6" , "VP7" , "VP8" , "VP9" ,
+"VQA" , "VQB" , "VQC" , "VQD" , "VQE" , "VQF" , "VQG" , "VQH" ,
+"VQI" , "VQJ" , "VQK" , "VQL" , "VQM" , "VQN" , "VQO" , "VQP" ,
+"VQQ" , "VQR" , "VQS" , "VQT" , "VQU" , "VQV" , "VQW" , "VQX" ,
+"VQY" , "VQZ" , "VQ0" , "VQ1" , "VQ2" , "VQ3" , "VQ4" , "VQ5" ,
+"VQ6" , "VQ7" , "VQ8" , "VQ9" , "VRA" , "VRB" , "VRC" , "VRD" ,
+"VRE" , "VRF" , "VRG" , "VRH" , "VRI" , "VRJ" , "VRK" , "VRL" ,
+"VRM" , "VRN" , "VRO" , "VRP" , "VRQ" , "VRR" , "VRS" , "VRT" ,
+"VRU" , "VRV" , "VRW" , "VRX" , "VRY" , "VRZ" , "VR0" , "VR1" ,
+"VR2" , "VR3" , "VR4" , "VR5" , "VR6" , "VR7" , "VR8" , "VR9" ,
+"VSA" , "VSB" , "VSC" , "VSD" , "VSE" , "VSF" , "VSG" , "VSH" ,
+"VSI" , "VSJ" , "VSK" , "VSL" , "VSM" , "VSN" , "VSO" , "VSP" ,
+"VSQ" , "VSR" , "VSS" , "VST" , "VSU" , "VSV" , "VSW" , "VSX" ,
+"VSY" , "VSZ" , "VS0" , "VS1" , "VS2" , "VS3" , "VS4" , "VS5" ,
+"VS6" , "VS7" , "VS8" , "VS9" , "VTA" , "VTB" , "VTC" , "VTD" ,
+"VTE" , "VTF" , "VTG" , "VTH" , "VTI" , "VTJ" , "VTK" , "VTL" ,
+"VTM" , "VTN" , "VTO" , "VTP" , "VTQ" , "VTR" , "VTS" , "VTT" ,
+"VTU" , "VTV" , "VTW" , "VTX" , "VTY" , "VTZ" , "VT0" , "VT1" ,
+"VT2" , "VT3" , "VT4" , "VT5" , "VT6" , "VT7" , "VT8" , "VT9" ,
+"VUA" , "VUB" , "VUC" , "VUD" , "VUE" , "VUF" , "VUG" , "VUH" ,
+"VUI" , "VUJ" , "VUK" , "VUL" , "VUM" , "VUN" , "VUO" , "VUP" ,
+"VUQ" , "VUR" , "VUS" , "VUT" , "VUU" , "VUV" , "VUW" , "VUX" ,
+"VUY" , "VUZ" , "VU0" , "VU1" , "VU2" , "VU3" , "VU4" , "VU5" ,
+"VU6" , "VU7" , "VU8" , "VU9" , "VVA" , "VVB" , "VVC" , "VVD" ,
+"VVE" , "VVF" , "VVG" , "VVH" , "VVI" , "VVJ" , "VVK" , "VVL" ,
+"VVM" , "VVN" , "VVO" , "VVP" , "VVQ" , "VVR" , "VVS" , "VVT" ,
+"VVU" , "VVV" , "VVW" , "VVX" , "VVY" , "VVZ" , "VV0" , "VV1" ,
+"VV2" , "VV3" , "VV4" , "VV5" , "VV6" , "VV7" , "VV8" , "VV9" ,
+"VWA" , "VWB" , "VWC" , "VWD" , "VWE" , "VWF" , "VWG" , "VWH" ,
+"VWI" , "VWJ" , "VWK" , "VWL" , "VWM" , "VWN" , "VWO" , "VWP" ,
+"VWQ" , "VWR" , "VWS" , "VWT" , "VWU" , "VWV" , "VWW" , "VWX" ,
+"VWY" , "VWZ" , "VW0" , "VW1" , "VW2" , "VW3" , "VW4" , "VW5" ,
+"VW6" , "VW7" , "VW8" , "VW9" , "VXA" , "VXB" , "VXC" , "VXD" ,
+"VXE" , "VXF" , "VXG" , "VXH" , "VXI" , "VXJ" , "VXK" , "VXL" ,
+"VXM" , "VXN" , "VXO" , "VXP" , "VXQ" , "VXR" , "VXS" , "VXT" ,
+"VXU" , "VXV" , "VXW" , "VXX" , "VXY" , "VXZ" , "VX0" , "VX1" ,
+"VX2" , "VX3" , "VX4" , "VX5" , "VX6" , "VX7" , "VX8" , "VX9" ,
+"VYA" , "VYB" , "VYC" , "VYD" , "VYE" , "VYF" , "VYG" , "VYH" ,
+"VYI" , "VYJ" , "VYK" , "VYL" , "VYM" , "VYN" , "VYO" , "VYP" ,
+"VYQ" , "VYR" , "VYS" , "VYT" , "VYU" , "VYV" , "VYW" , "VYX" ,
+"VYY" , "VYZ" , "VY0" , "VY1" , "VY2" , "VY3" , "VY4" , "VY5" ,
+"VY6" , "VY7" , "VY8" , "VY9" , "VZA" , "VZB" , "VZC" , "VZD" ,
+"VZE" , "VZF" , "VZG" , "VZH" , "VZI" , "VZJ" , "VZK" , "VZL" ,
+"VZM" , "VZN" , "VZO" , "VZP" , "VZQ" , "VZR" , "VZS" , "VZT" ,
+"VZU" , "VZV" , "VZW" , "VZX" , "VZY" , "VZZ" , "VZ0" , "VZ1" ,
+"VZ2" , "VZ3" , "VZ4" , "VZ5" , "VZ6" , "VZ7" , "VZ8" , "VZ9" ,
+"V0A" , "V0B" , "V0C" , "V0D" , "V0E" , "V0F" , "V0G" , "V0H" ,
+"V0I" , "V0J" , "V0K" , "V0L" , "V0M" , "V0N" , "V0O" , "V0P" ,
+"V0Q" , "V0R" , "V0S" , "V0T" , "V0U" , "V0V" , "V0W" , "V0X" ,
+"V0Y" , "V0Z" , "V00" , "V01" , "V02" , "V03" , "V04" , "V05" ,
+"V06" , "V07" , "V08" , "V09" , "V1A" , "V1B" , "V1C" , "V1D" ,
+"V1E" , "V1F" , "V1G" , "V1H" , "V1I" , "V1J" , "V1K" , "V1L" ,
+"V1M" , "V1N" , "V1O" , "V1P" , "V1Q" , "V1R" , "V1S" , "V1T" ,
+"V1U" , "V1V" , "V1W" , "V1X" , "V1Y" , "V1Z" , "V10" , "V11" ,
+"V12" , "V13" , "V14" , "V15" , "V16" , "V17" , "V18" , "V19" ,
+"V2A" , "V2B" , "V2C" , "V2D" , "V2E" , "V2F" , "V2G" , "V2H" ,
+"V2I" , "V2J" , "V2K" , "V2L" , "V2M" , "V2N" , "V2O" , "V2P" ,
+"V2Q" , "V2R" , "V2S" , "V2T" , "V2U" , "V2V" , "V2W" , "V2X" ,
+"V2Y" , "V2Z" , "V20" , "V21" , "V22" , "V23" , "V24" , "V25" ,
+"V26" , "V27" , "V28" , "V29" , "V3A" , "V3B" , "V3C" , "V3D" ,
+"V3E" , "V3F" , "V3G" , "V3H" , "V3I" , "V3J" , "V3K" , "V3L" ,
+"V3M" , "V3N" , "V3O" , "V3P" , "V3Q" , "V3R" , "V3S" , "V3T" ,
+"V3U" , "V3V" , "V3W" , "V3X" , "V3Y" , "V3Z" , "V30" , "V31" ,
+"V32" , "V33" , "V34" , "V35" , "V36" , "V37" , "V38" , "V39" ,
+"V4A" , "V4B" , "V4C" , "V4D" , "V4E" , "V4F" , "V4G" , "V4H" ,
+"V4I" , "V4J" , "V4K" , "V4L" , "V4M" , "V4N" , "V4O" , "V4P" ,
+"V4Q" , "V4R" , "V4S" , "V4T" , "V4U" , "V4V" , "V4W" , "V4X" ,
+"V4Y" , "V4Z" , "V40" , "V41" , "V42" , "V43" , "V44" , "V45" ,
+"V46" , "V47" , "V48" , "V49" , "V5A" , "V5B" , "V5C" , "V5D" ,
+"V5E" , "V5F" , "V5G" , "V5H" , "V5I" , "V5J" , "V5K" , "V5L" ,
+"V5M" , "V5N" , "V5O" , "V5P" , "V5Q" , "V5R" , "V5S" , "V5T" ,
+"V5U" , "V5V" , "V5W" , "V5X" , "V5Y" , "V5Z" , "V50" , "V51" ,
+"V52" , "V53" , "V54" , "V55" , "V56" , "V57" , "V58" , "V59" ,
+"V6A" , "V6B" , "V6C" , "V6D" , "V6E" , "V6F" , "V6G" , "V6H" ,
+"V6I" , "V6J" , "V6K" , "V6L" , "V6M" , "V6N" , "V6O" , "V6P" ,
+"V6Q" , "V6R" , "V6S" , "V6T" , "V6U" , "V6V" , "V6W" , "V6X" ,
+"V6Y" , "V6Z" , "V60" , "V61" , "V62" , "V63" , "V64" , "V65" ,
+"V66" , "V67" , "V68" , "V69" , "V7A" , "V7B" , "V7C" , "V7D" ,
+"V7E" , "V7F" , "V7G" , "V7H" , "V7I" , "V7J" , "V7K" , "V7L" ,
+"V7M" , "V7N" , "V7O" , "V7P" , "V7Q" , "V7R" , "V7S" , "V7T" ,
+"V7U" , "V7V" , "V7W" , "V7X" , "V7Y" , "V7Z" , "V70" , "V71" ,
+"V72" , "V73" , "V74" , "V75" , "V76" , "V77" , "V78" , "V79" ,
+"V8A" , "V8B" , "V8C" , "V8D" , "V8E" , "V8F" , "V8G" , "V8H" ,
+"V8I" , "V8J" , "V8K" , "V8L" , "V8M" , "V8N" , "V8O" , "V8P" ,
+"V8Q" , "V8R" , "V8S" , "V8T" , "V8U" , "V8V" , "V8W" , "V8X" ,
+"V8Y" , "V8Z" , "V80" , "V81" , "V82" , "V83" , "V84" , "V85" ,
+"V86" , "V87" , "V88" , "V89" , "V9A" , "V9B" , "V9C" , "V9D" ,
+"V9E" , "V9F" , "V9G" , "V9H" , "V9I" , "V9J" , "V9K" , "V9L" ,
+"V9M" , "V9N" , "V9O" , "V9P" , "V9Q" , "V9R" , "V9S" , "V9T" ,
+"V9U" , "V9V" , "V9W" , "V9X" , "V9Y" , "V9Z" , "V90" , "V91" ,
+"V92" , "V93" , "V94" , "V95" , "V96" , "V97" , "V98" , "V99" ,
+"WAA" , "WAB" , "WAC" , "WAD" , "WAE" , "WAF" , "WAG" , "WAH" ,
+"WAI" , "WAJ" , "WAK" , "WAL" , "WAM" , "WAN" , "WAO" , "WAP" ,
+"WAQ" , "WAR" , "WAS" , "WAT" , "WAU" , "WAV" , "WAW" , "WAX" ,
+"WAY" , "WAZ" , "WA0" , "WA1" , "WA2" , "WA3" , "WA4" , "WA5" ,
+"WA6" , "WA7" , "WA8" , "WA9" , "WBA" , "WBB" , "WBC" , "WBD" ,
+"WBE" , "WBF" , "WBG" , "WBH" , "WBI" , "WBJ" , "WBK" , "WBL" ,
+"WBM" , "WBN" , "WBO" , "WBP" , "WBQ" , "WBR" , "WBS" , "WBT" ,
+"WBU" , "WBV" , "WBW" , "WBX" , "WBY" , "WBZ" , "WB0" , "WB1" ,
+"WB2" , "WB3" , "WB4" , "WB5" , "WB6" , "WB7" , "WB8" , "WB9" ,
+"WCA" , "WCB" , "WCC" , "WCD" , "WCE" , "WCF" , "WCG" , "WCH" ,
+"WCI" , "WCJ" , "WCK" , "WCL" , "WCM" , "WCN" , "WCO" , "WCP" ,
+"WCQ" , "WCR" , "WCS" , "WCT" , "WCU" , "WCV" , "WCW" , "WCX" ,
+"WCY" , "WCZ" , "WC0" , "WC1" , "WC2" , "WC3" , "WC4" , "WC5" ,
+"WC6" , "WC7" , "WC8" , "WC9" , "WDA" , "WDB" , "WDC" , "WDD" ,
+"WDE" , "WDF" , "WDG" , "WDH" , "WDI" , "WDJ" , "WDK" , "WDL" ,
+"WDM" , "WDN" , "WDO" , "WDP" , "WDQ" , "WDR" , "WDS" , "WDT" ,
+"WDU" , "WDV" , "WDW" , "WDX" , "WDY" , "WDZ" , "WD0" , "WD1" ,
+"WD2" , "WD3" , "WD4" , "WD5" , "WD6" , "WD7" , "WD8" , "WD9" ,
+"WEA" , "WEB" , "WEC" , "WED" , "WEE" , "WEF" , "WEG" , "WEH" ,
+"WEI" , "WEJ" , "WEK" , "WEL" , "WEM" , "WEN" , "WEO" , "WEP" ,
+"WEQ" , "WER" , "WES" , "WET" , "WEU" , "WEV" , "WEW" , "WEX" ,
+"WEY" , "WEZ" , "WE0" , "WE1" , "WE2" , "WE3" , "WE4" , "WE5" ,
+"WE6" , "WE7" , "WE8" , "WE9" , "WFA" , "WFB" , "WFC" , "WFD" ,
+"WFE" , "WFF" , "WFG" , "WFH" , "WFI" , "WFJ" , "WFK" , "WFL" ,
+"WFM" , "WFN" , "WFO" , "WFP" , "WFQ" , "WFR" , "WFS" , "WFT" ,
+"WFU" , "WFV" , "WFW" , "WFX" , "WFY" , "WFZ" , "WF0" , "WF1" ,
+"WF2" , "WF3" , "WF4" , "WF5" , "WF6" , "WF7" , "WF8" , "WF9" ,
+"WGA" , "WGB" , "WGC" , "WGD" , "WGE" , "WGF" , "WGG" , "WGH" ,
+"WGI" , "WGJ" , "WGK" , "WGL" , "WGM" , "WGN" , "WGO" , "WGP" ,
+"WGQ" , "WGR" , "WGS" , "WGT" , "WGU" , "WGV" , "WGW" , "WGX" ,
+"WGY" , "WGZ" , "WG0" , "WG1" , "WG2" , "WG3" , "WG4" , "WG5" ,
+"WG6" , "WG7" , "WG8" , "WG9" , "WHA" , "WHB" , "WHC" , "WHD" ,
+"WHE" , "WHF" , "WHG" , "WHH" , "WHI" , "WHJ" , "WHK" , "WHL" ,
+"WHM" , "WHN" , "WHO" , "WHP" , "WHQ" , "WHR" , "WHS" , "WHT" ,
+"WHU" , "WHV" , "WHW" , "WHX" , "WHY" , "WHZ" , "WH0" , "WH1" ,
+"WH2" , "WH3" , "WH4" , "WH5" , "WH6" , "WH7" , "WH8" , "WH9" ,
+"WIA" , "WIB" , "WIC" , "WID" , "WIE" , "WIF" , "WIG" , "WIH" ,
+"WII" , "WIJ" , "WIK" , "WIL" , "WIM" , "WIN" , "WIO" , "WIP" ,
+"WIQ" , "WIR" , "WIS" , "WIT" , "WIU" , "WIV" , "WIW" , "WIX" ,
+"WIY" , "WIZ" , "WI0" , "WI1" , "WI2" , "WI3" , "WI4" , "WI5" ,
+"WI6" , "WI7" , "WI8" , "WI9" , "WJA" , "WJB" , "WJC" , "WJD" ,
+"WJE" , "WJF" , "WJG" , "WJH" , "WJI" , "WJJ" , "WJK" , "WJL" ,
+"WJM" , "WJN" , "WJO" , "WJP" , "WJQ" , "WJR" , "WJS" , "WJT" ,
+"WJU" , "WJV" , "WJW" , "WJX" , "WJY" , "WJZ" , "WJ0" , "WJ1" ,
+"WJ2" , "WJ3" , "WJ4" , "WJ5" , "WJ6" , "WJ7" , "WJ8" , "WJ9" ,
+"WKA" , "WKB" , "WKC" , "WKD" , "WKE" , "WKF" , "WKG" , "WKH" ,
+"WKI" , "WKJ" , "WKK" , "WKL" , "WKM" , "WKN" , "WKO" , "WKP" ,
+"WKQ" , "WKR" , "WKS" , "WKT" , "WKU" , "WKV" , "WKW" , "WKX" ,
+"WKY" , "WKZ" , "WK0" , "WK1" , "WK2" , "WK3" , "WK4" , "WK5" ,
+"WK6" , "WK7" , "WK8" , "WK9" , "WLA" , "WLB" , "WLC" , "WLD" ,
+"WLE" , "WLF" , "WLG" , "WLH" , "WLI" , "WLJ" , "WLK" , "WLL" ,
+"WLM" , "WLN" , "WLO" , "WLP" , "WLQ" , "WLR" , "WLS" , "WLT" ,
+"WLU" , "WLV" , "WLW" , "WLX" , "WLY" , "WLZ" , "WL0" , "WL1" ,
+"WL2" , "WL3" , "WL4" , "WL5" , "WL6" , "WL7" , "WL8" , "WL9" ,
+"WMA" , "WMB" , "WMC" , "WMD" , "WME" , "WMF" , "WMG" , "WMH" ,
+"WMI" , "WMJ" , "WMK" , "WML" , "WMM" , "WMN" , "WMO" , "WMP" ,
+"WMQ" , "WMR" , "WMS" , "WMT" , "WMU" , "WMV" , "WMW" , "WMX" ,
+"WMY" , "WMZ" , "WM0" , "WM1" , "WM2" , "WM3" , "WM4" , "WM5" ,
+"WM6" , "WM7" , "WM8" , "WM9" , "WNA" , "WNB" , "WNC" , "WND" ,
+"WNE" , "WNF" , "WNG" , "WNH" , "WNI" , "WNJ" , "WNK" , "WNL" ,
+"WNM" , "WNN" , "WNO" , "WNP" , "WNQ" , "WNR" , "WNS" , "WNT" ,
+"WNU" , "WNV" , "WNW" , "WNX" , "WNY" , "WNZ" , "WN0" , "WN1" ,
+"WN2" , "WN3" , "WN4" , "WN5" , "WN6" , "WN7" , "WN8" , "WN9" ,
+"WOA" , "WOB" , "WOC" , "WOD" , "WOE" , "WOF" , "WOG" , "WOH" ,
+"WOI" , "WOJ" , "WOK" , "WOL" , "WOM" , "WON" , "WOO" , "WOP" ,
+"WOQ" , "WOR" , "WOS" , "WOT" , "WOU" , "WOV" , "WOW" , "WOX" ,
+"WOY" , "WOZ" , "WO0" , "WO1" , "WO2" , "WO3" , "WO4" , "WO5" ,
+"WO6" , "WO7" , "WO8" , "WO9" , "WPA" , "WPB" , "WPC" , "WPD" ,
+"WPE" , "WPF" , "WPG" , "WPH" , "WPI" , "WPJ" , "WPK" , "WPL" ,
+"WPM" , "WPN" , "WPO" , "WPP" , "WPQ" , "WPR" , "WPS" , "WPT" ,
+"WPU" , "WPV" , "WPW" , "WPX" , "WPY" , "WPZ" , "WP0" , "WP1" ,
+"WP2" , "WP3" , "WP4" , "WP5" , "WP6" , "WP7" , "WP8" , "WP9" ,
+"WQA" , "WQB" , "WQC" , "WQD" , "WQE" , "WQF" , "WQG" , "WQH" ,
+"WQI" , "WQJ" , "WQK" , "WQL" , "WQM" , "WQN" , "WQO" , "WQP" ,
+"WQQ" , "WQR" , "WQS" , "WQT" , "WQU" , "WQV" , "WQW" , "WQX" ,
+"WQY" , "WQZ" , "WQ0" , "WQ1" , "WQ2" , "WQ3" , "WQ4" , "WQ5" ,
+"WQ6" , "WQ7" , "WQ8" , "WQ9" , "WRA" , "WRB" , "WRC" , "WRD" ,
+"WRE" , "WRF" , "WRG" , "WRH" , "WRI" , "WRJ" , "WRK" , "WRL" ,
+"WRM" , "WRN" , "WRO" , "WRP" , "WRQ" , "WRR" , "WRS" , "WRT" ,
+"WRU" , "WRV" , "WRW" , "WRX" , "WRY" , "WRZ" , "WR0" , "WR1" ,
+"WR2" , "WR3" , "WR4" , "WR5" , "WR6" , "WR7" , "WR8" , "WR9" ,
+"WSA" , "WSB" , "WSC" , "WSD" , "WSE" , "WSF" , "WSG" , "WSH" ,
+"WSI" , "WSJ" , "WSK" , "WSL" , "WSM" , "WSN" , "WSO" , "WSP" ,
+"WSQ" , "WSR" , "WSS" , "WST" , "WSU" , "WSV" , "WSW" , "WSX" ,
+"WSY" , "WSZ" , "WS0" , "WS1" , "WS2" , "WS3" , "WS4" , "WS5" ,
+"WS6" , "WS7" , "WS8" , "WS9" , "WTA" , "WTB" , "WTC" , "WTD" ,
+"WTE" , "WTF" , "WTG" , "WTH" , "WTI" , "WTJ" , "WTK" , "WTL" ,
+"WTM" , "WTN" , "WTO" , "WTP" , "WTQ" , "WTR" , "WTS" , "WTT" ,
+"WTU" , "WTV" , "WTW" , "WTX" , "WTY" , "WTZ" , "WT0" , "WT1" ,
+"WT2" , "WT3" , "WT4" , "WT5" , "WT6" , "WT7" , "WT8" , "WT9" ,
+"WUA" , "WUB" , "WUC" , "WUD" , "WUE" , "WUF" , "WUG" , "WUH" ,
+"WUI" , "WUJ" , "WUK" , "WUL" , "WUM" , "WUN" , "WUO" , "WUP" ,
+"WUQ" , "WUR" , "WUS" , "WUT" , "WUU" , "WUV" , "WUW" , "WUX" ,
+"WUY" , "WUZ" , "WU0" , "WU1" , "WU2" , "WU3" , "WU4" , "WU5" ,
+"WU6" , "WU7" , "WU8" , "WU9" , "WVA" , "WVB" , "WVC" , "WVD" ,
+"WVE" , "WVF" , "WVG" , "WVH" , "WVI" , "WVJ" , "WVK" , "WVL" ,
+"WVM" , "WVN" , "WVO" , "WVP" , "WVQ" , "WVR" , "WVS" , "WVT" ,
+"WVU" , "WVV" , "WVW" , "WVX" , "WVY" , "WVZ" , "WV0" , "WV1" ,
+"WV2" , "WV3" , "WV4" , "WV5" , "WV6" , "WV7" , "WV8" , "WV9" ,
+"WWA" , "WWB" , "WWC" , "WWD" , "WWE" , "WWF" , "WWG" , "WWH" ,
+"WWI" , "WWJ" , "WWK" , "WWL" , "WWM" , "WWN" , "WWO" , "WWP" ,
+"WWQ" , "WWR" , "WWS" , "WWT" , "WWU" , "WWV" , "WWW" , "WWX" ,
+"WWY" , "WWZ" , "WW0" , "WW1" , "WW2" , "WW3" , "WW4" , "WW5" ,
+"WW6" , "WW7" , "WW8" , "WW9" , "WXA" , "WXB" , "WXC" , "WXD" ,
+"WXE" , "WXF" , "WXG" , "WXH" , "WXI" , "WXJ" , "WXK" , "WXL" ,
+"WXM" , "WXN" , "WXO" , "WXP" , "WXQ" , "WXR" , "WXS" , "WXT" ,
+"WXU" , "WXV" , "WXW" , "WXX" , "WXY" , "WXZ" , "WX0" , "WX1" ,
+"WX2" , "WX3" , "WX4" , "WX5" , "WX6" , "WX7" , "WX8" , "WX9" ,
+"WYA" , "WYB" , "WYC" , "WYD" , "WYE" , "WYF" , "WYG" , "WYH" ,
+"WYI" , "WYJ" , "WYK" , "WYL" , "WYM" , "WYN" , "WYO" , "WYP" ,
+"WYQ" , "WYR" , "WYS" , "WYT" , "WYU" , "WYV" , "WYW" , "WYX" ,
+"WYY" , "WYZ" , "WY0" , "WY1" , "WY2" , "WY3" , "WY4" , "WY5" ,
+"WY6" , "WY7" , "WY8" , "WY9" , "WZA" , "WZB" , "WZC" , "WZD" ,
+"WZE" , "WZF" , "WZG" , "WZH" , "WZI" , "WZJ" , "WZK" , "WZL" ,
+"WZM" , "WZN" , "WZO" , "WZP" , "WZQ" , "WZR" , "WZS" , "WZT" ,
+"WZU" , "WZV" , "WZW" , "WZX" , "WZY" , "WZZ" , "WZ0" , "WZ1" ,
+"WZ2" , "WZ3" , "WZ4" , "WZ5" , "WZ6" , "WZ7" , "WZ8" , "WZ9" ,
+"W0A" , "W0B" , "W0C" , "W0D" , "W0E" , "W0F" , "W0G" , "W0H" ,
+"W0I" , "W0J" , "W0K" , "W0L" , "W0M" , "W0N" , "W0O" , "W0P" ,
+"W0Q" , "W0R" , "W0S" , "W0T" , "W0U" , "W0V" , "W0W" , "W0X" ,
+"W0Y" , "W0Z" , "W00" , "W01" , "W02" , "W03" , "W04" , "W05" ,
+"W06" , "W07" , "W08" , "W09" , "W1A" , "W1B" , "W1C" , "W1D" ,
+"W1E" , "W1F" , "W1G" , "W1H" , "W1I" , "W1J" , "W1K" , "W1L" ,
+"W1M" , "W1N" , "W1O" , "W1P" , "W1Q" , "W1R" , "W1S" , "W1T" ,
+"W1U" , "W1V" , "W1W" , "W1X" , "W1Y" , "W1Z" , "W10" , "W11" ,
+"W12" , "W13" , "W14" , "W15" , "W16" , "W17" , "W18" , "W19" ,
+"W2A" , "W2B" , "W2C" , "W2D" , "W2E" , "W2F" , "W2G" , "W2H" ,
+"W2I" , "W2J" , "W2K" , "W2L" , "W2M" , "W2N" , "W2O" , "W2P" ,
+"W2Q" , "W2R" , "W2S" , "W2T" , "W2U" , "W2V" , "W2W" , "W2X" ,
+"W2Y" , "W2Z" , "W20" , "W21" , "W22" , "W23" , "W24" , "W25" ,
+"W26" , "W27" , "W28" , "W29" , "W3A" , "W3B" , "W3C" , "W3D" ,
+"W3E" , "W3F" , "W3G" , "W3H" , "W3I" , "W3J" , "W3K" , "W3L" ,
+"W3M" , "W3N" , "W3O" , "W3P" , "W3Q" , "W3R" , "W3S" , "W3T" ,
+"W3U" , "W3V" , "W3W" , "W3X" , "W3Y" , "W3Z" , "W30" , "W31" ,
+"W32" , "W33" , "W34" , "W35" , "W36" , "W37" , "W38" , "W39" ,
+"W4A" , "W4B" , "W4C" , "W4D" , "W4E" , "W4F" , "W4G" , "W4H" ,
+"W4I" , "W4J" , "W4K" , "W4L" , "W4M" , "W4N" , "W4O" , "W4P" ,
+"W4Q" , "W4R" , "W4S" , "W4T" , "W4U" , "W4V" , "W4W" , "W4X" ,
+"W4Y" , "W4Z" , "W40" , "W41" , "W42" , "W43" , "W44" , "W45" ,
+"W46" , "W47" , "W48" , "W49" , "W5A" , "W5B" , "W5C" , "W5D" ,
+"W5E" , "W5F" , "W5G" , "W5H" , "W5I" , "W5J" , "W5K" , "W5L" ,
+"W5M" , "W5N" , "W5O" , "W5P" , "W5Q" , "W5R" , "W5S" , "W5T" ,
+"W5U" , "W5V" , "W5W" , "W5X" , "W5Y" , "W5Z" , "W50" , "W51" ,
+"W52" , "W53" , "W54" , "W55" , "W56" , "W57" , "W58" , "W59" ,
+"W6A" , "W6B" , "W6C" , "W6D" , "W6E" , "W6F" , "W6G" , "W6H" ,
+"W6I" , "W6J" , "W6K" , "W6L" , "W6M" , "W6N" , "W6O" , "W6P" ,
+"W6Q" , "W6R" , "W6S" , "W6T" , "W6U" , "W6V" , "W6W" , "W6X" ,
+"W6Y" , "W6Z" , "W60" , "W61" , "W62" , "W63" , "W64" , "W65" ,
+"W66" , "W67" , "W68" , "W69" , "W7A" , "W7B" , "W7C" , "W7D" ,
+"W7E" , "W7F" , "W7G" , "W7H" , "W7I" , "W7J" , "W7K" , "W7L" ,
+"W7M" , "W7N" , "W7O" , "W7P" , "W7Q" , "W7R" , "W7S" , "W7T" ,
+"W7U" , "W7V" , "W7W" , "W7X" , "W7Y" , "W7Z" , "W70" , "W71" ,
+"W72" , "W73" , "W74" , "W75" , "W76" , "W77" , "W78" , "W79" ,
+"W8A" , "W8B" , "W8C" , "W8D" , "W8E" , "W8F" , "W8G" , "W8H" ,
+"W8I" , "W8J" , "W8K" , "W8L" , "W8M" , "W8N" , "W8O" , "W8P" ,
+"W8Q" , "W8R" , "W8S" , "W8T" , "W8U" , "W8V" , "W8W" , "W8X" ,
+"W8Y" , "W8Z" , "W80" , "W81" , "W82" , "W83" , "W84" , "W85" ,
+"W86" , "W87" , "W88" , "W89" , "W9A" , "W9B" , "W9C" , "W9D" ,
+"W9E" , "W9F" , "W9G" , "W9H" , "W9I" , "W9J" , "W9K" , "W9L" ,
+"W9M" , "W9N" , "W9O" , "W9P" , "W9Q" , "W9R" , "W9S" , "W9T" ,
+"W9U" , "W9V" , "W9W" , "W9X" , "W9Y" , "W9Z" , "W90" , "W91" ,
+"W92" , "W93" , "W94" , "W95" , "W96" , "W97" , "W98" , "W99" ,
+"XAA" , "XAB" , "XAC" , "XAD" , "XAE" , "XAF" , "XAG" , "XAH" ,
+"XAI" , "XAJ" , "XAK" , "XAL" , "XAM" , "XAN" , "XAO" , "XAP" ,
+"XAQ" , "XAR" , "XAS" , "XAT" , "XAU" , "XAV" , "XAW" , "XAX" ,
+"XAY" , "XAZ" , "XA0" , "XA1" , "XA2" , "XA3" , "XA4" , "XA5" ,
+"XA6" , "XA7" , "XA8" , "XA9" , "XBA" , "XBB" , "XBC" , "XBD" ,
+"XBE" , "XBF" , "XBG" , "XBH" , "XBI" , "XBJ" , "XBK" , "XBL" ,
+"XBM" , "XBN" , "XBO" , "XBP" , "XBQ" , "XBR" , "XBS" , "XBT" ,
+"XBU" , "XBV" , "XBW" , "XBX" , "XBY" , "XBZ" , "XB0" , "XB1" ,
+"XB2" , "XB3" , "XB4" , "XB5" , "XB6" , "XB7" , "XB8" , "XB9" ,
+"XCA" , "XCB" , "XCC" , "XCD" , "XCE" , "XCF" , "XCG" , "XCH" ,
+"XCI" , "XCJ" , "XCK" , "XCL" , "XCM" , "XCN" , "XCO" , "XCP" ,
+"XCQ" , "XCR" , "XCS" , "XCT" , "XCU" , "XCV" , "XCW" , "XCX" ,
+"XCY" , "XCZ" , "XC0" , "XC1" , "XC2" , "XC3" , "XC4" , "XC5" ,
+"XC6" , "XC7" , "XC8" , "XC9" , "XDA" , "XDB" , "XDC" , "XDD" ,
+"XDE" , "XDF" , "XDG" , "XDH" , "XDI" , "XDJ" , "XDK" , "XDL" ,
+"XDM" , "XDN" , "XDO" , "XDP" , "XDQ" , "XDR" , "XDS" , "XDT" ,
+"XDU" , "XDV" , "XDW" , "XDX" , "XDY" , "XDZ" , "XD0" , "XD1" ,
+"XD2" , "XD3" , "XD4" , "XD5" , "XD6" , "XD7" , "XD8" , "XD9" ,
+"XEA" , "XEB" , "XEC" , "XED" , "XEE" , "XEF" , "XEG" , "XEH" ,
+"XEI" , "XEJ" , "XEK" , "XEL" , "XEM" , "XEN" , "XEO" , "XEP" ,
+"XEQ" , "XER" , "XES" , "XET" , "XEU" , "XEV" , "XEW" , "XEX" ,
+"XEY" , "XEZ" , "XE0" , "XE1" , "XE2" , "XE3" , "XE4" , "XE5" ,
+"XE6" , "XE7" , "XE8" , "XE9" , "XFA" , "XFB" , "XFC" , "XFD" ,
+"XFE" , "XFF" , "XFG" , "XFH" , "XFI" , "XFJ" , "XFK" , "XFL" ,
+"XFM" , "XFN" , "XFO" , "XFP" , "XFQ" , "XFR" , "XFS" , "XFT" ,
+"XFU" , "XFV" , "XFW" , "XFX" , "XFY" , "XFZ" , "XF0" , "XF1" ,
+"XF2" , "XF3" , "XF4" , "XF5" , "XF6" , "XF7" , "XF8" , "XF9" ,
+"XGA" , "XGB" , "XGC" , "XGD" , "XGE" , "XGF" , "XGG" , "XGH" ,
+"XGI" , "XGJ" , "XGK" , "XGL" , "XGM" , "XGN" , "XGO" , "XGP" ,
+"XGQ" , "XGR" , "XGS" , "XGT" , "XGU" , "XGV" , "XGW" , "XGX" ,
+"XGY" , "XGZ" , "XG0" , "XG1" , "XG2" , "XG3" , "XG4" , "XG5" ,
+"XG6" , "XG7" , "XG8" , "XG9" , "XHA" , "XHB" , "XHC" , "XHD" ,
+"XHE" , "XHF" , "XHG" , "XHH" , "XHI" , "XHJ" , "XHK" , "XHL" ,
+"XHM" , "XHN" , "XHO" , "XHP" , "XHQ" , "XHR" , "XHS" , "XHT" ,
+"XHU" , "XHV" , "XHW" , "XHX" , "XHY" , "XHZ" , "XH0" , "XH1" ,
+"XH2" , "XH3" , "XH4" , "XH5" , "XH6" , "XH7" , "XH8" , "XH9" ,
+"XIA" , "XIB" , "XIC" , "XID" , "XIE" , "XIF" , "XIG" , "XIH" ,
+"XII" , "XIJ" , "XIK" , "XIL" , "XIM" , "XIN" , "XIO" , "XIP" ,
+"XIQ" , "XIR" , "XIS" , "XIT" , "XIU" , "XIV" , "XIW" , "XIX" ,
+"XIY" , "XIZ" , "XI0" , "XI1" , "XI2" , "XI3" , "XI4" , "XI5" ,
+"XI6" , "XI7" , "XI8" , "XI9" , "XJA" , "XJB" , "XJC" , "XJD" ,
+"XJE" , "XJF" , "XJG" , "XJH" , "XJI" , "XJJ" , "XJK" , "XJL" ,
+"XJM" , "XJN" , "XJO" , "XJP" , "XJQ" , "XJR" , "XJS" , "XJT" ,
+"XJU" , "XJV" , "XJW" , "XJX" , "XJY" , "XJZ" , "XJ0" , "XJ1" ,
+"XJ2" , "XJ3" , "XJ4" , "XJ5" , "XJ6" , "XJ7" , "XJ8" , "XJ9" ,
+"XKA" , "XKB" , "XKC" , "XKD" , "XKE" , "XKF" , "XKG" , "XKH" ,
+"XKI" , "XKJ" , "XKK" , "XKL" , "XKM" , "XKN" , "XKO" , "XKP" ,
+"XKQ" , "XKR" , "XKS" , "XKT" , "XKU" , "XKV" , "XKW" , "XKX" ,
+"XKY" , "XKZ" , "XK0" , "XK1" , "XK2" , "XK3" , "XK4" , "XK5" ,
+"XK6" , "XK7" , "XK8" , "XK9" , "XLA" , "XLB" , "XLC" , "XLD" ,
+"XLE" , "XLF" , "XLG" , "XLH" , "XLI" , "XLJ" , "XLK" , "XLL" ,
+"XLM" , "XLN" , "XLO" , "XLP" , "XLQ" , "XLR" , "XLS" , "XLT" ,
+"XLU" , "XLV" , "XLW" , "XLX" , "XLY" , "XLZ" , "XL0" , "XL1" ,
+"XL2" , "XL3" , "XL4" , "XL5" , "XL6" , "XL7" , "XL8" , "XL9" ,
+"XMA" , "XMB" , "XMC" , "XMD" , "XME" , "XMF" , "XMG" , "XMH" ,
+"XMI" , "XMJ" , "XMK" , "XML" , "XMM" , "XMN" , "XMO" , "XMP" ,
+"XMQ" , "XMR" , "XMS" , "XMT" , "XMU" , "XMV" , "XMW" , "XMX" ,
+"XMY" , "XMZ" , "XM0" , "XM1" , "XM2" , "XM3" , "XM4" , "XM5" ,
+"XM6" , "XM7" , "XM8" , "XM9" , "XNA" , "XNB" , "XNC" , "XND" ,
+"XNE" , "XNF" , "XNG" , "XNH" , "XNI" , "XNJ" , "XNK" , "XNL" ,
+"XNM" , "XNN" , "XNO" , "XNP" , "XNQ" , "XNR" , "XNS" , "XNT" ,
+"XNU" , "XNV" , "XNW" , "XNX" , "XNY" , "XNZ" , "XN0" , "XN1" ,
+"XN2" , "XN3" , "XN4" , "XN5" , "XN6" , "XN7" , "XN8" , "XN9" ,
+"XOA" , "XOB" , "XOC" , "XOD" , "XOE" , "XOF" , "XOG" , "XOH" ,
+"XOI" , "XOJ" , "XOK" , "XOL" , "XOM" , "XON" , "XOO" , "XOP" ,
+"XOQ" , "XOR" , "XOS" , "XOT" , "XOU" , "XOV" , "XOW" , "XOX" ,
+"XOY" , "XOZ" , "XO0" , "XO1" , "XO2" , "XO3" , "XO4" , "XO5" ,
+"XO6" , "XO7" , "XO8" , "XO9" , "XPA" , "XPB" , "XPC" , "XPD" ,
+"XPE" , "XPF" , "XPG" , "XPH" , "XPI" , "XPJ" , "XPK" , "XPL" ,
+"XPM" , "XPN" , "XPO" , "XPP" , "XPQ" , "XPR" , "XPS" , "XPT" ,
+"XPU" , "XPV" , "XPW" , "XPX" , "XPY" , "XPZ" , "XP0" , "XP1" ,
+"XP2" , "XP3" , "XP4" , "XP5" , "XP6" , "XP7" , "XP8" , "XP9" ,
+"XQA" , "XQB" , "XQC" , "XQD" , "XQE" , "XQF" , "XQG" , "XQH" ,
+"XQI" , "XQJ" , "XQK" , "XQL" , "XQM" , "XQN" , "XQO" , "XQP" ,
+"XQQ" , "XQR" , "XQS" , "XQT" , "XQU" , "XQV" , "XQW" , "XQX" ,
+"XQY" , "XQZ" , "XQ0" , "XQ1" , "XQ2" , "XQ3" , "XQ4" , "XQ5" ,
+"XQ6" , "XQ7" , "XQ8" , "XQ9" , "XRA" , "XRB" , "XRC" , "XRD" ,
+"XRE" , "XRF" , "XRG" , "XRH" , "XRI" , "XRJ" , "XRK" , "XRL" ,
+"XRM" , "XRN" , "XRO" , "XRP" , "XRQ" , "XRR" , "XRS" , "XRT" ,
+"XRU" , "XRV" , "XRW" , "XRX" , "XRY" , "XRZ" , "XR0" , "XR1" ,
+"XR2" , "XR3" , "XR4" , "XR5" , "XR6" , "XR7" , "XR8" , "XR9" ,
+"XSA" , "XSB" , "XSC" , "XSD" , "XSE" , "XSF" , "XSG" , "XSH" ,
+"XSI" , "XSJ" , "XSK" , "XSL" , "XSM" , "XSN" , "XSO" , "XSP" ,
+"XSQ" , "XSR" , "XSS" , "XST" , "XSU" , "XSV" , "XSW" , "XSX" ,
+"XSY" , "XSZ" , "XS0" , "XS1" , "XS2" , "XS3" , "XS4" , "XS5" ,
+"XS6" , "XS7" , "XS8" , "XS9" , "XTA" , "XTB" , "XTC" , "XTD" ,
+"XTE" , "XTF" , "XTG" , "XTH" , "XTI" , "XTJ" , "XTK" , "XTL" ,
+"XTM" , "XTN" , "XTO" , "XTP" , "XTQ" , "XTR" , "XTS" , "XTT" ,
+"XTU" , "XTV" , "XTW" , "XTX" , "XTY" , "XTZ" , "XT0" , "XT1" ,
+"XT2" , "XT3" , "XT4" , "XT5" , "XT6" , "XT7" , "XT8" , "XT9" ,
+"XUA" , "XUB" , "XUC" , "XUD" , "XUE" , "XUF" , "XUG" , "XUH" ,
+"XUI" , "XUJ" , "XUK" , "XUL" , "XUM" , "XUN" , "XUO" , "XUP" ,
+"XUQ" , "XUR" , "XUS" , "XUT" , "XUU" , "XUV" , "XUW" , "XUX" ,
+"XUY" , "XUZ" , "XU0" , "XU1" , "XU2" , "XU3" , "XU4" , "XU5" ,
+"XU6" , "XU7" , "XU8" , "XU9" , "XVA" , "XVB" , "XVC" , "XVD" ,
+"XVE" , "XVF" , "XVG" , "XVH" , "XVI" , "XVJ" , "XVK" , "XVL" ,
+"XVM" , "XVN" , "XVO" , "XVP" , "XVQ" , "XVR" , "XVS" , "XVT" ,
+"XVU" , "XVV" , "XVW" , "XVX" , "XVY" , "XVZ" , "XV0" , "XV1" ,
+"XV2" , "XV3" , "XV4" , "XV5" , "XV6" , "XV7" , "XV8" , "XV9" ,
+"XWA" , "XWB" , "XWC" , "XWD" , "XWE" , "XWF" , "XWG" , "XWH" ,
+"XWI" , "XWJ" , "XWK" , "XWL" , "XWM" , "XWN" , "XWO" , "XWP" ,
+"XWQ" , "XWR" , "XWS" , "XWT" , "XWU" , "XWV" , "XWW" , "XWX" ,
+"XWY" , "XWZ" , "XW0" , "XW1" , "XW2" , "XW3" , "XW4" , "XW5" ,
+"XW6" , "XW7" , "XW8" , "XW9" , "XXA" , "XXB" , "XXC" , "XXD" ,
+"XXE" , "XXF" , "XXG" , "XXH" , "XXI" , "XXJ" , "XXK" , "XXL" ,
+"XXM" , "XXN" , "XXO" , "XXP" , "XXQ" , "XXR" , "XXS" , "XXT" ,
+"XXU" , "XXV" , "XXW" , "XXX" , "XXY" , "XXZ" , "XX0" , "XX1" ,
+"XX2" , "XX3" , "XX4" , "XX5" , "XX6" , "XX7" , "XX8" , "XX9" ,
+"XYA" , "XYB" , "XYC" , "XYD" , "XYE" , "XYF" , "XYG" , "XYH" ,
+"XYI" , "XYJ" , "XYK" , "XYL" , "XYM" , "XYN" , "XYO" , "XYP" ,
+"XYQ" , "XYR" , "XYS" , "XYT" , "XYU" , "XYV" , "XYW" , "XYX" ,
+"XYY" , "XYZ" , "XY0" , "XY1" , "XY2" , "XY3" , "XY4" , "XY5" ,
+"XY6" , "XY7" , "XY8" , "XY9" , "XZA" , "XZB" , "XZC" , "XZD" ,
+"XZE" , "XZF" , "XZG" , "XZH" , "XZI" , "XZJ" , "XZK" , "XZL" ,
+"XZM" , "XZN" , "XZO" , "XZP" , "XZQ" , "XZR" , "XZS" , "XZT" ,
+"XZU" , "XZV" , "XZW" , "XZX" , "XZY" , "XZZ" , "XZ0" , "XZ1" ,
+"XZ2" , "XZ3" , "XZ4" , "XZ5" , "XZ6" , "XZ7" , "XZ8" , "XZ9" ,
+"X0A" , "X0B" , "X0C" , "X0D" , "X0E" , "X0F" , "X0G" , "X0H" ,
+"X0I" , "X0J" , "X0K" , "X0L" , "X0M" , "X0N" , "X0O" , "X0P" ,
+"X0Q" , "X0R" , "X0S" , "X0T" , "X0U" , "X0V" , "X0W" , "X0X" ,
+"X0Y" , "X0Z" , "X00" , "X01" , "X02" , "X03" , "X04" , "X05" ,
+"X06" , "X07" , "X08" , "X09" , "X1A" , "X1B" , "X1C" , "X1D" ,
+"X1E" , "X1F" , "X1G" , "X1H" , "X1I" , "X1J" , "X1K" , "X1L" ,
+"X1M" , "X1N" , "X1O" , "X1P" , "X1Q" , "X1R" , "X1S" , "X1T" ,
+"X1U" , "X1V" , "X1W" , "X1X" , "X1Y" , "X1Z" , "X10" , "X11" ,
+"X12" , "X13" , "X14" , "X15" , "X16" , "X17" , "X18" , "X19" ,
+"X2A" , "X2B" , "X2C" , "X2D" , "X2E" , "X2F" , "X2G" , "X2H" ,
+"X2I" , "X2J" , "X2K" , "X2L" , "X2M" , "X2N" , "X2O" , "X2P" ,
+"X2Q" , "X2R" , "X2S" , "X2T" , "X2U" , "X2V" , "X2W" , "X2X" ,
+"X2Y" , "X2Z" , "X20" , "X21" , "X22" , "X23" , "X24" , "X25" ,
+"X26" , "X27" , "X28" , "X29" , "X3A" , "X3B" , "X3C" , "X3D" ,
+"X3E" , "X3F" , "X3G" , "X3H" , "X3I" , "X3J" , "X3K" , "X3L" ,
+"X3M" , "X3N" , "X3O" , "X3P" , "X3Q" , "X3R" , "X3S" , "X3T" ,
+"X3U" , "X3V" , "X3W" , "X3X" , "X3Y" , "X3Z" , "X30" , "X31" ,
+"X32" , "X33" , "X34" , "X35" , "X36" , "X37" , "X38" , "X39" ,
+"X4A" , "X4B" , "X4C" , "X4D" , "X4E" , "X4F" , "X4G" , "X4H" ,
+"X4I" , "X4J" , "X4K" , "X4L" , "X4M" , "X4N" , "X4O" , "X4P" ,
+"X4Q" , "X4R" , "X4S" , "X4T" , "X4U" , "X4V" , "X4W" , "X4X" ,
+"X4Y" , "X4Z" , "X40" , "X41" , "X42" , "X43" , "X44" , "X45" ,
+"X46" , "X47" , "X48" , "X49" , "X5A" , "X5B" , "X5C" , "X5D" ,
+"X5E" , "X5F" , "X5G" , "X5H" , "X5I" , "X5J" , "X5K" , "X5L" ,
+"X5M" , "X5N" , "X5O" , "X5P" , "X5Q" , "X5R" , "X5S" , "X5T" ,
+"X5U" , "X5V" , "X5W" , "X5X" , "X5Y" , "X5Z" , "X50" , "X51" ,
+"X52" , "X53" , "X54" , "X55" , "X56" , "X57" , "X58" , "X59" ,
+"X6A" , "X6B" , "X6C" , "X6D" , "X6E" , "X6F" , "X6G" , "X6H" ,
+"X6I" , "X6J" , "X6K" , "X6L" , "X6M" , "X6N" , "X6O" , "X6P" ,
+"X6Q" , "X6R" , "X6S" , "X6T" , "X6U" , "X6V" , "X6W" , "X6X" ,
+"X6Y" , "X6Z" , "X60" , "X61" , "X62" , "X63" , "X64" , "X65" ,
+"X66" , "X67" , "X68" , "X69" , "X7A" , "X7B" , "X7C" , "X7D" ,
+"X7E" , "X7F" , "X7G" , "X7H" , "X7I" , "X7J" , "X7K" , "X7L" ,
+"X7M" , "X7N" , "X7O" , "X7P" , "X7Q" , "X7R" , "X7S" , "X7T" ,
+"X7U" , "X7V" , "X7W" , "X7X" , "X7Y" , "X7Z" , "X70" , "X71" ,
+"X72" , "X73" , "X74" , "X75" , "X76" , "X77" , "X78" , "X79" ,
+"X8A" , "X8B" , "X8C" , "X8D" , "X8E" , "X8F" , "X8G" , "X8H" ,
+"X8I" , "X8J" , "X8K" , "X8L" , "X8M" , "X8N" , "X8O" , "X8P" ,
+"X8Q" , "X8R" , "X8S" , "X8T" , "X8U" , "X8V" , "X8W" , "X8X" ,
+"X8Y" , "X8Z" , "X80" , "X81" , "X82" , "X83" , "X84" , "X85" ,
+"X86" , "X87" , "X88" , "X89" , "X9A" , "X9B" , "X9C" , "X9D" ,
+"X9E" , "X9F" , "X9G" , "X9H" , "X9I" , "X9J" , "X9K" , "X9L" ,
+"X9M" , "X9N" , "X9O" , "X9P" , "X9Q" , "X9R" , "X9S" , "X9T" ,
+"X9U" , "X9V" , "X9W" , "X9X" , "X9Y" , "X9Z" , "X90" , "X91" ,
+"X92" , "X93" , "X94" , "X95" , "X96" , "X97" , "X98" , "X99" ,
+"YAA" , "YAB" , "YAC" , "YAD" , "YAE" , "YAF" , "YAG" , "YAH" ,
+"YAI" , "YAJ" , "YAK" , "YAL" , "YAM" , "YAN" , "YAO" , "YAP" ,
+"YAQ" , "YAR" , "YAS" , "YAT" , "YAU" , "YAV" , "YAW" , "YAX" ,
+"YAY" , "YAZ" , "YA0" , "YA1" , "YA2" , "YA3" , "YA4" , "YA5" ,
+"YA6" , "YA7" , "YA8" , "YA9" , "YBA" , "YBB" , "YBC" , "YBD" ,
+"YBE" , "YBF" , "YBG" , "YBH" , "YBI" , "YBJ" , "YBK" , "YBL" ,
+"YBM" , "YBN" , "YBO" , "YBP" , "YBQ" , "YBR" , "YBS" , "YBT" ,
+"YBU" , "YBV" , "YBW" , "YBX" , "YBY" , "YBZ" , "YB0" , "YB1" ,
+"YB2" , "YB3" , "YB4" , "YB5" , "YB6" , "YB7" , "YB8" , "YB9" ,
+"YCA" , "YCB" , "YCC" , "YCD" , "YCE" , "YCF" , "YCG" , "YCH" ,
+"YCI" , "YCJ" , "YCK" , "YCL" , "YCM" , "YCN" , "YCO" , "YCP" ,
+"YCQ" , "YCR" , "YCS" , "YCT" , "YCU" , "YCV" , "YCW" , "YCX" ,
+"YCY" , "YCZ" , "YC0" , "YC1" , "YC2" , "YC3" , "YC4" , "YC5" ,
+"YC6" , "YC7" , "YC8" , "YC9" , "YDA" , "YDB" , "YDC" , "YDD" ,
+"YDE" , "YDF" , "YDG" , "YDH" , "YDI" , "YDJ" , "YDK" , "YDL" ,
+"YDM" , "YDN" , "YDO" , "YDP" , "YDQ" , "YDR" , "YDS" , "YDT" ,
+"YDU" , "YDV" , "YDW" , "YDX" , "YDY" , "YDZ" , "YD0" , "YD1" ,
+"YD2" , "YD3" , "YD4" , "YD5" , "YD6" , "YD7" , "YD8" , "YD9" ,
+"YEA" , "YEB" , "YEC" , "YED" , "YEE" , "YEF" , "YEG" , "YEH" ,
+"YEI" , "YEJ" , "YEK" , "YEL" , "YEM" , "YEN" , "YEO" , "YEP" ,
+"YEQ" , "YER" , "YES" , "YET" , "YEU" , "YEV" , "YEW" , "YEX" ,
+"YEY" , "YEZ" , "YE0" , "YE1" , "YE2" , "YE3" , "YE4" , "YE5" ,
+"YE6" , "YE7" , "YE8" , "YE9" , "YFA" , "YFB" , "YFC" , "YFD" ,
+"YFE" , "YFF" , "YFG" , "YFH" , "YFI" , "YFJ" , "YFK" , "YFL" ,
+"YFM" , "YFN" , "YFO" , "YFP" , "YFQ" , "YFR" , "YFS" , "YFT" ,
+"YFU" , "YFV" , "YFW" , "YFX" , "YFY" , "YFZ" , "YF0" , "YF1" ,
+"YF2" , "YF3" , "YF4" , "YF5" , "YF6" , "YF7" , "YF8" , "YF9" ,
+"YGA" , "YGB" , "YGC" , "YGD" , "YGE" , "YGF" , "YGG" , "YGH" ,
+"YGI" , "YGJ" , "YGK" , "YGL" , "YGM" , "YGN" , "YGO" , "YGP" ,
+"YGQ" , "YGR" , "YGS" , "YGT" , "YGU" , "YGV" , "YGW" , "YGX" ,
+"YGY" , "YGZ" , "YG0" , "YG1" , "YG2" , "YG3" , "YG4" , "YG5" ,
+"YG6" , "YG7" , "YG8" , "YG9" , "YHA" , "YHB" , "YHC" , "YHD" ,
+"YHE" , "YHF" , "YHG" , "YHH" , "YHI" , "YHJ" , "YHK" , "YHL" ,
+"YHM" , "YHN" , "YHO" , "YHP" , "YHQ" , "YHR" , "YHS" , "YHT" ,
+"YHU" , "YHV" , "YHW" , "YHX" , "YHY" , "YHZ" , "YH0" , "YH1" ,
+"YH2" , "YH3" , "YH4" , "YH5" , "YH6" , "YH7" , "YH8" , "YH9" ,
+"YIA" , "YIB" , "YIC" , "YID" , "YIE" , "YIF" , "YIG" , "YIH" ,
+"YII" , "YIJ" , "YIK" , "YIL" , "YIM" , "YIN" , "YIO" , "YIP" ,
+"YIQ" , "YIR" , "YIS" , "YIT" , "YIU" , "YIV" , "YIW" , "YIX" ,
+"YIY" , "YIZ" , "YI0" , "YI1" , "YI2" , "YI3" , "YI4" , "YI5" ,
+"YI6" , "YI7" , "YI8" , "YI9" , "YJA" , "YJB" , "YJC" , "YJD" ,
+"YJE" , "YJF" , "YJG" , "YJH" , "YJI" , "YJJ" , "YJK" , "YJL" ,
+"YJM" , "YJN" , "YJO" , "YJP" , "YJQ" , "YJR" , "YJS" , "YJT" ,
+"YJU" , "YJV" , "YJW" , "YJX" , "YJY" , "YJZ" , "YJ0" , "YJ1" ,
+"YJ2" , "YJ3" , "YJ4" , "YJ5" , "YJ6" , "YJ7" , "YJ8" , "YJ9" ,
+"YKA" , "YKB" , "YKC" , "YKD" , "YKE" , "YKF" , "YKG" , "YKH" ,
+"YKI" , "YKJ" , "YKK" , "YKL" , "YKM" , "YKN" , "YKO" , "YKP" ,
+"YKQ" , "YKR" , "YKS" , "YKT" , "YKU" , "YKV" , "YKW" , "YKX" ,
+"YKY" , "YKZ" , "YK0" , "YK1" , "YK2" , "YK3" , "YK4" , "YK5" ,
+"YK6" , "YK7" , "YK8" , "YK9" , "YLA" , "YLB" , "YLC" , "YLD" ,
+"YLE" , "YLF" , "YLG" , "YLH" , "YLI" , "YLJ" , "YLK" , "YLL" ,
+"YLM" , "YLN" , "YLO" , "YLP" , "YLQ" , "YLR" , "YLS" , "YLT" ,
+"YLU" , "YLV" , "YLW" , "YLX" , "YLY" , "YLZ" , "YL0" , "YL1" ,
+"YL2" , "YL3" , "YL4" , "YL5" , "YL6" , "YL7" , "YL8" , "YL9" ,
+"YMA" , "YMB" , "YMC" , "YMD" , "YME" , "YMF" , "YMG" , "YMH" ,
+"YMI" , "YMJ" , "YMK" , "YML" , "YMM" , "YMN" , "YMO" , "YMP" ,
+"YMQ" , "YMR" , "YMS" , "YMT" , "YMU" , "YMV" , "YMW" , "YMX" ,
+"YMY" , "YMZ" , "YM0" , "YM1" , "YM2" , "YM3" , "YM4" , "YM5" ,
+"YM6" , "YM7" , "YM8" , "YM9" , "YNA" , "YNB" , "YNC" , "YND" ,
+"YNE" , "YNF" , "YNG" , "YNH" , "YNI" , "YNJ" , "YNK" , "YNL" ,
+"YNM" , "YNN" , "YNO" , "YNP" , "YNQ" , "YNR" , "YNS" , "YNT" ,
+"YNU" , "YNV" , "YNW" , "YNX" , "YNY" , "YNZ" , "YN0" , "YN1" ,
+"YN2" , "YN3" , "YN4" , "YN5" , "YN6" , "YN7" , "YN8" , "YN9" ,
+"YOA" , "YOB" , "YOC" , "YOD" , "YOE" , "YOF" , "YOG" , "YOH" ,
+"YOI" , "YOJ" , "YOK" , "YOL" , "YOM" , "YON" , "YOO" , "YOP" ,
+"YOQ" , "YOR" , "YOS" , "YOT" , "YOU" , "YOV" , "YOW" , "YOX" ,
+"YOY" , "YOZ" , "YO0" , "YO1" , "YO2" , "YO3" , "YO4" , "YO5" ,
+"YO6" , "YO7" , "YO8" , "YO9" , "YPA" , "YPB" , "YPC" , "YPD" ,
+"YPE" , "YPF" , "YPG" , "YPH" , "YPI" , "YPJ" , "YPK" , "YPL" ,
+"YPM" , "YPN" , "YPO" , "YPP" , "YPQ" , "YPR" , "YPS" , "YPT" ,
+"YPU" , "YPV" , "YPW" , "YPX" , "YPY" , "YPZ" , "YP0" , "YP1" ,
+"YP2" , "YP3" , "YP4" , "YP5" , "YP6" , "YP7" , "YP8" , "YP9" ,
+"YQA" , "YQB" , "YQC" , "YQD" , "YQE" , "YQF" , "YQG" , "YQH" ,
+"YQI" , "YQJ" , "YQK" , "YQL" , "YQM" , "YQN" , "YQO" , "YQP" ,
+"YQQ" , "YQR" , "YQS" , "YQT" , "YQU" , "YQV" , "YQW" , "YQX" ,
+"YQY" , "YQZ" , "YQ0" , "YQ1" , "YQ2" , "YQ3" , "YQ4" , "YQ5" ,
+"YQ6" , "YQ7" , "YQ8" , "YQ9" , "YRA" , "YRB" , "YRC" , "YRD" ,
+"YRE" , "YRF" , "YRG" , "YRH" , "YRI" , "YRJ" , "YRK" , "YRL" ,
+"YRM" , "YRN" , "YRO" , "YRP" , "YRQ" , "YRR" , "YRS" , "YRT" ,
+"YRU" , "YRV" , "YRW" , "YRX" , "YRY" , "YRZ" , "YR0" , "YR1" ,
+"YR2" , "YR3" , "YR4" , "YR5" , "YR6" , "YR7" , "YR8" , "YR9" ,
+"YSA" , "YSB" , "YSC" , "YSD" , "YSE" , "YSF" , "YSG" , "YSH" ,
+"YSI" , "YSJ" , "YSK" , "YSL" , "YSM" , "YSN" , "YSO" , "YSP" ,
+"YSQ" , "YSR" , "YSS" , "YST" , "YSU" , "YSV" , "YSW" , "YSX" ,
+"YSY" , "YSZ" , "YS0" , "YS1" , "YS2" , "YS3" , "YS4" , "YS5" ,
+"YS6" , "YS7" , "YS8" , "YS9" , "YTA" , "YTB" , "YTC" , "YTD" ,
+"YTE" , "YTF" , "YTG" , "YTH" , "YTI" , "YTJ" , "YTK" , "YTL" ,
+"YTM" , "YTN" , "YTO" , "YTP" , "YTQ" , "YTR" , "YTS" , "YTT" ,
+"YTU" , "YTV" , "YTW" , "YTX" , "YTY" , "YTZ" , "YT0" , "YT1" ,
+"YT2" , "YT3" , "YT4" , "YT5" , "YT6" , "YT7" , "YT8" , "YT9" ,
+"YUA" , "YUB" , "YUC" , "YUD" , "YUE" , "YUF" , "YUG" , "YUH" ,
+"YUI" , "YUJ" , "YUK" , "YUL" , "YUM" , "YUN" , "YUO" , "YUP" ,
+"YUQ" , "YUR" , "YUS" , "YUT" , "YUU" , "YUV" , "YUW" , "YUX" ,
+"YUY" , "YUZ" , "YU0" , "YU1" , "YU2" , "YU3" , "YU4" , "YU5" ,
+"YU6" , "YU7" , "YU8" , "YU9" , "YVA" , "YVB" , "YVC" , "YVD" ,
+"YVE" , "YVF" , "YVG" , "YVH" , "YVI" , "YVJ" , "YVK" , "YVL" ,
+"YVM" , "YVN" , "YVO" , "YVP" , "YVQ" , "YVR" , "YVS" , "YVT" ,
+"YVU" , "YVV" , "YVW" , "YVX" , "YVY" , "YVZ" , "YV0" , "YV1" ,
+"YV2" , "YV3" , "YV4" , "YV5" , "YV6" , "YV7" , "YV8" , "YV9" ,
+"YWA" , "YWB" , "YWC" , "YWD" , "YWE" , "YWF" , "YWG" , "YWH" ,
+"YWI" , "YWJ" , "YWK" , "YWL" , "YWM" , "YWN" , "YWO" , "YWP" ,
+"YWQ" , "YWR" , "YWS" , "YWT" , "YWU" , "YWV" , "YWW" , "YWX" ,
+"YWY" , "YWZ" , "YW0" , "YW1" , "YW2" , "YW3" , "YW4" , "YW5" ,
+"YW6" , "YW7" , "YW8" , "YW9" , "YXA" , "YXB" , "YXC" , "YXD" ,
+"YXE" , "YXF" , "YXG" , "YXH" , "YXI" , "YXJ" , "YXK" , "YXL" ,
+"YXM" , "YXN" , "YXO" , "YXP" , "YXQ" , "YXR" , "YXS" , "YXT" ,
+"YXU" , "YXV" , "YXW" , "YXX" , "YXY" , "YXZ" , "YX0" , "YX1" ,
+"YX2" , "YX3" , "YX4" , "YX5" , "YX6" , "YX7" , "YX8" , "YX9" ,
+"YYA" , "YYB" , "YYC" , "YYD" , "YYE" , "YYF" , "YYG" , "YYH" ,
+"YYI" , "YYJ" , "YYK" , "YYL" , "YYM" , "YYN" , "YYO" , "YYP" ,
+"YYQ" , "YYR" , "YYS" , "YYT" , "YYU" , "YYV" , "YYW" , "YYX" ,
+"YYY" , "YYZ" , "YY0" , "YY1" , "YY2" , "YY3" , "YY4" , "YY5" ,
+"YY6" , "YY7" , "YY8" , "YY9" , "YZA" , "YZB" , "YZC" , "YZD" ,
+"YZE" , "YZF" , "YZG" , "YZH" , "YZI" , "YZJ" , "YZK" , "YZL" ,
+"YZM" , "YZN" , "YZO" , "YZP" , "YZQ" , "YZR" , "YZS" , "YZT" ,
+"YZU" , "YZV" , "YZW" , "YZX" , "YZY" , "YZZ" , "YZ0" , "YZ1" ,
+"YZ2" , "YZ3" , "YZ4" , "YZ5" , "YZ6" , "YZ7" , "YZ8" , "YZ9" ,
+"Y0A" , "Y0B" , "Y0C" , "Y0D" , "Y0E" , "Y0F" , "Y0G" , "Y0H" ,
+"Y0I" , "Y0J" , "Y0K" , "Y0L" , "Y0M" , "Y0N" , "Y0O" , "Y0P" ,
+"Y0Q" , "Y0R" , "Y0S" , "Y0T" , "Y0U" , "Y0V" , "Y0W" , "Y0X" ,
+"Y0Y" , "Y0Z" , "Y00" , "Y01" , "Y02" , "Y03" , "Y04" , "Y05" ,
+"Y06" , "Y07" , "Y08" , "Y09" , "Y1A" , "Y1B" , "Y1C" , "Y1D" ,
+"Y1E" , "Y1F" , "Y1G" , "Y1H" , "Y1I" , "Y1J" , "Y1K" , "Y1L" ,
+"Y1M" , "Y1N" , "Y1O" , "Y1P" , "Y1Q" , "Y1R" , "Y1S" , "Y1T" ,
+"Y1U" , "Y1V" , "Y1W" , "Y1X" , "Y1Y" , "Y1Z" , "Y10" , "Y11" ,
+"Y12" , "Y13" , "Y14" , "Y15" , "Y16" , "Y17" , "Y18" , "Y19" ,
+"Y2A" , "Y2B" , "Y2C" , "Y2D" , "Y2E" , "Y2F" , "Y2G" , "Y2H" ,
+"Y2I" , "Y2J" , "Y2K" , "Y2L" , "Y2M" , "Y2N" , "Y2O" , "Y2P" ,
+"Y2Q" , "Y2R" , "Y2S" , "Y2T" , "Y2U" , "Y2V" , "Y2W" , "Y2X" ,
+"Y2Y" , "Y2Z" , "Y20" , "Y21" , "Y22" , "Y23" , "Y24" , "Y25" ,
+"Y26" , "Y27" , "Y28" , "Y29" , "Y3A" , "Y3B" , "Y3C" , "Y3D" ,
+"Y3E" , "Y3F" , "Y3G" , "Y3H" , "Y3I" , "Y3J" , "Y3K" , "Y3L" ,
+"Y3M" , "Y3N" , "Y3O" , "Y3P" , "Y3Q" , "Y3R" , "Y3S" , "Y3T" ,
+"Y3U" , "Y3V" , "Y3W" , "Y3X" , "Y3Y" , "Y3Z" , "Y30" , "Y31" ,
+"Y32" , "Y33" , "Y34" , "Y35" , "Y36" , "Y37" , "Y38" , "Y39" ,
+"Y4A" , "Y4B" , "Y4C" , "Y4D" , "Y4E" , "Y4F" , "Y4G" , "Y4H" ,
+"Y4I" , "Y4J" , "Y4K" , "Y4L" , "Y4M" , "Y4N" , "Y4O" , "Y4P" ,
+"Y4Q" , "Y4R" , "Y4S" , "Y4T" , "Y4U" , "Y4V" , "Y4W" , "Y4X" ,
+"Y4Y" , "Y4Z" , "Y40" , "Y41" , "Y42" , "Y43" , "Y44" , "Y45" ,
+"Y46" , "Y47" , "Y48" , "Y49" , "Y5A" , "Y5B" , "Y5C" , "Y5D" ,
+"Y5E" , "Y5F" , "Y5G" , "Y5H" , "Y5I" , "Y5J" , "Y5K" , "Y5L" ,
+"Y5M" , "Y5N" , "Y5O" , "Y5P" , "Y5Q" , "Y5R" , "Y5S" , "Y5T" ,
+"Y5U" , "Y5V" , "Y5W" , "Y5X" , "Y5Y" , "Y5Z" , "Y50" , "Y51" ,
+"Y52" , "Y53" , "Y54" , "Y55" , "Y56" , "Y57" , "Y58" , "Y59" ,
+"Y6A" , "Y6B" , "Y6C" , "Y6D" , "Y6E" , "Y6F" , "Y6G" , "Y6H" ,
+"Y6I" , "Y6J" , "Y6K" , "Y6L" , "Y6M" , "Y6N" , "Y6O" , "Y6P" ,
+"Y6Q" , "Y6R" , "Y6S" , "Y6T" , "Y6U" , "Y6V" , "Y6W" , "Y6X" ,
+"Y6Y" , "Y6Z" , "Y60" , "Y61" , "Y62" , "Y63" , "Y64" , "Y65" ,
+"Y66" , "Y67" , "Y68" , "Y69" , "Y7A" , "Y7B" , "Y7C" , "Y7D" ,
+"Y7E" , "Y7F" , "Y7G" , "Y7H" , "Y7I" , "Y7J" , "Y7K" , "Y7L" ,
+"Y7M" , "Y7N" , "Y7O" , "Y7P" , "Y7Q" , "Y7R" , "Y7S" , "Y7T" ,
+"Y7U" , "Y7V" , "Y7W" , "Y7X" , "Y7Y" , "Y7Z" , "Y70" , "Y71" ,
+"Y72" , "Y73" , "Y74" , "Y75" , "Y76" , "Y77" , "Y78" , "Y79" ,
+"Y8A" , "Y8B" , "Y8C" , "Y8D" , "Y8E" , "Y8F" , "Y8G" , "Y8H" ,
+"Y8I" , "Y8J" , "Y8K" , "Y8L" , "Y8M" , "Y8N" , "Y8O" , "Y8P" ,
+"Y8Q" , "Y8R" , "Y8S" , "Y8T" , "Y8U" , "Y8V" , "Y8W" , "Y8X" ,
+"Y8Y" , "Y8Z" , "Y80" , "Y81" , "Y82" , "Y83" , "Y84" , "Y85" ,
+"Y86" , "Y87" , "Y88" , "Y89" , "Y9A" , "Y9B" , "Y9C" , "Y9D" ,
+"Y9E" , "Y9F" , "Y9G" , "Y9H" , "Y9I" , "Y9J" , "Y9K" , "Y9L" ,
+"Y9M" , "Y9N" , "Y9O" , "Y9P" , "Y9Q" , "Y9R" , "Y9S" , "Y9T" ,
+"Y9U" , "Y9V" , "Y9W" , "Y9X" , "Y9Y" , "Y9Z" , "Y90" , "Y91" ,
+"Y92" , "Y93" , "Y94" , "Y95" , "Y96" , "Y97" , "Y98" , "Y99" ,
+"ZAA" , "ZAB" , "ZAC" , "ZAD" , "ZAE" , "ZAF" , "ZAG" , "ZAH" ,
+"ZAI" , "ZAJ" , "ZAK" , "ZAL" , "ZAM" , "ZAN" , "ZAO" , "ZAP" ,
+"ZAQ" , "ZAR" , "ZAS" , "ZAT" , "ZAU" , "ZAV" , "ZAW" , "ZAX" ,
+"ZAY" , "ZAZ" , "ZA0" , "ZA1" , "ZA2" , "ZA3" , "ZA4" , "ZA5" ,
+"ZA6" , "ZA7" , "ZA8" , "ZA9" , "ZBA" , "ZBB" , "ZBC" , "ZBD" ,
+"ZBE" , "ZBF" , "ZBG" , "ZBH" , "ZBI" , "ZBJ" , "ZBK" , "ZBL" ,
+"ZBM" , "ZBN" , "ZBO" , "ZBP" , "ZBQ" , "ZBR" , "ZBS" , "ZBT" ,
+"ZBU" , "ZBV" , "ZBW" , "ZBX" , "ZBY" , "ZBZ" , "ZB0" , "ZB1" ,
+"ZB2" , "ZB3" , "ZB4" , "ZB5" , "ZB6" , "ZB7" , "ZB8" , "ZB9" ,
+"ZCA" , "ZCB" , "ZCC" , "ZCD" , "ZCE" , "ZCF" , "ZCG" , "ZCH" ,
+"ZCI" , "ZCJ" , "ZCK" , "ZCL" , "ZCM" , "ZCN" , "ZCO" , "ZCP" ,
+"ZCQ" , "ZCR" , "ZCS" , "ZCT" , "ZCU" , "ZCV" , "ZCW" , "ZCX" ,
+"ZCY" , "ZCZ" , "ZC0" , "ZC1" , "ZC2" , "ZC3" , "ZC4" , "ZC5" ,
+"ZC6" , "ZC7" , "ZC8" , "ZC9" , "ZDA" , "ZDB" , "ZDC" , "ZDD" ,
+"ZDE" , "ZDF" , "ZDG" , "ZDH" , "ZDI" , "ZDJ" , "ZDK" , "ZDL" ,
+"ZDM" , "ZDN" , "ZDO" , "ZDP" , "ZDQ" , "ZDR" , "ZDS" , "ZDT" ,
+"ZDU" , "ZDV" , "ZDW" , "ZDX" , "ZDY" , "ZDZ" , "ZD0" , "ZD1" ,
+"ZD2" , "ZD3" , "ZD4" , "ZD5" , "ZD6" , "ZD7" , "ZD8" , "ZD9" ,
+"ZEA" , "ZEB" , "ZEC" , "ZED" , "ZEE" , "ZEF" , "ZEG" , "ZEH" ,
+"ZEI" , "ZEJ" , "ZEK" , "ZEL" , "ZEM" , "ZEN" , "ZEO" , "ZEP" ,
+"ZEQ" , "ZER" , "ZES" , "ZET" , "ZEU" , "ZEV" , "ZEW" , "ZEX" ,
+"ZEY" , "ZEZ" , "ZE0" , "ZE1" , "ZE2" , "ZE3" , "ZE4" , "ZE5" ,
+"ZE6" , "ZE7" , "ZE8" , "ZE9" , "ZFA" , "ZFB" , "ZFC" , "ZFD" ,
+"ZFE" , "ZFF" , "ZFG" , "ZFH" , "ZFI" , "ZFJ" , "ZFK" , "ZFL" ,
+"ZFM" , "ZFN" , "ZFO" , "ZFP" , "ZFQ" , "ZFR" , "ZFS" , "ZFT" ,
+"ZFU" , "ZFV" , "ZFW" , "ZFX" , "ZFY" , "ZFZ" , "ZF0" , "ZF1" ,
+"ZF2" , "ZF3" , "ZF4" , "ZF5" , "ZF6" , "ZF7" , "ZF8" , "ZF9" ,
+"ZGA" , "ZGB" , "ZGC" , "ZGD" , "ZGE" , "ZGF" , "ZGG" , "ZGH" ,
+"ZGI" , "ZGJ" , "ZGK" , "ZGL" , "ZGM" , "ZGN" , "ZGO" , "ZGP" ,
+"ZGQ" , "ZGR" , "ZGS" , "ZGT" , "ZGU" , "ZGV" , "ZGW" , "ZGX" ,
+"ZGY" , "ZGZ" , "ZG0" , "ZG1" , "ZG2" , "ZG3" , "ZG4" , "ZG5" ,
+"ZG6" , "ZG7" , "ZG8" , "ZG9" , "ZHA" , "ZHB" , "ZHC" , "ZHD" ,
+"ZHE" , "ZHF" , "ZHG" , "ZHH" , "ZHI" , "ZHJ" , "ZHK" , "ZHL" ,
+"ZHM" , "ZHN" , "ZHO" , "ZHP" , "ZHQ" , "ZHR" , "ZHS" , "ZHT" ,
+"ZHU" , "ZHV" , "ZHW" , "ZHX" , "ZHY" , "ZHZ" , "ZH0" , "ZH1" ,
+"ZH2" , "ZH3" , "ZH4" , "ZH5" , "ZH6" , "ZH7" , "ZH8" , "ZH9" ,
+"ZIA" , "ZIB" , "ZIC" , "ZID" , "ZIE" , "ZIF" , "ZIG" , "ZIH" ,
+"ZII" , "ZIJ" , "ZIK" , "ZIL" , "ZIM" , "ZIN" , "ZIO" , "ZIP" ,
+"ZIQ" , "ZIR" , "ZIS" , "ZIT" , "ZIU" , "ZIV" , "ZIW" , "ZIX" ,
+"ZIY" , "ZIZ" , "ZI0" , "ZI1" , "ZI2" , "ZI3" , "ZI4" , "ZI5" ,
+"ZI6" , "ZI7" , "ZI8" , "ZI9" , "ZJA" , "ZJB" , "ZJC" , "ZJD" ,
+"ZJE" , "ZJF" , "ZJG" , "ZJH" , "ZJI" , "ZJJ" , "ZJK" , "ZJL" ,
+"ZJM" , "ZJN" , "ZJO" , "ZJP" , "ZJQ" , "ZJR" , "ZJS" , "ZJT" ,
+"ZJU" , "ZJV" , "ZJW" , "ZJX" , "ZJY" , "ZJZ" , "ZJ0" , "ZJ1" ,
+"ZJ2" , "ZJ3" , "ZJ4" , "ZJ5" , "ZJ6" , "ZJ7" , "ZJ8" , "ZJ9" ,
+"ZKA" , "ZKB" , "ZKC" , "ZKD" , "ZKE" , "ZKF" , "ZKG" , "ZKH" ,
+"ZKI" , "ZKJ" , "ZKK" , "ZKL" , "ZKM" , "ZKN" , "ZKO" , "ZKP" ,
+"ZKQ" , "ZKR" , "ZKS" , "ZKT" , "ZKU" , "ZKV" , "ZKW" , "ZKX" ,
+"ZKY" , "ZKZ" , "ZK0" , "ZK1" , "ZK2" , "ZK3" , "ZK4" , "ZK5" ,
+"ZK6" , "ZK7" , "ZK8" , "ZK9" , "ZLA" , "ZLB" , "ZLC" , "ZLD" ,
+"ZLE" , "ZLF" , "ZLG" , "ZLH" , "ZLI" , "ZLJ" , "ZLK" , "ZLL" ,
+"ZLM" , "ZLN" , "ZLO" , "ZLP" , "ZLQ" , "ZLR" , "ZLS" , "ZLT" ,
+"ZLU" , "ZLV" , "ZLW" , "ZLX" , "ZLY" , "ZLZ" , "ZL0" , "ZL1" ,
+"ZL2" , "ZL3" , "ZL4" , "ZL5" , "ZL6" , "ZL7" , "ZL8" , "ZL9" ,
+"ZMA" , "ZMB" , "ZMC" , "ZMD" , "ZME" , "ZMF" , "ZMG" , "ZMH" ,
+"ZMI" , "ZMJ" , "ZMK" , "ZML" , "ZMM" , "ZMN" , "ZMO" , "ZMP" ,
+"ZMQ" , "ZMR" , "ZMS" , "ZMT" , "ZMU" , "ZMV" , "ZMW" , "ZMX" ,
+"ZMY" , "ZMZ" , "ZM0" , "ZM1" , "ZM2" , "ZM3" , "ZM4" , "ZM5" ,
+"ZM6" , "ZM7" , "ZM8" , "ZM9" , "ZNA" , "ZNB" , "ZNC" , "ZND" ,
+"ZNE" , "ZNF" , "ZNG" , "ZNH" , "ZNI" , "ZNJ" , "ZNK" , "ZNL" ,
+"ZNM" , "ZNN" , "ZNO" , "ZNP" , "ZNQ" , "ZNR" , "ZNS" , "ZNT" ,
+"ZNU" , "ZNV" , "ZNW" , "ZNX" , "ZNY" , "ZNZ" , "ZN0" , "ZN1" ,
+"ZN2" , "ZN3" , "ZN4" , "ZN5" , "ZN6" , "ZN7" , "ZN8" , "ZN9" ,
+"ZOA" , "ZOB" , "ZOC" , "ZOD" , "ZOE" , "ZOF" , "ZOG" , "ZOH" ,
+"ZOI" , "ZOJ" , "ZOK" , "ZOL" , "ZOM" , "ZON" , "ZOO" , "ZOP" ,
+"ZOQ" , "ZOR" , "ZOS" , "ZOT" , "ZOU" , "ZOV" , "ZOW" , "ZOX" ,
+"ZOY" , "ZOZ" , "ZO0" , "ZO1" , "ZO2" , "ZO3" , "ZO4" , "ZO5" ,
+"ZO6" , "ZO7" , "ZO8" , "ZO9" , "ZPA" , "ZPB" , "ZPC" , "ZPD" ,
+"ZPE" , "ZPF" , "ZPG" , "ZPH" , "ZPI" , "ZPJ" , "ZPK" , "ZPL" ,
+"ZPM" , "ZPN" , "ZPO" , "ZPP" , "ZPQ" , "ZPR" , "ZPS" , "ZPT" ,
+"ZPU" , "ZPV" , "ZPW" , "ZPX" , "ZPY" , "ZPZ" , "ZP0" , "ZP1" ,
+"ZP2" , "ZP3" , "ZP4" , "ZP5" , "ZP6" , "ZP7" , "ZP8" , "ZP9" ,
+"ZQA" , "ZQB" , "ZQC" , "ZQD" , "ZQE" , "ZQF" , "ZQG" , "ZQH" ,
+"ZQI" , "ZQJ" , "ZQK" , "ZQL" , "ZQM" , "ZQN" , "ZQO" , "ZQP" ,
+"ZQQ" , "ZQR" , "ZQS" , "ZQT" , "ZQU" , "ZQV" , "ZQW" , "ZQX" ,
+"ZQY" , "ZQZ" , "ZQ0" , "ZQ1" , "ZQ2" , "ZQ3" , "ZQ4" , "ZQ5" ,
+"ZQ6" , "ZQ7" , "ZQ8" , "ZQ9" , "ZRA" , "ZRB" , "ZRC" , "ZRD" ,
+"ZRE" , "ZRF" , "ZRG" , "ZRH" , "ZRI" , "ZRJ" , "ZRK" , "ZRL" ,
+"ZRM" , "ZRN" , "ZRO" , "ZRP" , "ZRQ" , "ZRR" , "ZRS" , "ZRT" ,
+"ZRU" , "ZRV" , "ZRW" , "ZRX" , "ZRY" , "ZRZ" , "ZR0" , "ZR1" ,
+"ZR2" , "ZR3" , "ZR4" , "ZR5" , "ZR6" , "ZR7" , "ZR8" , "ZR9" ,
+"ZSA" , "ZSB" , "ZSC" , "ZSD" , "ZSE" , "ZSF" , "ZSG" , "ZSH" ,
+"ZSI" , "ZSJ" , "ZSK" , "ZSL" , "ZSM" , "ZSN" , "ZSO" , "ZSP" ,
+"ZSQ" , "ZSR" , "ZSS" , "ZST" , "ZSU" , "ZSV" , "ZSW" , "ZSX" ,
+"ZSY" , "ZSZ" , "ZS0" , "ZS1" , "ZS2" , "ZS3" , "ZS4" , "ZS5" ,
+"ZS6" , "ZS7" , "ZS8" , "ZS9" , "ZTA" , "ZTB" , "ZTC" , "ZTD" ,
+"ZTE" , "ZTF" , "ZTG" , "ZTH" , "ZTI" , "ZTJ" , "ZTK" , "ZTL" ,
+"ZTM" , "ZTN" , "ZTO" , "ZTP" , "ZTQ" , "ZTR" , "ZTS" , "ZTT" ,
+"ZTU" , "ZTV" , "ZTW" , "ZTX" , "ZTY" , "ZTZ" , "ZT0" , "ZT1" ,
+"ZT2" , "ZT3" , "ZT4" , "ZT5" , "ZT6" , "ZT7" , "ZT8" , "ZT9" ,
+"ZUA" , "ZUB" , "ZUC" , "ZUD" , "ZUE" , "ZUF" , "ZUG" , "ZUH" ,
+"ZUI" , "ZUJ" , "ZUK" , "ZUL" , "ZUM" , "ZUN" , "ZUO" , "ZUP" ,
+"ZUQ" , "ZUR" , "ZUS" , "ZUT" , "ZUU" , "ZUV" , "ZUW" , "ZUX" ,
+"ZUY" , "ZUZ" , "ZU0" , "ZU1" , "ZU2" , "ZU3" , "ZU4" , "ZU5" ,
+"ZU6" , "ZU7" , "ZU8" , "ZU9" , "ZVA" , "ZVB" , "ZVC" , "ZVD" ,
+"ZVE" , "ZVF" , "ZVG" , "ZVH" , "ZVI" , "ZVJ" , "ZVK" , "ZVL" ,
+"ZVM" , "ZVN" , "ZVO" , "ZVP" , "ZVQ" , "ZVR" , "ZVS" , "ZVT" ,
+"ZVU" , "ZVV" , "ZVW" , "ZVX" , "ZVY" , "ZVZ" , "ZV0" , "ZV1" ,
+"ZV2" , "ZV3" , "ZV4" , "ZV5" , "ZV6" , "ZV7" , "ZV8" , "ZV9" ,
+"ZWA" , "ZWB" , "ZWC" , "ZWD" , "ZWE" , "ZWF" , "ZWG" , "ZWH" ,
+"ZWI" , "ZWJ" , "ZWK" , "ZWL" , "ZWM" , "ZWN" , "ZWO" , "ZWP" ,
+"ZWQ" , "ZWR" , "ZWS" , "ZWT" , "ZWU" , "ZWV" , "ZWW" , "ZWX" ,
+"ZWY" , "ZWZ" , "ZW0" , "ZW1" , "ZW2" , "ZW3" , "ZW4" , "ZW5" ,
+"ZW6" , "ZW7" , "ZW8" , "ZW9" , "ZXA" , "ZXB" , "ZXC" , "ZXD" ,
+"ZXE" , "ZXF" , "ZXG" , "ZXH" , "ZXI" , "ZXJ" , "ZXK" , "ZXL" ,
+"ZXM" , "ZXN" , "ZXO" , "ZXP" , "ZXQ" , "ZXR" , "ZXS" , "ZXT" ,
+"ZXU" , "ZXV" , "ZXW" , "ZXX" , "ZXY" , "ZXZ" , "ZX0" , "ZX1" ,
+"ZX2" , "ZX3" , "ZX4" , "ZX5" , "ZX6" , "ZX7" , "ZX8" , "ZX9" ,
+"ZYA" , "ZYB" , "ZYC" , "ZYD" , "ZYE" , "ZYF" , "ZYG" , "ZYH" ,
+"ZYI" , "ZYJ" , "ZYK" , "ZYL" , "ZYM" , "ZYN" , "ZYO" , "ZYP" ,
+"ZYQ" , "ZYR" , "ZYS" , "ZYT" , "ZYU" , "ZYV" , "ZYW" , "ZYX" ,
+"ZYY" , "ZYZ" , "ZY0" , "ZY1" , "ZY2" , "ZY3" , "ZY4" , "ZY5" ,
+"ZY6" , "ZY7" , "ZY8" , "ZY9" , "ZZA" , "ZZB" , "ZZC" , "ZZD" ,
+"ZZE" , "ZZF" , "ZZG" , "ZZH" , "ZZI" , "ZZJ" , "ZZK" , "ZZL" ,
+"ZZM" , "ZZN" , "ZZO" , "ZZP" , "ZZQ" , "ZZR" , "ZZS" , "ZZT" ,
+"ZZU" , "ZZV" , "ZZW" , "ZZX" , "ZZY" , "ZZZ" , "ZZ0" , "ZZ1" ,
+"ZZ2" , "ZZ3" , "ZZ4" , "ZZ5" , "ZZ6" , "ZZ7" , "ZZ8" , "ZZ9" ,
+"Z0A" , "Z0B" , "Z0C" , "Z0D" , "Z0E" , "Z0F" , "Z0G" , "Z0H" ,
+"Z0I" , "Z0J" , "Z0K" , "Z0L" , "Z0M" , "Z0N" , "Z0O" , "Z0P" ,
+"Z0Q" , "Z0R" , "Z0S" , "Z0T" , "Z0U" , "Z0V" , "Z0W" , "Z0X" ,
+"Z0Y" , "Z0Z" , "Z00" , "Z01" , "Z02" , "Z03" , "Z04" , "Z05" ,
+"Z06" , "Z07" , "Z08" , "Z09" , "Z1A" , "Z1B" , "Z1C" , "Z1D" ,
+"Z1E" , "Z1F" , "Z1G" , "Z1H" , "Z1I" , "Z1J" , "Z1K" , "Z1L" ,
+"Z1M" , "Z1N" , "Z1O" , "Z1P" , "Z1Q" , "Z1R" , "Z1S" , "Z1T" ,
+"Z1U" , "Z1V" , "Z1W" , "Z1X" , "Z1Y" , "Z1Z" , "Z10" , "Z11" ,
+"Z12" , "Z13" , "Z14" , "Z15" , "Z16" , "Z17" , "Z18" , "Z19" ,
+"Z2A" , "Z2B" , "Z2C" , "Z2D" , "Z2E" , "Z2F" , "Z2G" , "Z2H" ,
+"Z2I" , "Z2J" , "Z2K" , "Z2L" , "Z2M" , "Z2N" , "Z2O" , "Z2P" ,
+"Z2Q" , "Z2R" , "Z2S" , "Z2T" , "Z2U" , "Z2V" , "Z2W" , "Z2X" ,
+"Z2Y" , "Z2Z" , "Z20" , "Z21" , "Z22" , "Z23" , "Z24" , "Z25" ,
+"Z26" , "Z27" , "Z28" , "Z29" , "Z3A" , "Z3B" , "Z3C" , "Z3D" ,
+"Z3E" , "Z3F" , "Z3G" , "Z3H" , "Z3I" , "Z3J" , "Z3K" , "Z3L" ,
+"Z3M" , "Z3N" , "Z3O" , "Z3P" , "Z3Q" , "Z3R" , "Z3S" , "Z3T" ,
+"Z3U" , "Z3V" , "Z3W" , "Z3X" , "Z3Y" , "Z3Z" , "Z30" , "Z31" ,
+"Z32" , "Z33" , "Z34" , "Z35" , "Z36" , "Z37" , "Z38" , "Z39" ,
+"Z4A" , "Z4B" , "Z4C" , "Z4D" , "Z4E" , "Z4F" , "Z4G" , "Z4H" ,
+"Z4I" , "Z4J" , "Z4K" , "Z4L" , "Z4M" , "Z4N" , "Z4O" , "Z4P" ,
+"Z4Q" , "Z4R" , "Z4S" , "Z4T" , "Z4U" , "Z4V" , "Z4W" , "Z4X" ,
+"Z4Y" , "Z4Z" , "Z40" , "Z41" , "Z42" , "Z43" , "Z44" , "Z45" ,
+"Z46" , "Z47" , "Z48" , "Z49" , "Z5A" , "Z5B" , "Z5C" , "Z5D" ,
+"Z5E" , "Z5F" , "Z5G" , "Z5H" , "Z5I" , "Z5J" , "Z5K" , "Z5L" ,
+"Z5M" , "Z5N" , "Z5O" , "Z5P" , "Z5Q" , "Z5R" , "Z5S" , "Z5T" ,
+"Z5U" , "Z5V" , "Z5W" , "Z5X" , "Z5Y" , "Z5Z" , "Z50" , "Z51" ,
+"Z52" , "Z53" , "Z54" , "Z55" , "Z56" , "Z57" , "Z58" , "Z59" ,
+"Z6A" , "Z6B" , "Z6C" , "Z6D" , "Z6E" , "Z6F" , "Z6G" , "Z6H" ,
+"Z6I" , "Z6J" , "Z6K" , "Z6L" , "Z6M" , "Z6N" , "Z6O" , "Z6P" ,
+"Z6Q" , "Z6R" , "Z6S" , "Z6T" , "Z6U" , "Z6V" , "Z6W" , "Z6X" ,
+"Z6Y" , "Z6Z" , "Z60" , "Z61" , "Z62" , "Z63" , "Z64" , "Z65" ,
+"Z66" , "Z67" , "Z68" , "Z69" , "Z7A" , "Z7B" , "Z7C" , "Z7D" ,
+"Z7E" , "Z7F" , "Z7G" , "Z7H" , "Z7I" , "Z7J" , "Z7K" , "Z7L" ,
+"Z7M" , "Z7N" , "Z7O" , "Z7P" , "Z7Q" , "Z7R" , "Z7S" , "Z7T" ,
+"Z7U" , "Z7V" , "Z7W" , "Z7X" , "Z7Y" , "Z7Z" , "Z70" , "Z71" ,
+"Z72" , "Z73" , "Z74" , "Z75" , "Z76" , "Z77" , "Z78" , "Z79" ,
+"Z8A" , "Z8B" , "Z8C" , "Z8D" , "Z8E" , "Z8F" , "Z8G" , "Z8H" ,
+"Z8I" , "Z8J" , "Z8K" , "Z8L" , "Z8M" , "Z8N" , "Z8O" , "Z8P" ,
+"Z8Q" , "Z8R" , "Z8S" , "Z8T" , "Z8U" , "Z8V" , "Z8W" , "Z8X" ,
+"Z8Y" , "Z8Z" , "Z80" , "Z81" , "Z82" , "Z83" , "Z84" , "Z85" ,
+"Z86" , "Z87" , "Z88" , "Z89" , "Z9A" , "Z9B" , "Z9C" , "Z9D" ,
+"Z9E" , "Z9F" , "Z9G" , "Z9H" , "Z9I" , "Z9J" , "Z9K" , "Z9L" ,
+"Z9M" , "Z9N" , "Z9O" , "Z9P" , "Z9Q" , "Z9R" , "Z9S" , "Z9T" ,
+"Z9U" , "Z9V" , "Z9W" , "Z9X" , "Z9Y" , "Z9Z" , "Z90" , "Z91" ,
+"Z92" , "Z93" , "Z94" , "Z95" , "Z96" , "Z97" , "Z98" , "Z99" ,
+"0AA" , "0AB" , "0AC" , "0AD" , "0AE" , "0AF" , "0AG" , "0AH" ,
+"0AI" , "0AJ" , "0AK" , "0AL" , "0AM" , "0AN" , "0AO" , "0AP" ,
+"0AQ" , "0AR" , "0AS" , "0AT" , "0AU" , "0AV" , "0AW" , "0AX" ,
+"0AY" , "0AZ" , "0A0" , "0A1" , "0A2" , "0A3" , "0A4" , "0A5" ,
+"0A6" , "0A7" , "0A8" , "0A9" , "0BA" , "0BB" , "0BC" , "0BD" ,
+"0BE" , "0BF" , "0BG" , "0BH" , "0BI" , "0BJ" , "0BK" , "0BL" ,
+"0BM" , "0BN" , "0BO" , "0BP" , "0BQ" , "0BR" , "0BS" , "0BT" ,
+"0BU" , "0BV" , "0BW" , "0BX" , "0BY" , "0BZ" , "0B0" , "0B1" ,
+"0B2" , "0B3" , "0B4" , "0B5" , "0B6" , "0B7" , "0B8" , "0B9" ,
+"0CA" , "0CB" , "0CC" , "0CD" , "0CE" , "0CF" , "0CG" , "0CH" ,
+"0CI" , "0CJ" , "0CK" , "0CL" , "0CM" , "0CN" , "0CO" , "0CP" ,
+"0CQ" , "0CR" , "0CS" , "0CT" , "0CU" , "0CV" , "0CW" , "0CX" ,
+"0CY" , "0CZ" , "0C0" , "0C1" , "0C2" , "0C3" , "0C4" , "0C5" ,
+"0C6" , "0C7" , "0C8" , "0C9" , "0DA" , "0DB" , "0DC" , "0DD" ,
+"0DE" , "0DF" , "0DG" , "0DH" , "0DI" , "0DJ" , "0DK" , "0DL" ,
+"0DM" , "0DN" , "0DO" , "0DP" , "0DQ" , "0DR" , "0DS" , "0DT" ,
+"0DU" , "0DV" , "0DW" , "0DX" , "0DY" , "0DZ" , "0D0" , "0D1" ,
+"0D2" , "0D3" , "0D4" , "0D5" , "0D6" , "0D7" , "0D8" , "0D9" ,
+"0EA" , "0EB" , "0EC" , "0ED" , "0EE" , "0EF" , "0EG" , "0EH" ,
+"0EI" , "0EJ" , "0EK" , "0EL" , "0EM" , "0EN" , "0EO" , "0EP" ,
+"0EQ" , "0ER" , "0ES" , "0ET" , "0EU" , "0EV" , "0EW" , "0EX" ,
+"0EY" , "0EZ" , "0E0" , "0E1" , "0E2" , "0E3" , "0E4" , "0E5" ,
+"0E6" , "0E7" , "0E8" , "0E9" , "0FA" , "0FB" , "0FC" , "0FD" ,
+"0FE" , "0FF" , "0FG" , "0FH" , "0FI" , "0FJ" , "0FK" , "0FL" ,
+"0FM" , "0FN" , "0FO" , "0FP" , "0FQ" , "0FR" , "0FS" , "0FT" ,
+"0FU" , "0FV" , "0FW" , "0FX" , "0FY" , "0FZ" , "0F0" , "0F1" ,
+"0F2" , "0F3" , "0F4" , "0F5" , "0F6" , "0F7" , "0F8" , "0F9" ,
+"0GA" , "0GB" , "0GC" , "0GD" , "0GE" , "0GF" , "0GG" , "0GH" ,
+"0GI" , "0GJ" , "0GK" , "0GL" , "0GM" , "0GN" , "0GO" , "0GP" ,
+"0GQ" , "0GR" , "0GS" , "0GT" , "0GU" , "0GV" , "0GW" , "0GX" ,
+"0GY" , "0GZ" , "0G0" , "0G1" , "0G2" , "0G3" , "0G4" , "0G5" ,
+"0G6" , "0G7" , "0G8" , "0G9" , "0HA" , "0HB" , "0HC" , "0HD" ,
+"0HE" , "0HF" , "0HG" , "0HH" , "0HI" , "0HJ" , "0HK" , "0HL" ,
+"0HM" , "0HN" , "0HO" , "0HP" , "0HQ" , "0HR" , "0HS" , "0HT" ,
+"0HU" , "0HV" , "0HW" , "0HX" , "0HY" , "0HZ" , "0H0" , "0H1" ,
+"0H2" , "0H3" , "0H4" , "0H5" , "0H6" , "0H7" , "0H8" , "0H9" ,
+"0IA" , "0IB" , "0IC" , "0ID" , "0IE" , "0IF" , "0IG" , "0IH" ,
+"0II" , "0IJ" , "0IK" , "0IL" , "0IM" , "0IN" , "0IO" , "0IP" ,
+"0IQ" , "0IR" , "0IS" , "0IT" , "0IU" , "0IV" , "0IW" , "0IX" ,
+"0IY" , "0IZ" , "0I0" , "0I1" , "0I2" , "0I3" , "0I4" , "0I5" ,
+"0I6" , "0I7" , "0I8" , "0I9" , "0JA" , "0JB" , "0JC" , "0JD" ,
+"0JE" , "0JF" , "0JG" , "0JH" , "0JI" , "0JJ" , "0JK" , "0JL" ,
+"0JM" , "0JN" , "0JO" , "0JP" , "0JQ" , "0JR" , "0JS" , "0JT" ,
+"0JU" , "0JV" , "0JW" , "0JX" , "0JY" , "0JZ" , "0J0" , "0J1" ,
+"0J2" , "0J3" , "0J4" , "0J5" , "0J6" , "0J7" , "0J8" , "0J9" ,
+"0KA" , "0KB" , "0KC" , "0KD" , "0KE" , "0KF" , "0KG" , "0KH" ,
+"0KI" , "0KJ" , "0KK" , "0KL" , "0KM" , "0KN" , "0KO" , "0KP" ,
+"0KQ" , "0KR" , "0KS" , "0KT" , "0KU" , "0KV" , "0KW" , "0KX" ,
+"0KY" , "0KZ" , "0K0" , "0K1" , "0K2" , "0K3" , "0K4" , "0K5" ,
+"0K6" , "0K7" , "0K8" , "0K9" , "0LA" , "0LB" , "0LC" , "0LD" ,
+"0LE" , "0LF" , "0LG" , "0LH" , "0LI" , "0LJ" , "0LK" , "0LL" ,
+"0LM" , "0LN" , "0LO" , "0LP" , "0LQ" , "0LR" , "0LS" , "0LT" ,
+"0LU" , "0LV" , "0LW" , "0LX" , "0LY" , "0LZ" , "0L0" , "0L1" ,
+"0L2" , "0L3" , "0L4" , "0L5" , "0L6" , "0L7" , "0L8" , "0L9" ,
+"0MA" , "0MB" , "0MC" , "0MD" , "0ME" , "0MF" , "0MG" , "0MH" ,
+"0MI" , "0MJ" , "0MK" , "0ML" , "0MM" , "0MN" , "0MO" , "0MP" ,
+"0MQ" , "0MR" , "0MS" , "0MT" , "0MU" , "0MV" , "0MW" , "0MX" ,
+"0MY" , "0MZ" , "0M0" , "0M1" , "0M2" , "0M3" , "0M4" , "0M5" ,
+"0M6" , "0M7" , "0M8" , "0M9" , "0NA" , "0NB" , "0NC" , "0ND" ,
+"0NE" , "0NF" , "0NG" , "0NH" , "0NI" , "0NJ" , "0NK" , "0NL" ,
+"0NM" , "0NN" , "0NO" , "0NP" , "0NQ" , "0NR" , "0NS" , "0NT" ,
+"0NU" , "0NV" , "0NW" , "0NX" , "0NY" , "0NZ" , "0N0" , "0N1" ,
+"0N2" , "0N3" , "0N4" , "0N5" , "0N6" , "0N7" , "0N8" , "0N9" ,
+"0OA" , "0OB" , "0OC" , "0OD" , "0OE" , "0OF" , "0OG" , "0OH" ,
+"0OI" , "0OJ" , "0OK" , "0OL" , "0OM" , "0ON" , "0OO" , "0OP" ,
+"0OQ" , "0OR" , "0OS" , "0OT" , "0OU" , "0OV" , "0OW" , "0OX" ,
+"0OY" , "0OZ" , "0O0" , "0O1" , "0O2" , "0O3" , "0O4" , "0O5" ,
+"0O6" , "0O7" , "0O8" , "0O9" , "0PA" , "0PB" , "0PC" , "0PD" ,
+"0PE" , "0PF" , "0PG" , "0PH" , "0PI" , "0PJ" , "0PK" , "0PL" ,
+"0PM" , "0PN" , "0PO" , "0PP" , "0PQ" , "0PR" , "0PS" , "0PT" ,
+"0PU" , "0PV" , "0PW" , "0PX" , "0PY" , "0PZ" , "0P0" , "0P1" ,
+"0P2" , "0P3" , "0P4" , "0P5" , "0P6" , "0P7" , "0P8" , "0P9" ,
+"0QA" , "0QB" , "0QC" , "0QD" , "0QE" , "0QF" , "0QG" , "0QH" ,
+"0QI" , "0QJ" , "0QK" , "0QL" , "0QM" , "0QN" , "0QO" , "0QP" ,
+"0QQ" , "0QR" , "0QS" , "0QT" , "0QU" , "0QV" , "0QW" , "0QX" ,
+"0QY" , "0QZ" , "0Q0" , "0Q1" , "0Q2" , "0Q3" , "0Q4" , "0Q5" ,
+"0Q6" , "0Q7" , "0Q8" , "0Q9" , "0RA" , "0RB" , "0RC" , "0RD" ,
+"0RE" , "0RF" , "0RG" , "0RH" , "0RI" , "0RJ" , "0RK" , "0RL" ,
+"0RM" , "0RN" , "0RO" , "0RP" , "0RQ" , "0RR" , "0RS" , "0RT" ,
+"0RU" , "0RV" , "0RW" , "0RX" , "0RY" , "0RZ" , "0R0" , "0R1" ,
+"0R2" , "0R3" , "0R4" , "0R5" , "0R6" , "0R7" , "0R8" , "0R9" ,
+"0SA" , "0SB" , "0SC" , "0SD" , "0SE" , "0SF" , "0SG" , "0SH" ,
+"0SI" , "0SJ" , "0SK" , "0SL" , "0SM" , "0SN" , "0SO" , "0SP" ,
+"0SQ" , "0SR" , "0SS" , "0ST" , "0SU" , "0SV" , "0SW" , "0SX" ,
+"0SY" , "0SZ" , "0S0" , "0S1" , "0S2" , "0S3" , "0S4" , "0S5" ,
+"0S6" , "0S7" , "0S8" , "0S9" , "0TA" , "0TB" , "0TC" , "0TD" ,
+"0TE" , "0TF" , "0TG" , "0TH" , "0TI" , "0TJ" , "0TK" , "0TL" ,
+"0TM" , "0TN" , "0TO" , "0TP" , "0TQ" , "0TR" , "0TS" , "0TT" ,
+"0TU" , "0TV" , "0TW" , "0TX" , "0TY" , "0TZ" , "0T0" , "0T1" ,
+"0T2" , "0T3" , "0T4" , "0T5" , "0T6" , "0T7" , "0T8" , "0T9" ,
+"0UA" , "0UB" , "0UC" , "0UD" , "0UE" , "0UF" , "0UG" , "0UH" ,
+"0UI" , "0UJ" , "0UK" , "0UL" , "0UM" , "0UN" , "0UO" , "0UP" ,
+"0UQ" , "0UR" , "0US" , "0UT" , "0UU" , "0UV" , "0UW" , "0UX" ,
+"0UY" , "0UZ" , "0U0" , "0U1" , "0U2" , "0U3" , "0U4" , "0U5" ,
+"0U6" , "0U7" , "0U8" , "0U9" , "0VA" , "0VB" , "0VC" , "0VD" ,
+"0VE" , "0VF" , "0VG" , "0VH" , "0VI" , "0VJ" , "0VK" , "0VL" ,
+"0VM" , "0VN" , "0VO" , "0VP" , "0VQ" , "0VR" , "0VS" , "0VT" ,
+"0VU" , "0VV" , "0VW" , "0VX" , "0VY" , "0VZ" , "0V0" , "0V1" ,
+"0V2" , "0V3" , "0V4" , "0V5" , "0V6" , "0V7" , "0V8" , "0V9" ,
+"0WA" , "0WB" , "0WC" , "0WD" , "0WE" , "0WF" , "0WG" , "0WH" ,
+"0WI" , "0WJ" , "0WK" , "0WL" , "0WM" , "0WN" , "0WO" , "0WP" ,
+"0WQ" , "0WR" , "0WS" , "0WT" , "0WU" , "0WV" , "0WW" , "0WX" ,
+"0WY" , "0WZ" , "0W0" , "0W1" , "0W2" , "0W3" , "0W4" , "0W5" ,
+"0W6" , "0W7" , "0W8" , "0W9" , "0XA" , "0XB" , "0XC" , "0XD" ,
+"0XE" , "0XF" , "0XG" , "0XH" , "0XI" , "0XJ" , "0XK" , "0XL" ,
+"0XM" , "0XN" , "0XO" , "0XP" , "0XQ" , "0XR" , "0XS" , "0XT" ,
+"0XU" , "0XV" , "0XW" , "0XX" , "0XY" , "0XZ" , "0X0" , "0X1" ,
+"0X2" , "0X3" , "0X4" , "0X5" , "0X6" , "0X7" , "0X8" , "0X9" ,
+"0YA" , "0YB" , "0YC" , "0YD" , "0YE" , "0YF" , "0YG" , "0YH" ,
+"0YI" , "0YJ" , "0YK" , "0YL" , "0YM" , "0YN" , "0YO" , "0YP" ,
+"0YQ" , "0YR" , "0YS" , "0YT" , "0YU" , "0YV" , "0YW" , "0YX" ,
+"0YY" , "0YZ" , "0Y0" , "0Y1" , "0Y2" , "0Y3" , "0Y4" , "0Y5" ,
+"0Y6" , "0Y7" , "0Y8" , "0Y9" , "0ZA" , "0ZB" , "0ZC" , "0ZD" ,
+"0ZE" , "0ZF" , "0ZG" , "0ZH" , "0ZI" , "0ZJ" , "0ZK" , "0ZL" ,
+"0ZM" , "0ZN" , "0ZO" , "0ZP" , "0ZQ" , "0ZR" , "0ZS" , "0ZT" ,
+"0ZU" , "0ZV" , "0ZW" , "0ZX" , "0ZY" , "0ZZ" , "0Z0" , "0Z1" ,
+"0Z2" , "0Z3" , "0Z4" , "0Z5" , "0Z6" , "0Z7" , "0Z8" , "0Z9" ,
+"00A" , "00B" , "00C" , "00D" , "00E" , "00F" , "00G" , "00H" ,
+"00I" , "00J" , "00K" , "00L" , "00M" , "00N" , "00O" , "00P" ,
+"00Q" , "00R" , "00S" , "00T" , "00U" , "00V" , "00W" , "00X" ,
+"00Y" , "00Z" , "000" , "001" , "002" , "003" , "004" , "005" ,
+"006" , "007" , "008" , "009" , "01A" , "01B" , "01C" , "01D" ,
+"01E" , "01F" , "01G" , "01H" , "01I" , "01J" , "01K" , "01L" ,
+"01M" , "01N" , "01O" , "01P" , "01Q" , "01R" , "01S" , "01T" ,
+"01U" , "01V" , "01W" , "01X" , "01Y" , "01Z" , "010" , "011" ,
+"012" , "013" , "014" , "015" , "016" , "017" , "018" , "019" ,
+"02A" , "02B" , "02C" , "02D" , "02E" , "02F" , "02G" , "02H" ,
+"02I" , "02J" , "02K" , "02L" , "02M" , "02N" , "02O" , "02P" ,
+"02Q" , "02R" , "02S" , "02T" , "02U" , "02V" , "02W" , "02X" ,
+"02Y" , "02Z" , "020" , "021" , "022" , "023" , "024" , "025" ,
+"026" , "027" , "028" , "029" , "03A" , "03B" , "03C" , "03D" ,
+"03E" , "03F" , "03G" , "03H" , "03I" , "03J" , "03K" , "03L" ,
+"03M" , "03N" , "03O" , "03P" , "03Q" , "03R" , "03S" , "03T" ,
+"03U" , "03V" , "03W" , "03X" , "03Y" , "03Z" , "030" , "031" ,
+"032" , "033" , "034" , "035" , "036" , "037" , "038" , "039" ,
+"04A" , "04B" , "04C" , "04D" , "04E" , "04F" , "04G" , "04H" ,
+"04I" , "04J" , "04K" , "04L" , "04M" , "04N" , "04O" , "04P" ,
+"04Q" , "04R" , "04S" , "04T" , "04U" , "04V" , "04W" , "04X" ,
+"04Y" , "04Z" , "040" , "041" , "042" , "043" , "044" , "045" ,
+"046" , "047" , "048" , "049" , "05A" , "05B" , "05C" , "05D" ,
+"05E" , "05F" , "05G" , "05H" , "05I" , "05J" , "05K" , "05L" ,
+"05M" , "05N" , "05O" , "05P" , "05Q" , "05R" , "05S" , "05T" ,
+"05U" , "05V" , "05W" , "05X" , "05Y" , "05Z" , "050" , "051" ,
+"052" , "053" , "054" , "055" , "056" , "057" , "058" , "059" ,
+"06A" , "06B" , "06C" , "06D" , "06E" , "06F" , "06G" , "06H" ,
+"06I" , "06J" , "06K" , "06L" , "06M" , "06N" , "06O" , "06P" ,
+"06Q" , "06R" , "06S" , "06T" , "06U" , "06V" , "06W" , "06X" ,
+"06Y" , "06Z" , "060" , "061" , "062" , "063" , "064" , "065" ,
+"066" , "067" , "068" , "069" , "07A" , "07B" , "07C" , "07D" ,
+"07E" , "07F" , "07G" , "07H" , "07I" , "07J" , "07K" , "07L" ,
+"07M" , "07N" , "07O" , "07P" , "07Q" , "07R" , "07S" , "07T" ,
+"07U" , "07V" , "07W" , "07X" , "07Y" , "07Z" , "070" , "071" ,
+"072" , "073" , "074" , "075" , "076" , "077" , "078" , "079" ,
+"08A" , "08B" , "08C" , "08D" , "08E" , "08F" , "08G" , "08H" ,
+"08I" , "08J" , "08K" , "08L" , "08M" , "08N" , "08O" , "08P" ,
+"08Q" , "08R" , "08S" , "08T" , "08U" , "08V" , "08W" , "08X" ,
+"08Y" , "08Z" , "080" , "081" , "082" , "083" , "084" , "085" ,
+"086" , "087" , "088" , "089" , "09A" , "09B" , "09C" , "09D" ,
+"09E" , "09F" , "09G" , "09H" , "09I" , "09J" , "09K" , "09L" ,
+"09M" , "09N" , "09O" , "09P" , "09Q" , "09R" , "09S" , "09T" ,
+"09U" , "09V" , "09W" , "09X" , "09Y" , "09Z" , "090" , "091" ,
+"092" , "093" , "094" , "095" , "096" , "097" , "098" , "099" ,
+"1AA" , "1AB" , "1AC" , "1AD" , "1AE" , "1AF" , "1AG" , "1AH" ,
+"1AI" , "1AJ" , "1AK" , "1AL" , "1AM" , "1AN" , "1AO" , "1AP" ,
+"1AQ" , "1AR" , "1AS" , "1AT" , "1AU" , "1AV" , "1AW" , "1AX" ,
+"1AY" , "1AZ" , "1A0" , "1A1" , "1A2" , "1A3" , "1A4" , "1A5" ,
+"1A6" , "1A7" , "1A8" , "1A9" , "1BA" , "1BB" , "1BC" , "1BD" ,
+"1BE" , "1BF" , "1BG" , "1BH" , "1BI" , "1BJ" , "1BK" , "1BL" ,
+"1BM" , "1BN" , "1BO" , "1BP" , "1BQ" , "1BR" , "1BS" , "1BT" ,
+"1BU" , "1BV" , "1BW" , "1BX" , "1BY" , "1BZ" , "1B0" , "1B1" ,
+"1B2" , "1B3" , "1B4" , "1B5" , "1B6" , "1B7" , "1B8" , "1B9" ,
+"1CA" , "1CB" , "1CC" , "1CD" , "1CE" , "1CF" , "1CG" , "1CH" ,
+"1CI" , "1CJ" , "1CK" , "1CL" , "1CM" , "1CN" , "1CO" , "1CP" ,
+"1CQ" , "1CR" , "1CS" , "1CT" , "1CU" , "1CV" , "1CW" , "1CX" ,
+"1CY" , "1CZ" , "1C0" , "1C1" , "1C2" , "1C3" , "1C4" , "1C5" ,
+"1C6" , "1C7" , "1C8" , "1C9" , "1DA" , "1DB" , "1DC" , "1DD" ,
+"1DE" , "1DF" , "1DG" , "1DH" , "1DI" , "1DJ" , "1DK" , "1DL" ,
+"1DM" , "1DN" , "1DO" , "1DP" , "1DQ" , "1DR" , "1DS" , "1DT" ,
+"1DU" , "1DV" , "1DW" , "1DX" , "1DY" , "1DZ" , "1D0" , "1D1" ,
+"1D2" , "1D3" , "1D4" , "1D5" , "1D6" , "1D7" , "1D8" , "1D9" ,
+"1EA" , "1EB" , "1EC" , "1ED" , "1EE" , "1EF" , "1EG" , "1EH" ,
+"1EI" , "1EJ" , "1EK" , "1EL" , "1EM" , "1EN" , "1EO" , "1EP" ,
+"1EQ" , "1ER" , "1ES" , "1ET" , "1EU" , "1EV" , "1EW" , "1EX" ,
+"1EY" , "1EZ" , "1E0" , "1E1" , "1E2" , "1E3" , "1E4" , "1E5" ,
+"1E6" , "1E7" , "1E8" , "1E9" , "1FA" , "1FB" , "1FC" , "1FD" ,
+"1FE" , "1FF" , "1FG" , "1FH" , "1FI" , "1FJ" , "1FK" , "1FL" ,
+"1FM" , "1FN" , "1FO" , "1FP" , "1FQ" , "1FR" , "1FS" , "1FT" ,
+"1FU" , "1FV" , "1FW" , "1FX" , "1FY" , "1FZ" , "1F0" , "1F1" ,
+"1F2" , "1F3" , "1F4" , "1F5" , "1F6" , "1F7" , "1F8" , "1F9" ,
+"1GA" , "1GB" , "1GC" , "1GD" , "1GE" , "1GF" , "1GG" , "1GH" ,
+"1GI" , "1GJ" , "1GK" , "1GL" , "1GM" , "1GN" , "1GO" , "1GP" ,
+"1GQ" , "1GR" , "1GS" , "1GT" , "1GU" , "1GV" , "1GW" , "1GX" ,
+"1GY" , "1GZ" , "1G0" , "1G1" , "1G2" , "1G3" , "1G4" , "1G5" ,
+"1G6" , "1G7" , "1G8" , "1G9" , "1HA" , "1HB" , "1HC" , "1HD" ,
+"1HE" , "1HF" , "1HG" , "1HH" , "1HI" , "1HJ" , "1HK" , "1HL" ,
+"1HM" , "1HN" , "1HO" , "1HP" , "1HQ" , "1HR" , "1HS" , "1HT" ,
+"1HU" , "1HV" , "1HW" , "1HX" , "1HY" , "1HZ" , "1H0" , "1H1" ,
+"1H2" , "1H3" , "1H4" , "1H5" , "1H6" , "1H7" , "1H8" , "1H9" ,
+"1IA" , "1IB" , "1IC" , "1ID" , "1IE" , "1IF" , "1IG" , "1IH" ,
+"1II" , "1IJ" , "1IK" , "1IL" , "1IM" , "1IN" , "1IO" , "1IP" ,
+"1IQ" , "1IR" , "1IS" , "1IT" , "1IU" , "1IV" , "1IW" , "1IX" ,
+"1IY" , "1IZ" , "1I0" , "1I1" , "1I2" , "1I3" , "1I4" , "1I5" ,
+"1I6" , "1I7" , "1I8" , "1I9" , "1JA" , "1JB" , "1JC" , "1JD" ,
+"1JE" , "1JF" , "1JG" , "1JH" , "1JI" , "1JJ" , "1JK" , "1JL" ,
+"1JM" , "1JN" , "1JO" , "1JP" , "1JQ" , "1JR" , "1JS" , "1JT" ,
+"1JU" , "1JV" , "1JW" , "1JX" , "1JY" , "1JZ" , "1J0" , "1J1" ,
+"1J2" , "1J3" , "1J4" , "1J5" , "1J6" , "1J7" , "1J8" , "1J9" ,
+"1KA" , "1KB" , "1KC" , "1KD" , "1KE" , "1KF" , "1KG" , "1KH" ,
+"1KI" , "1KJ" , "1KK" , "1KL" , "1KM" , "1KN" , "1KO" , "1KP" ,
+"1KQ" , "1KR" , "1KS" , "1KT" , "1KU" , "1KV" , "1KW" , "1KX" ,
+"1KY" , "1KZ" , "1K0" , "1K1" , "1K2" , "1K3" , "1K4" , "1K5" ,
+"1K6" , "1K7" , "1K8" , "1K9" , "1LA" , "1LB" , "1LC" , "1LD" ,
+"1LE" , "1LF" , "1LG" , "1LH" , "1LI" , "1LJ" , "1LK" , "1LL" ,
+"1LM" , "1LN" , "1LO" , "1LP" , "1LQ" , "1LR" , "1LS" , "1LT" ,
+"1LU" , "1LV" , "1LW" , "1LX" , "1LY" , "1LZ" , "1L0" , "1L1" ,
+"1L2" , "1L3" , "1L4" , "1L5" , "1L6" , "1L7" , "1L8" , "1L9" ,
+"1MA" , "1MB" , "1MC" , "1MD" , "1ME" , "1MF" , "1MG" , "1MH" ,
+"1MI" , "1MJ" , "1MK" , "1ML" , "1MM" , "1MN" , "1MO" , "1MP" ,
+"1MQ" , "1MR" , "1MS" , "1MT" , "1MU" , "1MV" , "1MW" , "1MX" ,
+"1MY" , "1MZ" , "1M0" , "1M1" , "1M2" , "1M3" , "1M4" , "1M5" ,
+"1M6" , "1M7" , "1M8" , "1M9" , "1NA" , "1NB" , "1NC" , "1ND" ,
+"1NE" , "1NF" , "1NG" , "1NH" , "1NI" , "1NJ" , "1NK" , "1NL" ,
+"1NM" , "1NN" , "1NO" , "1NP" , "1NQ" , "1NR" , "1NS" , "1NT" ,
+"1NU" , "1NV" , "1NW" , "1NX" , "1NY" , "1NZ" , "1N0" , "1N1" ,
+"1N2" , "1N3" , "1N4" , "1N5" , "1N6" , "1N7" , "1N8" , "1N9" ,
+"1OA" , "1OB" , "1OC" , "1OD" , "1OE" , "1OF" , "1OG" , "1OH" ,
+"1OI" , "1OJ" , "1OK" , "1OL" , "1OM" , "1ON" , "1OO" , "1OP" ,
+"1OQ" , "1OR" , "1OS" , "1OT" , "1OU" , "1OV" , "1OW" , "1OX" ,
+"1OY" , "1OZ" , "1O0" , "1O1" , "1O2" , "1O3" , "1O4" , "1O5" ,
+"1O6" , "1O7" , "1O8" , "1O9" , "1PA" , "1PB" , "1PC" , "1PD" ,
+"1PE" , "1PF" , "1PG" , "1PH" , "1PI" , "1PJ" , "1PK" , "1PL" ,
+"1PM" , "1PN" , "1PO" , "1PP" , "1PQ" , "1PR" , "1PS" , "1PT" ,
+"1PU" , "1PV" , "1PW" , "1PX" , "1PY" , "1PZ" , "1P0" , "1P1" ,
+"1P2" , "1P3" , "1P4" , "1P5" , "1P6" , "1P7" , "1P8" , "1P9" ,
+"1QA" , "1QB" , "1QC" , "1QD" , "1QE" , "1QF" , "1QG" , "1QH" ,
+"1QI" , "1QJ" , "1QK" , "1QL" , "1QM" , "1QN" , "1QO" , "1QP" ,
+"1QQ" , "1QR" , "1QS" , "1QT" , "1QU" , "1QV" , "1QW" , "1QX" ,
+"1QY" , "1QZ" , "1Q0" , "1Q1" , "1Q2" , "1Q3" , "1Q4" , "1Q5" ,
+"1Q6" , "1Q7" , "1Q8" , "1Q9" , "1RA" , "1RB" , "1RC" , "1RD" ,
+"1RE" , "1RF" , "1RG" , "1RH" , "1RI" , "1RJ" , "1RK" , "1RL" ,
+"1RM" , "1RN" , "1RO" , "1RP" , "1RQ" , "1RR" , "1RS" , "1RT" ,
+"1RU" , "1RV" , "1RW" , "1RX" , "1RY" , "1RZ" , "1R0" , "1R1" ,
+"1R2" , "1R3" , "1R4" , "1R5" , "1R6" , "1R7" , "1R8" , "1R9" ,
+"1SA" , "1SB" , "1SC" , "1SD" , "1SE" , "1SF" , "1SG" , "1SH" ,
+"1SI" , "1SJ" , "1SK" , "1SL" , "1SM" , "1SN" , "1SO" , "1SP" ,
+"1SQ" , "1SR" , "1SS" , "1ST" , "1SU" , "1SV" , "1SW" , "1SX" ,
+"1SY" , "1SZ" , "1S0" , "1S1" , "1S2" , "1S3" , "1S4" , "1S5" ,
+"1S6" , "1S7" , "1S8" , "1S9" , "1TA" , "1TB" , "1TC" , "1TD" ,
+"1TE" , "1TF" , "1TG" , "1TH" , "1TI" , "1TJ" , "1TK" , "1TL" ,
+"1TM" , "1TN" , "1TO" , "1TP" , "1TQ" , "1TR" , "1TS" , "1TT" ,
+"1TU" , "1TV" , "1TW" , "1TX" , "1TY" , "1TZ" , "1T0" , "1T1" ,
+"1T2" , "1T3" , "1T4" , "1T5" , "1T6" , "1T7" , "1T8" , "1T9" ,
+"1UA" , "1UB" , "1UC" , "1UD" , "1UE" , "1UF" , "1UG" , "1UH" ,
+"1UI" , "1UJ" , "1UK" , "1UL" , "1UM" , "1UN" , "1UO" , "1UP" ,
+"1UQ" , "1UR" , "1US" , "1UT" , "1UU" , "1UV" , "1UW" , "1UX" ,
+"1UY" , "1UZ" , "1U0" , "1U1" , "1U2" , "1U3" , "1U4" , "1U5" ,
+"1U6" , "1U7" , "1U8" , "1U9" , "1VA" , "1VB" , "1VC" , "1VD" ,
+"1VE" , "1VF" , "1VG" , "1VH" , "1VI" , "1VJ" , "1VK" , "1VL" ,
+"1VM" , "1VN" , "1VO" , "1VP" , "1VQ" , "1VR" , "1VS" , "1VT" ,
+"1VU" , "1VV" , "1VW" , "1VX" , "1VY" , "1VZ" , "1V0" , "1V1" ,
+"1V2" , "1V3" , "1V4" , "1V5" , "1V6" , "1V7" , "1V8" , "1V9" ,
+"1WA" , "1WB" , "1WC" , "1WD" , "1WE" , "1WF" , "1WG" , "1WH" ,
+"1WI" , "1WJ" , "1WK" , "1WL" , "1WM" , "1WN" , "1WO" , "1WP" ,
+"1WQ" , "1WR" , "1WS" , "1WT" , "1WU" , "1WV" , "1WW" , "1WX" ,
+"1WY" , "1WZ" , "1W0" , "1W1" , "1W2" , "1W3" , "1W4" , "1W5" ,
+"1W6" , "1W7" , "1W8" , "1W9" , "1XA" , "1XB" , "1XC" , "1XD" ,
+"1XE" , "1XF" , "1XG" , "1XH" , "1XI" , "1XJ" , "1XK" , "1XL" ,
+"1XM" , "1XN" , "1XO" , "1XP" , "1XQ" , "1XR" , "1XS" , "1XT" ,
+"1XU" , "1XV" , "1XW" , "1XX" , "1XY" , "1XZ" , "1X0" , "1X1" ,
+"1X2" , "1X3" , "1X4" , "1X5" , "1X6" , "1X7" , "1X8" , "1X9" ,
+"1YA" , "1YB" , "1YC" , "1YD" , "1YE" , "1YF" , "1YG" , "1YH" ,
+"1YI" , "1YJ" , "1YK" , "1YL" , "1YM" , "1YN" , "1YO" , "1YP" ,
+"1YQ" , "1YR" , "1YS" , "1YT" , "1YU" , "1YV" , "1YW" , "1YX" ,
+"1YY" , "1YZ" , "1Y0" , "1Y1" , "1Y2" , "1Y3" , "1Y4" , "1Y5" ,
+"1Y6" , "1Y7" , "1Y8" , "1Y9" , "1ZA" , "1ZB" , "1ZC" , "1ZD" ,
+"1ZE" , "1ZF" , "1ZG" , "1ZH" , "1ZI" , "1ZJ" , "1ZK" , "1ZL" ,
+"1ZM" , "1ZN" , "1ZO" , "1ZP" , "1ZQ" , "1ZR" , "1ZS" , "1ZT" ,
+"1ZU" , "1ZV" , "1ZW" , "1ZX" , "1ZY" , "1ZZ" , "1Z0" , "1Z1" ,
+"1Z2" , "1Z3" , "1Z4" , "1Z5" , "1Z6" , "1Z7" , "1Z8" , "1Z9" ,
+"10A" , "10B" , "10C" , "10D" , "10E" , "10F" , "10G" , "10H" ,
+"10I" , "10J" , "10K" , "10L" , "10M" , "10N" , "10O" , "10P" ,
+"10Q" , "10R" , "10S" , "10T" , "10U" , "10V" , "10W" , "10X" ,
+"10Y" , "10Z" , "100" , "101" , "102" , "103" , "104" , "105" ,
+"106" , "107" , "108" , "109" , "11A" , "11B" , "11C" , "11D" ,
+"11E" , "11F" , "11G" , "11H" , "11I" , "11J" , "11K" , "11L" ,
+"11M" , "11N" , "11O" , "11P" , "11Q" , "11R" , "11S" , "11T" ,
+"11U" , "11V" , "11W" , "11X" , "11Y" , "11Z" , "110" , "111" ,
+"112" , "113" , "114" , "115" , "116" , "117" , "118" , "119" ,
+"12A" , "12B" , "12C" , "12D" , "12E" , "12F" , "12G" , "12H" ,
+"12I" , "12J" , "12K" , "12L" , "12M" , "12N" , "12O" , "12P" ,
+"12Q" , "12R" , "12S" , "12T" , "12U" , "12V" , "12W" , "12X" ,
+"12Y" , "12Z" , "120" , "121" , "122" , "123" , "124" , "125" ,
+"126" , "127" , "128" , "129" , "13A" , "13B" , "13C" , "13D" ,
+"13E" , "13F" , "13G" , "13H" , "13I" , "13J" , "13K" , "13L" ,
+"13M" , "13N" , "13O" , "13P" , "13Q" , "13R" , "13S" , "13T" ,
+"13U" , "13V" , "13W" , "13X" , "13Y" , "13Z" , "130" , "131" ,
+"132" , "133" , "134" , "135" , "136" , "137" , "138" , "139" ,
+"14A" , "14B" , "14C" , "14D" , "14E" , "14F" , "14G" , "14H" ,
+"14I" , "14J" , "14K" , "14L" , "14M" , "14N" , "14O" , "14P" ,
+"14Q" , "14R" , "14S" , "14T" , "14U" , "14V" , "14W" , "14X" ,
+"14Y" , "14Z" , "140" , "141" , "142" , "143" , "144" , "145" ,
+"146" , "147" , "148" , "149" , "15A" , "15B" , "15C" , "15D" ,
+"15E" , "15F" , "15G" , "15H" , "15I" , "15J" , "15K" , "15L" ,
+"15M" , "15N" , "15O" , "15P" , "15Q" , "15R" , "15S" , "15T" ,
+"15U" , "15V" , "15W" , "15X" , "15Y" , "15Z" , "150" , "151" ,
+"152" , "153" , "154" , "155" , "156" , "157" , "158" , "159" ,
+"16A" , "16B" , "16C" , "16D" , "16E" , "16F" , "16G" , "16H" ,
+"16I" , "16J" , "16K" , "16L" , "16M" , "16N" , "16O" , "16P" ,
+"16Q" , "16R" , "16S" , "16T" , "16U" , "16V" , "16W" , "16X" ,
+"16Y" , "16Z" , "160" , "161" , "162" , "163" , "164" , "165" ,
+"166" , "167" , "168" , "169" , "17A" , "17B" , "17C" , "17D" ,
+"17E" , "17F" , "17G" , "17H" , "17I" , "17J" , "17K" , "17L" ,
+"17M" , "17N" , "17O" , "17P" , "17Q" , "17R" , "17S" , "17T" ,
+"17U" , "17V" , "17W" , "17X" , "17Y" , "17Z" , "170" , "171" ,
+"172" , "173" , "174" , "175" , "176" , "177" , "178" , "179" ,
+"18A" , "18B" , "18C" , "18D" , "18E" , "18F" , "18G" , "18H" ,
+"18I" , "18J" , "18K" , "18L" , "18M" , "18N" , "18O" , "18P" ,
+"18Q" , "18R" , "18S" , "18T" , "18U" , "18V" , "18W" , "18X" ,
+"18Y" , "18Z" , "180" , "181" , "182" , "183" , "184" , "185" ,
+"186" , "187" , "188" , "189" , "19A" , "19B" , "19C" , "19D" ,
+"19E" , "19F" , "19G" , "19H" , "19I" , "19J" , "19K" , "19L" ,
+"19M" , "19N" , "19O" , "19P" , "19Q" , "19R" , "19S" , "19T" ,
+"19U" , "19V" , "19W" , "19X" , "19Y" , "19Z" , "190" , "191" ,
+"192" , "193" , "194" , "195" , "196" , "197" , "198" , "199" ,
+"2AA" , "2AB" , "2AC" , "2AD" , "2AE" , "2AF" , "2AG" , "2AH" ,
+"2AI" , "2AJ" , "2AK" , "2AL" , "2AM" , "2AN" , "2AO" , "2AP" ,
+"2AQ" , "2AR" , "2AS" , "2AT" , "2AU" , "2AV" , "2AW" , "2AX" ,
+"2AY" , "2AZ" , "2A0" , "2A1" , "2A2" , "2A3" , "2A4" , "2A5" ,
+"2A6" , "2A7" , "2A8" , "2A9" , "2BA" , "2BB" , "2BC" , "2BD" ,
+"2BE" , "2BF" , "2BG" , "2BH" , "2BI" , "2BJ" , "2BK" , "2BL" ,
+"2BM" , "2BN" , "2BO" , "2BP" , "2BQ" , "2BR" , "2BS" , "2BT" ,
+"2BU" , "2BV" , "2BW" , "2BX" , "2BY" , "2BZ" , "2B0" , "2B1" ,
+"2B2" , "2B3" , "2B4" , "2B5" , "2B6" , "2B7" , "2B8" , "2B9" ,
+"2CA" , "2CB" , "2CC" , "2CD" , "2CE" , "2CF" , "2CG" , "2CH" ,
+"2CI" , "2CJ" , "2CK" , "2CL" , "2CM" , "2CN" , "2CO" , "2CP" ,
+"2CQ" , "2CR" , "2CS" , "2CT" , "2CU" , "2CV" , "2CW" , "2CX" ,
+"2CY" , "2CZ" , "2C0" , "2C1" , "2C2" , "2C3" , "2C4" , "2C5" ,
+"2C6" , "2C7" , "2C8" , "2C9" , "2DA" , "2DB" , "2DC" , "2DD" ,
+"2DE" , "2DF" , "2DG" , "2DH" , "2DI" , "2DJ" , "2DK" , "2DL" ,
+"2DM" , "2DN" , "2DO" , "2DP" , "2DQ" , "2DR" , "2DS" , "2DT" ,
+"2DU" , "2DV" , "2DW" , "2DX" , "2DY" , "2DZ" , "2D0" , "2D1" ,
+"2D2" , "2D3" , "2D4" , "2D5" , "2D6" , "2D7" , "2D8" , "2D9" ,
+"2EA" , "2EB" , "2EC" , "2ED" , "2EE" , "2EF" , "2EG" , "2EH" ,
+"2EI" , "2EJ" , "2EK" , "2EL" , "2EM" , "2EN" , "2EO" , "2EP" ,
+"2EQ" , "2ER" , "2ES" , "2ET" , "2EU" , "2EV" , "2EW" , "2EX" ,
+"2EY" , "2EZ" , "2E0" , "2E1" , "2E2" , "2E3" , "2E4" , "2E5" ,
+"2E6" , "2E7" , "2E8" , "2E9" , "2FA" , "2FB" , "2FC" , "2FD" ,
+"2FE" , "2FF" , "2FG" , "2FH" , "2FI" , "2FJ" , "2FK" , "2FL" ,
+"2FM" , "2FN" , "2FO" , "2FP" , "2FQ" , "2FR" , "2FS" , "2FT" ,
+"2FU" , "2FV" , "2FW" , "2FX" , "2FY" , "2FZ" , "2F0" , "2F1" ,
+"2F2" , "2F3" , "2F4" , "2F5" , "2F6" , "2F7" , "2F8" , "2F9" ,
+"2GA" , "2GB" , "2GC" , "2GD" , "2GE" , "2GF" , "2GG" , "2GH" ,
+"2GI" , "2GJ" , "2GK" , "2GL" , "2GM" , "2GN" , "2GO" , "2GP" ,
+"2GQ" , "2GR" , "2GS" , "2GT" , "2GU" , "2GV" , "2GW" , "2GX" ,
+"2GY" , "2GZ" , "2G0" , "2G1" , "2G2" , "2G3" , "2G4" , "2G5" ,
+"2G6" , "2G7" , "2G8" , "2G9" , "2HA" , "2HB" , "2HC" , "2HD" ,
+"2HE" , "2HF" , "2HG" , "2HH" , "2HI" , "2HJ" , "2HK" , "2HL" ,
+"2HM" , "2HN" , "2HO" , "2HP" , "2HQ" , "2HR" , "2HS" , "2HT" ,
+"2HU" , "2HV" , "2HW" , "2HX" , "2HY" , "2HZ" , "2H0" , "2H1" ,
+"2H2" , "2H3" , "2H4" , "2H5" , "2H6" , "2H7" , "2H8" , "2H9" ,
+"2IA" , "2IB" , "2IC" , "2ID" , "2IE" , "2IF" , "2IG" , "2IH" ,
+"2II" , "2IJ" , "2IK" , "2IL" , "2IM" , "2IN" , "2IO" , "2IP" ,
+"2IQ" , "2IR" , "2IS" , "2IT" , "2IU" , "2IV" , "2IW" , "2IX" ,
+"2IY" , "2IZ" , "2I0" , "2I1" , "2I2" , "2I3" , "2I4" , "2I5" ,
+"2I6" , "2I7" , "2I8" , "2I9" , "2JA" , "2JB" , "2JC" , "2JD" ,
+"2JE" , "2JF" , "2JG" , "2JH" , "2JI" , "2JJ" , "2JK" , "2JL" ,
+"2JM" , "2JN" , "2JO" , "2JP" , "2JQ" , "2JR" , "2JS" , "2JT" ,
+"2JU" , "2JV" , "2JW" , "2JX" , "2JY" , "2JZ" , "2J0" , "2J1" ,
+"2J2" , "2J3" , "2J4" , "2J5" , "2J6" , "2J7" , "2J8" , "2J9" ,
+"2KA" , "2KB" , "2KC" , "2KD" , "2KE" , "2KF" , "2KG" , "2KH" ,
+"2KI" , "2KJ" , "2KK" , "2KL" , "2KM" , "2KN" , "2KO" , "2KP" ,
+"2KQ" , "2KR" , "2KS" , "2KT" , "2KU" , "2KV" , "2KW" , "2KX" ,
+"2KY" , "2KZ" , "2K0" , "2K1" , "2K2" , "2K3" , "2K4" , "2K5" ,
+"2K6" , "2K7" , "2K8" , "2K9" , "2LA" , "2LB" , "2LC" , "2LD" ,
+"2LE" , "2LF" , "2LG" , "2LH" , "2LI" , "2LJ" , "2LK" , "2LL" ,
+"2LM" , "2LN" , "2LO" , "2LP" , "2LQ" , "2LR" , "2LS" , "2LT" ,
+"2LU" , "2LV" , "2LW" , "2LX" , "2LY" , "2LZ" , "2L0" , "2L1" ,
+"2L2" , "2L3" , "2L4" , "2L5" , "2L6" , "2L7" , "2L8" , "2L9" ,
+"2MA" , "2MB" , "2MC" , "2MD" , "2ME" , "2MF" , "2MG" , "2MH" ,
+"2MI" , "2MJ" , "2MK" , "2ML" , "2MM" , "2MN" , "2MO" , "2MP" ,
+"2MQ" , "2MR" , "2MS" , "2MT" , "2MU" , "2MV" , "2MW" , "2MX" ,
+"2MY" , "2MZ" , "2M0" , "2M1" , "2M2" , "2M3" , "2M4" , "2M5" ,
+"2M6" , "2M7" , "2M8" , "2M9" , "2NA" , "2NB" , "2NC" , "2ND" ,
+"2NE" , "2NF" , "2NG" , "2NH" , "2NI" , "2NJ" , "2NK" , "2NL" ,
+"2NM" , "2NN" , "2NO" , "2NP" , "2NQ" , "2NR" , "2NS" , "2NT" ,
+"2NU" , "2NV" , "2NW" , "2NX" , "2NY" , "2NZ" , "2N0" , "2N1" ,
+"2N2" , "2N3" , "2N4" , "2N5" , "2N6" , "2N7" , "2N8" , "2N9" ,
+"2OA" , "2OB" , "2OC" , "2OD" , "2OE" , "2OF" , "2OG" , "2OH" ,
+"2OI" , "2OJ" , "2OK" , "2OL" , "2OM" , "2ON" , "2OO" , "2OP" ,
+"2OQ" , "2OR" , "2OS" , "2OT" , "2OU" , "2OV" , "2OW" , "2OX" ,
+"2OY" , "2OZ" , "2O0" , "2O1" , "2O2" , "2O3" , "2O4" , "2O5" ,
+"2O6" , "2O7" , "2O8" , "2O9" , "2PA" , "2PB" , "2PC" , "2PD" ,
+"2PE" , "2PF" , "2PG" , "2PH" , "2PI" , "2PJ" , "2PK" , "2PL" ,
+"2PM" , "2PN" , "2PO" , "2PP" , "2PQ" , "2PR" , "2PS" , "2PT" ,
+"2PU" , "2PV" , "2PW" , "2PX" , "2PY" , "2PZ" , "2P0" , "2P1" ,
+"2P2" , "2P3" , "2P4" , "2P5" , "2P6" , "2P7" , "2P8" , "2P9" ,
+"2QA" , "2QB" , "2QC" , "2QD" , "2QE" , "2QF" , "2QG" , "2QH" ,
+"2QI" , "2QJ" , "2QK" , "2QL" , "2QM" , "2QN" , "2QO" , "2QP" ,
+"2QQ" , "2QR" , "2QS" , "2QT" , "2QU" , "2QV" , "2QW" , "2QX" ,
+"2QY" , "2QZ" , "2Q0" , "2Q1" , "2Q2" , "2Q3" , "2Q4" , "2Q5" ,
+"2Q6" , "2Q7" , "2Q8" , "2Q9" , "2RA" , "2RB" , "2RC" , "2RD" ,
+"2RE" , "2RF" , "2RG" , "2RH" , "2RI" , "2RJ" , "2RK" , "2RL" ,
+"2RM" , "2RN" , "2RO" , "2RP" , "2RQ" , "2RR" , "2RS" , "2RT" ,
+"2RU" , "2RV" , "2RW" , "2RX" , "2RY" , "2RZ" , "2R0" , "2R1" ,
+"2R2" , "2R3" , "2R4" , "2R5" , "2R6" , "2R7" , "2R8" , "2R9" ,
+"2SA" , "2SB" , "2SC" , "2SD" , "2SE" , "2SF" , "2SG" , "2SH" ,
+"2SI" , "2SJ" , "2SK" , "2SL" , "2SM" , "2SN" , "2SO" , "2SP" ,
+"2SQ" , "2SR" , "2SS" , "2ST" , "2SU" , "2SV" , "2SW" , "2SX" ,
+"2SY" , "2SZ" , "2S0" , "2S1" , "2S2" , "2S3" , "2S4" , "2S5" ,
+"2S6" , "2S7" , "2S8" , "2S9" , "2TA" , "2TB" , "2TC" , "2TD" ,
+"2TE" , "2TF" , "2TG" , "2TH" , "2TI" , "2TJ" , "2TK" , "2TL" ,
+"2TM" , "2TN" , "2TO" , "2TP" , "2TQ" , "2TR" , "2TS" , "2TT" ,
+"2TU" , "2TV" , "2TW" , "2TX" , "2TY" , "2TZ" , "2T0" , "2T1" ,
+"2T2" , "2T3" , "2T4" , "2T5" , "2T6" , "2T7" , "2T8" , "2T9" ,
+"2UA" , "2UB" , "2UC" , "2UD" , "2UE" , "2UF" , "2UG" , "2UH" ,
+"2UI" , "2UJ" , "2UK" , "2UL" , "2UM" , "2UN" , "2UO" , "2UP" ,
+"2UQ" , "2UR" , "2US" , "2UT" , "2UU" , "2UV" , "2UW" , "2UX" ,
+"2UY" , "2UZ" , "2U0" , "2U1" , "2U2" , "2U3" , "2U4" , "2U5" ,
+"2U6" , "2U7" , "2U8" , "2U9" , "2VA" , "2VB" , "2VC" , "2VD" ,
+"2VE" , "2VF" , "2VG" , "2VH" , "2VI" , "2VJ" , "2VK" , "2VL" ,
+"2VM" , "2VN" , "2VO" , "2VP" , "2VQ" , "2VR" , "2VS" , "2VT" ,
+"2VU" , "2VV" , "2VW" , "2VX" , "2VY" , "2VZ" , "2V0" , "2V1" ,
+"2V2" , "2V3" , "2V4" , "2V5" , "2V6" , "2V7" , "2V8" , "2V9" ,
+"2WA" , "2WB" , "2WC" , "2WD" , "2WE" , "2WF" , "2WG" , "2WH" ,
+"2WI" , "2WJ" , "2WK" , "2WL" , "2WM" , "2WN" , "2WO" , "2WP" ,
+"2WQ" , "2WR" , "2WS" , "2WT" , "2WU" , "2WV" , "2WW" , "2WX" ,
+"2WY" , "2WZ" , "2W0" , "2W1" , "2W2" , "2W3" , "2W4" , "2W5" ,
+"2W6" , "2W7" , "2W8" , "2W9" , "2XA" , "2XB" , "2XC" , "2XD" ,
+"2XE" , "2XF" , "2XG" , "2XH" , "2XI" , "2XJ" , "2XK" , "2XL" ,
+"2XM" , "2XN" , "2XO" , "2XP" , "2XQ" , "2XR" , "2XS" , "2XT" ,
+"2XU" , "2XV" , "2XW" , "2XX" , "2XY" , "2XZ" , "2X0" , "2X1" ,
+"2X2" , "2X3" , "2X4" , "2X5" , "2X6" , "2X7" , "2X8" , "2X9" ,
+"2YA" , "2YB" , "2YC" , "2YD" , "2YE" , "2YF" , "2YG" , "2YH" ,
+"2YI" , "2YJ" , "2YK" , "2YL" , "2YM" , "2YN" , "2YO" , "2YP" ,
+"2YQ" , "2YR" , "2YS" , "2YT" , "2YU" , "2YV" , "2YW" , "2YX" ,
+"2YY" , "2YZ" , "2Y0" , "2Y1" , "2Y2" , "2Y3" , "2Y4" , "2Y5" ,
+"2Y6" , "2Y7" , "2Y8" , "2Y9" , "2ZA" , "2ZB" , "2ZC" , "2ZD" ,
+"2ZE" , "2ZF" , "2ZG" , "2ZH" , "2ZI" , "2ZJ" , "2ZK" , "2ZL" ,
+"2ZM" , "2ZN" , "2ZO" , "2ZP" , "2ZQ" , "2ZR" , "2ZS" , "2ZT" ,
+"2ZU" , "2ZV" , "2ZW" , "2ZX" , "2ZY" , "2ZZ" , "2Z0" , "2Z1" ,
+"2Z2" , "2Z3" , "2Z4" , "2Z5" , "2Z6" , "2Z7" , "2Z8" , "2Z9" ,
+"20A" , "20B" , "20C" , "20D" , "20E" , "20F" , "20G" , "20H" ,
+"20I" , "20J" , "20K" , "20L" , "20M" , "20N" , "20O" , "20P" ,
+"20Q" , "20R" , "20S" , "20T" , "20U" , "20V" , "20W" , "20X" ,
+"20Y" , "20Z" , "200" , "201" , "202" , "203" , "204" , "205" ,
+"206" , "207" , "208" , "209" , "21A" , "21B" , "21C" , "21D" ,
+"21E" , "21F" , "21G" , "21H" , "21I" , "21J" , "21K" , "21L" ,
+"21M" , "21N" , "21O" , "21P" , "21Q" , "21R" , "21S" , "21T" ,
+"21U" , "21V" , "21W" , "21X" , "21Y" , "21Z" , "210" , "211" ,
+"212" , "213" , "214" , "215" , "216" , "217" , "218" , "219" ,
+"22A" , "22B" , "22C" , "22D" , "22E" , "22F" , "22G" , "22H" ,
+"22I" , "22J" , "22K" , "22L" , "22M" , "22N" , "22O" , "22P" ,
+"22Q" , "22R" , "22S" , "22T" , "22U" , "22V" , "22W" , "22X" ,
+"22Y" , "22Z" , "220" , "221" , "222" , "223" , "224" , "225" ,
+"226" , "227" , "228" , "229" , "23A" , "23B" , "23C" , "23D" ,
+"23E" , "23F" , "23G" , "23H" , "23I" , "23J" , "23K" , "23L" ,
+"23M" , "23N" , "23O" , "23P" , "23Q" , "23R" , "23S" , "23T" ,
+"23U" , "23V" , "23W" , "23X" , "23Y" , "23Z" , "230" , "231" ,
+"232" , "233" , "234" , "235" , "236" , "237" , "238" , "239" ,
+"24A" , "24B" , "24C" , "24D" , "24E" , "24F" , "24G" , "24H" ,
+"24I" , "24J" , "24K" , "24L" , "24M" , "24N" , "24O" , "24P" ,
+"24Q" , "24R" , "24S" , "24T" , "24U" , "24V" , "24W" , "24X" ,
+"24Y" , "24Z" , "240" , "241" , "242" , "243" , "244" , "245" ,
+"246" , "247" , "248" , "249" , "25A" , "25B" , "25C" , "25D" ,
+"25E" , "25F" , "25G" , "25H" , "25I" , "25J" , "25K" , "25L" ,
+"25M" , "25N" , "25O" , "25P" , "25Q" , "25R" , "25S" , "25T" ,
+"25U" , "25V" , "25W" , "25X" , "25Y" , "25Z" , "250" , "251" ,
+"252" , "253" , "254" , "255" , "256" , "257" , "258" , "259" ,
+"26A" , "26B" , "26C" , "26D" , "26E" , "26F" , "26G" , "26H" ,
+"26I" , "26J" , "26K" , "26L" , "26M" , "26N" , "26O" , "26P" ,
+"26Q" , "26R" , "26S" , "26T" , "26U" , "26V" , "26W" , "26X" ,
+"26Y" , "26Z" , "260" , "261" , "262" , "263" , "264" , "265" ,
+"266" , "267" , "268" , "269" , "27A" , "27B" , "27C" , "27D" ,
+"27E" , "27F" , "27G" , "27H" , "27I" , "27J" , "27K" , "27L" ,
+"27M" , "27N" , "27O" , "27P" , "27Q" , "27R" , "27S" , "27T" ,
+"27U" , "27V" , "27W" , "27X" , "27Y" , "27Z" , "270" , "271" ,
+"272" , "273" , "274" , "275" , "276" , "277" , "278" , "279" ,
+"28A" , "28B" , "28C" , "28D" , "28E" , "28F" , "28G" , "28H" ,
+"28I" , "28J" , "28K" , "28L" , "28M" , "28N" , "28O" , "28P" ,
+"28Q" , "28R" , "28S" , "28T" , "28U" , "28V" , "28W" , "28X" ,
+"28Y" , "28Z" , "280" , "281" , "282" , "283" , "284" , "285" ,
+"286" , "287" , "288" , "289" , "29A" , "29B" , "29C" , "29D" ,
+"29E" , "29F" , "29G" , "29H" , "29I" , "29J" , "29K" , "29L" ,
+"29M" , "29N" , "29O" , "29P" , "29Q" , "29R" , "29S" , "29T" ,
+"29U" , "29V" , "29W" , "29X" , "29Y" , "29Z" , "290" , "291" ,
+"292" , "293" , "294" , "295" , "296" , "297" , "298" , "299" ,
+"3AA" , "3AB" , "3AC" , "3AD" , "3AE" , "3AF" , "3AG" , "3AH" ,
+"3AI" , "3AJ" , "3AK" , "3AL" , "3AM" , "3AN" , "3AO" , "3AP" ,
+"3AQ" , "3AR" , "3AS" , "3AT" , "3AU" , "3AV" , "3AW" , "3AX" ,
+"3AY" , "3AZ" , "3A0" , "3A1" , "3A2" , "3A3" , "3A4" , "3A5" ,
+"3A6" , "3A7" , "3A8" , "3A9" , "3BA" , "3BB" , "3BC" , "3BD" ,
+"3BE" , "3BF" , "3BG" , "3BH" , "3BI" , "3BJ" , "3BK" , "3BL" ,
+"3BM" , "3BN" , "3BO" , "3BP" , "3BQ" , "3BR" , "3BS" , "3BT" ,
+"3BU" , "3BV" , "3BW" , "3BX" , "3BY" , "3BZ" , "3B0" , "3B1" ,
+"3B2" , "3B3" , "3B4" , "3B5" , "3B6" , "3B7" , "3B8" , "3B9" ,
+"3CA" , "3CB" , "3CC" , "3CD" , "3CE" , "3CF" , "3CG" , "3CH" ,
+"3CI" , "3CJ" , "3CK" , "3CL" , "3CM" , "3CN" , "3CO" , "3CP" ,
+"3CQ" , "3CR" , "3CS" , "3CT" , "3CU" , "3CV" , "3CW" , "3CX" ,
+"3CY" , "3CZ" , "3C0" , "3C1" , "3C2" , "3C3" , "3C4" , "3C5" ,
+"3C6" , "3C7" , "3C8" , "3C9" , "3DA" , "3DB" , "3DC" , "3DD" ,
+"3DE" , "3DF" , "3DG" , "3DH" , "3DI" , "3DJ" , "3DK" , "3DL" ,
+"3DM" , "3DN" , "3DO" , "3DP" , "3DQ" , "3DR" , "3DS" , "3DT" ,
+"3DU" , "3DV" , "3DW" , "3DX" , "3DY" , "3DZ" , "3D0" , "3D1" ,
+"3D2" , "3D3" , "3D4" , "3D5" , "3D6" , "3D7" , "3D8" , "3D9" ,
+"3EA" , "3EB" , "3EC" , "3ED" , "3EE" , "3EF" , "3EG" , "3EH" ,
+"3EI" , "3EJ" , "3EK" , "3EL" , "3EM" , "3EN" , "3EO" , "3EP" ,
+"3EQ" , "3ER" , "3ES" , "3ET" , "3EU" , "3EV" , "3EW" , "3EX" ,
+"3EY" , "3EZ" , "3E0" , "3E1" , "3E2" , "3E3" , "3E4" , "3E5" ,
+"3E6" , "3E7" , "3E8" , "3E9" , "3FA" , "3FB" , "3FC" , "3FD" ,
+"3FE" , "3FF" , "3FG" , "3FH" , "3FI" , "3FJ" , "3FK" , "3FL" ,
+"3FM" , "3FN" , "3FO" , "3FP" , "3FQ" , "3FR" , "3FS" , "3FT" ,
+"3FU" , "3FV" , "3FW" , "3FX" , "3FY" , "3FZ" , "3F0" , "3F1" ,
+"3F2" , "3F3" , "3F4" , "3F5" , "3F6" , "3F7" , "3F8" , "3F9" ,
+"3GA" , "3GB" , "3GC" , "3GD" , "3GE" , "3GF" , "3GG" , "3GH" ,
+"3GI" , "3GJ" , "3GK" , "3GL" , "3GM" , "3GN" , "3GO" , "3GP" ,
+"3GQ" , "3GR" , "3GS" , "3GT" , "3GU" , "3GV" , "3GW" , "3GX" ,
+"3GY" , "3GZ" , "3G0" , "3G1" , "3G2" , "3G3" , "3G4" , "3G5" ,
+"3G6" , "3G7" , "3G8" , "3G9" , "3HA" , "3HB" , "3HC" , "3HD" ,
+"3HE" , "3HF" , "3HG" , "3HH" , "3HI" , "3HJ" , "3HK" , "3HL" ,
+"3HM" , "3HN" , "3HO" , "3HP" , "3HQ" , "3HR" , "3HS" , "3HT" ,
+"3HU" , "3HV" , "3HW" , "3HX" , "3HY" , "3HZ" , "3H0" , "3H1" ,
+"3H2" , "3H3" , "3H4" , "3H5" , "3H6" , "3H7" , "3H8" , "3H9" ,
+"3IA" , "3IB" , "3IC" , "3ID" , "3IE" , "3IF" , "3IG" , "3IH" ,
+"3II" , "3IJ" , "3IK" , "3IL" , "3IM" , "3IN" , "3IO" , "3IP" ,
+"3IQ" , "3IR" , "3IS" , "3IT" , "3IU" , "3IV" , "3IW" , "3IX" ,
+"3IY" , "3IZ" , "3I0" , "3I1" , "3I2" , "3I3" , "3I4" , "3I5" ,
+"3I6" , "3I7" , "3I8" , "3I9" , "3JA" , "3JB" , "3JC" , "3JD" ,
+"3JE" , "3JF" , "3JG" , "3JH" , "3JI" , "3JJ" , "3JK" , "3JL" ,
+"3JM" , "3JN" , "3JO" , "3JP" , "3JQ" , "3JR" , "3JS" , "3JT" ,
+"3JU" , "3JV" , "3JW" , "3JX" , "3JY" , "3JZ" , "3J0" , "3J1" ,
+"3J2" , "3J3" , "3J4" , "3J5" , "3J6" , "3J7" , "3J8" , "3J9" ,
+"3KA" , "3KB" , "3KC" , "3KD" , "3KE" , "3KF" , "3KG" , "3KH" ,
+"3KI" , "3KJ" , "3KK" , "3KL" , "3KM" , "3KN" , "3KO" , "3KP" ,
+"3KQ" , "3KR" , "3KS" , "3KT" , "3KU" , "3KV" , "3KW" , "3KX" ,
+"3KY" , "3KZ" , "3K0" , "3K1" , "3K2" , "3K3" , "3K4" , "3K5" ,
+"3K6" , "3K7" , "3K8" , "3K9" , "3LA" , "3LB" , "3LC" , "3LD" ,
+"3LE" , "3LF" , "3LG" , "3LH" , "3LI" , "3LJ" , "3LK" , "3LL" ,
+"3LM" , "3LN" , "3LO" , "3LP" , "3LQ" , "3LR" , "3LS" , "3LT" ,
+"3LU" , "3LV" , "3LW" , "3LX" , "3LY" , "3LZ" , "3L0" , "3L1" ,
+"3L2" , "3L3" , "3L4" , "3L5" , "3L6" , "3L7" , "3L8" , "3L9" ,
+"3MA" , "3MB" , "3MC" , "3MD" , "3ME" , "3MF" , "3MG" , "3MH" ,
+"3MI" , "3MJ" , "3MK" , "3ML" , "3MM" , "3MN" , "3MO" , "3MP" ,
+"3MQ" , "3MR" , "3MS" , "3MT" , "3MU" , "3MV" , "3MW" , "3MX" ,
+"3MY" , "3MZ" , "3M0" , "3M1" , "3M2" , "3M3" , "3M4" , "3M5" ,
+"3M6" , "3M7" , "3M8" , "3M9" , "3NA" , "3NB" , "3NC" , "3ND" ,
+"3NE" , "3NF" , "3NG" , "3NH" , "3NI" , "3NJ" , "3NK" , "3NL" ,
+"3NM" , "3NN" , "3NO" , "3NP" , "3NQ" , "3NR" , "3NS" , "3NT" ,
+"3NU" , "3NV" , "3NW" , "3NX" , "3NY" , "3NZ" , "3N0" , "3N1" ,
+"3N2" , "3N3" , "3N4" , "3N5" , "3N6" , "3N7" , "3N8" , "3N9" ,
+"3OA" , "3OB" , "3OC" , "3OD" , "3OE" , "3OF" , "3OG" , "3OH" ,
+"3OI" , "3OJ" , "3OK" , "3OL" , "3OM" , "3ON" , "3OO" , "3OP" ,
+"3OQ" , "3OR" , "3OS" , "3OT" , "3OU" , "3OV" , "3OW" , "3OX" ,
+"3OY" , "3OZ" , "3O0" , "3O1" , "3O2" , "3O3" , "3O4" , "3O5" ,
+"3O6" , "3O7" , "3O8" , "3O9" , "3PA" , "3PB" , "3PC" , "3PD" ,
+"3PE" , "3PF" , "3PG" , "3PH" , "3PI" , "3PJ" , "3PK" , "3PL" ,
+"3PM" , "3PN" , "3PO" , "3PP" , "3PQ" , "3PR" , "3PS" , "3PT" ,
+"3PU" , "3PV" , "3PW" , "3PX" , "3PY" , "3PZ" , "3P0" , "3P1" ,
+"3P2" , "3P3" , "3P4" , "3P5" , "3P6" , "3P7" , "3P8" , "3P9" ,
+"3QA" , "3QB" , "3QC" , "3QD" , "3QE" , "3QF" , "3QG" , "3QH" ,
+"3QI" , "3QJ" , "3QK" , "3QL" , "3QM" , "3QN" , "3QO" , "3QP" ,
+"3QQ" , "3QR" , "3QS" , "3QT" , "3QU" , "3QV" , "3QW" , "3QX" ,
+"3QY" , "3QZ" , "3Q0" , "3Q1" , "3Q2" , "3Q3" , "3Q4" , "3Q5" ,
+"3Q6" , "3Q7" , "3Q8" , "3Q9" , "3RA" , "3RB" , "3RC" , "3RD" ,
+"3RE" , "3RF" , "3RG" , "3RH" , "3RI" , "3RJ" , "3RK" , "3RL" ,
+"3RM" , "3RN" , "3RO" , "3RP" , "3RQ" , "3RR" , "3RS" , "3RT" ,
+"3RU" , "3RV" , "3RW" , "3RX" , "3RY" , "3RZ" , "3R0" , "3R1" ,
+"3R2" , "3R3" , "3R4" , "3R5" , "3R6" , "3R7" , "3R8" , "3R9" ,
+"3SA" , "3SB" , "3SC" , "3SD" , "3SE" , "3SF" , "3SG" , "3SH" ,
+"3SI" , "3SJ" , "3SK" , "3SL" , "3SM" , "3SN" , "3SO" , "3SP" ,
+"3SQ" , "3SR" , "3SS" , "3ST" , "3SU" , "3SV" , "3SW" , "3SX" ,
+"3SY" , "3SZ" , "3S0" , "3S1" , "3S2" , "3S3" , "3S4" , "3S5" ,
+"3S6" , "3S7" , "3S8" , "3S9" , "3TA" , "3TB" , "3TC" , "3TD" ,
+"3TE" , "3TF" , "3TG" , "3TH" , "3TI" , "3TJ" , "3TK" , "3TL" ,
+"3TM" , "3TN" , "3TO" , "3TP" , "3TQ" , "3TR" , "3TS" , "3TT" ,
+"3TU" , "3TV" , "3TW" , "3TX" , "3TY" , "3TZ" , "3T0" , "3T1" ,
+"3T2" , "3T3" , "3T4" , "3T5" , "3T6" , "3T7" , "3T8" , "3T9" ,
+"3UA" , "3UB" , "3UC" , "3UD" , "3UE" , "3UF" , "3UG" , "3UH" ,
+"3UI" , "3UJ" , "3UK" , "3UL" , "3UM" , "3UN" , "3UO" , "3UP" ,
+"3UQ" , "3UR" , "3US" , "3UT" , "3UU" , "3UV" , "3UW" , "3UX" ,
+"3UY" , "3UZ" , "3U0" , "3U1" , "3U2" , "3U3" , "3U4" , "3U5" ,
+"3U6" , "3U7" , "3U8" , "3U9" , "3VA" , "3VB" , "3VC" , "3VD" ,
+"3VE" , "3VF" , "3VG" , "3VH" , "3VI" , "3VJ" , "3VK" , "3VL" ,
+"3VM" , "3VN" , "3VO" , "3VP" , "3VQ" , "3VR" , "3VS" , "3VT" ,
+"3VU" , "3VV" , "3VW" , "3VX" , "3VY" , "3VZ" , "3V0" , "3V1" ,
+"3V2" , "3V3" , "3V4" , "3V5" , "3V6" , "3V7" , "3V8" , "3V9" ,
+"3WA" , "3WB" , "3WC" , "3WD" , "3WE" , "3WF" , "3WG" , "3WH" ,
+"3WI" , "3WJ" , "3WK" , "3WL" , "3WM" , "3WN" , "3WO" , "3WP" ,
+"3WQ" , "3WR" , "3WS" , "3WT" , "3WU" , "3WV" , "3WW" , "3WX" ,
+"3WY" , "3WZ" , "3W0" , "3W1" , "3W2" , "3W3" , "3W4" , "3W5" ,
+"3W6" , "3W7" , "3W8" , "3W9" , "3XA" , "3XB" , "3XC" , "3XD" ,
+"3XE" , "3XF" , "3XG" , "3XH" , "3XI" , "3XJ" , "3XK" , "3XL" ,
+"3XM" , "3XN" , "3XO" , "3XP" , "3XQ" , "3XR" , "3XS" , "3XT" ,
+"3XU" , "3XV" , "3XW" , "3XX" , "3XY" , "3XZ" , "3X0" , "3X1" ,
+"3X2" , "3X3" , "3X4" , "3X5" , "3X6" , "3X7" , "3X8" , "3X9" ,
+"3YA" , "3YB" , "3YC" , "3YD" , "3YE" , "3YF" , "3YG" , "3YH" ,
+"3YI" , "3YJ" , "3YK" , "3YL" , "3YM" , "3YN" , "3YO" , "3YP" ,
+"3YQ" , "3YR" , "3YS" , "3YT" , "3YU" , "3YV" , "3YW" , "3YX" ,
+"3YY" , "3YZ" , "3Y0" , "3Y1" , "3Y2" , "3Y3" , "3Y4" , "3Y5" ,
+"3Y6" , "3Y7" , "3Y8" , "3Y9" , "3ZA" , "3ZB" , "3ZC" , "3ZD" ,
+"3ZE" , "3ZF" , "3ZG" , "3ZH" , "3ZI" , "3ZJ" , "3ZK" , "3ZL" ,
+"3ZM" , "3ZN" , "3ZO" , "3ZP" , "3ZQ" , "3ZR" , "3ZS" , "3ZT" ,
+"3ZU" , "3ZV" , "3ZW" , "3ZX" , "3ZY" , "3ZZ" , "3Z0" , "3Z1" ,
+"3Z2" , "3Z3" , "3Z4" , "3Z5" , "3Z6" , "3Z7" , "3Z8" , "3Z9" ,
+"30A" , "30B" , "30C" , "30D" , "30E" , "30F" , "30G" , "30H" ,
+"30I" , "30J" , "30K" , "30L" , "30M" , "30N" , "30O" , "30P" ,
+"30Q" , "30R" , "30S" , "30T" , "30U" , "30V" , "30W" , "30X" ,
+"30Y" , "30Z" , "300" , "301" , "302" , "303" , "304" , "305" ,
+"306" , "307" , "308" , "309" , "31A" , "31B" , "31C" , "31D" ,
+"31E" , "31F" , "31G" , "31H" , "31I" , "31J" , "31K" , "31L" ,
+"31M" , "31N" , "31O" , "31P" , "31Q" , "31R" , "31S" , "31T" ,
+"31U" , "31V" , "31W" , "31X" , "31Y" , "31Z" , "310" , "311" ,
+"312" , "313" , "314" , "315" , "316" , "317" , "318" , "319" ,
+"32A" , "32B" , "32C" , "32D" , "32E" , "32F" , "32G" , "32H" ,
+"32I" , "32J" , "32K" , "32L" , "32M" , "32N" , "32O" , "32P" ,
+"32Q" , "32R" , "32S" , "32T" , "32U" , "32V" , "32W" , "32X" ,
+"32Y" , "32Z" , "320" , "321" , "322" , "323" , "324" , "325" ,
+"326" , "327" , "328" , "329" , "33A" , "33B" , "33C" , "33D" ,
+"33E" , "33F" , "33G" , "33H" , "33I" , "33J" , "33K" , "33L" ,
+"33M" , "33N" , "33O" , "33P" , "33Q" , "33R" , "33S" , "33T" ,
+"33U" , "33V" , "33W" , "33X" , "33Y" , "33Z" , "330" , "331" ,
+"332" , "333" , "334" , "335" , "336" , "337" , "338" , "339" ,
+"34A" , "34B" , "34C" , "34D" , "34E" , "34F" , "34G" , "34H" ,
+"34I" , "34J" , "34K" , "34L" , "34M" , "34N" , "34O" , "34P" ,
+"34Q" , "34R" , "34S" , "34T" , "34U" , "34V" , "34W" , "34X" ,
+"34Y" , "34Z" , "340" , "341" , "342" , "343" , "344" , "345" ,
+"346" , "347" , "348" , "349" , "35A" , "35B" , "35C" , "35D" ,
+"35E" , "35F" , "35G" , "35H" , "35I" , "35J" , "35K" , "35L" ,
+"35M" , "35N" , "35O" , "35P" , "35Q" , "35R" , "35S" , "35T" ,
+"35U" , "35V" , "35W" , "35X" , "35Y" , "35Z" , "350" , "351" ,
+"352" , "353" , "354" , "355" , "356" , "357" , "358" , "359" ,
+"36A" , "36B" , "36C" , "36D" , "36E" , "36F" , "36G" , "36H" ,
+"36I" , "36J" , "36K" , "36L" , "36M" , "36N" , "36O" , "36P" ,
+"36Q" , "36R" , "36S" , "36T" , "36U" , "36V" , "36W" , "36X" ,
+"36Y" , "36Z" , "360" , "361" , "362" , "363" , "364" , "365" ,
+"366" , "367" , "368" , "369" , "37A" , "37B" , "37C" , "37D" ,
+"37E" , "37F" , "37G" , "37H" , "37I" , "37J" , "37K" , "37L" ,
+"37M" , "37N" , "37O" , "37P" , "37Q" , "37R" , "37S" , "37T" ,
+"37U" , "37V" , "37W" , "37X" , "37Y" , "37Z" , "370" , "371" ,
+"372" , "373" , "374" , "375" , "376" , "377" , "378" , "379" ,
+"38A" , "38B" , "38C" , "38D" , "38E" , "38F" , "38G" , "38H" ,
+"38I" , "38J" , "38K" , "38L" , "38M" , "38N" , "38O" , "38P" ,
+"38Q" , "38R" , "38S" , "38T" , "38U" , "38V" , "38W" , "38X" ,
+"38Y" , "38Z" , "380" , "381" , "382" , "383" , "384" , "385" ,
+"386" , "387" , "388" , "389" , "39A" , "39B" , "39C" , "39D" ,
+"39E" , "39F" , "39G" , "39H" , "39I" , "39J" , "39K" , "39L" ,
+"39M" , "39N" , "39O" , "39P" , "39Q" , "39R" , "39S" , "39T" ,
+"39U" , "39V" , "39W" , "39X" , "39Y" , "39Z" , "390" , "391" ,
+"392" , "393" , "394" , "395" , "396" , "397" , "398" , "399" ,
+"4AA" , "4AB" , "4AC" , "4AD" , "4AE" , "4AF" , "4AG" , "4AH" ,
+"4AI" , "4AJ" , "4AK" , "4AL" , "4AM" , "4AN" , "4AO" , "4AP" ,
+"4AQ" , "4AR" , "4AS" , "4AT" , "4AU" , "4AV" , "4AW" , "4AX" ,
+"4AY" , "4AZ" , "4A0" , "4A1" , "4A2" , "4A3" , "4A4" , "4A5" ,
+"4A6" , "4A7" , "4A8" , "4A9" , "4BA" , "4BB" , "4BC" , "4BD" ,
+"4BE" , "4BF" , "4BG" , "4BH" , "4BI" , "4BJ" , "4BK" , "4BL" ,
+"4BM" , "4BN" , "4BO" , "4BP" , "4BQ" , "4BR" , "4BS" , "4BT" ,
+"4BU" , "4BV" , "4BW" , "4BX" , "4BY" , "4BZ" , "4B0" , "4B1" ,
+"4B2" , "4B3" , "4B4" , "4B5" , "4B6" , "4B7" , "4B8" , "4B9" ,
+"4CA" , "4CB" , "4CC" , "4CD" , "4CE" , "4CF" , "4CG" , "4CH" ,
+"4CI" , "4CJ" , "4CK" , "4CL" , "4CM" , "4CN" , "4CO" , "4CP" ,
+"4CQ" , "4CR" , "4CS" , "4CT" , "4CU" , "4CV" , "4CW" , "4CX" ,
+"4CY" , "4CZ" , "4C0" , "4C1" , "4C2" , "4C3" , "4C4" , "4C5" ,
+"4C6" , "4C7" , "4C8" , "4C9" , "4DA" , "4DB" , "4DC" , "4DD" ,
+"4DE" , "4DF" , "4DG" , "4DH" , "4DI" , "4DJ" , "4DK" , "4DL" ,
+"4DM" , "4DN" , "4DO" , "4DP" , "4DQ" , "4DR" , "4DS" , "4DT" ,
+"4DU" , "4DV" , "4DW" , "4DX" , "4DY" , "4DZ" , "4D0" , "4D1" ,
+"4D2" , "4D3" , "4D4" , "4D5" , "4D6" , "4D7" , "4D8" , "4D9" ,
+"4EA" , "4EB" , "4EC" , "4ED" , "4EE" , "4EF" , "4EG" , "4EH" ,
+"4EI" , "4EJ" , "4EK" , "4EL" , "4EM" , "4EN" , "4EO" , "4EP" ,
+"4EQ" , "4ER" , "4ES" , "4ET" , "4EU" , "4EV" , "4EW" , "4EX" ,
+"4EY" , "4EZ" , "4E0" , "4E1" , "4E2" , "4E3" , "4E4" , "4E5" ,
+"4E6" , "4E7" , "4E8" , "4E9" , "4FA" , "4FB" , "4FC" , "4FD" ,
+"4FE" , "4FF" , "4FG" , "4FH" , "4FI" , "4FJ" , "4FK" , "4FL" ,
+"4FM" , "4FN" , "4FO" , "4FP" , "4FQ" , "4FR" , "4FS" , "4FT" ,
+"4FU" , "4FV" , "4FW" , "4FX" , "4FY" , "4FZ" , "4F0" , "4F1" ,
+"4F2" , "4F3" , "4F4" , "4F5" , "4F6" , "4F7" , "4F8" , "4F9" ,
+"4GA" , "4GB" , "4GC" , "4GD" , "4GE" , "4GF" , "4GG" , "4GH" ,
+"4GI" , "4GJ" , "4GK" , "4GL" , "4GM" , "4GN" , "4GO" , "4GP" ,
+"4GQ" , "4GR" , "4GS" , "4GT" , "4GU" , "4GV" , "4GW" , "4GX" ,
+"4GY" , "4GZ" , "4G0" , "4G1" , "4G2" , "4G3" , "4G4" , "4G5" ,
+"4G6" , "4G7" , "4G8" , "4G9" , "4HA" , "4HB" , "4HC" , "4HD" ,
+"4HE" , "4HF" , "4HG" , "4HH" , "4HI" , "4HJ" , "4HK" , "4HL" ,
+"4HM" , "4HN" , "4HO" , "4HP" , "4HQ" , "4HR" , "4HS" , "4HT" ,
+"4HU" , "4HV" , "4HW" , "4HX" , "4HY" , "4HZ" , "4H0" , "4H1" ,
+"4H2" , "4H3" , "4H4" , "4H5" , "4H6" , "4H7" , "4H8" , "4H9" ,
+"4IA" , "4IB" , "4IC" , "4ID" , "4IE" , "4IF" , "4IG" , "4IH" ,
+"4II" , "4IJ" , "4IK" , "4IL" , "4IM" , "4IN" , "4IO" , "4IP" ,
+"4IQ" , "4IR" , "4IS" , "4IT" , "4IU" , "4IV" , "4IW" , "4IX" ,
+"4IY" , "4IZ" , "4I0" , "4I1" , "4I2" , "4I3" , "4I4" , "4I5" ,
+"4I6" , "4I7" , "4I8" , "4I9" , "4JA" , "4JB" , "4JC" , "4JD" ,
+"4JE" , "4JF" , "4JG" , "4JH" , "4JI" , "4JJ" , "4JK" , "4JL" ,
+"4JM" , "4JN" , "4JO" , "4JP" , "4JQ" , "4JR" , "4JS" , "4JT" ,
+"4JU" , "4JV" , "4JW" , "4JX" , "4JY" , "4JZ" , "4J0" , "4J1" ,
+"4J2" , "4J3" , "4J4" , "4J5" , "4J6" , "4J7" , "4J8" , "4J9" ,
+"4KA" , "4KB" , "4KC" , "4KD" , "4KE" , "4KF" , "4KG" , "4KH" ,
+"4KI" , "4KJ" , "4KK" , "4KL" , "4KM" , "4KN" , "4KO" , "4KP" ,
+"4KQ" , "4KR" , "4KS" , "4KT" , "4KU" , "4KV" , "4KW" , "4KX" ,
+"4KY" , "4KZ" , "4K0" , "4K1" , "4K2" , "4K3" , "4K4" , "4K5" ,
+"4K6" , "4K7" , "4K8" , "4K9" , "4LA" , "4LB" , "4LC" , "4LD" ,
+"4LE" , "4LF" , "4LG" , "4LH" , "4LI" , "4LJ" , "4LK" , "4LL" ,
+"4LM" , "4LN" , "4LO" , "4LP" , "4LQ" , "4LR" , "4LS" , "4LT" ,
+"4LU" , "4LV" , "4LW" , "4LX" , "4LY" , "4LZ" , "4L0" , "4L1" ,
+"4L2" , "4L3" , "4L4" , "4L5" , "4L6" , "4L7" , "4L8" , "4L9" ,
+"4MA" , "4MB" , "4MC" , "4MD" , "4ME" , "4MF" , "4MG" , "4MH" ,
+"4MI" , "4MJ" , "4MK" , "4ML" , "4MM" , "4MN" , "4MO" , "4MP" ,
+"4MQ" , "4MR" , "4MS" , "4MT" , "4MU" , "4MV" , "4MW" , "4MX" ,
+"4MY" , "4MZ" , "4M0" , "4M1" , "4M2" , "4M3" , "4M4" , "4M5" ,
+"4M6" , "4M7" , "4M8" , "4M9" , "4NA" , "4NB" , "4NC" , "4ND" ,
+"4NE" , "4NF" , "4NG" , "4NH" , "4NI" , "4NJ" , "4NK" , "4NL" ,
+"4NM" , "4NN" , "4NO" , "4NP" , "4NQ" , "4NR" , "4NS" , "4NT" ,
+"4NU" , "4NV" , "4NW" , "4NX" , "4NY" , "4NZ" , "4N0" , "4N1" ,
+"4N2" , "4N3" , "4N4" , "4N5" , "4N6" , "4N7" , "4N8" , "4N9" ,
+"4OA" , "4OB" , "4OC" , "4OD" , "4OE" , "4OF" , "4OG" , "4OH" ,
+"4OI" , "4OJ" , "4OK" , "4OL" , "4OM" , "4ON" , "4OO" , "4OP" ,
+"4OQ" , "4OR" , "4OS" , "4OT" , "4OU" , "4OV" , "4OW" , "4OX" ,
+"4OY" , "4OZ" , "4O0" , "4O1" , "4O2" , "4O3" , "4O4" , "4O5" ,
+"4O6" , "4O7" , "4O8" , "4O9" , "4PA" , "4PB" , "4PC" , "4PD" ,
+"4PE" , "4PF" , "4PG" , "4PH" , "4PI" , "4PJ" , "4PK" , "4PL" ,
+"4PM" , "4PN" , "4PO" , "4PP" , "4PQ" , "4PR" , "4PS" , "4PT" ,
+"4PU" , "4PV" , "4PW" , "4PX" , "4PY" , "4PZ" , "4P0" , "4P1" ,
+"4P2" , "4P3" , "4P4" , "4P5" , "4P6" , "4P7" , "4P8" , "4P9" ,
+"4QA" , "4QB" , "4QC" , "4QD" , "4QE" , "4QF" , "4QG" , "4QH" ,
+"4QI" , "4QJ" , "4QK" , "4QL" , "4QM" , "4QN" , "4QO" , "4QP" ,
+"4QQ" , "4QR" , "4QS" , "4QT" , "4QU" , "4QV" , "4QW" , "4QX" ,
+"4QY" , "4QZ" , "4Q0" , "4Q1" , "4Q2" , "4Q3" , "4Q4" , "4Q5" ,
+"4Q6" , "4Q7" , "4Q8" , "4Q9" , "4RA" , "4RB" , "4RC" , "4RD" ,
+"4RE" , "4RF" , "4RG" , "4RH" , "4RI" , "4RJ" , "4RK" , "4RL" ,
+"4RM" , "4RN" , "4RO" , "4RP" , "4RQ" , "4RR" , "4RS" , "4RT" ,
+"4RU" , "4RV" , "4RW" , "4RX" , "4RY" , "4RZ" , "4R0" , "4R1" ,
+"4R2" , "4R3" , "4R4" , "4R5" , "4R6" , "4R7" , "4R8" , "4R9" ,
+"4SA" , "4SB" , "4SC" , "4SD" , "4SE" , "4SF" , "4SG" , "4SH" ,
+"4SI" , "4SJ" , "4SK" , "4SL" , "4SM" , "4SN" , "4SO" , "4SP" ,
+"4SQ" , "4SR" , "4SS" , "4ST" , "4SU" , "4SV" , "4SW" , "4SX" ,
+"4SY" , "4SZ" , "4S0" , "4S1" , "4S2" , "4S3" , "4S4" , "4S5" ,
+"4S6" , "4S7" , "4S8" , "4S9" , "4TA" , "4TB" , "4TC" , "4TD" ,
+"4TE" , "4TF" , "4TG" , "4TH" , "4TI" , "4TJ" , "4TK" , "4TL" ,
+"4TM" , "4TN" , "4TO" , "4TP" , "4TQ" , "4TR" , "4TS" , "4TT" ,
+"4TU" , "4TV" , "4TW" , "4TX" , "4TY" , "4TZ" , "4T0" , "4T1" ,
+"4T2" , "4T3" , "4T4" , "4T5" , "4T6" , "4T7" , "4T8" , "4T9" ,
+"4UA" , "4UB" , "4UC" , "4UD" , "4UE" , "4UF" , "4UG" , "4UH" ,
+"4UI" , "4UJ" , "4UK" , "4UL" , "4UM" , "4UN" , "4UO" , "4UP" ,
+"4UQ" , "4UR" , "4US" , "4UT" , "4UU" , "4UV" , "4UW" , "4UX" ,
+"4UY" , "4UZ" , "4U0" , "4U1" , "4U2" , "4U3" , "4U4" , "4U5" ,
+"4U6" , "4U7" , "4U8" , "4U9" , "4VA" , "4VB" , "4VC" , "4VD" ,
+"4VE" , "4VF" , "4VG" , "4VH" , "4VI" , "4VJ" , "4VK" , "4VL" ,
+"4VM" , "4VN" , "4VO" , "4VP" , "4VQ" , "4VR" , "4VS" , "4VT" ,
+"4VU" , "4VV" , "4VW" , "4VX" , "4VY" , "4VZ" , "4V0" , "4V1" ,
+"4V2" , "4V3" , "4V4" , "4V5" , "4V6" , "4V7" , "4V8" , "4V9" ,
+"4WA" , "4WB" , "4WC" , "4WD" , "4WE" , "4WF" , "4WG" , "4WH" ,
+"4WI" , "4WJ" , "4WK" , "4WL" , "4WM" , "4WN" , "4WO" , "4WP" ,
+"4WQ" , "4WR" , "4WS" , "4WT" , "4WU" , "4WV" , "4WW" , "4WX" ,
+"4WY" , "4WZ" , "4W0" , "4W1" , "4W2" , "4W3" , "4W4" , "4W5" ,
+"4W6" , "4W7" , "4W8" , "4W9" , "4XA" , "4XB" , "4XC" , "4XD" ,
+"4XE" , "4XF" , "4XG" , "4XH" , "4XI" , "4XJ" , "4XK" , "4XL" ,
+"4XM" , "4XN" , "4XO" , "4XP" , "4XQ" , "4XR" , "4XS" , "4XT" ,
+"4XU" , "4XV" , "4XW" , "4XX" , "4XY" , "4XZ" , "4X0" , "4X1" ,
+"4X2" , "4X3" , "4X4" , "4X5" , "4X6" , "4X7" , "4X8" , "4X9" ,
+"4YA" , "4YB" , "4YC" , "4YD" , "4YE" , "4YF" , "4YG" , "4YH" ,
+"4YI" , "4YJ" , "4YK" , "4YL" , "4YM" , "4YN" , "4YO" , "4YP" ,
+"4YQ" , "4YR" , "4YS" , "4YT" , "4YU" , "4YV" , "4YW" , "4YX" ,
+"4YY" , "4YZ" , "4Y0" , "4Y1" , "4Y2" , "4Y3" , "4Y4" , "4Y5" ,
+"4Y6" , "4Y7" , "4Y8" , "4Y9" , "4ZA" , "4ZB" , "4ZC" , "4ZD" ,
+"4ZE" , "4ZF" , "4ZG" , "4ZH" , "4ZI" , "4ZJ" , "4ZK" , "4ZL" ,
+"4ZM" , "4ZN" , "4ZO" , "4ZP" , "4ZQ" , "4ZR" , "4ZS" , "4ZT" ,
+"4ZU" , "4ZV" , "4ZW" , "4ZX" , "4ZY" , "4ZZ" , "4Z0" , "4Z1" ,
+"4Z2" , "4Z3" , "4Z4" , "4Z5" , "4Z6" , "4Z7" , "4Z8" , "4Z9" ,
+"40A" , "40B" , "40C" , "40D" , "40E" , "40F" , "40G" , "40H" ,
+"40I" , "40J" , "40K" , "40L" , "40M" , "40N" , "40O" , "40P" ,
+"40Q" , "40R" , "40S" , "40T" , "40U" , "40V" , "40W" , "40X" ,
+"40Y" , "40Z" , "400" , "401" , "402" , "403" , "404" , "405" ,
+"406" , "407" , "408" , "409" , "41A" , "41B" , "41C" , "41D" ,
+"41E" , "41F" , "41G" , "41H" , "41I" , "41J" , "41K" , "41L" ,
+"41M" , "41N" , "41O" , "41P" , "41Q" , "41R" , "41S" , "41T" ,
+"41U" , "41V" , "41W" , "41X" , "41Y" , "41Z" , "410" , "411" ,
+"412" , "413" , "414" , "415" , "416" , "417" , "418" , "419" ,
+"42A" , "42B" , "42C" , "42D" , "42E" , "42F" , "42G" , "42H" ,
+"42I" , "42J" , "42K" , "42L" , "42M" , "42N" , "42O" , "42P" ,
+"42Q" , "42R" , "42S" , "42T" , "42U" , "42V" , "42W" , "42X" ,
+"42Y" , "42Z" , "420" , "421" , "422" , "423" , "424" , "425" ,
+"426" , "427" , "428" , "429" , "43A" , "43B" , "43C" , "43D" ,
+"43E" , "43F" , "43G" , "43H" , "43I" , "43J" , "43K" , "43L" ,
+"43M" , "43N" , "43O" , "43P" , "43Q" , "43R" , "43S" , "43T" ,
+"43U" , "43V" , "43W" , "43X" , "43Y" , "43Z" , "430" , "431" ,
+"432" , "433" , "434" , "435" , "436" , "437" , "438" , "439" ,
+"44A" , "44B" , "44C" , "44D" , "44E" , "44F" , "44G" , "44H" ,
+"44I" , "44J" , "44K" , "44L" , "44M" , "44N" , "44O" , "44P" ,
+"44Q" , "44R" , "44S" , "44T" , "44U" , "44V" , "44W" , "44X" ,
+"44Y" , "44Z" , "440" , "441" , "442" , "443" , "444" , "445" ,
+"446" , "447" , "448" , "449" , "45A" , "45B" , "45C" , "45D" ,
+"45E" , "45F" , "45G" , "45H" , "45I" , "45J" , "45K" , "45L" ,
+"45M" , "45N" , "45O" , "45P" , "45Q" , "45R" , "45S" , "45T" ,
+"45U" , "45V" , "45W" , "45X" , "45Y" , "45Z" , "450" , "451" ,
+"452" , "453" , "454" , "455" , "456" , "457" , "458" , "459" ,
+"46A" , "46B" , "46C" , "46D" , "46E" , "46F" , "46G" , "46H" ,
+"46I" , "46J" , "46K" , "46L" , "46M" , "46N" , "46O" , "46P" ,
+"46Q" , "46R" , "46S" , "46T" , "46U" , "46V" , "46W" , "46X" ,
+"46Y" , "46Z" , "460" , "461" , "462" , "463" , "464" , "465" ,
+"466" , "467" , "468" , "469" , "47A" , "47B" , "47C" , "47D" ,
+"47E" , "47F" , "47G" , "47H" , "47I" , "47J" , "47K" , "47L" ,
+"47M" , "47N" , "47O" , "47P" , "47Q" , "47R" , "47S" , "47T" ,
+"47U" , "47V" , "47W" , "47X" , "47Y" , "47Z" , "470" , "471" ,
+"472" , "473" , "474" , "475" , "476" , "477" , "478" , "479" ,
+"48A" , "48B" , "48C" , "48D" , "48E" , "48F" , "48G" , "48H" ,
+"48I" , "48J" , "48K" , "48L" , "48M" , "48N" , "48O" , "48P" ,
+"48Q" , "48R" , "48S" , "48T" , "48U" , "48V" , "48W" , "48X" ,
+"48Y" , "48Z" , "480" , "481" , "482" , "483" , "484" , "485" ,
+"486" , "487" , "488" , "489" , "49A" , "49B" , "49C" , "49D" ,
+"49E" , "49F" , "49G" , "49H" , "49I" , "49J" , "49K" , "49L" ,
+"49M" , "49N" , "49O" , "49P" , "49Q" , "49R" , "49S" , "49T" ,
+"49U" , "49V" , "49W" , "49X" , "49Y" , "49Z" , "490" , "491" ,
+"492" , "493" , "494" , "495" , "496" , "497" , "498" , "499" ,
+"5AA" , "5AB" , "5AC" , "5AD" , "5AE" , "5AF" , "5AG" , "5AH" ,
+"5AI" , "5AJ" , "5AK" , "5AL" , "5AM" , "5AN" , "5AO" , "5AP" ,
+"5AQ" , "5AR" , "5AS" , "5AT" , "5AU" , "5AV" , "5AW" , "5AX" ,
+"5AY" , "5AZ" , "5A0" , "5A1" , "5A2" , "5A3" , "5A4" , "5A5" ,
+"5A6" , "5A7" , "5A8" , "5A9" , "5BA" , "5BB" , "5BC" , "5BD" ,
+"5BE" , "5BF" , "5BG" , "5BH" , "5BI" , "5BJ" , "5BK" , "5BL" ,
+"5BM" , "5BN" , "5BO" , "5BP" , "5BQ" , "5BR" , "5BS" , "5BT" ,
+"5BU" , "5BV" , "5BW" , "5BX" , "5BY" , "5BZ" , "5B0" , "5B1" ,
+"5B2" , "5B3" , "5B4" , "5B5" , "5B6" , "5B7" , "5B8" , "5B9" ,
+"5CA" , "5CB" , "5CC" , "5CD" , "5CE" , "5CF" , "5CG" , "5CH" ,
+"5CI" , "5CJ" , "5CK" , "5CL" , "5CM" , "5CN" , "5CO" , "5CP" ,
+"5CQ" , "5CR" , "5CS" , "5CT" , "5CU" , "5CV" , "5CW" , "5CX" ,
+"5CY" , "5CZ" , "5C0" , "5C1" , "5C2" , "5C3" , "5C4" , "5C5" ,
+"5C6" , "5C7" , "5C8" , "5C9" , "5DA" , "5DB" , "5DC" , "5DD" ,
+"5DE" , "5DF" , "5DG" , "5DH" , "5DI" , "5DJ" , "5DK" , "5DL" ,
+"5DM" , "5DN" , "5DO" , "5DP" , "5DQ" , "5DR" , "5DS" , "5DT" ,
+"5DU" , "5DV" , "5DW" , "5DX" , "5DY" , "5DZ" , "5D0" , "5D1" ,
+"5D2" , "5D3" , "5D4" , "5D5" , "5D6" , "5D7" , "5D8" , "5D9" ,
+"5EA" , "5EB" , "5EC" , "5ED" , "5EE" , "5EF" , "5EG" , "5EH" ,
+"5EI" , "5EJ" , "5EK" , "5EL" , "5EM" , "5EN" , "5EO" , "5EP" ,
+"5EQ" , "5ER" , "5ES" , "5ET" , "5EU" , "5EV" , "5EW" , "5EX" ,
+"5EY" , "5EZ" , "5E0" , "5E1" , "5E2" , "5E3" , "5E4" , "5E5" ,
+"5E6" , "5E7" , "5E8" , "5E9" , "5FA" , "5FB" , "5FC" , "5FD" ,
+"5FE" , "5FF" , "5FG" , "5FH" , "5FI" , "5FJ" , "5FK" , "5FL" ,
+"5FM" , "5FN" , "5FO" , "5FP" , "5FQ" , "5FR" , "5FS" , "5FT" ,
+"5FU" , "5FV" , "5FW" , "5FX" , "5FY" , "5FZ" , "5F0" , "5F1" ,
+"5F2" , "5F3" , "5F4" , "5F5" , "5F6" , "5F7" , "5F8" , "5F9" ,
+"5GA" , "5GB" , "5GC" , "5GD" , "5GE" , "5GF" , "5GG" , "5GH" ,
+"5GI" , "5GJ" , "5GK" , "5GL" , "5GM" , "5GN" , "5GO" , "5GP" ,
+"5GQ" , "5GR" , "5GS" , "5GT" , "5GU" , "5GV" , "5GW" , "5GX" ,
+"5GY" , "5GZ" , "5G0" , "5G1" , "5G2" , "5G3" , "5G4" , "5G5" ,
+"5G6" , "5G7" , "5G8" , "5G9" , "5HA" , "5HB" , "5HC" , "5HD" ,
+"5HE" , "5HF" , "5HG" , "5HH" , "5HI" , "5HJ" , "5HK" , "5HL" ,
+"5HM" , "5HN" , "5HO" , "5HP" , "5HQ" , "5HR" , "5HS" , "5HT" ,
+"5HU" , "5HV" , "5HW" , "5HX" , "5HY" , "5HZ" , "5H0" , "5H1" ,
+"5H2" , "5H3" , "5H4" , "5H5" , "5H6" , "5H7" , "5H8" , "5H9" ,
+"5IA" , "5IB" , "5IC" , "5ID" , "5IE" , "5IF" , "5IG" , "5IH" ,
+"5II" , "5IJ" , "5IK" , "5IL" , "5IM" , "5IN" , "5IO" , "5IP" ,
+"5IQ" , "5IR" , "5IS" , "5IT" , "5IU" , "5IV" , "5IW" , "5IX" ,
+"5IY" , "5IZ" , "5I0" , "5I1" , "5I2" , "5I3" , "5I4" , "5I5" ,
+"5I6" , "5I7" , "5I8" , "5I9" , "5JA" , "5JB" , "5JC" , "5JD" ,
+"5JE" , "5JF" , "5JG" , "5JH" , "5JI" , "5JJ" , "5JK" , "5JL" ,
+"5JM" , "5JN" , "5JO" , "5JP" , "5JQ" , "5JR" , "5JS" , "5JT" ,
+"5JU" , "5JV" , "5JW" , "5JX" , "5JY" , "5JZ" , "5J0" , "5J1" ,
+"5J2" , "5J3" , "5J4" , "5J5" , "5J6" , "5J7" , "5J8" , "5J9" ,
+"5KA" , "5KB" , "5KC" , "5KD" , "5KE" , "5KF" , "5KG" , "5KH" ,
+"5KI" , "5KJ" , "5KK" , "5KL" , "5KM" , "5KN" , "5KO" , "5KP" ,
+"5KQ" , "5KR" , "5KS" , "5KT" , "5KU" , "5KV" , "5KW" , "5KX" ,
+"5KY" , "5KZ" , "5K0" , "5K1" , "5K2" , "5K3" , "5K4" , "5K5" ,
+"5K6" , "5K7" , "5K8" , "5K9" , "5LA" , "5LB" , "5LC" , "5LD" ,
+"5LE" , "5LF" , "5LG" , "5LH" , "5LI" , "5LJ" , "5LK" , "5LL" ,
+"5LM" , "5LN" , "5LO" , "5LP" , "5LQ" , "5LR" , "5LS" , "5LT" ,
+"5LU" , "5LV" , "5LW" , "5LX" , "5LY" , "5LZ" , "5L0" , "5L1" ,
+"5L2" , "5L3" , "5L4" , "5L5" , "5L6" , "5L7" , "5L8" , "5L9" ,
+"5MA" , "5MB" , "5MC" , "5MD" , "5ME" , "5MF" , "5MG" , "5MH" ,
+"5MI" , "5MJ" , "5MK" , "5ML" , "5MM" , "5MN" , "5MO" , "5MP" ,
+"5MQ" , "5MR" , "5MS" , "5MT" , "5MU" , "5MV" , "5MW" , "5MX" ,
+"5MY" , "5MZ" , "5M0" , "5M1" , "5M2" , "5M3" , "5M4" , "5M5" ,
+"5M6" , "5M7" , "5M8" , "5M9" , "5NA" , "5NB" , "5NC" , "5ND" ,
+"5NE" , "5NF" , "5NG" , "5NH" , "5NI" , "5NJ" , "5NK" , "5NL" ,
+"5NM" , "5NN" , "5NO" , "5NP" , "5NQ" , "5NR" , "5NS" , "5NT" ,
+"5NU" , "5NV" , "5NW" , "5NX" , "5NY" , "5NZ" , "5N0" , "5N1" ,
+"5N2" , "5N3" , "5N4" , "5N5" , "5N6" , "5N7" , "5N8" , "5N9" ,
+"5OA" , "5OB" , "5OC" , "5OD" , "5OE" , "5OF" , "5OG" , "5OH" ,
+"5OI" , "5OJ" , "5OK" , "5OL" , "5OM" , "5ON" , "5OO" , "5OP" ,
+"5OQ" , "5OR" , "5OS" , "5OT" , "5OU" , "5OV" , "5OW" , "5OX" ,
+"5OY" , "5OZ" , "5O0" , "5O1" , "5O2" , "5O3" , "5O4" , "5O5" ,
+"5O6" , "5O7" , "5O8" , "5O9" , "5PA" , "5PB" , "5PC" , "5PD" ,
+"5PE" , "5PF" , "5PG" , "5PH" , "5PI" , "5PJ" , "5PK" , "5PL" ,
+"5PM" , "5PN" , "5PO" , "5PP" , "5PQ" , "5PR" , "5PS" , "5PT" ,
+"5PU" , "5PV" , "5PW" , "5PX" , "5PY" , "5PZ" , "5P0" , "5P1" ,
+"5P2" , "5P3" , "5P4" , "5P5" , "5P6" , "5P7" , "5P8" , "5P9" ,
+"5QA" , "5QB" , "5QC" , "5QD" , "5QE" , "5QF" , "5QG" , "5QH" ,
+"5QI" , "5QJ" , "5QK" , "5QL" , "5QM" , "5QN" , "5QO" , "5QP" ,
+"5QQ" , "5QR" , "5QS" , "5QT" , "5QU" , "5QV" , "5QW" , "5QX" ,
+"5QY" , "5QZ" , "5Q0" , "5Q1" , "5Q2" , "5Q3" , "5Q4" , "5Q5" ,
+"5Q6" , "5Q7" , "5Q8" , "5Q9" , "5RA" , "5RB" , "5RC" , "5RD" ,
+"5RE" , "5RF" , "5RG" , "5RH" , "5RI" , "5RJ" , "5RK" , "5RL" ,
+"5RM" , "5RN" , "5RO" , "5RP" , "5RQ" , "5RR" , "5RS" , "5RT" ,
+"5RU" , "5RV" , "5RW" , "5RX" , "5RY" , "5RZ" , "5R0" , "5R1" ,
+"5R2" , "5R3" , "5R4" , "5R5" , "5R6" , "5R7" , "5R8" , "5R9" ,
+"5SA" , "5SB" , "5SC" , "5SD" , "5SE" , "5SF" , "5SG" , "5SH" ,
+"5SI" , "5SJ" , "5SK" , "5SL" , "5SM" , "5SN" , "5SO" , "5SP" ,
+"5SQ" , "5SR" , "5SS" , "5ST" , "5SU" , "5SV" , "5SW" , "5SX" ,
+"5SY" , "5SZ" , "5S0" , "5S1" , "5S2" , "5S3" , "5S4" , "5S5" ,
+"5S6" , "5S7" , "5S8" , "5S9" , "5TA" , "5TB" , "5TC" , "5TD" ,
+"5TE" , "5TF" , "5TG" , "5TH" , "5TI" , "5TJ" , "5TK" , "5TL" ,
+"5TM" , "5TN" , "5TO" , "5TP" , "5TQ" , "5TR" , "5TS" , "5TT" ,
+"5TU" , "5TV" , "5TW" , "5TX" , "5TY" , "5TZ" , "5T0" , "5T1" ,
+"5T2" , "5T3" , "5T4" , "5T5" , "5T6" , "5T7" , "5T8" , "5T9" ,
+"5UA" , "5UB" , "5UC" , "5UD" , "5UE" , "5UF" , "5UG" , "5UH" ,
+"5UI" , "5UJ" , "5UK" , "5UL" , "5UM" , "5UN" , "5UO" , "5UP" ,
+"5UQ" , "5UR" , "5US" , "5UT" , "5UU" , "5UV" , "5UW" , "5UX" ,
+"5UY" , "5UZ" , "5U0" , "5U1" , "5U2" , "5U3" , "5U4" , "5U5" ,
+"5U6" , "5U7" , "5U8" , "5U9" , "5VA" , "5VB" , "5VC" , "5VD" ,
+"5VE" , "5VF" , "5VG" , "5VH" , "5VI" , "5VJ" , "5VK" , "5VL" ,
+"5VM" , "5VN" , "5VO" , "5VP" , "5VQ" , "5VR" , "5VS" , "5VT" ,
+"5VU" , "5VV" , "5VW" , "5VX" , "5VY" , "5VZ" , "5V0" , "5V1" ,
+"5V2" , "5V3" , "5V4" , "5V5" , "5V6" , "5V7" , "5V8" , "5V9" ,
+"5WA" , "5WB" , "5WC" , "5WD" , "5WE" , "5WF" , "5WG" , "5WH" ,
+"5WI" , "5WJ" , "5WK" , "5WL" , "5WM" , "5WN" , "5WO" , "5WP" ,
+"5WQ" , "5WR" , "5WS" , "5WT" , "5WU" , "5WV" , "5WW" , "5WX" ,
+"5WY" , "5WZ" , "5W0" , "5W1" , "5W2" , "5W3" , "5W4" , "5W5" ,
+"5W6" , "5W7" , "5W8" , "5W9" , "5XA" , "5XB" , "5XC" , "5XD" ,
+"5XE" , "5XF" , "5XG" , "5XH" , "5XI" , "5XJ" , "5XK" , "5XL" ,
+"5XM" , "5XN" , "5XO" , "5XP" , "5XQ" , "5XR" , "5XS" , "5XT" ,
+"5XU" , "5XV" , "5XW" , "5XX" , "5XY" , "5XZ" , "5X0" , "5X1" ,
+"5X2" , "5X3" , "5X4" , "5X5" , "5X6" , "5X7" , "5X8" , "5X9" ,
+"5YA" , "5YB" , "5YC" , "5YD" , "5YE" , "5YF" , "5YG" , "5YH" ,
+"5YI" , "5YJ" , "5YK" , "5YL" , "5YM" , "5YN" , "5YO" , "5YP" ,
+"5YQ" , "5YR" , "5YS" , "5YT" , "5YU" , "5YV" , "5YW" , "5YX" ,
+"5YY" , "5YZ" , "5Y0" , "5Y1" , "5Y2" , "5Y3" , "5Y4" , "5Y5" ,
+"5Y6" , "5Y7" , "5Y8" , "5Y9" , "5ZA" , "5ZB" , "5ZC" , "5ZD" ,
+"5ZE" , "5ZF" , "5ZG" , "5ZH" , "5ZI" , "5ZJ" , "5ZK" , "5ZL" ,
+"5ZM" , "5ZN" , "5ZO" , "5ZP" , "5ZQ" , "5ZR" , "5ZS" , "5ZT" ,
+"5ZU" , "5ZV" , "5ZW" , "5ZX" , "5ZY" , "5ZZ" , "5Z0" , "5Z1" ,
+"5Z2" , "5Z3" , "5Z4" , "5Z5" , "5Z6" , "5Z7" , "5Z8" , "5Z9" ,
+"50A" , "50B" , "50C" , "50D" , "50E" , "50F" , "50G" , "50H" ,
+"50I" , "50J" , "50K" , "50L" , "50M" , "50N" , "50O" , "50P" ,
+"50Q" , "50R" , "50S" , "50T" , "50U" , "50V" , "50W" , "50X" ,
+"50Y" , "50Z" , "500" , "501" , "502" , "503" , "504" , "505" ,
+"506" , "507" , "508" , "509" , "51A" , "51B" , "51C" , "51D" ,
+"51E" , "51F" , "51G" , "51H" , "51I" , "51J" , "51K" , "51L" ,
+"51M" , "51N" , "51O" , "51P" , "51Q" , "51R" , "51S" , "51T" ,
+"51U" , "51V" , "51W" , "51X" , "51Y" , "51Z" , "510" , "511" ,
+"512" , "513" , "514" , "515" , "516" , "517" , "518" , "519" ,
+"52A" , "52B" , "52C" , "52D" , "52E" , "52F" , "52G" , "52H" ,
+"52I" , "52J" , "52K" , "52L" , "52M" , "52N" , "52O" , "52P" ,
+"52Q" , "52R" , "52S" , "52T" , "52U" , "52V" , "52W" , "52X" ,
+"52Y" , "52Z" , "520" , "521" , "522" , "523" , "524" , "525" ,
+"526" , "527" , "528" , "529" , "53A" , "53B" , "53C" , "53D" ,
+"53E" , "53F" , "53G" , "53H" , "53I" , "53J" , "53K" , "53L" ,
+"53M" , "53N" , "53O" , "53P" , "53Q" , "53R" , "53S" , "53T" ,
+"53U" , "53V" , "53W" , "53X" , "53Y" , "53Z" , "530" , "531" ,
+"532" , "533" , "534" , "535" , "536" , "537" , "538" , "539" ,
+"54A" , "54B" , "54C" , "54D" , "54E" , "54F" , "54G" , "54H" ,
+"54I" , "54J" , "54K" , "54L" , "54M" , "54N" , "54O" , "54P" ,
+"54Q" , "54R" , "54S" , "54T" , "54U" , "54V" , "54W" , "54X" ,
+"54Y" , "54Z" , "540" , "541" , "542" , "543" , "544" , "545" ,
+"546" , "547" , "548" , "549" , "55A" , "55B" , "55C" , "55D" ,
+"55E" , "55F" , "55G" , "55H" , "55I" , "55J" , "55K" , "55L" ,
+"55M" , "55N" , "55O" , "55P" , "55Q" , "55R" , "55S" , "55T" ,
+"55U" , "55V" , "55W" , "55X" , "55Y" , "55Z" , "550" , "551" ,
+"552" , "553" , "554" , "555" , "556" , "557" , "558" , "559" ,
+"56A" , "56B" , "56C" , "56D" , "56E" , "56F" , "56G" , "56H" ,
+"56I" , "56J" , "56K" , "56L" , "56M" , "56N" , "56O" , "56P" ,
+"56Q" , "56R" , "56S" , "56T" , "56U" , "56V" , "56W" , "56X" ,
+"56Y" , "56Z" , "560" , "561" , "562" , "563" , "564" , "565" ,
+"566" , "567" , "568" , "569" , "57A" , "57B" , "57C" , "57D" ,
+"57E" , "57F" , "57G" , "57H" , "57I" , "57J" , "57K" , "57L" ,
+"57M" , "57N" , "57O" , "57P" , "57Q" , "57R" , "57S" , "57T" ,
+"57U" , "57V" , "57W" , "57X" , "57Y" , "57Z" , "570" , "571" ,
+"572" , "573" , "574" , "575" , "576" , "577" , "578" , "579" ,
+"58A" , "58B" , "58C" , "58D" , "58E" , "58F" , "58G" , "58H" ,
+"58I" , "58J" , "58K" , "58L" , "58M" , "58N" , "58O" , "58P" ,
+"58Q" , "58R" , "58S" , "58T" , "58U" , "58V" , "58W" , "58X" ,
+"58Y" , "58Z" , "580" , "581" , "582" , "583" , "584" , "585" ,
+"586" , "587" , "588" , "589" , "59A" , "59B" , "59C" , "59D" ,
+"59E" , "59F" , "59G" , "59H" , "59I" , "59J" , "59K" , "59L" ,
+"59M" , "59N" , "59O" , "59P" , "59Q" , "59R" , "59S" , "59T" ,
+"59U" , "59V" , "59W" , "59X" , "59Y" , "59Z" , "590" , "591" ,
+"592" , "593" , "594" , "595" , "596" , "597" , "598" , "599" ,
+"6AA" , "6AB" , "6AC" , "6AD" , "6AE" , "6AF" , "6AG" , "6AH" ,
+"6AI" , "6AJ" , "6AK" , "6AL" , "6AM" , "6AN" , "6AO" , "6AP" ,
+"6AQ" , "6AR" , "6AS" , "6AT" , "6AU" , "6AV" , "6AW" , "6AX" ,
+"6AY" , "6AZ" , "6A0" , "6A1" , "6A2" , "6A3" , "6A4" , "6A5" ,
+"6A6" , "6A7" , "6A8" , "6A9" , "6BA" , "6BB" , "6BC" , "6BD" ,
+"6BE" , "6BF" , "6BG" , "6BH" , "6BI" , "6BJ" , "6BK" , "6BL" ,
+"6BM" , "6BN" , "6BO" , "6BP" , "6BQ" , "6BR" , "6BS" , "6BT" ,
+"6BU" , "6BV" , "6BW" , "6BX" , "6BY" , "6BZ" , "6B0" , "6B1" ,
+"6B2" , "6B3" , "6B4" , "6B5" , "6B6" , "6B7" , "6B8" , "6B9" ,
+"6CA" , "6CB" , "6CC" , "6CD" , "6CE" , "6CF" , "6CG" , "6CH" ,
+"6CI" , "6CJ" , "6CK" , "6CL" , "6CM" , "6CN" , "6CO" , "6CP" ,
+"6CQ" , "6CR" , "6CS" , "6CT" , "6CU" , "6CV" , "6CW" , "6CX" ,
+"6CY" , "6CZ" , "6C0" , "6C1" , "6C2" , "6C3" , "6C4" , "6C5" ,
+"6C6" , "6C7" , "6C8" , "6C9" , "6DA" , "6DB" , "6DC" , "6DD" ,
+"6DE" , "6DF" , "6DG" , "6DH" , "6DI" , "6DJ" , "6DK" , "6DL" ,
+"6DM" , "6DN" , "6DO" , "6DP" , "6DQ" , "6DR" , "6DS" , "6DT" ,
+"6DU" , "6DV" , "6DW" , "6DX" , "6DY" , "6DZ" , "6D0" , "6D1" ,
+"6D2" , "6D3" , "6D4" , "6D5" , "6D6" , "6D7" , "6D8" , "6D9" ,
+"6EA" , "6EB" , "6EC" , "6ED" , "6EE" , "6EF" , "6EG" , "6EH" ,
+"6EI" , "6EJ" , "6EK" , "6EL" , "6EM" , "6EN" , "6EO" , "6EP" ,
+"6EQ" , "6ER" , "6ES" , "6ET" , "6EU" , "6EV" , "6EW" , "6EX" ,
+"6EY" , "6EZ" , "6E0" , "6E1" , "6E2" , "6E3" , "6E4" , "6E5" ,
+"6E6" , "6E7" , "6E8" , "6E9" , "6FA" , "6FB" , "6FC" , "6FD" ,
+"6FE" , "6FF" , "6FG" , "6FH" , "6FI" , "6FJ" , "6FK" , "6FL" ,
+"6FM" , "6FN" , "6FO" , "6FP" , "6FQ" , "6FR" , "6FS" , "6FT" ,
+"6FU" , "6FV" , "6FW" , "6FX" , "6FY" , "6FZ" , "6F0" , "6F1" ,
+"6F2" , "6F3" , "6F4" , "6F5" , "6F6" , "6F7" , "6F8" , "6F9" ,
+"6GA" , "6GB" , "6GC" , "6GD" , "6GE" , "6GF" , "6GG" , "6GH" ,
+"6GI" , "6GJ" , "6GK" , "6GL" , "6GM" , "6GN" , "6GO" , "6GP" ,
+"6GQ" , "6GR" , "6GS" , "6GT" , "6GU" , "6GV" , "6GW" , "6GX" ,
+"6GY" , "6GZ" , "6G0" , "6G1" , "6G2" , "6G3" , "6G4" , "6G5" ,
+"6G6" , "6G7" , "6G8" , "6G9" , "6HA" , "6HB" , "6HC" , "6HD" ,
+"6HE" , "6HF" , "6HG" , "6HH" , "6HI" , "6HJ" , "6HK" , "6HL" ,
+"6HM" , "6HN" , "6HO" , "6HP" , "6HQ" , "6HR" , "6HS" , "6HT" ,
+"6HU" , "6HV" , "6HW" , "6HX" , "6HY" , "6HZ" , "6H0" , "6H1" ,
+"6H2" , "6H3" , "6H4" , "6H5" , "6H6" , "6H7" , "6H8" , "6H9" ,
+"6IA" , "6IB" , "6IC" , "6ID" , "6IE" , "6IF" , "6IG" , "6IH" ,
+"6II" , "6IJ" , "6IK" , "6IL" , "6IM" , "6IN" , "6IO" , "6IP" ,
+"6IQ" , "6IR" , "6IS" , "6IT" , "6IU" , "6IV" , "6IW" , "6IX" ,
+"6IY" , "6IZ" , "6I0" , "6I1" , "6I2" , "6I3" , "6I4" , "6I5" ,
+"6I6" , "6I7" , "6I8" , "6I9" , "6JA" , "6JB" , "6JC" , "6JD" ,
+"6JE" , "6JF" , "6JG" , "6JH" , "6JI" , "6JJ" , "6JK" , "6JL" ,
+"6JM" , "6JN" , "6JO" , "6JP" , "6JQ" , "6JR" , "6JS" , "6JT" ,
+"6JU" , "6JV" , "6JW" , "6JX" , "6JY" , "6JZ" , "6J0" , "6J1" ,
+"6J2" , "6J3" , "6J4" , "6J5" , "6J6" , "6J7" , "6J8" , "6J9" ,
+"6KA" , "6KB" , "6KC" , "6KD" , "6KE" , "6KF" , "6KG" , "6KH" ,
+"6KI" , "6KJ" , "6KK" , "6KL" , "6KM" , "6KN" , "6KO" , "6KP" ,
+"6KQ" , "6KR" , "6KS" , "6KT" , "6KU" , "6KV" , "6KW" , "6KX" ,
+"6KY" , "6KZ" , "6K0" , "6K1" , "6K2" , "6K3" , "6K4" , "6K5" ,
+"6K6" , "6K7" , "6K8" , "6K9" , "6LA" , "6LB" , "6LC" , "6LD" ,
+"6LE" , "6LF" , "6LG" , "6LH" , "6LI" , "6LJ" , "6LK" , "6LL" ,
+"6LM" , "6LN" , "6LO" , "6LP" , "6LQ" , "6LR" , "6LS" , "6LT" ,
+"6LU" , "6LV" , "6LW" , "6LX" , "6LY" , "6LZ" , "6L0" , "6L1" ,
+"6L2" , "6L3" , "6L4" , "6L5" , "6L6" , "6L7" , "6L8" , "6L9" ,
+"6MA" , "6MB" , "6MC" , "6MD" , "6ME" , "6MF" , "6MG" , "6MH" ,
+"6MI" , "6MJ" , "6MK" , "6ML" , "6MM" , "6MN" , "6MO" , "6MP" ,
+"6MQ" , "6MR" , "6MS" , "6MT" , "6MU" , "6MV" , "6MW" , "6MX" ,
+"6MY" , "6MZ" , "6M0" , "6M1" , "6M2" , "6M3" , "6M4" , "6M5" ,
+"6M6" , "6M7" , "6M8" , "6M9" , "6NA" , "6NB" , "6NC" , "6ND" ,
+"6NE" , "6NF" , "6NG" , "6NH" , "6NI" , "6NJ" , "6NK" , "6NL" ,
+"6NM" , "6NN" , "6NO" , "6NP" , "6NQ" , "6NR" , "6NS" , "6NT" ,
+"6NU" , "6NV" , "6NW" , "6NX" , "6NY" , "6NZ" , "6N0" , "6N1" ,
+"6N2" , "6N3" , "6N4" , "6N5" , "6N6" , "6N7" , "6N8" , "6N9" ,
+"6OA" , "6OB" , "6OC" , "6OD" , "6OE" , "6OF" , "6OG" , "6OH" ,
+"6OI" , "6OJ" , "6OK" , "6OL" , "6OM" , "6ON" , "6OO" , "6OP" ,
+"6OQ" , "6OR" , "6OS" , "6OT" , "6OU" , "6OV" , "6OW" , "6OX" ,
+"6OY" , "6OZ" , "6O0" , "6O1" , "6O2" , "6O3" , "6O4" , "6O5" ,
+"6O6" , "6O7" , "6O8" , "6O9" , "6PA" , "6PB" , "6PC" , "6PD" ,
+"6PE" , "6PF" , "6PG" , "6PH" , "6PI" , "6PJ" , "6PK" , "6PL" ,
+"6PM" , "6PN" , "6PO" , "6PP" , "6PQ" , "6PR" , "6PS" , "6PT" ,
+"6PU" , "6PV" , "6PW" , "6PX" , "6PY" , "6PZ" , "6P0" , "6P1" ,
+"6P2" , "6P3" , "6P4" , "6P5" , "6P6" , "6P7" , "6P8" , "6P9" ,
+"6QA" , "6QB" , "6QC" , "6QD" , "6QE" , "6QF" , "6QG" , "6QH" ,
+"6QI" , "6QJ" , "6QK" , "6QL" , "6QM" , "6QN" , "6QO" , "6QP" ,
+"6QQ" , "6QR" , "6QS" , "6QT" , "6QU" , "6QV" , "6QW" , "6QX" ,
+"6QY" , "6QZ" , "6Q0" , "6Q1" , "6Q2" , "6Q3" , "6Q4" , "6Q5" ,
+"6Q6" , "6Q7" , "6Q8" , "6Q9" , "6RA" , "6RB" , "6RC" , "6RD" ,
+"6RE" , "6RF" , "6RG" , "6RH" , "6RI" , "6RJ" , "6RK" , "6RL" ,
+"6RM" , "6RN" , "6RO" , "6RP" , "6RQ" , "6RR" , "6RS" , "6RT" ,
+"6RU" , "6RV" , "6RW" , "6RX" , "6RY" , "6RZ" , "6R0" , "6R1" ,
+"6R2" , "6R3" , "6R4" , "6R5" , "6R6" , "6R7" , "6R8" , "6R9" ,
+"6SA" , "6SB" , "6SC" , "6SD" , "6SE" , "6SF" , "6SG" , "6SH" ,
+"6SI" , "6SJ" , "6SK" , "6SL" , "6SM" , "6SN" , "6SO" , "6SP" ,
+"6SQ" , "6SR" , "6SS" , "6ST" , "6SU" , "6SV" , "6SW" , "6SX" ,
+"6SY" , "6SZ" , "6S0" , "6S1" , "6S2" , "6S3" , "6S4" , "6S5" ,
+"6S6" , "6S7" , "6S8" , "6S9" , "6TA" , "6TB" , "6TC" , "6TD" ,
+"6TE" , "6TF" , "6TG" , "6TH" , "6TI" , "6TJ" , "6TK" , "6TL" ,
+"6TM" , "6TN" , "6TO" , "6TP" , "6TQ" , "6TR" , "6TS" , "6TT" ,
+"6TU" , "6TV" , "6TW" , "6TX" , "6TY" , "6TZ" , "6T0" , "6T1" ,
+"6T2" , "6T3" , "6T4" , "6T5" , "6T6" , "6T7" , "6T8" , "6T9" ,
+"6UA" , "6UB" , "6UC" , "6UD" , "6UE" , "6UF" , "6UG" , "6UH" ,
+"6UI" , "6UJ" , "6UK" , "6UL" , "6UM" , "6UN" , "6UO" , "6UP" ,
+"6UQ" , "6UR" , "6US" , "6UT" , "6UU" , "6UV" , "6UW" , "6UX" ,
+"6UY" , "6UZ" , "6U0" , "6U1" , "6U2" , "6U3" , "6U4" , "6U5" ,
+"6U6" , "6U7" , "6U8" , "6U9" , "6VA" , "6VB" , "6VC" , "6VD" ,
+"6VE" , "6VF" , "6VG" , "6VH" , "6VI" , "6VJ" , "6VK" , "6VL" ,
+"6VM" , "6VN" , "6VO" , "6VP" , "6VQ" , "6VR" , "6VS" , "6VT" ,
+"6VU" , "6VV" , "6VW" , "6VX" , "6VY" , "6VZ" , "6V0" , "6V1" ,
+"6V2" , "6V3" , "6V4" , "6V5" , "6V6" , "6V7" , "6V8" , "6V9" ,
+"6WA" , "6WB" , "6WC" , "6WD" , "6WE" , "6WF" , "6WG" , "6WH" ,
+"6WI" , "6WJ" , "6WK" , "6WL" , "6WM" , "6WN" , "6WO" , "6WP" ,
+"6WQ" , "6WR" , "6WS" , "6WT" , "6WU" , "6WV" , "6WW" , "6WX" ,
+"6WY" , "6WZ" , "6W0" , "6W1" , "6W2" , "6W3" , "6W4" , "6W5" ,
+"6W6" , "6W7" , "6W8" , "6W9" , "6XA" , "6XB" , "6XC" , "6XD" ,
+"6XE" , "6XF" , "6XG" , "6XH" , "6XI" , "6XJ" , "6XK" , "6XL" ,
+"6XM" , "6XN" , "6XO" , "6XP" , "6XQ" , "6XR" , "6XS" , "6XT" ,
+"6XU" , "6XV" , "6XW" , "6XX" , "6XY" , "6XZ" , "6X0" , "6X1" ,
+"6X2" , "6X3" , "6X4" , "6X5" , "6X6" , "6X7" , "6X8" , "6X9" ,
+"6YA" , "6YB" , "6YC" , "6YD" , "6YE" , "6YF" , "6YG" , "6YH" ,
+"6YI" , "6YJ" , "6YK" , "6YL" , "6YM" , "6YN" , "6YO" , "6YP" ,
+"6YQ" , "6YR" , "6YS" , "6YT" , "6YU" , "6YV" , "6YW" , "6YX" ,
+"6YY" , "6YZ" , "6Y0" , "6Y1" , "6Y2" , "6Y3" , "6Y4" , "6Y5" ,
+"6Y6" , "6Y7" , "6Y8" , "6Y9" , "6ZA" , "6ZB" , "6ZC" , "6ZD" ,
+"6ZE" , "6ZF" , "6ZG" , "6ZH" , "6ZI" , "6ZJ" , "6ZK" , "6ZL" ,
+"6ZM" , "6ZN" , "6ZO" , "6ZP" , "6ZQ" , "6ZR" , "6ZS" , "6ZT" ,
+"6ZU" , "6ZV" , "6ZW" , "6ZX" , "6ZY" , "6ZZ" , "6Z0" , "6Z1" ,
+"6Z2" , "6Z3" , "6Z4" , "6Z5" , "6Z6" , "6Z7" , "6Z8" , "6Z9" ,
+"60A" , "60B" , "60C" , "60D" , "60E" , "60F" , "60G" , "60H" ,
+"60I" , "60J" , "60K" , "60L" , "60M" , "60N" , "60O" , "60P" ,
+"60Q" , "60R" , "60S" , "60T" , "60U" , "60V" , "60W" , "60X" ,
+"60Y" , "60Z" , "600" , "601" , "602" , "603" , "604" , "605" ,
+"606" , "607" , "608" , "609" , "61A" , "61B" , "61C" , "61D" ,
+"61E" , "61F" , "61G" , "61H" , "61I" , "61J" , "61K" , "61L" ,
+"61M" , "61N" , "61O" , "61P" , "61Q" , "61R" , "61S" , "61T" ,
+"61U" , "61V" , "61W" , "61X" , "61Y" , "61Z" , "610" , "611" ,
+"612" , "613" , "614" , "615" , "616" , "617" , "618" , "619" ,
+"62A" , "62B" , "62C" , "62D" , "62E" , "62F" , "62G" , "62H" ,
+"62I" , "62J" , "62K" , "62L" , "62M" , "62N" , "62O" , "62P" ,
+"62Q" , "62R" , "62S" , "62T" , "62U" , "62V" , "62W" , "62X" ,
+"62Y" , "62Z" , "620" , "621" , "622" , "623" , "624" , "625" ,
+"626" , "627" , "628" , "629" , "63A" , "63B" , "63C" , "63D" ,
+"63E" , "63F" , "63G" , "63H" , "63I" , "63J" , "63K" , "63L" ,
+"63M" , "63N" , "63O" , "63P" , "63Q" , "63R" , "63S" , "63T" ,
+"63U" , "63V" , "63W" , "63X" , "63Y" , "63Z" , "630" , "631" ,
+"632" , "633" , "634" , "635" , "636" , "637" , "638" , "639" ,
+"64A" , "64B" , "64C" , "64D" , "64E" , "64F" , "64G" , "64H" ,
+"64I" , "64J" , "64K" , "64L" , "64M" , "64N" , "64O" , "64P" ,
+"64Q" , "64R" , "64S" , "64T" , "64U" , "64V" , "64W" , "64X" ,
+"64Y" , "64Z" , "640" , "641" , "642" , "643" , "644" , "645" ,
+"646" , "647" , "648" , "649" , "65A" , "65B" , "65C" , "65D" ,
+"65E" , "65F" , "65G" , "65H" , "65I" , "65J" , "65K" , "65L" ,
+"65M" , "65N" , "65O" , "65P" , "65Q" , "65R" , "65S" , "65T" ,
+"65U" , "65V" , "65W" , "65X" , "65Y" , "65Z" , "650" , "651" ,
+"652" , "653" , "654" , "655" , "656" , "657" , "658" , "659" ,
+"66A" , "66B" , "66C" , "66D" , "66E" , "66F" , "66G" , "66H" ,
+"66I" , "66J" , "66K" , "66L" , "66M" , "66N" , "66O" , "66P" ,
+"66Q" , "66R" , "66S" , "66T" , "66U" , "66V" , "66W" , "66X" ,
+"66Y" , "66Z" , "660" , "661" , "662" , "663" , "664" , "665" ,
+"666" , "667" , "668" , "669" , "67A" , "67B" , "67C" , "67D" ,
+"67E" , "67F" , "67G" , "67H" , "67I" , "67J" , "67K" , "67L" ,
+"67M" , "67N" , "67O" , "67P" , "67Q" , "67R" , "67S" , "67T" ,
+"67U" , "67V" , "67W" , "67X" , "67Y" , "67Z" , "670" , "671" ,
+"672" , "673" , "674" , "675" , "676" , "677" , "678" , "679" ,
+"68A" , "68B" , "68C" , "68D" , "68E" , "68F" , "68G" , "68H" ,
+"68I" , "68J" , "68K" , "68L" , "68M" , "68N" , "68O" , "68P" ,
+"68Q" , "68R" , "68S" , "68T" , "68U" , "68V" , "68W" , "68X" ,
+"68Y" , "68Z" , "680" , "681" , "682" , "683" , "684" , "685" ,
+"686" , "687" , "688" , "689" , "69A" , "69B" , "69C" , "69D" ,
+"69E" , "69F" , "69G" , "69H" , "69I" , "69J" , "69K" , "69L" ,
+"69M" , "69N" , "69O" , "69P" , "69Q" , "69R" , "69S" , "69T" ,
+"69U" , "69V" , "69W" , "69X" , "69Y" , "69Z" , "690" , "691" ,
+"692" , "693" , "694" , "695" , "696" , "697" , "698" , "699" ,
+"7AA" , "7AB" , "7AC" , "7AD" , "7AE" , "7AF" , "7AG" , "7AH" ,
+"7AI" , "7AJ" , "7AK" , "7AL" , "7AM" , "7AN" , "7AO" , "7AP" ,
+"7AQ" , "7AR" , "7AS" , "7AT" , "7AU" , "7AV" , "7AW" , "7AX" ,
+"7AY" , "7AZ" , "7A0" , "7A1" , "7A2" , "7A3" , "7A4" , "7A5" ,
+"7A6" , "7A7" , "7A8" , "7A9" , "7BA" , "7BB" , "7BC" , "7BD" ,
+"7BE" , "7BF" , "7BG" , "7BH" , "7BI" , "7BJ" , "7BK" , "7BL" ,
+"7BM" , "7BN" , "7BO" , "7BP" , "7BQ" , "7BR" , "7BS" , "7BT" ,
+"7BU" , "7BV" , "7BW" , "7BX" , "7BY" , "7BZ" , "7B0" , "7B1" ,
+"7B2" , "7B3" , "7B4" , "7B5" , "7B6" , "7B7" , "7B8" , "7B9" ,
+"7CA" , "7CB" , "7CC" , "7CD" , "7CE" , "7CF" , "7CG" , "7CH" ,
+"7CI" , "7CJ" , "7CK" , "7CL" , "7CM" , "7CN" , "7CO" , "7CP" ,
+"7CQ" , "7CR" , "7CS" , "7CT" , "7CU" , "7CV" , "7CW" , "7CX" ,
+"7CY" , "7CZ" , "7C0" , "7C1" , "7C2" , "7C3" , "7C4" , "7C5" ,
+"7C6" , "7C7" , "7C8" , "7C9" , "7DA" , "7DB" , "7DC" , "7DD" ,
+"7DE" , "7DF" , "7DG" , "7DH" , "7DI" , "7DJ" , "7DK" , "7DL" ,
+"7DM" , "7DN" , "7DO" , "7DP" , "7DQ" , "7DR" , "7DS" , "7DT" ,
+"7DU" , "7DV" , "7DW" , "7DX" , "7DY" , "7DZ" , "7D0" , "7D1" ,
+"7D2" , "7D3" , "7D4" , "7D5" , "7D6" , "7D7" , "7D8" , "7D9" ,
+"7EA" , "7EB" , "7EC" , "7ED" , "7EE" , "7EF" , "7EG" , "7EH" ,
+"7EI" , "7EJ" , "7EK" , "7EL" , "7EM" , "7EN" , "7EO" , "7EP" ,
+"7EQ" , "7ER" , "7ES" , "7ET" , "7EU" , "7EV" , "7EW" , "7EX" ,
+"7EY" , "7EZ" , "7E0" , "7E1" , "7E2" , "7E3" , "7E4" , "7E5" ,
+"7E6" , "7E7" , "7E8" , "7E9" , "7FA" , "7FB" , "7FC" , "7FD" ,
+"7FE" , "7FF" , "7FG" , "7FH" , "7FI" , "7FJ" , "7FK" , "7FL" ,
+"7FM" , "7FN" , "7FO" , "7FP" , "7FQ" , "7FR" , "7FS" , "7FT" ,
+"7FU" , "7FV" , "7FW" , "7FX" , "7FY" , "7FZ" , "7F0" , "7F1" ,
+"7F2" , "7F3" , "7F4" , "7F5" , "7F6" , "7F7" , "7F8" , "7F9" ,
+"7GA" , "7GB" , "7GC" , "7GD" , "7GE" , "7GF" , "7GG" , "7GH" ,
+"7GI" , "7GJ" , "7GK" , "7GL" , "7GM" , "7GN" , "7GO" , "7GP" ,
+"7GQ" , "7GR" , "7GS" , "7GT" , "7GU" , "7GV" , "7GW" , "7GX" ,
+"7GY" , "7GZ" , "7G0" , "7G1" , "7G2" , "7G3" , "7G4" , "7G5" ,
+"7G6" , "7G7" , "7G8" , "7G9" , "7HA" , "7HB" , "7HC" , "7HD" ,
+"7HE" , "7HF" , "7HG" , "7HH" , "7HI" , "7HJ" , "7HK" , "7HL" ,
+"7HM" , "7HN" , "7HO" , "7HP" , "7HQ" , "7HR" , "7HS" , "7HT" ,
+"7HU" , "7HV" , "7HW" , "7HX" , "7HY" , "7HZ" , "7H0" , "7H1" ,
+"7H2" , "7H3" , "7H4" , "7H5" , "7H6" , "7H7" , "7H8" , "7H9" ,
+"7IA" , "7IB" , "7IC" , "7ID" , "7IE" , "7IF" , "7IG" , "7IH" ,
+"7II" , "7IJ" , "7IK" , "7IL" , "7IM" , "7IN" , "7IO" , "7IP" ,
+"7IQ" , "7IR" , "7IS" , "7IT" , "7IU" , "7IV" , "7IW" , "7IX" ,
+"7IY" , "7IZ" , "7I0" , "7I1" , "7I2" , "7I3" , "7I4" , "7I5" ,
+"7I6" , "7I7" , "7I8" , "7I9" , "7JA" , "7JB" , "7JC" , "7JD" ,
+"7JE" , "7JF" , "7JG" , "7JH" , "7JI" , "7JJ" , "7JK" , "7JL" ,
+"7JM" , "7JN" , "7JO" , "7JP" , "7JQ" , "7JR" , "7JS" , "7JT" ,
+"7JU" , "7JV" , "7JW" , "7JX" , "7JY" , "7JZ" , "7J0" , "7J1" ,
+"7J2" , "7J3" , "7J4" , "7J5" , "7J6" , "7J7" , "7J8" , "7J9" ,
+"7KA" , "7KB" , "7KC" , "7KD" , "7KE" , "7KF" , "7KG" , "7KH" ,
+"7KI" , "7KJ" , "7KK" , "7KL" , "7KM" , "7KN" , "7KO" , "7KP" ,
+"7KQ" , "7KR" , "7KS" , "7KT" , "7KU" , "7KV" , "7KW" , "7KX" ,
+"7KY" , "7KZ" , "7K0" , "7K1" , "7K2" , "7K3" , "7K4" , "7K5" ,
+"7K6" , "7K7" , "7K8" , "7K9" , "7LA" , "7LB" , "7LC" , "7LD" ,
+"7LE" , "7LF" , "7LG" , "7LH" , "7LI" , "7LJ" , "7LK" , "7LL" ,
+"7LM" , "7LN" , "7LO" , "7LP" , "7LQ" , "7LR" , "7LS" , "7LT" ,
+"7LU" , "7LV" , "7LW" , "7LX" , "7LY" , "7LZ" , "7L0" , "7L1" ,
+"7L2" , "7L3" , "7L4" , "7L5" , "7L6" , "7L7" , "7L8" , "7L9" ,
+"7MA" , "7MB" , "7MC" , "7MD" , "7ME" , "7MF" , "7MG" , "7MH" ,
+"7MI" , "7MJ" , "7MK" , "7ML" , "7MM" , "7MN" , "7MO" , "7MP" ,
+"7MQ" , "7MR" , "7MS" , "7MT" , "7MU" , "7MV" , "7MW" , "7MX" ,
+"7MY" , "7MZ" , "7M0" , "7M1" , "7M2" , "7M3" , "7M4" , "7M5" ,
+"7M6" , "7M7" , "7M8" , "7M9" , "7NA" , "7NB" , "7NC" , "7ND" ,
+"7NE" , "7NF" , "7NG" , "7NH" , "7NI" , "7NJ" , "7NK" , "7NL" ,
+"7NM" , "7NN" , "7NO" , "7NP" , "7NQ" , "7NR" , "7NS" , "7NT" ,
+"7NU" , "7NV" , "7NW" , "7NX" , "7NY" , "7NZ" , "7N0" , "7N1" ,
+"7N2" , "7N3" , "7N4" , "7N5" , "7N6" , "7N7" , "7N8" , "7N9" ,
+"7OA" , "7OB" , "7OC" , "7OD" , "7OE" , "7OF" , "7OG" , "7OH" ,
+"7OI" , "7OJ" , "7OK" , "7OL" , "7OM" , "7ON" , "7OO" , "7OP" ,
+"7OQ" , "7OR" , "7OS" , "7OT" , "7OU" , "7OV" , "7OW" , "7OX" ,
+"7OY" , "7OZ" , "7O0" , "7O1" , "7O2" , "7O3" , "7O4" , "7O5" ,
+"7O6" , "7O7" , "7O8" , "7O9" , "7PA" , "7PB" , "7PC" , "7PD" ,
+"7PE" , "7PF" , "7PG" , "7PH" , "7PI" , "7PJ" , "7PK" , "7PL" ,
+"7PM" , "7PN" , "7PO" , "7PP" , "7PQ" , "7PR" , "7PS" , "7PT" ,
+"7PU" , "7PV" , "7PW" , "7PX" , "7PY" , "7PZ" , "7P0" , "7P1" ,
+"7P2" , "7P3" , "7P4" , "7P5" , "7P6" , "7P7" , "7P8" , "7P9" ,
+"7QA" , "7QB" , "7QC" , "7QD" , "7QE" , "7QF" , "7QG" , "7QH" ,
+"7QI" , "7QJ" , "7QK" , "7QL" , "7QM" , "7QN" , "7QO" , "7QP" ,
+"7QQ" , "7QR" , "7QS" , "7QT" , "7QU" , "7QV" , "7QW" , "7QX" ,
+"7QY" , "7QZ" , "7Q0" , "7Q1" , "7Q2" , "7Q3" , "7Q4" , "7Q5" ,
+"7Q6" , "7Q7" , "7Q8" , "7Q9" , "7RA" , "7RB" , "7RC" , "7RD" ,
+"7RE" , "7RF" , "7RG" , "7RH" , "7RI" , "7RJ" , "7RK" , "7RL" ,
+"7RM" , "7RN" , "7RO" , "7RP" , "7RQ" , "7RR" , "7RS" , "7RT" ,
+"7RU" , "7RV" , "7RW" , "7RX" , "7RY" , "7RZ" , "7R0" , "7R1" ,
+"7R2" , "7R3" , "7R4" , "7R5" , "7R6" , "7R7" , "7R8" , "7R9" ,
+"7SA" , "7SB" , "7SC" , "7SD" , "7SE" , "7SF" , "7SG" , "7SH" ,
+"7SI" , "7SJ" , "7SK" , "7SL" , "7SM" , "7SN" , "7SO" , "7SP" ,
+"7SQ" , "7SR" , "7SS" , "7ST" , "7SU" , "7SV" , "7SW" , "7SX" ,
+"7SY" , "7SZ" , "7S0" , "7S1" , "7S2" , "7S3" , "7S4" , "7S5" ,
+"7S6" , "7S7" , "7S8" , "7S9" , "7TA" , "7TB" , "7TC" , "7TD" ,
+"7TE" , "7TF" , "7TG" , "7TH" , "7TI" , "7TJ" , "7TK" , "7TL" ,
+"7TM" , "7TN" , "7TO" , "7TP" , "7TQ" , "7TR" , "7TS" , "7TT" ,
+"7TU" , "7TV" , "7TW" , "7TX" , "7TY" , "7TZ" , "7T0" , "7T1" ,
+"7T2" , "7T3" , "7T4" , "7T5" , "7T6" , "7T7" , "7T8" , "7T9" ,
+"7UA" , "7UB" , "7UC" , "7UD" , "7UE" , "7UF" , "7UG" , "7UH" ,
+"7UI" , "7UJ" , "7UK" , "7UL" , "7UM" , "7UN" , "7UO" , "7UP" ,
+"7UQ" , "7UR" , "7US" , "7UT" , "7UU" , "7UV" , "7UW" , "7UX" ,
+"7UY" , "7UZ" , "7U0" , "7U1" , "7U2" , "7U3" , "7U4" , "7U5" ,
+"7U6" , "7U7" , "7U8" , "7U9" , "7VA" , "7VB" , "7VC" , "7VD" ,
+"7VE" , "7VF" , "7VG" , "7VH" , "7VI" , "7VJ" , "7VK" , "7VL" ,
+"7VM" , "7VN" , "7VO" , "7VP" , "7VQ" , "7VR" , "7VS" , "7VT" ,
+"7VU" , "7VV" , "7VW" , "7VX" , "7VY" , "7VZ" , "7V0" , "7V1" ,
+"7V2" , "7V3" , "7V4" , "7V5" , "7V6" , "7V7" , "7V8" , "7V9" ,
+"7WA" , "7WB" , "7WC" , "7WD" , "7WE" , "7WF" , "7WG" , "7WH" ,
+"7WI" , "7WJ" , "7WK" , "7WL" , "7WM" , "7WN" , "7WO" , "7WP" ,
+"7WQ" , "7WR" , "7WS" , "7WT" , "7WU" , "7WV" , "7WW" , "7WX" ,
+"7WY" , "7WZ" , "7W0" , "7W1" , "7W2" , "7W3" , "7W4" , "7W5" ,
+"7W6" , "7W7" , "7W8" , "7W9" , "7XA" , "7XB" , "7XC" , "7XD" ,
+"7XE" , "7XF" , "7XG" , "7XH" , "7XI" , "7XJ" , "7XK" , "7XL" ,
+"7XM" , "7XN" , "7XO" , "7XP" , "7XQ" , "7XR" , "7XS" , "7XT" ,
+"7XU" , "7XV" , "7XW" , "7XX" , "7XY" , "7XZ" , "7X0" , "7X1" ,
+"7X2" , "7X3" , "7X4" , "7X5" , "7X6" , "7X7" , "7X8" , "7X9" ,
+"7YA" , "7YB" , "7YC" , "7YD" , "7YE" , "7YF" , "7YG" , "7YH" ,
+"7YI" , "7YJ" , "7YK" , "7YL" , "7YM" , "7YN" , "7YO" , "7YP" ,
+"7YQ" , "7YR" , "7YS" , "7YT" , "7YU" , "7YV" , "7YW" , "7YX" ,
+"7YY" , "7YZ" , "7Y0" , "7Y1" , "7Y2" , "7Y3" , "7Y4" , "7Y5" ,
+"7Y6" , "7Y7" , "7Y8" , "7Y9" , "7ZA" , "7ZB" , "7ZC" , "7ZD" ,
+"7ZE" , "7ZF" , "7ZG" , "7ZH" , "7ZI" , "7ZJ" , "7ZK" , "7ZL" ,
+"7ZM" , "7ZN" , "7ZO" , "7ZP" , "7ZQ" , "7ZR" , "7ZS" , "7ZT" ,
+"7ZU" , "7ZV" , "7ZW" , "7ZX" , "7ZY" , "7ZZ" , "7Z0" , "7Z1" ,
+"7Z2" , "7Z3" , "7Z4" , "7Z5" , "7Z6" , "7Z7" , "7Z8" , "7Z9" ,
+"70A" , "70B" , "70C" , "70D" , "70E" , "70F" , "70G" , "70H" ,
+"70I" , "70J" , "70K" , "70L" , "70M" , "70N" , "70O" , "70P" ,
+"70Q" , "70R" , "70S" , "70T" , "70U" , "70V" , "70W" , "70X" ,
+"70Y" , "70Z" , "700" , "701" , "702" , "703" , "704" , "705" ,
+"706" , "707" , "708" , "709" , "71A" , "71B" , "71C" , "71D" ,
+"71E" , "71F" , "71G" , "71H" , "71I" , "71J" , "71K" , "71L" ,
+"71M" , "71N" , "71O" , "71P" , "71Q" , "71R" , "71S" , "71T" ,
+"71U" , "71V" , "71W" , "71X" , "71Y" , "71Z" , "710" , "711" ,
+"712" , "713" , "714" , "715" , "716" , "717" , "718" , "719" ,
+"72A" , "72B" , "72C" , "72D" , "72E" , "72F" , "72G" , "72H" ,
+"72I" , "72J" , "72K" , "72L" , "72M" , "72N" , "72O" , "72P" ,
+"72Q" , "72R" , "72S" , "72T" , "72U" , "72V" , "72W" , "72X" ,
+"72Y" , "72Z" , "720" , "721" , "722" , "723" , "724" , "725" ,
+"726" , "727" , "728" , "729" , "73A" , "73B" , "73C" , "73D" ,
+"73E" , "73F" , "73G" , "73H" , "73I" , "73J" , "73K" , "73L" ,
+"73M" , "73N" , "73O" , "73P" , "73Q" , "73R" , "73S" , "73T" ,
+"73U" , "73V" , "73W" , "73X" , "73Y" , "73Z" , "730" , "731" ,
+"732" , "733" , "734" , "735" , "736" , "737" , "738" , "739" ,
+"74A" , "74B" , "74C" , "74D" , "74E" , "74F" , "74G" , "74H" ,
+"74I" , "74J" , "74K" , "74L" , "74M" , "74N" , "74O" , "74P" ,
+"74Q" , "74R" , "74S" , "74T" , "74U" , "74V" , "74W" , "74X" ,
+"74Y" , "74Z" , "740" , "741" , "742" , "743" , "744" , "745" ,
+"746" , "747" , "748" , "749" , "75A" , "75B" , "75C" , "75D" ,
+"75E" , "75F" , "75G" , "75H" , "75I" , "75J" , "75K" , "75L" ,
+"75M" , "75N" , "75O" , "75P" , "75Q" , "75R" , "75S" , "75T" ,
+"75U" , "75V" , "75W" , "75X" , "75Y" , "75Z" , "750" , "751" ,
+"752" , "753" , "754" , "755" , "756" , "757" , "758" , "759" ,
+"76A" , "76B" , "76C" , "76D" , "76E" , "76F" , "76G" , "76H" ,
+"76I" , "76J" , "76K" , "76L" , "76M" , "76N" , "76O" , "76P" ,
+"76Q" , "76R" , "76S" , "76T" , "76U" , "76V" , "76W" , "76X" ,
+"76Y" , "76Z" , "760" , "761" , "762" , "763" , "764" , "765" ,
+"766" , "767" , "768" , "769" , "77A" , "77B" , "77C" , "77D" ,
+"77E" , "77F" , "77G" , "77H" , "77I" , "77J" , "77K" , "77L" ,
+"77M" , "77N" , "77O" , "77P" , "77Q" , "77R" , "77S" , "77T" ,
+"77U" , "77V" , "77W" , "77X" , "77Y" , "77Z" , "770" , "771" ,
+"772" , "773" , "774" , "775" , "776" , "777" , "778" , "779" ,
+"78A" , "78B" , "78C" , "78D" , "78E" , "78F" , "78G" , "78H" ,
+"78I" , "78J" , "78K" , "78L" , "78M" , "78N" , "78O" , "78P" ,
+"78Q" , "78R" , "78S" , "78T" , "78U" , "78V" , "78W" , "78X" ,
+"78Y" , "78Z" , "780" , "781" , "782" , "783" , "784" , "785" ,
+"786" , "787" , "788" , "789" , "79A" , "79B" , "79C" , "79D" ,
+"79E" , "79F" , "79G" , "79H" , "79I" , "79J" , "79K" , "79L" ,
+"79M" , "79N" , "79O" , "79P" , "79Q" , "79R" , "79S" , "79T" ,
+"79U" , "79V" , "79W" , "79X" , "79Y" , "79Z" , "790" , "791" ,
+"792" , "793" , "794" , "795" , "796" , "797" , "798" , "799" ,
+"8AA" , "8AB" , "8AC" , "8AD" , "8AE" , "8AF" , "8AG" , "8AH" ,
+"8AI" , "8AJ" , "8AK" , "8AL" , "8AM" , "8AN" , "8AO" , "8AP" ,
+"8AQ" , "8AR" , "8AS" , "8AT" , "8AU" , "8AV" , "8AW" , "8AX" ,
+"8AY" , "8AZ" , "8A0" , "8A1" , "8A2" , "8A3" , "8A4" , "8A5" ,
+"8A6" , "8A7" , "8A8" , "8A9" , "8BA" , "8BB" , "8BC" , "8BD" ,
+"8BE" , "8BF" , "8BG" , "8BH" , "8BI" , "8BJ" , "8BK" , "8BL" ,
+"8BM" , "8BN" , "8BO" , "8BP" , "8BQ" , "8BR" , "8BS" , "8BT" ,
+"8BU" , "8BV" , "8BW" , "8BX" , "8BY" , "8BZ" , "8B0" , "8B1" ,
+"8B2" , "8B3" , "8B4" , "8B5" , "8B6" , "8B7" , "8B8" , "8B9" ,
+"8CA" , "8CB" , "8CC" , "8CD" , "8CE" , "8CF" , "8CG" , "8CH" ,
+"8CI" , "8CJ" , "8CK" , "8CL" , "8CM" , "8CN" , "8CO" , "8CP" ,
+"8CQ" , "8CR" , "8CS" , "8CT" , "8CU" , "8CV" , "8CW" , "8CX" ,
+"8CY" , "8CZ" , "8C0" , "8C1" , "8C2" , "8C3" , "8C4" , "8C5" ,
+"8C6" , "8C7" , "8C8" , "8C9" , "8DA" , "8DB" , "8DC" , "8DD" ,
+"8DE" , "8DF" , "8DG" , "8DH" , "8DI" , "8DJ" , "8DK" , "8DL" ,
+"8DM" , "8DN" , "8DO" , "8DP" , "8DQ" , "8DR" , "8DS" , "8DT" ,
+"8DU" , "8DV" , "8DW" , "8DX" , "8DY" , "8DZ" , "8D0" , "8D1" ,
+"8D2" , "8D3" , "8D4" , "8D5" , "8D6" , "8D7" , "8D8" , "8D9" ,
+"8EA" , "8EB" , "8EC" , "8ED" , "8EE" , "8EF" , "8EG" , "8EH" ,
+"8EI" , "8EJ" , "8EK" , "8EL" , "8EM" , "8EN" , "8EO" , "8EP" ,
+"8EQ" , "8ER" , "8ES" , "8ET" , "8EU" , "8EV" , "8EW" , "8EX" ,
+"8EY" , "8EZ" , "8E0" , "8E1" , "8E2" , "8E3" , "8E4" , "8E5" ,
+"8E6" , "8E7" , "8E8" , "8E9" , "8FA" , "8FB" , "8FC" , "8FD" ,
+"8FE" , "8FF" , "8FG" , "8FH" , "8FI" , "8FJ" , "8FK" , "8FL" ,
+"8FM" , "8FN" , "8FO" , "8FP" , "8FQ" , "8FR" , "8FS" , "8FT" ,
+"8FU" , "8FV" , "8FW" , "8FX" , "8FY" , "8FZ" , "8F0" , "8F1" ,
+"8F2" , "8F3" , "8F4" , "8F5" , "8F6" , "8F7" , "8F8" , "8F9" ,
+"8GA" , "8GB" , "8GC" , "8GD" , "8GE" , "8GF" , "8GG" , "8GH" ,
+"8GI" , "8GJ" , "8GK" , "8GL" , "8GM" , "8GN" , "8GO" , "8GP" ,
+"8GQ" , "8GR" , "8GS" , "8GT" , "8GU" , "8GV" , "8GW" , "8GX" ,
+"8GY" , "8GZ" , "8G0" , "8G1" , "8G2" , "8G3" , "8G4" , "8G5" ,
+"8G6" , "8G7" , "8G8" , "8G9" , "8HA" , "8HB" , "8HC" , "8HD" ,
+"8HE" , "8HF" , "8HG" , "8HH" , "8HI" , "8HJ" , "8HK" , "8HL" ,
+"8HM" , "8HN" , "8HO" , "8HP" , "8HQ" , "8HR" , "8HS" , "8HT" ,
+"8HU" , "8HV" , "8HW" , "8HX" , "8HY" , "8HZ" , "8H0" , "8H1" ,
+"8H2" , "8H3" , "8H4" , "8H5" , "8H6" , "8H7" , "8H8" , "8H9" ,
+"8IA" , "8IB" , "8IC" , "8ID" , "8IE" , "8IF" , "8IG" , "8IH" ,
+"8II" , "8IJ" , "8IK" , "8IL" , "8IM" , "8IN" , "8IO" , "8IP" ,
+"8IQ" , "8IR" , "8IS" , "8IT" , "8IU" , "8IV" , "8IW" , "8IX" ,
+"8IY" , "8IZ" , "8I0" , "8I1" , "8I2" , "8I3" , "8I4" , "8I5" ,
+"8I6" , "8I7" , "8I8" , "8I9" , "8JA" , "8JB" , "8JC" , "8JD" ,
+"8JE" , "8JF" , "8JG" , "8JH" , "8JI" , "8JJ" , "8JK" , "8JL" ,
+"8JM" , "8JN" , "8JO" , "8JP" , "8JQ" , "8JR" , "8JS" , "8JT" ,
+"8JU" , "8JV" , "8JW" , "8JX" , "8JY" , "8JZ" , "8J0" , "8J1" ,
+"8J2" , "8J3" , "8J4" , "8J5" , "8J6" , "8J7" , "8J8" , "8J9" ,
+"8KA" , "8KB" , "8KC" , "8KD" , "8KE" , "8KF" , "8KG" , "8KH" ,
+"8KI" , "8KJ" , "8KK" , "8KL" , "8KM" , "8KN" , "8KO" , "8KP" ,
+"8KQ" , "8KR" , "8KS" , "8KT" , "8KU" , "8KV" , "8KW" , "8KX" ,
+"8KY" , "8KZ" , "8K0" , "8K1" , "8K2" , "8K3" , "8K4" , "8K5" ,
+"8K6" , "8K7" , "8K8" , "8K9" , "8LA" , "8LB" , "8LC" , "8LD" ,
+"8LE" , "8LF" , "8LG" , "8LH" , "8LI" , "8LJ" , "8LK" , "8LL" ,
+"8LM" , "8LN" , "8LO" , "8LP" , "8LQ" , "8LR" , "8LS" , "8LT" ,
+"8LU" , "8LV" , "8LW" , "8LX" , "8LY" , "8LZ" , "8L0" , "8L1" ,
+"8L2" , "8L3" , "8L4" , "8L5" , "8L6" , "8L7" , "8L8" , "8L9" ,
+"8MA" , "8MB" , "8MC" , "8MD" , "8ME" , "8MF" , "8MG" , "8MH" ,
+"8MI" , "8MJ" , "8MK" , "8ML" , "8MM" , "8MN" , "8MO" , "8MP" ,
+"8MQ" , "8MR" , "8MS" , "8MT" , "8MU" , "8MV" , "8MW" , "8MX" ,
+"8MY" , "8MZ" , "8M0" , "8M1" , "8M2" , "8M3" , "8M4" , "8M5" ,
+"8M6" , "8M7" , "8M8" , "8M9" , "8NA" , "8NB" , "8NC" , "8ND" ,
+"8NE" , "8NF" , "8NG" , "8NH" , "8NI" , "8NJ" , "8NK" , "8NL" ,
+"8NM" , "8NN" , "8NO" , "8NP" , "8NQ" , "8NR" , "8NS" , "8NT" ,
+"8NU" , "8NV" , "8NW" , "8NX" , "8NY" , "8NZ" , "8N0" , "8N1" ,
+"8N2" , "8N3" , "8N4" , "8N5" , "8N6" , "8N7" , "8N8" , "8N9" ,
+"8OA" , "8OB" , "8OC" , "8OD" , "8OE" , "8OF" , "8OG" , "8OH" ,
+"8OI" , "8OJ" , "8OK" , "8OL" , "8OM" , "8ON" , "8OO" , "8OP" ,
+"8OQ" , "8OR" , "8OS" , "8OT" , "8OU" , "8OV" , "8OW" , "8OX" ,
+"8OY" , "8OZ" , "8O0" , "8O1" , "8O2" , "8O3" , "8O4" , "8O5" ,
+"8O6" , "8O7" , "8O8" , "8O9" , "8PA" , "8PB" , "8PC" , "8PD" ,
+"8PE" , "8PF" , "8PG" , "8PH" , "8PI" , "8PJ" , "8PK" , "8PL" ,
+"8PM" , "8PN" , "8PO" , "8PP" , "8PQ" , "8PR" , "8PS" , "8PT" ,
+"8PU" , "8PV" , "8PW" , "8PX" , "8PY" , "8PZ" , "8P0" , "8P1" ,
+"8P2" , "8P3" , "8P4" , "8P5" , "8P6" , "8P7" , "8P8" , "8P9" ,
+"8QA" , "8QB" , "8QC" , "8QD" , "8QE" , "8QF" , "8QG" , "8QH" ,
+"8QI" , "8QJ" , "8QK" , "8QL" , "8QM" , "8QN" , "8QO" , "8QP" ,
+"8QQ" , "8QR" , "8QS" , "8QT" , "8QU" , "8QV" , "8QW" , "8QX" ,
+"8QY" , "8QZ" , "8Q0" , "8Q1" , "8Q2" , "8Q3" , "8Q4" , "8Q5" ,
+"8Q6" , "8Q7" , "8Q8" , "8Q9" , "8RA" , "8RB" , "8RC" , "8RD" ,
+"8RE" , "8RF" , "8RG" , "8RH" , "8RI" , "8RJ" , "8RK" , "8RL" ,
+"8RM" , "8RN" , "8RO" , "8RP" , "8RQ" , "8RR" , "8RS" , "8RT" ,
+"8RU" , "8RV" , "8RW" , "8RX" , "8RY" , "8RZ" , "8R0" , "8R1" ,
+"8R2" , "8R3" , "8R4" , "8R5" , "8R6" , "8R7" , "8R8" , "8R9" ,
+"8SA" , "8SB" , "8SC" , "8SD" , "8SE" , "8SF" , "8SG" , "8SH" ,
+"8SI" , "8SJ" , "8SK" , "8SL" , "8SM" , "8SN" , "8SO" , "8SP" ,
+"8SQ" , "8SR" , "8SS" , "8ST" , "8SU" , "8SV" , "8SW" , "8SX" ,
+"8SY" , "8SZ" , "8S0" , "8S1" , "8S2" , "8S3" , "8S4" , "8S5" ,
+"8S6" , "8S7" , "8S8" , "8S9" , "8TA" , "8TB" , "8TC" , "8TD" ,
+"8TE" , "8TF" , "8TG" , "8TH" , "8TI" , "8TJ" , "8TK" , "8TL" ,
+"8TM" , "8TN" , "8TO" , "8TP" , "8TQ" , "8TR" , "8TS" , "8TT" ,
+"8TU" , "8TV" , "8TW" , "8TX" , "8TY" , "8TZ" , "8T0" , "8T1" ,
+"8T2" , "8T3" , "8T4" , "8T5" , "8T6" , "8T7" , "8T8" , "8T9" ,
+"8UA" , "8UB" , "8UC" , "8UD" , "8UE" , "8UF" , "8UG" , "8UH" ,
+"8UI" , "8UJ" , "8UK" , "8UL" , "8UM" , "8UN" , "8UO" , "8UP" ,
+"8UQ" , "8UR" , "8US" , "8UT" , "8UU" , "8UV" , "8UW" , "8UX" ,
+"8UY" , "8UZ" , "8U0" , "8U1" , "8U2" , "8U3" , "8U4" , "8U5" ,
+"8U6" , "8U7" , "8U8" , "8U9" , "8VA" , "8VB" , "8VC" , "8VD" ,
+"8VE" , "8VF" , "8VG" , "8VH" , "8VI" , "8VJ" , "8VK" , "8VL" ,
+"8VM" , "8VN" , "8VO" , "8VP" , "8VQ" , "8VR" , "8VS" , "8VT" ,
+"8VU" , "8VV" , "8VW" , "8VX" , "8VY" , "8VZ" , "8V0" , "8V1" ,
+"8V2" , "8V3" , "8V4" , "8V5" , "8V6" , "8V7" , "8V8" , "8V9" ,
+"8WA" , "8WB" , "8WC" , "8WD" , "8WE" , "8WF" , "8WG" , "8WH" ,
+"8WI" , "8WJ" , "8WK" , "8WL" , "8WM" , "8WN" , "8WO" , "8WP" ,
+"8WQ" , "8WR" , "8WS" , "8WT" , "8WU" , "8WV" , "8WW" , "8WX" ,
+"8WY" , "8WZ" , "8W0" , "8W1" , "8W2" , "8W3" , "8W4" , "8W5" ,
+"8W6" , "8W7" , "8W8" , "8W9" , "8XA" , "8XB" , "8XC" , "8XD" ,
+"8XE" , "8XF" , "8XG" , "8XH" , "8XI" , "8XJ" , "8XK" , "8XL" ,
+"8XM" , "8XN" , "8XO" , "8XP" , "8XQ" , "8XR" , "8XS" , "8XT" ,
+"8XU" , "8XV" , "8XW" , "8XX" , "8XY" , "8XZ" , "8X0" , "8X1" ,
+"8X2" , "8X3" , "8X4" , "8X5" , "8X6" , "8X7" , "8X8" , "8X9" ,
+"8YA" , "8YB" , "8YC" , "8YD" , "8YE" , "8YF" , "8YG" , "8YH" ,
+"8YI" , "8YJ" , "8YK" , "8YL" , "8YM" , "8YN" , "8YO" , "8YP" ,
+"8YQ" , "8YR" , "8YS" , "8YT" , "8YU" , "8YV" , "8YW" , "8YX" ,
+"8YY" , "8YZ" , "8Y0" , "8Y1" , "8Y2" , "8Y3" , "8Y4" , "8Y5" ,
+"8Y6" , "8Y7" , "8Y8" , "8Y9" , "8ZA" , "8ZB" , "8ZC" , "8ZD" ,
+"8ZE" , "8ZF" , "8ZG" , "8ZH" , "8ZI" , "8ZJ" , "8ZK" , "8ZL" ,
+"8ZM" , "8ZN" , "8ZO" , "8ZP" , "8ZQ" , "8ZR" , "8ZS" , "8ZT" ,
+"8ZU" , "8ZV" , "8ZW" , "8ZX" , "8ZY" , "8ZZ" , "8Z0" , "8Z1" ,
+"8Z2" , "8Z3" , "8Z4" , "8Z5" , "8Z6" , "8Z7" , "8Z8" , "8Z9" ,
+"80A" , "80B" , "80C" , "80D" , "80E" , "80F" , "80G" , "80H" ,
+"80I" , "80J" , "80K" , "80L" , "80M" , "80N" , "80O" , "80P" ,
+"80Q" , "80R" , "80S" , "80T" , "80U" , "80V" , "80W" , "80X" ,
+"80Y" , "80Z" , "800" , "801" , "802" , "803" , "804" , "805" ,
+"806" , "807" , "808" , "809" , "81A" , "81B" , "81C" , "81D" ,
+"81E" , "81F" , "81G" , "81H" , "81I" , "81J" , "81K" , "81L" ,
+"81M" , "81N" , "81O" , "81P" , "81Q" , "81R" , "81S" , "81T" ,
+"81U" , "81V" , "81W" , "81X" , "81Y" , "81Z" , "810" , "811" ,
+"812" , "813" , "814" , "815" , "816" , "817" , "818" , "819" ,
+"82A" , "82B" , "82C" , "82D" , "82E" , "82F" , "82G" , "82H" ,
+"82I" , "82J" , "82K" , "82L" , "82M" , "82N" , "82O" , "82P" ,
+"82Q" , "82R" , "82S" , "82T" , "82U" , "82V" , "82W" , "82X" ,
+"82Y" , "82Z" , "820" , "821" , "822" , "823" , "824" , "825" ,
+"826" , "827" , "828" , "829" , "83A" , "83B" , "83C" , "83D" ,
+"83E" , "83F" , "83G" , "83H" , "83I" , "83J" , "83K" , "83L" ,
+"83M" , "83N" , "83O" , "83P" , "83Q" , "83R" , "83S" , "83T" ,
+"83U" , "83V" , "83W" , "83X" , "83Y" , "83Z" , "830" , "831" ,
+"832" , "833" , "834" , "835" , "836" , "837" , "838" , "839" ,
+"84A" , "84B" , "84C" , "84D" , "84E" , "84F" , "84G" , "84H" ,
+"84I" , "84J" , "84K" , "84L" , "84M" , "84N" , "84O" , "84P" ,
+"84Q" , "84R" , "84S" , "84T" , "84U" , "84V" , "84W" , "84X" ,
+"84Y" , "84Z" , "840" , "841" , "842" , "843" , "844" , "845" ,
+"846" , "847" , "848" , "849" , "85A" , "85B" , "85C" , "85D" ,
+"85E" , "85F" , "85G" , "85H" , "85I" , "85J" , "85K" , "85L" ,
+"85M" , "85N" , "85O" , "85P" , "85Q" , "85R" , "85S" , "85T" ,
+"85U" , "85V" , "85W" , "85X" , "85Y" , "85Z" , "850" , "851" ,
+"852" , "853" , "854" , "855" , "856" , "857" , "858" , "859" ,
+"86A" , "86B" , "86C" , "86D" , "86E" , "86F" , "86G" , "86H" ,
+"86I" , "86J" , "86K" , "86L" , "86M" , "86N" , "86O" , "86P" ,
+"86Q" , "86R" , "86S" , "86T" , "86U" , "86V" , "86W" , "86X" ,
+"86Y" , "86Z" , "860" , "861" , "862" , "863" , "864" , "865" ,
+"866" , "867" , "868" , "869" , "87A" , "87B" , "87C" , "87D" ,
+"87E" , "87F" , "87G" , "87H" , "87I" , "87J" , "87K" , "87L" ,
+"87M" , "87N" , "87O" , "87P" , "87Q" , "87R" , "87S" , "87T" ,
+"87U" , "87V" , "87W" , "87X" , "87Y" , "87Z" , "870" , "871" ,
+"872" , "873" , "874" , "875" , "876" , "877" , "878" , "879" ,
+"88A" , "88B" , "88C" , "88D" , "88E" , "88F" , "88G" , "88H" ,
+"88I" , "88J" , "88K" , "88L" , "88M" , "88N" , "88O" , "88P" ,
+"88Q" , "88R" , "88S" , "88T" , "88U" , "88V" , "88W" , "88X" ,
+"88Y" , "88Z" , "880" , "881" , "882" , "883" , "884" , "885" ,
+"886" , "887" , "888" , "889" , "89A" , "89B" , "89C" , "89D" ,
+"89E" , "89F" , "89G" , "89H" , "89I" , "89J" , "89K" , "89L" ,
+"89M" , "89N" , "89O" , "89P" , "89Q" , "89R" , "89S" , "89T" ,
+"89U" , "89V" , "89W" , "89X" , "89Y" , "89Z" , "890" , "891" ,
+"892" , "893" , "894" , "895" , "896" , "897" , "898" , "899" ,
+"9AA" , "9AB" , "9AC" , "9AD" , "9AE" , "9AF" , "9AG" , "9AH" ,
+"9AI" , "9AJ" , "9AK" , "9AL" , "9AM" , "9AN" , "9AO" , "9AP" ,
+"9AQ" , "9AR" , "9AS" , "9AT" , "9AU" , "9AV" , "9AW" , "9AX" ,
+"9AY" , "9AZ" , "9A0" , "9A1" , "9A2" , "9A3" , "9A4" , "9A5" ,
+"9A6" , "9A7" , "9A8" , "9A9" , "9BA" , "9BB" , "9BC" , "9BD" ,
+"9BE" , "9BF" , "9BG" , "9BH" , "9BI" , "9BJ" , "9BK" , "9BL" ,
+"9BM" , "9BN" , "9BO" , "9BP" , "9BQ" , "9BR" , "9BS" , "9BT" ,
+"9BU" , "9BV" , "9BW" , "9BX" , "9BY" , "9BZ" , "9B0" , "9B1" ,
+"9B2" , "9B3" , "9B4" , "9B5" , "9B6" , "9B7" , "9B8" , "9B9" ,
+"9CA" , "9CB" , "9CC" , "9CD" , "9CE" , "9CF" , "9CG" , "9CH" ,
+"9CI" , "9CJ" , "9CK" , "9CL" , "9CM" , "9CN" , "9CO" , "9CP" ,
+"9CQ" , "9CR" , "9CS" , "9CT" , "9CU" , "9CV" , "9CW" , "9CX" ,
+"9CY" , "9CZ" , "9C0" , "9C1" , "9C2" , "9C3" , "9C4" , "9C5" ,
+"9C6" , "9C7" , "9C8" , "9C9" , "9DA" , "9DB" , "9DC" , "9DD" ,
+"9DE" , "9DF" , "9DG" , "9DH" , "9DI" , "9DJ" , "9DK" , "9DL" ,
+"9DM" , "9DN" , "9DO" , "9DP" , "9DQ" , "9DR" , "9DS" , "9DT" ,
+"9DU" , "9DV" , "9DW" , "9DX" , "9DY" , "9DZ" , "9D0" , "9D1" ,
+"9D2" , "9D3" , "9D4" , "9D5" , "9D6" , "9D7" , "9D8" , "9D9" ,
+"9EA" , "9EB" , "9EC" , "9ED" , "9EE" , "9EF" , "9EG" , "9EH" ,
+"9EI" , "9EJ" , "9EK" , "9EL" , "9EM" , "9EN" , "9EO" , "9EP" ,
+"9EQ" , "9ER" , "9ES" , "9ET" , "9EU" , "9EV" , "9EW" , "9EX" ,
+"9EY" , "9EZ" , "9E0" , "9E1" , "9E2" , "9E3" , "9E4" , "9E5" ,
+"9E6" , "9E7" , "9E8" , "9E9" , "9FA" , "9FB" , "9FC" , "9FD" ,
+"9FE" , "9FF" , "9FG" , "9FH" , "9FI" , "9FJ" , "9FK" , "9FL" ,
+"9FM" , "9FN" , "9FO" , "9FP" , "9FQ" , "9FR" , "9FS" , "9FT" ,
+"9FU" , "9FV" , "9FW" , "9FX" , "9FY" , "9FZ" , "9F0" , "9F1" ,
+"9F2" , "9F3" , "9F4" , "9F5" , "9F6" , "9F7" , "9F8" , "9F9" ,
+"9GA" , "9GB" , "9GC" , "9GD" , "9GE" , "9GF" , "9GG" , "9GH" ,
+"9GI" , "9GJ" , "9GK" , "9GL" , "9GM" , "9GN" , "9GO" , "9GP" ,
+"9GQ" , "9GR" , "9GS" , "9GT" , "9GU" , "9GV" , "9GW" , "9GX" ,
+"9GY" , "9GZ" , "9G0" , "9G1" , "9G2" , "9G3" , "9G4" , "9G5" ,
+"9G6" , "9G7" , "9G8" , "9G9" , "9HA" , "9HB" , "9HC" , "9HD" ,
+"9HE" , "9HF" , "9HG" , "9HH" , "9HI" , "9HJ" , "9HK" , "9HL" ,
+"9HM" , "9HN" , "9HO" , "9HP" , "9HQ" , "9HR" , "9HS" , "9HT" ,
+"9HU" , "9HV" , "9HW" , "9HX" , "9HY" , "9HZ" , "9H0" , "9H1" ,
+"9H2" , "9H3" , "9H4" , "9H5" , "9H6" , "9H7" , "9H8" , "9H9" ,
+"9IA" , "9IB" , "9IC" , "9ID" , "9IE" , "9IF" , "9IG" , "9IH" ,
+"9II" , "9IJ" , "9IK" , "9IL" , "9IM" , "9IN" , "9IO" , "9IP" ,
+"9IQ" , "9IR" , "9IS" , "9IT" , "9IU" , "9IV" , "9IW" , "9IX" ,
+"9IY" , "9IZ" , "9I0" , "9I1" , "9I2" , "9I3" , "9I4" , "9I5" ,
+"9I6" , "9I7" , "9I8" , "9I9" , "9JA" , "9JB" , "9JC" , "9JD" ,
+"9JE" , "9JF" , "9JG" , "9JH" , "9JI" , "9JJ" , "9JK" , "9JL" ,
+"9JM" , "9JN" , "9JO" , "9JP" , "9JQ" , "9JR" , "9JS" , "9JT" ,
+"9JU" , "9JV" , "9JW" , "9JX" , "9JY" , "9JZ" , "9J0" , "9J1" ,
+"9J2" , "9J3" , "9J4" , "9J5" , "9J6" , "9J7" , "9J8" , "9J9" ,
+"9KA" , "9KB" , "9KC" , "9KD" , "9KE" , "9KF" , "9KG" , "9KH" ,
+"9KI" , "9KJ" , "9KK" , "9KL" , "9KM" , "9KN" , "9KO" , "9KP" ,
+"9KQ" , "9KR" , "9KS" , "9KT" , "9KU" , "9KV" , "9KW" , "9KX" ,
+"9KY" , "9KZ" , "9K0" , "9K1" , "9K2" , "9K3" , "9K4" , "9K5" ,
+"9K6" , "9K7" , "9K8" , "9K9" , "9LA" , "9LB" , "9LC" , "9LD" ,
+"9LE" , "9LF" , "9LG" , "9LH" , "9LI" , "9LJ" , "9LK" , "9LL" ,
+"9LM" , "9LN" , "9LO" , "9LP" , "9LQ" , "9LR" , "9LS" , "9LT" ,
+"9LU" , "9LV" , "9LW" , "9LX" , "9LY" , "9LZ" , "9L0" , "9L1" ,
+"9L2" , "9L3" , "9L4" , "9L5" , "9L6" , "9L7" , "9L8" , "9L9" ,
+"9MA" , "9MB" , "9MC" , "9MD" , "9ME" , "9MF" , "9MG" , "9MH" ,
+"9MI" , "9MJ" , "9MK" , "9ML" , "9MM" , "9MN" , "9MO" , "9MP" ,
+"9MQ" , "9MR" , "9MS" , "9MT" , "9MU" , "9MV" , "9MW" , "9MX" ,
+"9MY" , "9MZ" , "9M0" , "9M1" , "9M2" , "9M3" , "9M4" , "9M5" ,
+"9M6" , "9M7" , "9M8" , "9M9" , "9NA" , "9NB" , "9NC" , "9ND" ,
+"9NE" , "9NF" , "9NG" , "9NH" , "9NI" , "9NJ" , "9NK" , "9NL" ,
+"9NM" , "9NN" , "9NO" , "9NP" , "9NQ" , "9NR" , "9NS" , "9NT" ,
+"9NU" , "9NV" , "9NW" , "9NX" , "9NY" , "9NZ" , "9N0" , "9N1" ,
+"9N2" , "9N3" , "9N4" , "9N5" , "9N6" , "9N7" , "9N8" , "9N9" ,
+"9OA" , "9OB" , "9OC" , "9OD" , "9OE" , "9OF" , "9OG" , "9OH" ,
+"9OI" , "9OJ" , "9OK" , "9OL" , "9OM" , "9ON" , "9OO" , "9OP" ,
+"9OQ" , "9OR" , "9OS" , "9OT" , "9OU" , "9OV" , "9OW" , "9OX" ,
+"9OY" , "9OZ" , "9O0" , "9O1" , "9O2" , "9O3" , "9O4" , "9O5" ,
+"9O6" , "9O7" , "9O8" , "9O9" , "9PA" , "9PB" , "9PC" , "9PD" ,
+"9PE" , "9PF" , "9PG" , "9PH" , "9PI" , "9PJ" , "9PK" , "9PL" ,
+"9PM" , "9PN" , "9PO" , "9PP" , "9PQ" , "9PR" , "9PS" , "9PT" ,
+"9PU" , "9PV" , "9PW" , "9PX" , "9PY" , "9PZ" , "9P0" , "9P1" ,
+"9P2" , "9P3" , "9P4" , "9P5" , "9P6" , "9P7" , "9P8" , "9P9" ,
+"9QA" , "9QB" , "9QC" , "9QD" , "9QE" , "9QF" , "9QG" , "9QH" ,
+"9QI" , "9QJ" , "9QK" , "9QL" , "9QM" , "9QN" , "9QO" , "9QP" ,
+"9QQ" , "9QR" , "9QS" , "9QT" , "9QU" , "9QV" , "9QW" , "9QX" ,
+"9QY" , "9QZ" , "9Q0" , "9Q1" , "9Q2" , "9Q3" , "9Q4" , "9Q5" ,
+"9Q6" , "9Q7" , "9Q8" , "9Q9" , "9RA" , "9RB" , "9RC" , "9RD" ,
+"9RE" , "9RF" , "9RG" , "9RH" , "9RI" , "9RJ" , "9RK" , "9RL" ,
+"9RM" , "9RN" , "9RO" , "9RP" , "9RQ" , "9RR" , "9RS" , "9RT" ,
+"9RU" , "9RV" , "9RW" , "9RX" , "9RY" , "9RZ" , "9R0" , "9R1" ,
+"9R2" , "9R3" , "9R4" , "9R5" , "9R6" , "9R7" , "9R8" , "9R9" ,
+"9SA" , "9SB" , "9SC" , "9SD" , "9SE" , "9SF" , "9SG" , "9SH" ,
+"9SI" , "9SJ" , "9SK" , "9SL" , "9SM" , "9SN" , "9SO" , "9SP" ,
+"9SQ" , "9SR" , "9SS" , "9ST" , "9SU" , "9SV" , "9SW" , "9SX" ,
+"9SY" , "9SZ" , "9S0" , "9S1" , "9S2" , "9S3" , "9S4" , "9S5" ,
+"9S6" , "9S7" , "9S8" , "9S9" , "9TA" , "9TB" , "9TC" , "9TD" ,
+"9TE" , "9TF" , "9TG" , "9TH" , "9TI" , "9TJ" , "9TK" , "9TL" ,
+"9TM" , "9TN" , "9TO" , "9TP" , "9TQ" , "9TR" , "9TS" , "9TT" ,
+"9TU" , "9TV" , "9TW" , "9TX" , "9TY" , "9TZ" , "9T0" , "9T1" ,
+"9T2" , "9T3" , "9T4" , "9T5" , "9T6" , "9T7" , "9T8" , "9T9" ,
+"9UA" , "9UB" , "9UC" , "9UD" , "9UE" , "9UF" , "9UG" , "9UH" ,
+"9UI" , "9UJ" , "9UK" , "9UL" , "9UM" , "9UN" , "9UO" , "9UP" ,
+"9UQ" , "9UR" , "9US" , "9UT" , "9UU" , "9UV" , "9UW" , "9UX" ,
+"9UY" , "9UZ" , "9U0" , "9U1" , "9U2" , "9U3" , "9U4" , "9U5" ,
+"9U6" , "9U7" , "9U8" , "9U9" , "9VA" , "9VB" , "9VC" , "9VD" ,
+"9VE" , "9VF" , "9VG" , "9VH" , "9VI" , "9VJ" , "9VK" , "9VL" ,
+"9VM" , "9VN" , "9VO" , "9VP" , "9VQ" , "9VR" , "9VS" , "9VT" ,
+"9VU" , "9VV" , "9VW" , "9VX" , "9VY" , "9VZ" , "9V0" , "9V1" ,
+"9V2" , "9V3" , "9V4" , "9V5" , "9V6" , "9V7" , "9V8" , "9V9" ,
+"9WA" , "9WB" , "9WC" , "9WD" , "9WE" , "9WF" , "9WG" , "9WH" ,
+"9WI" , "9WJ" , "9WK" , "9WL" , "9WM" , "9WN" , "9WO" , "9WP" ,
+"9WQ" , "9WR" , "9WS" , "9WT" , "9WU" , "9WV" , "9WW" , "9WX" ,
+"9WY" , "9WZ" , "9W0" , "9W1" , "9W2" , "9W3" , "9W4" , "9W5" ,
+"9W6" , "9W7" , "9W8" , "9W9" , "9XA" , "9XB" , "9XC" , "9XD" ,
+"9XE" , "9XF" , "9XG" , "9XH" , "9XI" , "9XJ" , "9XK" , "9XL" ,
+"9XM" , "9XN" , "9XO" , "9XP" , "9XQ" , "9XR" , "9XS" , "9XT" ,
+"9XU" , "9XV" , "9XW" , "9XX" , "9XY" , "9XZ" , "9X0" , "9X1" ,
+"9X2" , "9X3" , "9X4" , "9X5" , "9X6" , "9X7" , "9X8" , "9X9" ,
+"9YA" , "9YB" , "9YC" , "9YD" , "9YE" , "9YF" , "9YG" , "9YH" ,
+"9YI" , "9YJ" , "9YK" , "9YL" , "9YM" , "9YN" , "9YO" , "9YP" ,
+"9YQ" , "9YR" , "9YS" , "9YT" , "9YU" , "9YV" , "9YW" , "9YX" ,
+"9YY" , "9YZ" , "9Y0" , "9Y1" , "9Y2" , "9Y3" , "9Y4" , "9Y5" ,
+"9Y6" , "9Y7" , "9Y8" , "9Y9" , "9ZA" , "9ZB" , "9ZC" , "9ZD" ,
+"9ZE" , "9ZF" , "9ZG" , "9ZH" , "9ZI" , "9ZJ" , "9ZK" , "9ZL" ,
+"9ZM" , "9ZN" , "9ZO" , "9ZP" , "9ZQ" , "9ZR" , "9ZS" , "9ZT" ,
+"9ZU" , "9ZV" , "9ZW" , "9ZX" , "9ZY" , "9ZZ" , "9Z0" , "9Z1" ,
+"9Z2" , "9Z3" , "9Z4" , "9Z5" , "9Z6" , "9Z7" , "9Z8" , "9Z9" ,
+"90A" , "90B" , "90C" , "90D" , "90E" , "90F" , "90G" , "90H" ,
+"90I" , "90J" , "90K" , "90L" , "90M" , "90N" , "90O" , "90P" ,
+"90Q" , "90R" , "90S" , "90T" , "90U" , "90V" , "90W" , "90X" ,
+"90Y" , "90Z" , "900" , "901" , "902" , "903" , "904" , "905" ,
+"906" , "907" , "908" , "909" , "91A" , "91B" , "91C" , "91D" ,
+"91E" , "91F" , "91G" , "91H" , "91I" , "91J" , "91K" , "91L" ,
+"91M" , "91N" , "91O" , "91P" , "91Q" , "91R" , "91S" , "91T" ,
+"91U" , "91V" , "91W" , "91X" , "91Y" , "91Z" , "910" , "911" ,
+"912" , "913" , "914" , "915" , "916" , "917" , "918" , "919" ,
+"92A" , "92B" , "92C" , "92D" , "92E" , "92F" , "92G" , "92H" ,
+"92I" , "92J" , "92K" , "92L" , "92M" , "92N" , "92O" , "92P" ,
+"92Q" , "92R" , "92S" , "92T" , "92U" , "92V" , "92W" , "92X" ,
+"92Y" , "92Z" , "920" , "921" , "922" , "923" , "924" , "925" ,
+"926" , "927" , "928" , "929" , "93A" , "93B" , "93C" , "93D" ,
+"93E" , "93F" , "93G" , "93H" , "93I" , "93J" , "93K" , "93L" ,
+"93M" , "93N" , "93O" , "93P" , "93Q" , "93R" , "93S" , "93T" ,
+"93U" , "93V" , "93W" , "93X" , "93Y" , "93Z" , "930" , "931" ,
+"932" , "933" , "934" , "935" , "936" , "937" , "938" , "939" ,
+"94A" , "94B" , "94C" , "94D" , "94E" , "94F" , "94G" , "94H" ,
+"94I" , "94J" , "94K" , "94L" , "94M" , "94N" , "94O" , "94P" ,
+"94Q" , "94R" , "94S" , "94T" , "94U" , "94V" , "94W" , "94X" ,
+"94Y" , "94Z" , "940" , "941" , "942" , "943" , "944" , "945" ,
+"946" , "947" , "948" , "949" , "95A" , "95B" , "95C" , "95D" ,
+"95E" , "95F" , "95G" , "95H" , "95I" , "95J" , "95K" , "95L" ,
+"95M" , "95N" , "95O" , "95P" , "95Q" , "95R" , "95S" , "95T" ,
+"95U" , "95V" , "95W" , "95X" , "95Y" , "95Z" , "950" , "951" ,
+"952" , "953" , "954" , "955" , "956" , "957" , "958" , "959" ,
+"96A" , "96B" , "96C" , "96D" , "96E" , "96F" , "96G" , "96H" ,
+"96I" , "96J" , "96K" , "96L" , "96M" , "96N" , "96O" , "96P" ,
+"96Q" , "96R" , "96S" , "96T" , "96U" , "96V" , "96W" , "96X" ,
+"96Y" , "96Z" , "960" , "961" , "962" , "963" , "964" , "965" ,
+"966" , "967" , "968" , "969" , "97A" , "97B" , "97C" , "97D" ,
+"97E" , "97F" , "97G" , "97H" , "97I" , "97J" , "97K" , "97L" ,
+"97M" , "97N" , "97O" , "97P" , "97Q" , "97R" , "97S" , "97T" ,
+"97U" , "97V" , "97W" , "97X" , "97Y" , "97Z" , "970" , "971" ,
+"972" , "973" , "974" , "975" , "976" , "977" , "978" , "979" ,
+"98A" , "98B" , "98C" , "98D" , "98E" , "98F" , "98G" , "98H" ,
+"98I" , "98J" , "98K" , "98L" , "98M" , "98N" , "98O" , "98P" ,
+"98Q" , "98R" , "98S" , "98T" , "98U" , "98V" , "98W" , "98X" ,
+"98Y" , "98Z" , "980" , "981" , "982" , "983" , "984" , "985" ,
+"986" , "987" , "988" , "989" , "99A" , "99B" , "99C" , "99D" ,
+"99E" , "99F" , "99G" , "99H" , "99I" , "99J" , "99K" , "99L" ,
+"99M" , "99N" , "99O" , "99P" , "99Q" , "99R" , "99S" , "99T" ,
+"99U" , "99V" , "99W" , "99X" , "99Y" , "99Z" , "990" , "991" ,
+"992" , "993" , "994" , "995" , "996" , "997" , "998" , "999" ,
+"999" };
diff --git a/qt/verizonkeygen.cpp b/qt/verizonkeygen.cpp
new file mode 100644
index 0000000..6f28d42
--- /dev/null
+++ b/qt/verizonkeygen.cpp
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+#include "verizonkeygen.h"
+
+VerizonKeygen::VerizonKeygen( WifiNetwork * router ) : KeygenThread(router) {}
+
+void VerizonKeygen::run(){
+ QChar * inverse = new QChar[5];
+ inverse[0] = router->getSSID().at(4);
+ inverse[1] = router->getSSID().at(3);
+ inverse[2] = router->getSSID().at(2);
+ inverse[3] = router->getSSID().at(1);
+ inverse[4] = router->getSSID().at(0);
+ bool test;
+ int resultInt = QString::fromRawData(inverse , 5).toInt(&test, 36);
+ if ( !test )
+ {
+ return; //TODO: error message
+ }
+ QString result;
+ result.setNum(resultInt , 16);
+ while ( result.size() < 6 )
+ result = "0" + result;
+ if ( router->getMac().isEmpty() )
+ {
+ results.append("1801" + result.toUpper());
+ results.append("1F90" + result.toUpper());
+ }
+ else
+ results.append(router->getMac().mid(2,4) + result.toUpper());
+}
diff --git a/qt/verizonkeygen.h b/qt/verizonkeygen.h
new file mode 100644
index 0000000..de48010
--- /dev/null
+++ b/qt/verizonkeygen.h
@@ -0,0 +1,13 @@
+#ifndef VERIZONKEYGEN_H
+#define VERIZONKEYGEN_H
+#include "keygenthread.h"
+
+class VerizonKeygen : public KeygenThread
+{
+ public:
+ VerizonKeygen( WifiNetwork * router );
+ void run();
+
+};
+
+#endif // VERIZONKEYGEN_H
diff --git a/qt/wifinetwork.cpp b/qt/wifinetwork.cpp
new file mode 100644
index 0000000..9cb57e1
--- /dev/null
+++ b/qt/wifinetwork.cpp
@@ -0,0 +1,238 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+#include "wifinetwork.h"
+#include
+WifiNetwork::WifiNetwork(QString r , QString m) : ssid(r) , mac(m.toUpper() )
+{
+ newThomson = false;/*Must be first*/
+ supported = ssidFilter();
+}
+
+QString WifiNetwork::getSSID() const {
+ return this->ssid;
+}
+QString WifiNetwork::getMac() const{
+ QString mac = this->mac;
+ return mac.replace(QChar(':') , "" );
+}
+
+QString WifiNetwork::getSSIDsubpart() const{
+ return this->ssidSubpart;
+}
+
+int WifiNetwork::getType() const{
+ return this->type;
+}
+
+QVector & WifiNetwork::getSupportedAlice(){
+ return this->supportedAlice;
+}
+
+bool WifiNetwork::isSupported() const{
+ return this->supported && !this->newThomson;
+}
+
+bool WifiNetwork::ssidFilter(){
+ if ( ( ssid.count(QRegExp("[a-fA-F0-9]{6}")) == 1) && (
+ ssid.startsWith("Thomson") || ssid.startsWith("SpeedTouch") ||
+ ssid.startsWith("O2Wireless") || ssid.startsWith("Orange-") ||
+ ssid.startsWith("INFINITUM") || ssid.startsWith("BigPond") ||
+ ssid.startsWith("Otenet") || ssid.startsWith("Bbox-") ||
+ ssid.startsWith("DMAX") || ssid.startsWith("privat") ||
+ ssid.startsWith("TN_private_") || ssid.startsWith("Cyta") ) )
+ {
+ ssidSubpart = ssid.right(6);
+ if ( !mac.isEmpty() )
+ if ( ssidSubpart == getMac().right(6) )
+ newThomson = true;
+ type = THOMSON;
+ return true;
+ }
+ if ( ( ssid.count(QRegExp("DLink-[a-fA-F0-9]{6}")) == 1) && ( ssid.size() == 12 ) )
+ {
+ ssidSubpart = ssid.right(6);
+ type = DLINK;
+ return true;
+ }
+ if ( ssid.count(QRegExp("Discus--?[0-9a-fA-F]{6}")) == 1)
+ {
+ ssidSubpart = ssid.right(6);
+ type = DISCUS;
+ return true;
+ }
+ if ( (ssid.count(QRegExp("eircom[0-7]{4} [0-7]{4}")) == 1 )||
+ (ssid.count(QRegExp("eircom[0-7]{8}")) == 1))
+ {
+ if ( ssid.size() == 14 )
+ ssidSubpart = ssid.right(8);
+ else
+ ssidSubpart = ssid.mid(6,4) + ssid.right(4);
+ if ( mac.isEmpty() )
+ calcEircomMAC();
+ type = EIRCOM;
+ return true;
+ }
+ if ( ssid.size() == 5 &&
+ ( mac.startsWith("00:1F:90") || mac.startsWith("A8:39:44") ||
+ mac.startsWith("00:18:01") || mac.startsWith("00:20:E0") ||
+ mac.startsWith("00:0F:B3") || mac.startsWith("00:1E:A7") ||
+ mac.startsWith("00:15:05") || mac.startsWith("00:24:7B") ||
+ mac.startsWith("00:26:62") || mac.startsWith("00:26:B8") ) )
+ {
+ ssidSubpart = ssid;
+ type = VERIZON;
+ return true;
+ }
+ if ( ssid.count(QRegExp("TECOM-AH4021-[0-9a-zA-Z]{6}|TECOM-AH4222-[0-9a-zA-Z]{6}")) == 1 )
+ {
+ ssidSubpart = ssid;
+ type = TECOM;
+ return true;
+ }
+ if ( ( ssid.count(QRegExp("SKY[0-9]{5}"))==1) && (mac.startsWith("C4:3D:C7") ||
+ mac.startsWith("E0:46:9A") || mac.startsWith("E0:91:F5") ||
+ mac.startsWith("00:09:5B") || mac.startsWith("00:0F:B5") ||
+ mac.startsWith("00:14:6C") || mac.startsWith("00:18:4D") ||
+ mac.startsWith("00:26:F2") || mac.startsWith("C0:3F:0E") ||
+ mac.startsWith("30:46:9A") || mac.startsWith("00:1B:2F") ||
+ mac.startsWith("A0:21:B7") || mac.startsWith("00:1E:2A") ||
+ mac.startsWith("00:1F:33") || mac.startsWith("00:22:3F") ||
+ mac.startsWith("00:24:B2") ) )
+ {
+ ssidSubpart = ssid.right(5);
+ type = SKY_V1;
+ return true;
+ }
+ if ( ssid.count(QRegExp("InfostradaWiFi-[0-9a-zA-Z]{6}")) == 1 )
+ {
+ ssidSubpart = ssid;
+ type = INFOSTRADA;
+ return true;
+ }
+ if ( ssid.startsWith("WLAN_") && ssid.length() == 7 &&
+ ( mac.startsWith("00:01:38") || mac.startsWith("00:16:38") ||
+ mac.startsWith("00:01:13") || mac.startsWith("00:01:1B") ||
+ mac.startsWith("00:19:5B") ) )
+ {
+ ssidSubpart = ssid.right(2);
+ type = WLAN2;
+ return true;
+ }
+ if ( ( ssid.count(QRegExp("WLAN_[0-9a-zA-Z]{4}|JAZZTEL_[0-9a-zA-Z]{4}")) == 1 ) &&
+ ( mac.startsWith("00:1F:A4") || mac.startsWith("64:68:0C") ||
+ mac.startsWith("00:1D:20") ) )
+ {
+ ssidSubpart = ssid.right(4);
+ type = WLAN4;
+ return true;
+ }
+ if ( ssid.count(QRegExp("WLAN[0-9a-zA-Z]{6}|WiFi[0-9a-zA-Z]{6}|YaCom[0-9a-zA-Z]{6}")) == 1 )
+ {
+ ssidSubpart = ssid.right(6);
+ type = WLAN6;
+ return true;
+ }
+ if ( ( ssid.toUpper().startsWith("FASTWEB-1-000827") && ssid.length() == 22 ) ||
+ ( ssid.toUpper().startsWith("FASTWEB-1-0013C8") && ssid.length() == 22 ) ||
+ ( ssid.toUpper().startsWith("FASTWEB-1-0017C2") && ssid.length() == 22 ) ||
+ ( ssid.toUpper().startsWith("FASTWEB-1-00193E") && ssid.length() == 22 ) ||
+ ( ssid.toUpper().startsWith("FASTWEB-1-001CA2") && ssid.length() == 22 ) ||
+ ( ssid.toUpper().startsWith("FASTWEB-1-001D8B") && ssid.length() == 22 ) ||
+ ( ssid.toUpper().startsWith("FASTWEB-1-002233") && ssid.length() == 22 ) ||
+ ( ssid.toUpper().startsWith("FASTWEB-1-00238E") && ssid.length() == 22 ) ||
+ ( ssid.toUpper().startsWith("FASTWEB-1-002553") && ssid.length() == 22 ) ||
+ ( ssid.toUpper().startsWith("FASTWEB-1-00A02F") && ssid.length() == 22 ) ||
+ ( ssid.toUpper().startsWith("FASTWEB-1-080018") && ssid.length() == 22 ) ||
+ ( ssid.toUpper().startsWith("FASTWEB-1-3039F2") && ssid.length() == 22 ) ||
+ ( ssid.toUpper().startsWith("FASTWEB-1-38229D") && ssid.length() == 22 ) ||
+ ( ssid.toUpper().startsWith("FASTWEB-1-6487D7") && ssid.length() == 22 ))
+ {
+ ssidSubpart = ssid.right(12);
+ if ( mac == "" )
+ calcFastwebMAC();
+ type = PIRELLI;
+ return true;
+ }
+ if ( ssid.count(QRegExp("FASTWEB-[1-2]-002196[0-9a-fA-F]{6}|FASTWEB-[1-2]-00036F[0-9a-fA-F]{6}")) == 1 )
+ {
+ ssidSubpart = ssid.right(12);
+ if ( mac == "" )
+ calcFastwebMAC();
+ type = TELSEY;
+ return true;
+ }
+ /*ssid must be of the form P1XXXXXX0000X or p1XXXXXX0000X*/
+ if ( ssid.count(QRegExp("[Pp]1[0-9]{6}0{4}[0-9]")) == 1 )
+ {
+ ssidSubpart = "";
+ type = ONO_WEP;
+ return true;
+ }
+ if ( ( ssid.count(QRegExp("INFINITUM[0-9a-zA-Z]{4}")) == 1 ) && (
+ mac.startsWith("00:25:9E") || mac.startsWith("00:25:68") ||
+ mac.startsWith("00:22:A1") || mac.startsWith("00:1E:10") ||
+ mac.startsWith("00:18:82") || mac.startsWith("00:0F:F2") ||
+ mac.startsWith("00:E0:FC") || mac.startsWith("28:6E:D4") ||
+ mac.startsWith("54:A5:1B") || mac.startsWith("F4:C7:14") ||
+ mac.startsWith("28:5F:DB") || mac.startsWith("30:87:30") ||
+ mac.startsWith("4C:54:99") || mac.startsWith("40:4D:8E") ||
+ mac.startsWith("64:16:F0") || mac.startsWith("78:1D:BA") ||
+ mac.startsWith("84:A8:E4") || mac.startsWith("04:C0:6F") ||
+ mac.startsWith("5C:4C:A9") || mac.startsWith("1C:1D:67") ||
+ mac.startsWith("CC:96:A0") || mac.startsWith("20:2B:C1") ) )
+ {
+ if ( ssid.startsWith("INFINITUM") )
+ ssidSubpart = ssid.right(4);
+ else
+ ssidSubpart = "";
+ type = HUAWEI;
+ return true;
+ }
+ if ( ssid.count(QRegExp("[aA]lice-[0-9]{8}")) == 1 )
+ {
+ AliceHandler aliceReader(ssid.left(9));
+ aliceReader.readFile(":/alice/alice.xml");
+ ssidSubpart = ssid.right(8);
+ type = ALICE;
+ if( !aliceReader.isSupported() )
+ return false;
+ supportedAlice = aliceReader.getSupportedAlice();
+ if ( getMac().size() < 6 )
+ mac = supportedAlice.at(0)->mac;
+ return true;
+ }
+ return false;
+}
+void WifiNetwork::calcEircomMAC(){
+ QString end;
+ bool status = false;
+ int ssidNum = ssidSubpart.toInt(&status , 8 ) ^ 0x000fcc;
+ end.setNum(ssidNum,16);
+ while ( end.size() < 6 )
+ end = "0" + end;
+ end = end.toUpper();
+ this->mac = "00:0F:CC:" + end.left(2)+ ":" +
+ end.mid(2,2)+ ":" + end.right(2);
+}
+
+void WifiNetwork::calcFastwebMAC(){
+ this->mac = ssidSubpart.left(2) + ":" + ssidSubpart.mid(2,2) + ":" +
+ ssidSubpart.mid(4,2) + ":" + ssidSubpart.mid(6,2) + ":" +
+ ssidSubpart.mid(8,2) + ":" + ssidSubpart.right(2);
+}
diff --git a/qt/wifinetwork.h b/qt/wifinetwork.h
new file mode 100644
index 0000000..7451c01
--- /dev/null
+++ b/qt/wifinetwork.h
@@ -0,0 +1,35 @@
+#ifndef WIFINETWORK_H
+#define WIFINETWORK_H
+#include
+#include "alicehandler.h"
+
+class WifiNetwork
+{
+ private:
+ QString ssid;
+ QString ssidSubpart;
+ QString mac;
+ QVector supportedAlice;
+ bool supported;
+ bool newThomson;
+ bool ssidFilter();
+ int type;
+ void calcEircomMAC();
+ void calcFastwebMAC();
+ public:
+ WifiNetwork(QString ssid , QString mac = "");
+ QString getSSID() const;
+ QString getMac() const;
+ QString getSSIDsubpart() const;
+ int getType() const;
+ bool isSupported() const;
+ QVector & getSupportedAlice();
+ enum SUPPORTED{
+ THOMSON = 0 , DLINK , DISCUS , VERIZON ,
+ EIRCOM , PIRELLI , TELSEY , ALICE ,
+ WLAN4 , HUAWEI, WLAN2 , ONO_WEP ,
+ SKY_V1 , WLAN6 ,TECOM , INFOSTRADA
+ };
+};
+
+#endif // WIFINETWORK_H
diff --git a/qt/wlan2keygen.cpp b/qt/wlan2keygen.cpp
new file mode 100644
index 0000000..801e51c
--- /dev/null
+++ b/qt/wlan2keygen.cpp
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+#include "wlan2keygen.h"
+
+Wlan2Keygen::Wlan2Keygen( WifiNetwork * router ) : KeygenThread(router){}
+
+void Wlan2Keygen::run(){
+ QChar * key = new QChar[26];
+
+ if (router == NULL)
+ return;
+ QString mac = router->getMac();
+
+ if (mac.size() != 12) {
+ //TODO
+ return;
+ }
+
+
+ key[0] = mac.at(10);
+ key[1] = mac.at(11);
+ key[2] = mac.at(0);
+ key[3] = mac.at(1);
+ key[4] = mac.at(8);
+ key[5] = mac.at(9);
+ key[6] = mac.at(2);
+ key[7] = mac.at(3);
+ key[8] = mac.at(4);
+ key[9] = mac.at(5);
+ key[10] = mac.at(6);
+ key[11] = mac.at(7);
+ key[12] = mac.at(10);
+ key[13] = mac.at(11);
+ key[14] = mac.at(8);
+ key[15] = mac.at(9);
+ key[16] = mac.at(2);
+ key[17] = mac.at(3);
+ key[18] = mac.at(4);
+ key[19] = mac.at(5);
+ key[20] = mac.at(6);
+ key[21] = mac.at(7);
+ key[22] = mac.at(0);
+ key[23] = mac.at(1);
+ key[24] = mac.at(4);
+ key[25] = mac.at(5);
+
+ QChar begin = router->getSSIDsubpart().at(1);
+ if ( !begin.isDigit()) {
+ QString cadena(key, 2);
+ bool test;
+ int value =QString::fromRawData(key ,2).toInt(&test, 16);
+ if (!test)
+ {
+ return;
+ }
+ value--;
+ cadena.setNum(value,16);
+ if ( cadena.size() < 2 )
+ cadena = "0" + cadena;
+ key[0]=cadena.at(0);
+ key[1]=cadena.at(1);
+ }
+
+ results.append(QString::fromRawData(key, 26));
+ return;
+}
diff --git a/qt/wlan2keygen.h b/qt/wlan2keygen.h
new file mode 100644
index 0000000..5b0ecc1
--- /dev/null
+++ b/qt/wlan2keygen.h
@@ -0,0 +1,12 @@
+#ifndef WLAN2KEYGEN_H
+#define WLAN2KEYGEN_H
+#include "keygenthread.h"
+
+class Wlan2Keygen : public KeygenThread
+{
+ public:
+ Wlan2Keygen( WifiNetwork * router );
+ void run();
+};
+
+#endif // WLAN2KEYGEN_H
diff --git a/qt/wlan4keygen.cpp b/qt/wlan4keygen.cpp
new file mode 100644
index 0000000..ac59cb9
--- /dev/null
+++ b/qt/wlan4keygen.cpp
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+#include "wlan4keygen.h"
+
+Wlan4Keygen::Wlan4Keygen( WifiNetwork * router ) : KeygenThread(router) ,
+ magic("bcgbghgg"){
+ this->hash = new QCryptographicHash(QCryptographicHash::Md5);
+}
+
+void Wlan4Keygen::run(){
+ if ( router == NULL)
+ return;
+ if ( router->getMac().size() != 12 )
+ {
+ //TODO:error messages
+ return;
+ }
+ this->hash->reset();
+ if (!router->getMac().startsWith("001FA4"))
+ this->hash->addData(magic.toAscii());
+ QString macMod = router->getMac().left(8) + router->getSSIDsubpart();
+ if (!router->getMac().startsWith("001FA4"))
+ this->hash->addData(macMod.toUpper().toAscii());
+ else
+ this->hash->addData(macMod.toLower().toAscii());
+ if (!router->getMac().startsWith("001FA4"))
+ this->hash->addData(router->getMac().toAscii());
+ QString result = QString::fromAscii(this->hash->result().toHex().data());
+ result.truncate(20);
+ if (!router->getMac().startsWith("001FA4"))
+ this->results.append(result);
+ else
+ this->results.append(result.toUpper());
+ if ( stopRequested )
+ return;
+}
diff --git a/qt/wlan4keygen.h b/qt/wlan4keygen.h
new file mode 100644
index 0000000..4ec9458
--- /dev/null
+++ b/qt/wlan4keygen.h
@@ -0,0 +1,14 @@
+#ifndef WLAN4KEYGEN_H
+#define WLAN4KEYGEN_H
+#include "keygenthread.h"
+
+class Wlan4Keygen : public KeygenThread
+{
+ private:
+ QString magic;
+ public:
+ Wlan4Keygen( WifiNetwork * router );
+ void run();
+};
+
+#endif // WLAN4KEYGEN_H
diff --git a/qt/wlan6keygen.cpp b/qt/wlan6keygen.cpp
new file mode 100644
index 0000000..201ccaa
--- /dev/null
+++ b/qt/wlan6keygen.cpp
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+#include "wlan6keygen.h"
+
+Wlan6Keygen::Wlan6Keygen( WifiNetwork * router ) : KeygenThread(router) {}
+
+void Wlan6Keygen::run(){
+ if ( router == NULL )
+ return;
+ if ( router->getMac() == "" )
+ {
+ //TODO
+ return;
+ }
+ QString ssidStr = router->getSSIDsubpart();
+ QString macStr = router->getMac().right(2);
+ char ssidSubPart[] = {'1', '2','3', '4', '5','6' };/*These values are not revelant.*/
+ char bssidLastByte[] = { '6', '6' };
+ ssidSubPart[0] = ssidStr.at(0).toAscii();
+ ssidSubPart[1] = ssidStr.at(1).toAscii();
+ ssidSubPart[2] = ssidStr.at(2).toAscii();
+ ssidSubPart[3] = ssidStr.at(3).toAscii();
+ ssidSubPart[4] = ssidStr.at(4).toAscii();
+ ssidSubPart[5] = ssidStr.at(5).toAscii();
+ bssidLastByte[0] = macStr.at(0).toAscii();
+ bssidLastByte[1] = macStr.at(1).toAscii();
+ for ( int k = 0; k < 6 ; ++k )
+ if( ssidSubPart[k] >= 'A')
+ ssidSubPart[k] = (char)(ssidSubPart[k] - 55);
+
+ if(bssidLastByte[0] >= 'A' )
+ bssidLastByte[0] = (char)(bssidLastByte[0] - 55);
+ if(bssidLastByte[1] >= 'A' )
+ bssidLastByte[1] = (char)(bssidLastByte[1] - 55);
+
+ int bytes[13];
+ for ( int i = 0; i < 10 ; ++i )
+ {
+ /*Do not change the order of this instructions*/
+ int aux = i + ( ssidSubPart[3] & 0xf ) + ( bssidLastByte[0] & 0xf ) + ( bssidLastByte[1] & 0xf );
+ int aux1 = ( ssidSubPart[1] & 0xf ) + ( ssidSubPart[2] & 0xf ) + ( ssidSubPart[4] & 0xf ) + ( ssidSubPart[5] & 0xf );
+ bytes[1] = aux ^ ( ssidSubPart[5] & 0xf );
+ bytes[5] = aux ^ ( ssidSubPart[4] & 0xf );
+ bytes[9] = aux ^ ( ssidSubPart[3] & 0xf );
+ bytes[2] = aux1 ^ ( ssidSubPart[2] & 0xf );
+ bytes[6] = aux1 ^ ( bssidLastByte[0] & 0xf );
+ bytes[10] = aux1 ^ ( bssidLastByte[1] & 0xf );
+ bytes[3] = ( bssidLastByte[0] & 0xf ) ^ ( ssidSubPart[5] & 0xf );
+ bytes[7] = ( bssidLastByte[1] & 0xf ) ^ ( ssidSubPart[4] & 0xf );
+ bytes[11] = aux ^ aux1;
+ bytes[4] = bytes[1] ^ bytes[7];
+ bytes[8] = bytes[6] ^ bytes[10];
+ bytes[12] = bytes[2] ^ bytes[9];
+ bytes[0] = bytes[11] ^ bytes[5];
+ QString key = "", tmp = "";
+ for ( int j = 0 ; j < 13 ; ++j )
+ {
+ tmp.setNum(bytes[j] & 0xf ,16);
+ key += tmp;
+ }
+ results.append(key.toUpper());
+ }
+ //TODO:consistency check
+ return;
+}
diff --git a/qt/wlan6keygen.h b/qt/wlan6keygen.h
new file mode 100644
index 0000000..a39f6bd
--- /dev/null
+++ b/qt/wlan6keygen.h
@@ -0,0 +1,12 @@
+#ifndef WLAN6KEYGEN_H
+#define WLAN6KEYGEN_H
+#include "keygenthread.h"
+
+class Wlan6Keygen : public KeygenThread
+{
+ public:
+ Wlan6Keygen( WifiNetwork * router);
+ void run();
+};
+
+#endif // WLAN6KEYGEN_H
diff --git a/thomsonDicGenerator/.classpath b/thomsonDicGenerator/.classpath
new file mode 100644
index 0000000..9b07da8
--- /dev/null
+++ b/thomsonDicGenerator/.classpath
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/thomsonDicGenerator/.project b/thomsonDicGenerator/.project
new file mode 100644
index 0000000..100a1e0
--- /dev/null
+++ b/thomsonDicGenerator/.project
@@ -0,0 +1,17 @@
+
+
+ thomsonDicGenerator
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+
+ org.eclipse.jdt.core.javanature
+
+
diff --git a/thomsonDicGenerator/src/org/exobel/routerkeygen/thomsonGenerator/AlphabetCodes.java b/thomsonDicGenerator/src/org/exobel/routerkeygen/thomsonGenerator/AlphabetCodes.java
new file mode 100644
index 0000000..b3870f5
--- /dev/null
+++ b/thomsonDicGenerator/src/org/exobel/routerkeygen/thomsonGenerator/AlphabetCodes.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+package org.exobel.routerkeygen.thomsonGenerator;
+
+import java.io.UnsupportedEncodingException;
+
+public class AlphabetCodes {
+
+
+ static final byte[] HEX_CHAR_TABLE = {
+ (byte)'0', (byte)'1', (byte)'2', (byte)'3',
+ (byte)'4', (byte)'5', (byte)'6', (byte)'7',
+ (byte)'8', (byte)'9', (byte)'a', (byte)'b',
+ (byte)'c', (byte)'d', (byte)'e', (byte)'f'
+ };
+
+ public static String getHexString(byte[] raw)
+ throws UnsupportedEncodingException
+ {
+ byte[] hex = new byte[2 * raw.length];
+ int index = 0;
+
+ for (byte b : raw) {
+ int v = b & 0xFF;
+ hex[index++] = HEX_CHAR_TABLE[v >>> 4];
+ hex[index++] = HEX_CHAR_TABLE[v & 0xF];
+ }
+ return new String(hex, "ASCII");
+ }
+
+ public static String getHexString(byte raw)
+ throws UnsupportedEncodingException
+ {
+ byte[] hex = new byte[2];
+ int v = raw & 0xFF;
+ hex[0] = HEX_CHAR_TABLE[v >>> 4];
+ hex[1] = HEX_CHAR_TABLE[v & 0xF];
+ return new String(hex, "ASCII");
+ }
+
+ public static String getHexString(short raw)
+ throws UnsupportedEncodingException
+ {
+ byte[] hex = new byte[2];
+ int v = raw & 0xFF;
+ hex[0] = HEX_CHAR_TABLE[v >>> 4];
+ hex[1] = HEX_CHAR_TABLE[v & 0xF];
+ return new String(hex, "ASCII");
+ }
+
+
+ public static String getHexString(short[] raw)
+ throws UnsupportedEncodingException
+ {
+ byte[] hex = new byte[2 * raw.length];
+ int index = 0;
+
+ for (short b : raw) {
+ int v = b & 0xFF;
+ hex[index++] = HEX_CHAR_TABLE[v >>> 4];
+ hex[index++] = HEX_CHAR_TABLE[v & 0xF];
+ }
+ return new String(hex, "ASCII");
+ }
+
+ static final String charect[] = {
+ "0", "1", "2", "3",
+ "4", "5", "6", "7",
+ "8", "9", "a", "b",
+ "c", "d", "e", "f",
+ };
+
+ static final int charectCode[] = {
+ 0, 1, 2, 3,
+ 4, 5, 6, 7,
+ 8, 9, 10, 11,
+ 12, 13, 14, 15,
+ };
+
+ static final byte[][] charectbytes = {
+ new byte[]{ '3', '0'},
+ new byte[]{ '3', '1'},
+ new byte[]{ '3', '2'},
+ new byte[]{ '3', '3'},
+ new byte[]{ '3', '4'},
+ new byte[]{ '3', '5'},
+ new byte[]{ '3', '6'},
+ new byte[]{ '3', '7'},
+ new byte[]{ '3', '8'},
+ new byte[]{ '3', '9'},
+ new byte[]{ '4', '1'},
+ new byte[]{ '4', '2'},
+ new byte[]{ '4', '3'},
+ new byte[]{ '4', '4'},
+ new byte[]{ '4', '5'},
+ new byte[]{ '4', '6'},
+ new byte[]{ '4', '7'},
+ new byte[]{ '4', '8'},
+ new byte[]{ '4', '9'},
+ new byte[]{ '4', 'A'},
+ new byte[]{ '4', 'B'},
+ new byte[]{ '4', 'C'},
+ new byte[]{ '4', 'D'},
+ new byte[]{ '4', 'E'},
+ new byte[]{ '4', 'F'},
+ new byte[]{ '5', '0'},
+ new byte[]{ '5', '1'},
+ new byte[]{ '5', '2'},
+ new byte[]{ '5', '3'},
+ new byte[]{ '5', '4'},
+ new byte[]{ '5', '5'},
+ new byte[]{ '5', '6'},
+ new byte[]{ '5', '7'},
+ new byte[]{ '5', '8'},
+ new byte[]{ '5', '9'},
+ new byte[]{ '5', 'A'},
+ };
+}
\ No newline at end of file
diff --git a/thomsonDicGenerator/src/org/exobel/routerkeygen/thomsonGenerator/EntryTable.java b/thomsonDicGenerator/src/org/exobel/routerkeygen/thomsonGenerator/EntryTable.java
new file mode 100644
index 0000000..7b67a44
--- /dev/null
+++ b/thomsonDicGenerator/src/org/exobel/routerkeygen/thomsonGenerator/EntryTable.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+package org.exobel.routerkeygen.thomsonGenerator;
+
+import java.io.UnsupportedEncodingException;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.Map.Entry;
+
+public class EntryTable {
+ Map map;
+ int numBytes;
+ public EntryTable( int numBytes){
+ this.map = new TreeMap();
+ this.numBytes = numBytes;
+ }
+
+ public void addEntry( short secondByte , int offset){
+ map.put(secondByte, offset);
+ }
+
+ public void toFile(byte [] outputData ){
+ Iterator> it = map.entrySet().iterator();
+ Entry entry;
+ int offset = 0;
+ while (it.hasNext()){
+ entry = it.next();
+ if ( numBytes == 3 )
+ {
+ outputData[offset + 0] = (byte) (0xFF & entry.getKey());
+ outputData[offset + 1] = (byte) ( (0xFF0000 & entry.getValue()) >> 16) ;
+ outputData[offset + 2] = (byte) ( (0xFF00 & entry.getValue()) >> 8) ;
+ outputData[offset + 3] =(byte) (0xFF & entry.getValue());
+ offset += 4;
+ }
+ else
+ {
+ outputData[offset + 0] = (byte) (0xFF & entry.getKey());
+ outputData[offset + 1] = (byte) ( (0xFF000000 & entry.getValue()) >> 24) ;
+ outputData[offset + 2] = (byte) ( (0xFF0000 & entry.getValue()) >> 16) ;
+ outputData[offset + 3] = (byte) ( (0xFF00 & entry.getValue()) >> 8) ;
+ outputData[offset + 4] =(byte) (0xFF & entry.getValue());
+ offset += 5;
+ }
+ }
+ }
+
+ public void printAll() throws UnsupportedEncodingException{
+ Iterator> it = map.entrySet().iterator();
+ Entry entry;
+ while (it.hasNext()){
+ entry = it.next();
+ System.out.println(AlphabetCodes.getHexString((byte) (0xFF &entry.getKey())) +
+ ": " + entry.getValue());
+ }
+ }
+
+ public void toWebDic(byte[] outputData) {
+ Iterator> it = map.entrySet().iterator();
+ Entry entry;
+ int offset = 0;
+ while (it.hasNext()){
+ entry = it.next();
+ if ( numBytes == 3 )
+ {
+ outputData[offset + 0] = (byte) ( (0xFF0000 & entry.getValue()) >> 16) ;
+ outputData[offset + 1] = (byte) ( (0xFF00 & entry.getValue()) >> 8) ;
+ outputData[offset + 2] =(byte) (0xFF & entry.getValue());
+ offset += 3;
+ }
+ else
+ {
+ outputData[offset + 0] = (byte) ( (0xFF000000 & entry.getValue()) >> 24) ;
+ outputData[offset + 1] = (byte) ( (0xFF0000 & entry.getValue()) >> 16) ;
+ outputData[offset + 2] = (byte) ( (0xFF00 & entry.getValue()) >> 8) ;
+ outputData[offset + 3] =(byte) (0xFF & entry.getValue());
+ offset += 4;
+ }
+ }
+ }
+}
+
diff --git a/thomsonDicGenerator/src/org/exobel/routerkeygen/thomsonGenerator/FileOutputManager.java b/thomsonDicGenerator/src/org/exobel/routerkeygen/thomsonGenerator/FileOutputManager.java
new file mode 100644
index 0000000..71f47f1
--- /dev/null
+++ b/thomsonDicGenerator/src/org/exobel/routerkeygen/thomsonGenerator/FileOutputManager.java
@@ -0,0 +1,166 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+package org.exobel.routerkeygen.thomsonGenerator;
+
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
+
+public class FileOutputManager {
+ Map filesMap;
+
+ public FileOutputManager(){
+ filesMap = new HashMap();
+ }
+
+ public void initAllFiles(){
+ FileOutput fos;
+ String file = "00.dat";
+ for(int a = 0; a < AlphabetCodes.charect.length; a++)
+ {
+ for(int b = 0; b < AlphabetCodes.charect.length; b++)
+ {
+ file = AlphabetCodes.charect[a] + AlphabetCodes.charect[b] + ".dat";
+ try {
+ fos = new FileOutput( file);
+ filesMap.put(file, fos);
+ } catch (FileNotFoundException e) {
+ System.out.println("Error!" + e);
+ return;
+ }
+ }
+ }
+ }
+
+ public void addFile(String file ){
+ try {
+ FileOutput fos = new FileOutput( file);
+ filesMap.put(file, fos);
+ } catch (FileNotFoundException e) {
+ System.out.println("Error!" + e);
+ return;
+ }
+ }
+
+ public void sendFile(String file , byte [] bytes , int len){
+ if ( !filesMap.containsKey(file) )
+ return;
+
+ try {
+ filesMap.get(file).add(bytes , len);
+ } catch (IOException e) {
+ System.out.println("Error!" + e);
+ return;
+ }
+ }
+
+ public void sendFile(String file , byte [] bytes ){
+ if ( !filesMap.containsKey(file) )
+ return;
+
+ try {
+ filesMap.get(file).add(bytes );
+ } catch (IOException e) {
+ System.out.println("Error!" + e);
+ return;
+ }
+ }
+
+ public void sendFile(String file , byte bytes ){
+ if ( !filesMap.containsKey(file) )
+ return;
+ try {
+ filesMap.get(file).add(bytes);
+ } catch (IOException e) {
+ System.out.println("Error!" + e);
+ return;
+ }
+ }
+
+ public void close(){
+ Iterator> it = filesMap.entrySet().iterator();
+ while (it.hasNext()) {
+ Map.Entry pairs = (Map.Entry)it.next();
+ try {
+ pairs.getValue().close();
+ } catch (IOException e) {
+ System.out.println("Error!" + e);
+ return;
+ }
+ }
+ }
+
+ public void clearAll(){
+ this.filesMap.clear();
+ }
+
+
+ private static class FileOutput{
+ FileOutputStream fos;
+ byte [] buffer;
+ int offset;
+ public FileOutput( String file ) throws FileNotFoundException{
+ fos = new FileOutputStream(file);
+ buffer = new byte[4096];
+ offset = 0;
+ }
+ public void add ( byte [] bytes , int len ) throws IOException{
+ for ( int i = 0 ; i < len ; ++i )
+ {
+ if ( offset >= buffer.length )
+ {
+ fos.write(buffer);
+ offset = 0;
+ }
+ buffer[offset] = bytes[i];
+ offset++;
+ }
+ }
+ public void add ( byte [] bytes ) throws IOException{
+ for ( int i = 0 ; i < bytes.length ; ++i )
+ {
+ if ( offset >= buffer.length )
+ {
+ fos.write(buffer);
+ offset = 0;
+ }
+ buffer[offset] = bytes[i];
+ offset++;
+ }
+ }
+
+ public void add ( byte bytes ) throws IOException{
+ if ( offset >= buffer.length )
+ {
+ fos.write(buffer);
+ offset = 0;
+ }
+ buffer[offset] = bytes;
+ offset++;
+ }
+ public void close() throws IOException{
+ fos.write(buffer, 0 , offset);
+ fos.close();
+ }
+ }
+}
diff --git a/thomsonDicGenerator/src/org/exobel/routerkeygen/thomsonGenerator/Generator.java b/thomsonDicGenerator/src/org/exobel/routerkeygen/thomsonGenerator/Generator.java
new file mode 100644
index 0000000..7b0e385
--- /dev/null
+++ b/thomsonDicGenerator/src/org/exobel/routerkeygen/thomsonGenerator/Generator.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+package org.exobel.routerkeygen.thomsonGenerator;
+
+public class Generator {
+
+ public static void main(String[] args) {
+ Stage1.main(args);
+ Stage2.main(args);
+ Stage3.main(args);
+ Stage4.main(args);
+ Stage5.main(args);
+ System.out.println("Thomson Dictionary created. It's a file named 'RouterKeygen.dic'.");
+ System.out.println("Also it was created a a file named 'RouterKeygen.cfv' which is used for" +
+ " verification when downloading.");
+ System.out.println("The 'webdic.dic' file has informations needed for the Online fetching service.");
+ }
+
+}
diff --git a/thomsonDicGenerator/src/org/exobel/routerkeygen/thomsonGenerator/Stage1.java b/thomsonDicGenerator/src/org/exobel/routerkeygen/thomsonGenerator/Stage1.java
new file mode 100644
index 0000000..9226d65
--- /dev/null
+++ b/thomsonDicGenerator/src/org/exobel/routerkeygen/thomsonGenerator/Stage1.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package org.exobel.routerkeygen.thomsonGenerator;
+
+import java.io.UnsupportedEncodingException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+public class Stage1 {
+ static MessageDigest md;
+ public static void main(String[] args)
+ {
+ FileOutputManager files = new FileOutputManager();
+ files.initAllFiles();
+ try {
+ md = MessageDigest.getInstance("SHA1");
+ } catch (NoSuchAlgorithmException e1) {
+ e1.printStackTrace();
+ }
+
+ long begin = System.currentTimeMillis();
+ byte[] cp = new byte[12];
+ byte[] hash = new byte[19];
+ byte firstByte ;
+ int sequenceNumber = 0;
+ byte [] ret = new byte [5];
+ cp[0] = (byte) (char)'C';
+ cp[1] = (byte) (char)'P';
+ cp[2] = (byte) (char)'0';
+ System.out.println("Stage1");
+ System.out.println("Calculating possibles ESSID's.");
+
+ int offset = 0;
+ for(int w = 1; w <= 52; w++)
+ {
+ cp[4] = (byte) Character.forDigit((w / 10), 10);
+ cp[5] = (byte) Character.forDigit((w % 10), 10);
+ System.out.println("Done .. " + 100*(w-1)/52 + "%");
+
+ if ( ((w-1)%3) == 0 )
+ sequenceNumber = 0;
+ for(int y = 4; y < 13; y++)
+ {
+ cp[3] = (byte) Character.forDigit((y % 10), 10);
+ for(int a = 0; a < AlphabetCodes.charectbytes.length; a++)
+ {
+ cp[6] = AlphabetCodes.charectbytes[a][0];
+ cp[7] = AlphabetCodes.charectbytes[a][1];
+ for(int b = 0; b < AlphabetCodes.charectbytes.length; b++)
+ {
+ cp[8] = AlphabetCodes.charectbytes[b][0];
+ cp[9] = AlphabetCodes.charectbytes[b][1];
+ for(int c = 0; c < AlphabetCodes.charectbytes.length ; c++)
+ {
+ offset += 3;
+ cp[10] = AlphabetCodes.charectbytes[c][0];
+ cp[11] = AlphabetCodes.charectbytes[c][1];
+ md.reset();
+ md.update(cp);
+ hash = md.digest();
+ firstByte = hash[17];
+ ret[0] = hash[18];
+ ret[1] = hash[19];
+ ret[2] = (byte) ( (0xFF0000 & sequenceNumber) >> 16) ;
+ ret[3] = (byte) ( (0xFF00 & sequenceNumber) >> 8) ;
+ ret[4] =(byte) (0xFF & sequenceNumber);
+ sequenceNumber++;
+ try {
+ files.sendFile(AlphabetCodes.getHexString(firstByte)+".dat", ret , 5);
+ } catch (UnsupportedEncodingException e) {}
+ }
+ }
+ }
+ }
+ }
+ files.close();
+ long time = System.currentTimeMillis() - begin;
+ System.out.println("Done .. 100%! It took " + time + " miliseconds.");
+ }
+
+}
\ No newline at end of file
diff --git a/thomsonDicGenerator/src/org/exobel/routerkeygen/thomsonGenerator/Stage2.java b/thomsonDicGenerator/src/org/exobel/routerkeygen/thomsonGenerator/Stage2.java
new file mode 100644
index 0000000..58998f6
--- /dev/null
+++ b/thomsonDicGenerator/src/org/exobel/routerkeygen/thomsonGenerator/Stage2.java
@@ -0,0 +1,176 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+package org.exobel.routerkeygen.thomsonGenerator;
+
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.Stack;
+import java.util.TreeSet;
+
+public class Stage2 {
+ public static void main(String[] args){
+ FileInputStream fis;
+ FileOutputManager files = new FileOutputManager();
+ String file = "56.dat";
+ System.out.println("Stage2");
+ System.out.println("Ordering Entries in the Dictionary");
+ long begin = System.currentTimeMillis();
+ int progress = 0;
+ int c = 0;
+ byte [] fileData = new byte [3000000];
+ Set entries = new TreeSet();
+ for(int a = 0; a < AlphabetCodes.charect.length; a++)
+ {
+ for(int b = 0; b < AlphabetCodes.charect.length; b++, c++)
+ {
+ file = AlphabetCodes.charect[a] + AlphabetCodes.charect[b] + ".dat";
+ try {
+ fis = new FileInputStream(file);
+ } catch (FileNotFoundException e) {
+ System.out.println("Error!" + e);
+ return;
+ }
+ byte [] entry = new byte [5];
+ long count = 0;
+ try {
+ count = fis.read(fileData);
+ fis.close();
+ } catch (IOException e) {
+ System.out.println("Error!" + e);
+ return;
+ }
+ files.addFile(file);
+ int offset = 0;
+ while ( offset < count)
+ {
+ entry[0] = fileData[offset + 0];
+ entry[1] = fileData[offset + 1];
+ entry[2] = fileData[offset + 2];
+ entry[3] = fileData[offset + 3];
+ entry[4] = fileData[offset + 4];
+ entries.add(new DictEntry(entry));
+ offset += 5;
+ }
+ Iterator it = entries.iterator();
+ DictEntry dict_old = it.next(), dict_now ,tmp;
+ Stack pot = new Stack();
+ pot.push(dict_old);
+ int aux1, aux2;
+ while ( it.hasNext() ){
+ dict_now = it.next();
+ if ( dict_old.hash[0] == dict_now.hash[0] )
+ {
+ pot.push(dict_now);
+ }
+ else
+ {
+ aux1 = pot.peek().number;
+ tmp = pot.pop();
+ files.sendFile( file, tmp.toFile() , 5);
+ while ( !pot.empty() )
+ {
+ tmp = pot.pop();
+ aux2 = tmp.number;
+ tmp.number -= aux1;
+ if ( tmp.number > 0xFFFFFF ){
+ System.out.println("OMG");
+ return;
+ }
+ aux1 = aux2;
+ files.sendFile( file, tmp.toFile() , 5);
+ }
+ pot.push(dict_now);
+ }
+ dict_old = dict_now;
+ }
+ aux1 = pot.peek().number;
+ tmp = pot.pop();
+ files.sendFile( file, tmp.toFile() , 5);
+ while ( !pot.empty())
+ {
+ tmp = pot.pop();
+ aux2 = tmp.number;
+ tmp.number -= aux1;
+ if ( tmp.number > 0xFFFFFF ){
+ System.out.println("OMG");
+ return;
+ }
+ aux1 = aux2;
+ files.sendFile( file, tmp.toFile() , 5);
+ }
+
+
+ entries.clear();
+ count /= 5;
+ progress = (c *100)>>8;
+ System.out.println("Counted " + count + " entries in " + file +
+ " Total done: " + progress + "%");
+ }
+ }
+ files.close();
+ long time = System.currentTimeMillis() - begin;
+ System.out.println("Done .. 100%! It took " + time + " miliseconds.");
+ }
+ private static class DictEntry implements Comparable{
+ short [] hash;
+ int number;
+
+ public DictEntry(byte [] entry ){
+ hash = new short [2];
+ hash[0] = (short) (0xFF & entry[0]);
+ hash[1] = (short) (0xFF & entry[1]);
+ number = ( (0xFF & entry[2]) << 16 ) |
+ ( (0xFF & entry[3]) << 8 ) |
+ (0xFF & entry[4]) ;
+
+ }
+
+ @Override
+ public int compareTo(DictEntry o) {
+ if ( this.hash[0] > o.hash[0] )
+ return 1;
+ if ( this.hash[0] == o.hash[0] && this.number < o.number )
+ return 1;
+ return -1;
+ }
+
+ public String toString(){
+ try {
+ return AlphabetCodes.getHexString(hash) + " " + number;
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ }
+ return "null";
+ }
+
+ public byte [] toFile(){
+ byte [] entry = new byte [5];
+ entry[0] = (byte) (0xFF & hash[0]);
+ entry[1] = (byte) (0xFF & hash[1]);
+ entry[2] = (byte) ( (0xFF0000 & number) >> 16) ;
+ entry[3] = (byte) ( (0xFF00 & number) >> 8) ;
+ entry[4] =(byte) (0xFF & number);
+ return entry;
+ }
+ }
+}
diff --git a/thomsonDicGenerator/src/org/exobel/routerkeygen/thomsonGenerator/Stage3.java b/thomsonDicGenerator/src/org/exobel/routerkeygen/thomsonGenerator/Stage3.java
new file mode 100644
index 0000000..27f6124
--- /dev/null
+++ b/thomsonDicGenerator/src/org/exobel/routerkeygen/thomsonGenerator/Stage3.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+package org.exobel.routerkeygen.thomsonGenerator;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+
+
+
+public class Stage3 {
+
+ public static void main(String[] args) {
+ FileInputStream fis;
+ FileOutputManager files = new FileOutputManager();
+ EntryTable entry = new EntryTable(3);
+ System.out.println("Stage3");
+ System.out.println("Creating secondary tables.");
+ long begin = System.currentTimeMillis();
+ String fileName = "56.dat";
+ int progress = 0;
+ int c = 0;
+ byte [] fileData = new byte [300000];
+ byte [] outputData = new byte [300000];
+ byte [] webDicTable = new byte[768];
+ RandomAccessFile webDicIndex = null;
+ try {
+ File webDic = new File("webdic.dic");
+ webDic.delete();
+ webDic.createNewFile();
+ webDicIndex = new RandomAccessFile(webDic, "rw");
+ webDicIndex.setLength(1024 + 256 * 768);
+ webDicIndex.seek(1024);
+ } catch (FileNotFoundException e1) {
+ e1.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ for(int a = 0; a < AlphabetCodes.charect.length; a++)
+ {
+ for(int b = 0; b < AlphabetCodes.charect.length; b++ , c++)
+ {
+ fileName = AlphabetCodes.charect[a] + AlphabetCodes.charect[b] + ".dat";
+ try {
+ fis = new FileInputStream(fileName);
+ } catch (FileNotFoundException e) {
+ System.out.println("Error!" + e);
+ return;
+ }
+ int count = 0;
+
+ try {
+ count = fis.read(fileData);
+ fis.close();
+ files.addFile(fileName);
+ } catch (IOException e) {
+ System.out.println("Error!" + e);
+ return;
+ }
+ byte currentEntry;
+ byte tmp;
+ int offset= 0;
+ int address = 1024;//size of the table
+ //1024 = 256 * ( 1 + 3)
+ // 1byte for header and 3 for address
+ currentEntry = fileData[offset + 0];
+ entry.addEntry((short) (0xFF & currentEntry), address );
+ outputData[address + 0] = fileData[offset + 2];
+ outputData[address + 1] = fileData[offset + 3];
+ outputData[address + 2] = fileData[offset + 4];
+ address += 3;
+ offset += 5;
+ while (offset < count ){
+ tmp = fileData[offset + 0];
+ if ( tmp != currentEntry )
+ {
+ currentEntry = tmp;
+ entry.addEntry((short) (0xFF & currentEntry), address );
+ }
+ outputData[address + 0] = fileData[offset + 2];
+ outputData[address + 1] = fileData[offset + 3];
+ outputData[address + 2] = fileData[offset + 4];
+ offset += 5;
+ address += 3;
+ }
+ entry.toFile(outputData);
+ entry.toWebDic(webDicTable);
+ files.sendFile(fileName, outputData , address);
+ try {
+ webDicIndex.write(webDicTable);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ progress = (c *100)>>8;
+ System.out.println("File " + fileName + " processed " +
+ " Total done: " + progress + "% " );
+ }
+ }
+ files.close();
+ long time = System.currentTimeMillis() - begin;
+ System.out.println("Done .. 100%! It took " + time + " miliseconds.");
+ }
+}
diff --git a/thomsonDicGenerator/src/org/exobel/routerkeygen/thomsonGenerator/Stage4.java b/thomsonDicGenerator/src/org/exobel/routerkeygen/thomsonGenerator/Stage4.java
new file mode 100644
index 0000000..324082b
--- /dev/null
+++ b/thomsonDicGenerator/src/org/exobel/routerkeygen/thomsonGenerator/Stage4.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+package org.exobel.routerkeygen.thomsonGenerator;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+
+public class Stage4 {
+
+ /*
+ * Version 1 - Initial dictionary of 55.8 MB ( downloaded 740 times )
+ * Version 2 - Second version with 41.9 MB
+ * Version 3 - Third version with 28.0 MB
+ */
+ static final byte [] version = { 0, 3};
+ public static void main(String[] args) {
+ FileInputStream fis;
+ EntryTable entry = new EntryTable(4);
+ System.out.println("Stage4");
+ System.out.println("Creating main table and assembling the final file.");
+ long begin = System.currentTimeMillis();
+ String fileName = "56.dat";
+ int progress = 0;
+ int c = 0;
+ short firstByte;
+ byte [] fileData = new byte [300000];
+ byte [] table = new byte[1280];
+ RandomAccessFile webDicIndex = null;
+ try {
+ File webDic = new File("webdic.dic");
+ webDic.createNewFile();
+ webDicIndex = new RandomAccessFile(webDic, "rw");
+ webDicIndex.setLength(1024 + 256 * 768);
+ } catch (FileNotFoundException e1) {
+ e1.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ //size of the table
+ //1282 = 256 * ( 1 + 4) + 2
+ // 1byte for header and 4 for address. 2bytes for dictionary version control
+ int address = 1282;
+ for(int a = 0; a < AlphabetCodes.charect.length; a++)
+ {
+ for(int b = 0; b < AlphabetCodes.charect.length; b++)
+ {
+ fileName = AlphabetCodes.charect[a] + AlphabetCodes.charect[b] + ".dat";
+ firstByte = (short) (( AlphabetCodes.charectCode[a] << 4 ) | AlphabetCodes.charectCode[b]);
+ entry.addEntry(firstByte, address);
+ File fileDat;
+ try {
+ fileDat = new File(fileName);
+ fis = new FileInputStream(fileDat);
+ } catch (FileNotFoundException e) {
+ System.out.println("Error!" + e);
+ return;
+ }
+ int count = 0;
+
+ try {
+ fileDat.deleteOnExit();
+ count = fis.read(fileData);
+ fis.close();
+ } catch (IOException e) {
+ System.out.println("Error!" + e);
+ return;
+ }
+ if ( count == -1 )
+ {
+ System.out.println("Error while reading " + fileName + "!");
+ return;
+ }
+ address +=count;
+ }
+ }
+ FileOutputStream fos;
+ try {
+ fos = new FileOutputStream("RouterKeygen.dic");
+ fos.write(version);
+ entry.toFile(table);
+ fos.write(table);
+ entry.toWebDic( table );
+ webDicIndex.write(table , 0 , 1024);
+ webDicIndex.close();
+ } catch (Exception e) {
+ System.out.println("Error!" + e.getMessage());
+ return;
+ }
+
+ System.out.println("Initial table finished. Assembling in a single file!");
+ for(int a = 0; a < AlphabetCodes.charect.length; a++)
+ {
+ for(int b = 0; b < AlphabetCodes.charect.length; b++ , c++)
+ {
+ fileName = AlphabetCodes.charect[a] + AlphabetCodes.charect[b] + ".dat";
+ try {
+ fis = new FileInputStream(fileName);
+ int count = 0;
+ count = fis.read(fileData);
+ fis.close();
+ if ( count == -1 )
+ {
+ System.out.println("Error while reading " + fileName + "!");
+ return;
+ }
+ fos.write(fileData , 0 , count);
+ progress = (c *100)>>8;
+ System.out.println("File " + fileName + " processed " +
+ " Total done: " + progress + "% " );
+ } catch (IOException e) {
+ System.out.println("Error!" + e);
+ return;
+ }
+ }
+ }
+ try {
+ fos.close();
+ } catch (IOException e) {
+ System.out.println("Error!" + e);
+ return;
+ }
+ long time = System.currentTimeMillis() - begin;
+ System.out.println("Done .. 100%! It took " + time + " miliseconds.");
+ }
+
+}
diff --git a/thomsonDicGenerator/src/org/exobel/routerkeygen/thomsonGenerator/Stage5.java b/thomsonDicGenerator/src/org/exobel/routerkeygen/thomsonGenerator/Stage5.java
new file mode 100644
index 0000000..79a7962
--- /dev/null
+++ b/thomsonDicGenerator/src/org/exobel/routerkeygen/thomsonGenerator/Stage5.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2012 Rui Araújo, Luís Fonseca
+ *
+ * This file is part of Router Keygen.
+ *
+ * Router Keygen is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Router Keygen is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Router Keygen. If not, see .
+ */
+package org.exobel.routerkeygen.thomsonGenerator;
+
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.security.DigestInputStream;
+import java.security.MessageDigest;
+
+
+public class Stage5 {
+ public static void main(String[] args) {
+ System.out.println("Stage5");
+ System.out.println("Creating Complex File Verification (cfv).");
+ try {
+ MessageDigest md = MessageDigest.getInstance("MD5");
+
+ InputStream is = new FileInputStream("RouterKeygen.dic");
+ is = new DigestInputStream(is, md);
+ byte [] buffer = new byte [16384] ;
+ while ( is.read ( buffer ) != -1 );
+
+ byte[] digest = md.digest();
+ is.close();
+
+ FileOutputStream fos = new FileOutputStream("RouterKeygen.cfv");
+ fos.write(new byte[]{0, 3});
+ fos.write(digest);
+ fos.close();
+ }
+ catch(Exception e)
+ {
+ System.out.println("Error!" + e.getMessage());
+ return;
+ }
+ System.out.println("Done.");
+ }
+
+}