JPP: Split lehmer endian and added space guide navigation dial slugs
All checks were successful
Run test asserts / Test-Asserts (push) Successful in 1m23s
All checks were successful
Run test asserts / Test-Asserts (push) Successful in 1m23s
This commit is contained in:
parent
0e0b107094
commit
fc90187bcf
10 changed files with 304 additions and 153 deletions
|
|
@ -35,6 +35,8 @@ import java.util.List;
|
|||
import love.distributedrebirth.nx01.kode.generator.KodeGenModel;
|
||||
import love.distributedrebirth.nx01.kode.generator.klass.ModelKlass;
|
||||
import love.distributedrebirth.nx01.kode.generator.klass.ModelKlassWriter;
|
||||
import ᒢᣘᐧᐧ.ᑊᑉᣔᣔᔆ.ᒻᣔᣕᒄ.KaasLandGenerated注;
|
||||
import ᒢᣘᐧᐧ.ᣕᓫᐪᑋᓫᣗ.ᐪᐤᣕᓫ.NetherToneGuide;
|
||||
import ᒢᣘᐧᐧ.ᣕᓫᐪᑋᓫᣗ.ᐪᐤᣕᓫ.NetherToneSlugView;
|
||||
|
||||
/// Generated the nether dial interface tree forest.
|
||||
|
|
@ -52,12 +54,14 @@ public class ModelDial implements KodeGenModel {
|
|||
|
||||
@Override
|
||||
public String generatorModelHash() {
|
||||
return "5";
|
||||
return "6";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void buildModels(ModelKlassWriter writer) throws IOException {
|
||||
generateLehmer(writer);
|
||||
List<NetherSlugLehmer> models = generateLehmerModels();
|
||||
printLehmerSequences(writer, models);
|
||||
printLehmerEndian(writer, models);
|
||||
|
||||
//generateUnicode
|
||||
//generateFC18
|
||||
|
|
@ -72,20 +76,159 @@ public class ModelDial implements KodeGenModel {
|
|||
buildModuleInfo(writer);
|
||||
}
|
||||
|
||||
private static final int LEHMER_AG1 = 32; // sage master system version space 0x20
|
||||
private static final int LEHMER_AG2 = 33; // No2Lingua sub space
|
||||
private static final int LEHMER_AG3_16 = 16; // Up to size 16
|
||||
private static final int LEHMER_AG3_17 = 17; // size 17
|
||||
private static final int LEHMER_AG3_18 = 18; // size 18
|
||||
private void buildModuleInfo(ModelKlassWriter writer) {
|
||||
ModelKlass klass = new ModelKlass("", "module-info");
|
||||
klass.addJavaDescription("The nether dial packs tree slug index.");
|
||||
writer.addModelKlass(klass);
|
||||
StringBuilder buf = klass.getBody();
|
||||
buf.append("module ᣕᕁᐤᣳ.ᒢᣘᐧᐧ.ᣕᓫᐪᑋᓫᣗ.ᒄᑊᣔᒻ {\n");
|
||||
buf.append("\trequires transitive ᣕᕁᐤᣳ.ᒢᣘᐧᐧ.ᣕᓫᐪᑋᓫᣗ.ᐪᐤᣕᓫ;\n");
|
||||
//buf.append("\trequires transitive ᣕᕁᐤᣳ.ᒢᣘᐧᐧ.ᑊᑉᣔᣔᔆ;\n");
|
||||
buf.append("\t\n");
|
||||
buf.append("\texports " + BASE_PACK + ".ᒻᓫᑋᔿᓫᣗ;\n");
|
||||
buf.append("}\n");
|
||||
}
|
||||
|
||||
private void generateLehmer(ModelKlassWriter writer) {
|
||||
private void printLehmerSequences(ModelKlassWriter writer, List<NetherSlugLehmer> models) {
|
||||
for (NetherSlugLehmer model : models) {
|
||||
if (model.sequences.length == 0) {
|
||||
continue;
|
||||
}
|
||||
String sizeStr = String.format("%02d", model.size());
|
||||
String javaName = "DialCodeLehmer" + sizeStr;
|
||||
ModelKlass klass = new ModelKlass(BASE_PACK + ".ᒻᓫᑋᔿᓫᣗ" , javaName);
|
||||
List<Class<?>> tones = model.identityEndianLittle().toNetherTones();
|
||||
klass.addJavaImports(tones.subList(3, tones.size()));
|
||||
klass.addJavaImport(NetherToneGuide.class.getName() + ".SpaceGuideSageNX01Lehmer16");
|
||||
klass.addJavaDescription("Lehmer code unique sequence index number sets.");
|
||||
klass.setJavaDocAuthor("Lehmer");
|
||||
klass.addJavaAnno(KaasLandGenerated注.class, "generator = \"model-dial\"");
|
||||
writer.addModelKlass(klass);
|
||||
StringBuilder buf = klass.getBody();
|
||||
buf.append("public sealed interface ");
|
||||
buf.append(javaName);
|
||||
buf.append(" extends SpaceGuideSageNX01Lehmer16, ");
|
||||
for (Iterator<Class<?>> i = tones.subList(3, 4).iterator(); i.hasNext() ;) {
|
||||
Class<?> toneClass = i.next();
|
||||
buf.append(toneClass.getDeclaringClass().getSimpleName());
|
||||
buf.append(".");
|
||||
buf.append(toneClass.getSimpleName());
|
||||
if (i.hasNext()) {
|
||||
buf.append(", ");
|
||||
}
|
||||
}
|
||||
buf.append(" {\n");
|
||||
for (NetherToneSlugView sequnceIndex : model.sequences()) {
|
||||
String slugName = "ᐊ" + sequnceIndex.toNúmero2Lingua() + "ᐅ";
|
||||
buf.append("\tnon-sealed interface ");
|
||||
buf.append(slugName);
|
||||
buf.append("\n");
|
||||
buf.append("\t\t\textends ");
|
||||
buf.append(javaName);
|
||||
buf.append(", ");
|
||||
tones =sequnceIndex.toNetherTones();
|
||||
for (Iterator<Class<?>> i = tones.subList(4, tones.size()).iterator(); i.hasNext() ;) {
|
||||
Class<?> toneClass = i.next();
|
||||
buf.append(toneClass.getDeclaringClass().getSimpleName());
|
||||
buf.append(".");
|
||||
buf.append(toneClass.getSimpleName());
|
||||
if (i.hasNext()) {
|
||||
buf.append(", ");
|
||||
}
|
||||
}
|
||||
buf.append(" {\n");
|
||||
buf.append("\t}\n");
|
||||
}
|
||||
buf.append("}\n");
|
||||
}
|
||||
}
|
||||
|
||||
private void printLehmerEndian(ModelKlassWriter writer, List<NetherSlugLehmer> models) {
|
||||
String javaName = "DialCodeLehmerEndian";
|
||||
ModelKlass klass = new ModelKlass(BASE_PACK + ".ᒻᓫᑋᔿᓫᣗ" , javaName);
|
||||
klass.addJavaDescription("Lehmer code Endian dial codes.");
|
||||
klass.setJavaDocAuthor("Lehmer");
|
||||
klass.addJavaAnno(KaasLandGenerated注.class, "generator = \"model-dial\"");
|
||||
List<Class<?>> tonesImport = models.get(0).identityEndianLittle().toNetherTones();
|
||||
klass.addJavaImports(tonesImport.subList(3, tonesImport.size()));
|
||||
klass.addJavaImport(NetherToneGuide.class.getName() + ".SpaceGuideSageNX01Lehmer16");
|
||||
klass.addJavaImport(NetherToneGuide.class.getName() + ".SpaceGuideSageNX01Lehmer17");
|
||||
klass.addJavaImport(NetherToneGuide.class.getName() + ".SpaceGuideSageNX01Lehmer18");
|
||||
writer.addModelKlass(klass);
|
||||
StringBuilder buf = klass.getBody();
|
||||
buf.append("public sealed interface ");
|
||||
buf.append(javaName);
|
||||
//buf.append(" extends ");
|
||||
buf.append(" {\n");
|
||||
for (NetherSlugLehmer model : models) {
|
||||
String sizeStr = String.format("%02d", model.size());
|
||||
buf.append("\tnon-sealed interface ");
|
||||
buf.append("LehmerTone" + sizeStr + "LE");
|
||||
buf.append("\n");
|
||||
buf.append("\t\t\textends ");
|
||||
buf.append(javaName);
|
||||
buf.append(", ");
|
||||
if (model.size <= 16) {
|
||||
buf.append("SpaceGuideSageNX01Lehmer16, ");
|
||||
} else if (model.size == 17) {
|
||||
buf.append("SpaceGuideSageNX01Lehmer17, ");
|
||||
} else if (model.size == 18) {
|
||||
buf.append("SpaceGuideSageNX01Lehmer18, ");
|
||||
}
|
||||
List<Class<?>> tonesLE = model.identityEndianLittle().toNetherTones();
|
||||
for (Iterator<Class<?>> i = tonesLE.subList(3, tonesLE.size()).iterator(); i.hasNext() ;) {
|
||||
Class<?> toneClass = i.next();
|
||||
buf.append(toneClass.getDeclaringClass().getSimpleName());
|
||||
buf.append(".");
|
||||
buf.append(toneClass.getSimpleName());
|
||||
if (i.hasNext()) {
|
||||
buf.append(", ");
|
||||
}
|
||||
}
|
||||
buf.append(" {\n");
|
||||
buf.append("\t}\n");
|
||||
|
||||
buf.append("\tnon-sealed interface ");
|
||||
buf.append("LehmerTone" + sizeStr + "BE");
|
||||
buf.append("\n");
|
||||
buf.append("\t\t\textends ");
|
||||
buf.append(javaName);
|
||||
buf.append(", ");
|
||||
if (model.size <= 16) {
|
||||
buf.append("SpaceGuideSageNX01Lehmer16, ");
|
||||
} else if (model.size == 17) {
|
||||
buf.append("SpaceGuideSageNX01Lehmer17, ");
|
||||
} else if (model.size == 18) {
|
||||
buf.append("SpaceGuideSageNX01Lehmer18, ");
|
||||
}
|
||||
List<Class<?>> tonesBE = model.identityEndianBig().toNetherTones();
|
||||
for (Iterator<Class<?>> i = tonesBE.subList(3, tonesBE.size()).iterator(); i.hasNext() ;) {
|
||||
Class<?> toneClass = i.next();
|
||||
buf.append(toneClass.getDeclaringClass().getSimpleName());
|
||||
buf.append(".");
|
||||
buf.append(toneClass.getSimpleName());
|
||||
if (i.hasNext()) {
|
||||
buf.append(", ");
|
||||
}
|
||||
}
|
||||
buf.append(" {\n");
|
||||
buf.append("\t}\n");
|
||||
}
|
||||
buf.append("}\n");
|
||||
}
|
||||
|
||||
record NetherSlugLehmer(int size, NetherToneSlugView identityEndianLittle, NetherToneSlugView identityEndianBig, NetherToneSlugView...sequences) {
|
||||
}
|
||||
|
||||
private List<NetherSlugLehmer> generateLehmerModels() {
|
||||
NetherToneSlugView slugSpaceGuide = NetherToneSlugView.ofQSluq(NetherToneGuide.SpaceGuideSageNX01Lehmer16.class, false);
|
||||
List<NetherSlugLehmer> models = new ArrayList<>();
|
||||
for (int i = 2; i <= 18; i++) {
|
||||
int[] rankFirst = calculateLehmerFromRank(0, i);
|
||||
long amount = calculateTotalPermutations(rankFirst);
|
||||
int ag1 = LEHMER_AG1;
|
||||
int ag2 = LEHMER_AG2;
|
||||
int ag3 = LEHMER_AG3_16;
|
||||
int ag1 = slugSpaceGuide.ag1();
|
||||
int ag2 = slugSpaceGuide.ag2();
|
||||
int ag3 = slugSpaceGuide.ag3();
|
||||
int bl0w = i - 1;
|
||||
int cr1 = 0;
|
||||
int cr2 = 0;
|
||||
|
|
@ -107,11 +250,10 @@ public class ModelDial implements KodeGenModel {
|
|||
bl0w = 0;
|
||||
}
|
||||
if (i == 17) {
|
||||
ag3 = LEHMER_AG3_17;
|
||||
ag3 = slugSpaceGuide.ag3() + 1;
|
||||
} else if (i == 18) {
|
||||
ag3 = LEHMER_AG3_18;
|
||||
ag3 = slugSpaceGuide.ag3() + 2;
|
||||
}
|
||||
|
||||
db3 = 0;
|
||||
er0w = 0;
|
||||
NetherToneSlugView slugLE = new NetherToneSlugView(ag1, ag2, ag3, bl0w, cr1, cr2, cr3, db1, db2, db3, er0w);
|
||||
|
|
@ -130,116 +272,7 @@ public class ModelDial implements KodeGenModel {
|
|||
NetherSlugLehmer slugLehmer = new NetherSlugLehmer(i, slugLE, slugBE, indexSequenceSelectors.toArray(new NetherToneSlugView[] {}));
|
||||
models.add(slugLehmer);
|
||||
}
|
||||
|
||||
// print models
|
||||
for (NetherSlugLehmer model : models) {
|
||||
String sizeStr = String.format("%02d", model.SIZE());
|
||||
String javaName = "DialCodeLehmer" + sizeStr;
|
||||
ModelKlass klass = new ModelKlass(BASE_PACK + ".ᒻᓫᑋᔿᓫᣗ" , javaName);
|
||||
List<Class<?>> tones = model.IDLE().toNetherTones();
|
||||
for (Class<?> tone : tones) {
|
||||
klass.addJavaImport(tone.getDeclaringClass().getName());
|
||||
}
|
||||
klass.addJavaDescription("Lehmer code unique sequence index number sets.");
|
||||
klass.setJavaDocAuthor("Lehmer");
|
||||
writer.addModelKlass(klass);
|
||||
StringBuilder buf = klass.getBody();
|
||||
buf.append("public sealed interface ");
|
||||
buf.append(javaName);
|
||||
buf.append(" extends ");
|
||||
for (Iterator<Class<?>> i = tones.subList(0, 3).iterator(); i.hasNext() ;) {
|
||||
Class<?> toneClass = i.next();
|
||||
buf.append(toneClass.getDeclaringClass().getSimpleName());
|
||||
buf.append(".");
|
||||
buf.append(toneClass.getSimpleName());
|
||||
if (i.hasNext()) {
|
||||
buf.append(", ");
|
||||
}
|
||||
}
|
||||
buf.append(" {\n");
|
||||
|
||||
buf.append("\tnon-sealed interface ");
|
||||
buf.append("IdentityLittleEndian");
|
||||
buf.append("\n");
|
||||
buf.append("\t\t\textends ");
|
||||
buf.append(javaName);
|
||||
buf.append(", ");
|
||||
tones = model.IDLE().toNetherTones();
|
||||
for (Iterator<Class<?>> i = tones.subList(3, tones.size()).iterator(); i.hasNext() ;) {
|
||||
Class<?> toneClass = i.next();
|
||||
buf.append(toneClass.getDeclaringClass().getSimpleName());
|
||||
buf.append(".");
|
||||
buf.append(toneClass.getSimpleName());
|
||||
if (i.hasNext()) {
|
||||
buf.append(", ");
|
||||
}
|
||||
}
|
||||
buf.append(" {\n");
|
||||
buf.append("\t}\n");
|
||||
|
||||
buf.append("\tnon-sealed interface ");
|
||||
buf.append("IdentityBigEndian");
|
||||
buf.append("\n");
|
||||
buf.append("\t\t\textends ");
|
||||
buf.append(javaName);
|
||||
buf.append(", ");
|
||||
tones = model.IDBE().toNetherTones();
|
||||
for (Iterator<Class<?>> i = tones.subList(3, tones.size()).iterator(); i.hasNext() ;) {
|
||||
Class<?> toneClass = i.next();
|
||||
buf.append(toneClass.getDeclaringClass().getSimpleName());
|
||||
buf.append(".");
|
||||
buf.append(toneClass.getSimpleName());
|
||||
if (i.hasNext()) {
|
||||
buf.append(", ");
|
||||
}
|
||||
}
|
||||
buf.append(" {\n");
|
||||
buf.append("\t}\n");
|
||||
|
||||
for (NetherToneSlugView sequnceIndex : model.SLUGS()) {
|
||||
String slugName = "ᐊ" + sequnceIndex.toNúmero2Lingua() + "ᐅ";
|
||||
buf.append("\tnon-sealed interface ");
|
||||
buf.append(slugName);
|
||||
buf.append("\n");
|
||||
buf.append("\t\t\textends ");
|
||||
buf.append(javaName);
|
||||
buf.append(", ");
|
||||
tones =sequnceIndex.toNetherTones();
|
||||
for (Iterator<Class<?>> i = tones.subList(3, tones.size()).iterator(); i.hasNext() ;) {
|
||||
Class<?> toneClass = i.next();
|
||||
buf.append(toneClass.getDeclaringClass().getSimpleName());
|
||||
buf.append(".");
|
||||
buf.append(toneClass.getSimpleName());
|
||||
if (i.hasNext()) {
|
||||
buf.append(", ");
|
||||
}
|
||||
}
|
||||
buf.append(" {\n");
|
||||
buf.append("\t}\n");
|
||||
}
|
||||
|
||||
buf.append("}\n");
|
||||
}
|
||||
}
|
||||
|
||||
record NetherSlugLehmer(int SIZE, NetherToneSlugView IDLE, NetherToneSlugView IDBE, NetherToneSlugView...SLUGS) {
|
||||
}
|
||||
|
||||
private void buildModuleInfo(ModelKlassWriter writer) {
|
||||
ModelKlass klass = new ModelKlass("", "module-info");
|
||||
klass.addJavaDescription("The nether dial packs tree slug index.");
|
||||
writer.addModelKlass(klass);
|
||||
StringBuilder buf = klass.getBody();
|
||||
buf.append("module ᣕᕁᐤᣳ.ᒢᣘᐧᐧ.ᣕᓫᐪᑋᓫᣗ.ᒄᑊᣔᒻ {\n");
|
||||
buf.append("\trequires transitive ᣕᕁᐤᣳ.ᒢᣘᐧᐧ.ᣕᓫᐪᑋᓫᣗ.ᐪᐤᣕᓫ;\n");
|
||||
buf.append("\t\n");
|
||||
buf.append("\texports " + BASE_PACK + ".ᒻᓫᑋᔿᓫᣗ;\n");
|
||||
// for (String pack : splitSlugs.keySet()) {
|
||||
// buf.append("\texports ");
|
||||
// buf.append(BASE_PACK + "." + pack);
|
||||
// buf.append(";\n");
|
||||
// }
|
||||
buf.append("}\n");
|
||||
return models;
|
||||
}
|
||||
|
||||
private long factorial(int n) {
|
||||
|
|
|
|||
|
|
@ -41,6 +41,8 @@ import java.util.Map;
|
|||
import love.distributedrebirth.nx01.kode.generator.KodeGenModel;
|
||||
import love.distributedrebirth.nx01.kode.generator.klass.ModelKlass;
|
||||
import love.distributedrebirth.nx01.kode.generator.klass.ModelKlassWriter;
|
||||
import ᒢᣘᐧᐧ.ᑊᑉᣔᣔᔆ.ᒻᣔᣕᒄ.KaasLandGenerated注;
|
||||
import ᒢᣘᐧᐧ.ᣕᓫᐪᑋᓫᣗ.ᐪᐤᣕᓫ.NetherToneGuide;
|
||||
import ᒢᣘᐧᐧ.ᣕᓫᐪᑋᓫᣗ.ᐪᐤᣕᓫ.NetherToneSlugView;
|
||||
|
||||
/// Generated the nether lingua interface tree forest.
|
||||
|
|
@ -50,9 +52,6 @@ import ᒢᣘᐧᐧ.ᣕᓫᐪᑋᓫᣗ.ᐪᐤᣕᓫ.NetherToneSlugView;
|
|||
public class ModelDialLingua implements KodeGenModel {
|
||||
|
||||
private static final String BASE_PACK = "ᒢᣘᐧᐧ.ᣕᓫᐪᑋᓫᣗ.ᒄᑊᣔᒻ.ᒻᑊᣕᕐᓑᣔᓫ";
|
||||
private static final int LINGUA_AG1 = 32; // sage master system version space 0x20
|
||||
private static final int LINGUA_AG2 = 33; // No2Lingua sub space
|
||||
private static final int LINGUA_AG3 = 34; // Locale ether slug space
|
||||
|
||||
@Override
|
||||
public String generatorKey() {
|
||||
|
|
@ -61,7 +60,7 @@ public class ModelDialLingua implements KodeGenModel {
|
|||
|
||||
@Override
|
||||
public String generatorModelHash() {
|
||||
return "6";
|
||||
return "7";
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -79,10 +78,11 @@ public class ModelDialLingua implements KodeGenModel {
|
|||
System.out.println("Lingua entries: " + linguaEntries.size() + " converted: " + netherSlugs.size());
|
||||
|
||||
// add top root entry for defaults of all other languages
|
||||
NetherToneSlugView slugSpaceGuide = NetherToneSlugView.ofQSluq(NetherToneGuide.SpaceGuideSageNX01Lingua.class, false);
|
||||
int[] d = new int[11];
|
||||
d[0] = LINGUA_AG1;
|
||||
d[1] = LINGUA_AG2;
|
||||
d[2] = LINGUA_AG3;
|
||||
d[0] = slugSpaceGuide.ag1();
|
||||
d[1] = slugSpaceGuide.ag2();
|
||||
d[2] = slugSpaceGuide.ag3();
|
||||
d[3] = 512 - 1; // 0x1FF
|
||||
d[4] = 64 - 1;
|
||||
d[5] = 64 - 1;
|
||||
|
|
@ -133,17 +133,17 @@ public class ModelDialLingua implements KodeGenModel {
|
|||
NetherSlugNamed slugTpl = list.get(0);
|
||||
List<Class<?>> tonesTpl = slugTpl.view().toNetherTones();
|
||||
ModelKlass klass = new ModelKlass(BASE_PACK + "." + pack, javaName);
|
||||
for (Class<?> tone : tonesTpl) {
|
||||
klass.addJavaImport(tone.getDeclaringClass().getName());
|
||||
}
|
||||
klass.addJavaImports(tonesTpl.subList(3, tonesTpl.size()));
|
||||
klass.addJavaImport(NetherToneGuide.class.getName() + ".SpaceGuideSageNX01Lingua");
|
||||
klass.addJavaDescription("Lingua set of supported human text and vocal dialects for terminators.");
|
||||
klass.setJavaDocAuthor("Observatoire Human Linguistique");
|
||||
klass.addJavaAnno(KaasLandGenerated注.class, "generator = \"model-dial\"");
|
||||
writer.addModelKlass(klass);
|
||||
StringBuilder buf = klass.getBody();
|
||||
buf.append("public sealed interface ");
|
||||
buf.append(javaName);
|
||||
buf.append(" extends ");
|
||||
for (Iterator<Class<?>> i = tonesTpl.subList(0, 4).iterator(); i.hasNext() ;) {
|
||||
buf.append(" extends SpaceGuideSageNX01Lingua, ");
|
||||
for (Iterator<Class<?>> i = tonesTpl.subList(3, 4).iterator(); i.hasNext() ;) {
|
||||
Class<?> toneClass = i.next();
|
||||
buf.append(toneClass.getDeclaringClass().getSimpleName());
|
||||
buf.append(".");
|
||||
|
|
@ -212,6 +212,7 @@ public class ModelDialLingua implements KodeGenModel {
|
|||
}
|
||||
|
||||
private List<NetherSlugNamed> convertLinguaEntries(List<String> linguaEntries) {
|
||||
NetherToneSlugView slugSpaceGuide = NetherToneSlugView.ofQSluq(NetherToneGuide.SpaceGuideSageNX01Lingua.class, false);
|
||||
List<NetherSlugNamed> result = new ArrayList<>(linguaEntries.size());
|
||||
for (String line : linguaEntries) {
|
||||
int spaceIndex = line.indexOf(" ");
|
||||
|
|
@ -239,9 +240,9 @@ public class ModelDialLingua implements KodeGenModel {
|
|||
} else {
|
||||
continue;
|
||||
}
|
||||
int ag1 = LINGUA_AG1;
|
||||
int ag2 = LINGUA_AG2;
|
||||
int ag3 = LINGUA_AG3;
|
||||
int ag1 = slugSpaceGuide.ag1();
|
||||
int ag2 = slugSpaceGuide.ag2();
|
||||
int ag3 = slugSpaceGuide.ag3();
|
||||
int bl0w = 1+Integer.parseInt(key1);
|
||||
int cr1 = key2.length()<1?0:1+key2.charAt(0) - 'A'; // A = 1
|
||||
int cr2 = key2.length()<2?0:1+key2.charAt(1) - 'A';
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue