diff --git a/.gitignore b/.gitignore
index 28626d1e7c..82da318b27 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,3 +14,6 @@ classes/artifacts/client_jar/run.bat
classes/artifacts/client_jar/client.jar
*.jar
.live/
+*/build/
+*/out/
+.gradle/
\ No newline at end of file
diff --git a/.mvn/extensions.xml b/.mvn/extensions.xml
new file mode 100644
index 0000000000..03e0ff60b0
--- /dev/null
+++ b/.mvn/extensions.xml
@@ -0,0 +1,7 @@
+
+
+ com.gradle
+ gradle-enterprise-maven-extension
+ 1.1.4
+
+
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000000..23450e52d9
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,29 @@
+allprojects {
+ apply plugin: 'maven'
+
+ group = 'net.runelite'
+version = '1.5.30-SNAPSHOT'
+}
+
+subprojects {
+ apply plugin: 'java'
+ sourceCompatibility = 1.8
+ targetCompatibility = 1.8
+ tasks.withType(JavaCompile) {
+ options.encoding = 'UTF-8'
+ }
+
+
+ repositories {
+ mavenLocal()
+
+ maven { url "http://repo1.maven.org/maven2" }
+ maven { url "http://repo.runelite.net" }
+ maven { url "http://repo.maven.apache.org/maven2" }
+ maven { url "https://raw.githubusercontent.com/runelite-extended/maven-repo/master" }
+ }
+
+
+
+
+}
diff --git a/cache-client/build.gradle b/cache-client/build.gradle
new file mode 100644
index 0000000000..a0a33cd5e9
--- /dev/null
+++ b/cache-client/build.gradle
@@ -0,0 +1,9 @@
+
+description = 'Cache Client'
+dependencies {
+ compile project(':cache')
+ compile project(':protocol')
+ testCompile group: 'junit', name: 'junit', version:'4.12'
+ testCompile group: 'org.slf4j', name: 'slf4j-simple', version:'1.7.26'
+ testCompile project(':cache')
+}
diff --git a/cache-updater/build.gradle b/cache-updater/build.gradle
new file mode 100644
index 0000000000..c437e8062e
--- /dev/null
+++ b/cache-updater/build.gradle
@@ -0,0 +1,12 @@
+
+description = 'Cache Updater'
+dependencies {
+ compile group: 'org.springframework.boot', name: 'spring-boot-starter', version:'1.5.6.RELEASE'
+ compile group: 'org.springframework.boot', name: 'spring-boot-starter-jdbc', version:'1.5.6.RELEASE'
+ compile group: 'org.springframework.boot', name: 'spring-boot-devtools', version:'1.5.6.RELEASE'
+ compile group: 'mysql', name: 'mysql-connector-java', version:'8.0.16'
+ compile project(':cache-client')
+ compile group: 'org.sql2o', name: 'sql2o', version:'1.6.0'
+ compile group: 'io.minio', name: 'minio', version:'3.0.6'
+ compileOnly group: 'org.projectlombok', name: 'lombok', version:'1.18.8'
+}
diff --git a/cache/build.gradle b/cache/build.gradle
new file mode 100644
index 0000000000..01e6abc89c
--- /dev/null
+++ b/cache/build.gradle
@@ -0,0 +1,22 @@
+
+description = 'Cache'
+dependencies {
+ compile project(':http-api')
+ compile group: 'com.google.guava', name: 'guava', version:'28.0-jre'
+ compile group: 'org.slf4j', name: 'slf4j-api', version:'1.7.25'
+ compile group: 'org.apache.commons', name: 'commons-compress', version:'1.18'
+ compile group: 'com.google.code.gson', name: 'gson', version:'2.8.5'
+ compile group: 'io.netty', name: 'netty-buffer', version:'4.1.37.Final'
+ compile group: 'org.antlr', name: 'antlr4-runtime', version:'4.6'
+ compile group: 'commons-cli', name: 'commons-cli', version:'1.4'
+ testCompile group: 'junit', name: 'junit', version:'4.12'
+ testCompile group: 'org.slf4j', name: 'slf4j-simple', version:'1.7.26'
+ testCompile group: 'net.runelite.rs', name: 'cache', version:'165'
+ compileOnly group: 'org.projectlombok', name: 'lombok', version:'1.18.8'
+}
+
+task packageTests(type: Jar) {
+ from sourceSets.test.output
+ classifier = 'tests'
+}
+artifacts.archives packageTests
diff --git a/cache/src/main/java/net/runelite/cache/script/assembler/rs2asmBaseListener.java b/cache/src/main/java/net/runelite/cache/script/assembler/rs2asmBaseListener.java
new file mode 100644
index 0000000000..07a835779a
--- /dev/null
+++ b/cache/src/main/java/net/runelite/cache/script/assembler/rs2asmBaseListener.java
@@ -0,0 +1,339 @@
+// Generated from net\runelite\cache\script\assembler\rs2asm.g4 by ANTLR 4.6
+package net.runelite.cache.script.assembler;
+
+import org.antlr.v4.runtime.ParserRuleContext;
+import org.antlr.v4.runtime.tree.ErrorNode;
+import org.antlr.v4.runtime.tree.TerminalNode;
+
+/**
+ * This class provides an empty implementation of {@link rs2asmListener},
+ * which can be extended to create a listener which only needs to handle a subset
+ * of the available methods.
+ */
+public class rs2asmBaseListener implements rs2asmListener {
+ /**
+ * {@inheritDoc}
+ *
+ *
The default implementation does nothing.
+ */
+ @Override public void enterProg(rs2asmParser.ProgContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitProg(rs2asmParser.ProgContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterHeader(rs2asmParser.HeaderContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitHeader(rs2asmParser.HeaderContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterId(rs2asmParser.IdContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitId(rs2asmParser.IdContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterInt_stack_count(rs2asmParser.Int_stack_countContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitInt_stack_count(rs2asmParser.Int_stack_countContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterString_stack_count(rs2asmParser.String_stack_countContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitString_stack_count(rs2asmParser.String_stack_countContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterInt_var_count(rs2asmParser.Int_var_countContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitInt_var_count(rs2asmParser.Int_var_countContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterString_var_count(rs2asmParser.String_var_countContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitString_var_count(rs2asmParser.String_var_countContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterId_value(rs2asmParser.Id_valueContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitId_value(rs2asmParser.Id_valueContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterInt_stack_value(rs2asmParser.Int_stack_valueContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitInt_stack_value(rs2asmParser.Int_stack_valueContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterString_stack_value(rs2asmParser.String_stack_valueContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitString_stack_value(rs2asmParser.String_stack_valueContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterInt_var_value(rs2asmParser.Int_var_valueContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitInt_var_value(rs2asmParser.Int_var_valueContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterString_var_value(rs2asmParser.String_var_valueContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitString_var_value(rs2asmParser.String_var_valueContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterLine(rs2asmParser.LineContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitLine(rs2asmParser.LineContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterInstruction(rs2asmParser.InstructionContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitInstruction(rs2asmParser.InstructionContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterLabel(rs2asmParser.LabelContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitLabel(rs2asmParser.LabelContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterInstruction_name(rs2asmParser.Instruction_nameContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitInstruction_name(rs2asmParser.Instruction_nameContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterName_string(rs2asmParser.Name_stringContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitName_string(rs2asmParser.Name_stringContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterName_opcode(rs2asmParser.Name_opcodeContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitName_opcode(rs2asmParser.Name_opcodeContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterInstruction_operand(rs2asmParser.Instruction_operandContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitInstruction_operand(rs2asmParser.Instruction_operandContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterOperand_int(rs2asmParser.Operand_intContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitOperand_int(rs2asmParser.Operand_intContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterOperand_qstring(rs2asmParser.Operand_qstringContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitOperand_qstring(rs2asmParser.Operand_qstringContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterOperand_label(rs2asmParser.Operand_labelContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitOperand_label(rs2asmParser.Operand_labelContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterSwitch_lookup(rs2asmParser.Switch_lookupContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitSwitch_lookup(rs2asmParser.Switch_lookupContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterSwitch_key(rs2asmParser.Switch_keyContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitSwitch_key(rs2asmParser.Switch_keyContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterSwitch_value(rs2asmParser.Switch_valueContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitSwitch_value(rs2asmParser.Switch_valueContext ctx) { }
+
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterEveryRule(ParserRuleContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitEveryRule(ParserRuleContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void visitTerminal(TerminalNode node) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void visitErrorNode(ErrorNode node) { }
+}
\ No newline at end of file
diff --git a/cache/src/main/java/net/runelite/cache/script/assembler/rs2asmLexer.java b/cache/src/main/java/net/runelite/cache/script/assembler/rs2asmLexer.java
new file mode 100644
index 0000000000..de62dba6cb
--- /dev/null
+++ b/cache/src/main/java/net/runelite/cache/script/assembler/rs2asmLexer.java
@@ -0,0 +1,146 @@
+// Generated from net\runelite\cache\script\assembler\rs2asm.g4 by ANTLR 4.6
+package net.runelite.cache.script.assembler;
+
+import org.antlr.v4.runtime.CharStream;
+import org.antlr.v4.runtime.Lexer;
+import org.antlr.v4.runtime.RuntimeMetaData;
+import org.antlr.v4.runtime.Vocabulary;
+import org.antlr.v4.runtime.VocabularyImpl;
+import org.antlr.v4.runtime.atn.ATN;
+import org.antlr.v4.runtime.atn.ATNDeserializer;
+import org.antlr.v4.runtime.atn.LexerATNSimulator;
+import org.antlr.v4.runtime.atn.PredictionContextCache;
+import org.antlr.v4.runtime.dfa.DFA;
+
+@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
+public class rs2asmLexer extends Lexer {
+ static { RuntimeMetaData.checkVersion("4.6", RuntimeMetaData.VERSION); }
+
+ protected static final DFA[] _decisionToDFA;
+ protected static final PredictionContextCache _sharedContextCache =
+ new PredictionContextCache();
+ public static final int
+ T__0=1, T__1=2, T__2=3, T__3=4, T__4=5, T__5=6, NEWLINE=7, INT=8, QSTRING=9,
+ IDENTIFIER=10, COMMENT=11, WS=12;
+ public static String[] modeNames = {
+ "DEFAULT_MODE"
+ };
+
+ public static final String[] ruleNames = {
+ "T__0", "T__1", "T__2", "T__3", "T__4", "T__5", "NEWLINE", "INT", "QSTRING",
+ "IDENTIFIER", "COMMENT", "WS"
+ };
+
+ private static final String[] _LITERAL_NAMES = {
+ null, "'.id '", "'.int_stack_count '", "'.string_stack_count '", "'.int_var_count '",
+ "'.string_var_count '", "':'"
+ };
+ private static final String[] _SYMBOLIC_NAMES = {
+ null, null, null, null, null, null, null, "NEWLINE", "INT", "QSTRING",
+ "IDENTIFIER", "COMMENT", "WS"
+ };
+ public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
+
+ /**
+ * @deprecated Use {@link #VOCABULARY} instead.
+ */
+ @Deprecated
+ public static final String[] tokenNames;
+ static {
+ tokenNames = new String[_SYMBOLIC_NAMES.length];
+ for (int i = 0; i < tokenNames.length; i++) {
+ tokenNames[i] = VOCABULARY.getLiteralName(i);
+ if (tokenNames[i] == null) {
+ tokenNames[i] = VOCABULARY.getSymbolicName(i);
+ }
+
+ if (tokenNames[i] == null) {
+ tokenNames[i] = "";
+ }
+ }
+ }
+
+ @Override
+ @Deprecated
+ public String[] getTokenNames() {
+ return tokenNames;
+ }
+
+ @Override
+
+ public Vocabulary getVocabulary() {
+ return VOCABULARY;
+ }
+
+
+ public rs2asmLexer(CharStream input) {
+ super(input);
+ _interp = new LexerATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache);
+ }
+
+ @Override
+ public String getGrammarFileName() { return "rs2asm.g4"; }
+
+ @Override
+ public String[] getRuleNames() { return ruleNames; }
+
+ @Override
+ public String getSerializedATN() { return _serializedATN; }
+
+ @Override
+ public String[] getModeNames() { return modeNames; }
+
+ @Override
+ public ATN getATN() { return _ATN; }
+
+ public static final String _serializedATN =
+ "\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\2\16\u0099\b\1\4\2"+
+ "\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4"+
+ "\13\t\13\4\f\t\f\4\r\t\r\3\2\3\2\3\2\3\2\3\2\3\3\3\3\3\3\3\3\3\3\3\3\3"+
+ "\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\4"+
+ "\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3"+
+ "\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6"+
+ "\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3"+
+ "\b\6\bn\n\b\r\b\16\bo\3\t\5\ts\n\t\3\t\6\tv\n\t\r\t\16\tw\3\n\3\n\3\n"+
+ "\3\n\7\n~\n\n\f\n\16\n\u0081\13\n\3\n\3\n\3\13\6\13\u0086\n\13\r\13\16"+
+ "\13\u0087\3\f\3\f\7\f\u008c\n\f\f\f\16\f\u008f\13\f\3\f\3\f\3\r\6\r\u0094"+
+ "\n\r\r\r\16\r\u0095\3\r\3\r\2\2\16\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n"+
+ "\23\13\25\f\27\r\31\16\3\2\b\4\2\f\f\17\17\3\2\62;\6\2\f\f\17\17$$^^\4"+
+ "\2$$^^\6\2\62;C\\aac|\4\2\13\13\"\"\u00a0\2\3\3\2\2\2\2\5\3\2\2\2\2\7"+
+ "\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2"+
+ "\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\3\33\3\2\2\2\5"+
+ " \3\2\2\2\7\62\3\2\2\2\tG\3\2\2\2\13W\3\2\2\2\rj\3\2\2\2\17m\3\2\2\2\21"+
+ "r\3\2\2\2\23y\3\2\2\2\25\u0085\3\2\2\2\27\u0089\3\2\2\2\31\u0093\3\2\2"+
+ "\2\33\34\7\60\2\2\34\35\7k\2\2\35\36\7f\2\2\36\37\7\"\2\2\37\4\3\2\2\2"+
+ " !\7\60\2\2!\"\7k\2\2\"#\7p\2\2#$\7v\2\2$%\7a\2\2%&\7u\2\2&\'\7v\2\2\'"+
+ "(\7c\2\2()\7e\2\2)*\7m\2\2*+\7a\2\2+,\7e\2\2,-\7q\2\2-.\7w\2\2./\7p\2"+
+ "\2/\60\7v\2\2\60\61\7\"\2\2\61\6\3\2\2\2\62\63\7\60\2\2\63\64\7u\2\2\64"+
+ "\65\7v\2\2\65\66\7t\2\2\66\67\7k\2\2\678\7p\2\289\7i\2\29:\7a\2\2:;\7"+
+ "u\2\2;<\7v\2\2<=\7c\2\2=>\7e\2\2>?\7m\2\2?@\7a\2\2@A\7e\2\2AB\7q\2\2B"+
+ "C\7w\2\2CD\7p\2\2DE\7v\2\2EF\7\"\2\2F\b\3\2\2\2GH\7\60\2\2HI\7k\2\2IJ"+
+ "\7p\2\2JK\7v\2\2KL\7a\2\2LM\7x\2\2MN\7c\2\2NO\7t\2\2OP\7a\2\2PQ\7e\2\2"+
+ "QR\7q\2\2RS\7w\2\2ST\7p\2\2TU\7v\2\2UV\7\"\2\2V\n\3\2\2\2WX\7\60\2\2X"+
+ "Y\7u\2\2YZ\7v\2\2Z[\7t\2\2[\\\7k\2\2\\]\7p\2\2]^\7i\2\2^_\7a\2\2_`\7x"+
+ "\2\2`a\7c\2\2ab\7t\2\2bc\7a\2\2cd\7e\2\2de\7q\2\2ef\7w\2\2fg\7p\2\2gh"+
+ "\7v\2\2hi\7\"\2\2i\f\3\2\2\2jk\7<\2\2k\16\3\2\2\2ln\t\2\2\2ml\3\2\2\2"+
+ "no\3\2\2\2om\3\2\2\2op\3\2\2\2p\20\3\2\2\2qs\7/\2\2rq\3\2\2\2rs\3\2\2"+
+ "\2su\3\2\2\2tv\t\3\2\2ut\3\2\2\2vw\3\2\2\2wu\3\2\2\2wx\3\2\2\2x\22\3\2"+
+ "\2\2y\177\7$\2\2z~\n\4\2\2{|\7^\2\2|~\t\5\2\2}z\3\2\2\2}{\3\2\2\2~\u0081"+
+ "\3\2\2\2\177}\3\2\2\2\177\u0080\3\2\2\2\u0080\u0082\3\2\2\2\u0081\177"+
+ "\3\2\2\2\u0082\u0083\7$\2\2\u0083\24\3\2\2\2\u0084\u0086\t\6\2\2\u0085"+
+ "\u0084\3\2\2\2\u0086\u0087\3\2\2\2\u0087\u0085\3\2\2\2\u0087\u0088\3\2"+
+ "\2\2\u0088\26\3\2\2\2\u0089\u008d\7=\2\2\u008a\u008c\n\2\2\2\u008b\u008a"+
+ "\3\2\2\2\u008c\u008f\3\2\2\2\u008d\u008b\3\2\2\2\u008d\u008e\3\2\2\2\u008e"+
+ "\u0090\3\2\2\2\u008f\u008d\3\2\2\2\u0090\u0091\b\f\2\2\u0091\30\3\2\2"+
+ "\2\u0092\u0094\t\7\2\2\u0093\u0092\3\2\2\2\u0094\u0095\3\2\2\2\u0095\u0093"+
+ "\3\2\2\2\u0095\u0096\3\2\2\2\u0096\u0097\3\2\2\2\u0097\u0098\b\r\2\2\u0098"+
+ "\32\3\2\2\2\13\2orw}\177\u0087\u008d\u0095\3\2\3\2";
+ public static final ATN _ATN =
+ new ATNDeserializer().deserialize(_serializedATN.toCharArray());
+ static {
+ _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()];
+ for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) {
+ _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i);
+ }
+ }
+}
\ No newline at end of file
diff --git a/cache/src/main/java/net/runelite/cache/script/assembler/rs2asmListener.java b/cache/src/main/java/net/runelite/cache/script/assembler/rs2asmListener.java
new file mode 100644
index 0000000000..698b8857c6
--- /dev/null
+++ b/cache/src/main/java/net/runelite/cache/script/assembler/rs2asmListener.java
@@ -0,0 +1,260 @@
+// Generated from net\runelite\cache\script\assembler\rs2asm.g4 by ANTLR 4.6
+package net.runelite.cache.script.assembler;
+import org.antlr.v4.runtime.tree.ParseTreeListener;
+
+/**
+ * This interface defines a complete listener for a parse tree produced by
+ * {@link rs2asmParser}.
+ */
+public interface rs2asmListener extends ParseTreeListener {
+ /**
+ * Enter a parse tree produced by {@link rs2asmParser#prog}.
+ * @param ctx the parse tree
+ */
+ void enterProg(rs2asmParser.ProgContext ctx);
+ /**
+ * Exit a parse tree produced by {@link rs2asmParser#prog}.
+ * @param ctx the parse tree
+ */
+ void exitProg(rs2asmParser.ProgContext ctx);
+ /**
+ * Enter a parse tree produced by {@link rs2asmParser#header}.
+ * @param ctx the parse tree
+ */
+ void enterHeader(rs2asmParser.HeaderContext ctx);
+ /**
+ * Exit a parse tree produced by {@link rs2asmParser#header}.
+ * @param ctx the parse tree
+ */
+ void exitHeader(rs2asmParser.HeaderContext ctx);
+ /**
+ * Enter a parse tree produced by {@link rs2asmParser#id}.
+ * @param ctx the parse tree
+ */
+ void enterId(rs2asmParser.IdContext ctx);
+ /**
+ * Exit a parse tree produced by {@link rs2asmParser#id}.
+ * @param ctx the parse tree
+ */
+ void exitId(rs2asmParser.IdContext ctx);
+ /**
+ * Enter a parse tree produced by {@link rs2asmParser#int_stack_count}.
+ * @param ctx the parse tree
+ */
+ void enterInt_stack_count(rs2asmParser.Int_stack_countContext ctx);
+ /**
+ * Exit a parse tree produced by {@link rs2asmParser#int_stack_count}.
+ * @param ctx the parse tree
+ */
+ void exitInt_stack_count(rs2asmParser.Int_stack_countContext ctx);
+ /**
+ * Enter a parse tree produced by {@link rs2asmParser#string_stack_count}.
+ * @param ctx the parse tree
+ */
+ void enterString_stack_count(rs2asmParser.String_stack_countContext ctx);
+ /**
+ * Exit a parse tree produced by {@link rs2asmParser#string_stack_count}.
+ * @param ctx the parse tree
+ */
+ void exitString_stack_count(rs2asmParser.String_stack_countContext ctx);
+ /**
+ * Enter a parse tree produced by {@link rs2asmParser#int_var_count}.
+ * @param ctx the parse tree
+ */
+ void enterInt_var_count(rs2asmParser.Int_var_countContext ctx);
+ /**
+ * Exit a parse tree produced by {@link rs2asmParser#int_var_count}.
+ * @param ctx the parse tree
+ */
+ void exitInt_var_count(rs2asmParser.Int_var_countContext ctx);
+ /**
+ * Enter a parse tree produced by {@link rs2asmParser#string_var_count}.
+ * @param ctx the parse tree
+ */
+ void enterString_var_count(rs2asmParser.String_var_countContext ctx);
+ /**
+ * Exit a parse tree produced by {@link rs2asmParser#string_var_count}.
+ * @param ctx the parse tree
+ */
+ void exitString_var_count(rs2asmParser.String_var_countContext ctx);
+ /**
+ * Enter a parse tree produced by {@link rs2asmParser#id_value}.
+ * @param ctx the parse tree
+ */
+ void enterId_value(rs2asmParser.Id_valueContext ctx);
+ /**
+ * Exit a parse tree produced by {@link rs2asmParser#id_value}.
+ * @param ctx the parse tree
+ */
+ void exitId_value(rs2asmParser.Id_valueContext ctx);
+ /**
+ * Enter a parse tree produced by {@link rs2asmParser#int_stack_value}.
+ * @param ctx the parse tree
+ */
+ void enterInt_stack_value(rs2asmParser.Int_stack_valueContext ctx);
+ /**
+ * Exit a parse tree produced by {@link rs2asmParser#int_stack_value}.
+ * @param ctx the parse tree
+ */
+ void exitInt_stack_value(rs2asmParser.Int_stack_valueContext ctx);
+ /**
+ * Enter a parse tree produced by {@link rs2asmParser#string_stack_value}.
+ * @param ctx the parse tree
+ */
+ void enterString_stack_value(rs2asmParser.String_stack_valueContext ctx);
+ /**
+ * Exit a parse tree produced by {@link rs2asmParser#string_stack_value}.
+ * @param ctx the parse tree
+ */
+ void exitString_stack_value(rs2asmParser.String_stack_valueContext ctx);
+ /**
+ * Enter a parse tree produced by {@link rs2asmParser#int_var_value}.
+ * @param ctx the parse tree
+ */
+ void enterInt_var_value(rs2asmParser.Int_var_valueContext ctx);
+ /**
+ * Exit a parse tree produced by {@link rs2asmParser#int_var_value}.
+ * @param ctx the parse tree
+ */
+ void exitInt_var_value(rs2asmParser.Int_var_valueContext ctx);
+ /**
+ * Enter a parse tree produced by {@link rs2asmParser#string_var_value}.
+ * @param ctx the parse tree
+ */
+ void enterString_var_value(rs2asmParser.String_var_valueContext ctx);
+ /**
+ * Exit a parse tree produced by {@link rs2asmParser#string_var_value}.
+ * @param ctx the parse tree
+ */
+ void exitString_var_value(rs2asmParser.String_var_valueContext ctx);
+ /**
+ * Enter a parse tree produced by {@link rs2asmParser#line}.
+ * @param ctx the parse tree
+ */
+ void enterLine(rs2asmParser.LineContext ctx);
+ /**
+ * Exit a parse tree produced by {@link rs2asmParser#line}.
+ * @param ctx the parse tree
+ */
+ void exitLine(rs2asmParser.LineContext ctx);
+ /**
+ * Enter a parse tree produced by {@link rs2asmParser#instruction}.
+ * @param ctx the parse tree
+ */
+ void enterInstruction(rs2asmParser.InstructionContext ctx);
+ /**
+ * Exit a parse tree produced by {@link rs2asmParser#instruction}.
+ * @param ctx the parse tree
+ */
+ void exitInstruction(rs2asmParser.InstructionContext ctx);
+ /**
+ * Enter a parse tree produced by {@link rs2asmParser#label}.
+ * @param ctx the parse tree
+ */
+ void enterLabel(rs2asmParser.LabelContext ctx);
+ /**
+ * Exit a parse tree produced by {@link rs2asmParser#label}.
+ * @param ctx the parse tree
+ */
+ void exitLabel(rs2asmParser.LabelContext ctx);
+ /**
+ * Enter a parse tree produced by {@link rs2asmParser#instruction_name}.
+ * @param ctx the parse tree
+ */
+ void enterInstruction_name(rs2asmParser.Instruction_nameContext ctx);
+ /**
+ * Exit a parse tree produced by {@link rs2asmParser#instruction_name}.
+ * @param ctx the parse tree
+ */
+ void exitInstruction_name(rs2asmParser.Instruction_nameContext ctx);
+ /**
+ * Enter a parse tree produced by {@link rs2asmParser#name_string}.
+ * @param ctx the parse tree
+ */
+ void enterName_string(rs2asmParser.Name_stringContext ctx);
+ /**
+ * Exit a parse tree produced by {@link rs2asmParser#name_string}.
+ * @param ctx the parse tree
+ */
+ void exitName_string(rs2asmParser.Name_stringContext ctx);
+ /**
+ * Enter a parse tree produced by {@link rs2asmParser#name_opcode}.
+ * @param ctx the parse tree
+ */
+ void enterName_opcode(rs2asmParser.Name_opcodeContext ctx);
+ /**
+ * Exit a parse tree produced by {@link rs2asmParser#name_opcode}.
+ * @param ctx the parse tree
+ */
+ void exitName_opcode(rs2asmParser.Name_opcodeContext ctx);
+ /**
+ * Enter a parse tree produced by {@link rs2asmParser#instruction_operand}.
+ * @param ctx the parse tree
+ */
+ void enterInstruction_operand(rs2asmParser.Instruction_operandContext ctx);
+ /**
+ * Exit a parse tree produced by {@link rs2asmParser#instruction_operand}.
+ * @param ctx the parse tree
+ */
+ void exitInstruction_operand(rs2asmParser.Instruction_operandContext ctx);
+ /**
+ * Enter a parse tree produced by {@link rs2asmParser#operand_int}.
+ * @param ctx the parse tree
+ */
+ void enterOperand_int(rs2asmParser.Operand_intContext ctx);
+ /**
+ * Exit a parse tree produced by {@link rs2asmParser#operand_int}.
+ * @param ctx the parse tree
+ */
+ void exitOperand_int(rs2asmParser.Operand_intContext ctx);
+ /**
+ * Enter a parse tree produced by {@link rs2asmParser#operand_qstring}.
+ * @param ctx the parse tree
+ */
+ void enterOperand_qstring(rs2asmParser.Operand_qstringContext ctx);
+ /**
+ * Exit a parse tree produced by {@link rs2asmParser#operand_qstring}.
+ * @param ctx the parse tree
+ */
+ void exitOperand_qstring(rs2asmParser.Operand_qstringContext ctx);
+ /**
+ * Enter a parse tree produced by {@link rs2asmParser#operand_label}.
+ * @param ctx the parse tree
+ */
+ void enterOperand_label(rs2asmParser.Operand_labelContext ctx);
+ /**
+ * Exit a parse tree produced by {@link rs2asmParser#operand_label}.
+ * @param ctx the parse tree
+ */
+ void exitOperand_label(rs2asmParser.Operand_labelContext ctx);
+ /**
+ * Enter a parse tree produced by {@link rs2asmParser#switch_lookup}.
+ * @param ctx the parse tree
+ */
+ void enterSwitch_lookup(rs2asmParser.Switch_lookupContext ctx);
+ /**
+ * Exit a parse tree produced by {@link rs2asmParser#switch_lookup}.
+ * @param ctx the parse tree
+ */
+ void exitSwitch_lookup(rs2asmParser.Switch_lookupContext ctx);
+ /**
+ * Enter a parse tree produced by {@link rs2asmParser#switch_key}.
+ * @param ctx the parse tree
+ */
+ void enterSwitch_key(rs2asmParser.Switch_keyContext ctx);
+ /**
+ * Exit a parse tree produced by {@link rs2asmParser#switch_key}.
+ * @param ctx the parse tree
+ */
+ void exitSwitch_key(rs2asmParser.Switch_keyContext ctx);
+ /**
+ * Enter a parse tree produced by {@link rs2asmParser#switch_value}.
+ * @param ctx the parse tree
+ */
+ void enterSwitch_value(rs2asmParser.Switch_valueContext ctx);
+ /**
+ * Exit a parse tree produced by {@link rs2asmParser#switch_value}.
+ * @param ctx the parse tree
+ */
+ void exitSwitch_value(rs2asmParser.Switch_valueContext ctx);
+}
\ No newline at end of file
diff --git a/cache/src/main/java/net/runelite/cache/script/assembler/rs2asmParser.java b/cache/src/main/java/net/runelite/cache/script/assembler/rs2asmParser.java
new file mode 100644
index 0000000000..4617df119c
--- /dev/null
+++ b/cache/src/main/java/net/runelite/cache/script/assembler/rs2asmParser.java
@@ -0,0 +1,1333 @@
+// Generated from net\runelite\cache\script\assembler\rs2asm.g4 by ANTLR 4.6
+package net.runelite.cache.script.assembler;
+import org.antlr.v4.runtime.NoViableAltException;
+import org.antlr.v4.runtime.Parser;
+import org.antlr.v4.runtime.ParserRuleContext;
+import org.antlr.v4.runtime.RecognitionException;
+import org.antlr.v4.runtime.RuntimeMetaData;
+import org.antlr.v4.runtime.TokenStream;
+import org.antlr.v4.runtime.Vocabulary;
+import org.antlr.v4.runtime.VocabularyImpl;
+import org.antlr.v4.runtime.atn.ATN;
+import org.antlr.v4.runtime.atn.ATNDeserializer;
+import org.antlr.v4.runtime.atn.ParserATNSimulator;
+import org.antlr.v4.runtime.atn.PredictionContextCache;
+import org.antlr.v4.runtime.dfa.DFA;
+import java.util.List;
+import org.antlr.v4.runtime.tree.ParseTreeListener;
+import org.antlr.v4.runtime.tree.TerminalNode;
+
+@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
+public class rs2asmParser extends Parser
+{
+ static { RuntimeMetaData.checkVersion("4.6", RuntimeMetaData.VERSION); }
+
+ protected static final DFA[] _decisionToDFA;
+ protected static final PredictionContextCache _sharedContextCache =
+ new PredictionContextCache();
+ public static final int
+ T__0=1, T__1=2, T__2=3, T__3=4, T__4=5, T__5=6, NEWLINE=7, INT=8, QSTRING=9,
+ IDENTIFIER=10, COMMENT=11, WS=12;
+ public static final int
+ RULE_prog = 0, RULE_header = 1, RULE_id = 2, RULE_int_stack_count = 3,
+ RULE_string_stack_count = 4, RULE_int_var_count = 5, RULE_string_var_count = 6,
+ RULE_id_value = 7, RULE_int_stack_value = 8, RULE_string_stack_value = 9,
+ RULE_int_var_value = 10, RULE_string_var_value = 11, RULE_line = 12, RULE_instruction = 13,
+ RULE_label = 14, RULE_instruction_name = 15, RULE_name_string = 16, RULE_name_opcode = 17,
+ RULE_instruction_operand = 18, RULE_operand_int = 19, RULE_operand_qstring = 20,
+ RULE_operand_label = 21, RULE_switch_lookup = 22, RULE_switch_key = 23,
+ RULE_switch_value = 24;
+ public static final String[] ruleNames = {
+ "prog", "header", "id", "int_stack_count", "string_stack_count", "int_var_count",
+ "string_var_count", "id_value", "int_stack_value", "string_stack_value",
+ "int_var_value", "string_var_value", "line", "instruction", "label", "instruction_name",
+ "name_string", "name_opcode", "instruction_operand", "operand_int", "operand_qstring",
+ "operand_label", "switch_lookup", "switch_key", "switch_value"
+ };
+
+ private static final String[] _LITERAL_NAMES = {
+ null, "'.id '", "'.int_stack_count '", "'.string_stack_count '", "'.int_var_count '",
+ "'.string_var_count '", "':'"
+ };
+ private static final String[] _SYMBOLIC_NAMES = {
+ null, null, null, null, null, null, null, "NEWLINE", "INT", "QSTRING",
+ "IDENTIFIER", "COMMENT", "WS"
+ };
+ public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
+
+ /**
+ * @deprecated Use {@link #VOCABULARY} instead.
+ */
+ @Deprecated
+ public static final String[] tokenNames;
+ static {
+ tokenNames = new String[_SYMBOLIC_NAMES.length];
+ for (int i = 0; i < tokenNames.length; i++) {
+ tokenNames[i] = VOCABULARY.getLiteralName(i);
+ if (tokenNames[i] == null) {
+ tokenNames[i] = VOCABULARY.getSymbolicName(i);
+ }
+
+ if (tokenNames[i] == null) {
+ tokenNames[i] = "";
+ }
+ }
+ }
+
+ @Override
+ @Deprecated
+ public String[] getTokenNames() {
+ return tokenNames;
+ }
+
+ @Override
+
+ public Vocabulary getVocabulary() {
+ return VOCABULARY;
+ }
+
+ @Override
+ public String getGrammarFileName() { return "rs2asm.g4"; }
+
+ @Override
+ public String[] getRuleNames() { return ruleNames; }
+
+ @Override
+ public String getSerializedATN() { return _serializedATN; }
+
+ @Override
+ public ATN getATN() { return _ATN; }
+
+ public rs2asmParser(TokenStream input) {
+ super(input);
+ _interp = new ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache);
+ }
+ public static class ProgContext extends ParserRuleContext
+ {
+ public List NEWLINE() { return getTokens(rs2asmParser.NEWLINE); }
+ public TerminalNode NEWLINE(int i) {
+ return getToken(rs2asmParser.NEWLINE, i);
+ }
+ public List header() {
+ return getRuleContexts(HeaderContext.class);
+ }
+ public HeaderContext header(int i) {
+ return getRuleContext(HeaderContext.class,i);
+ }
+ public List line() {
+ return getRuleContexts(LineContext.class);
+ }
+ public LineContext line(int i) {
+ return getRuleContext(LineContext.class,i);
+ }
+ public ProgContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_prog; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).enterProg(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).exitProg(this);
+ }
+ }
+
+ public final ProgContext prog() throws RecognitionException
+ {
+ ProgContext _localctx = new ProgContext(_ctx, getState());
+ enterRule(_localctx, 0, RULE_prog);
+ int _la;
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(53);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ while (_la==NEWLINE) {
+ {
+ {
+ setState(50);
+ match(NEWLINE);
+ }
+ }
+ setState(55);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ }
+ setState(64);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__1) | (1L << T__2) | (1L << T__3) | (1L << T__4))) != 0)) {
+ {
+ {
+ setState(56);
+ header();
+ setState(58);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ do {
+ {
+ {
+ setState(57);
+ match(NEWLINE);
+ }
+ }
+ setState(60);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ } while ( _la==NEWLINE );
+ }
+ }
+ setState(66);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ }
+ setState(73);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ do {
+ {
+ {
+ setState(67);
+ line();
+ setState(69);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ do {
+ {
+ {
+ setState(68);
+ match(NEWLINE);
+ }
+ }
+ setState(71);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ } while ( _la==NEWLINE );
+ }
+ }
+ setState(75);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ } while ( _la==INT || _la==IDENTIFIER );
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class HeaderContext extends ParserRuleContext {
+ public IdContext id() {
+ return getRuleContext(IdContext.class,0);
+ }
+ public Int_stack_countContext int_stack_count() {
+ return getRuleContext(Int_stack_countContext.class,0);
+ }
+ public String_stack_countContext string_stack_count() {
+ return getRuleContext(String_stack_countContext.class,0);
+ }
+ public Int_var_countContext int_var_count() {
+ return getRuleContext(Int_var_countContext.class,0);
+ }
+ public String_var_countContext string_var_count() {
+ return getRuleContext(String_var_countContext.class,0);
+ }
+ public HeaderContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_header; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).enterHeader(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).exitHeader(this);
+ }
+ }
+
+ public final HeaderContext header() throws RecognitionException {
+ HeaderContext _localctx = new HeaderContext(_ctx, getState());
+ enterRule(_localctx, 2, RULE_header);
+ try {
+ setState(82);
+ _errHandler.sync(this);
+ switch (_input.LA(1)) {
+ case T__0:
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(77);
+ id();
+ }
+ break;
+ case T__1:
+ enterOuterAlt(_localctx, 2);
+ {
+ setState(78);
+ int_stack_count();
+ }
+ break;
+ case T__2:
+ enterOuterAlt(_localctx, 3);
+ {
+ setState(79);
+ string_stack_count();
+ }
+ break;
+ case T__3:
+ enterOuterAlt(_localctx, 4);
+ {
+ setState(80);
+ int_var_count();
+ }
+ break;
+ case T__4:
+ enterOuterAlt(_localctx, 5);
+ {
+ setState(81);
+ string_var_count();
+ }
+ break;
+ default:
+ throw new NoViableAltException(this);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class IdContext extends ParserRuleContext {
+ public Id_valueContext id_value() {
+ return getRuleContext(Id_valueContext.class,0);
+ }
+ public IdContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_id; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).enterId(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).exitId(this);
+ }
+ }
+
+ public final IdContext id() throws RecognitionException {
+ IdContext _localctx = new IdContext(_ctx, getState());
+ enterRule(_localctx, 4, RULE_id);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(84);
+ match(T__0);
+ setState(85);
+ id_value();
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class Int_stack_countContext extends ParserRuleContext {
+ public Int_stack_valueContext int_stack_value() {
+ return getRuleContext(Int_stack_valueContext.class,0);
+ }
+ public Int_stack_countContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_int_stack_count; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).enterInt_stack_count(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).exitInt_stack_count(this);
+ }
+ }
+
+ public final Int_stack_countContext int_stack_count() throws RecognitionException {
+ Int_stack_countContext _localctx = new Int_stack_countContext(_ctx, getState());
+ enterRule(_localctx, 6, RULE_int_stack_count);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(87);
+ match(T__1);
+ setState(88);
+ int_stack_value();
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class String_stack_countContext extends ParserRuleContext {
+ public String_stack_valueContext string_stack_value() {
+ return getRuleContext(String_stack_valueContext.class,0);
+ }
+ public String_stack_countContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_string_stack_count; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).enterString_stack_count(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).exitString_stack_count(this);
+ }
+ }
+
+ public final String_stack_countContext string_stack_count() throws RecognitionException {
+ String_stack_countContext _localctx = new String_stack_countContext(_ctx, getState());
+ enterRule(_localctx, 8, RULE_string_stack_count);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(90);
+ match(T__2);
+ setState(91);
+ string_stack_value();
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class Int_var_countContext extends ParserRuleContext {
+ public Int_var_valueContext int_var_value() {
+ return getRuleContext(Int_var_valueContext.class,0);
+ }
+ public Int_var_countContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_int_var_count; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).enterInt_var_count(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).exitInt_var_count(this);
+ }
+ }
+
+ public final Int_var_countContext int_var_count() throws RecognitionException {
+ Int_var_countContext _localctx = new Int_var_countContext(_ctx, getState());
+ enterRule(_localctx, 10, RULE_int_var_count);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(93);
+ match(T__3);
+ setState(94);
+ int_var_value();
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class String_var_countContext extends ParserRuleContext {
+ public String_var_valueContext string_var_value() {
+ return getRuleContext(String_var_valueContext.class,0);
+ }
+ public String_var_countContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_string_var_count; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).enterString_var_count(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).exitString_var_count(this);
+ }
+ }
+
+ public final String_var_countContext string_var_count() throws RecognitionException {
+ String_var_countContext _localctx = new String_var_countContext(_ctx, getState());
+ enterRule(_localctx, 12, RULE_string_var_count);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(96);
+ match(T__4);
+ setState(97);
+ string_var_value();
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class Id_valueContext extends ParserRuleContext {
+ public TerminalNode INT() { return getToken(rs2asmParser.INT, 0); }
+ public Id_valueContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_id_value; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).enterId_value(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).exitId_value(this);
+ }
+ }
+
+ public final Id_valueContext id_value() throws RecognitionException {
+ Id_valueContext _localctx = new Id_valueContext(_ctx, getState());
+ enterRule(_localctx, 14, RULE_id_value);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(99);
+ match(INT);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class Int_stack_valueContext extends ParserRuleContext {
+ public TerminalNode INT() { return getToken(rs2asmParser.INT, 0); }
+ public Int_stack_valueContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_int_stack_value; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).enterInt_stack_value(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).exitInt_stack_value(this);
+ }
+ }
+
+ public final Int_stack_valueContext int_stack_value() throws RecognitionException {
+ Int_stack_valueContext _localctx = new Int_stack_valueContext(_ctx, getState());
+ enterRule(_localctx, 16, RULE_int_stack_value);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(101);
+ match(INT);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class String_stack_valueContext extends ParserRuleContext {
+ public TerminalNode INT() { return getToken(rs2asmParser.INT, 0); }
+ public String_stack_valueContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_string_stack_value; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).enterString_stack_value(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).exitString_stack_value(this);
+ }
+ }
+
+ public final String_stack_valueContext string_stack_value() throws RecognitionException {
+ String_stack_valueContext _localctx = new String_stack_valueContext(_ctx, getState());
+ enterRule(_localctx, 18, RULE_string_stack_value);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(103);
+ match(INT);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class Int_var_valueContext extends ParserRuleContext {
+ public TerminalNode INT() { return getToken(rs2asmParser.INT, 0); }
+ public Int_var_valueContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_int_var_value; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).enterInt_var_value(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).exitInt_var_value(this);
+ }
+ }
+
+ public final Int_var_valueContext int_var_value() throws RecognitionException {
+ Int_var_valueContext _localctx = new Int_var_valueContext(_ctx, getState());
+ enterRule(_localctx, 20, RULE_int_var_value);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(105);
+ match(INT);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class String_var_valueContext extends ParserRuleContext {
+ public TerminalNode INT() { return getToken(rs2asmParser.INT, 0); }
+ public String_var_valueContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_string_var_value; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).enterString_var_value(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).exitString_var_value(this);
+ }
+ }
+
+ public final String_var_valueContext string_var_value() throws RecognitionException {
+ String_var_valueContext _localctx = new String_var_valueContext(_ctx, getState());
+ enterRule(_localctx, 22, RULE_string_var_value);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(107);
+ match(INT);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class LineContext extends ParserRuleContext {
+ public InstructionContext instruction() {
+ return getRuleContext(InstructionContext.class,0);
+ }
+ public LabelContext label() {
+ return getRuleContext(LabelContext.class,0);
+ }
+ public Switch_lookupContext switch_lookup() {
+ return getRuleContext(Switch_lookupContext.class,0);
+ }
+ public LineContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_line; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).enterLine(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).exitLine(this);
+ }
+ }
+
+ public final LineContext line() throws RecognitionException {
+ LineContext _localctx = new LineContext(_ctx, getState());
+ enterRule(_localctx, 24, RULE_line);
+ try {
+ setState(112);
+ _errHandler.sync(this);
+ switch ( getInterpreter().adaptivePredict(_input,6,_ctx) ) {
+ case 1:
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(109);
+ instruction();
+ }
+ break;
+ case 2:
+ enterOuterAlt(_localctx, 2);
+ {
+ setState(110);
+ label();
+ }
+ break;
+ case 3:
+ enterOuterAlt(_localctx, 3);
+ {
+ setState(111);
+ switch_lookup();
+ }
+ break;
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class InstructionContext extends ParserRuleContext {
+ public Instruction_nameContext instruction_name() {
+ return getRuleContext(Instruction_nameContext.class,0);
+ }
+ public Instruction_operandContext instruction_operand() {
+ return getRuleContext(Instruction_operandContext.class,0);
+ }
+ public InstructionContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_instruction; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).enterInstruction(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).exitInstruction(this);
+ }
+ }
+
+ public final InstructionContext instruction() throws RecognitionException {
+ InstructionContext _localctx = new InstructionContext(_ctx, getState());
+ enterRule(_localctx, 26, RULE_instruction);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(114);
+ instruction_name();
+ setState(115);
+ instruction_operand();
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class LabelContext extends ParserRuleContext {
+ public TerminalNode IDENTIFIER() { return getToken(rs2asmParser.IDENTIFIER, 0); }
+ public LabelContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_label; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).enterLabel(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).exitLabel(this);
+ }
+ }
+
+ public final LabelContext label() throws RecognitionException {
+ LabelContext _localctx = new LabelContext(_ctx, getState());
+ enterRule(_localctx, 28, RULE_label);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(117);
+ match(IDENTIFIER);
+ setState(118);
+ match(T__5);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class Instruction_nameContext extends ParserRuleContext {
+ public Name_stringContext name_string() {
+ return getRuleContext(Name_stringContext.class,0);
+ }
+ public Name_opcodeContext name_opcode() {
+ return getRuleContext(Name_opcodeContext.class,0);
+ }
+ public Instruction_nameContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_instruction_name; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).enterInstruction_name(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).exitInstruction_name(this);
+ }
+ }
+
+ public final Instruction_nameContext instruction_name() throws RecognitionException {
+ Instruction_nameContext _localctx = new Instruction_nameContext(_ctx, getState());
+ enterRule(_localctx, 30, RULE_instruction_name);
+ try {
+ setState(122);
+ _errHandler.sync(this);
+ switch (_input.LA(1)) {
+ case IDENTIFIER:
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(120);
+ name_string();
+ }
+ break;
+ case INT:
+ enterOuterAlt(_localctx, 2);
+ {
+ setState(121);
+ name_opcode();
+ }
+ break;
+ default:
+ throw new NoViableAltException(this);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class Name_stringContext extends ParserRuleContext {
+ public TerminalNode IDENTIFIER() { return getToken(rs2asmParser.IDENTIFIER, 0); }
+ public Name_stringContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_name_string; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).enterName_string(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).exitName_string(this);
+ }
+ }
+
+ public final Name_stringContext name_string() throws RecognitionException {
+ Name_stringContext _localctx = new Name_stringContext(_ctx, getState());
+ enterRule(_localctx, 32, RULE_name_string);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(124);
+ match(IDENTIFIER);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class Name_opcodeContext extends ParserRuleContext {
+ public TerminalNode INT() { return getToken(rs2asmParser.INT, 0); }
+ public Name_opcodeContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_name_opcode; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).enterName_opcode(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).exitName_opcode(this);
+ }
+ }
+
+ public final Name_opcodeContext name_opcode() throws RecognitionException {
+ Name_opcodeContext _localctx = new Name_opcodeContext(_ctx, getState());
+ enterRule(_localctx, 34, RULE_name_opcode);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(126);
+ match(INT);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class Instruction_operandContext extends ParserRuleContext {
+ public Operand_intContext operand_int() {
+ return getRuleContext(Operand_intContext.class,0);
+ }
+ public Operand_qstringContext operand_qstring() {
+ return getRuleContext(Operand_qstringContext.class,0);
+ }
+ public Operand_labelContext operand_label() {
+ return getRuleContext(Operand_labelContext.class,0);
+ }
+ public Instruction_operandContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_instruction_operand; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).enterInstruction_operand(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).exitInstruction_operand(this);
+ }
+ }
+
+ public final Instruction_operandContext instruction_operand() throws RecognitionException {
+ Instruction_operandContext _localctx = new Instruction_operandContext(_ctx, getState());
+ enterRule(_localctx, 36, RULE_instruction_operand);
+ try {
+ setState(132);
+ _errHandler.sync(this);
+ switch (_input.LA(1)) {
+ case INT:
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(128);
+ operand_int();
+ }
+ break;
+ case QSTRING:
+ enterOuterAlt(_localctx, 2);
+ {
+ setState(129);
+ operand_qstring();
+ }
+ break;
+ case IDENTIFIER:
+ enterOuterAlt(_localctx, 3);
+ {
+ setState(130);
+ operand_label();
+ }
+ break;
+ case NEWLINE:
+ enterOuterAlt(_localctx, 4);
+ {
+ }
+ break;
+ default:
+ throw new NoViableAltException(this);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class Operand_intContext extends ParserRuleContext {
+ public TerminalNode INT() { return getToken(rs2asmParser.INT, 0); }
+ public Operand_intContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_operand_int; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).enterOperand_int(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).exitOperand_int(this);
+ }
+ }
+
+ public final Operand_intContext operand_int() throws RecognitionException {
+ Operand_intContext _localctx = new Operand_intContext(_ctx, getState());
+ enterRule(_localctx, 38, RULE_operand_int);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(134);
+ match(INT);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class Operand_qstringContext extends ParserRuleContext {
+ public TerminalNode QSTRING() { return getToken(rs2asmParser.QSTRING, 0); }
+ public Operand_qstringContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_operand_qstring; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).enterOperand_qstring(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).exitOperand_qstring(this);
+ }
+ }
+
+ public final Operand_qstringContext operand_qstring() throws RecognitionException {
+ Operand_qstringContext _localctx = new Operand_qstringContext(_ctx, getState());
+ enterRule(_localctx, 40, RULE_operand_qstring);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(136);
+ match(QSTRING);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class Operand_labelContext extends ParserRuleContext {
+ public TerminalNode IDENTIFIER() { return getToken(rs2asmParser.IDENTIFIER, 0); }
+ public Operand_labelContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_operand_label; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).enterOperand_label(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).exitOperand_label(this);
+ }
+ }
+
+ public final Operand_labelContext operand_label() throws RecognitionException {
+ Operand_labelContext _localctx = new Operand_labelContext(_ctx, getState());
+ enterRule(_localctx, 42, RULE_operand_label);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(138);
+ match(IDENTIFIER);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class Switch_lookupContext extends ParserRuleContext {
+ public Switch_keyContext switch_key() {
+ return getRuleContext(Switch_keyContext.class,0);
+ }
+ public Switch_valueContext switch_value() {
+ return getRuleContext(Switch_valueContext.class,0);
+ }
+ public Switch_lookupContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_switch_lookup; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).enterSwitch_lookup(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).exitSwitch_lookup(this);
+ }
+ }
+
+ public final Switch_lookupContext switch_lookup() throws RecognitionException {
+ Switch_lookupContext _localctx = new Switch_lookupContext(_ctx, getState());
+ enterRule(_localctx, 44, RULE_switch_lookup);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(140);
+ switch_key();
+ setState(141);
+ match(T__5);
+ setState(142);
+ switch_value();
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class Switch_keyContext extends ParserRuleContext {
+ public TerminalNode INT() { return getToken(rs2asmParser.INT, 0); }
+ public Switch_keyContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_switch_key; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).enterSwitch_key(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).exitSwitch_key(this);
+ }
+ }
+
+ public final Switch_keyContext switch_key() throws RecognitionException {
+ Switch_keyContext _localctx = new Switch_keyContext(_ctx, getState());
+ enterRule(_localctx, 46, RULE_switch_key);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(144);
+ match(INT);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class Switch_valueContext extends ParserRuleContext {
+ public TerminalNode IDENTIFIER() { return getToken(rs2asmParser.IDENTIFIER, 0); }
+ public Switch_valueContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_switch_value; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).enterSwitch_value(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof rs2asmListener ) ((rs2asmListener)listener).exitSwitch_value(this);
+ }
+ }
+
+ public final Switch_valueContext switch_value() throws RecognitionException {
+ Switch_valueContext _localctx = new Switch_valueContext(_ctx, getState());
+ enterRule(_localctx, 48, RULE_switch_value);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(146);
+ match(IDENTIFIER);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static final String _serializedATN =
+ "\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\3\16\u0097\4\2\t\2"+
+ "\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+
+ "\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
+ "\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
+ "\4\32\t\32\3\2\7\2\66\n\2\f\2\16\29\13\2\3\2\3\2\6\2=\n\2\r\2\16\2>\7"+
+ "\2A\n\2\f\2\16\2D\13\2\3\2\3\2\6\2H\n\2\r\2\16\2I\6\2L\n\2\r\2\16\2M\3"+
+ "\3\3\3\3\3\3\3\3\3\5\3U\n\3\3\4\3\4\3\4\3\5\3\5\3\5\3\6\3\6\3\6\3\7\3"+
+ "\7\3\7\3\b\3\b\3\b\3\t\3\t\3\n\3\n\3\13\3\13\3\f\3\f\3\r\3\r\3\16\3\16"+
+ "\3\16\5\16s\n\16\3\17\3\17\3\17\3\20\3\20\3\20\3\21\3\21\5\21}\n\21\3"+
+ "\22\3\22\3\23\3\23\3\24\3\24\3\24\3\24\5\24\u0087\n\24\3\25\3\25\3\26"+
+ "\3\26\3\27\3\27\3\30\3\30\3\30\3\30\3\31\3\31\3\32\3\32\3\32\2\2\33\2"+
+ "\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\2\2\u008c\2\67\3"+
+ "\2\2\2\4T\3\2\2\2\6V\3\2\2\2\bY\3\2\2\2\n\\\3\2\2\2\f_\3\2\2\2\16b\3\2"+
+ "\2\2\20e\3\2\2\2\22g\3\2\2\2\24i\3\2\2\2\26k\3\2\2\2\30m\3\2\2\2\32r\3"+
+ "\2\2\2\34t\3\2\2\2\36w\3\2\2\2 |\3\2\2\2\"~\3\2\2\2$\u0080\3\2\2\2&\u0086"+
+ "\3\2\2\2(\u0088\3\2\2\2*\u008a\3\2\2\2,\u008c\3\2\2\2.\u008e\3\2\2\2\60"+
+ "\u0092\3\2\2\2\62\u0094\3\2\2\2\64\66\7\t\2\2\65\64\3\2\2\2\669\3\2\2"+
+ "\2\67\65\3\2\2\2\678\3\2\2\28B\3\2\2\29\67\3\2\2\2:<\5\4\3\2;=\7\t\2\2"+
+ "<;\3\2\2\2=>\3\2\2\2><\3\2\2\2>?\3\2\2\2?A\3\2\2\2@:\3\2\2\2AD\3\2\2\2"+
+ "B@\3\2\2\2BC\3\2\2\2CK\3\2\2\2DB\3\2\2\2EG\5\32\16\2FH\7\t\2\2GF\3\2\2"+
+ "\2HI\3\2\2\2IG\3\2\2\2IJ\3\2\2\2JL\3\2\2\2KE\3\2\2\2LM\3\2\2\2MK\3\2\2"+
+ "\2MN\3\2\2\2N\3\3\2\2\2OU\5\6\4\2PU\5\b\5\2QU\5\n\6\2RU\5\f\7\2SU\5\16"+
+ "\b\2TO\3\2\2\2TP\3\2\2\2TQ\3\2\2\2TR\3\2\2\2TS\3\2\2\2U\5\3\2\2\2VW\7"+
+ "\3\2\2WX\5\20\t\2X\7\3\2\2\2YZ\7\4\2\2Z[\5\22\n\2[\t\3\2\2\2\\]\7\5\2"+
+ "\2]^\5\24\13\2^\13\3\2\2\2_`\7\6\2\2`a\5\26\f\2a\r\3\2\2\2bc\7\7\2\2c"+
+ "d\5\30\r\2d\17\3\2\2\2ef\7\n\2\2f\21\3\2\2\2gh\7\n\2\2h\23\3\2\2\2ij\7"+
+ "\n\2\2j\25\3\2\2\2kl\7\n\2\2l\27\3\2\2\2mn\7\n\2\2n\31\3\2\2\2os\5\34"+
+ "\17\2ps\5\36\20\2qs\5.\30\2ro\3\2\2\2rp\3\2\2\2rq\3\2\2\2s\33\3\2\2\2"+
+ "tu\5 \21\2uv\5&\24\2v\35\3\2\2\2wx\7\f\2\2xy\7\b\2\2y\37\3\2\2\2z}\5\""+
+ "\22\2{}\5$\23\2|z\3\2\2\2|{\3\2\2\2}!\3\2\2\2~\177\7\f\2\2\177#\3\2\2"+
+ "\2\u0080\u0081\7\n\2\2\u0081%\3\2\2\2\u0082\u0087\5(\25\2\u0083\u0087"+
+ "\5*\26\2\u0084\u0087\5,\27\2\u0085\u0087\3\2\2\2\u0086\u0082\3\2\2\2\u0086"+
+ "\u0083\3\2\2\2\u0086\u0084\3\2\2\2\u0086\u0085\3\2\2\2\u0087\'\3\2\2\2"+
+ "\u0088\u0089\7\n\2\2\u0089)\3\2\2\2\u008a\u008b\7\13\2\2\u008b+\3\2\2"+
+ "\2\u008c\u008d\7\f\2\2\u008d-\3\2\2\2\u008e\u008f\5\60\31\2\u008f\u0090"+
+ "\7\b\2\2\u0090\u0091\5\62\32\2\u0091/\3\2\2\2\u0092\u0093\7\n\2\2\u0093"+
+ "\61\3\2\2\2\u0094\u0095\7\f\2\2\u0095\63\3\2\2\2\13\67>BIMTr|\u0086";
+ public static final ATN _ATN =
+ new ATNDeserializer().deserialize(_serializedATN.toCharArray());
+ static {
+ _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()];
+ for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) {
+ _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i);
+ }
+ }
+}
\ No newline at end of file
diff --git a/cache/src/main/java/net/runelite/cache/script/rs2asm.tokens b/cache/src/main/java/net/runelite/cache/script/rs2asm.tokens
new file mode 100644
index 0000000000..de505a0dff
--- /dev/null
+++ b/cache/src/main/java/net/runelite/cache/script/rs2asm.tokens
@@ -0,0 +1,18 @@
+T__0=1
+T__1=2
+T__2=3
+T__3=4
+T__4=5
+T__5=6
+NEWLINE=7
+INT=8
+QSTRING=9
+IDENTIFIER=10
+COMMENT=11
+WS=12
+'.id '=1
+'.int_stack_count '=2
+'.string_stack_count '=3
+'.int_var_count '=4
+'.string_var_count '=5
+':'=6
diff --git a/cache/src/main/java/net/runelite/cache/script/rs2asmLexer.tokens b/cache/src/main/java/net/runelite/cache/script/rs2asmLexer.tokens
new file mode 100644
index 0000000000..de505a0dff
--- /dev/null
+++ b/cache/src/main/java/net/runelite/cache/script/rs2asmLexer.tokens
@@ -0,0 +1,18 @@
+T__0=1
+T__1=2
+T__2=3
+T__3=4
+T__4=5
+T__5=6
+NEWLINE=7
+INT=8
+QSTRING=9
+IDENTIFIER=10
+COMMENT=11
+WS=12
+'.id '=1
+'.int_stack_count '=2
+'.string_stack_count '=3
+'.int_var_count '=4
+'.string_var_count '=5
+':'=6
diff --git a/cache/src/test/java/net/runelite/cache/item/ItemSpriteFactoryTest.java b/cache/src/test/java/net/runelite/cache/item/ItemSpriteFactoryTest.java
deleted file mode 100644
index 30fb140a1b..0000000000
--- a/cache/src/test/java/net/runelite/cache/item/ItemSpriteFactoryTest.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (c) 2018, Adam
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package net.runelite.cache.item;
-
-import java.awt.image.BufferedImage;
-import java.io.File;
-import java.io.IOException;
-import javax.imageio.ImageIO;
-import lombok.extern.slf4j.Slf4j;
-import net.runelite.cache.IndexType;
-import net.runelite.cache.ItemManager;
-import net.runelite.cache.SpriteManager;
-import net.runelite.cache.StoreLocation;
-import net.runelite.cache.TextureManager;
-import net.runelite.cache.definitions.ItemDefinition;
-import net.runelite.cache.definitions.ModelDefinition;
-import net.runelite.cache.definitions.loaders.ModelLoader;
-import net.runelite.cache.definitions.providers.ModelProvider;
-import net.runelite.cache.fs.Archive;
-import net.runelite.cache.fs.Index;
-import net.runelite.cache.fs.Store;
-import org.junit.Ignore;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
-
-@Slf4j
-public class ItemSpriteFactoryTest
-{
- @Rule
- public TemporaryFolder folder = StoreLocation.getTemporaryFolder();
-
- @Test
- @Ignore
- public void test() throws IOException
- {
- File base = StoreLocation.LOCATION,
- outDir = folder.newFolder();
-
- int count = 0;
-
- try (Store store = new Store(base))
- {
- store.load();
-
- ItemManager itemManager = new ItemManager(store);
- itemManager.load();
-
- ModelProvider modelProvider = new ModelProvider()
- {
- @Override
- public ModelDefinition provide(int modelId) throws IOException
- {
- Index models = store.getIndex(IndexType.MODELS);
- Archive archive = models.getArchive(modelId);
-
- byte[] data = archive.decompress(store.getStorage().loadArchive(archive));
- ModelDefinition inventoryModel = new ModelLoader().load(modelId, data);
- return inventoryModel;
- }
- };
-
- SpriteManager spriteManager = new SpriteManager(store);
- spriteManager.load();
-
- TextureManager textureManager = new TextureManager(store);
- textureManager.load();
-
- for (ItemDefinition itemDef : itemManager.getItems())
- {
- if (itemDef.name == null || itemDef.name.equalsIgnoreCase("null"))
- {
- continue;
- }
-
- try
- {
- BufferedImage sprite = ItemSpriteFactory.createSprite(itemManager, modelProvider, spriteManager, textureManager,
- itemDef.id, 1, 1, 3153952, false);
-
- File out = new File(outDir, itemDef.id + ".png");
- BufferedImage img = sprite;
- ImageIO.write(img, "PNG", out);
-
- ++count;
- }
- catch (Exception ex)
- {
- log.warn("error dumping item {}", itemDef.id, ex);
- }
- }
- }
-
- log.info("Dumped {} item images to {}", count, outDir);
- }
-}
\ No newline at end of file
diff --git a/deobfuscator/build.gradle b/deobfuscator/build.gradle
new file mode 100644
index 0000000000..7ee533ad4a
--- /dev/null
+++ b/deobfuscator/build.gradle
@@ -0,0 +1,22 @@
+
+description = 'Deobfuscator'
+dependencies {
+ compile project(':runelite-api')
+ compile project(':runescape-api')
+ compile group: 'net.runelite', name: 'fernflower', version:'20171017'
+ compile group: 'com.google.guava', name: 'guava', version:'28.0-jre'
+ compile group: 'org.slf4j', name: 'slf4j-api', version:'1.7.25'
+ compile group: 'com.google.code.gson', name: 'gson', version:'2.8.5'
+ compile group: 'org.ow2.asm', name: 'asm-debug-all', version:'5.2'
+ runtime group: 'org.slf4j', name: 'slf4j-simple', version:'1.7.26'
+ testCompile project(':rs-client')
+ testCompile group: 'net.runelite.rs', name: 'vanilla', version:'181'
+ testCompile group: 'junit', name: 'junit', version:'4.12'
+ testCompile group: 'org.mockito', name: 'mockito-all', version:'1.10.19'
+}
+
+task packageTests(type: Jar) {
+ from sourceSets.test.output
+ classifier = 'tests'
+}
+artifacts.archives packageTests
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000000..290541c738
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.3-bin.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/gradlew b/gradlew
new file mode 100644
index 0000000000..cccdd3d517
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,172 @@
+#!/usr/bin/env sh
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+ cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000000..f9553162f1
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,84 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/http-api/build.gradle b/http-api/build.gradle
new file mode 100644
index 0000000000..c97703b8fc
--- /dev/null
+++ b/http-api/build.gradle
@@ -0,0 +1,13 @@
+
+description = 'Web API'
+dependencies {
+ compile group: 'com.squareup.okhttp3', name: 'okhttp', version:'3.14.0'
+ compile group: 'com.google.code.gson', name: 'gson', version:'2.8.5'
+ compile group: 'org.slf4j', name: 'slf4j-api', version:'1.7.25'
+ compile group: 'org.apache.commons', name: 'commons-csv', version:'1.4'
+ compile group: 'io.reactivex.rxjava2', name: 'rxjava', version:'2.2.10'
+ testCompile group: 'junit', name: 'junit', version:'4.12'
+ testCompile group: 'org.slf4j', name: 'slf4j-simple', version:'1.7.26'
+ testCompile group: 'com.squareup.okhttp3', name: 'mockwebserver', version:'3.14.0'
+ compileOnly group: 'org.projectlombok', name: 'lombok', version:'1.18.8'
+}
diff --git a/http-service/build.gradle b/http-service/build.gradle
new file mode 100644
index 0000000000..44405d58fa
--- /dev/null
+++ b/http-service/build.gradle
@@ -0,0 +1,28 @@
+
+apply plugin: 'war'
+
+description = 'Web Service'
+dependencies {
+ compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version:'1.5.6.RELEASE'
+ compile group: 'org.springframework.boot', name: 'spring-boot-devtools', version:'1.5.6.RELEASE'
+ compile group: 'org.springframework', name: 'spring-jdbc', version:'4.3.10.RELEASE'
+ compile group: 'org.mapstruct', name: 'mapstruct-jdk8', version:'1.2.0.Final'
+ compile project(':http-api')
+ compile project(':cache')
+ compile group: 'org.sql2o', name: 'sql2o', version:'1.6.0'
+ compile group: 'com.google.guava', name: 'guava', version:'28.0-jre'
+ compile group: 'org.slf4j', name: 'slf4j-api', version:'1.7.25'
+ compile group: 'com.github.scribejava', name: 'scribejava-apis', version:'6.6.3'
+ compile group: 'io.minio', name: 'minio', version:'3.0.6'
+ compile(group: 'redis.clients', name: 'jedis', version:'3.0.1') {
+exclude(module: 'commons-pool2')
+ }
+ testCompile(group: 'org.springframework.boot', name: 'spring-boot-starter-test', version:'1.5.6.RELEASE') {
+exclude(module: 'commons-logging')
+ }
+ testCompile group: 'com.squareup.okhttp3', name: 'mockwebserver', version:'3.14.0'
+ testCompile group: 'com.h2database', name: 'h2', version:'1.4.196'
+ providedCompile group: 'org.springframework.boot', name: 'spring-boot-starter-tomcat', version:'1.5.6.RELEASE'
+ providedCompile group: 'org.projectlombok', name: 'lombok', version:'1.18.8'
+ providedCompile group: 'org.mariadb.jdbc', name: 'mariadb-java-client', version:'2.4.2'
+}
diff --git a/injected-client/build.gradle b/injected-client/build.gradle
new file mode 100644
index 0000000000..eb9ca810ae
--- /dev/null
+++ b/injected-client/build.gradle
@@ -0,0 +1,6 @@
+
+description = 'Injected Client'
+dependencies {
+ compile project(':rs-client')
+ compile group: 'net.runelite.rs', name: 'vanilla', version:'181'
+}
diff --git a/injector-plugin/build.gradle b/injector-plugin/build.gradle
new file mode 100644
index 0000000000..343525f9ce
--- /dev/null
+++ b/injector-plugin/build.gradle
@@ -0,0 +1,13 @@
+group = 'net.runelite.rs'
+description = 'Injector'
+dependencies {
+ compile project(':deobfuscator')
+ compile project(':mixins')
+ compile project(':runelite-api')
+ compile project(':runescape-api')
+ compile group: 'org.apache.maven', name: 'maven-plugin-api', version:'3.6.1'
+ testCompile project(':deobfuscator')
+ testCompile group: 'junit', name: 'junit', version:'4.12'
+ testCompile group: 'org.mockito', name: 'mockito-all', version:'1.10.19'
+ compileOnly group: 'org.apache.maven.plugin-tools', name: 'maven-plugin-annotations', version:'3.6.0'
+}
diff --git a/protocol-api/build.gradle b/protocol-api/build.gradle
new file mode 100644
index 0000000000..1bf7ca2cd2
--- /dev/null
+++ b/protocol-api/build.gradle
@@ -0,0 +1,9 @@
+
+description = 'Protocol API'
+dependencies {
+ compile project(':runelite-api')
+ compile group: 'org.slf4j', name: 'slf4j-api', version:'1.7.25'
+ compile group: 'com.google.guava', name: 'guava', version:'28.0-jre'
+ testCompile group: 'junit', name: 'junit', version:'4.12'
+ compileOnly group: 'org.projectlombok', name: 'lombok', version:'1.18.8'
+}
diff --git a/protocol/build.gradle b/protocol/build.gradle
new file mode 100644
index 0000000000..067154033f
--- /dev/null
+++ b/protocol/build.gradle
@@ -0,0 +1,10 @@
+
+description = 'Protocol'
+dependencies {
+ compile project(':protocol-api')
+ compile project(':cache')
+ compile group: 'com.google.guava', name: 'guava', version:'28.0-jre'
+ compile group: 'io.netty', name: 'netty-all', version:'4.1.37.Final'
+ testCompile group: 'junit', name: 'junit', version:'4.12'
+ compileOnly group: 'org.projectlombok', name: 'lombok', version:'1.18.8'
+}
diff --git a/runelite-api/build.gradle b/runelite-api/build.gradle
new file mode 100644
index 0000000000..04881187cd
--- /dev/null
+++ b/runelite-api/build.gradle
@@ -0,0 +1,8 @@
+
+description = 'RuneLite API'
+dependencies {
+ compile group: 'org.slf4j', name: 'slf4j-api', version:'1.7.25'
+ compile group: 'com.google.code.findbugs', name: 'jsr305', version:'3.0.2'
+ testCompile group: 'junit', name: 'junit', version:'4.12'
+ compileOnly group: 'org.projectlombok', name: 'lombok', version:'1.18.8'
+}
diff --git a/runelite-client/build.gradle b/runelite-client/build.gradle
new file mode 100644
index 0000000000..e4adb69553
--- /dev/null
+++ b/runelite-client/build.gradle
@@ -0,0 +1,49 @@
+
+description = 'RuneLite Client'
+dependencies {
+ compile group: 'org.slf4j', name: 'slf4j-api', version:'1.7.25'
+ compile group: 'ch.qos.logback', name: 'logback-classic', version:'1.2.3'
+ compile group: 'net.sf.jopt-simple', name: 'jopt-simple', version:'5.0.1'
+ compile group: 'com.google.guava', name: 'guava', version:'28.0-jre'
+ compile group: 'com.google.inject', name: 'guice', version:'4.1.0', classifier:'no_aop'
+ compile group: 'com.google.code.gson', name: 'gson', version:'2.8.5'
+ compile group: 'net.runelite.pushingpixels', name: 'substance', version:'8.0.02'
+ compile group: 'org.apache.commons', name: 'commons-text', version:'1.2'
+ compile group: 'org.jogamp.jogl', name: 'jogl-all', version:'2.3.2'
+ compile group: 'org.jogamp.gluegen', name: 'gluegen-rt', version:'2.3.2'
+ compile(group: 'io.sigpipe', name: 'jbsdiff', version:'1.0') {
+exclude(module: 'xz')
+ }
+ compile group: 'net.java.dev.jna', name: 'jna', version:'4.5.1'
+ compile group: 'net.java.dev.jna', name: 'jna-platform', version:'4.5.1'
+ compile project(':runelite-api')
+ compile project(':http-api')
+ compile group: 'net.runelite', name: 'discord', version:'1.1'
+ compile group: 'org.javassist', name: 'javassist', version:'3.25.0-GA'
+ compile group: 'org.xeustechnologies', name: 'jcl-core', version:'2.8'
+ compile group: 'org.jetbrains', name: 'annotations', version:'17.0.0'
+ compile group: 'com.github.joonasvali.naturalmouse', name: 'naturalmouse', version:'[1.0.0,)'
+ compile group: 'org.ow2.asm', name: 'asm-all', version:'6.0_BETA'
+ compile group: 'org.codehaus.plexus', name: 'plexus-utils', version:'3.2.0'
+ compile group: 'org.apache.httpcomponents', name: 'httpcore', version:'4.4.11'
+ compile group: 'org.apache.httpcomponents', name: 'httpmime', version:'4.5.9'
+ compile group: 'io.reactivex.rxjava2', name: 'rxjava', version:'2.2.10'
+ compile group: 'com.jakewharton.rxrelay2', name: 'rxrelay', version:'2.1.0'
+ runtime group: 'net.runelite.pushingpixels', name: 'trident', version:'1.5.00'
+ runtime group: 'org.jogamp.jogl', name: 'jogl-all', version:'2.3.2', classifier:'natives-windows-amd64'
+ runtime group: 'org.jogamp.jogl', name: 'jogl-all', version:'2.3.2', classifier:'natives-windows-i586'
+ runtime group: 'org.jogamp.jogl', name: 'jogl-all', version:'2.3.2', classifier:'natives-linux-amd64'
+ runtime group: 'org.jogamp.jogl', name: 'jogl-all', version:'2.3.2', classifier:'natives-linux-i586'
+ runtime group: 'org.jogamp.gluegen', name: 'gluegen-rt', version:'2.3.2', classifier:'natives-windows-amd64'
+ runtime group: 'org.jogamp.gluegen', name: 'gluegen-rt', version:'2.3.2', classifier:'natives-windows-i586'
+ runtime group: 'org.jogamp.gluegen', name: 'gluegen-rt', version:'2.3.2', classifier:'natives-linux-amd64'
+ runtime group: 'org.jogamp.gluegen', name: 'gluegen-rt', version:'2.3.2', classifier:'natives-linux-i586'
+ runtime project(':runescape-api')
+ testCompile group: 'junit', name: 'junit', version:'4.12'
+ testCompile group: 'org.hamcrest', name: 'hamcrest-library', version:'1.3'
+ testCompile group: 'org.mockito', name: 'mockito-all', version:'1.10.19'
+ testCompile group: 'com.google.inject.extensions', name: 'guice-testlib', version:'4.1.0'
+ testCompile group: 'com.google.inject.extensions', name: 'guice-grapher', version:'4.1.0'
+ compileOnly group: 'org.projectlombok', name: 'lombok', version:'1.18.8'
+ compileOnly group: 'net.runelite', name: 'orange-extensions', version:'1.0'
+}
diff --git a/runelite-mixins/build.gradle b/runelite-mixins/build.gradle
new file mode 100644
index 0000000000..198b761f2a
--- /dev/null
+++ b/runelite-mixins/build.gradle
@@ -0,0 +1,10 @@
+
+description = 'RuneLite Mixins'
+dependencies {
+ testCompile group: 'junit', name: 'junit', version:'4.12'
+ testCompile group: 'org.mockito', name: 'mockito-all', version:'1.10.19'
+ compileOnly group: 'org.slf4j', name: 'slf4j-api', version:'1.7.25'
+ compile project(':runescape-api')
+ compileOnly group: 'com.google.guava', name: 'guava', version:'28.0-jre'
+ compileOnly group: 'javax.inject', name: 'javax.inject', version:'1'
+}
diff --git a/runelite-plugin-archetype/build.gradle b/runelite-plugin-archetype/build.gradle
new file mode 100644
index 0000000000..9b3a33612e
--- /dev/null
+++ b/runelite-plugin-archetype/build.gradle
@@ -0,0 +1,2 @@
+
+description = 'RuneLite Plugin Archetype'
diff --git a/runelite-script-assembler-plugin/build.gradle b/runelite-script-assembler-plugin/build.gradle
new file mode 100644
index 0000000000..f15d1c92f2
--- /dev/null
+++ b/runelite-script-assembler-plugin/build.gradle
@@ -0,0 +1,8 @@
+
+description = 'Script Assembler Plugin'
+dependencies {
+ compile project(':cache')
+ compile project(':runelite-api')
+ compile group: 'org.apache.maven', name: 'maven-plugin-api', version:'3.6.1'
+ compileOnly group: 'org.apache.maven.plugin-tools', name: 'maven-plugin-annotations', version:'3.6.0'
+}
diff --git a/runescape-api/build.gradle b/runescape-api/build.gradle
new file mode 100644
index 0000000000..bd24d9fee3
--- /dev/null
+++ b/runescape-api/build.gradle
@@ -0,0 +1,5 @@
+group = 'net.runelite.rs'
+description = 'RuneScape API'
+dependencies {
+ compile project(':runelite-api')
+}
diff --git a/runescape-client/build.gradle b/runescape-client/build.gradle
new file mode 100644
index 0000000000..db6950afa5
--- /dev/null
+++ b/runescape-client/build.gradle
@@ -0,0 +1,8 @@
+group = 'net.runelite.rs'
+description = 'RuneScape Client'
+dependencies {
+ compile project(':runescape-api')
+ testCompile group: 'junit', name: 'junit', version:'4.12'
+ testCompile group: 'org.slf4j', name: 'slf4j-api', version:'1.7.26'
+ testCompile group: 'org.slf4j', name: 'slf4j-simple', version:'1.7.26'
+}
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 0000000000..65c644bf47
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1,36 @@
+rootProject.name = 'runelite-parent'
+include ':http-api'
+include ':cache'
+include ':runelite-api'
+include ':protocol-api'
+include ':protocol'
+include ':cache-client'
+include ':cache-updater'
+include ':runescape-api'
+include ':rs-client'
+include ':deobfuscator'
+include ':script-assembler-plugin'
+include ':client'
+include ':mixins'
+include ':injector-plugin'
+include ':injected-client'
+include ':runelite-plugin-archetype'
+include ':http-service'
+
+project(':http-api').projectDir = "$rootDir/http-api" as File
+project(':cache').projectDir = "$rootDir/cache" as File
+project(':runelite-api').projectDir = "$rootDir/runelite-api" as File
+project(':protocol-api').projectDir = "$rootDir/protocol-api" as File
+project(':protocol').projectDir = "$rootDir/protocol" as File
+project(':cache-client').projectDir = "$rootDir/cache-client" as File
+project(':cache-updater').projectDir = "$rootDir/cache-updater" as File
+project(':runescape-api').projectDir = "$rootDir/runescape-api" as File
+project(':rs-client').projectDir = "$rootDir/runescape-client" as File
+project(':deobfuscator').projectDir = "$rootDir/deobfuscator" as File
+project(':script-assembler-plugin').projectDir = "$rootDir/runelite-script-assembler-plugin" as File
+project(':client').projectDir = "$rootDir/runelite-client" as File
+project(':mixins').projectDir = "$rootDir/runelite-mixins" as File
+project(':injector-plugin').projectDir = "$rootDir/injector-plugin" as File
+project(':injected-client').projectDir = "$rootDir/injected-client" as File
+project(':runelite-plugin-archetype').projectDir = "$rootDir/runelite-plugin-archetype" as File
+project(':http-service').projectDir = "$rootDir/http-service" as File
\ No newline at end of file