From 6e2d0aeb7205d9c7215a4e5df93cb72226b231f9 Mon Sep 17 00:00:00 2001 From: volodya-lombrozo Date: Wed, 22 May 2024 14:19:00 +0300 Subject: [PATCH 01/41] feat(#229): found the ClassCastException problem with decompilation --- .../eolang/opeo/compilation/JeoCompiler.java | 11 +- .../opeo/compilation/DefaultCompilerTest.java | 15 +- .../StreamUtils$NonClosingOutputStream.xmir | 134 ++++++++++++++++++ 3 files changed, 155 insertions(+), 5 deletions(-) create mode 100644 src/test/resources/xmir/StreamUtils$NonClosingOutputStream.xmir diff --git a/src/main/java/org/eolang/opeo/compilation/JeoCompiler.java b/src/main/java/org/eolang/opeo/compilation/JeoCompiler.java index d6e94b93..88ad8056 100644 --- a/src/main/java/org/eolang/opeo/compilation/JeoCompiler.java +++ b/src/main/java/org/eolang/opeo/compilation/JeoCompiler.java @@ -77,7 +77,16 @@ private static XmlMethod compile(final XmlMethod method) { return method.withoutMaxs().withInstructions( new XmirParser(method.nodes()).toJeoNodes().toArray(XmlNode[]::new) ); - } catch (final IllegalArgumentException exception) { + } catch (final ClassCastException exception) { + throw new IllegalArgumentException( + String.format( + "Failed to compile method %s: %s", + method.name(), + method + ), + exception + ); + } catch (final IllegalArgumentException exception) { throw new IllegalArgumentException( String.format( "Failed to compile method %s: %s", diff --git a/src/test/java/org/eolang/opeo/compilation/DefaultCompilerTest.java b/src/test/java/org/eolang/opeo/compilation/DefaultCompilerTest.java index d4d971b5..ac11d4ba 100644 --- a/src/test/java/org/eolang/opeo/compilation/DefaultCompilerTest.java +++ b/src/test/java/org/eolang/opeo/compilation/DefaultCompilerTest.java @@ -35,6 +35,9 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.junit.jupiter.params.provider.ValueSource; /** * Test case for {@link DefaultCompiler}. @@ -81,9 +84,13 @@ void compilesSingleHighLevelXmir(@TempDir final Path temp) throws Exception { ); } - @Test - void compilesClassNameType(@TempDir final Path temp) throws Exception { - final String name = "JsonMixinModule$JsonMixinComponentScanner.xmir"; + @ParameterizedTest + @CsvSource({ + "JsonMixinModule$JsonMixinComponentScanner.xmir", + "StreamUtils$NonClosingOutputStream.xmir" + }) + void compilesDecompiledRepresentationSuccessfully(final String name, @TempDir final Path temp) + throws Exception { final Path input = temp.resolve("opeo-xmir").resolve(name); Files.createDirectories(input.getParent()); Files.write(input, new BytesOf(new ResourceOf(String.format("xmir/%s", name))).asBytes()); @@ -98,4 +105,4 @@ void compilesClassNameType(@TempDir final Path temp) throws Exception { FileMatchers.anExistingFile() ); } -} +} \ No newline at end of file diff --git a/src/test/resources/xmir/StreamUtils$NonClosingOutputStream.xmir b/src/test/resources/xmir/StreamUtils$NonClosingOutputStream.xmir new file mode 100644 index 00000000..1b204a78 --- /dev/null +++ b/src/test/resources/xmir/StreamUtils$NonClosingOutputStream.xmir @@ -0,0 +1,134 @@ + + + yv66vgAAADQAKQoABQAfCQAEACAKACEAIgcAJAcAJQEABjxpbml0PgEAGShMamF2YS9pby9PdXRwdXRTdHJlYW07KVYBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAEdGhpcwEAFk5vbkNsb3NpbmdPdXRwdXRTdHJlYW0BAAxJbm5lckNsYXNzZXMBAD1Mb3JnL3NwcmluZ2ZyYW1ld29yay91dGlsL1N0cmVhbVV0aWxzJE5vbkNsb3NpbmdPdXRwdXRTdHJlYW07AQADb3V0AQAWTGphdmEvaW8vT3V0cHV0U3RyZWFtOwEAEE1ldGhvZFBhcmFtZXRlcnMBAAV3cml0ZQEAByhbQklJKVYBAAFiAQACW0IBAANvZmYBAAFJAQADbGV0AQAKRXhjZXB0aW9ucwcAJgEABWNsb3NlAQADKClWAQAKU291cmNlRmlsZQEAEFN0cmVhbVV0aWxzLmphdmEMAAYABwwADwAQBwAnDAASABMHACgBADtvcmcvc3ByaW5nZnJhbWV3b3JrL3V0aWwvU3RyZWFtVXRpbHMkTm9uQ2xvc2luZ091dHB1dFN0cmVhbQEAGmphdmEvaW8vRmlsdGVyT3V0cHV0U3RyZWFtAQATamF2YS9pby9JT0V4Y2VwdGlvbgEAFGphdmEvaW8vT3V0cHV0U3RyZWFtAQAkb3JnL3NwcmluZ2ZyYW1ld29yay91dGlsL1N0cmVhbVV0aWxzACAABAAFAAAAAAADAAEABgAHAAIACAAAAD4AAgACAAAABiortwABsQAAAAIACQAAAAoAAgAAARkABQEaAAoAAAAWAAIAAAAGAAsADgAAAAAABgAPABAAAQARAAAABQEADwAAAAEAEgATAAMACAAAAFcABAAEAAAACyq0AAIrHB22AAOxAAAAAgAJAAAACgACAAABHwAKASAACgAAACoABAAAAAsACwAOAAAAAAALABQAFQABAAAACwAWABcAAgAAAAsAGAAXAAMAGQAAAAQAAQAaABEAAAANAwAUAAAAFgAAABgAAAABABsAHAACAAgAAAArAAAAAQAAAAGxAAAAAgAJAAAABgABAAABJAAKAAAADAABAAAAAQALAA4AAAAZAAAABAABABoAAgAdAAAAAgAeAA0AAAAKAAEABAAjAAwACg== + + + + + + package + org.springframework.util + org.springframework.util + + + alias + org.eolang.jeo.opcode + org.eolang.jeo.opcode + + + alias + org.eolang.jeo.label + org.eolang.jeo.label + + + + + 00 00 00 00 00 00 00 34 + 00 00 00 00 00 00 00 20 + 6A 61 76 61 2F 69 6F 2F 46 69 6C 74 65 72 4F 75 74 70 75 74 53 74 72 65 61 6D + + + 00 00 00 00 00 00 00 01 + 28 4C 6A 61 76 61 2F 69 6F 2F 4F 75 74 70 75 74 53 74 72 65 61 6D 3B 29 56 + + + + 00 00 00 00 00 00 00 02 + 00 00 00 00 00 00 00 02 + + + + + 65 30 66 61 63 66 64 38 2D 33 31 34 33 2D 34 32 36 33 2D 62 63 65 31 2D 62 36 37 62 33 33 39 36 30 39 36 39 + + + + + 30 38 66 37 38 38 30 33 2D 66 61 39 33 2D 34 36 62 34 2D 62 34 30 36 2D 64 36 64 30 61 61 39 64 65 30 65 31 + + 00 00 00 00 00 00 00 B1 + + 65 30 38 61 39 38 32 64 2D 61 39 62 39 2D 34 63 62 37 2D 62 63 64 38 2D 35 64 33 36 39 64 36 30 62 37 32 63 + + + + + 00 00 00 00 00 00 00 01 + 28 5B 42 49 49 29 56 + + + 6A 61 76 61 2F 69 6F 2F 49 4F 45 78 63 65 70 74 69 6F 6E + + + 00 00 00 00 00 00 00 04 + 00 00 00 00 00 00 00 04 + + + + + + + 62 33 65 38 62 32 36 66 2D 34 66 33 31 2D 34 36 32 66 2D 61 63 36 38 2D 32 61 63 64 64 66 37 36 35 31 66 38 + + + + + + + + + + + 36 34 64 64 31 36 66 64 2D 63 61 63 66 2D 34 61 64 31 2D 61 64 30 36 2D 61 62 30 61 34 32 64 34 63 38 61 62 + + 00 00 00 00 00 00 00 B1 + + 38 62 32 30 34 62 30 66 2D 37 36 33 61 2D 34 61 66 37 2D 38 34 34 62 2D 30 64 63 64 35 64 36 65 34 63 32 30 + + + + + 00 00 00 00 00 00 00 01 + 28 29 56 + + + 6A 61 76 61 2F 69 6F 2F 49 4F 45 78 63 65 70 74 69 6F 6E + + + 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 01 + + + + 33 33 62 61 63 62 30 64 2D 37 38 32 64 2D 34 30 30 30 2D 62 35 36 32 2D 37 38 64 65 65 61 33 66 31 36 39 30 + + 00 00 00 00 00 00 00 B1 + + 61 31 34 32 64 65 38 63 2D 62 37 34 64 2D 34 36 66 34 2D 39 31 34 61 2D 64 39 37 39 34 61 34 35 30 37 36 30 + + + + + + 6F 72 67 2F 73 70 72 69 6E 67 66 72 61 6D 65 77 6F 72 6B 2F 75 74 69 6C 2F 53 74 72 65 61 6D 55 74 69 6C 73 24 4E 6F 6E 43 6C 6F 73 69 6E 67 4F 75 74 70 75 74 53 74 72 65 61 6D + 6F 72 67 2F 73 70 72 69 6E 67 66 72 61 6D 65 77 6F 72 6B 2F 75 74 69 6C 2F 53 74 72 65 61 6D 55 74 69 6C 73 + 4E 6F 6E 43 6C 6F 73 69 6E 67 4F 75 74 70 75 74 53 74 72 65 61 6D + 00 00 00 00 00 00 00 0A + + + + + From 6c8579ebe35a9ae30648a43bb8c5ca1d645d2874 Mon Sep 17 00:00:00 2001 From: volodya-lombrozo Date: Wed, 22 May 2024 14:21:03 +0300 Subject: [PATCH 02/41] feat(#229): remove unnecessary methods from XMIR representation --- .../StreamUtils$NonClosingOutputStream.xmir | 50 ------------------- 1 file changed, 50 deletions(-) diff --git a/src/test/resources/xmir/StreamUtils$NonClosingOutputStream.xmir b/src/test/resources/xmir/StreamUtils$NonClosingOutputStream.xmir index 1b204a78..aefa2214 100644 --- a/src/test/resources/xmir/StreamUtils$NonClosingOutputStream.xmir +++ b/src/test/resources/xmir/StreamUtils$NonClosingOutputStream.xmir @@ -32,35 +32,6 @@ 00 00 00 00 00 00 00 20 6A 61 76 61 2F 69 6F 2F 46 69 6C 74 65 72 4F 75 74 70 75 74 53 74 72 65 61 6D - - 00 00 00 00 00 00 00 01 - 28 4C 6A 61 76 61 2F 69 6F 2F 4F 75 74 70 75 74 53 74 72 65 61 6D 3B 29 56 - - - - 00 00 00 00 00 00 00 02 - 00 00 00 00 00 00 00 02 - - - - - 65 30 66 61 63 66 64 38 2D 33 31 34 33 2D 34 32 36 33 2D 62 63 65 31 2D 62 36 37 62 33 33 39 36 30 39 36 39 - - - - - 30 38 66 37 38 38 30 33 2D 66 61 39 33 2D 34 36 62 34 2D 62 34 30 36 2D 64 36 64 30 61 61 39 64 65 30 65 31 - - 00 00 00 00 00 00 00 B1 - - 65 30 38 61 39 38 32 64 2D 61 39 62 39 2D 34 63 62 37 2D 62 63 64 38 2D 35 64 33 36 39 64 36 30 62 37 32 63 - - - 00 00 00 00 00 00 00 01 28 5B 42 49 49 29 56 @@ -100,27 +71,6 @@ - - 00 00 00 00 00 00 00 01 - 28 29 56 - - - 6A 61 76 61 2F 69 6F 2F 49 4F 45 78 63 65 70 74 69 6F 6E - - - 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 01 - - - - 33 33 62 61 63 62 30 64 2D 37 38 32 64 2D 34 30 30 30 2D 62 35 36 32 2D 37 38 64 65 65 61 33 66 31 36 39 30 - - 00 00 00 00 00 00 00 B1 - - 61 31 34 32 64 65 38 63 2D 62 37 34 64 2D 34 36 66 34 2D 39 31 34 61 2D 64 39 37 39 34 61 34 35 30 37 36 30 - - - 6F 72 67 2F 73 70 72 69 6E 67 66 72 61 6D 65 77 6F 72 6B 2F 75 74 69 6C 2F 53 74 72 65 61 6D 55 74 69 6C 73 24 4E 6F 6E 43 6C 6F 73 69 6E 67 4F 75 74 70 75 74 53 74 72 65 61 6D From 892487f8a07acd988a5056028a2328d2dc14b9bc Mon Sep 17 00:00:00 2001 From: volodya-lombrozo Date: Wed, 22 May 2024 14:55:43 +0300 Subject: [PATCH 03/41] feat(#229): use different verb for assigning local variable --- src/main/java/org/eolang/opeo/ast/VariableAssignment.java | 2 +- src/main/java/org/eolang/opeo/compilation/XmirParser.java | 2 +- .../java/org/eolang/opeo/ast/VariableAssignmentTest.java | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/eolang/opeo/ast/VariableAssignment.java b/src/main/java/org/eolang/opeo/ast/VariableAssignment.java index b2bf3785..6634b513 100644 --- a/src/main/java/org/eolang/opeo/ast/VariableAssignment.java +++ b/src/main/java/org/eolang/opeo/ast/VariableAssignment.java @@ -60,7 +60,7 @@ public VariableAssignment(final LocalVariable left, final AstNode right) { @Override public Iterable toXmir() { return new Directives().add("o") - .attr("base", ".write") + .attr("base", ".write-local-var") .append(this.left.toXmir()) .append(this.right.toXmir()) .up(); diff --git a/src/main/java/org/eolang/opeo/compilation/XmirParser.java b/src/main/java/org/eolang/opeo/compilation/XmirParser.java index a76f84fc..11bd1515 100644 --- a/src/main/java/org/eolang/opeo/compilation/XmirParser.java +++ b/src/main/java/org/eolang/opeo/compilation/XmirParser.java @@ -208,7 +208,7 @@ private AstNode node(final XmlNode node) { final AstNode index = this.node(inner.get(1)); final AstNode value = this.node(inner.get(2)); result = new StoreArray(array, index, value); - } else if (".write".equals(base)) { + } else if (".write-local-var".equals(base)) { final List inner = node.children().collect(Collectors.toList()); final AstNode target = this.node(inner.get(0)); final AstNode value = this.node(inner.get(1)); diff --git a/src/test/java/org/eolang/opeo/ast/VariableAssignmentTest.java b/src/test/java/org/eolang/opeo/ast/VariableAssignmentTest.java index 5dc16e57..ef9e469d 100644 --- a/src/test/java/org/eolang/opeo/ast/VariableAssignmentTest.java +++ b/src/test/java/org/eolang/opeo/ast/VariableAssignmentTest.java @@ -53,9 +53,9 @@ void convertsToXmirCorrectly() throws ImpossibleModificationException { ), xml, XhtmlMatchers.hasXPaths( - "./o[@base='.write']", - "./o[@base='.write']/o[@base='local1']", - "./o[@base='.write']/o[@base='int']" + "./o[@base='.write-local-var']", + "./o[@base='.write-local-var']/o[@base='local1']", + "./o[@base='.write-local-var']/o[@base='int']" ) ); } From a20a39d4b9925a0db241bac39de79ca7fce0dfa3 Mon Sep 17 00:00:00 2001 From: volodya-lombrozo Date: Wed, 22 May 2024 16:02:12 +0300 Subject: [PATCH 04/41] feat(#229): fix the problem with .getfield --- src/it/spring-fat/pom.xml | 3 +- .../org/eolang/opeo/ast/FieldRetrieval.java | 2 +- .../eolang/opeo/compilation/JeoCompiler.java | 11 +- .../eolang/opeo/compilation/XmirParser.java | 2 +- .../eolang/opeo/ast/FieldRetrievalTest.java | 4 +- .../opeo/compilation/DefaultCompilerTest.java | 3 +- src/test/resources/packs/simple_objects.yaml | 4 +- src/test/resources/xmir/Enhancer$3.xmir | 123 ++++++++++++++++++ .../StreamUtils$NonClosingOutputStream.xmir | 2 +- 9 files changed, 144 insertions(+), 10 deletions(-) create mode 100644 src/test/resources/xmir/Enhancer$3.xmir diff --git a/src/it/spring-fat/pom.xml b/src/it/spring-fat/pom.xml index 9b637488..fca8c6b0 100644 --- a/src/it/spring-fat/pom.xml +++ b/src/it/spring-fat/pom.xml @@ -286,7 +286,8 @@ SOFTWARE. compile - ${opeo.compile.input} + + ${opeo.modified} ${opeo.compile.output} diff --git a/src/main/java/org/eolang/opeo/ast/FieldRetrieval.java b/src/main/java/org/eolang/opeo/ast/FieldRetrieval.java index b6c4dad7..f152bb70 100644 --- a/src/main/java/org/eolang/opeo/ast/FieldRetrieval.java +++ b/src/main/java/org/eolang/opeo/ast/FieldRetrieval.java @@ -78,7 +78,7 @@ public FieldRetrieval(final Field field) { @Override public Iterable toXmir() { return new Directives().add("o") - .attr("base", ".getfield") + .attr("base", ".get-field") .append(this.field.toXmir()) .up(); } diff --git a/src/main/java/org/eolang/opeo/compilation/JeoCompiler.java b/src/main/java/org/eolang/opeo/compilation/JeoCompiler.java index 88ad8056..3410f978 100644 --- a/src/main/java/org/eolang/opeo/compilation/JeoCompiler.java +++ b/src/main/java/org/eolang/opeo/compilation/JeoCompiler.java @@ -86,7 +86,7 @@ private static XmlMethod compile(final XmlMethod method) { ), exception ); - } catch (final IllegalArgumentException exception) { + } catch (final IllegalArgumentException exception) { throw new IllegalArgumentException( String.format( "Failed to compile method %s: %s", @@ -104,6 +104,15 @@ private static XmlMethod compile(final XmlMethod method) { ), exception ); + } catch (final Exception exception) { + throw new IllegalStateException( + String.format( + "Failed to compile method %s: %s", + method.name(), + method + ), + exception + ); } } } diff --git a/src/main/java/org/eolang/opeo/compilation/XmirParser.java b/src/main/java/org/eolang/opeo/compilation/XmirParser.java index 11bd1515..58911d3c 100644 --- a/src/main/java/org/eolang/opeo/compilation/XmirParser.java +++ b/src/main/java/org/eolang/opeo/compilation/XmirParser.java @@ -213,7 +213,7 @@ private AstNode node(final XmlNode node) { final AstNode target = this.node(inner.get(0)); final AstNode value = this.node(inner.get(1)); result = new VariableAssignment((LocalVariable) target, value); - } else if (".getfield".equals(base)) { + } else if (".get-field".equals(base)) { final List inner = node.children().collect(Collectors.toList()); final XmlNode field = inner.get(0); result = new FieldRetrieval( diff --git a/src/test/java/org/eolang/opeo/ast/FieldRetrievalTest.java b/src/test/java/org/eolang/opeo/ast/FieldRetrievalTest.java index 8c086975..5916f2f7 100644 --- a/src/test/java/org/eolang/opeo/ast/FieldRetrievalTest.java +++ b/src/test/java/org/eolang/opeo/ast/FieldRetrievalTest.java @@ -55,8 +55,8 @@ void convertsToXmir() throws ImpossibleModificationException { actual, XhtmlMatchers.hasXPaths( "./o[@name='method']", - "./o[@name='method']/o[@base='.getfield']/o[@base='.bar']", - "./o[@name='method']/o[@base='.getfield']/o[@base='.bar']/o[@base='$']" + "./o[@name='method']/o[@base='.get-field']/o[@base='.bar']", + "./o[@name='method']/o[@base='.get-field']/o[@base='.bar']/o[@base='$']" ) ); } diff --git a/src/test/java/org/eolang/opeo/compilation/DefaultCompilerTest.java b/src/test/java/org/eolang/opeo/compilation/DefaultCompilerTest.java index ac11d4ba..931ef2b4 100644 --- a/src/test/java/org/eolang/opeo/compilation/DefaultCompilerTest.java +++ b/src/test/java/org/eolang/opeo/compilation/DefaultCompilerTest.java @@ -87,7 +87,8 @@ void compilesSingleHighLevelXmir(@TempDir final Path temp) throws Exception { @ParameterizedTest @CsvSource({ "JsonMixinModule$JsonMixinComponentScanner.xmir", - "StreamUtils$NonClosingOutputStream.xmir" + "StreamUtils$NonClosingOutputStream.xmir", + "Enhancer$3.xmir" }) void compilesDecompiledRepresentationSuccessfully(final String name, @TempDir final Path temp) throws Exception { diff --git a/src/test/resources/packs/simple_objects.yaml b/src/test/resources/packs/simple_objects.yaml index a2cdd17a..a36b516d 100644 --- a/src/test/resources/packs/simple_objects.yaml +++ b/src/test/resources/packs/simple_objects.yaml @@ -133,7 +133,7 @@ eo: times $ .x - .getfield + .get-field 2 opcode > IRETURN 172 @@ -191,7 +191,7 @@ eo: * $ .a - .getfield + .get-field .foo .plus 1 diff --git a/src/test/resources/xmir/Enhancer$3.xmir b/src/test/resources/xmir/Enhancer$3.xmir new file mode 100644 index 00000000..a685d291 --- /dev/null +++ b/src/test/resources/xmir/Enhancer$3.xmir @@ -0,0 +1,123 @@ + + + yv66vgAAADQAPgkACQAmCQAJACcKAAoAKAoAJAApCgAqACsKACoALAoAKgAtCgAqAC4HAC8HADAHADEBAAV2YWwkZQEALExvcmcvc3ByaW5nZnJhbWV3b3JrL2NnbGliL2NvcmUvQ29kZUVtaXR0ZXI7AQAGdGhpcyQwAQAqTG9yZy9zcHJpbmdmcmFtZXdvcmsvY2dsaWIvcHJveHkvRW5oYW5jZXI7AQAGPGluaXQ+AQBZKExvcmcvc3ByaW5nZnJhbWV3b3JrL2NnbGliL3Byb3h5L0VuaGFuY2VyO0xvcmcvc3ByaW5nZnJhbWV3b3JrL2NnbGliL2NvcmUvQ29kZUVtaXR0ZXI7KVYBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAEdGhpcwEADElubmVyQ2xhc3NlcwEALExvcmcvc3ByaW5nZnJhbWV3b3JrL2NnbGliL3Byb3h5L0VuaGFuY2VyJDM7AQAQTWV0aG9kUGFyYW1ldGVycwEAC3Byb2Nlc3NDYXNlAQAjKElMb3JnL3NwcmluZ2ZyYW1ld29yay9hc20vTGFiZWw7KVYBAANrZXkBAAFJAQADZW5kAQAfTG9yZy9zcHJpbmdmcmFtZXdvcmsvYXNtL0xhYmVsOwEADnByb2Nlc3NEZWZhdWx0AQADKClWAQAKU291cmNlRmlsZQEADUVuaGFuY2VyLmphdmEBAA9FbmNsb3NpbmdNZXRob2QHADIMADMANAwADgAPDAAMAA0MABAAIAwANQA2BwA3DAA4ADkMADoAOwwAPAAgDAA9ACABACpvcmcvc3ByaW5nZnJhbWV3b3JrL2NnbGliL3Byb3h5L0VuaGFuY2VyJDMBABBqYXZhL2xhbmcvT2JqZWN0AQA0b3JnL3NwcmluZ2ZyYW1ld29yay9jZ2xpYi9jb3JlL1Byb2Nlc3NTd2l0Y2hDYWxsYmFjawEAKG9yZy9zcHJpbmdmcmFtZXdvcmsvY2dsaWIvcHJveHkvRW5oYW5jZXIBAA9lbWl0R2V0Q2FsbGJhY2sBADIoTG9yZy9zcHJpbmdmcmFtZXdvcmsvY2dsaWIvY29yZS9DbGFzc0VtaXR0ZXI7W0kpVgEACmFjY2VzcyQxMDABABUoSSlMamF2YS9sYW5nL1N0cmluZzsBACpvcmcvc3ByaW5nZnJhbWV3b3JrL2NnbGliL2NvcmUvQ29kZUVtaXR0ZXIBAAhnZXRmaWVsZAEAFShMamF2YS9sYW5nL1N0cmluZzspVgEABGdvVG8BACIoTG9yZy9zcHJpbmdmcmFtZXdvcmsvYXNtL0xhYmVsOylWAQADcG9wAQALYWNvbnN0X251bGwAIAAJAAoAAQALAAIQEAAMAA0AABAQAA4ADwAAAAMAAAAQABEAAgASAAAAQwACAAMAAAAPKiu1AAEqLLUAAiq3AAOxAAAAAgATAAAABgABAAAEHQAUAAAAFgACAAAADwAVABcAAAAAAA8ADgAPAAEAGAAAAAkCAA6AEAAMEBAAAQAZABoAAgASAAAAWgACAAMAAAAUKrQAAhu4AAS2AAUqtAACLLYABrEAAAACABMAAAAOAAMAAAQfAAsEIAATBCEAFAAAACAAAwAAABQAFQAXAAAAAAAUABsAHAABAAAAFAAdAB4AAgAYAAAACQIAGwAAAB0AAAABAB8AIAABABIAAABBAAEAAQAAAA8qtAACtgAHKrQAArYACLEAAAACABMAAAAOAAMAAAQkAAcEJQAOBCYAFAAAAAwAAQAAAA8AFQAXAAAAAwAhAAAAAgAiACMAAAAEACQAJQAWAAAACgABAAkAAAAAAAA= + + + + + + package + org.springframework.cglib.proxy + org.springframework.cglib.proxy + + + alias + org.eolang.jeo.opcode + org.eolang.jeo.opcode + + + alias + org.eolang.jeo.label + org.eolang.jeo.label + + + + + 00 00 00 00 00 00 00 34 + 00 00 00 00 00 00 00 20 + 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 + + 6F 72 67 2F 73 70 72 69 6E 67 66 72 61 6D 65 77 6F 72 6B 2F 63 67 6C 69 62 2F 63 6F 72 65 2F 50 72 6F 63 65 73 73 53 77 69 74 63 68 43 61 6C 6C 62 61 63 6B + + + 00 00 00 00 00 00 10 10 + 4C 6F 72 67 2F 73 70 72 69 6E 67 66 72 61 6D 65 77 6F 72 6B 2F 63 67 6C 69 62 2F 63 6F 72 65 2F 43 6F 64 65 45 6D 69 74 74 65 72 3B + + + + + 00 00 00 00 00 00 10 10 + 4C 6F 72 67 2F 73 70 72 69 6E 67 66 72 61 6D 65 77 6F 72 6B 2F 63 67 6C 69 62 2F 70 72 6F 78 79 2F 45 6E 68 61 6E 63 65 72 3B + + + + + + 00 00 00 00 00 00 00 01 + 28 49 4C 6F 72 67 2F 73 70 72 69 6E 67 66 72 61 6D 65 77 6F 72 6B 2F 61 73 6D 2F 4C 61 62 65 6C 3B 29 56 + + + + 00 00 00 00 00 00 00 02 + 00 00 00 00 00 00 00 03 + + + + + + 39 34 64 63 32 62 30 65 2D 39 39 39 31 2D 34 31 62 33 2D 61 65 31 30 2D 65 39 35 61 32 37 64 38 31 61 63 64 + + + + + + + + + + + + 33 61 39 38 34 61 64 37 2D 63 33 32 31 2D 34 34 39 38 2D 39 30 30 36 2D 64 37 35 38 63 35 37 37 62 62 63 36 + + + + + + + + + 65 30 63 61 37 34 36 66 2D 62 33 63 37 2D 34 65 65 61 2D 61 34 64 36 2D 37 63 35 37 63 36 38 33 36 36 33 37 + + 00 00 00 00 00 00 00 B1 + + 31 39 35 32 65 36 36 32 2D 63 31 64 38 2D 34 61 30 34 2D 61 37 63 32 2D 62 61 64 35 39 33 62 31 30 35 31 64 + + + + + + 6F 72 67 2F 73 70 72 69 6E 67 66 72 61 6D 65 77 6F 72 6B 2F 63 67 6C 69 62 2F 70 72 6F 78 79 2F 45 6E 68 61 6E 63 65 72 24 33 + 00 00 00 00 00 00 00 00 + + + + + diff --git a/src/test/resources/xmir/StreamUtils$NonClosingOutputStream.xmir b/src/test/resources/xmir/StreamUtils$NonClosingOutputStream.xmir index aefa2214..c041e930 100644 --- a/src/test/resources/xmir/StreamUtils$NonClosingOutputStream.xmir +++ b/src/test/resources/xmir/StreamUtils$NonClosingOutputStream.xmir @@ -52,7 +52,7 @@ - + From 2066df4819c418615f8974283863b8602e7b4903 Mon Sep 17 00:00:00 2001 From: volodya-lombrozo Date: Wed, 22 May 2024 16:25:50 +0300 Subject: [PATCH 05/41] feat(#229): use correct folder for opeo compilation in 'spring-fat' integration test --- src/it/spring-fat/pom.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/it/spring-fat/pom.xml b/src/it/spring-fat/pom.xml index fca8c6b0..9b637488 100644 --- a/src/it/spring-fat/pom.xml +++ b/src/it/spring-fat/pom.xml @@ -286,8 +286,7 @@ SOFTWARE. compile - - ${opeo.modified} + ${opeo.compile.input} ${opeo.compile.output} From fdc880296e16fda163ee0f42e21302247542f7bf Mon Sep 17 00:00:00 2001 From: volodya-lombrozo Date: Wed, 22 May 2024 16:35:22 +0300 Subject: [PATCH 06/41] feat(#229): fix all qulice suggestions --- src/main/java/org/eolang/opeo/compilation/JeoCompiler.java | 2 ++ .../java/org/eolang/opeo/compilation/DefaultCompilerTest.java | 3 +-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/eolang/opeo/compilation/JeoCompiler.java b/src/main/java/org/eolang/opeo/compilation/JeoCompiler.java index 3410f978..abb917ed 100644 --- a/src/main/java/org/eolang/opeo/compilation/JeoCompiler.java +++ b/src/main/java/org/eolang/opeo/compilation/JeoCompiler.java @@ -71,7 +71,9 @@ public XML compile() { * * @param method The method to compile. * @return The compiled method. + * @checkstyle IllegalCatch (50 lines) */ + @SuppressWarnings({"PMD.AvoidCatchingGenericException", "PMD.IdenticalCatchBranches"}) private static XmlMethod compile(final XmlMethod method) { try { return method.withoutMaxs().withInstructions( diff --git a/src/test/java/org/eolang/opeo/compilation/DefaultCompilerTest.java b/src/test/java/org/eolang/opeo/compilation/DefaultCompilerTest.java index 931ef2b4..3526bf36 100644 --- a/src/test/java/org/eolang/opeo/compilation/DefaultCompilerTest.java +++ b/src/test/java/org/eolang/opeo/compilation/DefaultCompilerTest.java @@ -37,7 +37,6 @@ import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; -import org.junit.jupiter.params.provider.ValueSource; /** * Test case for {@link DefaultCompiler}. @@ -106,4 +105,4 @@ void compilesDecompiledRepresentationSuccessfully(final String name, @TempDir fi FileMatchers.anExistingFile() ); } -} \ No newline at end of file +} From 393e32b4591672175a5338b78f3ad1bb8cf21d43 Mon Sep 17 00:00:00 2001 From: volodya-lombrozo Date: Wed, 22 May 2024 16:52:37 +0300 Subject: [PATCH 07/41] feat(#229): add one more puzzle to refactor JeoCompiler#compile method --- src/main/java/org/eolang/opeo/SelectiveDecompiler.java | 2 +- src/main/java/org/eolang/opeo/compilation/JeoCompiler.java | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/eolang/opeo/SelectiveDecompiler.java b/src/main/java/org/eolang/opeo/SelectiveDecompiler.java index 3cc7bf55..0dcce98b 100644 --- a/src/main/java/org/eolang/opeo/SelectiveDecompiler.java +++ b/src/main/java/org/eolang/opeo/SelectiveDecompiler.java @@ -134,7 +134,7 @@ public SelectiveDecompiler( @Override public void decompile() { - this.storage.all().forEach( + this.storage.all().parallel().forEach( entry -> { final XmirEntry res; final List found = entry.xpath(this.xpath()); diff --git a/src/main/java/org/eolang/opeo/compilation/JeoCompiler.java b/src/main/java/org/eolang/opeo/compilation/JeoCompiler.java index abb917ed..44883a8c 100644 --- a/src/main/java/org/eolang/opeo/compilation/JeoCompiler.java +++ b/src/main/java/org/eolang/opeo/compilation/JeoCompiler.java @@ -72,6 +72,10 @@ public XML compile() { * @param method The method to compile. * @return The compiled method. * @checkstyle IllegalCatch (50 lines) + * @todo #229:90min Refactor {@link #compile} method to handle exceptions appropriately. + * The method {@link #compile} is catching generic exceptions which is bad. + * We should refactor it to simplify the code and remove duplicated catch blocks. + * After, don't forget to remove the Checkstyle and PMD tags. */ @SuppressWarnings({"PMD.AvoidCatchingGenericException", "PMD.IdenticalCatchBranches"}) private static XmlMethod compile(final XmlMethod method) { From 72a8c682b1f192ad9eaec2a60ea996a815aa984e Mon Sep 17 00:00:00 2001 From: volodya-lombrozo Date: Wed, 22 May 2024 17:01:18 +0300 Subject: [PATCH 08/41] feat(#229): change the order of tags in javadoc --- src/main/java/org/eolang/opeo/compilation/JeoCompiler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/eolang/opeo/compilation/JeoCompiler.java b/src/main/java/org/eolang/opeo/compilation/JeoCompiler.java index 44883a8c..63817576 100644 --- a/src/main/java/org/eolang/opeo/compilation/JeoCompiler.java +++ b/src/main/java/org/eolang/opeo/compilation/JeoCompiler.java @@ -71,11 +71,11 @@ public XML compile() { * * @param method The method to compile. * @return The compiled method. - * @checkstyle IllegalCatch (50 lines) * @todo #229:90min Refactor {@link #compile} method to handle exceptions appropriately. * The method {@link #compile} is catching generic exceptions which is bad. * We should refactor it to simplify the code and remove duplicated catch blocks. * After, don't forget to remove the Checkstyle and PMD tags. + * @checkstyle IllegalCatch (50 lines) */ @SuppressWarnings({"PMD.AvoidCatchingGenericException", "PMD.IdenticalCatchBranches"}) private static XmlMethod compile(final XmlMethod method) { From 0941a4909adf92047de40a5ba5c0a7e6312d569c Mon Sep 17 00:00:00 2001 From: volodya-lombrozo Date: Wed, 22 May 2024 17:45:03 +0300 Subject: [PATCH 09/41] feat(#229): ignore one more target folder --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 5c210fc4..53f7b73a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .idea target +target-failed !src/it/decompile-compile/target \ No newline at end of file From 6faf61d4d1f82950d2d586010055cc6594cfe750 Mon Sep 17 00:00:00 2001 From: volodya-lombrozo Date: Thu, 23 May 2024 10:25:05 +0300 Subject: [PATCH 10/41] feat(#229): use different folders for resources --- .../org/eolang/opeo/compilation/DefaultCompilerTest.java | 5 ++++- .../org/eolang/opeo/decompilation/NaiveDecompilerTest.java | 2 +- src/test/resources/xmir/{ => decompiled}/Enhancer$3.xmir | 0 .../JsonMixinModule$JsonMixinComponentScanner.xmir | 0 .../{ => decompiled}/StreamUtils$NonClosingOutputStream.xmir | 0 .../xmir/{ => jeo}/BeanMethod$NonOverridableMethodError.xmir | 0 6 files changed, 5 insertions(+), 2 deletions(-) rename src/test/resources/xmir/{ => decompiled}/Enhancer$3.xmir (100%) rename src/test/resources/xmir/{ => decompiled}/JsonMixinModule$JsonMixinComponentScanner.xmir (100%) rename src/test/resources/xmir/{ => decompiled}/StreamUtils$NonClosingOutputStream.xmir (100%) rename src/test/resources/xmir/{ => jeo}/BeanMethod$NonOverridableMethodError.xmir (100%) diff --git a/src/test/java/org/eolang/opeo/compilation/DefaultCompilerTest.java b/src/test/java/org/eolang/opeo/compilation/DefaultCompilerTest.java index 3526bf36..d78cbc96 100644 --- a/src/test/java/org/eolang/opeo/compilation/DefaultCompilerTest.java +++ b/src/test/java/org/eolang/opeo/compilation/DefaultCompilerTest.java @@ -93,7 +93,10 @@ void compilesDecompiledRepresentationSuccessfully(final String name, @TempDir fi throws Exception { final Path input = temp.resolve("opeo-xmir").resolve(name); Files.createDirectories(input.getParent()); - Files.write(input, new BytesOf(new ResourceOf(String.format("xmir/%s", name))).asBytes()); + Files.write( + input, + new BytesOf(new ResourceOf(String.format("xmir/decompiled/%s", name))).asBytes() + ); new DefaultCompiler(temp).compile(); final Path expected = temp.resolve("xmir").resolve(name); MatcherAssert.assertThat( diff --git a/src/test/java/org/eolang/opeo/decompilation/NaiveDecompilerTest.java b/src/test/java/org/eolang/opeo/decompilation/NaiveDecompilerTest.java index 2ba7c815..6b5a3b42 100644 --- a/src/test/java/org/eolang/opeo/decompilation/NaiveDecompilerTest.java +++ b/src/test/java/org/eolang/opeo/decompilation/NaiveDecompilerTest.java @@ -63,7 +63,7 @@ void decompilesArrayStore(@TempDir final Path temp) throws Exception { final String name = "BeanMethod$NonOverridableMethodError.xmir"; final Path input = temp.resolve("xmir").resolve(name); Files.createDirectories(input.getParent()); - Files.write(input, new BytesOf(new ResourceOf(String.format("xmir/%s", name))).asBytes()); + Files.write(input, new BytesOf(new ResourceOf(String.format("xmir/jeo/%s", name))).asBytes()); new NaiveDecompiler(temp).decompile(); final Path expected = temp.resolve("opeo-xmir").resolve(name); MatcherAssert.assertThat( diff --git a/src/test/resources/xmir/Enhancer$3.xmir b/src/test/resources/xmir/decompiled/Enhancer$3.xmir similarity index 100% rename from src/test/resources/xmir/Enhancer$3.xmir rename to src/test/resources/xmir/decompiled/Enhancer$3.xmir diff --git a/src/test/resources/xmir/JsonMixinModule$JsonMixinComponentScanner.xmir b/src/test/resources/xmir/decompiled/JsonMixinModule$JsonMixinComponentScanner.xmir similarity index 100% rename from src/test/resources/xmir/JsonMixinModule$JsonMixinComponentScanner.xmir rename to src/test/resources/xmir/decompiled/JsonMixinModule$JsonMixinComponentScanner.xmir diff --git a/src/test/resources/xmir/StreamUtils$NonClosingOutputStream.xmir b/src/test/resources/xmir/decompiled/StreamUtils$NonClosingOutputStream.xmir similarity index 100% rename from src/test/resources/xmir/StreamUtils$NonClosingOutputStream.xmir rename to src/test/resources/xmir/decompiled/StreamUtils$NonClosingOutputStream.xmir diff --git a/src/test/resources/xmir/BeanMethod$NonOverridableMethodError.xmir b/src/test/resources/xmir/jeo/BeanMethod$NonOverridableMethodError.xmir similarity index 100% rename from src/test/resources/xmir/BeanMethod$NonOverridableMethodError.xmir rename to src/test/resources/xmir/jeo/BeanMethod$NonOverridableMethodError.xmir From c6d1da7b295fc2c73a457feb0e77019f3224f208 Mon Sep 17 00:00:00 2001 From: volodya-lombrozo Date: Thu, 23 May 2024 11:20:39 +0300 Subject: [PATCH 11/41] feat(#229): add short integration test that identifies the problem --- src/test/java/it/JeoAndOpeoTest.java | 69 ++++++++++++++++++ .../decompilation/NaiveDecompilerTest.java | 5 +- ...ilder$RedefinitionStrategy$Collector.class | Bin 0 -> 8846 bytes .../resources/bytecode/AgentBuilder.class | Bin 0 -> 9015 bytes .../BeanMethod$NonOverridableMethodError.xmir | 0 5 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 src/test/java/it/JeoAndOpeoTest.java create mode 100644 src/test/resources/bytecode/AgentBuilder$RedefinitionStrategy$Collector.class create mode 100644 src/test/resources/bytecode/AgentBuilder.class rename src/test/resources/xmir/{jeo => disassembled}/BeanMethod$NonOverridableMethodError.xmir (100%) diff --git a/src/test/java/it/JeoAndOpeoTest.java b/src/test/java/it/JeoAndOpeoTest.java new file mode 100644 index 00000000..b7f880bd --- /dev/null +++ b/src/test/java/it/JeoAndOpeoTest.java @@ -0,0 +1,69 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2016-2023 Objectionary.com + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package it; + +import org.cactoos.bytes.BytesOf; +import org.cactoos.io.ResourceOf; +import org.eolang.jeo.representation.BytecodeRepresentation; +import org.eolang.jeo.representation.XmirRepresentation; +import org.eolang.jeo.representation.bytecode.Bytecode; +import org.eolang.opeo.compilation.JeoCompiler; +import org.eolang.opeo.jeo.JeoDecompiler; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +/** + * Integration test for JEO and OPEO transformations. + * In this test, we check that the entire pipeline: + * '.class' -> 'jeo-xmir' -> 'opeo-xmir' -> 'jeo-xmir' -> '.class' + * @since 0.2 + */ +final class JeoAndOpeoTest { + + @ParameterizedTest + @CsvSource({ + "AgentBuilder.class", + "AgentBuilder$RedefinitionStrategy$Collector.class" + }) + void dissassemblesDecompilesCompilesAssembles(final String name) { + Assertions.assertDoesNotThrow( + () -> new XmirRepresentation( + new JeoCompiler( + new JeoDecompiler( + new BytecodeRepresentation( + new Bytecode( + new BytesOf( + new ResourceOf(String.format("bytecode/%s", name)) + ).asBytes() + ) + ).toEO() + ).decompile() + ).compile() + ).toBytecode(), + "We expect that the entire pipeline '.class' -> 'jeo-xmir' -> 'opeo-xmir' -> 'jeo-xmir' -> '.class' will not throw any exceptions." + ); + } + +} diff --git a/src/test/java/org/eolang/opeo/decompilation/NaiveDecompilerTest.java b/src/test/java/org/eolang/opeo/decompilation/NaiveDecompilerTest.java index 6b5a3b42..9b03f6bd 100644 --- a/src/test/java/org/eolang/opeo/decompilation/NaiveDecompilerTest.java +++ b/src/test/java/org/eolang/opeo/decompilation/NaiveDecompilerTest.java @@ -63,7 +63,10 @@ void decompilesArrayStore(@TempDir final Path temp) throws Exception { final String name = "BeanMethod$NonOverridableMethodError.xmir"; final Path input = temp.resolve("xmir").resolve(name); Files.createDirectories(input.getParent()); - Files.write(input, new BytesOf(new ResourceOf(String.format("xmir/jeo/%s", name))).asBytes()); + Files.write( + input, + new BytesOf(new ResourceOf(String.format("xmir/disassembled/%s", name))).asBytes() + ); new NaiveDecompiler(temp).decompile(); final Path expected = temp.resolve("opeo-xmir").resolve(name); MatcherAssert.assertThat( diff --git a/src/test/resources/bytecode/AgentBuilder$RedefinitionStrategy$Collector.class b/src/test/resources/bytecode/AgentBuilder$RedefinitionStrategy$Collector.class new file mode 100644 index 0000000000000000000000000000000000000000..3bc3a5e7083b1fa847f970ca42a692ee0facb854 GIT binary patch literal 8846 zcmdT~33yc175;BBlb4x!5Ox@WJdBY-LWrmcOb`u$NHl~H5CoTYGV=l>lX>aP1c)uI zrMBA5rCM5Tt=(+EVkwn?39Z=8w%Xd-(#0;;w(d)JEfuT%@15<FqD{{Ekhp*xu4g0*9h8r~W`LG%Ly{Nze`M6g;`hD1n0eQ+n`SvwA_jMoc z!y!4mU&A*vd{e`>1je@s8FV0+YTN}Al?iVJ9@32ijF z+XDjLw&0fKsj6wXIgDD0`m&r*iOi;M@6lW5;3>^_c+_^m=&li{0Jv8j~N>_6QOvd%Wen_-{-=T z!3zS53O{TJdY)GrjUa711PBO?R3MX}1dgdAdSA!L%Ez6oCF|(z+v)zoZmU&8Gj8sZ=4INF6)03{` z#t0pwsqiz0%B_{zR7&S44Oy{7gqclX{0yfD)vcF2dXgLC)|M1o<83IbGt+V#>9f-O z0#hB_b#bdEdHlZ}H^cd%Eg#oPttmCyT)xgJ*ANr= zm)Q_{Q}UL{?QJ^?oZ-;;ae3i25t6s{VlxukkoG$>Eb!F-jrOGVof=hhh3T-Otvi;C zbed}-i3nr1H5d5s-?6e7>V+tr_Yq7oKh76%Y$7+9NRTiO?&xCa+19lDu*bUd1`Y$AL)Wa zu_c8VrU0=;RPM%*=~oL|_0qWo78L5mj)F+uPTr+kL#8TO6B-`Y@FRg0Z*03^_*aLl zvby6TvoRv?qS5vqV76pQ$6EYY$9&Z3Scvmhjsi6KiBaK{8C3d9@X$`9lyn6I=b;Y9i50}wow6+)v1oh z@p~PAz#la{q2ozBt>GCR&*C`^&kM}SPh!W2hKxh%cmXf!_!IuD<1g~7{;A^#{zZM{WLg$XY@~+@Tw3sHL*|=fdZLc2@rqRWQ5~;Jk^ha?biB@f3)kX0 zGAx8Hif~jD#kz0_H@O!j0vEhVEU_?G0xRvWXupz8sld4>wfUQaU9MiN z9MoK&Rrt>K7Q0|7dq=@MQ81mer4U$HFs-c&%3KB~a%0j z4ijiRx$QEUL7+Al0=66a;#jVLS2cY$Hw#S5QK+RBE7@pu$HF$0;u$j6PRr*pQy^WK zt@POzSRJyV;I|rkrcZSdGaV`$OwX&Q%)tzcs|{vSZP085RX60HG1GQ)*_KE?DkKYC zc^fD{li!mVBCMl&Im9Nk%xv8Wr2ZLRjGRK`N@VtC+FI#(_dUX~#>?I>m9SHD3;g3moIFa|GO= z^8bw+G55u6=+;eOL?n??Tw^4j;2lEuXUpr2Br+L9V5VIaDgU-4+99iG}tP(#k%jlT_xYX{+hSIMjy8Vvm)q72V9^&tzcbQytI6 zc+QM`is3CP;Im>&B8iZ-*^INa%&P^5ai)TetXgHwiY<-DWz2_%(4EaZ_MG96c!(^p z-bQINtgLXYScBEs6=g5U%8%jH8n=?HI%vNoR%b9mD^_HZRl*E)%WsplP8{km{mGjR z#qERA$nm_@#@vaC-jV8RkOop8T^W|aFxkla zIF_pVRMbsR`#_c;FQ=*B8~81N+Mj55mh8N|@U)G=M2oqV8Nd}&U`)oExlM^>#nf#s zP&uP1rPbWBb1b)Q9u6(PZAcp=x0gL9XZhs$>6VjuE2kk<>lb%*llS>{`O*rq89$@4 z!BYaK4accsN_M*n$6$ON-;)uW_%kXn=`_3vOiN}wrFb1E=`Tu zsHrh~H3iw2LEvJ(7hw(DaIx#Sgfr_n^AL);H!!d207O-FABw7G^`W?`rVp+vzpD@K zD!;oAB~|{CK4?{btq-MD2jN+F0Ny_M_Nq{uD-*KaH{F&%j^) zER6E!aC-Uks4jm2=aj#QONrl>Iu@7Va*oJ=5>Kc%DPWO$lOh(YHz}k`y-6|M>P-q- zqTZya8rQGDTS-a5iYAgDa)hJR_d;)}+DDo8!BxE{$ zxrsii+VA3PX&QO7hU)5?DF-m77mWe8MC!*l!5=2)@?ER;b2z@3!|BdJ*B7JWd@Y8FKZ*@8)loBYV*lDA|b;f61YMmXG2m(kUe=q>4bP zL@GTL@Z=-)W3n5&JiD}BxC8FJR7r(w+cB03y9u`t?!a#Bp<4D}pMw2(1cy03j7JsR z!LIlS@rogh8pjkG^<}urkD#Lb6`WE2DwYvmWQ;(IA<$|RVUtmeEruJ{5ngZjaFa0w zw-_U_!x)WS#u)52CSi{;7W)YMjd6I`7>`Gci8yRbz@vnZ5x!(h#u3AhSB$C3IhK+0 zR{q}mHU!Ce1uT9-2+_Pd5LR>25sqeE=O|}Q`m>ztzy>;i8!uxcB9!7v&g$v4Fg9i5 zAWAHLgdhf;Mchj_@)2`jyml)lSJ(JmG>f0ck}p&GF|`D@;pSO>7pe;lYIVRPt?D@x@D78WGOxE6;{v6&YaW)nhbFtDm2dj+$))KBW=Fz6} zaTUkgj0MJ zv}czJ>j7msY0Uw=oi>zVJ)kTn!+JnjQ&TpakfxM2%;0Y#ek!ZQks$s=jgQnnfh1p2 zPmrJ+Jse3>ub`DQ!TtBbMr8kgvO{T?DIV=+_Aa$&q{ zH0gR+ITH!HPVv5m*N@EqOjn%Zw8k}#eM}x5zON~pg-dKkY<5EP7%Mdj# zr-iP_T3{(oOYV}C7|LuVhBsKDv+>b)ximgSpY$Wp6QxNCq3PFMt2OeR&#d~)HJ>Zy9a_g>X|^{R^d|NikO5gn!< z6}q9&vO@1O+LW;@?u?jPxy;K7RT(Lxyr5M~SD~AXQd63npP#UGuFwaJc4xIxPS-M4 z*>x%Ik*w&2eXf7{S75b3TwrQ^Of?*krzkGyWW*yBc7i_1*ol%~*G01il`j}C# z&p&RMe7I65a3>OY3&T7%%`|em&T09@sQ(>&&D!~dTAwi5I?Bs= z$5?9A>QhErGS&jmH-7$%(Tcc1DMbje@~-g}#GMao5&HYB>`# za~HFgDO$GUb-agJ^QCydG3r`2+<8W0eOZgUYOdM;Hq_Wl~!oA^a5f>q5` z3{&ThI^?y6YmEU$*OGEp@13q2C&y5bU`Y5>jwmld6rXW9mZAhpa^=b~%_f=js-=~T zyc$NAFW+|L#LBoSzUt*zN=fBgtgGgsDZ{7G_ed<45E*vG9ri-59;=LglF%d`kaY0ge?k}xZbpvL`4j&MO2sALR_ZIodRAjh_oTi(ug0sHa|KEV;f`jmr;1I5glzU+c_LsL!7DyoP_ z!z#+j-lZGm)r9ZwliDcjqH0SAMUUo=%tJ3;X4Ji`IiOh;GMq-NAmJE&b98`pv8Y?<)&QM&c=Me&^*efQNn>J(&Aq#80+FBuZ z+o2lVmnc}97%sW2dK;J3xMP=wEZtjOT`mfFg?>OaenE2_d%0FsugI zi-IyJm=Oytd}1`i~>qDKcF)iXl%inG}MEERgIYIjdeyMcsq&28v} zyZ#YV=t0~iWCH|8QRHXztgYc7)fspHE@qveyM+wuz@)G}VroB(NfGkF3dPz?Ije@# za?(*PjzQ6FK?kOYx=~2r0)f$$qzWB~)!N+zk{J?z{1nhSM5lR~yRKK_twPxw zQik`ZL*50cca&>Ww6f%tke)5Sh*rmqskCv9)-a__W&i#kR7?axqj|p9gKOz@_(-uv zB3Q#GjJ5}Jkeu9`t>a-0xo!ITx3K7fIKFsKlaOdFJi_sC`A>q1XG%h@-<;^Uk)53z{m&f(XXPNP_WEx(@ zF*+yAAEwC0OHmmWGEJWL7@ZVWA$bEVGdB6y!e~&KH+GDUJby}f_=+b-MrS1kH+z_5 zbX-_M{4tBsG2wBs1tUWje-vVLLYOY`xX0+Q@X-3pBcr3jW1{1f%&6$rMrIDbUexzyB7b?_1!eS%0#V)(L88KRi|Dr(D--YR>BSbzP z4e(fi#{+yNz*hr25#Y%H2Ln7E;F$o=26!&Op#X;i9Px3K#(W&7*L-~4$2*jv^U(7R zXt|EE&@V$1Vf#YY9h#)6u>Gdrp7zI2(oFb$7T@O*{pP6FZ?2&qql@%bIPMDgF4EPo z{kGqJCv3m#x3Bqp*GUV%=kWbH<-@k_w|Uqu`0b)UZk`Mu7iiH(lS)2XWCyt9<9p-; zSoVG4`u|p_3wWP)(IY_WSx=9GrJGWu0N0PE@E0yqfg6FFfR6zm?@rNXU=MH$@Co2n z;5OiP;0|Cfa3^pV@JZlPz^8$`fzJS+1wIFS9{2+AMPM5E5^xXjWndq0FR&lD54azA W0C*6n0uKRC;g Date: Thu, 23 May 2024 13:14:03 +0300 Subject: [PATCH 12/41] feat(#229): add ugly solution for 'maxs' counting --- .../java/org/eolang/opeo/ast/AstNode.java | 16 + .../eolang/opeo/compilation/JeoCompiler.java | 4 +- .../opeo/decompilation/OperandStack.java | 10 + .../decompilation/handlers/LabelHandler.java | 9 +- src/test/java/it/JeoAndOpeoTest.java | 24 +- .../opeo/compilation/JeoCompilerTest.java | 2 +- .../SelectiveDecompilerTest.java | 9 + ...ilder$RedefinitionStrategy$Collector.class | Bin 8846 -> 0 bytes ...uilder$RedefinitionStrategy$Collector.xmir | 1781 +++++++++++++++++ 9 files changed, 1845 insertions(+), 10 deletions(-) delete mode 100644 src/test/resources/bytecode/AgentBuilder$RedefinitionStrategy$Collector.class create mode 100644 src/test/resources/xmir/compiled/AgentBuilder$RedefinitionStrategy$Collector.xmir diff --git a/src/main/java/org/eolang/opeo/ast/AstNode.java b/src/main/java/org/eolang/opeo/ast/AstNode.java index 0e7dc4ba..0e9383dd 100644 --- a/src/main/java/org/eolang/opeo/ast/AstNode.java +++ b/src/main/java/org/eolang/opeo/ast/AstNode.java @@ -23,7 +23,9 @@ */ package org.eolang.opeo.ast; +import java.util.Collections; import java.util.List; +import org.xembly.Directive; /** * Abstract syntax tree node. @@ -36,4 +38,18 @@ public interface AstNode extends Xmir { * @return List of opcodes. */ List opcodes(); + + + class Empty implements AstNode { + + @Override + public List opcodes() { + return Collections.emptyList(); + } + + @Override + public Iterable toXmir() { + return Collections.emptyList(); + } + } } diff --git a/src/main/java/org/eolang/opeo/compilation/JeoCompiler.java b/src/main/java/org/eolang/opeo/compilation/JeoCompiler.java index 63817576..88ebf946 100644 --- a/src/main/java/org/eolang/opeo/compilation/JeoCompiler.java +++ b/src/main/java/org/eolang/opeo/compilation/JeoCompiler.java @@ -80,7 +80,9 @@ public XML compile() { @SuppressWarnings({"PMD.AvoidCatchingGenericException", "PMD.IdenticalCatchBranches"}) private static XmlMethod compile(final XmlMethod method) { try { - return method.withoutMaxs().withInstructions( + return method +// .withoutMaxs() + .withInstructions( new XmirParser(method.nodes()).toJeoNodes().toArray(XmlNode[]::new) ); } catch (final ClassCastException exception) { diff --git a/src/main/java/org/eolang/opeo/decompilation/OperandStack.java b/src/main/java/org/eolang/opeo/decompilation/OperandStack.java index 4a8872cf..20b0f982 100644 --- a/src/main/java/org/eolang/opeo/decompilation/OperandStack.java +++ b/src/main/java/org/eolang/opeo/decompilation/OperandStack.java @@ -28,6 +28,7 @@ import java.util.Iterator; import java.util.LinkedList; import java.util.List; +import java.util.Optional; import lombok.ToString; import org.eolang.opeo.ast.AstNode; import org.eolang.opeo.ast.Label; @@ -65,6 +66,15 @@ private OperandStack(final Deque original) { this.stack = original; } + + public Optional popOpt() { + if (this.stack.isEmpty()) { + return Optional.empty(); + } else { + return Optional.ofNullable(this.stack.pop()); + } + } + /** * Pop one node from the stack. * @return Node. diff --git a/src/main/java/org/eolang/opeo/decompilation/handlers/LabelHandler.java b/src/main/java/org/eolang/opeo/decompilation/handlers/LabelHandler.java index 420af2bd..52a0a4ac 100644 --- a/src/main/java/org/eolang/opeo/decompilation/handlers/LabelHandler.java +++ b/src/main/java/org/eolang/opeo/decompilation/handlers/LabelHandler.java @@ -23,7 +23,9 @@ */ package org.eolang.opeo.decompilation.handlers; +import org.eolang.opeo.ast.AstNode; import org.eolang.opeo.ast.Label; +import org.eolang.opeo.ast.Labeled; import org.eolang.opeo.decompilation.DecompilerState; import org.eolang.opeo.decompilation.InstructionHandler; @@ -35,6 +37,11 @@ public final class LabelHandler implements InstructionHandler { @Override public void handle(final DecompilerState state) { - state.stack().push(new Label(String.class.cast(state.operand(0)))); + final AstNode node1 = state.stack().popOpt().orElse(new AstNode.Empty()); + final Labeled node = new Labeled( + node1, + new Label(String.class.cast(state.operand(0))) + ); + state.stack().push(node); } } diff --git a/src/test/java/it/JeoAndOpeoTest.java b/src/test/java/it/JeoAndOpeoTest.java index b7f880bd..917167f4 100644 --- a/src/test/java/it/JeoAndOpeoTest.java +++ b/src/test/java/it/JeoAndOpeoTest.java @@ -23,6 +23,7 @@ */ package it; +import com.jcabi.xml.XMLDocument; import org.cactoos.bytes.BytesOf; import org.cactoos.io.ResourceOf; import org.eolang.jeo.representation.BytecodeRepresentation; @@ -35,18 +36,14 @@ import org.junit.jupiter.params.provider.CsvSource; /** - * Integration test for JEO and OPEO transformations. - * In this test, we check that the entire pipeline: - * '.class' -> 'jeo-xmir' -> 'opeo-xmir' -> 'jeo-xmir' -> '.class' + * Integration tests for JEO and OPEO transformations. + * This class is rather useful for bug identification on different transformation stages. * @since 0.2 */ final class JeoAndOpeoTest { @ParameterizedTest - @CsvSource({ - "AgentBuilder.class", - "AgentBuilder$RedefinitionStrategy$Collector.class" - }) + @CsvSource("AgentBuilder.class") void dissassemblesDecompilesCompilesAssembles(final String name) { Assertions.assertDoesNotThrow( () -> new XmirRepresentation( @@ -66,4 +63,17 @@ void dissassemblesDecompilesCompilesAssembles(final String name) { ); } + @ParameterizedTest + @CsvSource("AgentBuilder$RedefinitionStrategy$Collector.xmir") + void compilesAlreadyCompiledAndAssembles(final String path) { + Assertions.assertDoesNotThrow( + () -> new XmirRepresentation( + new JeoCompiler(new XMLDocument(new BytesOf( + new ResourceOf(String.format("xmir/compiled/%s", path)) + ).asBytes())).compile() + ).toBytecode(), + "We expect that the pipeline 'already-compiled-xmir' -> (compile) -> (assemble) ->'.class' will not throw any exceptions." + ); + } + } diff --git a/src/test/java/org/eolang/opeo/compilation/JeoCompilerTest.java b/src/test/java/org/eolang/opeo/compilation/JeoCompilerTest.java index 8d29ba9b..2a73dc2e 100644 --- a/src/test/java/org/eolang/opeo/compilation/JeoCompilerTest.java +++ b/src/test/java/org/eolang/opeo/compilation/JeoCompilerTest.java @@ -30,6 +30,7 @@ import org.eolang.opeo.ast.Opcode; import org.hamcrest.MatcherAssert; import org.hamcrest.Matchers; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; /** @@ -51,5 +52,4 @@ void compilesSuccessfully() throws Exception { Matchers.equalTo(expected) ); } - } diff --git a/src/test/java/org/eolang/opeo/decompilation/SelectiveDecompilerTest.java b/src/test/java/org/eolang/opeo/decompilation/SelectiveDecompilerTest.java index 266f862f..fd644306 100644 --- a/src/test/java/org/eolang/opeo/decompilation/SelectiveDecompilerTest.java +++ b/src/test/java/org/eolang/opeo/decompilation/SelectiveDecompilerTest.java @@ -168,4 +168,13 @@ void doesNotCopyDecompiledFiles(@TempDir final Path temp) throws Exception { Matchers.arrayWithSize(2) ); } + + @Test + void identifiesUnsupportedOpcodes() { + MatcherAssert.assertThat( + "We expect that the supported opcodes won't contain the 'GOTO' opcode since we don't support it yet.", + new RouterHandler(false).supportedOpcodes(), + Matchers.not(Matchers.arrayContaining("GOTO")) + ); + } } diff --git a/src/test/resources/bytecode/AgentBuilder$RedefinitionStrategy$Collector.class b/src/test/resources/bytecode/AgentBuilder$RedefinitionStrategy$Collector.class deleted file mode 100644 index 3bc3a5e7083b1fa847f970ca42a692ee0facb854..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8846 zcmdT~33yc175;BBlb4x!5Ox@WJdBY-LWrmcOb`u$NHl~H5CoTYGV=l>lX>aP1c)uI zrMBA5rCM5Tt=(+EVkwn?39Z=8w%Xd-(#0;;w(d)JEfuT%@15<FqD{{Ekhp*xu4g0*9h8r~W`LG%Ly{Nze`M6g;`hD1n0eQ+n`SvwA_jMoc z!y!4mU&A*vd{e`>1je@s8FV0+YTN}Al?iVJ9@32ijF z+XDjLw&0fKsj6wXIgDD0`m&r*iOi;M@6lW5;3>^_c+_^m=&li{0Jv8j~N>_6QOvd%Wen_-{-=T z!3zS53O{TJdY)GrjUa711PBO?R3MX}1dgdAdSA!L%Ez6oCF|(z+v)zoZmU&8Gj8sZ=4INF6)03{` z#t0pwsqiz0%B_{zR7&S44Oy{7gqclX{0yfD)vcF2dXgLC)|M1o<83IbGt+V#>9f-O z0#hB_b#bdEdHlZ}H^cd%Eg#oPttmCyT)xgJ*ANr= zm)Q_{Q}UL{?QJ^?oZ-;;ae3i25t6s{VlxukkoG$>Eb!F-jrOGVof=hhh3T-Otvi;C zbed}-i3nr1H5d5s-?6e7>V+tr_Yq7oKh76%Y$7+9NRTiO?&xCa+19lDu*bUd1`Y$AL)Wa zu_c8VrU0=;RPM%*=~oL|_0qWo78L5mj)F+uPTr+kL#8TO6B-`Y@FRg0Z*03^_*aLl zvby6TvoRv?qS5vqV76pQ$6EYY$9&Z3Scvmhjsi6KiBaK{8C3d9@X$`9lyn6I=b;Y9i50}wow6+)v1oh z@p~PAz#la{q2ozBt>GCR&*C`^&kM}SPh!W2hKxh%cmXf!_!IuD<1g~7{;A^#{zZM{WLg$XY@~+@Tw3sHL*|=fdZLc2@rqRWQ5~;Jk^ha?biB@f3)kX0 zGAx8Hif~jD#kz0_H@O!j0vEhVEU_?G0xRvWXupz8sld4>wfUQaU9MiN z9MoK&Rrt>K7Q0|7dq=@MQ81mer4U$HFs-c&%3KB~a%0j z4ijiRx$QEUL7+Al0=66a;#jVLS2cY$Hw#S5QK+RBE7@pu$HF$0;u$j6PRr*pQy^WK zt@POzSRJyV;I|rkrcZSdGaV`$OwX&Q%)tzcs|{vSZP085RX60HG1GQ)*_KE?DkKYC zc^fD{li!mVBCMl&Im9Nk%xv8Wr2ZLRjGRK`N@VtC+FI#(_dUX~#>?I>m9SHD3;g3moIFa|GO= z^8bw+G55u6=+;eOL?n??Tw^4j;2lEuXUpr2Br+L9V5VIaDgU-4+99iG}tP(#k%jlT_xYX{+hSIMjy8Vvm)q72V9^&tzcbQytI6 zc+QM`is3CP;Im>&B8iZ-*^INa%&P^5ai)TetXgHwiY<-DWz2_%(4EaZ_MG96c!(^p z-bQINtgLXYScBEs6=g5U%8%jH8n=?HI%vNoR%b9mD^_HZRl*E)%WsplP8{km{mGjR z#qERA$nm_@#@vaC-jV8RkOop8T^W|aFxkla zIF_pVRMbsR`#_c;FQ=*B8~81N+Mj55mh8N|@U)G=M2oqV8Nd}&U`)oExlM^>#nf#s zP&uP1rPbWBb1b)Q9u6(PZAcp=x0gL9XZhs$>6VjuE2kk<>lb%*llS>{`O*rq89$@4 z!BYaK4accsN_M*n$6$ON-;)uW_%kXn=`_3vOiN}wrFb1E=`Tu zsHrh~H3iw2LEvJ(7hw(DaIx#Sgfr_n^AL);H!!d207O-FABw7G^`W?`rVp+vzpD@K zD!;oAB~|{CK4?{btq-MD2jN+F0Ny_M_Nq{uD-*KaH{F&%j^) zER6E!aC-Uks4jm2=aj#QONrl>Iu@7Va*oJ=5>Kc%DPWO$lOh(YHz}k`y-6|M>P-q- zqTZya8rQGDTS-a5iYAgDa)hJR_d;)}+DDo8!BxE{$ zxrsii+VA3PX&QO7hU)5?DF-m77mWe8MC!*l!5=2)@?ER;b2z@3!|BdJ*B7JWd@Y8FKZ*@8)loBYV*lDA|b;f61YMmXG2m(kUe=q>4bP zL@GTL@Z=-)W3n5&JiD}BxC8FJR7r(w+cB03y9u`t?!a#Bp<4D}pMw2(1cy03j7JsR z!LIlS@rogh8pjkG^<}urkD#Lb6`WE2DwYvmWQ;(IA<$|RVUtmeEruJ{5ngZjaFa0w zw-_U_!x)WS#u)52CSi{;7W)YMjd6I`7>`Gci8yRbz@vnZ5x!(h#u3AhSB$C3IhK+0 zR{q}mHU!Ce1uT9-2+_Pd5LR>25sqeE=O|}Q`m>ztzy>;i8!uxcB9!7v&g$v4Fg9i5 zAWAHLgdhf;Mchj_@)2`jyml)lSJ(JmG>f0ck}p&GF|`D@;pSO>7pe;lYIVRPt?D@x@D78WGOxE6;{v6&YaW)nhbFtDm2dj+$))KBW=Fz6} zaTUkgj0MJ zv}czJ>j7msY0Uw=oi>zVJ)kTn!+JnjQ&TpakfxM2%;0Y#ek!ZQks$s=jgQnnfh1p2 zPmrJ+Jse3>ub`DQ!TtBbMr8kgvO{T?DIV=+_Aa$&q{ zH0gR+ITH!HPVv5m*N@EqOjn%Zw8k}#eM}x5zON~pg-dKkY<5EP7%Mdj# zr-iP_T3{(oO + + yv66vgAAADEBCAoALgCPCQAtAJAJAC0AkQkALQCSCQAtAJMJAC0AlAkALQCVCQAtAJYHAJcKAAkAjwkALQCYCgCZAJoKAJsAnAsAQQCdCwA9AJ4KAJ8AoAsARQChCgAtAKIHAKMLAEUApAsATAClCwCmAKcLAKgAqQcAqwsAGACsCwAYAK0LABgArgoAmwCvCwA5ALALABgAsQsAsgCzBwC0CgAgAI8HALULAHYAtgoAIgC3CgAiALgKACIAuQsAeAC6CgAtALsLAHgAvAoAIgC9CwC+AL8LAHgAwAcAwQcAwgcAwwEAFFJlZGVmaW5pdGlvblN0cmF0ZWd5AQAMSW5uZXJDbGFzc2VzAQAJQ29sbGVjdG9yBwDEAQATRm9yUmV0cmFuc2Zvcm1hdGlvbgcAxQEAD0ZvclJlZGVmaW5pdGlvbgEAE1ByZXBlbmRhYmxlSXRlcmF0b3IBAAdtYXRjaGVyBwDGAQAKUmF3TWF0Y2hlcgEANUxuZXQvYnl0ZWJ1ZGR5L2FnZW50L2J1aWxkZXIvQWdlbnRCdWlsZGVyJFJhd01hdGNoZXI7AQAMcG9vbFN0cmF0ZWd5BwDHAQAMUG9vbFN0cmF0ZWd5AQA3TG5ldC9ieXRlYnVkZHkvYWdlbnQvYnVpbGRlci9BZ2VudEJ1aWxkZXIkUG9vbFN0cmF0ZWd5OwEAEGxvY2F0aW9uU3RyYXRlZ3kHAMgBABBMb2NhdGlvblN0cmF0ZWd5AQA7TG5ldC9ieXRlYnVkZHkvYWdlbnQvYnVpbGRlci9BZ2VudEJ1aWxkZXIkTG9jYXRpb25TdHJhdGVneTsBABNkZXNjcmlwdGlvblN0cmF0ZWd5BwDJAQATRGVzY3JpcHRpb25TdHJhdGVneQEAPkxuZXQvYnl0ZWJ1ZGR5L2FnZW50L2J1aWxkZXIvQWdlbnRCdWlsZGVyJERlc2NyaXB0aW9uU3RyYXRlZ3k7AQAIbGlzdGVuZXIBAAhMaXN0ZW5lcgEAM0xuZXQvYnl0ZWJ1ZGR5L2FnZW50L2J1aWxkZXIvQWdlbnRCdWlsZGVyJExpc3RlbmVyOwEAEGZhbGxiYWNrU3RyYXRlZ3kHAMoBABBGYWxsYmFja1N0cmF0ZWd5AQA7TG5ldC9ieXRlYnVkZHkvYWdlbnQvYnVpbGRlci9BZ2VudEJ1aWxkZXIkRmFsbGJhY2tTdHJhdGVneTsBAA9jaXJjdWxhcml0eUxvY2sHAMsBAA9DaXJjdWxhcml0eUxvY2sBADpMbmV0L2J5dGVidWRkeS9hZ2VudC9idWlsZGVyL0FnZW50QnVpbGRlciRDaXJjdWxhcml0eUxvY2s7AQAFdHlwZXMBABBMamF2YS91dGlsL0xpc3Q7AQAJU2lnbmF0dXJlAQAmTGphdmEvdXRpbC9MaXN0PExqYXZhL2xhbmcvQ2xhc3M8Kj47PjsBAAY8aW5pdD4BAZAoTG5ldC9ieXRlYnVkZHkvYWdlbnQvYnVpbGRlci9BZ2VudEJ1aWxkZXIkUmF3TWF0Y2hlcjtMbmV0L2J5dGVidWRkeS9hZ2VudC9idWlsZGVyL0FnZW50QnVpbGRlciRQb29sU3RyYXRlZ3k7TG5ldC9ieXRlYnVkZHkvYWdlbnQvYnVpbGRlci9BZ2VudEJ1aWxkZXIkTG9jYXRpb25TdHJhdGVneTtMbmV0L2J5dGVidWRkeS9hZ2VudC9idWlsZGVyL0FnZW50QnVpbGRlciREZXNjcmlwdGlvblN0cmF0ZWd5O0xuZXQvYnl0ZWJ1ZGR5L2FnZW50L2J1aWxkZXIvQWdlbnRCdWlsZGVyJExpc3RlbmVyO0xuZXQvYnl0ZWJ1ZGR5L2FnZW50L2J1aWxkZXIvQWdlbnRCdWlsZGVyJEZhbGxiYWNrU3RyYXRlZ3k7TG5ldC9ieXRlYnVkZHkvYWdlbnQvYnVpbGRlci9BZ2VudEJ1aWxkZXIkQ2lyY3VsYXJpdHlMb2NrOylWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBAElMbmV0L2J5dGVidWRkeS9hZ2VudC9idWlsZGVyL0FnZW50QnVpbGRlciRSZWRlZmluaXRpb25TdHJhdGVneSRDb2xsZWN0b3I7AQAIY29uc2lkZXIBABUoTGphdmEvbGFuZy9DbGFzcztaKVYBAAl0aHJvd2FibGUBABVMamF2YS9sYW5nL1Rocm93YWJsZTsBAAh0eXBlUG9vbAEAHUxuZXQvYnl0ZWJ1ZGR5L3Bvb2wvVHlwZVBvb2w7AQAEdHlwZQEAEUxqYXZhL2xhbmcvQ2xhc3M7AQAKbW9kaWZpYWJsZQEAAVoBAAZtb2R1bGUBACJMbmV0L2J5dGVidWRkeS91dGlsaXR5L0phdmFNb2R1bGU7AQAWTG9jYWxWYXJpYWJsZVR5cGVUYWJsZQEAFExqYXZhL2xhbmcvQ2xhc3M8Kj47AQAYKExqYXZhL2xhbmcvQ2xhc3M8Kj47WilWAQAKZG9Db25zaWRlcgEA4ChMbmV0L2J5dGVidWRkeS9hZ2VudC9idWlsZGVyL0FnZW50QnVpbGRlciRSYXdNYXRjaGVyO0xuZXQvYnl0ZWJ1ZGR5L2FnZW50L2J1aWxkZXIvQWdlbnRCdWlsZGVyJExpc3RlbmVyO0xuZXQvYnl0ZWJ1ZGR5L2Rlc2NyaXB0aW9uL3R5cGUvVHlwZURlc2NyaXB0aW9uO0xqYXZhL2xhbmcvQ2xhc3M7TGphdmEvbGFuZy9DbGFzcztMbmV0L2J5dGVidWRkeS91dGlsaXR5L0phdmFNb2R1bGU7WilWAQAPdHlwZURlc2NyaXB0aW9uAQAwTG5ldC9ieXRlYnVkZHkvZGVzY3JpcHRpb24vdHlwZS9UeXBlRGVzY3JpcHRpb247AQATY2xhc3NCZWluZ1JlZGVmaW5lZAEA5ihMbmV0L2J5dGVidWRkeS9hZ2VudC9idWlsZGVyL0FnZW50QnVpbGRlciRSYXdNYXRjaGVyO0xuZXQvYnl0ZWJ1ZGR5L2FnZW50L2J1aWxkZXIvQWdlbnRCdWlsZGVyJExpc3RlbmVyO0xuZXQvYnl0ZWJ1ZGR5L2Rlc2NyaXB0aW9uL3R5cGUvVHlwZURlc2NyaXB0aW9uO0xqYXZhL2xhbmcvQ2xhc3M8Kj47TGphdmEvbGFuZy9DbGFzczwqPjtMbmV0L2J5dGVidWRkeS91dGlsaXR5L0phdmFNb2R1bGU7WilWAQAiUnVudGltZVZpc2libGVQYXJhbWV0ZXJBbm5vdGF0aW9ucwEALUxuZXQvYnl0ZWJ1ZGR5L3V0aWxpdHkvbnVsbGFiaWxpdHkvTWF5YmVOdWxsOwEABWFwcGx5BwDMAQAOQmF0Y2hBbGxvY2F0b3IHAM0BAMAoTGphdmEvbGFuZy9pbnN0cnVtZW50L0luc3RydW1lbnRhdGlvbjtMbmV0L2J5dGVidWRkeS9hZ2VudC9idWlsZGVyL0FnZW50QnVpbGRlciRSZWRlZmluaXRpb25TdHJhdGVneSRCYXRjaEFsbG9jYXRvcjtMbmV0L2J5dGVidWRkeS9hZ2VudC9idWlsZGVyL0FnZW50QnVpbGRlciRSZWRlZmluaXRpb25TdHJhdGVneSRMaXN0ZW5lcjtJKUkBAA9pbnN0cnVtZW50YXRpb24BACZMamF2YS9sYW5nL2luc3RydW1lbnQvSW5zdHJ1bWVudGF0aW9uOwEAGnJlZGVmaW5pdGlvbkJhdGNoQWxsb2NhdG9yAQBOTG5ldC9ieXRlYnVkZHkvYWdlbnQvYnVpbGRlci9BZ2VudEJ1aWxkZXIkUmVkZWZpbml0aW9uU3RyYXRlZ3kkQmF0Y2hBbGxvY2F0b3I7AQAUcmVkZWZpbml0aW9uTGlzdGVuZXIBAEhMbmV0L2J5dGVidWRkeS9hZ2VudC9idWlsZGVyL0FnZW50QnVpbGRlciRSZWRlZmluaXRpb25TdHJhdGVneSRMaXN0ZW5lcjsBAAViYXRjaAEAAUkBAAhmYWlsdXJlcwEAD0xqYXZhL3V0aWwvTWFwOwEAE3ByZXBlbmRhYmxlSXRlcmF0b3IBAF1MbmV0L2J5dGVidWRkeS9hZ2VudC9idWlsZGVyL0FnZW50QnVpbGRlciRSZWRlZmluaXRpb25TdHJhdGVneSRDb2xsZWN0b3IkUHJlcGVuZGFibGVJdGVyYXRvcjsBAExMamF2YS91dGlsL01hcDxMamF2YS91dGlsL0xpc3Q8TGphdmEvbGFuZy9DbGFzczwqPjs+O0xqYXZhL2xhbmcvVGhyb3dhYmxlOz47AQAHZG9BcHBseQEAOShMamF2YS9sYW5nL2luc3RydW1lbnQvSW5zdHJ1bWVudGF0aW9uO0xqYXZhL3V0aWwvTGlzdDspVgEACkV4Y2VwdGlvbnMHAM4HAM8BAE8oTGphdmEvbGFuZy9pbnN0cnVtZW50L0luc3RydW1lbnRhdGlvbjtMamF2YS91dGlsL0xpc3Q8TGphdmEvbGFuZy9DbGFzczwqPjs+OylWAQAKU291cmNlRmlsZQEAEUFnZW50QnVpbGRlci5qYXZhDABXANAMADgAOwwAPAA/DABAAEMMAEQARwwASABKDABLAE4MAE8AUgEAE2phdmEvdXRpbC9BcnJheUxpc3QMAFMAVAcA0QwA0gDTBwDUDADVANYMANcA2AwAYgDZBwDbDADdAN4MAHUA3wwAbQBuAQATamF2YS9sYW5nL1Rocm93YWJsZQwA4ADhDADiAOMHAOQMAOUA5wcA6AwA6QDqBwDrAQAxbmV0L2J5dGVidWRkeS9hZ2VudC9idWlsZGVyL0FnZW50QnVpbGRlciRMaXN0ZW5lcgwA7ADtDADuAO8MAPAA7QwA8QDyDADzAPQMAPUA9gcA9wwA+AD5AQARamF2YS91dGlsL0hhc2hNYXABAFtuZXQvYnl0ZWJ1ZGR5L2FnZW50L2J1aWxkZXIvQWdlbnRCdWlsZGVyJFJlZGVmaW5pdGlvblN0cmF0ZWd5JENvbGxlY3RvciRQcmVwZW5kYWJsZUl0ZXJhdG9yDACAAPoMAFcA+wwA/ADhDAD9AP4MAP8BAAwAhwCIDADuAQEMAQIA+wcBAwwBBAEFDADwAQYBAEduZXQvYnl0ZWJ1ZGR5L2FnZW50L2J1aWxkZXIvQWdlbnRCdWlsZGVyJFJlZGVmaW5pdGlvblN0cmF0ZWd5JENvbGxlY3RvcgEAEGphdmEvbGFuZy9PYmplY3QBAD1uZXQvYnl0ZWJ1ZGR5L2FnZW50L2J1aWxkZXIvQWdlbnRCdWlsZGVyJFJlZGVmaW5pdGlvblN0cmF0ZWd5AQBbbmV0L2J5dGVidWRkeS9hZ2VudC9idWlsZGVyL0FnZW50QnVpbGRlciRSZWRlZmluaXRpb25TdHJhdGVneSRDb2xsZWN0b3IkRm9yUmV0cmFuc2Zvcm1hdGlvbgEAV25ldC9ieXRlYnVkZHkvYWdlbnQvYnVpbGRlci9BZ2VudEJ1aWxkZXIkUmVkZWZpbml0aW9uU3RyYXRlZ3kkQ29sbGVjdG9yJEZvclJlZGVmaW5pdGlvbgEAM25ldC9ieXRlYnVkZHkvYWdlbnQvYnVpbGRlci9BZ2VudEJ1aWxkZXIkUmF3TWF0Y2hlcgEANW5ldC9ieXRlYnVkZHkvYWdlbnQvYnVpbGRlci9BZ2VudEJ1aWxkZXIkUG9vbFN0cmF0ZWd5AQA5bmV0L2J5dGVidWRkeS9hZ2VudC9idWlsZGVyL0FnZW50QnVpbGRlciRMb2NhdGlvblN0cmF0ZWd5AQA8bmV0L2J5dGVidWRkeS9hZ2VudC9idWlsZGVyL0FnZW50QnVpbGRlciREZXNjcmlwdGlvblN0cmF0ZWd5AQA5bmV0L2J5dGVidWRkeS9hZ2VudC9idWlsZGVyL0FnZW50QnVpbGRlciRGYWxsYmFja1N0cmF0ZWd5AQA4bmV0L2J5dGVidWRkeS9hZ2VudC9idWlsZGVyL0FnZW50QnVpbGRlciRDaXJjdWxhcml0eUxvY2sBAExuZXQvYnl0ZWJ1ZGR5L2FnZW50L2J1aWxkZXIvQWdlbnRCdWlsZGVyJFJlZGVmaW5pdGlvblN0cmF0ZWd5JEJhdGNoQWxsb2NhdG9yAQBGbmV0L2J5dGVidWRkeS9hZ2VudC9idWlsZGVyL0FnZW50QnVpbGRlciRSZWRlZmluaXRpb25TdHJhdGVneSRMaXN0ZW5lcgEAL2phdmEvbGFuZy9pbnN0cnVtZW50L1VubW9kaWZpYWJsZUNsYXNzRXhjZXB0aW9uAQAgamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb24BAAMoKVYBACBuZXQvYnl0ZWJ1ZGR5L3V0aWxpdHkvSmF2YU1vZHVsZQEABm9mVHlwZQEANShMamF2YS9sYW5nL0NsYXNzOylMbmV0L2J5dGVidWRkeS91dGlsaXR5L0phdmFNb2R1bGU7AQAPamF2YS9sYW5nL0NsYXNzAQAOZ2V0Q2xhc3NMb2FkZXIBABkoKUxqYXZhL2xhbmcvQ2xhc3NMb2FkZXI7AQAQY2xhc3NGaWxlTG9jYXRvcgEAYyhMamF2YS9sYW5nL0NsYXNzTG9hZGVyO0xuZXQvYnl0ZWJ1ZGR5L3V0aWxpdHkvSmF2YU1vZHVsZTspTG5ldC9ieXRlYnVkZHkvZHluYW1pYy9DbGFzc0ZpbGVMb2NhdG9yOwEAXihMbmV0L2J5dGVidWRkeS9keW5hbWljL0NsYXNzRmlsZUxvY2F0b3I7TGphdmEvbGFuZy9DbGFzc0xvYWRlcjspTG5ldC9ieXRlYnVkZHkvcG9vbC9UeXBlUG9vbDsHAQcBADxuZXQvYnl0ZWJ1ZGR5L2Rlc2NyaXB0aW9uL3R5cGUvVHlwZURlc2NyaXB0aW9uJEZvckxvYWRlZFR5cGUBAA1Gb3JMb2FkZWRUeXBlAQAHZ2V0TmFtZQEAJShMamF2YS9sYW5nL0NsYXNzOylMamF2YS9sYW5nL1N0cmluZzsBAOUoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9DbGFzcztMbmV0L2J5dGVidWRkeS9wb29sL1R5cGVQb29sO0xuZXQvYnl0ZWJ1ZGR5L2FnZW50L2J1aWxkZXIvQWdlbnRCdWlsZGVyJENpcmN1bGFyaXR5TG9jaztMamF2YS9sYW5nL0NsYXNzTG9hZGVyO0xuZXQvYnl0ZWJ1ZGR5L3V0aWxpdHkvSmF2YU1vZHVsZTspTG5ldC9ieXRlYnVkZHkvZGVzY3JpcHRpb24vdHlwZS9UeXBlRGVzY3JpcHRpb247AQANaXNMb2FkZWRGaXJzdAEAAygpWgEACmlzRmFsbGJhY2sBACkoTGphdmEvbGFuZy9DbGFzcztMamF2YS9sYW5nL1Rocm93YWJsZTspWgEAG25ldC9ieXRlYnVkZHkvcG9vbC9UeXBlUG9vbAEACGRlc2NyaWJlAQAKUmVzb2x1dGlvbgEAPChMamF2YS9sYW5nL1N0cmluZzspTG5ldC9ieXRlYnVkZHkvcG9vbC9UeXBlUG9vbCRSZXNvbHV0aW9uOwEAJm5ldC9ieXRlYnVkZHkvcG9vbC9UeXBlUG9vbCRSZXNvbHV0aW9uAQAHcmVzb2x2ZQEAMigpTG5ldC9ieXRlYnVkZHkvZGVzY3JpcHRpb24vdHlwZS9UeXBlRGVzY3JpcHRpb247AQAobmV0L2J5dGVidWRkeS9hZ2VudC9idWlsZGVyL0FnZW50QnVpbGRlcgEAC29uRGlzY292ZXJ5AQBPKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvQ2xhc3NMb2FkZXI7TG5ldC9ieXRlYnVkZHkvdXRpbGl0eS9KYXZhTW9kdWxlO1opVgEAB29uRXJyb3IBAGQoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9DbGFzc0xvYWRlcjtMbmV0L2J5dGVidWRkeS91dGlsaXR5L0phdmFNb2R1bGU7WkxqYXZhL2xhbmcvVGhyb3dhYmxlOylWAQAKb25Db21wbGV0ZQEAE2dldFByb3RlY3Rpb25Eb21haW4BACIoKUxqYXZhL3NlY3VyaXR5L1Byb3RlY3Rpb25Eb21haW47AQAHbWF0Y2hlcwEAnShMbmV0L2J5dGVidWRkeS9kZXNjcmlwdGlvbi90eXBlL1R5cGVEZXNjcmlwdGlvbjtMamF2YS9sYW5nL0NsYXNzTG9hZGVyO0xuZXQvYnl0ZWJ1ZGR5L3V0aWxpdHkvSmF2YU1vZHVsZTtMamF2YS9sYW5nL0NsYXNzO0xqYXZhL3NlY3VyaXR5L1Byb3RlY3Rpb25Eb21haW47KVoBAAlvbklnbm9yZWQBAG0oTG5ldC9ieXRlYnVkZHkvZGVzY3JpcHRpb24vdHlwZS9UeXBlRGVzY3JpcHRpb247TGphdmEvbGFuZy9DbGFzc0xvYWRlcjtMbmV0L2J5dGVidWRkeS91dGlsaXR5L0phdmFNb2R1bGU7WilWAQAOamF2YS91dGlsL0xpc3QBAANhZGQBABUoTGphdmEvbGFuZy9PYmplY3Q7KVoBACYoTGphdmEvdXRpbC9MaXN0OylMamF2YS9sYW5nL0l0ZXJhYmxlOwEAFyhMamF2YS9sYW5nL0l0ZXJhYmxlOylWAQAHaGFzTmV4dAEABG5leHQBABIoKUxqYXZhL3V0aWwvTGlzdDsBAAdvbkJhdGNoAQAkKElMamF2YS91dGlsL0xpc3Q7TGphdmEvdXRpbC9MaXN0OylWAQBMKElMamF2YS91dGlsL0xpc3Q7TGphdmEvbGFuZy9UaHJvd2FibGU7TGphdmEvdXRpbC9MaXN0OylMamF2YS9sYW5nL0l0ZXJhYmxlOwEAB3ByZXBlbmQBAA1qYXZhL3V0aWwvTWFwAQADcHV0AQA4KExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsBACMoSUxqYXZhL3V0aWwvTGlzdDtMamF2YS91dGlsL01hcDspVgEALm5ldC9ieXRlYnVkZHkvZGVzY3JpcHRpb24vdHlwZS9UeXBlRGVzY3JpcHRpb24EIQAtAC4AAAAIABIAOAA7AAAAEgA8AD8AAAAUAEAAQwAAABIARABHAAAAFABIAEoAAAASAEsATgAAABQATwBSAAAAFABTAFQAAQBVAAAAAgBWAAUABABXAFgAAQBZAAAAywADAAgAAAA3KrcAASortQACKiy1AAMqLbUABCoZBLUABSoZBbUABioZBrUAByoZB7UACCq7AAlZtwAKtQALsQAAAAIAWgAAACoACgAAHuQABB7lAAke5gAOHucAEx7oABke6QAfHuoAJR7rACse7AA2Hu0AWwAAAFIACAAAADcAXABdAAAAAAA3ADgAOwABAAAANwA8AD8AAgAAADcAQABDAAMAAAA3AEQARwAEAAAANwBIAEoABQAAADcASwBOAAYAAAA3AE8AUgAHAAQAXgBfAAIAWQAAAhcACgAKAAAA+yu4AAxOKrQAAyq0AAQrtgANLbkADgMAK7YADbkADwMAOgQqKrQAAiq0AAYqtAAFK7gAECsZBCq0AAgrtgANLbkAEQcAKystHLcAEqcARjoFKrQABbkAFAEAmQA1KrQABysZBbkAFQMAmQAmKiq0AAIqtAAGGQQruAAQuQAWAgC5ABcBACsBLQS3ABKnAAYZBb+nAGk6BCq0AAYruAAQK7YADS0EuQAZBQCoAA6nAEk6BqgABhkGvzoHKrQABiu4ABArtgANLQQZBLkAGgYAqAAOpwAiOgioAAYZCL86CSq0AAYruAAQK7YADS0EuQAbBQCpCakHpwAFOgWxAAcAIgBLAE4AEwAFAJEAlAATAJYArACvAAAArwC0AK8AAAC5ANEA1AAAANQA2QDUAAAAlgD1APgAEwADAFoAAAByABwAAB72AAUe+AAiHvoAMB78AEge+gBLHw0ATh8BAFAfAgBrHwMAdx8FAIgfAwCOHwsAkR8cAJQfDgCWHxEAqR8SAKwfGACvHxMAtB8YALkfFADOHxUA0R8XANQfFgDZHxcA3h8WAPUfGwD4HxkA+h8dAFsAAABIAAcAUABBAGAAYQAFACIAbwBiAGMABACWAGQAYABhAAQAAAD7AFwAXQAAAAAA+wBkAGUAAQAAAPsAZgBnAAIABQD2AGgAaQADAGoAAAAMAAEAAAD7AGQAawABAFUAAAACAGwAAgBtAG4AAwBZAAABuAAGAAsAAAC6FQeZABsrLRkEtgANGQYZBRkEtgAcuQAdBgCaAJMsGQS4ABAZBLYADRkGGQXGAAcEpwAEA7kAGQUALC0ZBLYADRkGGQXGAAcEpwAEA7kAHgUAqAA0pwBROggsGQS4ABAZBLYADRkGGQXGAAcEpwAEAxkIuQAaBgCoAA6nACs6CagABhkJvzoKLBkEuAAQGQS2AA0ZBhkFxgAHBKcABAO5ABsFAKkKpwAUOginAA8qtAALGQS5AB8CAFexAAUAHQBRAFcAEwAdAFQAfQAAAFcAegB9AAAAfQCCAH0AAAAdAKUAqAATAAMAWgAAAEYAEQAAHzEAHR80ADkfNQBRHzYAVB86AFcfNgBZHzcAdx84AHofOgB9HzkAgh86AIcfOQClHz0AqB87AKofPQCtHz8AuR9BAFsAAABcAAkAWQAeAGAAYQAIAAAAugBcAF0AAAAAALoAOAA7AAEAAAC6AEgASgACAAAAugBvAHAAAwAAALoAZABlAAQAAAC6AHEAZQAFAAAAugBoAGkABgAAALoAZgBnAAcAagAAABYAAgAAALoAZABrAAQAAAC6AHEAawAFAFUAAAACAHIAcwAAABcHAAAAAAAAAAAAAQB0AAAAAQB0AAAAAAAEAHUAeQABAFkAAAFPAAYACQAAAH27ACBZtwAhOgW7ACJZLCq0AAu5ACMCALcAJDoGGQa2ACWZAEsZBrYAJjoHLRUEGQcqtAALuQAnBAAqKxkHtgAopwAmOggZBi0VBBkHGQgqtAALuQApBQC2ACoZBRkHGQi5ACsDAFeEBAGn/7MtFQQqtAALGQW5ACwEABUErAABADkAQABDABMAAwBaAAAAOgAOAAAfUAAJH1EAHB9SACQfUwArH1QAOR9WAEAfWgBDH1cARR9YAFofWQBmH1sAaR9cAGwfXQB6H14AWwAAAFwACQBFACEAYABhAAgAKwA+AFMAVAAHAAAAfQBcAF0AAAAAAH0AegB7AAEAAAB9AHwAfQACAAAAfQB+AH8AAwAAAH0AgACBAAQACQB0AIIAgwAFABwAYQCEAIUABgBqAAAAFgACACsAPgBTAFYABwAJAHQAggCGAAUEBACHAIgAAgCJAAAABgACAIoAiwBVAAAAAgCMAAIAjQAAAAIAjgAxAAAAggAQAC8AqgAwRAkALQAvADIEDAAzAC0ANAAMADUALQA2AAwAIgAtADcADAA5AKoAOgYJAD0AqgA+BgkAQQCqAEIGCQBFAKoARgYJABgAqgBJBgkATACqAE0GCQBQAKoAUQYJAHYALwB3BgkAeAAvAEkGCQCfANoA3AAJAKgApgDmBgk= + + + + + + package + net.bytebuddy.agent.builder + net.bytebuddy.agent.builder + + + alias + org.eolang.jeo.opcode + org.eolang.jeo.opcode + + + alias + org.eolang.jeo.label + org.eolang.jeo.label + + + + + 00 00 00 00 00 00 00 31 + 00 00 00 00 00 00 04 21 + 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 + + + 00 00 00 00 00 00 00 12 + 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 61 77 4D 61 74 63 68 65 72 3B + + + + + 00 00 00 00 00 00 00 12 + 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 50 6F 6F 6C 53 74 72 61 74 65 67 79 3B + + + + + 00 00 00 00 00 00 00 14 + 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 4C 6F 63 61 74 69 6F 6E 53 74 72 61 74 65 67 79 3B + + + + + 00 00 00 00 00 00 00 12 + 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 44 65 73 63 72 69 70 74 69 6F 6E 53 74 72 61 74 65 67 79 3B + + + + + 00 00 00 00 00 00 00 14 + 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 4C 69 73 74 65 6E 65 72 3B + + + + + 00 00 00 00 00 00 00 12 + 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 46 61 6C 6C 62 61 63 6B 53 74 72 61 74 65 67 79 3B + + + + + 00 00 00 00 00 00 00 14 + 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 43 69 72 63 75 6C 61 72 69 74 79 4C 6F 63 6B 3B + + + + + 00 00 00 00 00 00 00 14 + 4C 6A 61 76 61 2F 75 74 69 6C 2F 4C 69 73 74 3B + 4C 6A 61 76 61 2F 75 74 69 6C 2F 4C 69 73 74 3C 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3C 2A 3E 3B 3E 3B + + + + 00 00 00 00 00 00 00 04 + 28 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 61 77 4D 61 74 63 68 65 72 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 50 6F 6F 6C 53 74 72 61 74 65 67 79 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 4C 6F 63 61 74 69 6F 6E 53 74 72 61 74 65 67 79 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 44 65 73 63 72 69 70 74 69 6F 6E 53 74 72 61 74 65 67 79 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 4C 69 73 74 65 6E 65 72 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 46 61 6C 6C 62 61 63 6B 53 74 72 61 74 65 67 79 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 43 69 72 63 75 6C 61 72 69 74 79 4C 6F 63 6B 3B 29 56 + + + + 00 00 00 00 00 00 00 03 + 00 00 00 00 00 00 00 08 + + + + + + + + + + + 64 39 66 38 64 30 37 32 2D 34 31 33 38 2D 34 62 34 30 2D 61 30 32 31 2D 61 32 61 31 32 62 32 37 37 34 37 61 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 B7 + 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 + 3C 69 6E 69 74 3E + 28 29 56 + 00 + + 31 62 65 64 34 37 32 33 2D 36 37 65 62 2D 34 64 65 35 2D 39 39 38 33 2D 65 37 38 30 38 30 35 63 38 31 38 61 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 01 + + + 00 00 00 00 00 00 00 B5 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 + 6D 61 74 63 68 65 72 + 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 61 77 4D 61 74 63 68 65 72 3B + + 38 61 39 31 38 36 64 65 2D 36 30 35 30 2D 34 62 38 66 2D 39 62 65 35 2D 64 65 32 66 30 31 62 37 61 37 66 36 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 02 + + + 00 00 00 00 00 00 00 B5 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 + 70 6F 6F 6C 53 74 72 61 74 65 67 79 + 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 50 6F 6F 6C 53 74 72 61 74 65 67 79 3B + + 36 65 66 37 36 34 32 37 2D 38 32 64 33 2D 34 31 32 63 2D 62 62 36 61 2D 61 62 64 64 32 61 64 62 31 39 34 65 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 03 + + + 00 00 00 00 00 00 00 B5 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 + 6C 6F 63 61 74 69 6F 6E 53 74 72 61 74 65 67 79 + 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 4C 6F 63 61 74 69 6F 6E 53 74 72 61 74 65 67 79 3B + + 34 39 32 33 37 63 62 36 2D 36 38 66 35 2D 34 36 61 39 2D 38 35 64 30 2D 61 34 61 66 66 39 33 37 38 30 64 37 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 04 + + + 00 00 00 00 00 00 00 B5 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 + 64 65 73 63 72 69 70 74 69 6F 6E 53 74 72 61 74 65 67 79 + 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 44 65 73 63 72 69 70 74 69 6F 6E 53 74 72 61 74 65 67 79 3B + + 39 31 66 62 61 62 64 36 2D 32 64 33 37 2D 34 34 66 36 2D 62 64 34 66 2D 66 65 61 66 35 66 32 37 61 30 33 62 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 05 + + + 00 00 00 00 00 00 00 B5 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 + 6C 69 73 74 65 6E 65 72 + 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 4C 69 73 74 65 6E 65 72 3B + + 31 64 39 34 65 63 38 39 2D 35 32 34 66 2D 34 39 65 37 2D 62 39 32 31 2D 31 34 37 39 35 37 32 34 66 31 61 61 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 06 + + + 00 00 00 00 00 00 00 B5 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 + 66 61 6C 6C 62 61 63 6B 53 74 72 61 74 65 67 79 + 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 46 61 6C 6C 62 61 63 6B 53 74 72 61 74 65 67 79 3B + + 61 36 31 61 63 65 64 30 2D 34 36 62 33 2D 34 64 30 61 2D 39 65 63 31 2D 35 38 66 35 36 32 35 66 38 61 61 35 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 07 + + + 00 00 00 00 00 00 00 B5 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 + 63 69 72 63 75 6C 61 72 69 74 79 4C 6F 63 6B + 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 43 69 72 63 75 6C 61 72 69 74 79 4C 6F 63 6B 3B + + 62 34 63 62 61 30 31 61 2D 63 66 64 66 2D 34 33 62 33 2D 62 31 61 30 2D 38 61 63 63 31 62 38 61 64 33 35 36 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 BB + 6A 61 76 61 2F 75 74 69 6C 2F 41 72 72 61 79 4C 69 73 74 + + + 00 00 00 00 00 00 00 59 + + + 00 00 00 00 00 00 00 B7 + 6A 61 76 61 2F 75 74 69 6C 2F 41 72 72 61 79 4C 69 73 74 + 3C 69 6E 69 74 3E + 28 29 56 + 00 + + + 00 00 00 00 00 00 00 B5 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 + 74 79 70 65 73 + 4C 6A 61 76 61 2F 75 74 69 6C 2F 4C 69 73 74 3B + + 31 32 62 38 64 36 32 66 2D 63 32 64 37 2D 34 39 66 38 2D 39 30 61 36 2D 38 38 31 39 32 32 61 35 30 39 36 36 + + 00 00 00 00 00 00 00 B1 + + 37 61 34 33 31 36 36 62 2D 63 35 65 34 2D 34 64 62 35 2D 39 30 36 32 2D 33 63 31 62 33 36 66 64 65 62 32 36 + + + + + 00 00 00 00 00 00 00 04 + 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3B 5A 29 56 + 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3C 2A 3E 3B 5A 29 56 + + + 00 00 00 00 00 00 00 0A + 00 00 00 00 00 00 00 0A + + + + + + 36 63 63 30 38 63 37 65 2D 34 66 34 33 2D 34 33 31 65 2D 38 36 31 61 2D 64 31 35 34 64 38 33 65 62 30 61 64 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 01 + + + 00 00 00 00 00 00 00 B8 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 75 74 69 6C 69 74 79 2F 4A 61 76 61 4D 6F 64 75 6C 65 + 6F 66 54 79 70 65 + 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3B 29 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 75 74 69 6C 69 74 79 2F 4A 61 76 61 4D 6F 64 75 6C 65 3B + 00 + + + 00 00 00 00 00 00 00 3A + 00 00 00 00 00 00 00 03 + + 61 63 66 62 31 36 30 39 2D 31 30 34 35 2D 34 35 34 36 2D 61 33 65 63 2D 36 35 66 63 32 65 37 34 37 37 65 36 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 B4 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 + 70 6F 6F 6C 53 74 72 61 74 65 67 79 + 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 50 6F 6F 6C 53 74 72 61 74 65 67 79 3B + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 B4 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 + 6C 6F 63 61 74 69 6F 6E 53 74 72 61 74 65 67 79 + 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 4C 6F 63 61 74 69 6F 6E 53 74 72 61 74 65 67 79 3B + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 01 + + + 00 00 00 00 00 00 00 B6 + 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 + 67 65 74 43 6C 61 73 73 4C 6F 61 64 65 72 + 28 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 4C 6F 61 64 65 72 3B + 00 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 03 + + + 00 00 00 00 00 00 00 B9 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 4C 6F 63 61 74 69 6F 6E 53 74 72 61 74 65 67 79 + 63 6C 61 73 73 46 69 6C 65 4C 6F 63 61 74 6F 72 + 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 4C 6F 61 64 65 72 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 75 74 69 6C 69 74 79 2F 4A 61 76 61 4D 6F 64 75 6C 65 3B 29 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 64 79 6E 61 6D 69 63 2F 43 6C 61 73 73 46 69 6C 65 4C 6F 63 61 74 6F 72 3B + 01 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 01 + + + 00 00 00 00 00 00 00 B6 + 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 + 67 65 74 43 6C 61 73 73 4C 6F 61 64 65 72 + 28 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 4C 6F 61 64 65 72 3B + 00 + + + 00 00 00 00 00 00 00 B9 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 50 6F 6F 6C 53 74 72 61 74 65 67 79 + 74 79 70 65 50 6F 6F 6C + 28 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 64 79 6E 61 6D 69 63 2F 43 6C 61 73 73 46 69 6C 65 4C 6F 63 61 74 6F 72 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 4C 6F 61 64 65 72 3B 29 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 70 6F 6F 6C 2F 54 79 70 65 50 6F 6F 6C 3B + 01 + + + 00 00 00 00 00 00 00 3A + 00 00 00 00 00 00 00 04 + + 31 62 39 65 32 31 61 37 2D 37 32 31 31 2D 34 30 37 33 2D 61 31 62 36 2D 65 66 61 61 35 39 36 32 35 37 36 30 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 B4 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 + 6D 61 74 63 68 65 72 + 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 61 77 4D 61 74 63 68 65 72 3B + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 B4 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 + 6C 69 73 74 65 6E 65 72 + 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 4C 69 73 74 65 6E 65 72 3B + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 B4 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 + 64 65 73 63 72 69 70 74 69 6F 6E 53 74 72 61 74 65 67 79 + 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 44 65 73 63 72 69 70 74 69 6F 6E 53 74 72 61 74 65 67 79 3B + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 01 + + 37 33 37 37 30 63 33 61 2D 33 31 61 33 2D 34 31 32 35 2D 62 39 34 32 2D 35 66 64 61 65 65 36 36 33 65 31 62 + + 00 00 00 00 00 00 00 B8 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 64 65 73 63 72 69 70 74 69 6F 6E 2F 74 79 70 65 2F 54 79 70 65 44 65 73 63 72 69 70 74 69 6F 6E 24 46 6F 72 4C 6F 61 64 65 64 54 79 70 65 + 67 65 74 4E 61 6D 65 + 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3B 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B + 00 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 01 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 04 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 B4 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 + 63 69 72 63 75 6C 61 72 69 74 79 4C 6F 63 6B + 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 43 69 72 63 75 6C 61 72 69 74 79 4C 6F 63 6B 3B + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 01 + + + 00 00 00 00 00 00 00 B6 + 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 + 67 65 74 43 6C 61 73 73 4C 6F 61 64 65 72 + 28 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 4C 6F 61 64 65 72 3B + 00 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 03 + + + 00 00 00 00 00 00 00 B9 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 44 65 73 63 72 69 70 74 69 6F 6E 53 74 72 61 74 65 67 79 + 61 70 70 6C 79 + 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 70 6F 6F 6C 2F 54 79 70 65 50 6F 6F 6C 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 43 69 72 63 75 6C 61 72 69 74 79 4C 6F 63 6B 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 4C 6F 61 64 65 72 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 75 74 69 6C 69 74 79 2F 4A 61 76 61 4D 6F 64 75 6C 65 3B 29 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 64 65 73 63 72 69 70 74 69 6F 6E 2F 74 79 70 65 2F 54 79 70 65 44 65 73 63 72 69 70 74 69 6F 6E 3B + 01 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 01 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 01 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 03 + + + 00 00 00 00 00 00 00 15 + 00 00 00 00 00 00 00 02 + + 38 30 66 32 39 38 35 38 2D 36 61 32 63 2D 34 33 32 35 2D 38 32 30 66 2D 66 66 62 38 37 32 64 31 31 31 61 36 + + 00 00 00 00 00 00 00 B7 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 + 64 6F 43 6F 6E 73 69 64 65 72 + 28 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 61 77 4D 61 74 63 68 65 72 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 4C 69 73 74 65 6E 65 72 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 64 65 73 63 72 69 70 74 69 6F 6E 2F 74 79 70 65 2F 54 79 70 65 44 65 73 63 72 69 70 74 69 6F 6E 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 75 74 69 6C 69 74 79 2F 4A 61 76 61 4D 6F 64 75 6C 65 3B 5A 29 56 + 00 + + 32 34 34 35 36 66 62 39 2D 35 35 34 33 2D 34 64 33 62 2D 38 30 61 30 2D 66 65 63 34 33 33 66 36 30 66 64 32 + + 00 00 00 00 00 00 00 A7 + 63 30 31 61 66 65 38 64 2D 38 35 32 31 2D 34 62 32 34 2D 38 37 62 33 2D 62 36 62 66 34 32 66 33 38 63 33 62 + + 66 39 37 32 64 39 35 33 2D 61 61 65 66 2D 34 64 61 30 2D 61 65 61 61 2D 65 31 39 31 64 32 61 31 30 35 30 62 + + 00 00 00 00 00 00 00 3A + 00 00 00 00 00 00 00 05 + + 35 61 63 31 34 64 39 32 2D 32 63 31 64 2D 34 38 37 34 2D 61 36 34 33 2D 37 63 64 64 32 39 61 39 61 62 64 38 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 B4 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 + 64 65 73 63 72 69 70 74 69 6F 6E 53 74 72 61 74 65 67 79 + 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 44 65 73 63 72 69 70 74 69 6F 6E 53 74 72 61 74 65 67 79 3B + + + 00 00 00 00 00 00 00 B9 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 44 65 73 63 72 69 70 74 69 6F 6E 53 74 72 61 74 65 67 79 + 69 73 4C 6F 61 64 65 64 46 69 72 73 74 + 28 29 5A + 01 + + + 00 00 00 00 00 00 00 99 + 65 39 64 38 62 61 32 30 2D 64 30 30 39 2D 34 32 64 66 2D 39 32 33 34 2D 61 31 34 37 66 36 61 36 61 64 30 33 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 B4 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 + 66 61 6C 6C 62 61 63 6B 53 74 72 61 74 65 67 79 + 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 46 61 6C 6C 62 61 63 6B 53 74 72 61 74 65 67 79 3B + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 01 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 05 + + + 00 00 00 00 00 00 00 B9 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 46 61 6C 6C 62 61 63 6B 53 74 72 61 74 65 67 79 + 69 73 46 61 6C 6C 62 61 63 6B + 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 54 68 72 6F 77 61 62 6C 65 3B 29 5A + 01 + + + 00 00 00 00 00 00 00 99 + 65 39 64 38 62 61 32 30 2D 64 30 30 39 2D 34 32 64 66 2D 39 32 33 34 2D 61 31 34 37 66 36 61 36 61 64 30 33 + + 66 37 33 32 39 35 30 61 2D 62 65 64 66 2D 34 37 64 37 2D 39 63 32 39 2D 34 36 30 39 62 33 34 35 36 39 61 35 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 B4 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 + 6D 61 74 63 68 65 72 + 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 61 77 4D 61 74 63 68 65 72 3B + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 B4 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 + 6C 69 73 74 65 6E 65 72 + 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 4C 69 73 74 65 6E 65 72 3B + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 04 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 01 + + 32 63 61 36 38 62 61 66 2D 65 37 38 61 2D 34 38 30 66 2D 39 61 33 34 2D 64 63 63 65 37 62 34 65 37 62 61 35 + + 00 00 00 00 00 00 00 B8 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 64 65 73 63 72 69 70 74 69 6F 6E 2F 74 79 70 65 2F 54 79 70 65 44 65 73 63 72 69 70 74 69 6F 6E 24 46 6F 72 4C 6F 61 64 65 64 54 79 70 65 + 67 65 74 4E 61 6D 65 + 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3B 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B + 00 + + + 00 00 00 00 00 00 00 B9 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 70 6F 6F 6C 2F 54 79 70 65 50 6F 6F 6C + 64 65 73 63 72 69 62 65 + 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 29 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 70 6F 6F 6C 2F 54 79 70 65 50 6F 6F 6C 24 52 65 73 6F 6C 75 74 69 6F 6E 3B + 01 + + + 00 00 00 00 00 00 00 B9 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 70 6F 6F 6C 2F 54 79 70 65 50 6F 6F 6C 24 52 65 73 6F 6C 75 74 69 6F 6E + 72 65 73 6F 6C 76 65 + 28 29 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 64 65 73 63 72 69 70 74 69 6F 6E 2F 74 79 70 65 2F 54 79 70 65 44 65 73 63 72 69 70 74 69 6F 6E 3B + 01 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 01 + + + 00 00 00 00 00 00 00 01 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 03 + + + 00 00 00 00 00 00 00 04 + + 31 34 39 66 34 65 35 62 2D 35 32 39 64 2D 34 64 38 36 2D 39 61 38 32 2D 37 33 36 34 61 39 35 38 37 35 66 35 + + 00 00 00 00 00 00 00 B7 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 + 64 6F 43 6F 6E 73 69 64 65 72 + 28 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 61 77 4D 61 74 63 68 65 72 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 4C 69 73 74 65 6E 65 72 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 64 65 73 63 72 69 70 74 69 6F 6E 2F 74 79 70 65 2F 54 79 70 65 44 65 73 63 72 69 70 74 69 6F 6E 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 75 74 69 6C 69 74 79 2F 4A 61 76 61 4D 6F 64 75 6C 65 3B 5A 29 56 + 00 + + + 00 00 00 00 00 00 00 A7 + 63 30 31 61 66 65 38 64 2D 38 35 32 31 2D 34 62 32 34 2D 38 37 62 33 2D 62 36 62 66 34 32 66 33 38 63 33 62 + + 65 39 64 38 62 61 32 30 2D 64 30 30 39 2D 34 32 64 66 2D 39 32 33 34 2D 61 31 34 37 66 36 61 36 61 64 30 33 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 05 + + + 00 00 00 00 00 00 00 BF + + 63 30 31 61 66 65 38 64 2D 38 35 32 31 2D 34 62 32 34 2D 38 37 62 33 2D 62 36 62 66 34 32 66 33 38 63 33 62 + + 00 00 00 00 00 00 00 A7 + 37 39 39 36 35 38 30 63 2D 34 30 38 39 2D 34 36 33 62 2D 39 37 33 36 2D 63 38 32 37 38 36 61 33 62 35 63 33 + + 35 63 62 63 39 62 31 64 2D 33 64 61 62 2D 34 32 66 65 2D 62 66 38 38 2D 31 65 31 65 31 32 34 39 61 66 65 66 + + 00 00 00 00 00 00 00 3A + 00 00 00 00 00 00 00 04 + + 63 63 30 31 38 32 34 61 2D 30 39 39 65 2D 34 33 36 34 2D 39 31 64 39 2D 30 66 36 36 65 35 35 37 36 30 33 36 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 B4 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 + 6C 69 73 74 65 6E 65 72 + 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 4C 69 73 74 65 6E 65 72 3B + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 01 + + + 00 00 00 00 00 00 00 B8 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 64 65 73 63 72 69 70 74 69 6F 6E 2F 74 79 70 65 2F 54 79 70 65 44 65 73 63 72 69 70 74 69 6F 6E 24 46 6F 72 4C 6F 61 64 65 64 54 79 70 65 + 67 65 74 4E 61 6D 65 + 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3B 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B + 00 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 01 + + + 00 00 00 00 00 00 00 B6 + 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 + 67 65 74 43 6C 61 73 73 4C 6F 61 64 65 72 + 28 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 4C 6F 61 64 65 72 3B + 00 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 03 + + + 00 00 00 00 00 00 00 04 + + + 00 00 00 00 00 00 00 B9 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 4C 69 73 74 65 6E 65 72 + 6F 6E 44 69 73 63 6F 76 65 72 79 + 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 4C 6F 61 64 65 72 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 75 74 69 6C 69 74 79 2F 4A 61 76 61 4D 6F 64 75 6C 65 3B 5A 29 56 + 01 + + 30 62 36 64 66 32 37 36 2D 35 35 65 37 2D 34 63 61 63 2D 62 63 66 65 2D 61 63 34 30 63 38 65 64 37 30 30 65 + + 00 00 00 00 00 00 00 A8 + 35 66 30 31 32 65 64 65 2D 63 34 30 39 2D 34 64 64 38 2D 62 30 31 64 2D 36 37 35 37 66 37 39 35 33 30 36 38 + + 65 30 32 35 39 39 31 36 2D 36 64 36 31 2D 34 37 36 61 2D 38 61 32 66 2D 36 33 61 65 30 66 65 66 34 30 66 33 + + 00 00 00 00 00 00 00 A7 + 36 63 62 64 39 38 31 62 2D 37 30 32 66 2D 34 39 33 64 2D 61 63 33 61 2D 62 62 39 62 31 39 35 61 35 30 65 32 + + 62 30 34 62 36 39 33 65 2D 32 37 64 61 2D 34 37 66 36 2D 38 36 30 63 2D 64 31 38 35 33 63 30 34 30 64 31 32 + + 00 00 00 00 00 00 00 3A + 00 00 00 00 00 00 00 06 + + + 00 00 00 00 00 00 00 A8 + 35 66 30 31 32 65 64 65 2D 63 34 30 39 2D 34 64 64 38 2D 62 30 31 64 2D 36 37 35 37 66 37 39 35 33 30 36 38 + + 31 39 35 61 65 66 61 39 2D 64 63 62 31 2D 34 64 36 36 2D 62 39 36 34 2D 31 36 63 36 66 36 35 33 34 64 35 66 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 06 + + + 00 00 00 00 00 00 00 BF + + 35 66 30 31 32 65 64 65 2D 63 34 30 39 2D 34 64 64 38 2D 62 30 31 64 2D 36 37 35 37 66 37 39 35 33 30 36 38 + + 00 00 00 00 00 00 00 3A + 00 00 00 00 00 00 00 07 + + 36 30 39 61 33 34 35 38 2D 61 32 35 35 2D 34 31 62 34 2D 38 33 62 31 2D 34 62 66 64 39 36 38 37 31 30 66 65 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 B4 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 + 6C 69 73 74 65 6E 65 72 + 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 4C 69 73 74 65 6E 65 72 3B + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 01 + + + 00 00 00 00 00 00 00 B8 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 64 65 73 63 72 69 70 74 69 6F 6E 2F 74 79 70 65 2F 54 79 70 65 44 65 73 63 72 69 70 74 69 6F 6E 24 46 6F 72 4C 6F 61 64 65 64 54 79 70 65 + 67 65 74 4E 61 6D 65 + 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3B 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B + 00 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 01 + + + 00 00 00 00 00 00 00 B6 + 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 + 67 65 74 43 6C 61 73 73 4C 6F 61 64 65 72 + 28 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 4C 6F 61 64 65 72 3B + 00 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 03 + + + 00 00 00 00 00 00 00 04 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 04 + + + 00 00 00 00 00 00 00 B9 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 4C 69 73 74 65 6E 65 72 + 6F 6E 45 72 72 6F 72 + 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 4C 6F 61 64 65 72 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 75 74 69 6C 69 74 79 2F 4A 61 76 61 4D 6F 64 75 6C 65 3B 5A 4C 6A 61 76 61 2F 6C 61 6E 67 2F 54 68 72 6F 77 61 62 6C 65 3B 29 56 + 01 + + 32 38 33 38 66 63 31 36 2D 35 31 65 30 2D 34 30 31 39 2D 62 35 36 33 2D 32 32 36 36 62 38 31 37 62 35 61 32 + + 00 00 00 00 00 00 00 A8 + 37 34 39 64 62 61 65 33 2D 65 62 31 39 2D 34 31 34 39 2D 38 36 64 35 2D 32 36 64 34 34 36 63 34 30 61 38 31 + + 35 61 33 65 36 37 65 37 2D 39 34 39 31 2D 34 36 64 38 2D 38 63 33 34 2D 39 30 35 61 32 65 32 32 32 66 35 62 + + 00 00 00 00 00 00 00 A7 + 33 65 33 33 65 61 63 39 2D 37 63 31 34 2D 34 62 39 31 2D 62 33 35 62 2D 30 66 32 38 62 35 39 31 30 61 64 62 + + 39 35 30 65 63 61 62 61 2D 37 33 63 38 2D 34 33 36 61 2D 38 33 39 65 2D 31 39 61 38 34 30 66 64 62 30 34 38 + + 00 00 00 00 00 00 00 3A + 00 00 00 00 00 00 00 08 + + + 00 00 00 00 00 00 00 A8 + 37 34 39 64 62 61 65 33 2D 65 62 31 39 2D 34 31 34 39 2D 38 36 64 35 2D 32 36 64 34 34 36 63 34 30 61 38 31 + + 30 33 37 31 64 66 39 35 2D 34 64 61 33 2D 34 32 32 31 2D 62 30 61 62 2D 33 39 66 31 39 30 32 30 66 32 31 62 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 08 + + + 00 00 00 00 00 00 00 BF + + 37 34 39 64 62 61 65 33 2D 65 62 31 39 2D 34 31 34 39 2D 38 36 64 35 2D 32 36 64 34 34 36 63 34 30 61 38 31 + + 00 00 00 00 00 00 00 3A + 00 00 00 00 00 00 00 09 + + 37 64 31 61 35 64 38 30 2D 61 63 64 37 2D 34 33 61 61 2D 38 31 36 66 2D 32 36 66 65 37 39 66 39 31 32 30 61 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 B4 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 + 6C 69 73 74 65 6E 65 72 + 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 4C 69 73 74 65 6E 65 72 3B + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 01 + + + 00 00 00 00 00 00 00 B8 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 64 65 73 63 72 69 70 74 69 6F 6E 2F 74 79 70 65 2F 54 79 70 65 44 65 73 63 72 69 70 74 69 6F 6E 24 46 6F 72 4C 6F 61 64 65 64 54 79 70 65 + 67 65 74 4E 61 6D 65 + 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3B 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B + 00 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 01 + + + 00 00 00 00 00 00 00 B6 + 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 + 67 65 74 43 6C 61 73 73 4C 6F 61 64 65 72 + 28 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 4C 6F 61 64 65 72 3B + 00 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 03 + + + 00 00 00 00 00 00 00 04 + + + 00 00 00 00 00 00 00 B9 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 4C 69 73 74 65 6E 65 72 + 6F 6E 43 6F 6D 70 6C 65 74 65 + 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 4C 6F 61 64 65 72 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 75 74 69 6C 69 74 79 2F 4A 61 76 61 4D 6F 64 75 6C 65 3B 5A 29 56 + 01 + + + 00 00 00 00 00 00 00 A9 + 00 00 00 00 00 00 00 09 + + 33 65 33 33 65 61 63 39 2D 37 63 31 34 2D 34 62 39 31 2D 62 33 35 62 2D 30 66 32 38 62 35 39 31 30 61 64 62 + + 00 00 00 00 00 00 00 A9 + 00 00 00 00 00 00 00 07 + + 36 63 62 64 39 38 31 62 2D 37 30 32 66 2D 34 39 33 64 2D 61 63 33 61 2D 62 62 39 62 31 39 35 61 35 30 65 32 + + 00 00 00 00 00 00 00 A7 + 37 39 39 36 35 38 30 63 2D 34 30 38 39 2D 34 36 33 62 2D 39 37 33 36 2D 63 38 32 37 38 36 61 33 62 35 63 33 + + 30 64 38 30 30 65 30 35 2D 33 65 31 35 2D 34 35 61 66 2D 62 38 38 39 2D 34 31 32 38 61 32 37 36 63 66 36 38 + + 00 00 00 00 00 00 00 3A + 00 00 00 00 00 00 00 05 + + 37 39 39 36 35 38 30 63 2D 34 30 38 39 2D 34 36 33 62 2D 39 37 33 36 2D 63 38 32 37 38 36 61 33 62 35 63 33 + + 00 00 00 00 00 00 00 B1 + + 64 37 63 66 62 33 64 66 2D 38 39 66 34 2D 34 34 64 39 2D 39 33 39 39 2D 35 37 63 31 63 36 31 39 62 62 35 38 + + + + + 31 62 39 65 32 31 61 37 2D 37 32 31 31 2D 34 30 37 33 2D 61 31 62 36 2D 65 66 61 61 35 39 36 32 35 37 36 30 + 32 34 34 35 36 66 62 39 2D 35 35 34 33 2D 34 64 33 62 2D 38 30 61 30 2D 66 65 63 34 33 33 66 36 30 66 64 32 + 66 39 37 32 64 39 35 33 2D 61 61 65 66 2D 34 64 61 30 2D 61 65 61 61 2D 65 31 39 31 64 32 61 31 30 35 30 62 + 6A 61 76 61 2F 6C 61 6E 67 2F 54 68 72 6F 77 61 62 6C 65 + + + 61 63 66 62 31 36 30 39 2D 31 30 34 35 2D 34 35 34 36 2D 61 33 65 63 2D 36 35 66 63 32 65 37 34 37 37 65 36 + 63 30 31 61 66 65 38 64 2D 38 35 32 31 2D 34 62 32 34 2D 38 37 62 33 2D 62 36 62 66 34 32 66 33 38 63 33 62 + 35 63 62 63 39 62 31 64 2D 33 64 61 62 2D 34 32 66 65 2D 62 66 38 38 2D 31 65 31 65 31 32 34 39 61 66 65 66 + 6A 61 76 61 2F 6C 61 6E 67 2F 54 68 72 6F 77 61 62 6C 65 + + + 63 63 30 31 38 32 34 61 2D 30 39 39 65 2D 34 33 36 34 2D 39 31 64 39 2D 30 66 36 36 65 35 35 37 36 30 33 36 + 65 30 32 35 39 39 31 36 2D 36 64 36 31 2D 34 37 36 61 2D 38 61 32 66 2D 36 33 61 65 30 66 65 66 34 30 66 33 + 62 30 34 62 36 39 33 65 2D 32 37 64 61 2D 34 37 66 36 2D 38 36 30 63 2D 64 31 38 35 33 63 30 34 30 64 31 32 + + + 62 30 34 62 36 39 33 65 2D 32 37 64 61 2D 34 37 66 36 2D 38 36 30 63 2D 64 31 38 35 33 63 30 34 30 64 31 32 + 31 39 35 61 65 66 61 39 2D 64 63 62 31 2D 34 64 36 36 2D 62 39 36 34 2D 31 36 63 36 66 36 35 33 34 64 35 66 + 62 30 34 62 36 39 33 65 2D 32 37 64 61 2D 34 37 66 36 2D 38 36 30 63 2D 64 31 38 35 33 63 30 34 30 64 31 32 + + + 36 30 39 61 33 34 35 38 2D 61 32 35 35 2D 34 31 62 34 2D 38 33 62 31 2D 34 62 66 64 39 36 38 37 31 30 66 65 + 35 61 33 65 36 37 65 37 2D 39 34 39 31 2D 34 36 64 38 2D 38 63 33 34 2D 39 30 35 61 32 65 32 32 32 66 35 62 + 39 35 30 65 63 61 62 61 2D 37 33 63 38 2D 34 33 36 61 2D 38 33 39 65 2D 31 39 61 38 34 30 66 64 62 30 34 38 + + + 39 35 30 65 63 61 62 61 2D 37 33 63 38 2D 34 33 36 61 2D 38 33 39 65 2D 31 39 61 38 34 30 66 64 62 30 34 38 + 30 33 37 31 64 66 39 35 2D 34 64 61 33 2D 34 32 32 31 2D 62 30 61 62 2D 33 39 66 31 39 30 32 30 66 32 31 62 + 39 35 30 65 63 61 62 61 2D 37 33 63 38 2D 34 33 36 61 2D 38 33 39 65 2D 31 39 61 38 34 30 66 64 62 30 34 38 + + + 63 63 30 31 38 32 34 61 2D 30 39 39 65 2D 34 33 36 34 2D 39 31 64 39 2D 30 66 36 36 65 35 35 37 36 30 33 36 + 36 63 62 64 39 38 31 62 2D 37 30 32 66 2D 34 39 33 64 2D 61 63 33 61 2D 62 62 39 62 31 39 35 61 35 30 65 32 + 30 64 38 30 30 65 30 35 2D 33 65 31 35 2D 34 35 61 66 2D 62 38 38 39 2D 34 31 32 38 61 32 37 36 63 66 36 38 + 6A 61 76 61 2F 6C 61 6E 67 2F 54 68 72 6F 77 61 62 6C 65 + + + + + 00 00 00 00 00 00 00 02 + 28 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 61 77 4D 61 74 63 68 65 72 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 4C 69 73 74 65 6E 65 72 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 64 65 73 63 72 69 70 74 69 6F 6E 2F 74 79 70 65 2F 54 79 70 65 44 65 73 63 72 69 70 74 69 6F 6E 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 75 74 69 6C 69 74 79 2F 4A 61 76 61 4D 6F 64 75 6C 65 3B 5A 29 56 + 28 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 61 77 4D 61 74 63 68 65 72 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 4C 69 73 74 65 6E 65 72 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 64 65 73 63 72 69 70 74 69 6F 6E 2F 74 79 70 65 2F 54 79 70 65 44 65 73 63 72 69 70 74 69 6F 6E 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3C 2A 3E 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3C 2A 3E 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 75 74 69 6C 69 74 79 2F 4A 61 76 61 4D 6F 64 75 6C 65 3B 5A 29 56 + + + 00 00 00 00 00 00 00 06 + 00 00 00 00 00 00 00 0B + + + + + + + + 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 75 74 69 6C 69 74 79 2F 6E 75 6C 6C 61 62 69 6C 69 74 79 2F 4D 61 79 62 65 4E 75 6C 6C 3B + 01 + + + + + 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 75 74 69 6C 69 74 79 2F 6E 75 6C 6C 61 62 69 6C 69 74 79 2F 4D 61 79 62 65 4E 75 6C 6C 3B + 01 + + + + + + 61 36 62 34 61 37 65 36 2D 64 61 38 61 2D 34 38 39 35 2D 62 31 65 66 2D 38 31 62 35 64 65 66 64 66 65 65 61 + + 00 00 00 00 00 00 00 15 + 00 00 00 00 00 00 00 07 + + + 00 00 00 00 00 00 00 99 + 34 61 33 30 37 66 65 36 2D 62 37 38 64 2D 34 30 30 37 2D 62 32 36 64 2D 39 65 61 61 31 64 31 36 36 31 33 33 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 01 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 03 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 04 + + + 00 00 00 00 00 00 00 B6 + 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 + 67 65 74 43 6C 61 73 73 4C 6F 61 64 65 72 + 28 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 4C 6F 61 64 65 72 3B + 00 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 06 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 05 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 04 + + + 00 00 00 00 00 00 00 B6 + 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 + 67 65 74 50 72 6F 74 65 63 74 69 6F 6E 44 6F 6D 61 69 6E + 28 29 4C 6A 61 76 61 2F 73 65 63 75 72 69 74 79 2F 50 72 6F 74 65 63 74 69 6F 6E 44 6F 6D 61 69 6E 3B + 00 + + + 00 00 00 00 00 00 00 B9 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 61 77 4D 61 74 63 68 65 72 + 6D 61 74 63 68 65 73 + 28 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 64 65 73 63 72 69 70 74 69 6F 6E 2F 74 79 70 65 2F 54 79 70 65 44 65 73 63 72 69 70 74 69 6F 6E 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 4C 6F 61 64 65 72 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 75 74 69 6C 69 74 79 2F 4A 61 76 61 4D 6F 64 75 6C 65 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3B 4C 6A 61 76 61 2F 73 65 63 75 72 69 74 79 2F 50 72 6F 74 65 63 74 69 6F 6E 44 6F 6D 61 69 6E 3B 29 5A + 01 + + + 00 00 00 00 00 00 00 9A + 34 62 30 31 31 32 35 38 2D 63 34 66 35 2D 34 38 38 66 2D 39 31 64 65 2D 30 31 36 37 34 66 66 62 63 30 30 31 + + 34 61 33 30 37 66 65 36 2D 62 37 38 64 2D 34 30 30 37 2D 62 32 36 64 2D 39 65 61 61 31 64 31 36 36 31 33 33 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 02 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 04 + + + 00 00 00 00 00 00 00 B8 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 64 65 73 63 72 69 70 74 69 6F 6E 2F 74 79 70 65 2F 54 79 70 65 44 65 73 63 72 69 70 74 69 6F 6E 24 46 6F 72 4C 6F 61 64 65 64 54 79 70 65 + 67 65 74 4E 61 6D 65 + 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3B 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B + 00 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 04 + + + 00 00 00 00 00 00 00 B6 + 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 + 67 65 74 43 6C 61 73 73 4C 6F 61 64 65 72 + 28 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 4C 6F 61 64 65 72 3B + 00 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 06 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 05 + + + 00 00 00 00 00 00 00 C6 + 63 65 38 65 37 32 39 63 2D 30 35 31 35 2D 34 61 38 31 2D 61 64 37 33 2D 30 30 30 34 37 38 37 34 65 33 61 66 + + + 00 00 00 00 00 00 00 04 + + + 00 00 00 00 00 00 00 A7 + 36 34 66 36 31 64 65 34 2D 61 35 32 30 2D 34 30 31 32 2D 62 37 35 30 2D 32 62 34 36 30 63 36 61 36 35 64 61 + + 63 65 38 65 37 32 39 63 2D 30 35 31 35 2D 34 61 38 31 2D 61 64 37 33 2D 30 30 30 34 37 38 37 34 65 33 61 66 + + 00 00 00 00 00 00 00 03 + + 36 34 66 36 31 64 65 34 2D 61 35 32 30 2D 34 30 31 32 2D 62 37 35 30 2D 32 62 34 36 30 63 36 61 36 35 64 61 + + 00 00 00 00 00 00 00 B9 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 4C 69 73 74 65 6E 65 72 + 6F 6E 44 69 73 63 6F 76 65 72 79 + 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 4C 6F 61 64 65 72 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 75 74 69 6C 69 74 79 2F 4A 61 76 61 4D 6F 64 75 6C 65 3B 5A 29 56 + 01 + + 63 63 37 39 37 36 65 31 2D 64 35 35 65 2D 34 39 36 65 2D 62 62 65 30 2D 63 30 30 64 38 36 63 32 65 64 65 61 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 02 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 03 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 04 + + + 00 00 00 00 00 00 00 B6 + 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 + 67 65 74 43 6C 61 73 73 4C 6F 61 64 65 72 + 28 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 4C 6F 61 64 65 72 3B + 00 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 06 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 05 + + + 00 00 00 00 00 00 00 C6 + 38 65 61 35 62 64 33 33 2D 34 31 63 34 2D 34 39 61 35 2D 38 30 64 66 2D 63 36 63 31 33 65 66 63 63 61 30 63 + + + 00 00 00 00 00 00 00 04 + + + 00 00 00 00 00 00 00 A7 + 37 33 38 65 62 39 66 64 2D 30 38 33 65 2D 34 38 62 63 2D 62 35 33 66 2D 31 30 66 31 33 62 39 36 39 36 36 37 + + 38 65 61 35 62 64 33 33 2D 34 31 63 34 2D 34 39 61 35 2D 38 30 64 66 2D 63 36 63 31 33 65 66 63 63 61 30 63 + + 00 00 00 00 00 00 00 03 + + 37 33 38 65 62 39 66 64 2D 30 38 33 65 2D 34 38 62 63 2D 62 35 33 66 2D 31 30 66 31 33 62 39 36 39 36 36 37 + + 00 00 00 00 00 00 00 B9 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 4C 69 73 74 65 6E 65 72 + 6F 6E 49 67 6E 6F 72 65 64 + 28 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 64 65 73 63 72 69 70 74 69 6F 6E 2F 74 79 70 65 2F 54 79 70 65 44 65 73 63 72 69 70 74 69 6F 6E 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 4C 6F 61 64 65 72 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 75 74 69 6C 69 74 79 2F 4A 61 76 61 4D 6F 64 75 6C 65 3B 5A 29 56 + 01 + + 31 30 39 38 62 61 37 65 2D 37 61 39 36 2D 34 66 65 66 2D 39 63 38 61 2D 64 66 65 35 38 61 63 30 62 31 37 63 + + 00 00 00 00 00 00 00 A8 + 66 63 32 62 63 62 38 62 2D 39 39 36 61 2D 34 61 31 62 2D 61 38 64 36 2D 38 39 62 35 66 39 36 63 35 31 39 63 + + 38 61 64 30 62 38 35 32 2D 38 38 34 65 2D 34 63 31 37 2D 61 39 61 30 2D 65 39 64 64 33 36 66 39 33 38 39 31 + + 00 00 00 00 00 00 00 A7 + 34 32 37 65 36 64 37 65 2D 38 37 39 62 2D 34 31 39 65 2D 62 39 39 65 2D 36 36 31 65 31 32 61 37 36 66 36 62 + + 62 35 30 36 34 37 35 63 2D 66 38 66 64 2D 34 35 37 33 2D 62 31 64 64 2D 38 32 66 38 65 61 66 62 38 31 65 36 + + 00 00 00 00 00 00 00 3A + 00 00 00 00 00 00 00 08 + + 39 31 62 64 35 38 61 64 2D 34 34 66 64 2D 34 36 35 65 2D 61 63 64 65 2D 65 33 32 30 31 34 35 34 31 32 38 38 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 02 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 04 + + + 00 00 00 00 00 00 00 B8 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 64 65 73 63 72 69 70 74 69 6F 6E 2F 74 79 70 65 2F 54 79 70 65 44 65 73 63 72 69 70 74 69 6F 6E 24 46 6F 72 4C 6F 61 64 65 64 54 79 70 65 + 67 65 74 4E 61 6D 65 + 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3B 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B + 00 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 04 + + + 00 00 00 00 00 00 00 B6 + 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 + 67 65 74 43 6C 61 73 73 4C 6F 61 64 65 72 + 28 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 4C 6F 61 64 65 72 3B + 00 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 06 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 05 + + + 00 00 00 00 00 00 00 C6 + 35 30 31 33 65 64 35 64 2D 65 65 37 31 2D 34 65 32 31 2D 61 33 61 65 2D 34 32 33 37 62 30 38 38 32 39 65 38 + + + 00 00 00 00 00 00 00 04 + + + 00 00 00 00 00 00 00 A7 + 37 31 31 38 31 66 34 61 2D 33 36 64 30 2D 34 34 34 66 2D 39 31 63 62 2D 31 61 35 34 61 35 64 36 35 65 33 63 + + 35 30 31 33 65 64 35 64 2D 65 65 37 31 2D 34 65 32 31 2D 61 33 61 65 2D 34 32 33 37 62 30 38 38 32 39 65 38 + + 00 00 00 00 00 00 00 03 + + 37 31 31 38 31 66 34 61 2D 33 36 64 30 2D 34 34 34 66 2D 39 31 63 62 2D 31 61 35 34 61 35 64 36 35 65 33 63 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 08 + + + 00 00 00 00 00 00 00 B9 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 4C 69 73 74 65 6E 65 72 + 6F 6E 45 72 72 6F 72 + 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 4C 6F 61 64 65 72 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 75 74 69 6C 69 74 79 2F 4A 61 76 61 4D 6F 64 75 6C 65 3B 5A 4C 6A 61 76 61 2F 6C 61 6E 67 2F 54 68 72 6F 77 61 62 6C 65 3B 29 56 + 01 + + 65 62 65 35 63 66 35 36 2D 32 31 39 34 2D 34 31 33 66 2D 38 38 39 33 2D 61 63 35 36 66 38 38 62 62 63 61 34 + + 00 00 00 00 00 00 00 A8 + 66 63 32 62 63 62 38 62 2D 39 39 36 61 2D 34 61 31 62 2D 61 38 64 36 2D 38 39 62 35 66 39 36 63 35 31 39 63 + + 39 36 37 34 62 65 33 65 2D 30 64 38 38 2D 34 62 34 32 2D 61 39 61 65 2D 62 38 32 61 65 66 38 64 64 61 63 62 + + 00 00 00 00 00 00 00 A7 + 34 32 37 65 36 64 37 65 2D 38 37 39 62 2D 34 31 39 65 2D 62 39 39 65 2D 36 36 31 65 31 32 61 37 36 66 36 62 + + 36 64 61 37 35 62 35 39 2D 31 37 32 32 2D 34 65 37 35 2D 62 36 62 31 2D 37 37 64 38 33 61 33 31 32 34 32 39 + + 00 00 00 00 00 00 00 3A + 00 00 00 00 00 00 00 09 + + + 00 00 00 00 00 00 00 A8 + 66 63 32 62 63 62 38 62 2D 39 39 36 61 2D 34 61 31 62 2D 61 38 64 36 2D 38 39 62 35 66 39 36 63 35 31 39 63 + + 62 64 35 32 63 61 35 38 2D 37 37 66 66 2D 34 36 34 32 2D 38 62 65 38 2D 62 32 38 66 64 39 63 36 38 32 35 64 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 09 + + + 00 00 00 00 00 00 00 BF + + 66 63 32 62 63 62 38 62 2D 39 39 36 61 2D 34 61 31 62 2D 61 38 64 36 2D 38 39 62 35 66 39 36 63 35 31 39 63 + + 00 00 00 00 00 00 00 3A + 00 00 00 00 00 00 00 0A + + 61 39 64 38 38 33 34 36 2D 35 39 61 38 2D 34 30 34 30 2D 62 62 35 35 2D 34 31 35 37 39 64 37 31 39 32 39 61 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 02 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 04 + + + 00 00 00 00 00 00 00 B8 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 64 65 73 63 72 69 70 74 69 6F 6E 2F 74 79 70 65 2F 54 79 70 65 44 65 73 63 72 69 70 74 69 6F 6E 24 46 6F 72 4C 6F 61 64 65 64 54 79 70 65 + 67 65 74 4E 61 6D 65 + 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3B 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B + 00 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 04 + + + 00 00 00 00 00 00 00 B6 + 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 + 67 65 74 43 6C 61 73 73 4C 6F 61 64 65 72 + 28 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 4C 6F 61 64 65 72 3B + 00 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 06 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 05 + + + 00 00 00 00 00 00 00 C6 + 37 34 61 65 62 65 66 34 2D 31 36 38 35 2D 34 66 63 35 2D 61 31 64 64 2D 65 37 31 31 39 31 66 35 64 35 32 37 + + + 00 00 00 00 00 00 00 04 + + + 00 00 00 00 00 00 00 A7 + 32 38 66 34 38 34 37 33 2D 64 66 33 33 2D 34 30 35 63 2D 62 35 65 62 2D 31 62 30 63 31 61 33 66 38 38 35 36 + + 37 34 61 65 62 65 66 34 2D 31 36 38 35 2D 34 66 63 35 2D 61 31 64 64 2D 65 37 31 31 39 31 66 35 64 35 32 37 + + 00 00 00 00 00 00 00 03 + + 32 38 66 34 38 34 37 33 2D 64 66 33 33 2D 34 30 35 63 2D 62 35 65 62 2D 31 62 30 63 31 61 33 66 38 38 35 36 + + 00 00 00 00 00 00 00 B9 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 4C 69 73 74 65 6E 65 72 + 6F 6E 43 6F 6D 70 6C 65 74 65 + 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 4C 6F 61 64 65 72 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 75 74 69 6C 69 74 79 2F 4A 61 76 61 4D 6F 64 75 6C 65 3B 5A 29 56 + 01 + + + 00 00 00 00 00 00 00 A9 + 00 00 00 00 00 00 00 0A + + 34 32 37 65 36 64 37 65 2D 38 37 39 62 2D 34 31 39 65 2D 62 39 39 65 2D 36 36 31 65 31 32 61 37 36 66 36 62 + + 00 00 00 00 00 00 00 A7 + 30 65 66 63 30 66 32 66 2D 35 37 64 61 2D 34 30 31 36 2D 39 66 32 30 2D 39 35 39 36 36 63 64 32 39 66 65 34 + + 37 31 34 65 66 64 30 37 2D 30 34 37 63 2D 34 36 38 63 2D 38 36 65 62 2D 31 65 65 31 35 32 37 39 37 63 65 32 + + 00 00 00 00 00 00 00 3A + 00 00 00 00 00 00 00 08 + + 31 37 30 62 32 37 63 30 2D 65 39 32 33 2D 34 61 62 32 2D 61 34 36 66 2D 33 39 63 66 64 38 36 31 63 61 39 30 + + 00 00 00 00 00 00 00 A7 + 30 65 66 63 30 66 32 66 2D 35 37 64 61 2D 34 30 31 36 2D 39 66 32 30 2D 39 35 39 36 36 63 64 32 39 66 65 34 + + 34 62 30 31 31 32 35 38 2D 63 34 66 35 2D 34 38 38 66 2D 39 31 64 65 2D 30 31 36 37 34 66 66 62 63 30 30 31 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 B4 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 + 74 79 70 65 73 + 4C 6A 61 76 61 2F 75 74 69 6C 2F 4C 69 73 74 3B + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 04 + + + 00 00 00 00 00 00 00 B9 + 6A 61 76 61 2F 75 74 69 6C 2F 4C 69 73 74 + 61 64 64 + 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 29 5A + 01 + + + 00 00 00 00 00 00 00 57 + + 30 65 66 63 30 66 32 66 2D 35 37 64 61 2D 34 30 31 36 2D 39 66 32 30 2D 39 35 39 36 36 63 64 32 39 66 65 34 + + 00 00 00 00 00 00 00 B1 + + 37 36 34 64 39 32 62 34 2D 36 32 35 38 2D 34 38 36 66 2D 61 65 31 33 2D 66 34 32 32 30 32 61 36 63 39 33 33 + + + + + 34 61 33 30 37 66 65 36 2D 62 37 38 64 2D 34 30 30 37 2D 62 32 36 64 2D 39 65 61 61 31 64 31 36 36 31 33 33 + 31 30 39 38 62 61 37 65 2D 37 61 39 36 2D 34 66 65 66 2D 39 63 38 61 2D 64 66 65 35 38 61 63 30 62 31 37 63 + 62 35 30 36 34 37 35 63 2D 66 38 66 64 2D 34 35 37 33 2D 62 31 64 64 2D 38 32 66 38 65 61 66 62 38 31 65 36 + 6A 61 76 61 2F 6C 61 6E 67 2F 54 68 72 6F 77 61 62 6C 65 + + + 34 61 33 30 37 66 65 36 2D 62 37 38 64 2D 34 30 30 37 2D 62 32 36 64 2D 39 65 61 61 31 64 31 36 36 31 33 33 + 38 61 64 30 62 38 35 32 2D 38 38 34 65 2D 34 63 31 37 2D 61 39 61 30 2D 65 39 64 64 33 36 66 39 33 38 39 31 + 36 64 61 37 35 62 35 39 2D 31 37 32 32 2D 34 65 37 35 2D 62 36 62 31 2D 37 37 64 38 33 61 33 31 32 34 32 39 + + + 62 35 30 36 34 37 35 63 2D 66 38 66 64 2D 34 35 37 33 2D 62 31 64 64 2D 38 32 66 38 65 61 66 62 38 31 65 36 + 39 36 37 34 62 65 33 65 2D 30 64 38 38 2D 34 62 34 32 2D 61 39 61 65 2D 62 38 32 61 65 66 38 64 64 61 63 62 + 36 64 61 37 35 62 35 39 2D 31 37 32 32 2D 34 65 37 35 2D 62 36 62 31 2D 37 37 64 38 33 61 33 31 32 34 32 39 + + + 36 64 61 37 35 62 35 39 2D 31 37 32 32 2D 34 65 37 35 2D 62 36 62 31 2D 37 37 64 38 33 61 33 31 32 34 32 39 + 62 64 35 32 63 61 35 38 2D 37 37 66 66 2D 34 36 34 32 2D 38 62 65 38 2D 62 32 38 66 64 39 63 36 38 32 35 64 + 36 64 61 37 35 62 35 39 2D 31 37 32 32 2D 34 65 37 35 2D 62 36 62 31 2D 37 37 64 38 33 61 33 31 32 34 32 39 + + + 34 61 33 30 37 66 65 36 2D 62 37 38 64 2D 34 30 30 37 2D 62 32 36 64 2D 39 65 61 61 31 64 31 36 36 31 33 33 + 34 32 37 65 36 64 37 65 2D 38 37 39 62 2D 34 31 39 65 2D 62 39 39 65 2D 36 36 31 65 31 32 61 37 36 66 36 62 + 37 31 34 65 66 64 30 37 2D 30 34 37 63 2D 34 36 38 63 2D 38 36 65 62 2D 31 65 65 31 35 32 37 39 37 63 65 32 + 6A 61 76 61 2F 6C 61 6E 67 2F 54 68 72 6F 77 61 62 6C 65 + + + + + 00 00 00 00 00 00 00 04 + 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 69 6E 73 74 72 75 6D 65 6E 74 2F 49 6E 73 74 72 75 6D 65 6E 74 61 74 69 6F 6E 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 42 61 74 63 68 41 6C 6C 6F 63 61 74 6F 72 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 4C 69 73 74 65 6E 65 72 3B 49 29 49 + + + + 00 00 00 00 00 00 00 06 + 00 00 00 00 00 00 00 09 + + + + + + + + 35 37 64 66 30 61 30 34 2D 66 63 64 39 2D 34 37 65 65 2D 61 30 35 64 2D 38 66 30 35 34 38 35 62 62 34 62 39 + + 00 00 00 00 00 00 00 BB + 6A 61 76 61 2F 75 74 69 6C 2F 48 61 73 68 4D 61 70 + + + 00 00 00 00 00 00 00 59 + + + 00 00 00 00 00 00 00 B7 + 6A 61 76 61 2F 75 74 69 6C 2F 48 61 73 68 4D 61 70 + 3C 69 6E 69 74 3E + 28 29 56 + 00 + + + 00 00 00 00 00 00 00 3A + 00 00 00 00 00 00 00 05 + + 66 31 31 36 33 65 36 35 2D 36 66 38 38 2D 34 38 34 61 2D 62 63 31 32 2D 36 32 34 37 65 36 34 61 32 37 61 38 + + 00 00 00 00 00 00 00 BB + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 24 50 72 65 70 65 6E 64 61 62 6C 65 49 74 65 72 61 74 6F 72 + + + 00 00 00 00 00 00 00 59 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 02 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 B4 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 + 74 79 70 65 73 + 4C 6A 61 76 61 2F 75 74 69 6C 2F 4C 69 73 74 3B + + + 00 00 00 00 00 00 00 B9 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 42 61 74 63 68 41 6C 6C 6F 63 61 74 6F 72 + 62 61 74 63 68 + 28 4C 6A 61 76 61 2F 75 74 69 6C 2F 4C 69 73 74 3B 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 49 74 65 72 61 62 6C 65 3B + 01 + + + 00 00 00 00 00 00 00 B7 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 24 50 72 65 70 65 6E 64 61 62 6C 65 49 74 65 72 61 74 6F 72 + 3C 69 6E 69 74 3E + 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 49 74 65 72 61 62 6C 65 3B 29 56 + 00 + + + 00 00 00 00 00 00 00 3A + 00 00 00 00 00 00 00 06 + + 38 62 33 64 64 30 62 63 2D 38 64 66 34 2D 34 66 66 37 2D 62 36 38 34 2D 64 66 39 62 39 36 64 39 63 33 35 34 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 06 + + + 00 00 00 00 00 00 00 B6 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 24 50 72 65 70 65 6E 64 61 62 6C 65 49 74 65 72 61 74 6F 72 + 68 61 73 4E 65 78 74 + 28 29 5A + 00 + + + 00 00 00 00 00 00 00 99 + 36 65 61 31 37 62 33 36 2D 64 38 33 36 2D 34 39 62 39 2D 38 37 39 30 2D 33 64 62 31 34 30 34 30 37 66 30 31 + + 62 38 35 34 66 32 37 31 2D 62 32 61 30 2D 34 37 61 65 2D 61 65 30 30 2D 38 66 34 37 61 32 66 63 30 32 35 62 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 06 + + + 00 00 00 00 00 00 00 B6 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 24 50 72 65 70 65 6E 64 61 62 6C 65 49 74 65 72 61 74 6F 72 + 6E 65 78 74 + 28 29 4C 6A 61 76 61 2F 75 74 69 6C 2F 4C 69 73 74 3B + 00 + + + 00 00 00 00 00 00 00 3A + 00 00 00 00 00 00 00 07 + + 62 31 36 65 39 31 66 37 2D 63 65 38 31 2D 34 64 64 39 2D 39 32 32 66 2D 33 36 31 62 31 64 34 62 61 32 33 62 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 03 + + + 00 00 00 00 00 00 00 15 + 00 00 00 00 00 00 00 04 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 07 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 B4 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 + 74 79 70 65 73 + 4C 6A 61 76 61 2F 75 74 69 6C 2F 4C 69 73 74 3B + + + 00 00 00 00 00 00 00 B9 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 4C 69 73 74 65 6E 65 72 + 6F 6E 42 61 74 63 68 + 28 49 4C 6A 61 76 61 2F 75 74 69 6C 2F 4C 69 73 74 3B 4C 6A 61 76 61 2F 75 74 69 6C 2F 4C 69 73 74 3B 29 56 + 01 + + 33 39 37 32 34 61 65 63 2D 36 66 37 62 2D 34 35 61 37 2D 39 32 32 64 2D 39 36 61 38 61 35 38 63 39 65 34 31 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 01 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 07 + + + 00 00 00 00 00 00 00 B6 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 + 64 6F 41 70 70 6C 79 + 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 69 6E 73 74 72 75 6D 65 6E 74 2F 49 6E 73 74 72 75 6D 65 6E 74 61 74 69 6F 6E 3B 4C 6A 61 76 61 2F 75 74 69 6C 2F 4C 69 73 74 3B 29 56 + 00 + + 39 31 38 61 30 63 63 63 2D 63 66 39 33 2D 34 35 64 33 2D 62 37 63 35 2D 35 61 37 63 38 33 64 37 65 35 36 66 + + 00 00 00 00 00 00 00 A7 + 32 64 65 35 33 39 61 35 2D 36 61 66 33 2D 34 39 63 32 2D 39 64 31 32 2D 37 61 30 36 39 34 36 30 39 34 39 37 + + 37 61 34 37 37 66 39 32 2D 65 66 32 65 2D 34 30 65 66 2D 62 39 63 37 2D 61 62 35 38 61 32 66 32 35 64 30 32 + + 00 00 00 00 00 00 00 3A + 00 00 00 00 00 00 00 08 + + 31 63 37 63 31 65 61 33 2D 65 38 37 33 2D 34 38 65 32 2D 62 35 35 37 2D 64 65 30 65 37 65 30 35 33 63 31 66 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 06 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 03 + + + 00 00 00 00 00 00 00 15 + 00 00 00 00 00 00 00 04 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 07 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 08 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 B4 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 + 74 79 70 65 73 + 4C 6A 61 76 61 2F 75 74 69 6C 2F 4C 69 73 74 3B + + + 00 00 00 00 00 00 00 B9 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 4C 69 73 74 65 6E 65 72 + 6F 6E 45 72 72 6F 72 + 28 49 4C 6A 61 76 61 2F 75 74 69 6C 2F 4C 69 73 74 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 54 68 72 6F 77 61 62 6C 65 3B 4C 6A 61 76 61 2F 75 74 69 6C 2F 4C 69 73 74 3B 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 49 74 65 72 61 62 6C 65 3B + 01 + + + 00 00 00 00 00 00 00 B6 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 24 50 72 65 70 65 6E 64 61 62 6C 65 49 74 65 72 61 74 6F 72 + 70 72 65 70 65 6E 64 + 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 49 74 65 72 61 62 6C 65 3B 29 56 + 00 + + 32 39 65 66 64 39 35 64 2D 37 66 38 35 2D 34 34 36 61 2D 62 30 37 32 2D 63 65 61 61 61 36 62 35 66 33 35 64 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 05 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 07 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 08 + + + 00 00 00 00 00 00 00 B9 + 6A 61 76 61 2F 75 74 69 6C 2F 4D 61 70 + 70 75 74 + 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B + 01 + + + 00 00 00 00 00 00 00 57 + + 32 64 65 35 33 39 61 35 2D 36 61 66 33 2D 34 39 63 32 2D 39 64 31 32 2D 37 61 30 36 39 34 36 30 39 34 39 37 + + 00 00 00 00 00 00 00 84 + 00 00 00 00 00 00 00 04 + 00 00 00 00 00 00 00 01 + + 36 35 37 65 33 38 39 62 2D 36 62 30 34 2D 34 32 61 34 2D 38 66 39 33 2D 63 63 39 33 39 61 30 32 35 31 66 64 + + 00 00 00 00 00 00 00 A7 + 38 62 33 64 64 30 62 63 2D 38 64 66 34 2D 34 66 66 37 2D 62 36 38 34 2D 64 66 39 62 39 36 64 39 63 33 35 34 + + 36 65 61 31 37 62 33 36 2D 64 38 33 36 2D 34 39 62 39 2D 38 37 39 30 2D 33 64 62 31 34 30 34 30 37 66 30 31 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 03 + + + 00 00 00 00 00 00 00 15 + 00 00 00 00 00 00 00 04 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 B4 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 + 74 79 70 65 73 + 4C 6A 61 76 61 2F 75 74 69 6C 2F 4C 69 73 74 3B + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 05 + + + 00 00 00 00 00 00 00 B9 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 4C 69 73 74 65 6E 65 72 + 6F 6E 43 6F 6D 70 6C 65 74 65 + 28 49 4C 6A 61 76 61 2F 75 74 69 6C 2F 4C 69 73 74 3B 4C 6A 61 76 61 2F 75 74 69 6C 2F 4D 61 70 3B 29 56 + 01 + + 37 36 64 33 36 35 66 35 2D 37 63 64 34 2D 34 31 62 39 2D 39 34 32 32 2D 31 39 32 35 63 35 32 34 35 64 34 39 + + 00 00 00 00 00 00 00 15 + 00 00 00 00 00 00 00 04 + + + 00 00 00 00 00 00 00 AC + + 35 31 31 30 66 38 38 65 2D 33 31 66 38 2D 34 35 34 61 2D 39 37 35 61 2D 32 62 33 31 30 36 66 64 38 39 30 63 + + + + + 33 39 37 32 34 61 65 63 2D 36 66 37 62 2D 34 35 61 37 2D 39 32 32 64 2D 39 36 61 38 61 35 38 63 39 65 34 31 + 39 31 38 61 30 63 63 63 2D 63 66 39 33 2D 34 35 64 33 2D 62 37 63 35 2D 35 61 37 63 38 33 64 37 65 35 36 66 + 37 61 34 37 37 66 39 32 2D 65 66 32 65 2D 34 30 65 66 2D 62 39 63 37 2D 61 62 35 38 61 32 66 32 35 64 30 32 + 6A 61 76 61 2F 6C 61 6E 67 2F 54 68 72 6F 77 61 62 6C 65 + + + + + 00 00 00 00 00 00 04 04 + 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 69 6E 73 74 72 75 6D 65 6E 74 2F 49 6E 73 74 72 75 6D 65 6E 74 61 74 69 6F 6E 3B 4C 6A 61 76 61 2F 75 74 69 6C 2F 4C 69 73 74 3B 29 56 + 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 69 6E 73 74 72 75 6D 65 6E 74 2F 49 6E 73 74 72 75 6D 65 6E 74 61 74 69 6F 6E 3B 4C 6A 61 76 61 2F 75 74 69 6C 2F 4C 69 73 74 3C 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3C 2A 3E 3B 3E 3B 29 56 + + 6A 61 76 61 2F 6C 61 6E 67 2F 69 6E 73 74 72 75 6D 65 6E 74 2F 55 6E 6D 6F 64 69 66 69 61 62 6C 65 43 6C 61 73 73 45 78 63 65 70 74 69 6F 6E + 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 4E 6F 74 46 6F 75 6E 64 45 78 63 65 70 74 69 6F 6E + + + 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 + + + + + + + + + + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 + 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 + 00 00 00 00 00 00 44 09 + + + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 + 43 6F 6C 6C 65 63 74 6F 72 + 00 00 00 00 00 00 04 0C + + + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 24 46 6F 72 52 65 74 72 61 6E 73 66 6F 72 6D 61 74 69 6F 6E + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 + 46 6F 72 52 65 74 72 61 6E 73 66 6F 72 6D 61 74 69 6F 6E + 00 00 00 00 00 00 00 0C + + + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 24 46 6F 72 52 65 64 65 66 69 6E 69 74 69 6F 6E + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 + 46 6F 72 52 65 64 65 66 69 6E 69 74 69 6F 6E + 00 00 00 00 00 00 00 0C + + + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 24 50 72 65 70 65 6E 64 61 62 6C 65 49 74 65 72 61 74 6F 72 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 + 50 72 65 70 65 6E 64 61 62 6C 65 49 74 65 72 61 74 6F 72 + 00 00 00 00 00 00 00 0C + + + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 61 77 4D 61 74 63 68 65 72 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 + 52 61 77 4D 61 74 63 68 65 72 + 00 00 00 00 00 00 06 09 + + + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 50 6F 6F 6C 53 74 72 61 74 65 67 79 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 + 50 6F 6F 6C 53 74 72 61 74 65 67 79 + 00 00 00 00 00 00 06 09 + + + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 4C 6F 63 61 74 69 6F 6E 53 74 72 61 74 65 67 79 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 + 4C 6F 63 61 74 69 6F 6E 53 74 72 61 74 65 67 79 + 00 00 00 00 00 00 06 09 + + + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 44 65 73 63 72 69 70 74 69 6F 6E 53 74 72 61 74 65 67 79 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 + 44 65 73 63 72 69 70 74 69 6F 6E 53 74 72 61 74 65 67 79 + 00 00 00 00 00 00 06 09 + + + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 4C 69 73 74 65 6E 65 72 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 + 4C 69 73 74 65 6E 65 72 + 00 00 00 00 00 00 06 09 + + + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 46 61 6C 6C 62 61 63 6B 53 74 72 61 74 65 67 79 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 + 46 61 6C 6C 62 61 63 6B 53 74 72 61 74 65 67 79 + 00 00 00 00 00 00 06 09 + + + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 43 69 72 63 75 6C 61 72 69 74 79 4C 6F 63 6B + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 + 43 69 72 63 75 6C 61 72 69 74 79 4C 6F 63 6B + 00 00 00 00 00 00 06 09 + + + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 42 61 74 63 68 41 6C 6C 6F 63 61 74 6F 72 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 + 42 61 74 63 68 41 6C 6C 6F 63 61 74 6F 72 + 00 00 00 00 00 00 06 09 + + + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 4C 69 73 74 65 6E 65 72 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 + 4C 69 73 74 65 6E 65 72 + 00 00 00 00 00 00 06 09 + + + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 64 65 73 63 72 69 70 74 69 6F 6E 2F 74 79 70 65 2F 54 79 70 65 44 65 73 63 72 69 70 74 69 6F 6E 24 46 6F 72 4C 6F 61 64 65 64 54 79 70 65 + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 64 65 73 63 72 69 70 74 69 6F 6E 2F 74 79 70 65 2F 54 79 70 65 44 65 73 63 72 69 70 74 69 6F 6E + 46 6F 72 4C 6F 61 64 65 64 54 79 70 65 + 00 00 00 00 00 00 00 09 + + + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 70 6F 6F 6C 2F 54 79 70 65 50 6F 6F 6C 24 52 65 73 6F 6C 75 74 69 6F 6E + 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 70 6F 6F 6C 2F 54 79 70 65 50 6F 6F 6C + 52 65 73 6F 6C 75 74 69 6F 6E + 00 00 00 00 00 00 06 09 + + + + + From 29939303bad60ee878f82c24efee1099df33e8b4 Mon Sep 17 00:00:00 2001 From: volodya-lombrozo Date: Thu, 23 May 2024 13:20:07 +0300 Subject: [PATCH 13/41] feat(#229): remove redundant resources --- ...uilder$RedefinitionStrategy$Collector.xmir | 1034 ----------------- 1 file changed, 1034 deletions(-) diff --git a/src/test/resources/xmir/compiled/AgentBuilder$RedefinitionStrategy$Collector.xmir b/src/test/resources/xmir/compiled/AgentBuilder$RedefinitionStrategy$Collector.xmir index fd46f812..2660d314 100644 --- a/src/test/resources/xmir/compiled/AgentBuilder$RedefinitionStrategy$Collector.xmir +++ b/src/test/resources/xmir/compiled/AgentBuilder$RedefinitionStrategy$Collector.xmir @@ -101,181 +101,6 @@ 4C 6A 61 76 61 2F 75 74 69 6C 2F 4C 69 73 74 3C 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3C 2A 3E 3B 3E 3B - - 00 00 00 00 00 00 00 04 - 28 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 61 77 4D 61 74 63 68 65 72 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 50 6F 6F 6C 53 74 72 61 74 65 67 79 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 4C 6F 63 61 74 69 6F 6E 53 74 72 61 74 65 67 79 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 44 65 73 63 72 69 70 74 69 6F 6E 53 74 72 61 74 65 67 79 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 4C 69 73 74 65 6E 65 72 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 46 61 6C 6C 62 61 63 6B 53 74 72 61 74 65 67 79 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 43 69 72 63 75 6C 61 72 69 74 79 4C 6F 63 6B 3B 29 56 - - - - 00 00 00 00 00 00 00 03 - 00 00 00 00 00 00 00 08 - - - - - - - - - - - 64 39 66 38 64 30 37 32 2D 34 31 33 38 2D 34 62 34 30 2D 61 30 32 31 2D 61 32 61 31 32 62 32 37 37 34 37 61 - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 00 - - - 00 00 00 00 00 00 00 B7 - 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 - 3C 69 6E 69 74 3E - 28 29 56 - 00 - - 31 62 65 64 34 37 32 33 2D 36 37 65 62 2D 34 64 65 35 2D 39 39 38 33 2D 65 37 38 30 38 30 35 63 38 31 38 61 - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 00 - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 01 - - - 00 00 00 00 00 00 00 B5 - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 - 6D 61 74 63 68 65 72 - 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 61 77 4D 61 74 63 68 65 72 3B - - 38 61 39 31 38 36 64 65 2D 36 30 35 30 2D 34 62 38 66 2D 39 62 65 35 2D 64 65 32 66 30 31 62 37 61 37 66 36 - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 00 - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 02 - - - 00 00 00 00 00 00 00 B5 - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 - 70 6F 6F 6C 53 74 72 61 74 65 67 79 - 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 50 6F 6F 6C 53 74 72 61 74 65 67 79 3B - - 36 65 66 37 36 34 32 37 2D 38 32 64 33 2D 34 31 32 63 2D 62 62 36 61 2D 61 62 64 64 32 61 64 62 31 39 34 65 - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 00 - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 03 - - - 00 00 00 00 00 00 00 B5 - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 - 6C 6F 63 61 74 69 6F 6E 53 74 72 61 74 65 67 79 - 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 4C 6F 63 61 74 69 6F 6E 53 74 72 61 74 65 67 79 3B - - 34 39 32 33 37 63 62 36 2D 36 38 66 35 2D 34 36 61 39 2D 38 35 64 30 2D 61 34 61 66 66 39 33 37 38 30 64 37 - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 00 - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 04 - - - 00 00 00 00 00 00 00 B5 - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 - 64 65 73 63 72 69 70 74 69 6F 6E 53 74 72 61 74 65 67 79 - 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 44 65 73 63 72 69 70 74 69 6F 6E 53 74 72 61 74 65 67 79 3B - - 39 31 66 62 61 62 64 36 2D 32 64 33 37 2D 34 34 66 36 2D 62 64 34 66 2D 66 65 61 66 35 66 32 37 61 30 33 62 - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 00 - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 05 - - - 00 00 00 00 00 00 00 B5 - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 - 6C 69 73 74 65 6E 65 72 - 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 4C 69 73 74 65 6E 65 72 3B - - 31 64 39 34 65 63 38 39 2D 35 32 34 66 2D 34 39 65 37 2D 62 39 32 31 2D 31 34 37 39 35 37 32 34 66 31 61 61 - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 00 - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 06 - - - 00 00 00 00 00 00 00 B5 - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 - 66 61 6C 6C 62 61 63 6B 53 74 72 61 74 65 67 79 - 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 46 61 6C 6C 62 61 63 6B 53 74 72 61 74 65 67 79 3B - - 61 36 31 61 63 65 64 30 2D 34 36 62 33 2D 34 64 30 61 2D 39 65 63 31 2D 35 38 66 35 36 32 35 66 38 61 61 35 - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 00 - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 07 - - - 00 00 00 00 00 00 00 B5 - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 - 63 69 72 63 75 6C 61 72 69 74 79 4C 6F 63 6B - 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 43 69 72 63 75 6C 61 72 69 74 79 4C 6F 63 6B 3B - - 62 34 63 62 61 30 31 61 2D 63 66 64 66 2D 34 33 62 33 2D 62 31 61 30 2D 38 61 63 63 31 62 38 61 64 33 35 36 - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 00 - - - 00 00 00 00 00 00 00 BB - 6A 61 76 61 2F 75 74 69 6C 2F 41 72 72 61 79 4C 69 73 74 - - - 00 00 00 00 00 00 00 59 - - - 00 00 00 00 00 00 00 B7 - 6A 61 76 61 2F 75 74 69 6C 2F 41 72 72 61 79 4C 69 73 74 - 3C 69 6E 69 74 3E - 28 29 56 - 00 - - - 00 00 00 00 00 00 00 B5 - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 - 74 79 70 65 73 - 4C 6A 61 76 61 2F 75 74 69 6C 2F 4C 69 73 74 3B - - 31 32 62 38 64 36 32 66 2D 63 32 64 37 2D 34 39 66 38 2D 39 30 61 36 2D 38 38 31 39 32 32 61 35 30 39 36 36 - - 00 00 00 00 00 00 00 B1 - - 37 61 34 33 31 36 36 62 2D 63 35 65 34 2D 34 64 62 35 2D 39 30 36 32 2D 33 63 31 62 33 36 66 64 65 62 32 36 - - - 00 00 00 00 00 00 00 04 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3B 5A 29 56 @@ -917,865 +742,6 @@ - - 00 00 00 00 00 00 00 02 - 28 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 61 77 4D 61 74 63 68 65 72 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 4C 69 73 74 65 6E 65 72 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 64 65 73 63 72 69 70 74 69 6F 6E 2F 74 79 70 65 2F 54 79 70 65 44 65 73 63 72 69 70 74 69 6F 6E 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 75 74 69 6C 69 74 79 2F 4A 61 76 61 4D 6F 64 75 6C 65 3B 5A 29 56 - 28 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 61 77 4D 61 74 63 68 65 72 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 4C 69 73 74 65 6E 65 72 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 64 65 73 63 72 69 70 74 69 6F 6E 2F 74 79 70 65 2F 54 79 70 65 44 65 73 63 72 69 70 74 69 6F 6E 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3C 2A 3E 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3C 2A 3E 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 75 74 69 6C 69 74 79 2F 4A 61 76 61 4D 6F 64 75 6C 65 3B 5A 29 56 - - - 00 00 00 00 00 00 00 06 - 00 00 00 00 00 00 00 0B - - - - - - - - 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 75 74 69 6C 69 74 79 2F 6E 75 6C 6C 61 62 69 6C 69 74 79 2F 4D 61 79 62 65 4E 75 6C 6C 3B - 01 - - - - - 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 75 74 69 6C 69 74 79 2F 6E 75 6C 6C 61 62 69 6C 69 74 79 2F 4D 61 79 62 65 4E 75 6C 6C 3B - 01 - - - - - - 61 36 62 34 61 37 65 36 2D 64 61 38 61 2D 34 38 39 35 2D 62 31 65 66 2D 38 31 62 35 64 65 66 64 66 65 65 61 - - 00 00 00 00 00 00 00 15 - 00 00 00 00 00 00 00 07 - - - 00 00 00 00 00 00 00 99 - 34 61 33 30 37 66 65 36 2D 62 37 38 64 2D 34 30 30 37 2D 62 32 36 64 2D 39 65 61 61 31 64 31 36 36 31 33 33 - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 01 - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 03 - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 04 - - - 00 00 00 00 00 00 00 B6 - 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 - 67 65 74 43 6C 61 73 73 4C 6F 61 64 65 72 - 28 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 4C 6F 61 64 65 72 3B - 00 - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 06 - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 05 - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 04 - - - 00 00 00 00 00 00 00 B6 - 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 - 67 65 74 50 72 6F 74 65 63 74 69 6F 6E 44 6F 6D 61 69 6E - 28 29 4C 6A 61 76 61 2F 73 65 63 75 72 69 74 79 2F 50 72 6F 74 65 63 74 69 6F 6E 44 6F 6D 61 69 6E 3B - 00 - - - 00 00 00 00 00 00 00 B9 - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 61 77 4D 61 74 63 68 65 72 - 6D 61 74 63 68 65 73 - 28 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 64 65 73 63 72 69 70 74 69 6F 6E 2F 74 79 70 65 2F 54 79 70 65 44 65 73 63 72 69 70 74 69 6F 6E 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 4C 6F 61 64 65 72 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 75 74 69 6C 69 74 79 2F 4A 61 76 61 4D 6F 64 75 6C 65 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3B 4C 6A 61 76 61 2F 73 65 63 75 72 69 74 79 2F 50 72 6F 74 65 63 74 69 6F 6E 44 6F 6D 61 69 6E 3B 29 5A - 01 - - - 00 00 00 00 00 00 00 9A - 34 62 30 31 31 32 35 38 2D 63 34 66 35 2D 34 38 38 66 2D 39 31 64 65 2D 30 31 36 37 34 66 66 62 63 30 30 31 - - 34 61 33 30 37 66 65 36 2D 62 37 38 64 2D 34 30 30 37 2D 62 32 36 64 2D 39 65 61 61 31 64 31 36 36 31 33 33 - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 02 - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 04 - - - 00 00 00 00 00 00 00 B8 - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 64 65 73 63 72 69 70 74 69 6F 6E 2F 74 79 70 65 2F 54 79 70 65 44 65 73 63 72 69 70 74 69 6F 6E 24 46 6F 72 4C 6F 61 64 65 64 54 79 70 65 - 67 65 74 4E 61 6D 65 - 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3B 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B - 00 - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 04 - - - 00 00 00 00 00 00 00 B6 - 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 - 67 65 74 43 6C 61 73 73 4C 6F 61 64 65 72 - 28 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 4C 6F 61 64 65 72 3B - 00 - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 06 - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 05 - - - 00 00 00 00 00 00 00 C6 - 63 65 38 65 37 32 39 63 2D 30 35 31 35 2D 34 61 38 31 2D 61 64 37 33 2D 30 30 30 34 37 38 37 34 65 33 61 66 - - - 00 00 00 00 00 00 00 04 - - - 00 00 00 00 00 00 00 A7 - 36 34 66 36 31 64 65 34 2D 61 35 32 30 2D 34 30 31 32 2D 62 37 35 30 2D 32 62 34 36 30 63 36 61 36 35 64 61 - - 63 65 38 65 37 32 39 63 2D 30 35 31 35 2D 34 61 38 31 2D 61 64 37 33 2D 30 30 30 34 37 38 37 34 65 33 61 66 - - 00 00 00 00 00 00 00 03 - - 36 34 66 36 31 64 65 34 2D 61 35 32 30 2D 34 30 31 32 2D 62 37 35 30 2D 32 62 34 36 30 63 36 61 36 35 64 61 - - 00 00 00 00 00 00 00 B9 - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 4C 69 73 74 65 6E 65 72 - 6F 6E 44 69 73 63 6F 76 65 72 79 - 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 4C 6F 61 64 65 72 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 75 74 69 6C 69 74 79 2F 4A 61 76 61 4D 6F 64 75 6C 65 3B 5A 29 56 - 01 - - 63 63 37 39 37 36 65 31 2D 64 35 35 65 2D 34 39 36 65 2D 62 62 65 30 2D 63 30 30 64 38 36 63 32 65 64 65 61 - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 02 - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 03 - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 04 - - - 00 00 00 00 00 00 00 B6 - 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 - 67 65 74 43 6C 61 73 73 4C 6F 61 64 65 72 - 28 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 4C 6F 61 64 65 72 3B - 00 - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 06 - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 05 - - - 00 00 00 00 00 00 00 C6 - 38 65 61 35 62 64 33 33 2D 34 31 63 34 2D 34 39 61 35 2D 38 30 64 66 2D 63 36 63 31 33 65 66 63 63 61 30 63 - - - 00 00 00 00 00 00 00 04 - - - 00 00 00 00 00 00 00 A7 - 37 33 38 65 62 39 66 64 2D 30 38 33 65 2D 34 38 62 63 2D 62 35 33 66 2D 31 30 66 31 33 62 39 36 39 36 36 37 - - 38 65 61 35 62 64 33 33 2D 34 31 63 34 2D 34 39 61 35 2D 38 30 64 66 2D 63 36 63 31 33 65 66 63 63 61 30 63 - - 00 00 00 00 00 00 00 03 - - 37 33 38 65 62 39 66 64 2D 30 38 33 65 2D 34 38 62 63 2D 62 35 33 66 2D 31 30 66 31 33 62 39 36 39 36 36 37 - - 00 00 00 00 00 00 00 B9 - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 4C 69 73 74 65 6E 65 72 - 6F 6E 49 67 6E 6F 72 65 64 - 28 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 64 65 73 63 72 69 70 74 69 6F 6E 2F 74 79 70 65 2F 54 79 70 65 44 65 73 63 72 69 70 74 69 6F 6E 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 4C 6F 61 64 65 72 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 75 74 69 6C 69 74 79 2F 4A 61 76 61 4D 6F 64 75 6C 65 3B 5A 29 56 - 01 - - 31 30 39 38 62 61 37 65 2D 37 61 39 36 2D 34 66 65 66 2D 39 63 38 61 2D 64 66 65 35 38 61 63 30 62 31 37 63 - - 00 00 00 00 00 00 00 A8 - 66 63 32 62 63 62 38 62 2D 39 39 36 61 2D 34 61 31 62 2D 61 38 64 36 2D 38 39 62 35 66 39 36 63 35 31 39 63 - - 38 61 64 30 62 38 35 32 2D 38 38 34 65 2D 34 63 31 37 2D 61 39 61 30 2D 65 39 64 64 33 36 66 39 33 38 39 31 - - 00 00 00 00 00 00 00 A7 - 34 32 37 65 36 64 37 65 2D 38 37 39 62 2D 34 31 39 65 2D 62 39 39 65 2D 36 36 31 65 31 32 61 37 36 66 36 62 - - 62 35 30 36 34 37 35 63 2D 66 38 66 64 2D 34 35 37 33 2D 62 31 64 64 2D 38 32 66 38 65 61 66 62 38 31 65 36 - - 00 00 00 00 00 00 00 3A - 00 00 00 00 00 00 00 08 - - 39 31 62 64 35 38 61 64 2D 34 34 66 64 2D 34 36 35 65 2D 61 63 64 65 2D 65 33 32 30 31 34 35 34 31 32 38 38 - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 02 - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 04 - - - 00 00 00 00 00 00 00 B8 - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 64 65 73 63 72 69 70 74 69 6F 6E 2F 74 79 70 65 2F 54 79 70 65 44 65 73 63 72 69 70 74 69 6F 6E 24 46 6F 72 4C 6F 61 64 65 64 54 79 70 65 - 67 65 74 4E 61 6D 65 - 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3B 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B - 00 - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 04 - - - 00 00 00 00 00 00 00 B6 - 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 - 67 65 74 43 6C 61 73 73 4C 6F 61 64 65 72 - 28 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 4C 6F 61 64 65 72 3B - 00 - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 06 - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 05 - - - 00 00 00 00 00 00 00 C6 - 35 30 31 33 65 64 35 64 2D 65 65 37 31 2D 34 65 32 31 2D 61 33 61 65 2D 34 32 33 37 62 30 38 38 32 39 65 38 - - - 00 00 00 00 00 00 00 04 - - - 00 00 00 00 00 00 00 A7 - 37 31 31 38 31 66 34 61 2D 33 36 64 30 2D 34 34 34 66 2D 39 31 63 62 2D 31 61 35 34 61 35 64 36 35 65 33 63 - - 35 30 31 33 65 64 35 64 2D 65 65 37 31 2D 34 65 32 31 2D 61 33 61 65 2D 34 32 33 37 62 30 38 38 32 39 65 38 - - 00 00 00 00 00 00 00 03 - - 37 31 31 38 31 66 34 61 2D 33 36 64 30 2D 34 34 34 66 2D 39 31 63 62 2D 31 61 35 34 61 35 64 36 35 65 33 63 - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 08 - - - 00 00 00 00 00 00 00 B9 - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 4C 69 73 74 65 6E 65 72 - 6F 6E 45 72 72 6F 72 - 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 4C 6F 61 64 65 72 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 75 74 69 6C 69 74 79 2F 4A 61 76 61 4D 6F 64 75 6C 65 3B 5A 4C 6A 61 76 61 2F 6C 61 6E 67 2F 54 68 72 6F 77 61 62 6C 65 3B 29 56 - 01 - - 65 62 65 35 63 66 35 36 2D 32 31 39 34 2D 34 31 33 66 2D 38 38 39 33 2D 61 63 35 36 66 38 38 62 62 63 61 34 - - 00 00 00 00 00 00 00 A8 - 66 63 32 62 63 62 38 62 2D 39 39 36 61 2D 34 61 31 62 2D 61 38 64 36 2D 38 39 62 35 66 39 36 63 35 31 39 63 - - 39 36 37 34 62 65 33 65 2D 30 64 38 38 2D 34 62 34 32 2D 61 39 61 65 2D 62 38 32 61 65 66 38 64 64 61 63 62 - - 00 00 00 00 00 00 00 A7 - 34 32 37 65 36 64 37 65 2D 38 37 39 62 2D 34 31 39 65 2D 62 39 39 65 2D 36 36 31 65 31 32 61 37 36 66 36 62 - - 36 64 61 37 35 62 35 39 2D 31 37 32 32 2D 34 65 37 35 2D 62 36 62 31 2D 37 37 64 38 33 61 33 31 32 34 32 39 - - 00 00 00 00 00 00 00 3A - 00 00 00 00 00 00 00 09 - - - 00 00 00 00 00 00 00 A8 - 66 63 32 62 63 62 38 62 2D 39 39 36 61 2D 34 61 31 62 2D 61 38 64 36 2D 38 39 62 35 66 39 36 63 35 31 39 63 - - 62 64 35 32 63 61 35 38 2D 37 37 66 66 2D 34 36 34 32 2D 38 62 65 38 2D 62 32 38 66 64 39 63 36 38 32 35 64 - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 09 - - - 00 00 00 00 00 00 00 BF - - 66 63 32 62 63 62 38 62 2D 39 39 36 61 2D 34 61 31 62 2D 61 38 64 36 2D 38 39 62 35 66 39 36 63 35 31 39 63 - - 00 00 00 00 00 00 00 3A - 00 00 00 00 00 00 00 0A - - 61 39 64 38 38 33 34 36 2D 35 39 61 38 2D 34 30 34 30 2D 62 62 35 35 2D 34 31 35 37 39 64 37 31 39 32 39 61 - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 02 - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 04 - - - 00 00 00 00 00 00 00 B8 - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 64 65 73 63 72 69 70 74 69 6F 6E 2F 74 79 70 65 2F 54 79 70 65 44 65 73 63 72 69 70 74 69 6F 6E 24 46 6F 72 4C 6F 61 64 65 64 54 79 70 65 - 67 65 74 4E 61 6D 65 - 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3B 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B - 00 - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 04 - - - 00 00 00 00 00 00 00 B6 - 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 - 67 65 74 43 6C 61 73 73 4C 6F 61 64 65 72 - 28 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 4C 6F 61 64 65 72 3B - 00 - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 06 - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 05 - - - 00 00 00 00 00 00 00 C6 - 37 34 61 65 62 65 66 34 2D 31 36 38 35 2D 34 66 63 35 2D 61 31 64 64 2D 65 37 31 31 39 31 66 35 64 35 32 37 - - - 00 00 00 00 00 00 00 04 - - - 00 00 00 00 00 00 00 A7 - 32 38 66 34 38 34 37 33 2D 64 66 33 33 2D 34 30 35 63 2D 62 35 65 62 2D 31 62 30 63 31 61 33 66 38 38 35 36 - - 37 34 61 65 62 65 66 34 2D 31 36 38 35 2D 34 66 63 35 2D 61 31 64 64 2D 65 37 31 31 39 31 66 35 64 35 32 37 - - 00 00 00 00 00 00 00 03 - - 32 38 66 34 38 34 37 33 2D 64 66 33 33 2D 34 30 35 63 2D 62 35 65 62 2D 31 62 30 63 31 61 33 66 38 38 35 36 - - 00 00 00 00 00 00 00 B9 - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 4C 69 73 74 65 6E 65 72 - 6F 6E 43 6F 6D 70 6C 65 74 65 - 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 4C 6F 61 64 65 72 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 75 74 69 6C 69 74 79 2F 4A 61 76 61 4D 6F 64 75 6C 65 3B 5A 29 56 - 01 - - - 00 00 00 00 00 00 00 A9 - 00 00 00 00 00 00 00 0A - - 34 32 37 65 36 64 37 65 2D 38 37 39 62 2D 34 31 39 65 2D 62 39 39 65 2D 36 36 31 65 31 32 61 37 36 66 36 62 - - 00 00 00 00 00 00 00 A7 - 30 65 66 63 30 66 32 66 2D 35 37 64 61 2D 34 30 31 36 2D 39 66 32 30 2D 39 35 39 36 36 63 64 32 39 66 65 34 - - 37 31 34 65 66 64 30 37 2D 30 34 37 63 2D 34 36 38 63 2D 38 36 65 62 2D 31 65 65 31 35 32 37 39 37 63 65 32 - - 00 00 00 00 00 00 00 3A - 00 00 00 00 00 00 00 08 - - 31 37 30 62 32 37 63 30 2D 65 39 32 33 2D 34 61 62 32 2D 61 34 36 66 2D 33 39 63 66 64 38 36 31 63 61 39 30 - - 00 00 00 00 00 00 00 A7 - 30 65 66 63 30 66 32 66 2D 35 37 64 61 2D 34 30 31 36 2D 39 66 32 30 2D 39 35 39 36 36 63 64 32 39 66 65 34 - - 34 62 30 31 31 32 35 38 2D 63 34 66 35 2D 34 38 38 66 2D 39 31 64 65 2D 30 31 36 37 34 66 66 62 63 30 30 31 - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 00 - - - 00 00 00 00 00 00 00 B4 - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 - 74 79 70 65 73 - 4C 6A 61 76 61 2F 75 74 69 6C 2F 4C 69 73 74 3B - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 04 - - - 00 00 00 00 00 00 00 B9 - 6A 61 76 61 2F 75 74 69 6C 2F 4C 69 73 74 - 61 64 64 - 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 29 5A - 01 - - - 00 00 00 00 00 00 00 57 - - 30 65 66 63 30 66 32 66 2D 35 37 64 61 2D 34 30 31 36 2D 39 66 32 30 2D 39 35 39 36 36 63 64 32 39 66 65 34 - - 00 00 00 00 00 00 00 B1 - - 37 36 34 64 39 32 62 34 2D 36 32 35 38 2D 34 38 36 66 2D 61 65 31 33 2D 66 34 32 32 30 32 61 36 63 39 33 33 - - - - - 34 61 33 30 37 66 65 36 2D 62 37 38 64 2D 34 30 30 37 2D 62 32 36 64 2D 39 65 61 61 31 64 31 36 36 31 33 33 - 31 30 39 38 62 61 37 65 2D 37 61 39 36 2D 34 66 65 66 2D 39 63 38 61 2D 64 66 65 35 38 61 63 30 62 31 37 63 - 62 35 30 36 34 37 35 63 2D 66 38 66 64 2D 34 35 37 33 2D 62 31 64 64 2D 38 32 66 38 65 61 66 62 38 31 65 36 - 6A 61 76 61 2F 6C 61 6E 67 2F 54 68 72 6F 77 61 62 6C 65 - - - 34 61 33 30 37 66 65 36 2D 62 37 38 64 2D 34 30 30 37 2D 62 32 36 64 2D 39 65 61 61 31 64 31 36 36 31 33 33 - 38 61 64 30 62 38 35 32 2D 38 38 34 65 2D 34 63 31 37 2D 61 39 61 30 2D 65 39 64 64 33 36 66 39 33 38 39 31 - 36 64 61 37 35 62 35 39 2D 31 37 32 32 2D 34 65 37 35 2D 62 36 62 31 2D 37 37 64 38 33 61 33 31 32 34 32 39 - - - 62 35 30 36 34 37 35 63 2D 66 38 66 64 2D 34 35 37 33 2D 62 31 64 64 2D 38 32 66 38 65 61 66 62 38 31 65 36 - 39 36 37 34 62 65 33 65 2D 30 64 38 38 2D 34 62 34 32 2D 61 39 61 65 2D 62 38 32 61 65 66 38 64 64 61 63 62 - 36 64 61 37 35 62 35 39 2D 31 37 32 32 2D 34 65 37 35 2D 62 36 62 31 2D 37 37 64 38 33 61 33 31 32 34 32 39 - - - 36 64 61 37 35 62 35 39 2D 31 37 32 32 2D 34 65 37 35 2D 62 36 62 31 2D 37 37 64 38 33 61 33 31 32 34 32 39 - 62 64 35 32 63 61 35 38 2D 37 37 66 66 2D 34 36 34 32 2D 38 62 65 38 2D 62 32 38 66 64 39 63 36 38 32 35 64 - 36 64 61 37 35 62 35 39 2D 31 37 32 32 2D 34 65 37 35 2D 62 36 62 31 2D 37 37 64 38 33 61 33 31 32 34 32 39 - - - 34 61 33 30 37 66 65 36 2D 62 37 38 64 2D 34 30 30 37 2D 62 32 36 64 2D 39 65 61 61 31 64 31 36 36 31 33 33 - 34 32 37 65 36 64 37 65 2D 38 37 39 62 2D 34 31 39 65 2D 62 39 39 65 2D 36 36 31 65 31 32 61 37 36 66 36 62 - 37 31 34 65 66 64 30 37 2D 30 34 37 63 2D 34 36 38 63 2D 38 36 65 62 2D 31 65 65 31 35 32 37 39 37 63 65 32 - 6A 61 76 61 2F 6C 61 6E 67 2F 54 68 72 6F 77 61 62 6C 65 - - - - - 00 00 00 00 00 00 00 04 - 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 69 6E 73 74 72 75 6D 65 6E 74 2F 49 6E 73 74 72 75 6D 65 6E 74 61 74 69 6F 6E 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 42 61 74 63 68 41 6C 6C 6F 63 61 74 6F 72 3B 4C 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 4C 69 73 74 65 6E 65 72 3B 49 29 49 - - - - 00 00 00 00 00 00 00 06 - 00 00 00 00 00 00 00 09 - - - - - - - - 35 37 64 66 30 61 30 34 2D 66 63 64 39 2D 34 37 65 65 2D 61 30 35 64 2D 38 66 30 35 34 38 35 62 62 34 62 39 - - 00 00 00 00 00 00 00 BB - 6A 61 76 61 2F 75 74 69 6C 2F 48 61 73 68 4D 61 70 - - - 00 00 00 00 00 00 00 59 - - - 00 00 00 00 00 00 00 B7 - 6A 61 76 61 2F 75 74 69 6C 2F 48 61 73 68 4D 61 70 - 3C 69 6E 69 74 3E - 28 29 56 - 00 - - - 00 00 00 00 00 00 00 3A - 00 00 00 00 00 00 00 05 - - 66 31 31 36 33 65 36 35 2D 36 66 38 38 2D 34 38 34 61 2D 62 63 31 32 2D 36 32 34 37 65 36 34 61 32 37 61 38 - - 00 00 00 00 00 00 00 BB - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 24 50 72 65 70 65 6E 64 61 62 6C 65 49 74 65 72 61 74 6F 72 - - - 00 00 00 00 00 00 00 59 - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 02 - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 00 - - - 00 00 00 00 00 00 00 B4 - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 - 74 79 70 65 73 - 4C 6A 61 76 61 2F 75 74 69 6C 2F 4C 69 73 74 3B - - - 00 00 00 00 00 00 00 B9 - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 42 61 74 63 68 41 6C 6C 6F 63 61 74 6F 72 - 62 61 74 63 68 - 28 4C 6A 61 76 61 2F 75 74 69 6C 2F 4C 69 73 74 3B 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 49 74 65 72 61 62 6C 65 3B - 01 - - - 00 00 00 00 00 00 00 B7 - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 24 50 72 65 70 65 6E 64 61 62 6C 65 49 74 65 72 61 74 6F 72 - 3C 69 6E 69 74 3E - 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 49 74 65 72 61 62 6C 65 3B 29 56 - 00 - - - 00 00 00 00 00 00 00 3A - 00 00 00 00 00 00 00 06 - - 38 62 33 64 64 30 62 63 2D 38 64 66 34 2D 34 66 66 37 2D 62 36 38 34 2D 64 66 39 62 39 36 64 39 63 33 35 34 - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 06 - - - 00 00 00 00 00 00 00 B6 - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 24 50 72 65 70 65 6E 64 61 62 6C 65 49 74 65 72 61 74 6F 72 - 68 61 73 4E 65 78 74 - 28 29 5A - 00 - - - 00 00 00 00 00 00 00 99 - 36 65 61 31 37 62 33 36 2D 64 38 33 36 2D 34 39 62 39 2D 38 37 39 30 2D 33 64 62 31 34 30 34 30 37 66 30 31 - - 62 38 35 34 66 32 37 31 2D 62 32 61 30 2D 34 37 61 65 2D 61 65 30 30 2D 38 66 34 37 61 32 66 63 30 32 35 62 - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 06 - - - 00 00 00 00 00 00 00 B6 - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 24 50 72 65 70 65 6E 64 61 62 6C 65 49 74 65 72 61 74 6F 72 - 6E 65 78 74 - 28 29 4C 6A 61 76 61 2F 75 74 69 6C 2F 4C 69 73 74 3B - 00 - - - 00 00 00 00 00 00 00 3A - 00 00 00 00 00 00 00 07 - - 62 31 36 65 39 31 66 37 2D 63 65 38 31 2D 34 64 64 39 2D 39 32 32 66 2D 33 36 31 62 31 64 34 62 61 32 33 62 - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 03 - - - 00 00 00 00 00 00 00 15 - 00 00 00 00 00 00 00 04 - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 07 - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 00 - - - 00 00 00 00 00 00 00 B4 - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 - 74 79 70 65 73 - 4C 6A 61 76 61 2F 75 74 69 6C 2F 4C 69 73 74 3B - - - 00 00 00 00 00 00 00 B9 - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 4C 69 73 74 65 6E 65 72 - 6F 6E 42 61 74 63 68 - 28 49 4C 6A 61 76 61 2F 75 74 69 6C 2F 4C 69 73 74 3B 4C 6A 61 76 61 2F 75 74 69 6C 2F 4C 69 73 74 3B 29 56 - 01 - - 33 39 37 32 34 61 65 63 2D 36 66 37 62 2D 34 35 61 37 2D 39 32 32 64 2D 39 36 61 38 61 35 38 63 39 65 34 31 - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 00 - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 01 - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 07 - - - 00 00 00 00 00 00 00 B6 - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 - 64 6F 41 70 70 6C 79 - 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 69 6E 73 74 72 75 6D 65 6E 74 2F 49 6E 73 74 72 75 6D 65 6E 74 61 74 69 6F 6E 3B 4C 6A 61 76 61 2F 75 74 69 6C 2F 4C 69 73 74 3B 29 56 - 00 - - 39 31 38 61 30 63 63 63 2D 63 66 39 33 2D 34 35 64 33 2D 62 37 63 35 2D 35 61 37 63 38 33 64 37 65 35 36 66 - - 00 00 00 00 00 00 00 A7 - 32 64 65 35 33 39 61 35 2D 36 61 66 33 2D 34 39 63 32 2D 39 64 31 32 2D 37 61 30 36 39 34 36 30 39 34 39 37 - - 37 61 34 37 37 66 39 32 2D 65 66 32 65 2D 34 30 65 66 2D 62 39 63 37 2D 61 62 35 38 61 32 66 32 35 64 30 32 - - 00 00 00 00 00 00 00 3A - 00 00 00 00 00 00 00 08 - - 31 63 37 63 31 65 61 33 2D 65 38 37 33 2D 34 38 65 32 2D 62 35 35 37 2D 64 65 30 65 37 65 30 35 33 63 31 66 - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 06 - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 03 - - - 00 00 00 00 00 00 00 15 - 00 00 00 00 00 00 00 04 - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 07 - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 08 - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 00 - - - 00 00 00 00 00 00 00 B4 - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 - 74 79 70 65 73 - 4C 6A 61 76 61 2F 75 74 69 6C 2F 4C 69 73 74 3B - - - 00 00 00 00 00 00 00 B9 - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 4C 69 73 74 65 6E 65 72 - 6F 6E 45 72 72 6F 72 - 28 49 4C 6A 61 76 61 2F 75 74 69 6C 2F 4C 69 73 74 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 54 68 72 6F 77 61 62 6C 65 3B 4C 6A 61 76 61 2F 75 74 69 6C 2F 4C 69 73 74 3B 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 49 74 65 72 61 62 6C 65 3B - 01 - - - 00 00 00 00 00 00 00 B6 - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 24 50 72 65 70 65 6E 64 61 62 6C 65 49 74 65 72 61 74 6F 72 - 70 72 65 70 65 6E 64 - 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 49 74 65 72 61 62 6C 65 3B 29 56 - 00 - - 32 39 65 66 64 39 35 64 2D 37 66 38 35 2D 34 34 36 61 2D 62 30 37 32 2D 63 65 61 61 61 36 62 35 66 33 35 64 - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 05 - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 07 - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 08 - - - 00 00 00 00 00 00 00 B9 - 6A 61 76 61 2F 75 74 69 6C 2F 4D 61 70 - 70 75 74 - 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B - 01 - - - 00 00 00 00 00 00 00 57 - - 32 64 65 35 33 39 61 35 2D 36 61 66 33 2D 34 39 63 32 2D 39 64 31 32 2D 37 61 30 36 39 34 36 30 39 34 39 37 - - 00 00 00 00 00 00 00 84 - 00 00 00 00 00 00 00 04 - 00 00 00 00 00 00 00 01 - - 36 35 37 65 33 38 39 62 2D 36 62 30 34 2D 34 32 61 34 2D 38 66 39 33 2D 63 63 39 33 39 61 30 32 35 31 66 64 - - 00 00 00 00 00 00 00 A7 - 38 62 33 64 64 30 62 63 2D 38 64 66 34 2D 34 66 66 37 2D 62 36 38 34 2D 64 66 39 62 39 36 64 39 63 33 35 34 - - 36 65 61 31 37 62 33 36 2D 64 38 33 36 2D 34 39 62 39 2D 38 37 39 30 2D 33 64 62 31 34 30 34 30 37 66 30 31 - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 03 - - - 00 00 00 00 00 00 00 15 - 00 00 00 00 00 00 00 04 - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 00 - - - 00 00 00 00 00 00 00 B4 - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 - 74 79 70 65 73 - 4C 6A 61 76 61 2F 75 74 69 6C 2F 4C 69 73 74 3B - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 05 - - - 00 00 00 00 00 00 00 B9 - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 4C 69 73 74 65 6E 65 72 - 6F 6E 43 6F 6D 70 6C 65 74 65 - 28 49 4C 6A 61 76 61 2F 75 74 69 6C 2F 4C 69 73 74 3B 4C 6A 61 76 61 2F 75 74 69 6C 2F 4D 61 70 3B 29 56 - 01 - - 37 36 64 33 36 35 66 35 2D 37 63 64 34 2D 34 31 62 39 2D 39 34 32 32 2D 31 39 32 35 63 35 32 34 35 64 34 39 - - 00 00 00 00 00 00 00 15 - 00 00 00 00 00 00 00 04 - - - 00 00 00 00 00 00 00 AC - - 35 31 31 30 66 38 38 65 2D 33 31 66 38 2D 34 35 34 61 2D 39 37 35 61 2D 32 62 33 31 30 36 66 64 38 39 30 63 - - - - - 33 39 37 32 34 61 65 63 2D 36 66 37 62 2D 34 35 61 37 2D 39 32 32 64 2D 39 36 61 38 61 35 38 63 39 65 34 31 - 39 31 38 61 30 63 63 63 2D 63 66 39 33 2D 34 35 64 33 2D 62 37 63 35 2D 35 61 37 63 38 33 64 37 65 35 36 66 - 37 61 34 37 37 66 39 32 2D 65 66 32 65 2D 34 30 65 66 2D 62 39 63 37 2D 61 62 35 38 61 32 66 32 35 64 30 32 - 6A 61 76 61 2F 6C 61 6E 67 2F 54 68 72 6F 77 61 62 6C 65 - - - - - 00 00 00 00 00 00 04 04 - 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 69 6E 73 74 72 75 6D 65 6E 74 2F 49 6E 73 74 72 75 6D 65 6E 74 61 74 69 6F 6E 3B 4C 6A 61 76 61 2F 75 74 69 6C 2F 4C 69 73 74 3B 29 56 - 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 69 6E 73 74 72 75 6D 65 6E 74 2F 49 6E 73 74 72 75 6D 65 6E 74 61 74 69 6F 6E 3B 4C 6A 61 76 61 2F 75 74 69 6C 2F 4C 69 73 74 3C 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3C 2A 3E 3B 3E 3B 29 56 - - 6A 61 76 61 2F 6C 61 6E 67 2F 69 6E 73 74 72 75 6D 65 6E 74 2F 55 6E 6D 6F 64 69 66 69 61 62 6C 65 43 6C 61 73 73 45 78 63 65 70 74 69 6F 6E - 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 4E 6F 74 46 6F 75 6E 64 45 78 63 65 70 74 69 6F 6E - - - 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 - - - - - - - - - - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 - 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 - 00 00 00 00 00 00 44 09 - - - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 - 43 6F 6C 6C 65 63 74 6F 72 - 00 00 00 00 00 00 04 0C - - - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 24 46 6F 72 52 65 74 72 61 6E 73 66 6F 72 6D 61 74 69 6F 6E - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 - 46 6F 72 52 65 74 72 61 6E 73 66 6F 72 6D 61 74 69 6F 6E - 00 00 00 00 00 00 00 0C - - - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 24 46 6F 72 52 65 64 65 66 69 6E 69 74 69 6F 6E - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 - 46 6F 72 52 65 64 65 66 69 6E 69 74 69 6F 6E - 00 00 00 00 00 00 00 0C - - - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 24 50 72 65 70 65 6E 64 61 62 6C 65 49 74 65 72 61 74 6F 72 - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 43 6F 6C 6C 65 63 74 6F 72 - 50 72 65 70 65 6E 64 61 62 6C 65 49 74 65 72 61 74 6F 72 - 00 00 00 00 00 00 00 0C - - - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 61 77 4D 61 74 63 68 65 72 - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 - 52 61 77 4D 61 74 63 68 65 72 - 00 00 00 00 00 00 06 09 - - - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 50 6F 6F 6C 53 74 72 61 74 65 67 79 - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 - 50 6F 6F 6C 53 74 72 61 74 65 67 79 - 00 00 00 00 00 00 06 09 - - - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 4C 6F 63 61 74 69 6F 6E 53 74 72 61 74 65 67 79 - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 - 4C 6F 63 61 74 69 6F 6E 53 74 72 61 74 65 67 79 - 00 00 00 00 00 00 06 09 - - - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 44 65 73 63 72 69 70 74 69 6F 6E 53 74 72 61 74 65 67 79 - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 - 44 65 73 63 72 69 70 74 69 6F 6E 53 74 72 61 74 65 67 79 - 00 00 00 00 00 00 06 09 - - - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 4C 69 73 74 65 6E 65 72 - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 - 4C 69 73 74 65 6E 65 72 - 00 00 00 00 00 00 06 09 - - - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 46 61 6C 6C 62 61 63 6B 53 74 72 61 74 65 67 79 - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 - 46 61 6C 6C 62 61 63 6B 53 74 72 61 74 65 67 79 - 00 00 00 00 00 00 06 09 - - - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 43 69 72 63 75 6C 61 72 69 74 79 4C 6F 63 6B - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 - 43 69 72 63 75 6C 61 72 69 74 79 4C 6F 63 6B - 00 00 00 00 00 00 06 09 - - - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 42 61 74 63 68 41 6C 6C 6F 63 61 74 6F 72 - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 - 42 61 74 63 68 41 6C 6C 6F 63 61 74 6F 72 - 00 00 00 00 00 00 06 09 - - - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 24 4C 69 73 74 65 6E 65 72 - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 61 67 65 6E 74 2F 62 75 69 6C 64 65 72 2F 41 67 65 6E 74 42 75 69 6C 64 65 72 24 52 65 64 65 66 69 6E 69 74 69 6F 6E 53 74 72 61 74 65 67 79 - 4C 69 73 74 65 6E 65 72 - 00 00 00 00 00 00 06 09 - - - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 64 65 73 63 72 69 70 74 69 6F 6E 2F 74 79 70 65 2F 54 79 70 65 44 65 73 63 72 69 70 74 69 6F 6E 24 46 6F 72 4C 6F 61 64 65 64 54 79 70 65 - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 64 65 73 63 72 69 70 74 69 6F 6E 2F 74 79 70 65 2F 54 79 70 65 44 65 73 63 72 69 70 74 69 6F 6E - 46 6F 72 4C 6F 61 64 65 64 54 79 70 65 - 00 00 00 00 00 00 00 09 - - - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 70 6F 6F 6C 2F 54 79 70 65 50 6F 6F 6C 24 52 65 73 6F 6C 75 74 69 6F 6E - 6E 65 74 2F 62 79 74 65 62 75 64 64 79 2F 70 6F 6F 6C 2F 54 79 70 65 50 6F 6F 6C - 52 65 73 6F 6C 75 74 69 6F 6E - 00 00 00 00 00 00 06 09 - - From ad7e5180e29470ee61d0a1868603095d5dc55217 Mon Sep 17 00:00:00 2001 From: volodya-lombrozo Date: Thu, 23 May 2024 14:46:43 +0300 Subject: [PATCH 14/41] feat(#229): speed up 'spring-fat' integraiton test by cleaning labels cache --- .gitignore | 2 +- .../java/org/eolang/opeo/compilation/JeoCompiler.java | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 53f7b73a..3acfadad 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ .idea target -target-failed +target-failed* !src/it/decompile-compile/target \ No newline at end of file diff --git a/src/main/java/org/eolang/opeo/compilation/JeoCompiler.java b/src/main/java/org/eolang/opeo/compilation/JeoCompiler.java index 88ebf946..60589494 100644 --- a/src/main/java/org/eolang/opeo/compilation/JeoCompiler.java +++ b/src/main/java/org/eolang/opeo/compilation/JeoCompiler.java @@ -24,6 +24,7 @@ package org.eolang.opeo.compilation; import com.jcabi.xml.XML; +import org.eolang.jeo.representation.xmir.AllLabels; import org.eolang.jeo.representation.xmir.XmlClass; import org.eolang.jeo.representation.xmir.XmlMethod; import org.eolang.jeo.representation.xmir.XmlNode; @@ -80,11 +81,14 @@ public XML compile() { @SuppressWarnings({"PMD.AvoidCatchingGenericException", "PMD.IdenticalCatchBranches"}) private static XmlMethod compile(final XmlMethod method) { try { + //todo! explain + new AllLabels().clearCache(); + //todo! explain return method // .withoutMaxs() .withInstructions( - new XmirParser(method.nodes()).toJeoNodes().toArray(XmlNode[]::new) - ); + new XmirParser(method.nodes()).toJeoNodes().toArray(XmlNode[]::new) + ); } catch (final ClassCastException exception) { throw new IllegalArgumentException( String.format( From 2e012eab1be2542545aada033660ca98030c0e52 Mon Sep 17 00:00:00 2001 From: volodya-lombrozo Date: Thu, 23 May 2024 15:37:40 +0300 Subject: [PATCH 15/41] feat(#229): move constructors --- src/main/java/org/eolang/opeo/ast/Super.java | 70 ++++++++++---------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/src/main/java/org/eolang/opeo/ast/Super.java b/src/main/java/org/eolang/opeo/ast/Super.java index 02ed323b..545a094d 100644 --- a/src/main/java/org/eolang/opeo/ast/Super.java +++ b/src/main/java/org/eolang/opeo/ast/Super.java @@ -57,21 +57,37 @@ public final class Super implements AstNode { /** * Constructor. - * @param instance Super instance + * @param instance Target instance * @param arguments Super arguments + * @param descriptor Descriptor + * @param type Type + * @param name Method Name + * @checkstyle ParameterNumberCheck (5 lines) */ - public Super(final AstNode instance, final AstNode... arguments) { - this(instance, Arrays.asList(arguments)); + public Super( + final AstNode instance, + final List arguments, + final String descriptor, + final String type, + final String name + ) { + this(instance, arguments, new Attributes().descriptor(descriptor).name(name).owner(type)); } /** * Constructor. - * @param instance Super instance - * @param descriptor Descriptor + * @param instance Target instance * @param arguments Super arguments + * @param attributes Attributes */ - public Super(final AstNode instance, final String descriptor, final AstNode... arguments) { - this(instance, Arrays.asList(arguments), descriptor); + public Super( + final AstNode instance, + final List arguments, + final Attributes attributes + ) { + this.instance = instance; + this.arguments = arguments; + this.attributes = attributes; } /** @@ -79,22 +95,18 @@ public Super(final AstNode instance, final String descriptor, final AstNode... a * @param instance Super instance * @param arguments Super arguments */ - public Super(final AstNode instance, final List arguments) { - this(instance, arguments, "()V"); + Super(final AstNode instance, final AstNode... arguments) { + this(instance, Arrays.asList(arguments)); } /** * Constructor. - * @param instance Target instance - * @param arguments Super arguments + * @param instance Super instance * @param descriptor Descriptor + * @param arguments Super arguments */ - public Super( - final AstNode instance, - final List arguments, - final String descriptor - ) { - this(instance, arguments, descriptor, "java/lang/Object", ""); + Super(final AstNode instance, final String descriptor, final AstNode... arguments) { + this(instance, Arrays.asList(arguments), descriptor); } /** @@ -102,34 +114,22 @@ public Super( * @param instance Target instance * @param arguments Super arguments * @param descriptor Descriptor - * @param type Type - * @param name Method Name - * @checkstyle ParameterNumberCheck (5 lines) */ - public Super( + private Super( final AstNode instance, final List arguments, - final String descriptor, - final String type, - final String name + final String descriptor ) { - this(instance, arguments, new Attributes().descriptor(descriptor).name(name).owner(type)); + this(instance, arguments, descriptor, "java/lang/Object", ""); } /** * Constructor. - * @param instance Target instance + * @param instance Super instance * @param arguments Super arguments - * @param attributes Attributes */ - public Super( - final AstNode instance, - final List arguments, - final Attributes attributes - ) { - this.instance = instance; - this.arguments = arguments; - this.attributes = attributes; + private Super(final AstNode instance, final List arguments) { + this(instance, arguments, "()V"); } @Override From acb8d991b4896a6d9662e10cd9880b7d19be7fba Mon Sep 17 00:00:00 2001 From: volodya-lombrozo Date: Thu, 23 May 2024 16:09:32 +0300 Subject: [PATCH 16/41] feat(#229): correctly define 'this' type --- .../org/eolang/opeo/SelectiveDecompiler.java | 1 + .../opeo/decompilation/LocalVariables.java | 27 ++++++++++++++++- .../org/eolang/opeo/jeo/JeoDecompiler.java | 29 +++++++++++++++---- .../decompilation/LocalVariablesTest.java | 5 ++-- 4 files changed, 54 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/eolang/opeo/SelectiveDecompiler.java b/src/main/java/org/eolang/opeo/SelectiveDecompiler.java index 0dcce98b..c1723b61 100644 --- a/src/main/java/org/eolang/opeo/SelectiveDecompiler.java +++ b/src/main/java/org/eolang/opeo/SelectiveDecompiler.java @@ -139,6 +139,7 @@ public void decompile() { final XmirEntry res; final List found = entry.xpath(this.xpath()); if (found.isEmpty()) { + entry.relative(); res = entry.transform(xml -> new JeoDecompiler(xml).decompile()); this.modified.save(res); } else { diff --git a/src/main/java/org/eolang/opeo/decompilation/LocalVariables.java b/src/main/java/org/eolang/opeo/decompilation/LocalVariables.java index 3c1d3c6c..8455229d 100644 --- a/src/main/java/org/eolang/opeo/decompilation/LocalVariables.java +++ b/src/main/java/org/eolang/opeo/decompilation/LocalVariables.java @@ -54,6 +54,22 @@ public final class LocalVariables { */ private final Map cache; + /** + * Class type. + * todo! explain + */ + private final Type clazz; + + /** + * Constructor. + * @param modifiers Method access modifiers. + * @param descriptor Method descriptor. + */ + public LocalVariables(final int modifiers, final String descriptor, final String name) { + this(modifiers, Type.getArgumentTypes(descriptor), Type.getType(name)); + } + + /** * Constructor. * @param modifiers Method access modifiers. @@ -76,9 +92,18 @@ public LocalVariables(final int modifiers, final String descriptor) { * @param types Method argument types. */ private LocalVariables(final int modifiers, final Type... types) { + this(modifiers, types, Type.getType(Object.class)); + } + + public LocalVariables( + final int modifiers, + final Type[] types, + final Type clazz + ) { this.modifiers = modifiers; this.types = Arrays.copyOf(types, types.length); this.cache = new HashMap<>(0); + this.clazz = clazz; } /** @@ -116,7 +141,7 @@ private AstNode store(final int index, final Type fallback) { final Type type = this.argumentType(index).orElse(fallback); final AstNode result; if (index == 0 && this.isInstanceMethod()) { - result = new This(type); + result = new This(this.clazz); } else { result = new LocalVariable(index, type); } diff --git a/src/main/java/org/eolang/opeo/jeo/JeoDecompiler.java b/src/main/java/org/eolang/opeo/jeo/JeoDecompiler.java index fdbde55d..c593620c 100644 --- a/src/main/java/org/eolang/opeo/jeo/JeoDecompiler.java +++ b/src/main/java/org/eolang/opeo/jeo/JeoDecompiler.java @@ -27,11 +27,14 @@ import com.jcabi.xml.XMLDocument; import java.util.Map; import java.util.stream.Collectors; +import org.eolang.jeo.representation.ClassName; +import org.eolang.jeo.representation.xmir.XmlClass; import org.eolang.jeo.representation.xmir.XmlMethod; import org.eolang.jeo.representation.xmir.XmlNode; import org.eolang.jeo.representation.xmir.XmlProgram; import org.eolang.opeo.decompilation.DecompilerMachine; import org.eolang.opeo.decompilation.LocalVariables; +import org.objectweb.asm.Type; import org.w3c.dom.Node; import org.xembly.Transformers; import org.xembly.Xembler; @@ -48,15 +51,28 @@ public final class JeoDecompiler { */ private final XML prog; + private final String pckg; + /** * Constructor. * * @param prog Program in XMIR format received from jeo maven plugin. */ public JeoDecompiler(final XML prog) { + this(prog, ""); + } + + /** + * Constructor. + * + * @param prog Program in XMIR format received from jeo maven plugin. + */ + public JeoDecompiler(final XML prog, final String pckg) { this.prog = prog; + this.pckg = pckg; } + /** * Decompile program. * @@ -64,9 +80,12 @@ public JeoDecompiler(final XML prog) { */ public XML decompile() { final Node node = this.prog.node(); - new XmlProgram(node).top() - .methods() - .forEach(this::decompile); + final XmlClass top = new XmlProgram(node).top(); + final String clazz = top.name().substring(2); + final String clazz1 = this.pckg + clazz; + final String descriptor = Type.getObjectType(clazz1).getDescriptor(); + top.methods() + .forEach(method -> this.decompile(method, descriptor)); return new XMLDocument(node); } @@ -75,14 +94,14 @@ public XML decompile() { * * @param method Method. */ - private void decompile(final XmlMethod method) { + private void decompile(final XmlMethod method, final String clazz) { try { if (!method.instructions().isEmpty()) { method.withInstructions( new XmlNode( new Xembler( new DecompilerMachine( - new LocalVariables(method.access(), method.descriptor()), + new LocalVariables(method.access(), method.descriptor(), clazz), Map.of("counting", "false") ).decompile(new JeoInstructions(method).instructions()), new Transformers.Node() diff --git a/src/test/java/org/eolang/opeo/decompilation/LocalVariablesTest.java b/src/test/java/org/eolang/opeo/decompilation/LocalVariablesTest.java index b795d57d..b362ca4b 100644 --- a/src/test/java/org/eolang/opeo/decompilation/LocalVariablesTest.java +++ b/src/test/java/org/eolang/opeo/decompilation/LocalVariablesTest.java @@ -53,10 +53,11 @@ void returnsVariable() { @Test void returnsThisForInstanceMethod() { final int index = 0; - final Type type = Type.getType("Lorg/eolang/benchmark/A;"); + final String name = "Lorg/eolang/benchmark/A;"; + final Type type = Type.getType(name); MatcherAssert.assertThat( "Since it is local variables in an instance method, the first variable is always `this`", - new LocalVariables(Opcodes.ACC_PUBLIC, "()V").variable(index, type), + new LocalVariables(Opcodes.ACC_PUBLIC, "()V", name).variable(index, type), Matchers.equalTo(new This(type)) ); } From 049ea0c7426843573165322273ea9210693c6b5d Mon Sep 17 00:00:00 2001 From: volodya-lombrozo Date: Thu, 23 May 2024 17:50:43 +0300 Subject: [PATCH 17/41] feat(#229): identify the problem related to incorrect 'this' type --- .gitignore | 1 + .../org/eolang/opeo/SelectiveDecompiler.java | 4 +- .../opeo/decompilation/NaiveDecompiler.java | 4 +- .../org/eolang/opeo/jeo/JeoDecompiler.java | 5 +- .../eolang/opeo/jeo/JeoInstructionsTest.java | 1 + ...ientDependsOnBeanFactoryPostProcessor.xmir | 92 +++++++++++++++++++ 6 files changed, 102 insertions(+), 5 deletions(-) create mode 100644 src/test/resources/xmir/disassembled/MongoClientDependsOnBeanFactoryPostProcessor.xmir diff --git a/.gitignore b/.gitignore index 3acfadad..8807544a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .idea target target-failed* +target-standard* !src/it/decompile-compile/target \ No newline at end of file diff --git a/src/main/java/org/eolang/opeo/SelectiveDecompiler.java b/src/main/java/org/eolang/opeo/SelectiveDecompiler.java index c1723b61..8b666073 100644 --- a/src/main/java/org/eolang/opeo/SelectiveDecompiler.java +++ b/src/main/java/org/eolang/opeo/SelectiveDecompiler.java @@ -140,7 +140,9 @@ public void decompile() { final List found = entry.xpath(this.xpath()); if (found.isEmpty()) { entry.relative(); - res = entry.transform(xml -> new JeoDecompiler(xml).decompile()); + res = entry.transform( + xml -> new JeoDecompiler(xml, entry.relative()).decompile() + ); this.modified.save(res); } else { Logger.info( diff --git a/src/main/java/org/eolang/opeo/decompilation/NaiveDecompiler.java b/src/main/java/org/eolang/opeo/decompilation/NaiveDecompiler.java index 6e62da61..6711f3e3 100644 --- a/src/main/java/org/eolang/opeo/decompilation/NaiveDecompiler.java +++ b/src/main/java/org/eolang/opeo/decompilation/NaiveDecompiler.java @@ -92,7 +92,9 @@ public void decompile() { * @return Number of decompiled EO sources. */ private int decompile(final XmirEntry entry) { - this.storage.save(entry.transform(xml -> new JeoDecompiler(xml).decompile())); + this.storage.save( + entry.transform(xml -> new JeoDecompiler(xml, entry.relative()).decompile()) + ); return 1; } diff --git a/src/main/java/org/eolang/opeo/jeo/JeoDecompiler.java b/src/main/java/org/eolang/opeo/jeo/JeoDecompiler.java index c593620c..dada04dd 100644 --- a/src/main/java/org/eolang/opeo/jeo/JeoDecompiler.java +++ b/src/main/java/org/eolang/opeo/jeo/JeoDecompiler.java @@ -59,7 +59,7 @@ public final class JeoDecompiler { * @param prog Program in XMIR format received from jeo maven plugin. */ public JeoDecompiler(final XML prog) { - this(prog, ""); + this(prog, "java.lang.Object"); } /** @@ -81,8 +81,7 @@ public JeoDecompiler(final XML prog, final String pckg) { public XML decompile() { final Node node = this.prog.node(); final XmlClass top = new XmlProgram(node).top(); - final String clazz = top.name().substring(2); - final String clazz1 = this.pckg + clazz; + final String clazz1 = this.pckg.replace(".xmir", "").replace(".", "/"); final String descriptor = Type.getObjectType(clazz1).getDescriptor(); top.methods() .forEach(method -> this.decompile(method, descriptor)); diff --git a/src/test/java/org/eolang/opeo/jeo/JeoInstructionsTest.java b/src/test/java/org/eolang/opeo/jeo/JeoInstructionsTest.java index e0d4aed9..4d113a38 100644 --- a/src/test/java/org/eolang/opeo/jeo/JeoInstructionsTest.java +++ b/src/test/java/org/eolang/opeo/jeo/JeoInstructionsTest.java @@ -30,6 +30,7 @@ import org.hamcrest.Matchers; import org.junit.jupiter.api.Test; import org.objectweb.asm.Opcodes; +import org.objectweb.asm.Type; /** * Test case for {@link JeoInstructions}. diff --git a/src/test/resources/xmir/disassembled/MongoClientDependsOnBeanFactoryPostProcessor.xmir b/src/test/resources/xmir/disassembled/MongoClientDependsOnBeanFactoryPostProcessor.xmir new file mode 100644 index 00000000..0cadcc39 --- /dev/null +++ b/src/test/resources/xmir/disassembled/MongoClientDependsOnBeanFactoryPostProcessor.xmir @@ -0,0 +1,92 @@ + + + yv66vgAAADQAIAcAGgcAGwoABQAcBwAdBwAeAQAGPGluaXQ+AQAVKFtMamF2YS9sYW5nL0NsYXNzOylWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBAGBMb3JnL3NwcmluZ2ZyYW1ld29yay9ib290L2F1dG9jb25maWd1cmUvZGF0YS9tb25nby9Nb25nb0NsaWVudERlcGVuZHNPbkJlYW5GYWN0b3J5UG9zdFByb2Nlc3NvcjsBAAlkZXBlbmRzT24BABJbTGphdmEvbGFuZy9DbGFzczsBABZMb2NhbFZhcmlhYmxlVHlwZVRhYmxlAQAVW0xqYXZhL2xhbmcvQ2xhc3M8Kj47AQAQTWV0aG9kUGFyYW1ldGVycwEACVNpZ25hdHVyZQEAGChbTGphdmEvbGFuZy9DbGFzczwqPjspVgEAClNvdXJjZUZpbGUBADFNb25nb0NsaWVudERlcGVuZHNPbkJlYW5GYWN0b3J5UG9zdFByb2Nlc3Nvci5qYXZhAQAZUnVudGltZVZpc2libGVBbm5vdGF0aW9ucwEAK0xvcmcvc3ByaW5nZnJhbWV3b3JrL2NvcmUvYW5ub3RhdGlvbi9PcmRlcjsBAAV2YWx1ZQN/////AQAeY29tL21vbmdvZGIvY2xpZW50L01vbmdvQ2xpZW50AQA8b3JnL3NwcmluZ2ZyYW1ld29yay9kYXRhL21vbmdvZGIvY29yZS9Nb25nb0NsaWVudEZhY3RvcnlCZWFuDAAGAB8BAF5vcmcvc3ByaW5nZnJhbWV3b3JrL2Jvb3QvYXV0b2NvbmZpZ3VyZS9kYXRhL21vbmdvL01vbmdvQ2xpZW50RGVwZW5kc09uQmVhbkZhY3RvcnlQb3N0UHJvY2Vzc29yAQBQb3JnL3NwcmluZ2ZyYW1ld29yay9ib290L2F1dG9jb25maWd1cmUvQWJzdHJhY3REZXBlbmRzT25CZWFuRmFjdG9yeVBvc3RQcm9jZXNzb3IBADcoTGphdmEvbGFuZy9DbGFzcztMamF2YS9sYW5nL0NsYXNzO1tMamF2YS9sYW5nL0NsYXNzOylWACEABAAFAAAAAAABAIEABgAHAAMACAAAAFQABAACAAAACioSARICK7cAA7EAAAADAAkAAAAKAAIAAAAtAAkALgAKAAAAFgACAAAACgALAAwAAAAAAAoADQAOAAEADwAAAAwAAQAAAAoADQAQAAEAEQAAAAUBAA0AAAASAAAAAgATAAIAFAAAAAIAFQAWAAAACwABABcAAQAYSQAZ + + + + + + package + org.springframework.boot.autoconfigure.data.mongo + org.springframework.boot.autoconfigure.data.mongo + + + alias + org.eolang.jeo.opcode + org.eolang.jeo.opcode + + + alias + org.eolang.jeo.label + org.eolang.jeo.label + + + + + 00 00 00 00 00 00 00 34 + 00 00 00 00 00 00 00 21 + 6F 72 67 2F 73 70 72 69 6E 67 66 72 61 6D 65 77 6F 72 6B 2F 62 6F 6F 74 2F 61 75 74 6F 63 6F 6E 66 69 67 75 72 65 2F 41 62 73 74 72 61 63 74 44 65 70 65 6E 64 73 4F 6E 42 65 61 6E 46 61 63 74 6F 72 79 50 6F 73 74 50 72 6F 63 65 73 73 6F 72 + + + 00 00 00 00 00 00 00 81 + 28 5B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3B 29 56 + 28 5B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3C 2A 3E 3B 29 56 + + + 00 00 00 00 00 00 00 04 + 00 00 00 00 00 00 00 02 + + + + + 64 63 35 37 31 31 32 37 2D 31 36 61 64 2D 34 38 35 38 2D 39 65 38 63 2D 61 34 32 65 33 34 37 64 35 38 38 65 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 12 + 4C 63 6F 6D 2F 6D 6F 6E 67 6F 64 62 2F 63 6C 69 65 6E 74 2F 4D 6F 6E 67 6F 43 6C 69 65 6E 74 3B + + + 00 00 00 00 00 00 00 12 + 4C 6F 72 67 2F 73 70 72 69 6E 67 66 72 61 6D 65 77 6F 72 6B 2F 64 61 74 61 2F 6D 6F 6E 67 6F 64 62 2F 63 6F 72 65 2F 4D 6F 6E 67 6F 43 6C 69 65 6E 74 46 61 63 74 6F 72 79 42 65 61 6E 3B + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 01 + + + 00 00 00 00 00 00 00 B7 + 6F 72 67 2F 73 70 72 69 6E 67 66 72 61 6D 65 77 6F 72 6B 2F 62 6F 6F 74 2F 61 75 74 6F 63 6F 6E 66 69 67 75 72 65 2F 41 62 73 74 72 61 63 74 44 65 70 65 6E 64 73 4F 6E 42 65 61 6E 46 61 63 74 6F 72 79 50 6F 73 74 50 72 6F 63 65 73 73 6F 72 + 3C 69 6E 69 74 3E + 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3B 5B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3B 29 56 + 00 + + 38 39 64 32 65 35 66 63 2D 34 61 63 38 2D 34 63 39 63 2D 38 38 36 37 2D 34 33 63 31 65 62 61 61 62 31 66 65 + + 00 00 00 00 00 00 00 B1 + + 65 31 37 61 37 31 39 64 2D 63 65 36 35 2D 34 31 35 65 2D 39 35 32 66 2D 35 31 64 33 38 32 65 33 34 65 39 30 + + + + + + 4C 6F 72 67 2F 73 70 72 69 6E 67 66 72 61 6D 65 77 6F 72 6B 2F 63 6F 72 65 2F 61 6E 6E 6F 74 61 74 69 6F 6E 2F 4F 72 64 65 72 3B + 01 + + 50 4C 41 49 4E + 76 61 6C 75 65 + 00 00 00 00 7F FF FF FF + + + + + + From aec393cbb8f3e5e6f17bd0406ea86b8c5bd59382 Mon Sep 17 00:00:00 2001 From: volodya-lombrozo Date: Fri, 24 May 2024 11:53:51 +0300 Subject: [PATCH 18/41] feat(#229): do not add extra parameter to the INVOKEDYNAMIC --- .../org/eolang/opeo/SelectiveDecompiler.java | 15 ++- src/main/java/org/eolang/opeo/ast/Opcode.java | 22 ++--- .../opeo/compilation/DefaultCompiler.java | 45 ++++++++- .../opeo/compilation/DefaultCompilerTest.java | 3 + .../opeo/compilation/XmirParserTest.java | 37 ++++++++ .../decompilation/DecompilerMachineTest.java | 1 + .../decompilation/NaiveDecompilerTest.java | 2 + ...ientDependsOnBeanFactoryPostProcessor.xmir | 92 ------------------- 8 files changed, 112 insertions(+), 105 deletions(-) delete mode 100644 src/test/resources/xmir/disassembled/MongoClientDependsOnBeanFactoryPostProcessor.xmir diff --git a/src/main/java/org/eolang/opeo/SelectiveDecompiler.java b/src/main/java/org/eolang/opeo/SelectiveDecompiler.java index 8b666073..64f57155 100644 --- a/src/main/java/org/eolang/opeo/SelectiveDecompiler.java +++ b/src/main/java/org/eolang/opeo/SelectiveDecompiler.java @@ -28,6 +28,7 @@ import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; +import java.util.stream.Stream; import org.eolang.opeo.decompilation.Decompiler; import org.eolang.opeo.decompilation.handlers.RouterHandler; import org.eolang.opeo.jeo.JeoDecompiler; @@ -139,7 +140,6 @@ public void decompile() { final XmirEntry res; final List found = entry.xpath(this.xpath()); if (found.isEmpty()) { - entry.relative(); res = entry.transform( xml -> new JeoDecompiler(xml, entry.relative()).decompile() ); @@ -158,6 +158,19 @@ public void decompile() { ); } + private boolean excluded(final String relative) { + return Stream.of( + "ch", "com", "javax", "net", + + "aopalliance", "apiguardian", "assertj", "eolang", "hamcrest", "json", "junit", + "mockito", "objectweb", "objenesis", "opentest4j", "slf4j", "xmlunit" + + , "springframework" + + , "yaml" + ).anyMatch(relative::contains); + } + /** * Xpath to find all opcodes that are not supported. * @return Xpath. diff --git a/src/main/java/org/eolang/opeo/ast/Opcode.java b/src/main/java/org/eolang/opeo/ast/Opcode.java index 6c02d3e7..b3ee6aaf 100644 --- a/src/main/java/org/eolang/opeo/ast/Opcode.java +++ b/src/main/java/org/eolang/opeo/ast/Opcode.java @@ -113,17 +113,17 @@ public Iterable toXmir() { @Override public List opcodes() { - switch (this.bytecode) { - case Opcodes.INVOKEVIRTUAL: - case Opcodes.INVOKEDYNAMIC: - case Opcodes.INVOKEINTERFACE: - case Opcodes.INVOKESPECIAL: - case Opcodes.INVOKESTATIC: - this.appendInterfaced(); - break; - default: - break; - } +// switch (this.bytecode) { +// case Opcodes.INVOKEVIRTUAL: +// case Opcodes.INVOKEDYNAMIC: +// case Opcodes.INVOKEINTERFACE: +// case Opcodes.INVOKESPECIAL: +// case Opcodes.INVOKESTATIC: +// this.appendInterfaced(); +// break; +// default: +// break; +// } return List.of(this); } diff --git a/src/main/java/org/eolang/opeo/compilation/DefaultCompiler.java b/src/main/java/org/eolang/opeo/compilation/DefaultCompiler.java index 63a07bfa..5d603195 100644 --- a/src/main/java/org/eolang/opeo/compilation/DefaultCompiler.java +++ b/src/main/java/org/eolang/opeo/compilation/DefaultCompiler.java @@ -25,6 +25,7 @@ import com.jcabi.log.Logger; import java.nio.file.Path; +import java.util.stream.Stream; import org.eolang.opeo.storage.CompilationStorage; import org.eolang.opeo.storage.Storage; import org.eolang.opeo.storage.XmirEntry; @@ -85,8 +86,50 @@ public void compile() { * @return Number of compiled files. */ private int compile(final XmirEntry xmir) { - this.storage.save(xmir.transform(xml -> new JeoCompiler(xml).compile())); +// if (!this.excluded(xmir.relative())) { +// Logger.info(this, "COMPILER CANDIDATE %s", xmir.relative()); + this.storage.save(xmir.transform(xml -> new JeoCompiler(xml).compile())); +// } else { +// this.storage.save(xmir); +// } return 1; } + + private boolean excluded(final String relative) { + return Stream.of( + +// NOT HERE + "javax", +// "javax/servlet", +// "javax/activation", +// "javax/activation", +// "javax/el", +// "javax/security", +// "javax/websocket", +// "javax/xml", + + "ch", + "com", + +//PROBLEM HERE? +// "net/minidev", +// "net/bytebuddy", + + +// Hm excluding them didn't give any results + "aopalliance", "apiguardian", "assertj", "eolang", "hamcrest", "json", +// "junit", + "mockito", "objectweb", "objenesis", "opentest4j", "slf4j", "xmlunit" +// + , + +// Seems that Problem not with spring + "springframework" +// +// WORKS FINE + , "yaml", "net" + ).anyMatch(relative::contains); + } + } diff --git a/src/test/java/org/eolang/opeo/compilation/DefaultCompilerTest.java b/src/test/java/org/eolang/opeo/compilation/DefaultCompilerTest.java index d78cbc96..f2675f3b 100644 --- a/src/test/java/org/eolang/opeo/compilation/DefaultCompilerTest.java +++ b/src/test/java/org/eolang/opeo/compilation/DefaultCompilerTest.java @@ -23,9 +23,12 @@ */ package org.eolang.opeo.compilation; +import com.jcabi.xml.XMLDocument; import java.io.File; +import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.util.List; import org.cactoos.bytes.BytesOf; import org.cactoos.io.ResourceOf; import org.eolang.opeo.ast.Opcode; diff --git a/src/test/java/org/eolang/opeo/compilation/XmirParserTest.java b/src/test/java/org/eolang/opeo/compilation/XmirParserTest.java index bc485f14..8943bcdc 100644 --- a/src/test/java/org/eolang/opeo/compilation/XmirParserTest.java +++ b/src/test/java/org/eolang/opeo/compilation/XmirParserTest.java @@ -23,6 +23,7 @@ */ package org.eolang.opeo.compilation; +import java.util.Collections; import java.util.List; import org.eolang.jeo.representation.xmir.XmlNode; import org.eolang.opeo.ast.Add; @@ -141,4 +142,40 @@ void convertsFieldAssignment() { ) ); } + + @Test + void parsesInvokeDynamicInstruction() { + Opcode.disableCounting(); + final XmlNode node = new XmlNode( + String.join("\n", + "", + " 00 00 00 00 00 00 00 BA", + " 61 70 70 6C 79 41 73 49 6E 74", + " 28 29 4C 6A 61 76 61 2F 75 74 69 6C 2F 66 75 6E 63 74 69 6F 6E 2F 54 6F 49 6E 74 46 75 6E 63 74 69 6F 6E 3B", + " ", + " 00 00 00 00 00 00 00 06", + " 6A 61 76 61 2F 6C 61 6E 67 2F 69 6E 76 6F 6B 65 2F 4C 61 6D 62 64 61 4D 65 74 61 66 61 63 74 6F 72 79", + " 6D 65 74 61 66 61 63 74 6F 72 79", + " 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 69 6E 76 6F 6B 65 2F 4D 65 74 68 6F 64 48 61 6E 64 6C 65 73 24 4C 6F 6F 6B 75 70 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 69 6E 76 6F 6B 65 2F 4D 65 74 68 6F 64 54 79 70 65 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 69 6E 76 6F 6B 65 2F 4D 65 74 68 6F 64 54 79 70 65 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 69 6E 76 6F 6B 65 2F 4D 65 74 68 6F 64 48 61 6E 64 6C 65 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 69 6E 76 6F 6B 65 2F 4D 65 74 68 6F 64 54 79 70 65 3B 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 69 6E 76 6F 6B 65 2F 43 61 6C 6C 53 69 74 65 3B", + " 00", + " ", + " 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 29 49", + " ", + " 00 00 00 00 00 00 00 06", + " 6F 72 67 2F 6A 75 6E 69 74 2F 6A 75 70 69 74 65 72 2F 61 70 69 2F 43 6C 61 73 73 4F 72 64 65 72 65 72 24 4F 72 64 65 72 41 6E 6E 6F 74 61 74 69 6F 6E", + " 67 65 74 4F 72 64 65 72", + " 28 4C 6F 72 67 2F 6A 75 6E 69 74 2F 6A 75 70 69 74 65 72 2F 61 70 69 2F 43 6C 61 73 73 44 65 73 63 72 69 70 74 6F 72 3B 29 49", + " 00", + " ", + " 28 4C 6F 72 67 2F 6A 75 6E 69 74 2F 6A 75 70 69 74 65 72 2F 61 70 69 2F 43 6C 61 73 73 44 65 73 63 72 69 70 74 6F 72 3B 29 49", + " " + ) + ); + final List nodes = new XmirParser(Collections.singletonList(node)).toJeoNodes(); + MatcherAssert.assertThat( + "We expect to retrieve exactly 1 opcode INVOKEDYNAMIC (without changes), but got something else instead", + nodes.get(0), + Matchers.equalTo(node) + ); + } } diff --git a/src/test/java/org/eolang/opeo/decompilation/DecompilerMachineTest.java b/src/test/java/org/eolang/opeo/decompilation/DecompilerMachineTest.java index 9cdd6123..4c3af2fe 100644 --- a/src/test/java/org/eolang/opeo/decompilation/DecompilerMachineTest.java +++ b/src/test/java/org/eolang/opeo/decompilation/DecompilerMachineTest.java @@ -485,5 +485,6 @@ public void describeMismatchSafely( ) { mismatch.appendText("was ").appendValue(this.actual.get()); } + } } diff --git a/src/test/java/org/eolang/opeo/decompilation/NaiveDecompilerTest.java b/src/test/java/org/eolang/opeo/decompilation/NaiveDecompilerTest.java index 9b03f6bd..631ab36d 100644 --- a/src/test/java/org/eolang/opeo/decompilation/NaiveDecompilerTest.java +++ b/src/test/java/org/eolang/opeo/decompilation/NaiveDecompilerTest.java @@ -23,6 +23,8 @@ */ package org.eolang.opeo.decompilation; +import com.jcabi.xml.XMLDocument; +import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; diff --git a/src/test/resources/xmir/disassembled/MongoClientDependsOnBeanFactoryPostProcessor.xmir b/src/test/resources/xmir/disassembled/MongoClientDependsOnBeanFactoryPostProcessor.xmir deleted file mode 100644 index 0cadcc39..00000000 --- a/src/test/resources/xmir/disassembled/MongoClientDependsOnBeanFactoryPostProcessor.xmir +++ /dev/null @@ -1,92 +0,0 @@ - - - yv66vgAAADQAIAcAGgcAGwoABQAcBwAdBwAeAQAGPGluaXQ+AQAVKFtMamF2YS9sYW5nL0NsYXNzOylWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBAGBMb3JnL3NwcmluZ2ZyYW1ld29yay9ib290L2F1dG9jb25maWd1cmUvZGF0YS9tb25nby9Nb25nb0NsaWVudERlcGVuZHNPbkJlYW5GYWN0b3J5UG9zdFByb2Nlc3NvcjsBAAlkZXBlbmRzT24BABJbTGphdmEvbGFuZy9DbGFzczsBABZMb2NhbFZhcmlhYmxlVHlwZVRhYmxlAQAVW0xqYXZhL2xhbmcvQ2xhc3M8Kj47AQAQTWV0aG9kUGFyYW1ldGVycwEACVNpZ25hdHVyZQEAGChbTGphdmEvbGFuZy9DbGFzczwqPjspVgEAClNvdXJjZUZpbGUBADFNb25nb0NsaWVudERlcGVuZHNPbkJlYW5GYWN0b3J5UG9zdFByb2Nlc3Nvci5qYXZhAQAZUnVudGltZVZpc2libGVBbm5vdGF0aW9ucwEAK0xvcmcvc3ByaW5nZnJhbWV3b3JrL2NvcmUvYW5ub3RhdGlvbi9PcmRlcjsBAAV2YWx1ZQN/////AQAeY29tL21vbmdvZGIvY2xpZW50L01vbmdvQ2xpZW50AQA8b3JnL3NwcmluZ2ZyYW1ld29yay9kYXRhL21vbmdvZGIvY29yZS9Nb25nb0NsaWVudEZhY3RvcnlCZWFuDAAGAB8BAF5vcmcvc3ByaW5nZnJhbWV3b3JrL2Jvb3QvYXV0b2NvbmZpZ3VyZS9kYXRhL21vbmdvL01vbmdvQ2xpZW50RGVwZW5kc09uQmVhbkZhY3RvcnlQb3N0UHJvY2Vzc29yAQBQb3JnL3NwcmluZ2ZyYW1ld29yay9ib290L2F1dG9jb25maWd1cmUvQWJzdHJhY3REZXBlbmRzT25CZWFuRmFjdG9yeVBvc3RQcm9jZXNzb3IBADcoTGphdmEvbGFuZy9DbGFzcztMamF2YS9sYW5nL0NsYXNzO1tMamF2YS9sYW5nL0NsYXNzOylWACEABAAFAAAAAAABAIEABgAHAAMACAAAAFQABAACAAAACioSARICK7cAA7EAAAADAAkAAAAKAAIAAAAtAAkALgAKAAAAFgACAAAACgALAAwAAAAAAAoADQAOAAEADwAAAAwAAQAAAAoADQAQAAEAEQAAAAUBAA0AAAASAAAAAgATAAIAFAAAAAIAFQAWAAAACwABABcAAQAYSQAZ - - - - - - package - org.springframework.boot.autoconfigure.data.mongo - org.springframework.boot.autoconfigure.data.mongo - - - alias - org.eolang.jeo.opcode - org.eolang.jeo.opcode - - - alias - org.eolang.jeo.label - org.eolang.jeo.label - - - - - 00 00 00 00 00 00 00 34 - 00 00 00 00 00 00 00 21 - 6F 72 67 2F 73 70 72 69 6E 67 66 72 61 6D 65 77 6F 72 6B 2F 62 6F 6F 74 2F 61 75 74 6F 63 6F 6E 66 69 67 75 72 65 2F 41 62 73 74 72 61 63 74 44 65 70 65 6E 64 73 4F 6E 42 65 61 6E 46 61 63 74 6F 72 79 50 6F 73 74 50 72 6F 63 65 73 73 6F 72 - - - 00 00 00 00 00 00 00 81 - 28 5B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3B 29 56 - 28 5B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3C 2A 3E 3B 29 56 - - - 00 00 00 00 00 00 00 04 - 00 00 00 00 00 00 00 02 - - - - - 64 63 35 37 31 31 32 37 2D 31 36 61 64 2D 34 38 35 38 2D 39 65 38 63 2D 61 34 32 65 33 34 37 64 35 38 38 65 - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 00 - - - 00 00 00 00 00 00 00 12 - 4C 63 6F 6D 2F 6D 6F 6E 67 6F 64 62 2F 63 6C 69 65 6E 74 2F 4D 6F 6E 67 6F 43 6C 69 65 6E 74 3B - - - 00 00 00 00 00 00 00 12 - 4C 6F 72 67 2F 73 70 72 69 6E 67 66 72 61 6D 65 77 6F 72 6B 2F 64 61 74 61 2F 6D 6F 6E 67 6F 64 62 2F 63 6F 72 65 2F 4D 6F 6E 67 6F 43 6C 69 65 6E 74 46 61 63 74 6F 72 79 42 65 61 6E 3B - - - 00 00 00 00 00 00 00 19 - 00 00 00 00 00 00 00 01 - - - 00 00 00 00 00 00 00 B7 - 6F 72 67 2F 73 70 72 69 6E 67 66 72 61 6D 65 77 6F 72 6B 2F 62 6F 6F 74 2F 61 75 74 6F 63 6F 6E 66 69 67 75 72 65 2F 41 62 73 74 72 61 63 74 44 65 70 65 6E 64 73 4F 6E 42 65 61 6E 46 61 63 74 6F 72 79 50 6F 73 74 50 72 6F 63 65 73 73 6F 72 - 3C 69 6E 69 74 3E - 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3B 5B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3B 29 56 - 00 - - 38 39 64 32 65 35 66 63 2D 34 61 63 38 2D 34 63 39 63 2D 38 38 36 37 2D 34 33 63 31 65 62 61 61 62 31 66 65 - - 00 00 00 00 00 00 00 B1 - - 65 31 37 61 37 31 39 64 2D 63 65 36 35 2D 34 31 35 65 2D 39 35 32 66 2D 35 31 64 33 38 32 65 33 34 65 39 30 - - - - - - 4C 6F 72 67 2F 73 70 72 69 6E 67 66 72 61 6D 65 77 6F 72 6B 2F 63 6F 72 65 2F 61 6E 6E 6F 74 61 74 69 6F 6E 2F 4F 72 64 65 72 3B - 01 - - 50 4C 41 49 4E - 76 61 6C 75 65 - 00 00 00 00 7F FF FF FF - - - - - - From 2d50545c4ee1fb05cf7ecc3d62c399d51ced794a Mon Sep 17 00:00:00 2001 From: volodya-lombrozo Date: Fri, 24 May 2024 13:53:45 +0300 Subject: [PATCH 19/41] feat(#229): identify problem with pop instructions --- .../org/eolang/opeo/SelectiveDecompiler.java | 18 ++-- .../org/eolang/opeo/jeo/JeoInstructions.java | 9 ++ src/test/java/it/JeoAndOpeoTest.java | 41 +++++++ .../xmir/disassembled/AsIsEscapeUtil.xmir | 100 ++++++++++++++++++ 4 files changed, 162 insertions(+), 6 deletions(-) create mode 100644 src/test/resources/xmir/disassembled/AsIsEscapeUtil.xmir diff --git a/src/main/java/org/eolang/opeo/SelectiveDecompiler.java b/src/main/java/org/eolang/opeo/SelectiveDecompiler.java index 64f57155..2d165ad6 100644 --- a/src/main/java/org/eolang/opeo/SelectiveDecompiler.java +++ b/src/main/java/org/eolang/opeo/SelectiveDecompiler.java @@ -139,7 +139,7 @@ public void decompile() { entry -> { final XmirEntry res; final List found = entry.xpath(this.xpath()); - if (found.isEmpty()) { + if (found.isEmpty() && !this.excluded(entry.relative())) { res = entry.transform( xml -> new JeoDecompiler(xml, entry.relative()).decompile() ); @@ -160,14 +160,20 @@ public void decompile() { private boolean excluded(final String relative) { return Stream.of( - "ch", "com", "javax", "net", + // All commented packages were added to the build. Вот эти зависимостри были проверены - они не создают проблем + // "junit", - "aopalliance", "apiguardian", "assertj", "eolang", "hamcrest", "json", "junit", - "mockito", "objectweb", "objenesis", "opentest4j", "slf4j", "xmlunit" - , "springframework" + "ch", "com", "javax", - , "yaml" +// "net", + +// То что ниже исключено из билда, то что посередине, добавлено. +// Если билд фейлится, то одна из зависимостей выше инициировала падение + "aopalliance", "apiguardian", "assertj", "eolang", "hamcrest", "json", + "mockito", "objectweb", "objenesis", "opentest4j", "slf4j", "xmlunit", + + "springframework", "yaml" ).anyMatch(relative::contains); } diff --git a/src/main/java/org/eolang/opeo/jeo/JeoInstructions.java b/src/main/java/org/eolang/opeo/jeo/JeoInstructions.java index 3ccf9bd7..93777498 100644 --- a/src/main/java/org/eolang/opeo/jeo/JeoInstructions.java +++ b/src/main/java/org/eolang/opeo/jeo/JeoInstructions.java @@ -23,11 +23,13 @@ */ package org.eolang.opeo.jeo; +import java.util.Arrays; import org.eolang.jeo.representation.xmir.XmlBytecodeEntry; import org.eolang.jeo.representation.xmir.XmlInstruction; import org.eolang.jeo.representation.xmir.XmlLabel; import org.eolang.jeo.representation.xmir.XmlMethod; import org.eolang.opeo.Instruction; +import org.eolang.opeo.ast.OpcodeName; /** * Class that represents the instructions provided by jeo maven plugin. @@ -50,6 +52,13 @@ public JeoInstructions(final XmlMethod method) { this.method = method; } + public String[] instuctionNames() { + return Arrays.stream(this.instructions()) + .map(Instruction::opcode) + .map(OpcodeName::new) + .map(OpcodeName::simplified).toArray(String[]::new); + } + /** * Parse instructions. * diff --git a/src/test/java/it/JeoAndOpeoTest.java b/src/test/java/it/JeoAndOpeoTest.java index 917167f4..5bc270e6 100644 --- a/src/test/java/it/JeoAndOpeoTest.java +++ b/src/test/java/it/JeoAndOpeoTest.java @@ -23,15 +23,23 @@ */ package it; +import com.jcabi.xml.XML; import com.jcabi.xml.XMLDocument; import org.cactoos.bytes.BytesOf; import org.cactoos.io.ResourceOf; import org.eolang.jeo.representation.BytecodeRepresentation; import org.eolang.jeo.representation.XmirRepresentation; import org.eolang.jeo.representation.bytecode.Bytecode; +import org.eolang.jeo.representation.xmir.XmlProgram; +import org.eolang.opeo.ast.Opcode; import org.eolang.opeo.compilation.JeoCompiler; import org.eolang.opeo.jeo.JeoDecompiler; +import org.eolang.opeo.jeo.JeoInstructions; +import org.hamcrest.Matcher; +import org.hamcrest.MatcherAssert; +import org.hamcrest.Matchers; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; @@ -76,4 +84,37 @@ void compilesAlreadyCompiledAndAssembles(final String path) { ); } + + @ParameterizedTest + @CsvSource("xmir/disassembled/AsIsEscapeUtil.xmir") + void decompilesCompiles(final String path) throws Exception { + MatcherAssert.assertThat( + "The original and compiled instructions are not equal", + new JeoInstructions( + new XmlProgram( + new JeoCompiler( + new JeoDecompiler( + new XMLDocument( + new BytesOf( + new ResourceOf(path) + ).asBytes() + ) + ).decompile() + ).compile() + ).top().methods().get(0) + ).instuctionNames(), + Matchers.equalTo( + new JeoInstructions( + new XmlProgram( + new XMLDocument( + new BytesOf( + new ResourceOf(path) + ).asBytes() + ) + ).top().methods().get(0) + ).instuctionNames() + ) + ); + } + } diff --git a/src/test/resources/xmir/disassembled/AsIsEscapeUtil.xmir b/src/test/resources/xmir/disassembled/AsIsEscapeUtil.xmir new file mode 100644 index 00000000..86b4d513 --- /dev/null +++ b/src/test/resources/xmir/disassembled/AsIsEscapeUtil.xmir @@ -0,0 +1,100 @@ + + + yv66vgAAADIAJwoABgAbCAAcCgAdAB4KAB0AHwcAIAcAIQcAIgEABjxpbml0PgEAAygpVgEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQAxTGNoL3Fvcy9sb2diYWNrL2NvcmUvcGF0dGVybi91dGlsL0FzSXNFc2NhcGVVdGlsOwEABmVzY2FwZQEALyhMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZ0J1ZmZlcjtDSSlWAQALZXNjYXBlQ2hhcnMBABJMamF2YS9sYW5nL1N0cmluZzsBAANidWYBABhMamF2YS9sYW5nL1N0cmluZ0J1ZmZlcjsBAARuZXh0AQABQwEAB3BvaW50ZXIBAAFJAQAKU291cmNlRmlsZQEAE0FzSXNFc2NhcGVVdGlsLmphdmEMAAgACQEAAVwHACMMACQAJQwAJAAmAQAvY2gvcW9zL2xvZ2JhY2svY29yZS9wYXR0ZXJuL3V0aWwvQXNJc0VzY2FwZVV0aWwBABBqYXZhL2xhbmcvT2JqZWN0AQAsY2gvcW9zL2xvZ2JhY2svY29yZS9wYXR0ZXJuL3V0aWwvSUVzY2FwZVV0aWwBABZqYXZhL2xhbmcvU3RyaW5nQnVmZmVyAQAGYXBwZW5kAQAsKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZ0J1ZmZlcjsBABsoQylMamF2YS9sYW5nL1N0cmluZ0J1ZmZlcjsAIQAFAAYAAQAHAAAAAgABAAgACQABAAoAAAAvAAEAAQAAAAUqtwABsQAAAAIACwAAAAYAAQAAABMADAAAAAwAAQAAAAUADQAOAAAAAQAPABAAAQAKAAAAaAACAAUAAAAOLBICtgADVywdtgAEV7EAAAACAAsAAAAOAAMAAAAeAAcAIAANACEADAAAADQABQAAAA4ADQAOAAAAAAAOABEAEgABAAAADgATABQAAgAAAA4AFQAWAAMAAAAOABcAGAAEAAEAGQAAAAIAGg== + + + + + + package + ch.qos.logback.core.pattern.util + ch.qos.logback.core.pattern.util + + + alias + org.eolang.jeo.opcode + org.eolang.jeo.opcode + + + alias + org.eolang.jeo.label + org.eolang.jeo.label + + + + + 00 00 00 00 00 00 00 32 + 00 00 00 00 00 00 00 21 + 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 + + 63 68 2F 71 6F 73 2F 6C 6F 67 62 61 63 6B 2F 63 6F 72 65 2F 70 61 74 74 65 72 6E 2F 75 74 69 6C 2F 49 45 73 63 61 70 65 55 74 69 6C + + + 00 00 00 00 00 00 00 01 + 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 42 75 66 66 65 72 3B 43 49 29 56 + + + + 00 00 00 00 00 00 00 02 + 00 00 00 00 00 00 00 05 + + + + + + + + 35 33 34 66 38 61 35 33 2D 39 63 64 35 2D 34 66 37 62 2D 39 64 61 36 2D 64 34 66 66 31 35 39 32 38 33 35 66 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 02 + + + 00 00 00 00 00 00 00 12 + 5C + + + 00 00 00 00 00 00 00 B6 + 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 42 75 66 66 65 72 + 61 70 70 65 6E 64 + 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 42 75 66 66 65 72 3B + 00 + + + 00 00 00 00 00 00 00 57 + + 63 36 32 61 30 32 31 38 2D 31 64 39 63 2D 34 36 64 38 2D 61 63 65 36 2D 61 36 66 37 33 64 38 37 33 36 39 36 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 02 + + + 00 00 00 00 00 00 00 15 + 00 00 00 00 00 00 00 03 + + + 00 00 00 00 00 00 00 B6 + 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 42 75 66 66 65 72 + 61 70 70 65 6E 64 + 28 43 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 42 75 66 66 65 72 3B + 00 + + + 00 00 00 00 00 00 00 57 + + 63 36 39 61 63 64 33 65 2D 33 33 36 33 2D 34 30 35 31 2D 38 66 33 63 2D 35 34 66 62 36 66 61 61 64 38 66 30 + + 00 00 00 00 00 00 00 B1 + + 66 61 61 35 63 30 32 33 2D 65 32 32 63 2D 34 36 66 62 2D 38 31 36 36 2D 62 62 38 32 62 62 65 36 65 35 38 34 + + + + + + From 3309302e259aa35a3f8289e6a75335395346728d Mon Sep 17 00:00:00 2001 From: volodya-lombrozo Date: Fri, 24 May 2024 14:43:39 +0300 Subject: [PATCH 20/41] feat(#229): fix the problem with pops --- src/main/java/org/eolang/opeo/ast/Popped.java | 45 +++++++++++++++++++ .../eolang/opeo/compilation/XmirParser.java | 5 ++- .../decompilation/handlers/PopHandler.java | 4 ++ src/test/java/it/JeoAndOpeoTest.java | 21 ++------- .../decompilation/DecompilerMachineTest.java | 5 ++- src/test/resources/packs/simple_objects.yaml | 1 + src/test/resources/simple.eo | 1 + .../xmir/disassembled/AsIsEscapeUtil.xmir | 4 -- 8 files changed, 61 insertions(+), 25 deletions(-) create mode 100644 src/main/java/org/eolang/opeo/ast/Popped.java diff --git a/src/main/java/org/eolang/opeo/ast/Popped.java b/src/main/java/org/eolang/opeo/ast/Popped.java new file mode 100644 index 00000000..b3db9ce0 --- /dev/null +++ b/src/main/java/org/eolang/opeo/ast/Popped.java @@ -0,0 +1,45 @@ +package org.eolang.opeo.ast; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.objectweb.asm.Opcodes; +import org.objectweb.asm.Type; +import org.xembly.Directive; +import org.xembly.Directives; + +public final class Popped implements AstNode, Typed { + + private final AstNode node; + + public Popped(final AstNode node) { + this.node = node; + } + + @Override + public List opcodes() { + return Stream.concat( + this.node.opcodes().stream(), + Stream.of(new Opcode(Opcodes.POP)) + ).collect(Collectors.toList()); + } + + @Override + public Iterable toXmir() { + return new Directives() + .add("o").attr("base", ".ignore-result") + .append(this.node.toXmir()) + .up(); + } + + @Override + public Type type() { + if (this.node instanceof Typed) { + return ((Typed) this.node).type(); + } else { + throw new IllegalStateException(String.format("Node '%s' is not typed", this.node)); + } + } +} diff --git a/src/main/java/org/eolang/opeo/compilation/XmirParser.java b/src/main/java/org/eolang/opeo/compilation/XmirParser.java index 58911d3c..2973478c 100644 --- a/src/main/java/org/eolang/opeo/compilation/XmirParser.java +++ b/src/main/java/org/eolang/opeo/compilation/XmirParser.java @@ -49,6 +49,7 @@ import org.eolang.opeo.ast.Literal; import org.eolang.opeo.ast.LocalVariable; import org.eolang.opeo.ast.Opcode; +import org.eolang.opeo.ast.Popped; import org.eolang.opeo.ast.RawXml; import org.eolang.opeo.ast.StaticInvocation; import org.eolang.opeo.ast.StoreArray; @@ -156,7 +157,9 @@ private AstNode node(final XmlNode node) { ) ) ); - if (".plus".equals(base)) { + if (".ignore-result".equals(base)) { + result = new Popped(this.node(node.firstChild())); + } else if (".plus".equals(base)) { result = new Add(node, this::node); } else if (".minus".equals(base)) { result = new Substraction(node, this::node); diff --git a/src/main/java/org/eolang/opeo/decompilation/handlers/PopHandler.java b/src/main/java/org/eolang/opeo/decompilation/handlers/PopHandler.java index 93a8cd55..addb26ca 100644 --- a/src/main/java/org/eolang/opeo/decompilation/handlers/PopHandler.java +++ b/src/main/java/org/eolang/opeo/decompilation/handlers/PopHandler.java @@ -23,8 +23,10 @@ */ package org.eolang.opeo.decompilation.handlers; +import org.eolang.opeo.ast.Popped; import org.eolang.opeo.decompilation.DecompilerState; import org.eolang.opeo.decompilation.InstructionHandler; +import org.eolang.opeo.decompilation.OperandStack; /** * Pop instruction handler. @@ -35,6 +37,8 @@ public final class PopHandler implements InstructionHandler { @Override public void handle(final DecompilerState state) { // We do nothing here to keep the stack contains previous computations. + final OperandStack stack = state.stack(); + stack.push(new Popped(stack.pop())); } } diff --git a/src/test/java/it/JeoAndOpeoTest.java b/src/test/java/it/JeoAndOpeoTest.java index 5bc270e6..96752b4c 100644 --- a/src/test/java/it/JeoAndOpeoTest.java +++ b/src/test/java/it/JeoAndOpeoTest.java @@ -31,15 +31,12 @@ import org.eolang.jeo.representation.XmirRepresentation; import org.eolang.jeo.representation.bytecode.Bytecode; import org.eolang.jeo.representation.xmir.XmlProgram; -import org.eolang.opeo.ast.Opcode; import org.eolang.opeo.compilation.JeoCompiler; import org.eolang.opeo.jeo.JeoDecompiler; import org.eolang.opeo.jeo.JeoInstructions; -import org.hamcrest.Matcher; import org.hamcrest.MatcherAssert; import org.hamcrest.Matchers; import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; @@ -84,34 +81,22 @@ void compilesAlreadyCompiledAndAssembles(final String path) { ); } - @ParameterizedTest @CsvSource("xmir/disassembled/AsIsEscapeUtil.xmir") void decompilesCompiles(final String path) throws Exception { + final XMLDocument original = new XMLDocument(new BytesOf(new ResourceOf(path)).asBytes()); MatcherAssert.assertThat( "The original and compiled instructions are not equal", new JeoInstructions( new XmlProgram( new JeoCompiler( - new JeoDecompiler( - new XMLDocument( - new BytesOf( - new ResourceOf(path) - ).asBytes() - ) - ).decompile() + new JeoDecompiler(original).decompile() ).compile() ).top().methods().get(0) ).instuctionNames(), Matchers.equalTo( new JeoInstructions( - new XmlProgram( - new XMLDocument( - new BytesOf( - new ResourceOf(path) - ).asBytes() - ) - ).top().methods().get(0) + new XmlProgram(original).top().methods().get(0) ).instuctionNames() ) ); diff --git a/src/test/java/org/eolang/opeo/decompilation/DecompilerMachineTest.java b/src/test/java/org/eolang/opeo/decompilation/DecompilerMachineTest.java index 4c3af2fe..84ef5eb9 100644 --- a/src/test/java/org/eolang/opeo/decompilation/DecompilerMachineTest.java +++ b/src/test/java/org/eolang/opeo/decompilation/DecompilerMachineTest.java @@ -40,6 +40,7 @@ import org.eolang.opeo.ast.LocalVariable; import org.eolang.opeo.ast.Opcode; import org.eolang.opeo.ast.Owner; +import org.eolang.opeo.ast.Popped; import org.eolang.opeo.ast.Root; import org.eolang.opeo.ast.StaticInvocation; import org.eolang.opeo.ast.StoreArray; @@ -387,7 +388,7 @@ void decompilesVarargInvocation() { ), new SameNode( new Root( - new Invocation( + new Popped(new Invocation( new ClassField( "java/lang/System", "out", @@ -417,7 +418,7 @@ void decompilesVarargInvocation() { new Literal(2) ) ) - ), + )), new Opcode(Opcodes.RETURN, false) ) ) diff --git a/src/test/resources/packs/simple_objects.yaml b/src/test/resources/packs/simple_objects.yaml index a36b516d..5c0a9fea 100644 --- a/src/test/resources/packs/simple_objects.yaml +++ b/src/test/resources/packs/simple_objects.yaml @@ -76,6 +76,7 @@ eo: .new 42 .bar + .ignore-result opcode > RETURN 177 diff --git a/src/test/resources/simple.eo b/src/test/resources/simple.eo index 282a8779..67b9dbee 100644 --- a/src/test/resources/simple.eo +++ b/src/test/resources/simple.eo @@ -43,5 +43,6 @@ "abc" .append 1 + .ignore-result opcode > RETURN 177 diff --git a/src/test/resources/xmir/disassembled/AsIsEscapeUtil.xmir b/src/test/resources/xmir/disassembled/AsIsEscapeUtil.xmir index 86b4d513..8d384e2e 100644 --- a/src/test/resources/xmir/disassembled/AsIsEscapeUtil.xmir +++ b/src/test/resources/xmir/disassembled/AsIsEscapeUtil.xmir @@ -49,7 +49,6 @@ - 35 33 34 66 38 61 35 33 2D 39 63 64 35 2D 34 66 37 62 2D 39 64 61 36 2D 64 34 66 66 31 35 39 32 38 33 35 66 00 00 00 00 00 00 00 19 00 00 00 00 00 00 00 02 @@ -68,7 +67,6 @@ 00 00 00 00 00 00 00 57 - 63 36 32 61 30 32 31 38 2D 31 64 39 63 2D 34 36 64 38 2D 61 63 65 36 2D 61 36 66 37 33 64 38 37 33 36 39 36 00 00 00 00 00 00 00 19 00 00 00 00 00 00 00 02 @@ -87,11 +85,9 @@ 00 00 00 00 00 00 00 57 - 63 36 39 61 63 64 33 65 2D 33 33 36 33 2D 34 30 35 31 2D 38 66 33 63 2D 35 34 66 62 36 66 61 61 64 38 66 30 00 00 00 00 00 00 00 B1 - 66 61 61 35 63 30 32 33 2D 65 32 32 63 2D 34 36 66 62 2D 38 31 36 36 2D 62 62 38 32 62 62 65 36 65 35 38 34 From 7b83c00153f6074c2f15f265b1125010a96fe944 Mon Sep 17 00:00:00 2001 From: volodya-lombrozo Date: Fri, 24 May 2024 16:13:17 +0300 Subject: [PATCH 21/41] feat(#229): identify the problem related to INVOKESPECIAL arguments --- .../org/eolang/opeo/SelectiveDecompiler.java | 15 ++- src/test/java/it/JeoAndOpeoTest.java | 16 ++- .../disassembled/SimpleTypeConverter.xmir | 109 ++++++++++++++++++ 3 files changed, 133 insertions(+), 7 deletions(-) create mode 100644 src/test/resources/xmir/disassembled/SimpleTypeConverter.xmir diff --git a/src/main/java/org/eolang/opeo/SelectiveDecompiler.java b/src/main/java/org/eolang/opeo/SelectiveDecompiler.java index 2d165ad6..f893a017 100644 --- a/src/main/java/org/eolang/opeo/SelectiveDecompiler.java +++ b/src/main/java/org/eolang/opeo/SelectiveDecompiler.java @@ -164,16 +164,21 @@ private boolean excluded(final String relative) { // "junit", - "ch", "com", "javax", +// "ch", "com", "javax", // "net", // То что ниже исключено из билда, то что посередине, добавлено. // Если билд фейлится, то одна из зависимостей выше инициировала падение - "aopalliance", "apiguardian", "assertj", "eolang", "hamcrest", "json", - "mockito", "objectweb", "objenesis", "opentest4j", "slf4j", "xmlunit", - - "springframework", "yaml" +// "aopalliance", "apiguardian", "assertj", "eolang", "hamcrest", "json", +// "mockito", "objectweb", "objenesis", "opentest4j", "slf4j", "xmlunit", + +// HERE IS THE PROBLEM!!! +// "springframework" +/////////////////////////////////////// +// +// , + "yaml" ).anyMatch(relative::contains); } diff --git a/src/test/java/it/JeoAndOpeoTest.java b/src/test/java/it/JeoAndOpeoTest.java index 96752b4c..96146a2e 100644 --- a/src/test/java/it/JeoAndOpeoTest.java +++ b/src/test/java/it/JeoAndOpeoTest.java @@ -23,7 +23,6 @@ */ package it; -import com.jcabi.xml.XML; import com.jcabi.xml.XMLDocument; import org.cactoos.bytes.BytesOf; import org.cactoos.io.ResourceOf; @@ -31,6 +30,7 @@ import org.eolang.jeo.representation.XmirRepresentation; import org.eolang.jeo.representation.bytecode.Bytecode; import org.eolang.jeo.representation.xmir.XmlProgram; +import org.eolang.opeo.ast.Opcode; import org.eolang.opeo.compilation.JeoCompiler; import org.eolang.opeo.jeo.JeoDecompiler; import org.eolang.opeo.jeo.JeoInstructions; @@ -83,7 +83,7 @@ void compilesAlreadyCompiledAndAssembles(final String path) { @ParameterizedTest @CsvSource("xmir/disassembled/AsIsEscapeUtil.xmir") - void decompilesCompiles(final String path) throws Exception { + void decompilesCompilesAndKeppsTheSameInstructions(final String path) throws Exception { final XMLDocument original = new XMLDocument(new BytesOf(new ResourceOf(path)).asBytes()); MatcherAssert.assertThat( "The original and compiled instructions are not equal", @@ -102,4 +102,16 @@ void decompilesCompiles(final String path) throws Exception { ); } + @ParameterizedTest + @CsvSource("xmir/disassembled/SimpleTypeConverter.xmir") + void decompilesCompilesAndKeepsExactlyTheSameContent(final String path) throws Exception { + Opcode.disableCounting(); + final XMLDocument original = new XMLDocument(new BytesOf(new ResourceOf(path)).asBytes()); + MatcherAssert.assertThat( + "The original and decompiled/compiled content are not equal", + new JeoCompiler(new JeoDecompiler(original).decompile()).compile(), + Matchers.equalTo(original) + ); + } + } diff --git a/src/test/resources/xmir/disassembled/SimpleTypeConverter.xmir b/src/test/resources/xmir/disassembled/SimpleTypeConverter.xmir new file mode 100644 index 00000000..5ae9661e --- /dev/null +++ b/src/test/resources/xmir/disassembled/SimpleTypeConverter.xmir @@ -0,0 +1,109 @@ + + + yv66vgAAADQAHAoABwARBwASCgACABMJAAYAFAoABgAVBwAWBwAXAQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBAC9Mb3JnL3NwcmluZ2ZyYW1ld29yay9iZWFucy9TaW1wbGVUeXBlQ29udmVydGVyOwEAClNvdXJjZUZpbGUBABhTaW1wbGVUeXBlQ29udmVydGVyLmphdmEMAAgACQEAL29yZy9zcHJpbmdmcmFtZXdvcmsvYmVhbnMvVHlwZUNvbnZlcnRlckRlbGVnYXRlDAAIABgMABkAGgwAGwAJAQAtb3JnL3NwcmluZ2ZyYW1ld29yay9iZWFucy9TaW1wbGVUeXBlQ29udmVydGVyAQAub3JnL3NwcmluZ2ZyYW1ld29yay9iZWFucy9UeXBlQ29udmVydGVyU3VwcG9ydAEAPChMb3JnL3NwcmluZ2ZyYW1ld29yay9iZWFucy9Qcm9wZXJ0eUVkaXRvclJlZ2lzdHJ5U3VwcG9ydDspVgEAFXR5cGVDb252ZXJ0ZXJEZWxlZ2F0ZQEAMUxvcmcvc3ByaW5nZnJhbWV3b3JrL2JlYW5zL1R5cGVDb252ZXJ0ZXJEZWxlZ2F0ZTsBABZyZWdpc3RlckRlZmF1bHRFZGl0b3JzACEABgAHAAAAAAABAAEACAAJAAEACgAAAEsABAABAAAAFSq3AAEquwACWSq3AAO1AAQqtgAFsQAAAAIACwAAABIABAAAACMABAAkABAAJQAUACYADAAAAAwAAQAAABUADQAOAAAAAQAPAAAAAgAQ + + + + + + package + org.springframework.beans + org.springframework.beans + + + alias + org.eolang.jeo.opcode + org.eolang.jeo.opcode + + + alias + org.eolang.jeo.label + org.eolang.jeo.label + + + + + 00 00 00 00 00 00 00 34 + 00 00 00 00 00 00 00 21 + 6F 72 67 2F 73 70 72 69 6E 67 66 72 61 6D 65 77 6F 72 6B 2F 62 65 61 6E 73 2F 54 79 70 65 43 6F 6E 76 65 72 74 65 72 53 75 70 70 6F 72 74 + + + 00 00 00 00 00 00 00 01 + 28 29 56 + + + + 00 00 00 00 00 00 00 04 + 00 00 00 00 00 00 00 01 + + + + 33 31 62 33 39 66 66 37 2D 37 35 34 30 2D 34 30 38 63 2D 61 32 63 34 2D 31 31 31 33 66 61 62 38 31 62 38 31 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 B7 + 6F 72 67 2F 73 70 72 69 6E 67 66 72 61 6D 65 77 6F 72 6B 2F 62 65 61 6E 73 2F 54 79 70 65 43 6F 6E 76 65 72 74 65 72 53 75 70 70 6F 72 74 + 3C 69 6E 69 74 3E + 28 29 56 + 00 + + 30 66 35 62 61 62 63 32 2D 39 61 64 31 2D 34 37 31 65 2D 61 32 31 36 2D 30 34 66 32 38 61 66 61 33 38 64 36 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 BB + 6F 72 67 2F 73 70 72 69 6E 67 66 72 61 6D 65 77 6F 72 6B 2F 62 65 61 6E 73 2F 54 79 70 65 43 6F 6E 76 65 72 74 65 72 44 65 6C 65 67 61 74 65 + + + 00 00 00 00 00 00 00 59 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 B7 + 6F 72 67 2F 73 70 72 69 6E 67 66 72 61 6D 65 77 6F 72 6B 2F 62 65 61 6E 73 2F 54 79 70 65 43 6F 6E 76 65 72 74 65 72 44 65 6C 65 67 61 74 65 + 3C 69 6E 69 74 3E + 28 4C 6F 72 67 2F 73 70 72 69 6E 67 66 72 61 6D 65 77 6F 72 6B 2F 62 65 61 6E 73 2F 50 72 6F 70 65 72 74 79 45 64 69 74 6F 72 52 65 67 69 73 74 72 79 53 75 70 70 6F 72 74 3B 29 56 + 00 + + + 00 00 00 00 00 00 00 B5 + 6F 72 67 2F 73 70 72 69 6E 67 66 72 61 6D 65 77 6F 72 6B 2F 62 65 61 6E 73 2F 53 69 6D 70 6C 65 54 79 70 65 43 6F 6E 76 65 72 74 65 72 + 74 79 70 65 43 6F 6E 76 65 72 74 65 72 44 65 6C 65 67 61 74 65 + 4C 6F 72 67 2F 73 70 72 69 6E 67 66 72 61 6D 65 77 6F 72 6B 2F 62 65 61 6E 73 2F 54 79 70 65 43 6F 6E 76 65 72 74 65 72 44 65 6C 65 67 61 74 65 3B + + 62 33 34 63 63 62 66 37 2D 37 35 37 38 2D 34 65 66 34 2D 39 38 35 63 2D 30 62 38 31 32 36 39 33 63 33 62 34 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 B6 + 6F 72 67 2F 73 70 72 69 6E 67 66 72 61 6D 65 77 6F 72 6B 2F 62 65 61 6E 73 2F 53 69 6D 70 6C 65 54 79 70 65 43 6F 6E 76 65 72 74 65 72 + 72 65 67 69 73 74 65 72 44 65 66 61 75 6C 74 45 64 69 74 6F 72 73 + 28 29 56 + 00 + + 31 65 62 62 36 38 36 31 2D 37 62 33 66 2D 34 32 38 61 2D 39 35 64 66 2D 31 30 62 32 36 32 30 65 64 64 64 66 + + 00 00 00 00 00 00 00 B1 + + 35 35 34 30 37 33 35 66 2D 33 36 38 37 2D 34 30 30 32 2D 38 63 63 66 2D 63 34 33 64 30 66 63 66 37 37 33 62 + + + + + + From 4ccdd45fe72c1f7401a82b6dfcb72a718582e345 Mon Sep 17 00:00:00 2001 From: volodya-lombrozo Date: Fri, 24 May 2024 17:34:30 +0300 Subject: [PATCH 22/41] feat(#229): try to solve the problem --- .../org/eolang/opeo/SelectiveDecompiler.java | 2 +- .../opeo/ast/ConstructorDescriptor.java | 39 ++++++++++++++++++- .../eolang/opeo/compilation/XmirParser.java | 5 +++ src/test/java/it/JeoAndOpeoTest.java | 11 ++++-- 4 files changed, 52 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/eolang/opeo/SelectiveDecompiler.java b/src/main/java/org/eolang/opeo/SelectiveDecompiler.java index f893a017..b0faf4df 100644 --- a/src/main/java/org/eolang/opeo/SelectiveDecompiler.java +++ b/src/main/java/org/eolang/opeo/SelectiveDecompiler.java @@ -139,7 +139,7 @@ public void decompile() { entry -> { final XmirEntry res; final List found = entry.xpath(this.xpath()); - if (found.isEmpty() && !this.excluded(entry.relative())) { + if (found.isEmpty()) { res = entry.transform( xml -> new JeoDecompiler(xml, entry.relative()).decompile() ); diff --git a/src/main/java/org/eolang/opeo/ast/ConstructorDescriptor.java b/src/main/java/org/eolang/opeo/ast/ConstructorDescriptor.java index 51a8b879..391a94cc 100644 --- a/src/main/java/org/eolang/opeo/ast/ConstructorDescriptor.java +++ b/src/main/java/org/eolang/opeo/ast/ConstructorDescriptor.java @@ -33,21 +33,39 @@ */ public final class ConstructorDescriptor { + /** + * Original descriptor. + */ + private final String descriptor; + /** * Constructor arguments. */ private final List args; + public ConstructorDescriptor(final List args) { + this("", args); + } + /** * Constructor. * @param arguments Constructor arguments. */ - public ConstructorDescriptor(final List arguments) { + public ConstructorDescriptor(final String descriptor, final List arguments) { + this.descriptor = descriptor; this.args = arguments; } @Override public String toString() { + return this.combine(); + } + + /** + * TODO: explain + * @return + */ + private String combine() { return Type.getMethodDescriptor( Type.VOID_TYPE, this.args.stream() @@ -56,6 +74,25 @@ public String toString() { .map(Typed::type) .toArray(Type[]::new) ); +// if (this.descriptor.contains("org/eolang") +// || this.descriptor.contains("org.eolang") +// || this.descriptor.isEmpty()) { +// return Type.getMethodDescriptor( +// Type.VOID_TYPE, +// this.argumentTypes() +// ); +// } else { +// return this.descriptor; +// } + } + + + private Type[] argumentTypes() { + return this.args.stream() + .peek(this::verify) + .map(Typed.class::cast) + .map(Typed::type) + .toArray(Type[]::new); } /** diff --git a/src/main/java/org/eolang/opeo/compilation/XmirParser.java b/src/main/java/org/eolang/opeo/compilation/XmirParser.java index 2973478c..36d90c8d 100644 --- a/src/main/java/org/eolang/opeo/compilation/XmirParser.java +++ b/src/main/java/org/eolang/opeo/compilation/XmirParser.java @@ -249,6 +249,11 @@ private AstNode node(final XmlNode node) { ) ); final List args = this.args(inner); +// final String descriptor = node.attribute("scope") +// .map(Attributes::new) +// .map(Attributes::descriptor) +// .map(descr -> new ConstructorDescriptor(descr, args)) +// .orElseGet(() -> new ConstructorDescriptor(args)).toString(); final Attributes attributes = new Attributes() .descriptor(new ConstructorDescriptor(args).toString()) .interfaced(false); diff --git a/src/test/java/it/JeoAndOpeoTest.java b/src/test/java/it/JeoAndOpeoTest.java index 96146a2e..f0d12123 100644 --- a/src/test/java/it/JeoAndOpeoTest.java +++ b/src/test/java/it/JeoAndOpeoTest.java @@ -23,6 +23,7 @@ */ package it; +import com.jcabi.xml.XML; import com.jcabi.xml.XMLDocument; import org.cactoos.bytes.BytesOf; import org.cactoos.io.ResourceOf; @@ -37,6 +38,7 @@ import org.hamcrest.MatcherAssert; import org.hamcrest.Matchers; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; @@ -102,14 +104,17 @@ void decompilesCompilesAndKeppsTheSameInstructions(final String path) throws Exc ); } + @Disabled @ParameterizedTest - @CsvSource("xmir/disassembled/SimpleTypeConverter.xmir") - void decompilesCompilesAndKeepsExactlyTheSameContent(final String path) throws Exception { + @CsvSource("xmir/disassembled/SimpleTypeConverter.xmir, org.springframework.beans.SimpleTypeConverter") + void decompilesCompilesAndKeepsExactlyTheSameContent( + final String path, final String pckg + ) throws Exception { Opcode.disableCounting(); final XMLDocument original = new XMLDocument(new BytesOf(new ResourceOf(path)).asBytes()); MatcherAssert.assertThat( "The original and decompiled/compiled content are not equal", - new JeoCompiler(new JeoDecompiler(original).decompile()).compile(), + new JeoCompiler(new JeoDecompiler(original, pckg).decompile()).compile(), Matchers.equalTo(original) ); } From ed917c384142a89c372a0dce6c118bb1876b92e7 Mon Sep 17 00:00:00 2001 From: volodya-lombrozo Date: Fri, 24 May 2024 17:59:32 +0300 Subject: [PATCH 23/41] feat(#229): ignore fuse test --- pom.xml | 2 ++ .../java/org/eolang/opeo/SelectiveDecompiler.java | 15 +++++---------- .../org/eolang/opeo/compilation/XmirParser.java | 12 ++++++------ 3 files changed, 13 insertions(+), 16 deletions(-) diff --git a/pom.xml b/pom.xml index 3436280c..20cfffb5 100644 --- a/pom.xml +++ b/pom.xml @@ -207,6 +207,8 @@ SOFTWARE. mvn clean install -Plong --> + + fuse/pom.xml spring-fat/pom.xml diff --git a/src/main/java/org/eolang/opeo/SelectiveDecompiler.java b/src/main/java/org/eolang/opeo/SelectiveDecompiler.java index b0faf4df..22a24ff0 100644 --- a/src/main/java/org/eolang/opeo/SelectiveDecompiler.java +++ b/src/main/java/org/eolang/opeo/SelectiveDecompiler.java @@ -164,21 +164,16 @@ private boolean excluded(final String relative) { // "junit", -// "ch", "com", "javax", + "ch", "com", "javax", // "net", // То что ниже исключено из билда, то что посередине, добавлено. // Если билд фейлится, то одна из зависимостей выше инициировала падение -// "aopalliance", "apiguardian", "assertj", "eolang", "hamcrest", "json", -// "mockito", "objectweb", "objenesis", "opentest4j", "slf4j", "xmlunit", - -// HERE IS THE PROBLEM!!! -// "springframework" -/////////////////////////////////////// -// -// , - "yaml" + "aopalliance", "apiguardian", "assertj", "eolang", "hamcrest", "json", + "mockito", "objectweb", "objenesis", "opentest4j", "slf4j", "xmlunit", + + "springframework", "yaml" ).anyMatch(relative::contains); } diff --git a/src/main/java/org/eolang/opeo/compilation/XmirParser.java b/src/main/java/org/eolang/opeo/compilation/XmirParser.java index 36d90c8d..57c67056 100644 --- a/src/main/java/org/eolang/opeo/compilation/XmirParser.java +++ b/src/main/java/org/eolang/opeo/compilation/XmirParser.java @@ -249,13 +249,13 @@ private AstNode node(final XmlNode node) { ) ); final List args = this.args(inner); -// final String descriptor = node.attribute("scope") -// .map(Attributes::new) -// .map(Attributes::descriptor) -// .map(descr -> new ConstructorDescriptor(descr, args)) -// .orElseGet(() -> new ConstructorDescriptor(args)).toString(); + final String descriptor = node.attribute("scope") + .map(Attributes::new) + .map(Attributes::descriptor) + .map(descr -> new ConstructorDescriptor(descr, args)) + .orElseGet(() -> new ConstructorDescriptor(args)).toString(); final Attributes attributes = new Attributes() - .descriptor(new ConstructorDescriptor(args).toString()) + .descriptor(descriptor) .interfaced(false); result = new Constructor(type, attributes, args); } else if (".array".equals(base)) { From f4bae7fedf4b7efc28b7cf8d143dd7637e2ed38c Mon Sep 17 00:00:00 2001 From: volodya-lombrozo Date: Fri, 24 May 2024 19:51:02 +0300 Subject: [PATCH 24/41] feat(#229): enable fuse test back --- pom.xml | 2 -- src/main/java/org/eolang/opeo/ast/Opcode.java | 20 +++++++++---------- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/pom.xml b/pom.xml index 20cfffb5..3436280c 100644 --- a/pom.xml +++ b/pom.xml @@ -207,8 +207,6 @@ SOFTWARE. mvn clean install -Plong --> - - fuse/pom.xml spring-fat/pom.xml diff --git a/src/main/java/org/eolang/opeo/ast/Opcode.java b/src/main/java/org/eolang/opeo/ast/Opcode.java index b3ee6aaf..2b320edd 100644 --- a/src/main/java/org/eolang/opeo/ast/Opcode.java +++ b/src/main/java/org/eolang/opeo/ast/Opcode.java @@ -113,17 +113,17 @@ public Iterable toXmir() { @Override public List opcodes() { -// switch (this.bytecode) { -// case Opcodes.INVOKEVIRTUAL: + switch (this.bytecode) { + case Opcodes.INVOKEVIRTUAL: + case Opcodes.INVOKEINTERFACE: + case Opcodes.INVOKESPECIAL: + case Opcodes.INVOKESTATIC: // case Opcodes.INVOKEDYNAMIC: -// case Opcodes.INVOKEINTERFACE: -// case Opcodes.INVOKESPECIAL: -// case Opcodes.INVOKESTATIC: -// this.appendInterfaced(); -// break; -// default: -// break; -// } + this.appendInterfaced(); + break; + default: + break; + } return List.of(this); } From fb7644719439e9570442e77f315a66c921346c55 Mon Sep 17 00:00:00 2001 From: volodya-lombrozo Date: Fri, 24 May 2024 21:26:13 +0300 Subject: [PATCH 25/41] feat(#229): identify the problem with incorrect transformation --- .../opeo/ast/ConstructorDescriptor.java | 38 +++--- src/test/java/it/JeoAndOpeoTest.java | 117 +++++++++++++++++- .../xmir/disassembled/LongArrayAssert.xmir | 79 ++++++++++++ 3 files changed, 215 insertions(+), 19 deletions(-) create mode 100644 src/test/resources/xmir/disassembled/LongArrayAssert.xmir diff --git a/src/main/java/org/eolang/opeo/ast/ConstructorDescriptor.java b/src/main/java/org/eolang/opeo/ast/ConstructorDescriptor.java index 391a94cc..2136dcf1 100644 --- a/src/main/java/org/eolang/opeo/ast/ConstructorDescriptor.java +++ b/src/main/java/org/eolang/opeo/ast/ConstructorDescriptor.java @@ -66,24 +66,26 @@ public String toString() { * @return */ private String combine() { - return Type.getMethodDescriptor( - Type.VOID_TYPE, - this.args.stream() - .peek(this::verify) - .map(Typed.class::cast) - .map(Typed::type) - .toArray(Type[]::new) - ); -// if (this.descriptor.contains("org/eolang") -// || this.descriptor.contains("org.eolang") -// || this.descriptor.isEmpty()) { -// return Type.getMethodDescriptor( -// Type.VOID_TYPE, -// this.argumentTypes() -// ); -// } else { -// return this.descriptor; -// } +// return Type.getMethodDescriptor( +// Type.VOID_TYPE, +// this.args.stream() +// .peek(this::verify) +// .map(Typed.class::cast) +// .map(Typed::type) +// .toArray(Type[]::new) +// ); + + + if (this.descriptor.contains("org/eolang") + || this.descriptor.contains("org.eolang") + || this.descriptor.isEmpty()) { + return Type.getMethodDescriptor( + Type.VOID_TYPE, + this.argumentTypes() + ); + } else { + return this.descriptor; + } } diff --git a/src/test/java/it/JeoAndOpeoTest.java b/src/test/java/it/JeoAndOpeoTest.java index f0d12123..fbba0b5f 100644 --- a/src/test/java/it/JeoAndOpeoTest.java +++ b/src/test/java/it/JeoAndOpeoTest.java @@ -25,12 +25,27 @@ import com.jcabi.xml.XML; import com.jcabi.xml.XMLDocument; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Stream; import org.cactoos.bytes.BytesOf; import org.cactoos.io.ResourceOf; import org.eolang.jeo.representation.BytecodeRepresentation; import org.eolang.jeo.representation.XmirRepresentation; import org.eolang.jeo.representation.bytecode.Bytecode; +import org.eolang.jeo.representation.xmir.XmlBytecodeEntry; +import org.eolang.jeo.representation.xmir.XmlInstruction; +import org.eolang.jeo.representation.xmir.XmlLabel; +import org.eolang.jeo.representation.xmir.XmlMethod; +import org.eolang.jeo.representation.xmir.XmlOperand; import org.eolang.jeo.representation.xmir.XmlProgram; +import org.eolang.opeo.ast.Label; +import org.eolang.opeo.ast.Labeled; import org.eolang.opeo.ast.Opcode; import org.eolang.opeo.compilation.JeoCompiler; import org.eolang.opeo.jeo.JeoDecompiler; @@ -39,6 +54,7 @@ import org.hamcrest.Matchers; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; @@ -84,7 +100,7 @@ void compilesAlreadyCompiledAndAssembles(final String path) { } @ParameterizedTest - @CsvSource("xmir/disassembled/AsIsEscapeUtil.xmir") + @CsvSource({"xmir/disassembled/AsIsEscapeUtil.xmir", "xmir/disassembled/LongArrayAssert.xmir"}) void decompilesCompilesAndKeppsTheSameInstructions(final String path) throws Exception { final XMLDocument original = new XMLDocument(new BytesOf(new ResourceOf(path)).asBytes()); MatcherAssert.assertThat( @@ -119,4 +135,103 @@ void decompilesCompilesAndKeepsExactlyTheSameContent( ); } + + @Test + void findTheProblem() { + final String base = "/Users/lombrozo/Workspace/EOlang/opeo-maven-plugin/target-standard/it/spring-fat/target/generated-sources/opeo-compile-xmir/org"; + Path golden = Paths.get( + base + ); + + Path real = Paths.get( + "/Users/lombrozo/Workspace/EOlang/opeo-maven-plugin/target/it/spring-fat/target/generated-sources/opeo-compile-xmir/org" + ); + + try (final Stream all = Files.walk(golden).filter(Files::isRegularFile)) { + all.forEach( + path -> { + final Path relative = golden.relativize(path); + XMLDocument good = null; + try { + good = new XMLDocument(golden.resolve(relative)); + } catch (final FileNotFoundException exception) { + throw new RuntimeException(exception); + } + XMLDocument bad = null; + try { + bad = new XMLDocument(real.resolve(relative)); + } catch (final FileNotFoundException exception) { + throw new RuntimeException(exception); + } + + final XmlProgram goodProgram = new XmlProgram(good); + final XmlProgram badProgram = new XmlProgram(bad); + final List goodMethods = goodProgram.top().methods(); + final List badMethods = badProgram.top().methods(); + for (int i = 0; i < goodMethods.size(); i++) { + final XmlMethod goodMethod = goodMethods.get(i); + final XmlMethod badMethod = badMethods.get(i); + final List goodInstructions = goodMethod.instructions(); + final List badInstructions = badMethod.instructions(); + + for (int j = 0; j < goodInstructions.size(); j++) { + final XmlBytecodeEntry goodEntry = goodInstructions.get(j); + final XmlBytecodeEntry badEntry = badInstructions.get(j); + + if (goodEntry instanceof XmlInstruction && badEntry instanceof XmlInstruction) { + + final XmlInstruction goodInstruction = (XmlInstruction) goodEntry; + final XmlInstruction badInstruction = (XmlInstruction) badEntry; + + if (goodInstruction.opcode() != badInstruction.opcode()) { + throw new IllegalArgumentException( + String.format( + "The instructions '%s' and '%s' are differ in '%s'", + goodEntry, + badEntry, + relative + ) + ); + } + final List goodOperands = goodInstruction.operands(); + final List badOperands = badInstruction.operands(); + for (int k = 0; k < goodOperands.size(); k++) { + final XmlOperand goodOperand = goodOperands.get(k); + final XmlOperand badOperand = badOperands.get(k); + + final String goodOperandString = goodOperand.toString(); + final String badOperandString = badOperand.toString(); + if (goodOperandString.contains( + "label") && badOperandString.contains("label")) + continue; + if (!goodOperandString.equals(badOperandString)) { + throw new IllegalArgumentException( + String.format( + "The operands '%s' and '%s' are differ in '%s'%n'%s'%n'%s',%n%s%n%s", + goodEntry, + badEntry, + relative, + goodOperand, + badOperand, + "file://" + golden.resolve(relative), + "file://" + real.resolve(relative) + ) + ); + } + } + + } + + + } + + } + } + ); + } catch (final IOException exception) { + throw new RuntimeException(exception); + } + } + + } diff --git a/src/test/resources/xmir/disassembled/LongArrayAssert.xmir b/src/test/resources/xmir/disassembled/LongArrayAssert.xmir new file mode 100644 index 00000000..7c4d5ab4 --- /dev/null +++ b/src/test/resources/xmir/disassembled/LongArrayAssert.xmir @@ -0,0 +1,79 @@ + + + yv66vgAAADQAHwEAJG9yZy9hc3NlcnRqL2NvcmUvYXBpL0xvbmdBcnJheUFzc2VydAcAAQEAVkxvcmcvYXNzZXJ0ai9jb3JlL2FwaS9BYnN0cmFjdExvbmdBcnJheUFzc2VydDxMb3JnL2Fzc2VydGovY29yZS9hcGkvTG9uZ0FycmF5QXNzZXJ0Oz47AQAsb3JnL2Fzc2VydGovY29yZS9hcGkvQWJzdHJhY3RMb25nQXJyYXlBc3NlcnQHAAQBABRMb25nQXJyYXlBc3NlcnQuamF2YQEABjxpbml0PgEABShbSilWAQAWKFtKTGphdmEvbGFuZy9DbGFzczspVgwABwAJCgAFAAoBAAR0aGlzAQAmTG9yZy9hc3NlcnRqL2NvcmUvYXBpL0xvbmdBcnJheUFzc2VydDsBAAZhY3R1YWwBAAJbSgEAMChMamF2YS91dGlsL2NvbmN1cnJlbnQvYXRvbWljL0F0b21pY0xvbmdBcnJheTspVgEAHG9yZy9hc3NlcnRqL2NvcmUvdXRpbC9BcnJheXMHABEBAAVhcnJheQEAMShMamF2YS91dGlsL2NvbmN1cnJlbnQvYXRvbWljL0F0b21pY0xvbmdBcnJheTspW0oMABMAFAoAEgAVDAAHAAgKAAIAFwEALUxqYXZhL3V0aWwvY29uY3VycmVudC9hdG9taWMvQXRvbWljTG9uZ0FycmF5OwEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAlTaWduYXR1cmUBAApTb3VyY2VGaWxlACEAAgAFAAAAAAACAAEABwAIAAEAGgAAAEAAAwACAAAACCorEgK3AAuxAAAAAgAbAAAACgACAAAAIgAHACMAHAAAABYAAgAAAAgADAANAAAAAAAIAA4ADwABAAEABwAQAAEAGgAAAEEAAgACAAAACSoruAAWtwAYsQAAAAIAGwAAAAoAAgAAACYACAAnABwAAAAWAAIAAAAJAAwADQAAAAAACQAOABkAAQACAB0AAAACAAMAHgAAAAIABg== + + + + + + package + org.assertj.core.api + org.assertj.core.api + + + alias + org.eolang.jeo.opcode + org.eolang.jeo.opcode + + + alias + org.eolang.jeo.label + org.eolang.jeo.label + + + + + 00 00 00 00 00 00 00 34 + 00 00 00 00 00 00 00 21 + 4C 6F 72 67 2F 61 73 73 65 72 74 6A 2F 63 6F 72 65 2F 61 70 69 2F 41 62 73 74 72 61 63 74 4C 6F 6E 67 41 72 72 61 79 41 73 73 65 72 74 3C 4C 6F 72 67 2F 61 73 73 65 72 74 6A 2F 63 6F 72 65 2F 61 70 69 2F 4C 6F 6E 67 41 72 72 61 79 41 73 73 65 72 74 3B 3E 3B + 6F 72 67 2F 61 73 73 65 72 74 6A 2F 63 6F 72 65 2F 61 70 69 2F 41 62 73 74 72 61 63 74 4C 6F 6E 67 41 72 72 61 79 41 73 73 65 72 74 + + + 00 00 00 00 00 00 00 01 + 28 4C 6A 61 76 61 2F 75 74 69 6C 2F 63 6F 6E 63 75 72 72 65 6E 74 2F 61 74 6F 6D 69 63 2F 41 74 6F 6D 69 63 4C 6F 6E 67 41 72 72 61 79 3B 29 56 + + + + 00 00 00 00 00 00 00 02 + 00 00 00 00 00 00 00 02 + + + + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 01 + + + 00 00 00 00 00 00 00 B8 + 6F 72 67 2F 61 73 73 65 72 74 6A 2F 63 6F 72 65 2F 75 74 69 6C 2F 41 72 72 61 79 73 + 61 72 72 61 79 + 28 4C 6A 61 76 61 2F 75 74 69 6C 2F 63 6F 6E 63 75 72 72 65 6E 74 2F 61 74 6F 6D 69 63 2F 41 74 6F 6D 69 63 4C 6F 6E 67 41 72 72 61 79 3B 29 5B 4A + 00 + + + 00 00 00 00 00 00 00 B7 + 6F 72 67 2F 61 73 73 65 72 74 6A 2F 63 6F 72 65 2F 61 70 69 2F 4C 6F 6E 67 41 72 72 61 79 41 73 73 65 72 74 + 3C 69 6E 69 74 3E + 28 5B 4A 29 56 + 00 + + + 00 00 00 00 00 00 00 B1 + + + + + + + From bb9196f5faabe09e558466bd6509379687952297 Mon Sep 17 00:00:00 2001 From: volodya-lombrozo Date: Fri, 24 May 2024 21:52:34 +0300 Subject: [PATCH 26/41] feat(#229): change node names to avoid collisions with java names --- src/main/java/org/eolang/opeo/ast/ArrayConstructor.java | 2 +- src/main/java/org/eolang/opeo/ast/ClassField.java | 2 +- src/main/java/org/eolang/opeo/ast/FieldAssignment.java | 2 +- src/main/java/org/eolang/opeo/ast/StoreArray.java | 2 +- src/main/java/org/eolang/opeo/compilation/XmirParser.java | 8 ++++---- src/test/java/it/JeoAndOpeoTest.java | 5 ++++- .../java/org/eolang/opeo/ast/ArrayConstructorTest.java | 6 +++--- .../java/org/eolang/opeo/ast/FieldAssignmentTest.java | 6 +++--- src/test/resources/packs/inheritance.yaml | 2 +- src/test/resources/packs/simple_objects.yaml | 4 ++-- 10 files changed, 21 insertions(+), 18 deletions(-) diff --git a/src/main/java/org/eolang/opeo/ast/ArrayConstructor.java b/src/main/java/org/eolang/opeo/ast/ArrayConstructor.java index e4f36b52..8eca9458 100644 --- a/src/main/java/org/eolang/opeo/ast/ArrayConstructor.java +++ b/src/main/java/org/eolang/opeo/ast/ArrayConstructor.java @@ -60,7 +60,7 @@ public ArrayConstructor(final AstNode size, final String type) { public Iterable toXmir() { final Directives directives = new Directives(); directives.add("o") - .attr("base", ".array") + .attr("base", ".array-node") .append(new DirectivesData(this.type)) .append(this.size.toXmir()); return directives.up(); diff --git a/src/main/java/org/eolang/opeo/ast/ClassField.java b/src/main/java/org/eolang/opeo/ast/ClassField.java index c2961de8..6cee089d 100644 --- a/src/main/java/org/eolang/opeo/ast/ClassField.java +++ b/src/main/java/org/eolang/opeo/ast/ClassField.java @@ -63,7 +63,7 @@ public ClassField(final Attributes attributes) { public Iterable toXmir() { return new Directives() .add("o") - .attr("base", "staticfield") + .attr("base", "static-field") .attr("scope", this.attributes) .up(); } diff --git a/src/main/java/org/eolang/opeo/ast/FieldAssignment.java b/src/main/java/org/eolang/opeo/ast/FieldAssignment.java index d38ee0cb..4004ba50 100644 --- a/src/main/java/org/eolang/opeo/ast/FieldAssignment.java +++ b/src/main/java/org/eolang/opeo/ast/FieldAssignment.java @@ -62,7 +62,7 @@ public FieldAssignment( @Override public Iterable toXmir() { return new Directives().add("o") - .attr("base", ".writefield") + .attr("base", ".write-field") .append(this.field.toXmir()) .append(this.value.toXmir()) .up(); diff --git a/src/main/java/org/eolang/opeo/ast/StoreArray.java b/src/main/java/org/eolang/opeo/ast/StoreArray.java index a2a21c0c..1d942061 100644 --- a/src/main/java/org/eolang/opeo/ast/StoreArray.java +++ b/src/main/java/org/eolang/opeo/ast/StoreArray.java @@ -69,7 +69,7 @@ public StoreArray( @Override public Iterable toXmir() { return new Directives().add("o") - .attr("base", ".writearray") + .attr("base", ".write-array") .append(this.array.toXmir()) .append(this.index.toXmir()) .append(this.value.toXmir()) diff --git a/src/main/java/org/eolang/opeo/compilation/XmirParser.java b/src/main/java/org/eolang/opeo/compilation/XmirParser.java index 57c67056..6febdff6 100644 --- a/src/main/java/org/eolang/opeo/compilation/XmirParser.java +++ b/src/main/java/org/eolang/opeo/compilation/XmirParser.java @@ -203,9 +203,9 @@ private AstNode node(final XmlNode node) { ); } else if ("$".equals(base)) { result = new This(node); - } else if ("staticfield".equals(base)) { + } else if ("static-field".equals(base)) { result = new ClassField(new Attributes(node.attribute("scope").orElseThrow())); - } else if (".writearray".equals(base)) { + } else if (".write-array".equals(base)) { final List inner = node.children().collect(Collectors.toList()); final AstNode array = this.node(inner.get(0)); final AstNode index = this.node(inner.get(1)); @@ -225,7 +225,7 @@ private AstNode node(final XmlNode node) { new Attributes(field.attribute("scope").orElseThrow()) ) ); - } else if (".writefield".equals(base)) { + } else if (".write-field".equals(base)) { final List inner = node.children().collect(Collectors.toList()); final XmlNode field = inner.get(0); final AstNode value = this.node(inner.get(1)); @@ -258,7 +258,7 @@ private AstNode node(final XmlNode node) { .descriptor(descriptor) .interfaced(false); result = new Constructor(type, attributes, args); - } else if (".array".equals(base)) { + } else if (".array-node".equals(base)) { final List children = node.children().collect(Collectors.toList()); final String type = new HexString(children.get(0).text()).decode(); final AstNode size = this.node(children.get(1)); diff --git a/src/test/java/it/JeoAndOpeoTest.java b/src/test/java/it/JeoAndOpeoTest.java index fbba0b5f..a00519d9 100644 --- a/src/test/java/it/JeoAndOpeoTest.java +++ b/src/test/java/it/JeoAndOpeoTest.java @@ -103,12 +103,14 @@ void compilesAlreadyCompiledAndAssembles(final String path) { @CsvSource({"xmir/disassembled/AsIsEscapeUtil.xmir", "xmir/disassembled/LongArrayAssert.xmir"}) void decompilesCompilesAndKeppsTheSameInstructions(final String path) throws Exception { final XMLDocument original = new XMLDocument(new BytesOf(new ResourceOf(path)).asBytes()); + final XML decompiled = new JeoDecompiler(original).decompile(); + System.out.println(decompiled); MatcherAssert.assertThat( "The original and compiled instructions are not equal", new JeoInstructions( new XmlProgram( new JeoCompiler( - new JeoDecompiler(original).decompile() + decompiled ).compile() ).top().methods().get(0) ).instuctionNames(), @@ -137,6 +139,7 @@ void decompilesCompilesAndKeepsExactlyTheSameContent( @Test + @Disabled void findTheProblem() { final String base = "/Users/lombrozo/Workspace/EOlang/opeo-maven-plugin/target-standard/it/spring-fat/target/generated-sources/opeo-compile-xmir/org"; Path golden = Paths.get( diff --git a/src/test/java/org/eolang/opeo/ast/ArrayConstructorTest.java b/src/test/java/org/eolang/opeo/ast/ArrayConstructorTest.java index f8d76eb3..ea1e4645 100644 --- a/src/test/java/org/eolang/opeo/ast/ArrayConstructorTest.java +++ b/src/test/java/org/eolang/opeo/ast/ArrayConstructorTest.java @@ -90,9 +90,9 @@ void convertsToXmir() throws ImpossibleModificationException { ), xmir, XhtmlMatchers.hasXPaths( - "./o[@base='.array']", - "./o[@base='.array']/o[@base='string' and @data='bytes']", - "./o[@base='.array']/o[@base='.plus']" + "./o[@base='.array-node']", + "./o[@base='.array-node']/o[@base='string' and @data='bytes']", + "./o[@base='.array-node']/o[@base='.plus']" ) ); } diff --git a/src/test/java/org/eolang/opeo/ast/FieldAssignmentTest.java b/src/test/java/org/eolang/opeo/ast/FieldAssignmentTest.java index 13d2e889..84014313 100644 --- a/src/test/java/org/eolang/opeo/ast/FieldAssignmentTest.java +++ b/src/test/java/org/eolang/opeo/ast/FieldAssignmentTest.java @@ -52,9 +52,9 @@ void convertsToXmir() throws ImpossibleModificationException { ), xmir, XhtmlMatchers.hasXPaths( - "./o[@base='.writefield']", - "./o[@base='.writefield']/o[@base='.bar']", - "./o[@base='.writefield']/o[@base='int' and contains(text(),'3')]" + "./o[@base='.write-field']", + "./o[@base='.write-field']/o[@base='.bar']", + "./o[@base='.write-field']/o[@base='int' and contains(text(),'3')]" ) ); } diff --git a/src/test/resources/packs/inheritance.yaml b/src/test/resources/packs/inheritance.yaml index 2ccf7524..8e97b765 100644 --- a/src/test/resources/packs/inheritance.yaml +++ b/src/test/resources/packs/inheritance.yaml @@ -50,7 +50,7 @@ eo: .super $ .x - .writefield + .write-field local1 opcode > RETURN 177 diff --git a/src/test/resources/packs/simple_objects.yaml b/src/test/resources/packs/simple_objects.yaml index 5c0a9fea..3a03d2d6 100644 --- a/src/test/resources/packs/simple_objects.yaml +++ b/src/test/resources/packs/simple_objects.yaml @@ -115,7 +115,7 @@ eo: .super $ .x - .writefield + .write-field local1 opcode > RETURN 177 @@ -174,7 +174,7 @@ eo: .super $ .a - .writefield + .write-field local1 opcode > RETURN 177 From 86f7cc2917c0cbff643fc1904c8a30b302e928b6 Mon Sep 17 00:00:00 2001 From: volodya-lombrozo Date: Mon, 27 May 2024 12:12:57 +0300 Subject: [PATCH 27/41] feat(#229): add Duplicate node - EVERYTHING ARE FAILED --- .../java/org/eolang/opeo/ast/Duplicate.java | 61 +++++++++++ .../eolang/opeo/compilation/XmirParser.java | 3 + .../decompilation/handlers/DupHandler.java | 7 +- .../handlers/InvokespecialHandler.java | 42 +++++-- .../decompilation/handlers/LabelHandler.java | 1 - .../decompilation/handlers/RouterHandler.java | 4 +- .../handlers/StoreToArrayHandler.java | 17 ++- .../org/eolang/opeo/jeo/JeoDecompiler.java | 1 + src/test/java/it/JeoAndOpeoTest.java | 26 +++-- ...nit_jupiter_api_function_Executable$0.xmir | 103 ++++++++++++++++++ .../xmir/disassembled/LongArrayAssert.xmir | 3 + 11 files changed, 242 insertions(+), 26 deletions(-) create mode 100644 src/main/java/org/eolang/opeo/ast/Duplicate.java create mode 100644 src/test/resources/xmir/disassembled/AssertionsKt$sam$i$org_junit_jupiter_api_function_Executable$0.xmir diff --git a/src/main/java/org/eolang/opeo/ast/Duplicate.java b/src/main/java/org/eolang/opeo/ast/Duplicate.java new file mode 100644 index 00000000..5caf2407 --- /dev/null +++ b/src/main/java/org/eolang/opeo/ast/Duplicate.java @@ -0,0 +1,61 @@ +package org.eolang.opeo.ast; + +import java.util.Collections; +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.objectweb.asm.Opcodes; +import org.objectweb.asm.Type; +import org.xembly.Directive; +import org.xembly.Directives; + +public final class Duplicate implements AstNode, Typed { + + private final AtomicBoolean convertedToOpcodes; + private final AtomicBoolean convertedToXmir; + + private final AstNode original; + + public Duplicate(final AstNode original) { + this.original = original; + this.convertedToOpcodes = new AtomicBoolean(false); + this.convertedToXmir = new AtomicBoolean(false); + } + + @Override + public List opcodes() { + if (this.convertedToOpcodes.getAndSet(true)) { + return Collections.emptyList(); + } + return Stream.concat( + this.original.opcodes().stream(), + Stream.of(new Opcode(Opcodes.DUP)) + ).collect(Collectors.toList()); + } + + @Override + public Type type() { + if (this.original instanceof Typed) { + return ((Typed) this.original).type(); + } else { + throw new IllegalArgumentException(); + } + } + + @Override + public Iterable toXmir() { + if (convertedToXmir.getAndSet(true)) { + return Collections.emptyList(); + } + return new Directives() + .add("o") + .attr("base", "duplicated") + .append(this.original.toXmir()) + .up(); + } + + public AstNode origin() { + return this.original; + } +} diff --git a/src/main/java/org/eolang/opeo/compilation/XmirParser.java b/src/main/java/org/eolang/opeo/compilation/XmirParser.java index 6febdff6..279955c7 100644 --- a/src/main/java/org/eolang/opeo/compilation/XmirParser.java +++ b/src/main/java/org/eolang/opeo/compilation/XmirParser.java @@ -40,6 +40,7 @@ import org.eolang.opeo.ast.ClassName; import org.eolang.opeo.ast.Constructor; import org.eolang.opeo.ast.ConstructorDescriptor; +import org.eolang.opeo.ast.Duplicate; import org.eolang.opeo.ast.Field; import org.eolang.opeo.ast.FieldAssignment; import org.eolang.opeo.ast.FieldRetrieval; @@ -159,6 +160,8 @@ private AstNode node(final XmlNode node) { ); if (".ignore-result".equals(base)) { result = new Popped(this.node(node.firstChild())); + } else if ("duplicated".equals(base)) { + result = new Duplicate(this.node(node.firstChild())); } else if (".plus".equals(base)) { result = new Add(node, this::node); } else if (".minus".equals(base)) { diff --git a/src/main/java/org/eolang/opeo/decompilation/handlers/DupHandler.java b/src/main/java/org/eolang/opeo/decompilation/handlers/DupHandler.java index 98dc22f0..b5e318eb 100644 --- a/src/main/java/org/eolang/opeo/decompilation/handlers/DupHandler.java +++ b/src/main/java/org/eolang/opeo/decompilation/handlers/DupHandler.java @@ -23,8 +23,11 @@ */ package org.eolang.opeo.decompilation.handlers; +import org.eolang.opeo.ast.AstNode; +import org.eolang.opeo.ast.Duplicate; import org.eolang.opeo.decompilation.DecompilerState; import org.eolang.opeo.decompilation.InstructionHandler; +import org.eolang.opeo.decompilation.OperandStack; /** * Dup instruction handler. @@ -34,7 +37,9 @@ public final class DupHandler implements InstructionHandler { @Override public void handle(final DecompilerState state) { - state.stack().dup(); + final OperandStack stack = state.stack(); + stack.push(new Duplicate(stack.pop())); + stack.dup(); } } diff --git a/src/main/java/org/eolang/opeo/decompilation/handlers/InvokespecialHandler.java b/src/main/java/org/eolang/opeo/decompilation/handlers/InvokespecialHandler.java index d076eb79..f673eb91 100644 --- a/src/main/java/org/eolang/opeo/decompilation/handlers/InvokespecialHandler.java +++ b/src/main/java/org/eolang/opeo/decompilation/handlers/InvokespecialHandler.java @@ -28,6 +28,7 @@ import org.eolang.opeo.ast.AstNode; import org.eolang.opeo.ast.Attributes; import org.eolang.opeo.ast.Constructor; +import org.eolang.opeo.ast.Duplicate; import org.eolang.opeo.ast.Labeled; import org.eolang.opeo.ast.Reference; import org.eolang.opeo.ast.Super; @@ -69,21 +70,38 @@ public void handle(final DecompilerState state) { new Attributes().descriptor(descriptor).interfaced(interfaced), args ); - if (target instanceof Reference) { - ((Reference) target).link(constructor); - } else if (target instanceof Labeled) { - ((Reference) ((Labeled) target).origin()).link(constructor); - } else { - throw new IllegalStateException( - String.format( - "Unexpected target type: %s", - target.getClass().getCanonicalName() - ) - ); - } + + findRef(target).link(constructor); +// if (target instanceof Reference) { +// ((Reference) target).link(constructor); +// } else if (target instanceof Labeled) { +// ((Reference) ((Labeled) target).origin()).link(constructor); +// } else if (target instanceof Duplicate) { +// +// } else { +// throw new IllegalStateException( +// String.format( +// "Unexpected target type: %s", +// target.getClass().getCanonicalName() +// ) +// ); +// } + } + } + + private Reference findRef(final AstNode node) { + if (node instanceof Reference) { + return (Reference) node; + } else if (node instanceof Labeled) { + return findRef((((Labeled) node).origin())); + } else if (node instanceof Duplicate) { + return findRef((((Duplicate) node).origin())); + } else { + throw new IllegalStateException(String.format("Can find reference for node %s", node)); } } + /** * Check if the node is "this". * @param candidate Node to check diff --git a/src/main/java/org/eolang/opeo/decompilation/handlers/LabelHandler.java b/src/main/java/org/eolang/opeo/decompilation/handlers/LabelHandler.java index 52a0a4ac..7dc8d09c 100644 --- a/src/main/java/org/eolang/opeo/decompilation/handlers/LabelHandler.java +++ b/src/main/java/org/eolang/opeo/decompilation/handlers/LabelHandler.java @@ -34,7 +34,6 @@ * @since 0.1 */ public final class LabelHandler implements InstructionHandler { - @Override public void handle(final DecompilerState state) { final AstNode node1 = state.stack().popOpt().orElse(new AstNode.Empty()); diff --git a/src/main/java/org/eolang/opeo/decompilation/handlers/RouterHandler.java b/src/main/java/org/eolang/opeo/decompilation/handlers/RouterHandler.java index 9dde78d1..b841dc4e 100644 --- a/src/main/java/org/eolang/opeo/decompilation/handlers/RouterHandler.java +++ b/src/main/java/org/eolang/opeo/decompilation/handlers/RouterHandler.java @@ -123,9 +123,7 @@ public RouterHandler(final boolean counting) { new MapEntry<>(Opcodes.RETURN, new ReturnHandler(counting)), new MapEntry<>(Opcodes.IRETURN, new ReturnHandler(counting)), new MapEntry<>(JeoLabel.LABEL_OPCODE, new LabelHandler()), - new MapEntry<>( - RouterHandler.UNIMPLEMENTED, new UnimplementedHandler(counting) - ) + new MapEntry<>(RouterHandler.UNIMPLEMENTED, new UnimplementedHandler(counting)) ) ); } diff --git a/src/main/java/org/eolang/opeo/decompilation/handlers/StoreToArrayHandler.java b/src/main/java/org/eolang/opeo/decompilation/handlers/StoreToArrayHandler.java index f2aab519..30553f15 100644 --- a/src/main/java/org/eolang/opeo/decompilation/handlers/StoreToArrayHandler.java +++ b/src/main/java/org/eolang/opeo/decompilation/handlers/StoreToArrayHandler.java @@ -24,6 +24,8 @@ package org.eolang.opeo.decompilation.handlers; import org.eolang.opeo.ast.AstNode; +import org.eolang.opeo.ast.Duplicate; +import org.eolang.opeo.ast.Labeled; import org.eolang.opeo.ast.Reference; import org.eolang.opeo.ast.StoreArray; import org.eolang.opeo.decompilation.DecompilerState; @@ -43,7 +45,20 @@ public void handle(final DecompilerState state) { final AstNode value = state.stack().pop(); final AstNode index = state.stack().pop(); final AstNode array = state.stack().pop(); - final Reference ref = (Reference) array; + final Reference ref = findRef(array); ref.link(new StoreArray(ref.object(), index, value)); } + + private Reference findRef(final AstNode node) { + if (node instanceof Reference) { + return (Reference) node; + } else if (node instanceof Labeled) { + return findRef((((Labeled) node).origin())); + } else if (node instanceof Duplicate) { + return findRef((((Duplicate) node).origin())); + } else { + throw new IllegalStateException(String.format("Can find reference for node %s", node)); + } + } + } diff --git a/src/main/java/org/eolang/opeo/jeo/JeoDecompiler.java b/src/main/java/org/eolang/opeo/jeo/JeoDecompiler.java index dada04dd..85db29ad 100644 --- a/src/main/java/org/eolang/opeo/jeo/JeoDecompiler.java +++ b/src/main/java/org/eolang/opeo/jeo/JeoDecompiler.java @@ -32,6 +32,7 @@ import org.eolang.jeo.representation.xmir.XmlMethod; import org.eolang.jeo.representation.xmir.XmlNode; import org.eolang.jeo.representation.xmir.XmlProgram; +import org.eolang.opeo.Instruction; import org.eolang.opeo.decompilation.DecompilerMachine; import org.eolang.opeo.decompilation.LocalVariables; import org.objectweb.asm.Type; diff --git a/src/test/java/it/JeoAndOpeoTest.java b/src/test/java/it/JeoAndOpeoTest.java index a00519d9..4bd9341c 100644 --- a/src/test/java/it/JeoAndOpeoTest.java +++ b/src/test/java/it/JeoAndOpeoTest.java @@ -32,6 +32,7 @@ import java.nio.file.Paths; import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; import java.util.stream.Stream; import org.cactoos.bytes.BytesOf; import org.cactoos.io.ResourceOf; @@ -100,7 +101,11 @@ void compilesAlreadyCompiledAndAssembles(final String path) { } @ParameterizedTest - @CsvSource({"xmir/disassembled/AsIsEscapeUtil.xmir", "xmir/disassembled/LongArrayAssert.xmir"}) + @CsvSource({ + "xmir/disassembled/AsIsEscapeUtil.xmir", + "xmir/disassembled/LongArrayAssert.xmir", + "xmir/disassembled/AssertionsKt$sam$i$org_junit_jupiter_api_function_Executable$0.xmir" + }) void decompilesCompilesAndKeppsTheSameInstructions(final String path) throws Exception { final XMLDocument original = new XMLDocument(new BytesOf(new ResourceOf(path)).asBytes()); final XML decompiled = new JeoDecompiler(original).decompile(); @@ -141,9 +146,8 @@ void decompilesCompilesAndKeepsExactlyTheSameContent( @Test @Disabled void findTheProblem() { - final String base = "/Users/lombrozo/Workspace/EOlang/opeo-maven-plugin/target-standard/it/spring-fat/target/generated-sources/opeo-compile-xmir/org"; Path golden = Paths.get( - base + "/Users/lombrozo/Workspace/EOlang/opeo-maven-plugin/target-standard/it/spring-fat/target/generated-sources/opeo-compile-xmir/org" ); Path real = Paths.get( @@ -174,9 +178,14 @@ void findTheProblem() { for (int i = 0; i < goodMethods.size(); i++) { final XmlMethod goodMethod = goodMethods.get(i); final XmlMethod badMethod = badMethods.get(i); - final List goodInstructions = goodMethod.instructions(); - final List badInstructions = badMethod.instructions(); - + final List goodInstructions = goodMethod.instructions() + .stream() + .filter(xmlBytecodeEntry -> !(xmlBytecodeEntry instanceof XmlLabel)) + .collect(Collectors.toList()); + final List badInstructions = badMethod.instructions() + .stream() + .filter(xmlBytecodeEntry -> !(xmlBytecodeEntry instanceof XmlLabel)) + .collect(Collectors.toList()); for (int j = 0; j < goodInstructions.size(); j++) { final XmlBytecodeEntry goodEntry = goodInstructions.get(j); final XmlBytecodeEntry badEntry = badInstructions.get(j); @@ -189,10 +198,11 @@ void findTheProblem() { if (goodInstruction.opcode() != badInstruction.opcode()) { throw new IllegalArgumentException( String.format( - "The instructions '%s' and '%s' are differ in '%s'", + "The operands '%s' and '%s' are differ in %n%s%n%s", goodEntry, badEntry, - relative + "file://" + golden.resolve(relative), + "file://" + real.resolve(relative) ) ); } diff --git a/src/test/resources/xmir/disassembled/AssertionsKt$sam$i$org_junit_jupiter_api_function_Executable$0.xmir b/src/test/resources/xmir/disassembled/AssertionsKt$sam$i$org_junit_jupiter_api_function_Executable$0.xmir new file mode 100644 index 00000000..4beb9a45 --- /dev/null +++ b/src/test/resources/xmir/disassembled/AssertionsKt$sam$i$org_junit_jupiter_api_function_Executable$0.xmir @@ -0,0 +1,103 @@ + + + yv66vgAAADQANQEAVG9yZy9qdW5pdC9qdXBpdGVyL2FwaS9Bc3NlcnRpb25zS3Qkc2FtJGkkb3JnX2p1bml0X2p1cGl0ZXJfYXBpX2Z1bmN0aW9uX0V4ZWN1dGFibGUkMAcAAQEAEGphdmEvbGFuZy9PYmplY3QHAAMBAClvcmcvanVuaXQvanVwaXRlci9hcGkvZnVuY3Rpb24vRXhlY3V0YWJsZQcABQEAEUxrb3RsaW4vTWV0YWRhdGE7AQACbXYDAAAAAQMAAAASAQACYnYDAAAAAAMAAAADAQABawEAIm9yZy9qdW5pdC9qdXBpdGVyL2FwaS9Bc3NlcnRpb25zS3QHAA8BAAdjb252ZXJ0AQAoKExqYXZhL3V0aWwvQ29sbGVjdGlvbjspTGphdmEvdXRpbC9MaXN0OwwAEQASAQAIZnVuY3Rpb24BACBMa290bGluL2p2bS9mdW5jdGlvbnMvRnVuY3Rpb24wOwEABjxpbml0PgEAIyhMa290bGluL2p2bS9mdW5jdGlvbnMvRnVuY3Rpb24wOylWAQADKClWDAAWABgKAAQAGQwAFAAVCQACABsBAAdleGVjdXRlAQAea290bGluL2p2bS9mdW5jdGlvbnMvRnVuY3Rpb24wBwAeAQAGaW52b2tlAQAUKClMamF2YS9sYW5nL09iamVjdDsMACAAIQsAHwAiAQALaW52b2tlKC4uLikIACQBAB5rb3RsaW4vanZtL2ludGVybmFsL0ludHJpbnNpY3MHACYBAB1jaGVja0V4cHJlc3Npb25WYWx1ZUlzTm90TnVsbAEAJyhMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL1N0cmluZzspVgwAKAApCgAnACoBAAR0aGlzAQArTG9yZy9qdW5pdC9qdXBpdGVyL2FwaS9mdW5jdGlvbi9FeGVjdXRhYmxlOwEADUFzc2VydGlvbnMua3QBAARDb2RlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAMSW5uZXJDbGFzc2VzAQAPRW5jbG9zaW5nTWV0aG9kAQAKU291cmNlRmlsZQEAGVJ1bnRpbWVWaXNpYmxlQW5ub3RhdGlvbnMAMQACAAQAAQAGAAEQEgAUABUAAAACAAEAFgAXAAEALwAAABYAAgACAAAACiq3ABoqK7UAHLEAAAAAEBEAHQAYAAEALwAAAC8AAwABAAAAESq0ABy5ACMBAFkSJbgAK1exAAAAAQAwAAAADAABAAAAEQAsAC0AAAAEADEAAAAKAAEAAgAAAAAAMQAyAAAABAAQABMAMwAAAAIALgA0AAAAJwABAAcAAwAIWwADSQAJSQAJSQAKAAtbAANJAAlJAAxJAA0ADkkADQ== + + + + + + + package + org.junit.jupiter.api + org.junit.jupiter.api + + + alias + org.eolang.jeo.opcode + org.eolang.jeo.opcode + + + alias + org.eolang.jeo.label + org.eolang.jeo.label + + + + + 00 00 00 00 00 00 00 34 + 00 00 00 00 00 00 00 31 + 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 + + 6F 72 67 2F 6A 75 6E 69 74 2F 6A 75 70 69 74 65 72 2F 61 70 69 2F 66 75 6E 63 74 69 6F 6E 2F 45 78 65 63 75 74 61 62 6C 65 + + + 00 00 00 00 00 00 10 12 + 4C 6B 6F 74 6C 69 6E 2F 6A 76 6D 2F 66 75 6E 63 74 69 6F 6E 73 2F 46 75 6E 63 74 69 6F 6E 30 3B + + + + + 00 00 00 00 00 00 10 11 + 28 29 56 + + + + 00 00 00 00 00 00 00 03 + 00 00 00 00 00 00 00 01 + + + + 37 65 37 65 35 62 63 31 2D 37 35 63 32 2D 34 65 33 37 2D 39 63 38 33 2D 66 32 36 63 34 65 35 38 37 31 35 33 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 B4 + 6F 72 67 2F 6A 75 6E 69 74 2F 6A 75 70 69 74 65 72 2F 61 70 69 2F 41 73 73 65 72 74 69 6F 6E 73 4B 74 24 73 61 6D 24 69 24 6F 72 67 5F 6A 75 6E 69 74 5F 6A 75 70 69 74 65 72 5F 61 70 69 5F 66 75 6E 63 74 69 6F 6E 5F 45 78 65 63 75 74 61 62 6C 65 24 30 + 66 75 6E 63 74 69 6F 6E + 4C 6B 6F 74 6C 69 6E 2F 6A 76 6D 2F 66 75 6E 63 74 69 6F 6E 73 2F 46 75 6E 63 74 69 6F 6E 30 3B + + + 00 00 00 00 00 00 00 B9 + 6B 6F 74 6C 69 6E 2F 6A 76 6D 2F 66 75 6E 63 74 69 6F 6E 73 2F 46 75 6E 63 74 69 6F 6E 30 + 69 6E 76 6F 6B 65 + 28 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B + 01 + + + 00 00 00 00 00 00 00 59 + + + 00 00 00 00 00 00 00 12 + 69 6E 76 6F 6B 65 28 2E 2E 2E 29 + + + 00 00 00 00 00 00 00 B8 + 6B 6F 74 6C 69 6E 2F 6A 76 6D 2F 69 6E 74 65 72 6E 61 6C 2F 49 6E 74 72 69 6E 73 69 63 73 + 63 68 65 63 6B 45 78 70 72 65 73 73 69 6F 6E 56 61 6C 75 65 49 73 4E 6F 74 4E 75 6C 6C + 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 29 56 + 00 + + + 00 00 00 00 00 00 00 57 + + + 00 00 00 00 00 00 00 B1 + + 37 31 64 37 30 36 62 30 2D 62 39 64 63 2D 34 64 32 63 2D 38 36 30 61 2D 66 31 35 33 31 30 31 30 39 38 35 33 + + + + + + diff --git a/src/test/resources/xmir/disassembled/LongArrayAssert.xmir b/src/test/resources/xmir/disassembled/LongArrayAssert.xmir index 7c4d5ab4..2ad80aac 100644 --- a/src/test/resources/xmir/disassembled/LongArrayAssert.xmir +++ b/src/test/resources/xmir/disassembled/LongArrayAssert.xmir @@ -46,6 +46,7 @@ name="arg__Ljava/util/concurrent/atomic/AtomicLongArray;__0"/> + 30 34 39 30 62 35 39 30 2D 33 65 35 66 2D 34 39 39 39 2D 62 63 35 36 2D 64 39 38 62 38 62 36 63 38 65 63 37 00 00 00 00 00 00 00 19 00 00 00 00 00 00 00 00 @@ -68,9 +69,11 @@ 28 5B 4A 29 56 00 + 34 30 35 37 30 64 62 35 2D 64 61 36 34 2D 34 33 65 61 2D 62 30 63 31 2D 64 39 39 64 38 38 35 63 37 37 38 66 00 00 00 00 00 00 00 B1 + 61 30 30 31 65 30 33 62 2D 63 30 36 39 2D 34 30 31 33 2D 39 38 34 32 2D 61 62 64 30 64 65 35 64 33 61 61 34 From 9b476a869eaa84ad264605d37b8cfea2260b43df Mon Sep 17 00:00:00 2001 From: volodya-lombrozo Date: Mon, 27 May 2024 17:28:36 +0300 Subject: [PATCH 28/41] feat(#229): try to add Linked and NewAddress classes --- .../java/org/eolang/opeo/ast/Constructor.java | 46 ++++++--- .../java/org/eolang/opeo/ast/Duplicate.java | 30 ++++-- src/main/java/org/eolang/opeo/ast/Linked.java | 8 ++ .../java/org/eolang/opeo/ast/NewAddress.java | 58 ++++++++++++ .../java/org/eolang/opeo/ast/Reference.java | 8 +- .../eolang/opeo/compilation/XmirParser.java | 23 +++-- .../handlers/InvokespecialHandler.java | 18 ++-- .../decompilation/handlers/NewHandler.java | 3 +- src/test/java/it/JeoAndOpeoTest.java | 5 +- .../org/eolang/opeo/ast/ConstructorTest.java | 6 +- .../org/eolang/opeo/ast/InvocationTest.java | 3 +- .../org/eolang/opeo/ast/NewAddressTest.java | 52 +++++++++++ src/test/resources/xmir/disassembled/App.xmir | 93 +++++++++++++++++++ 13 files changed, 307 insertions(+), 46 deletions(-) create mode 100644 src/main/java/org/eolang/opeo/ast/Linked.java create mode 100644 src/main/java/org/eolang/opeo/ast/NewAddress.java create mode 100644 src/test/java/org/eolang/opeo/ast/NewAddressTest.java create mode 100644 src/test/resources/xmir/disassembled/App.xmir diff --git a/src/main/java/org/eolang/opeo/ast/Constructor.java b/src/main/java/org/eolang/opeo/ast/Constructor.java index 2cf3b91d..d82855d7 100644 --- a/src/main/java/org/eolang/opeo/ast/Constructor.java +++ b/src/main/java/org/eolang/opeo/ast/Constructor.java @@ -40,7 +40,7 @@ public final class Constructor implements AstNode, Typed { /** * Constructor type. */ - private final String ctype; + private final AstNode ctype; /** * Constructor attributes. @@ -98,9 +98,17 @@ public Constructor( final Attributes attrs, final List args ) { - this.ctype = type; - this.attributes = attrs; - this.arguments = args; + this(new NewAddress(type), attrs, args); + } + + public Constructor( + final AstNode ctype, + final Attributes attributes, + final List arguments + ) { + this.ctype = ctype; + this.attributes = attributes; + this.arguments = arguments; } @Override @@ -109,9 +117,7 @@ public Iterable toXmir() { directives.add("o") .attr("base", ".new") .attr("scope", this.attributes) - .add("o") - .attr("base", this.ctype) - .up(); + .append(this.ctype.toXmir()); this.arguments.stream().map(AstNode::toXmir).forEach(directives::append); return directives.up(); } @@ -119,13 +125,14 @@ public Iterable toXmir() { @Override public List opcodes() { final List res = new ArrayList<>(0); - res.add(new Opcode(Opcodes.NEW, this.ctype)); - res.add(new Opcode(Opcodes.DUP)); + res.addAll(this.ctype.opcodes()); +// res.add(new Opcode(Opcodes.NEW, this.ctype)); +// res.add(new Opcode(Opcodes.DUP)); this.arguments.stream().map(AstNode::opcodes).forEach(res::addAll); res.add( new Opcode( Opcodes.INVOKESPECIAL, - this.ctype, + this.opcodeType(this.ctype), "", this.attributes.descriptor(), this.attributes.interfaced() @@ -136,6 +143,23 @@ public List opcodes() { @Override public Type type() { - return Type.getObjectType(this.ctype); + return ((Typed) this.ctype).type(); + } + + private String opcodeType(final AstNode node) { + if (node instanceof NewAddress) { + return ((NewAddress) node).typeString(); + } else if (node instanceof Reference) { + return opcodeType(((Reference) node).object()); + } else if (node instanceof Duplicate) { + return opcodeType(((Duplicate) node).origin()); + } else { + throw new IllegalStateException( + String.format( + "Unexpected node type: %s", + node.getClass().getCanonicalName() + ) + ); + } } } diff --git a/src/main/java/org/eolang/opeo/ast/Duplicate.java b/src/main/java/org/eolang/opeo/ast/Duplicate.java index 5caf2407..b6ab9298 100644 --- a/src/main/java/org/eolang/opeo/ast/Duplicate.java +++ b/src/main/java/org/eolang/opeo/ast/Duplicate.java @@ -3,6 +3,7 @@ import java.util.Collections; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; import java.util.stream.Stream; import org.objectweb.asm.Opcodes; @@ -10,15 +11,15 @@ import org.xembly.Directive; import org.xembly.Directives; -public final class Duplicate implements AstNode, Typed { +public final class Duplicate implements AstNode, Typed, Linked { private final AtomicBoolean convertedToOpcodes; private final AtomicBoolean convertedToXmir; - private final AstNode original; + private final AtomicReference original; public Duplicate(final AstNode original) { - this.original = original; + this.original = new AtomicReference<>(original); this.convertedToOpcodes = new AtomicBoolean(false); this.convertedToXmir = new AtomicBoolean(false); } @@ -29,15 +30,16 @@ public List opcodes() { return Collections.emptyList(); } return Stream.concat( - this.original.opcodes().stream(), + this.original.get().opcodes().stream(), Stream.of(new Opcode(Opcodes.DUP)) ).collect(Collectors.toList()); +// return this.original.get().opcodes().stream().collect(Collectors.toList()); } @Override public Type type() { - if (this.original instanceof Typed) { - return ((Typed) this.original).type(); + if (this.original.get() instanceof Typed) { + return ((Typed) this.original.get()).type(); } else { throw new IllegalArgumentException(); } @@ -45,17 +47,27 @@ public Type type() { @Override public Iterable toXmir() { - if (convertedToXmir.getAndSet(true)) { + if (this.convertedToXmir.getAndSet(true)) { return Collections.emptyList(); } return new Directives() .add("o") .attr("base", "duplicated") - .append(this.original.toXmir()) + .append(this.original.get().toXmir()) .up(); } public AstNode origin() { - return this.original; + return this.original.get(); + } + + @Override + public void link(final AstNode node) { + this.original.set(node); + } + + @Override + public AstNode current() { + return this.original.get(); } } diff --git a/src/main/java/org/eolang/opeo/ast/Linked.java b/src/main/java/org/eolang/opeo/ast/Linked.java new file mode 100644 index 00000000..b5b419d0 --- /dev/null +++ b/src/main/java/org/eolang/opeo/ast/Linked.java @@ -0,0 +1,8 @@ +package org.eolang.opeo.ast; + +public interface Linked { + + void link(AstNode node); + + AstNode current(); +} diff --git a/src/main/java/org/eolang/opeo/ast/NewAddress.java b/src/main/java/org/eolang/opeo/ast/NewAddress.java new file mode 100644 index 00000000..14602292 --- /dev/null +++ b/src/main/java/org/eolang/opeo/ast/NewAddress.java @@ -0,0 +1,58 @@ +package org.eolang.opeo.ast; + +import java.util.Collections; +import java.util.List; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.eolang.jeo.representation.directives.DirectivesData; +import org.eolang.jeo.representation.xmir.HexString; +import org.eolang.jeo.representation.xmir.XmlNode; +import org.objectweb.asm.Opcodes; +import org.objectweb.asm.Type; +import org.xembly.Directive; +import org.xembly.Directives; + +/** + * Same as reference? + */ +@ToString +@EqualsAndHashCode +public final class NewAddress implements AstNode, Typed { + + private final String type; + + public NewAddress(final XmlNode node) { + this(NewAddress.parse(node)); + } + + public NewAddress(final String type) { + this.type = type; + } + + @Override + public List opcodes() { + return Collections.singletonList(new Opcode(Opcodes.NEW, this.type)); + } + + @Override + public Iterable toXmir() { + return new Directives() + .add("o") + .attr("base", ".new-type") + .append(new DirectivesData(this.type)) + .up(); + } + + private static String parse(final XmlNode node) { + return new HexString(node.firstChild().text()).decode(); + } + + @Override + public Type type() { + return Type.getObjectType(this.type); + } + + public String typeString() { + return this.type; + } +} diff --git a/src/main/java/org/eolang/opeo/ast/Reference.java b/src/main/java/org/eolang/opeo/ast/Reference.java index dfe87483..72f41356 100644 --- a/src/main/java/org/eolang/opeo/ast/Reference.java +++ b/src/main/java/org/eolang/opeo/ast/Reference.java @@ -32,7 +32,7 @@ * Object reference in the stack. * @since 0.1 */ -public final class Reference implements AstNode, Typed { +public final class Reference implements AstNode, Typed, Linked { /** * Object itself. @@ -67,10 +67,16 @@ public Reference(final AtomicReference ref) { * Link this reference with the given object. * @param node Object to link with. */ + @Override public void link(final AstNode node) { this.ref.set(node); } + @Override + public AstNode current() { + return this.ref.get(); + } + /** * Get the object. * @return Object. diff --git a/src/main/java/org/eolang/opeo/compilation/XmirParser.java b/src/main/java/org/eolang/opeo/compilation/XmirParser.java index 279955c7..c95cad28 100644 --- a/src/main/java/org/eolang/opeo/compilation/XmirParser.java +++ b/src/main/java/org/eolang/opeo/compilation/XmirParser.java @@ -49,6 +49,7 @@ import org.eolang.opeo.ast.Label; import org.eolang.opeo.ast.Literal; import org.eolang.opeo.ast.LocalVariable; +import org.eolang.opeo.ast.NewAddress; import org.eolang.opeo.ast.Opcode; import org.eolang.opeo.ast.Popped; import org.eolang.opeo.ast.RawXml; @@ -160,6 +161,8 @@ private AstNode node(final XmlNode node) { ); if (".ignore-result".equals(base)) { result = new Popped(this.node(node.firstChild())); + } else if (".new-type".equals(base)) { + result = new NewAddress(node); } else if ("duplicated".equals(base)) { result = new Duplicate(this.node(node.firstChild())); } else if (".plus".equals(base)) { @@ -243,14 +246,16 @@ private AstNode node(final XmlNode node) { result = new LocalVariable(node); } else if (".new".equals(base)) { final List inner = node.children().collect(Collectors.toList()); - final String type = inner.get(0).attribute("base").orElseThrow( - () -> new IllegalArgumentException( - String.format( - "Can't find type of '%s'", - base - ) - ) - ); +// final String type = inner.get(0).attribute("base").orElseThrow( +// () -> new IllegalArgumentException( +// String.format( +// "Can't find type of '%s'", +// base +// ) +// ) +// ); + + final AstNode target = node(inner.get(0)); final List args = this.args(inner); final String descriptor = node.attribute("scope") .map(Attributes::new) @@ -260,7 +265,7 @@ private AstNode node(final XmlNode node) { final Attributes attributes = new Attributes() .descriptor(descriptor) .interfaced(false); - result = new Constructor(type, attributes, args); + result = new Constructor(target, attributes, args); } else if (".array-node".equals(base)) { final List children = node.children().collect(Collectors.toList()); final String type = new HexString(children.get(0).text()).decode(); diff --git a/src/main/java/org/eolang/opeo/decompilation/handlers/InvokespecialHandler.java b/src/main/java/org/eolang/opeo/decompilation/handlers/InvokespecialHandler.java index f673eb91..1c29e75f 100644 --- a/src/main/java/org/eolang/opeo/decompilation/handlers/InvokespecialHandler.java +++ b/src/main/java/org/eolang/opeo/decompilation/handlers/InvokespecialHandler.java @@ -30,6 +30,7 @@ import org.eolang.opeo.ast.Constructor; import org.eolang.opeo.ast.Duplicate; import org.eolang.opeo.ast.Labeled; +import org.eolang.opeo.ast.Linked; import org.eolang.opeo.ast.Reference; import org.eolang.opeo.ast.Super; import org.eolang.opeo.ast.This; @@ -65,13 +66,16 @@ public void handle(final DecompilerState state) { new Super(target, args, descriptor, type, name) ); } else { + final Linked linked = this.findLinked(target); final AstNode constructor = new Constructor( - type, + linked.current(), new Attributes().descriptor(descriptor).interfaced(interfaced), args ); + linked.link(constructor); +// state.stack().push(constructor); + - findRef(target).link(constructor); // if (target instanceof Reference) { // ((Reference) target).link(constructor); // } else if (target instanceof Labeled) { @@ -89,13 +93,11 @@ public void handle(final DecompilerState state) { } } - private Reference findRef(final AstNode node) { - if (node instanceof Reference) { - return (Reference) node; + private Linked findLinked(final AstNode node) { + if (node instanceof Linked) { + return (Linked) node; } else if (node instanceof Labeled) { - return findRef((((Labeled) node).origin())); - } else if (node instanceof Duplicate) { - return findRef((((Duplicate) node).origin())); + return this.findLinked((((Labeled) node).origin())); } else { throw new IllegalStateException(String.format("Can find reference for node %s", node)); } diff --git a/src/main/java/org/eolang/opeo/decompilation/handlers/NewHandler.java b/src/main/java/org/eolang/opeo/decompilation/handlers/NewHandler.java index eab917cc..274b9b49 100644 --- a/src/main/java/org/eolang/opeo/decompilation/handlers/NewHandler.java +++ b/src/main/java/org/eolang/opeo/decompilation/handlers/NewHandler.java @@ -23,6 +23,7 @@ */ package org.eolang.opeo.decompilation.handlers; +import org.eolang.opeo.ast.NewAddress; import org.eolang.opeo.ast.Reference; import org.eolang.opeo.decompilation.DecompilerState; import org.eolang.opeo.decompilation.InstructionHandler; @@ -35,7 +36,7 @@ public final class NewHandler implements InstructionHandler { @Override public void handle(final DecompilerState state) { - state.stack().push(new Reference()); + state.stack().push(new NewAddress(state.operand(0).toString())); } } diff --git a/src/test/java/it/JeoAndOpeoTest.java b/src/test/java/it/JeoAndOpeoTest.java index 4bd9341c..bc5da392 100644 --- a/src/test/java/it/JeoAndOpeoTest.java +++ b/src/test/java/it/JeoAndOpeoTest.java @@ -104,9 +104,10 @@ void compilesAlreadyCompiledAndAssembles(final String path) { @CsvSource({ "xmir/disassembled/AsIsEscapeUtil.xmir", "xmir/disassembled/LongArrayAssert.xmir", - "xmir/disassembled/AssertionsKt$sam$i$org_junit_jupiter_api_function_Executable$0.xmir" + "xmir/disassembled/AssertionsKt$sam$i$org_junit_jupiter_api_function_Executable$0.xmir", + "xmir/disassembled/App.xmir" }) - void decompilesCompilesAndKeppsTheSameInstructions(final String path) throws Exception { + void decompilesCompilesAndKeepsTheSameInstructions(final String path) throws Exception { final XMLDocument original = new XMLDocument(new BytesOf(new ResourceOf(path)).asBytes()); final XML decompiled = new JeoDecompiler(original).decompile(); System.out.println(decompiled); diff --git a/src/test/java/org/eolang/opeo/ast/ConstructorTest.java b/src/test/java/org/eolang/opeo/ast/ConstructorTest.java index 2623ae6d..7b7108a2 100644 --- a/src/test/java/org/eolang/opeo/ast/ConstructorTest.java +++ b/src/test/java/org/eolang/opeo/ast/ConstructorTest.java @@ -44,7 +44,7 @@ void transformsIntoXmir() throws ImpossibleModificationException { String.join( "\n", "", - " ", + " 41", " 66 69 72 73 74", " 73 65 63 6F 6E 64", " 00 00 00 00 00 00 00 03", @@ -62,8 +62,8 @@ void transformsIntoXmir() throws ImpossibleModificationException { ).xml(), XhtmlMatchers.hasXPaths( "/o[@base='.new']", - "/o[@base='.new']/o[@base='A']", - "/o[@base='.new']/o[@base='string' and @data='bytes']", + "/o[@base='.new']/o[@base='.new-type']", + "/o[@base='.new']/o[@base='.new-type']/o[@base='string' and @data='bytes' and text()='41']", "/o[@base='.new']/o[@base='int' and @data='bytes']" ) ); diff --git a/src/test/java/org/eolang/opeo/ast/InvocationTest.java b/src/test/java/org/eolang/opeo/ast/InvocationTest.java index 465ebbdc..e02b0752 100644 --- a/src/test/java/org/eolang/opeo/ast/InvocationTest.java +++ b/src/test/java/org/eolang/opeo/ast/InvocationTest.java @@ -48,9 +48,8 @@ void transformsToXmir() throws ImpossibleModificationException { "\n", "", " ", - " ", + " 62 61 7A", " ", - " 62 61 7A", "" ) ), diff --git a/src/test/java/org/eolang/opeo/ast/NewAddressTest.java b/src/test/java/org/eolang/opeo/ast/NewAddressTest.java new file mode 100644 index 00000000..4190c562 --- /dev/null +++ b/src/test/java/org/eolang/opeo/ast/NewAddressTest.java @@ -0,0 +1,52 @@ +package org.eolang.opeo.ast; + +import org.eolang.jeo.representation.xmir.XmlNode; +import org.hamcrest.MatcherAssert; +import org.hamcrest.Matchers; +import org.junit.jupiter.api.Test; +import org.objectweb.asm.Opcodes; +import org.xembly.ImpossibleModificationException; +import org.xembly.Xembler; + +class NewAddressTest { + + private static final String XML = String.join( + "\n", + "", + "", + " 53 6F 6D 65 54 79 70 65", + "", + "" + ); + private static final String TYPE = "SomeType"; + + @Test + void convertsToXmir() throws ImpossibleModificationException { + MatcherAssert.assertThat( + "We expect, that new address will be successfully converted to XMIR", + new Xembler(new NewAddress(NewAddressTest.TYPE).toXmir()).xml(), + Matchers.equalTo(NewAddressTest.XML) + ); + } + + @Test + void createsFromXmir() { + MatcherAssert.assertThat( + "We expect, that new address will be successfully created from XMIR", + new NewAddress(new XmlNode(NewAddressTest.XML)), + Matchers.equalTo(new NewAddress(NewAddressTest.TYPE)) + ); + } + + @Test + void convertsToOpcodes() { + MatcherAssert.assertThat( + "We expect, that new address will be successfully converted to opcodes", + new NewAddress(NewAddressTest.TYPE).opcodes(), + Matchers.contains( + new Opcode(Opcodes.NEW, NewAddressTest.TYPE) + ) + ); + } + +} \ No newline at end of file diff --git a/src/test/resources/xmir/disassembled/App.xmir b/src/test/resources/xmir/disassembled/App.xmir new file mode 100644 index 00000000..2ec9af8b --- /dev/null +++ b/src/test/resources/xmir/disassembled/App.xmir @@ -0,0 +1,93 @@ + + + yv66vgAAADcAHwoAAgADBwAEDAAFAAYBABBqYXZhL2xhbmcvT2JqZWN0AQAGPGluaXQ+AQADKClWBwAIAQAWb3JnL2VvbGFuZy9iZW5jaG1hcmsvQgcACgEAFm9yZy9lb2xhbmcvYmVuY2htYXJrL0EKAAkADAwABQANAQAEKEkpVgoABwAPDAAFABABABsoTG9yZy9lb2xhbmcvYmVuY2htYXJrL0Y7KVYKAAcAEgwAEwAUAQADYmFyAQADKClJBwAWAQAYb3JnL2VvbGFuZy9iZW5jaG1hcmsvQXBwAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBABpMb3JnL2VvbGFuZy9iZW5jaG1hcmsvQXBwOwEAA3J1bgEAClNvdXJjZUZpbGUBAAhBcHAuamF2YQAgABUAAgAAAAAAAgAAAAUABgABABcAAAAvAAEAAQAAAAUqtwABsQAAAAIAGAAAAAYAAQAAABoAGQAAAAwAAQAAAAUAGgAbAAAAAAAcABQAAQAXAAAAPgAFAAEAAAAUuwAHWbsACVkQKrcAC7cADrYAEawAAAACABgAAAAGAAEAAAAcABkAAAAMAAEAAAAUABoAGwAAAAEAHQAAAAIAHg== + + + + + + package + org.eolang.benchmark + org.eolang.benchmark + + + alias + org.eolang.jeo.opcode + org.eolang.jeo.opcode + + + alias + org.eolang.jeo.label + org.eolang.jeo.label + + + + + 00 00 00 00 00 00 00 37 + 00 00 00 00 00 00 00 20 + 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 + + + 00 00 00 00 00 00 00 00 + 28 29 49 + + + + 00 00 00 00 00 00 00 05 + 00 00 00 00 00 00 00 01 + + + + + 00 00 00 00 00 00 00 BB + 6F 72 67 2F 65 6F 6C 61 6E 67 2F 62 65 6E 63 68 6D 61 72 6B 2F 42 + + + 00 00 00 00 00 00 00 59 + + + 00 00 00 00 00 00 00 BB + 6F 72 67 2F 65 6F 6C 61 6E 67 2F 62 65 6E 63 68 6D 61 72 6B 2F 41 + + + 00 00 00 00 00 00 00 59 + + + 00 00 00 00 00 00 00 10 + 00 00 00 00 00 00 00 2A + + + 00 00 00 00 00 00 00 B7 + 6F 72 67 2F 65 6F 6C 61 6E 67 2F 62 65 6E 63 68 6D 61 72 6B 2F 41 + 3C 69 6E 69 74 3E + 28 49 29 56 + 00 + + + 00 00 00 00 00 00 00 B7 + 6F 72 67 2F 65 6F 6C 61 6E 67 2F 62 65 6E 63 68 6D 61 72 6B 2F 42 + 3C 69 6E 69 74 3E + 28 4C 6F 72 67 2F 65 6F 6C 61 6E 67 2F 62 65 6E 63 68 6D 61 72 6B 2F 46 3B 29 56 + 00 + + + 00 00 00 00 00 00 00 B6 + 6F 72 67 2F 65 6F 6C 61 6E 67 2F 62 65 6E 63 68 6D 61 72 6B 2F 42 + 62 61 72 + 28 29 49 + 00 + + + 00 00 00 00 00 00 00 AC + + + + + + + From 45332400d55b661752464b02da0d5e609f4dcb5b Mon Sep 17 00:00:00 2001 From: volodya-lombrozo Date: Mon, 27 May 2024 19:45:28 +0300 Subject: [PATCH 29/41] feat(#229): fix the bug related to LDC instruction --- .../java/org/eolang/opeo/ast/Constant.java | 48 +++++++++++++ .../java/org/eolang/opeo/ast/Literal.java | 4 ++ .../eolang/opeo/compilation/XmirParser.java | 3 + .../decompilation/handlers/DupHandler.java | 2 +- .../handlers/InvokespecialHandler.java | 8 +-- .../decompilation/handlers/LdcHandler.java | 4 +- .../handlers/StoreToArrayHandler.java | 1 + src/test/java/it/JeoAndOpeoTest.java | 3 +- .../org/eolang/opeo/ast/InvocationTest.java | 25 ++++--- .../decompilation/DecompilerMachineTest.java | 3 +- .../xmir/disassembled/SmartLifecycle.xmir | 69 +++++++++++++++++++ 11 files changed, 151 insertions(+), 19 deletions(-) create mode 100644 src/main/java/org/eolang/opeo/ast/Constant.java create mode 100644 src/test/resources/xmir/disassembled/SmartLifecycle.xmir diff --git a/src/main/java/org/eolang/opeo/ast/Constant.java b/src/main/java/org/eolang/opeo/ast/Constant.java new file mode 100644 index 00000000..ac49b414 --- /dev/null +++ b/src/main/java/org/eolang/opeo/ast/Constant.java @@ -0,0 +1,48 @@ +package org.eolang.opeo.ast; + +import java.util.Collections; +import java.util.List; +import org.eolang.jeo.representation.DataType; +import org.eolang.jeo.representation.directives.DirectivesData; +import org.eolang.jeo.representation.xmir.XmlNode; +import org.objectweb.asm.Opcodes; +import org.objectweb.asm.Type; +import org.xembly.Directive; +import org.xembly.Directives; + +public final class Constant implements AstNode, Typed { + + private final Object value; + + public Constant(final XmlNode node) { + this(parse(node)); + } + + public Constant(final Object value) { + this.value = value; + } + + @Override + public List opcodes() { + return Collections.singletonList(new Opcode(Opcodes.LDC, this.value)); + } + + @Override + public Iterable toXmir() { + return new Directives().add("o") + .attr("base", "load-constant") + .append(new DirectivesData(this.value)) + .up(); + } + + @Override + public Type type() { + return Type.getType(this.value.getClass()); + } + + private static Object parse(final XmlNode node) { + final XmlNode child = node.firstChild(); + return DataType.find(child.attribute("base").orElseThrow()) + .decode(child.text()); + } +} diff --git a/src/main/java/org/eolang/opeo/ast/Literal.java b/src/main/java/org/eolang/opeo/ast/Literal.java index 7003d7a0..8e5930d8 100644 --- a/src/main/java/org/eolang/opeo/ast/Literal.java +++ b/src/main/java/org/eolang/opeo/ast/Literal.java @@ -198,6 +198,10 @@ public Type type() { return this.ltype; } + public Object value() { + return this.lvalue; + } + /** * Convert integer into an opcode. * @param value Integer value. diff --git a/src/main/java/org/eolang/opeo/compilation/XmirParser.java b/src/main/java/org/eolang/opeo/compilation/XmirParser.java index c95cad28..4089209b 100644 --- a/src/main/java/org/eolang/opeo/compilation/XmirParser.java +++ b/src/main/java/org/eolang/opeo/compilation/XmirParser.java @@ -38,6 +38,7 @@ import org.eolang.opeo.ast.Cast; import org.eolang.opeo.ast.ClassField; import org.eolang.opeo.ast.ClassName; +import org.eolang.opeo.ast.Constant; import org.eolang.opeo.ast.Constructor; import org.eolang.opeo.ast.ConstructorDescriptor; import org.eolang.opeo.ast.Duplicate; @@ -161,6 +162,8 @@ private AstNode node(final XmlNode node) { ); if (".ignore-result".equals(base)) { result = new Popped(this.node(node.firstChild())); + } else if ("load-constant".equals(base)) { + result = new Constant(node); } else if (".new-type".equals(base)) { result = new NewAddress(node); } else if ("duplicated".equals(base)) { diff --git a/src/main/java/org/eolang/opeo/decompilation/handlers/DupHandler.java b/src/main/java/org/eolang/opeo/decompilation/handlers/DupHandler.java index b5e318eb..f2fe8840 100644 --- a/src/main/java/org/eolang/opeo/decompilation/handlers/DupHandler.java +++ b/src/main/java/org/eolang/opeo/decompilation/handlers/DupHandler.java @@ -39,7 +39,7 @@ public final class DupHandler implements InstructionHandler { public void handle(final DecompilerState state) { final OperandStack stack = state.stack(); stack.push(new Duplicate(stack.pop())); - stack.dup(); +// stack.dup(); } } diff --git a/src/main/java/org/eolang/opeo/decompilation/handlers/InvokespecialHandler.java b/src/main/java/org/eolang/opeo/decompilation/handlers/InvokespecialHandler.java index 1c29e75f..06aa9896 100644 --- a/src/main/java/org/eolang/opeo/decompilation/handlers/InvokespecialHandler.java +++ b/src/main/java/org/eolang/opeo/decompilation/handlers/InvokespecialHandler.java @@ -66,14 +66,14 @@ public void handle(final DecompilerState state) { new Super(target, args, descriptor, type, name) ); } else { - final Linked linked = this.findLinked(target); +// final Linked linked = this.findLinked(target); final AstNode constructor = new Constructor( - linked.current(), + target, new Attributes().descriptor(descriptor).interfaced(interfaced), args ); - linked.link(constructor); -// state.stack().push(constructor); +// linked.link(constructor); + state.stack().push(constructor); // if (target instanceof Reference) { diff --git a/src/main/java/org/eolang/opeo/decompilation/handlers/LdcHandler.java b/src/main/java/org/eolang/opeo/decompilation/handlers/LdcHandler.java index 550acb4f..9605c933 100644 --- a/src/main/java/org/eolang/opeo/decompilation/handlers/LdcHandler.java +++ b/src/main/java/org/eolang/opeo/decompilation/handlers/LdcHandler.java @@ -23,6 +23,7 @@ */ package org.eolang.opeo.decompilation.handlers; +import org.eolang.opeo.ast.Constant; import org.eolang.opeo.ast.Literal; import org.eolang.opeo.decompilation.DecompilerState; import org.eolang.opeo.decompilation.InstructionHandler; @@ -35,7 +36,8 @@ public final class LdcHandler implements InstructionHandler { @Override public void handle(final DecompilerState state) { - state.stack().push(new Literal(state.operand(0))); + final Object operand = state.operand(0); + state.stack().push(new Constant(operand)); } } diff --git a/src/main/java/org/eolang/opeo/decompilation/handlers/StoreToArrayHandler.java b/src/main/java/org/eolang/opeo/decompilation/handlers/StoreToArrayHandler.java index 30553f15..e82f353c 100644 --- a/src/main/java/org/eolang/opeo/decompilation/handlers/StoreToArrayHandler.java +++ b/src/main/java/org/eolang/opeo/decompilation/handlers/StoreToArrayHandler.java @@ -47,6 +47,7 @@ public void handle(final DecompilerState state) { final AstNode array = state.stack().pop(); final Reference ref = findRef(array); ref.link(new StoreArray(ref.object(), index, value)); + state.stack().push(ref); } private Reference findRef(final AstNode node) { diff --git a/src/test/java/it/JeoAndOpeoTest.java b/src/test/java/it/JeoAndOpeoTest.java index bc5da392..722a9d87 100644 --- a/src/test/java/it/JeoAndOpeoTest.java +++ b/src/test/java/it/JeoAndOpeoTest.java @@ -105,7 +105,8 @@ void compilesAlreadyCompiledAndAssembles(final String path) { "xmir/disassembled/AsIsEscapeUtil.xmir", "xmir/disassembled/LongArrayAssert.xmir", "xmir/disassembled/AssertionsKt$sam$i$org_junit_jupiter_api_function_Executable$0.xmir", - "xmir/disassembled/App.xmir" + "xmir/disassembled/App.xmir", + "xmir/disassembled/SmartLifecycle.xmir", }) void decompilesCompilesAndKeepsTheSameInstructions(final String path) throws Exception { final XMLDocument original = new XMLDocument(new BytesOf(new ResourceOf(path)).asBytes()); diff --git a/src/test/java/org/eolang/opeo/ast/InvocationTest.java b/src/test/java/org/eolang/opeo/ast/InvocationTest.java index e02b0752..1805ce1f 100644 --- a/src/test/java/org/eolang/opeo/ast/InvocationTest.java +++ b/src/test/java/org/eolang/opeo/ast/InvocationTest.java @@ -24,6 +24,7 @@ package org.eolang.opeo.ast; import com.jcabi.matchers.XhtmlMatchers; +import com.jcabi.xml.XMLDocument; import org.eolang.opeo.compilation.HasInstructions; import org.hamcrest.MatcherAssert; import org.junit.jupiter.api.Test; @@ -41,9 +42,17 @@ final class InvocationTest { @Test void transformsToXmir() throws ImpossibleModificationException { + final String actual = new Xembler( + new Invocation( + new Constructor("foo"), + "bar", + new Literal("baz") + ).toXmir(), + new Transformers.Node() + ).xml(); MatcherAssert.assertThat( String.format( - "We expect the following XMIRl to be generated:%n%s%n", + "We expect the following XMIRl to be generated:%n%s%n, but was: %n%s%n", String.join( "\n", "", @@ -51,18 +60,12 @@ void transformsToXmir() throws ImpossibleModificationException { " 62 61 7A", " ", "" - ) + ), + new XMLDocument(actual) ), - new Xembler( - new Invocation( - new Constructor("foo"), - "bar", - new Literal("baz") - ).toXmir(), - new Transformers.Node() - ).xml(), + actual, XhtmlMatchers.hasXPaths( - "/o[@base='.bar']/o[@base='.new']/o[@base='foo']", + "/o[@base='.bar']/o[@base='.new']/o[@base='.new-type']/o[text()='66 6F 6F']", "/o[@base='.bar']/o[@base='string' and @data='bytes' and text()='62 61 7A']" ) ); diff --git a/src/test/java/org/eolang/opeo/decompilation/DecompilerMachineTest.java b/src/test/java/org/eolang/opeo/decompilation/DecompilerMachineTest.java index 84ef5eb9..e938fff1 100644 --- a/src/test/java/org/eolang/opeo/decompilation/DecompilerMachineTest.java +++ b/src/test/java/org/eolang/opeo/decompilation/DecompilerMachineTest.java @@ -33,6 +33,7 @@ import org.eolang.opeo.ast.AstNode; import org.eolang.opeo.ast.Attributes; import org.eolang.opeo.ast.ClassField; +import org.eolang.opeo.ast.Constant; import org.eolang.opeo.ast.Field; import org.eolang.opeo.ast.FieldAssignment; import org.eolang.opeo.ast.Invocation; @@ -401,7 +402,7 @@ void decompilesVarargInvocation() { ) .owner("java/io/PrintStream") .interfaced(false), - new Literal("Number is %s"), + new Constant("Number is %s"), new StoreArray( new ArrayConstructor( new Literal(1), diff --git a/src/test/resources/xmir/disassembled/SmartLifecycle.xmir b/src/test/resources/xmir/disassembled/SmartLifecycle.xmir new file mode 100644 index 00000000..bffc980a --- /dev/null +++ b/src/test/resources/xmir/disassembled/SmartLifecycle.xmir @@ -0,0 +1,69 @@ + + + yv66vgAAADQAJwcAHAsABAAdCwAeAB8HACADf////wcAIQcAIgcAIwEADURFRkFVTFRfUEhBU0UBAAFJAQANQ29uc3RhbnRWYWx1ZQEADWlzQXV0b1N0YXJ0dXABAAMoKVoBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAEdGhpcwEALExvcmcvc3ByaW5nZnJhbWV3b3JrL2NvbnRleHQvU21hcnRMaWZlY3ljbGU7AQAEc3RvcAEAFyhMamF2YS9sYW5nL1J1bm5hYmxlOylWAQAIY2FsbGJhY2sBABRMamF2YS9sYW5nL1J1bm5hYmxlOwEAEE1ldGhvZFBhcmFtZXRlcnMBAAhnZXRQaGFzZQEAAygpSQEAClNvdXJjZUZpbGUBABNTbWFydExpZmVjeWNsZS5qYXZhAQARamF2YS9sYW5nL0ludGVnZXIMABMAJAcAJQwAJgAkAQAqb3JnL3NwcmluZ2ZyYW1ld29yay9jb250ZXh0L1NtYXJ0TGlmZWN5Y2xlAQAQamF2YS9sYW5nL09iamVjdAEAJW9yZy9zcHJpbmdmcmFtZXdvcmsvY29udGV4dC9MaWZlY3ljbGUBACJvcmcvc3ByaW5nZnJhbWV3b3JrL2NvbnRleHQvUGhhc2VkAQADKClWAQASamF2YS9sYW5nL1J1bm5hYmxlAQADcnVuBgEABAAGAAIABwAIAAEAGQAJAAoAAQALAAAAAgAFAAMAAQAMAA0AAQAOAAAALAABAAEAAAACBKwAAAACAA8AAAAGAAEAAABgABAAAAAMAAEAAAACABEAEgAAAAEAEwAUAAIADgAAAEkAAQACAAAADSq5AAIBACu5AAMBALEAAAACAA8AAAAOAAMAAAB1AAYAdgAMAHcAEAAAABYAAgAAAA0AEQASAAAAAAANABUAFgABABcAAAAFAQAVAAAAAQAYABkAAQAOAAAALQABAAEAAAADEgWsAAAAAgAPAAAABgABAAAAhQAQAAAADAABAAAAAwARABIAAAABABoAAAACABs= + + + + + + package + org.springframework.context + org.springframework.context + + + alias + org.eolang.jeo.opcode + org.eolang.jeo.opcode + + + alias + org.eolang.jeo.label + org.eolang.jeo.label + + + + + 00 00 00 00 00 00 00 34 + 00 00 00 00 00 00 06 01 + 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 + + 6F 72 67 2F 73 70 72 69 6E 67 66 72 61 6D 65 77 6F 72 6B 2F 63 6F 6E 74 65 78 74 2F 4C 69 66 65 63 79 63 6C 65 + 6F 72 67 2F 73 70 72 69 6E 67 66 72 61 6D 65 77 6F 72 6B 2F 63 6F 6E 74 65 78 74 2F 50 68 61 73 65 64 + + + 00 00 00 00 00 00 00 19 + 49 + + 00 00 00 00 7F FF FF FF + + + 00 00 00 00 00 00 00 01 + 28 29 49 + + + + 00 00 00 00 00 00 00 01 + 00 00 00 00 00 00 00 01 + + + + 37 39 63 30 61 33 66 65 2D 38 64 65 38 2D 34 62 35 36 2D 39 35 33 31 2D 61 30 36 30 62 64 39 38 37 64 32 39 + + 00 00 00 00 00 00 00 12 + 00 00 00 00 7F FF FF FF + + + 00 00 00 00 00 00 00 AC + + 65 35 31 38 61 32 34 32 2D 36 63 31 64 2D 34 65 35 34 2D 38 31 39 31 2D 61 34 65 62 38 31 37 31 61 34 31 65 + + + + + + From cd7c2503af8ac21873447e5596f5a488c5d1d85a Mon Sep 17 00:00:00 2001 From: volodya-lombrozo Date: Mon, 27 May 2024 19:50:01 +0300 Subject: [PATCH 30/41] feat(#229): identify problem with ALOAD and LLOAD instructions --- src/test/java/it/JeoAndOpeoTest.java | 1 + .../FlightRecorderStartupEvent.xmir | 167 ++++++++++++++++++ 2 files changed, 168 insertions(+) create mode 100644 src/test/resources/xmir/disassembled/FlightRecorderStartupEvent.xmir diff --git a/src/test/java/it/JeoAndOpeoTest.java b/src/test/java/it/JeoAndOpeoTest.java index 722a9d87..60df1e88 100644 --- a/src/test/java/it/JeoAndOpeoTest.java +++ b/src/test/java/it/JeoAndOpeoTest.java @@ -107,6 +107,7 @@ void compilesAlreadyCompiledAndAssembles(final String path) { "xmir/disassembled/AssertionsKt$sam$i$org_junit_jupiter_api_function_Executable$0.xmir", "xmir/disassembled/App.xmir", "xmir/disassembled/SmartLifecycle.xmir", + "xmir/disassembled/FlightRecorderStartupEvent.xmir" }) void decompilesCompilesAndKeepsTheSameInstructions(final String path) throws Exception { final XMLDocument original = new XMLDocument(new BytesOf(new ResourceOf(path)).asBytes()); diff --git a/src/test/resources/xmir/disassembled/FlightRecorderStartupEvent.xmir b/src/test/resources/xmir/disassembled/FlightRecorderStartupEvent.xmir new file mode 100644 index 00000000..06db4924 --- /dev/null +++ b/src/test/resources/xmir/disassembled/FlightRecorderStartupEvent.xmir @@ -0,0 +1,167 @@ + + + yv66vgAAADQALgoACAAlCAAmCQAHACcJAAcAKAkABwApCQAHACoHACsHACwBAAdldmVudElkAQABSgEACHBhcmVudElkAQAEbmFtZQEAEkxqYXZhL2xhbmcvU3RyaW5nOwEAGVJ1bnRpbWVWaXNpYmxlQW5ub3RhdGlvbnMBAA9MamRrL2pmci9MYWJlbDsBAAV2YWx1ZQEABE5hbWUBAAR0YWdzAQAEVGFncwEABjxpbml0PgEAFyhKTGphdmEvbGFuZy9TdHJpbmc7SilWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBAEFMb3JnL3NwcmluZ2ZyYW1ld29yay9jb3JlL21ldHJpY3MvamZyL0ZsaWdodFJlY29yZGVyU3RhcnR1cEV2ZW50OwEAEE1ldGhvZFBhcmFtZXRlcnMBAAdzZXRUYWdzAQAVKExqYXZhL2xhbmcvU3RyaW5nOylWAQAKU291cmNlRmlsZQEAH0ZsaWdodFJlY29yZGVyU3RhcnR1cEV2ZW50LmphdmEBABJMamRrL2pmci9DYXRlZ29yeTsBABJTcHJpbmcgQXBwbGljYXRpb24BAAxTdGFydHVwIFN0ZXABABVMamRrL2pmci9EZXNjcmlwdGlvbjsBABpTcHJpbmcgQXBwbGljYXRpb24gU3RhcnR1cAwAFAAtAQAADAASAA0MAAwADQwACQAKDAALAAoBAD9vcmcvc3ByaW5nZnJhbWV3b3JrL2NvcmUvbWV0cmljcy9qZnIvRmxpZ2h0UmVjb3JkZXJTdGFydHVwRXZlbnQBAA1qZGsvamZyL0V2ZW50AQADKClWACAABwAIAAAABAARAAkACgAAABEACwAKAAAAEQAMAA0AAQAOAAAACwABAA8AAQAQcwARAAAAEgANAAEADgAAAAsAAQAPAAEAEHMAEwACAAEAFAAVAAIAFgAAAHcAAwAGAAAAGyq3AAEqEgK1AAMqLbUABCoftQAFKhYEtQAGsQAAAAIAFwAAABoABgAAADEABAAuAAoAMgAPADMAFAA0ABoANQAYAAAAKgAEAAAAGwAZABoAAAAAABsACQAKAAEAAAAbAAwADQADAAAAGwALAAoABAAbAAAADQMACQAAAAwAAAALAAAAAQAcAB0AAgAWAAAAPgACAAIAAAAGKiu1AAOxAAAAAgAXAAAACgACAAAAOAAFADkAGAAAABYAAgAAAAYAGQAaAAAAAAAGABIADQABABsAAAAFAQASAAAAAgAeAAAAAgAfAA4AAAAgAAMAIAABABBbAAFzACEADwABABBzACIAIwABABBzACQ= + + + + + + package + org.springframework.core.metrics.jfr + org.springframework.core.metrics.jfr + + + alias + org.eolang.jeo.opcode + org.eolang.jeo.opcode + + + alias + org.eolang.jeo.label + org.eolang.jeo.label + + + + + 00 00 00 00 00 00 00 34 + 00 00 00 00 00 00 00 20 + 6A 64 6B 2F 6A 66 72 2F 45 76 65 6E 74 + + + 00 00 00 00 00 00 00 11 + 4A + + + + + 00 00 00 00 00 00 00 11 + 4A + + + + + 00 00 00 00 00 00 00 11 + 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B + + + + + 4C 6A 64 6B 2F 6A 66 72 2F 4C 61 62 65 6C 3B + 01 + + + + + 00 00 00 00 00 00 00 00 + 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B + + + + + 4C 6A 64 6B 2F 6A 66 72 2F 4C 61 62 65 6C 3B + 01 + + + + + 00 00 00 00 00 00 00 01 + 28 4A 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 4A 29 56 + + + + 00 00 00 00 00 00 00 03 + 00 00 00 00 00 00 00 06 + + + + + + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 B7 + 6A 64 6B 2F 6A 66 72 2F 45 76 65 6E 74 + 3C 69 6E 69 74 3E + 28 29 56 + 00 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 12 + + + + 00 00 00 00 00 00 00 B5 + 6F 72 67 2F 73 70 72 69 6E 67 66 72 61 6D 65 77 6F 72 6B 2F 63 6F 72 65 2F 6D 65 74 72 69 63 73 2F 6A 66 72 2F 46 6C 69 67 68 74 52 65 63 6F 72 64 65 72 53 74 61 72 74 75 70 45 76 65 6E 74 + 74 61 67 73 + 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B + + 34 36 30 36 64 35 39 64 2D 35 39 66 66 2D 34 39 38 61 2D 39 32 32 63 2D 34 66 35 66 37 30 63 36 31 33 66 63 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 03 + + + 00 00 00 00 00 00 00 B5 + 6F 72 67 2F 73 70 72 69 6E 67 66 72 61 6D 65 77 6F 72 6B 2F 63 6F 72 65 2F 6D 65 74 72 69 63 73 2F 6A 66 72 2F 46 6C 69 67 68 74 52 65 63 6F 72 64 65 72 53 74 61 72 74 75 70 45 76 65 6E 74 + 6E 61 6D 65 + 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 16 + 00 00 00 00 00 00 00 01 + + + 00 00 00 00 00 00 00 B5 + 6F 72 67 2F 73 70 72 69 6E 67 66 72 61 6D 65 77 6F 72 6B 2F 63 6F 72 65 2F 6D 65 74 72 69 63 73 2F 6A 66 72 2F 46 6C 69 67 68 74 52 65 63 6F 72 64 65 72 53 74 61 72 74 75 70 45 76 65 6E 74 + 65 76 65 6E 74 49 64 + 4A + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 16 + 00 00 00 00 00 00 00 04 + + + 00 00 00 00 00 00 00 B5 + 6F 72 67 2F 73 70 72 69 6E 67 66 72 61 6D 65 77 6F 72 6B 2F 63 6F 72 65 2F 6D 65 74 72 69 63 73 2F 6A 66 72 2F 46 6C 69 67 68 74 52 65 63 6F 72 64 65 72 53 74 61 72 74 75 70 45 76 65 6E 74 + 70 61 72 65 6E 74 49 64 + 4A + + + 00 00 00 00 00 00 00 B1 + + + + + + + From 26ae3713e6521733bd57b45c25aa72ef352b8d5a Mon Sep 17 00:00:00 2001 From: volodya-lombrozo Date: Mon, 27 May 2024 20:03:34 +0300 Subject: [PATCH 31/41] feat(#229): remove outdated tests --- pom.xml | 2 + .../opeo/compilation/DefaultCompilerTest.java | 1 - src/test/resources/packs/simple_objects.yaml | 8 +- src/test/resources/simple.eo | 7 +- ...MixinModule$JsonMixinComponentScanner.xmir | 100 ------------------ 5 files changed, 13 insertions(+), 105 deletions(-) delete mode 100644 src/test/resources/xmir/decompiled/JsonMixinModule$JsonMixinComponentScanner.xmir diff --git a/pom.xml b/pom.xml index 3436280c..8136ba3d 100644 --- a/pom.xml +++ b/pom.xml @@ -208,6 +208,8 @@ SOFTWARE. --> spring-fat/pom.xml + + fuse/pom.xml diff --git a/src/test/java/org/eolang/opeo/compilation/DefaultCompilerTest.java b/src/test/java/org/eolang/opeo/compilation/DefaultCompilerTest.java index f2675f3b..828cf7e6 100644 --- a/src/test/java/org/eolang/opeo/compilation/DefaultCompilerTest.java +++ b/src/test/java/org/eolang/opeo/compilation/DefaultCompilerTest.java @@ -88,7 +88,6 @@ void compilesSingleHighLevelXmir(@TempDir final Path temp) throws Exception { @ParameterizedTest @CsvSource({ - "JsonMixinModule$JsonMixinComponentScanner.xmir", "StreamUtils$NonClosingOutputStream.xmir", "Enhancer$3.xmir" }) diff --git a/src/test/resources/packs/simple_objects.yaml b/src/test/resources/packs/simple_objects.yaml index 3a03d2d6..aac14b78 100644 --- a/src/test/resources/packs/simple_objects.yaml +++ b/src/test/resources/packs/simple_objects.yaml @@ -70,9 +70,13 @@ eo: [] > arg__[Ljava/lang/String;__0 seq > @ * - com/example/B + duplicated + "com/example/B" + .new-type .new - com/example/A + duplicated + "com/example/A" + .new-type .new 42 .bar diff --git a/src/test/resources/simple.eo b/src/test/resources/simple.eo index 67b9dbee..ab43f833 100644 --- a/src/test/resources/simple.eo +++ b/src/test/resources/simple.eo @@ -38,9 +38,12 @@ [] > arg__[Ljava/lang/String;__0 seq > @ * - java/lang/StringBuilder + duplicated + "java/lang/StringBuilder" + .new-type .new - "abc" + load-constant + "abc" .append 1 .ignore-result diff --git a/src/test/resources/xmir/decompiled/JsonMixinModule$JsonMixinComponentScanner.xmir b/src/test/resources/xmir/decompiled/JsonMixinModule$JsonMixinComponentScanner.xmir deleted file mode 100644 index b7435a86..00000000 --- a/src/test/resources/xmir/decompiled/JsonMixinModule$JsonMixinComponentScanner.xmir +++ /dev/null @@ -1,100 +0,0 @@ - - - yv66vgAAADQAJAoABwAYBwAZBwAaCgACABsKAAYAHAcAHgcAHwEABjxpbml0PgEAAygpVgEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQAZSnNvbk1peGluQ29tcG9uZW50U2Nhbm5lcgEADElubmVyQ2xhc3NlcwEATExvcmcvc3ByaW5nZnJhbWV3b3JrL2Jvb3QvamFja3Nvbi9Kc29uTWl4aW5Nb2R1bGUkSnNvbk1peGluQ29tcG9uZW50U2Nhbm5lcjsBABRpc0NhbmRpZGF0ZUNvbXBvbmVudAEASShMb3JnL3NwcmluZ2ZyYW1ld29yay9iZWFucy9mYWN0b3J5L2Fubm90YXRpb24vQW5ub3RhdGVkQmVhbkRlZmluaXRpb247KVoBAA5iZWFuRGVmaW5pdGlvbgEARkxvcmcvc3ByaW5nZnJhbWV3b3JrL2JlYW5zL2ZhY3RvcnkvYW5ub3RhdGlvbi9Bbm5vdGF0ZWRCZWFuRGVmaW5pdGlvbjsBABBNZXRob2RQYXJhbWV0ZXJzAQAKU291cmNlRmlsZQEAFEpzb25NaXhpbk1vZHVsZS5qYXZhDAAIAAkBADlvcmcvc3ByaW5nZnJhbWV3b3JrL2NvcmUvdHlwZS9maWx0ZXIvQW5ub3RhdGlvblR5cGVGaWx0ZXIBACpvcmcvc3ByaW5nZnJhbWV3b3JrL2Jvb3QvamFja3Nvbi9Kc29uTWl4aW4MAAgAIAwAIQAiBwAjAQBKb3JnL3NwcmluZ2ZyYW1ld29yay9ib290L2phY2tzb24vSnNvbk1peGluTW9kdWxlJEpzb25NaXhpbkNvbXBvbmVudFNjYW5uZXIBAFJvcmcvc3ByaW5nZnJhbWV3b3JrL2NvbnRleHQvYW5ub3RhdGlvbi9DbGFzc1BhdGhTY2FubmluZ0NhbmRpZGF0ZUNvbXBvbmVudFByb3ZpZGVyAQAUKExqYXZhL2xhbmcvQ2xhc3M7KVYBABBhZGRJbmNsdWRlRmlsdGVyAQA0KExvcmcvc3ByaW5nZnJhbWV3b3JrL2NvcmUvdHlwZS9maWx0ZXIvVHlwZUZpbHRlcjspVgEAMG9yZy9zcHJpbmdmcmFtZXdvcmsvYm9vdC9qYWNrc29uL0pzb25NaXhpbk1vZHVsZQAgAAYABwAAAAAAAgAAAAgACQABAAoAAABEAAQAAQAAABIqtwABKrsAAlkSA7cABLYABbEAAAACAAsAAAAOAAMAAABbAAQAXAARAF0ADAAAAAwAAQAAABIADQAQAAAABAARABIAAgAKAAAANgABAAIAAAACBKwAAAACAAsAAAAGAAEAAABhAAwAAAAWAAIAAAACAA0AEAAAAAAAAgATABQAAQAVAAAABQEAEwAAAAIAFgAAAAIAFwAPAAAACgABAAYAHQAOAAg= - - - - - - package - org.springframework.boot.jackson - org.springframework.boot.jackson - - - alias - org.eolang.jeo.opcode - org.eolang.jeo.opcode - - - alias - org.eolang.jeo.label - org.eolang.jeo.label - - - - - 00 00 00 00 00 00 00 34 - 00 00 00 00 00 00 00 20 - 6F 72 67 2F 73 70 72 69 6E 67 66 72 61 6D 65 77 6F 72 6B 2F 63 6F 6E 74 65 78 74 2F 61 6E 6E 6F 74 61 74 69 6F 6E 2F 43 6C 61 73 73 50 61 74 68 53 63 61 6E 6E 69 6E 67 43 61 6E 64 69 64 61 74 65 43 6F 6D 70 6F 6E 65 6E 74 50 72 6F 76 69 64 65 72 - - - 00 00 00 00 00 00 00 00 - 28 29 56 - - - - 00 00 00 00 00 00 00 04 - 00 00 00 00 00 00 00 01 - - - - 38 34 63 38 39 39 66 36 2D 35 32 34 35 2D 34 37 63 34 2D 62 35 33 36 2D 34 35 32 39 36 65 30 30 38 31 37 31 - - - - 30 34 36 62 61 65 37 62 2D 35 39 32 33 2D 34 34 64 38 2D 38 30 39 38 2D 32 30 38 33 35 61 35 35 32 34 37 30 - - - - - 4C 6F 72 67 2F 73 70 72 69 6E 67 66 72 61 6D 65 77 6F 72 6B 2F 62 6F 6F 74 2F 6A 61 63 6B 73 6F 6E 2F 4A 73 6F 6E 4D 69 78 69 6E 3B - - - 64 35 65 34 39 34 33 37 2D 32 39 31 32 2D 34 37 65 32 2D 38 61 34 61 2D 63 37 37 65 61 63 63 33 30 35 61 63 - - 00 00 00 00 00 00 00 B1 - - 36 39 61 65 63 38 35 38 2D 66 62 65 66 2D 34 39 66 62 2D 61 33 33 65 2D 32 30 32 64 38 37 34 34 38 34 34 31 - - - - - 00 00 00 00 00 00 00 04 - 28 4C 6F 72 67 2F 73 70 72 69 6E 67 66 72 61 6D 65 77 6F 72 6B 2F 62 65 61 6E 73 2F 66 61 63 74 6F 72 79 2F 61 6E 6E 6F 74 61 74 69 6F 6E 2F 41 6E 6E 6F 74 61 74 65 64 42 65 61 6E 44 65 66 69 6E 69 74 69 6F 6E 3B 29 5A - - - - 00 00 00 00 00 00 00 01 - 00 00 00 00 00 00 00 02 - - - - - 36 66 39 63 37 38 62 66 2D 39 39 33 63 2D 34 36 38 63 2D 61 62 66 31 2D 30 65 30 36 34 39 61 34 33 31 35 31 - 00 00 00 00 00 00 00 01 - - 00 00 00 00 00 00 00 AC - - 66 63 66 33 62 38 64 65 2D 36 65 63 65 2D 34 66 63 66 2D 38 34 63 31 2D 36 32 30 35 37 66 33 32 37 30 62 63 - - - - - - 6F 72 67 2F 73 70 72 69 6E 67 66 72 61 6D 65 77 6F 72 6B 2F 62 6F 6F 74 2F 6A 61 63 6B 73 6F 6E 2F 4A 73 6F 6E 4D 69 78 69 6E 4D 6F 64 75 6C 65 24 4A 73 6F 6E 4D 69 78 69 6E 43 6F 6D 70 6F 6E 65 6E 74 53 63 61 6E 6E 65 72 - 6F 72 67 2F 73 70 72 69 6E 67 66 72 61 6D 65 77 6F 72 6B 2F 62 6F 6F 74 2F 6A 61 63 6B 73 6F 6E 2F 4A 73 6F 6E 4D 69 78 69 6E 4D 6F 64 75 6C 65 - 4A 73 6F 6E 4D 69 78 69 6E 43 6F 6D 70 6F 6E 65 6E 74 53 63 61 6E 6E 65 72 - 00 00 00 00 00 00 00 08 - - - - - From 98ee9acd04b142f590460b547bd4738e7759db06 Mon Sep 17 00:00:00 2001 From: volodya-lombrozo Date: Mon, 27 May 2024 20:37:41 +0300 Subject: [PATCH 32/41] feat(#229): search all bugs instead of throwing an exception --- src/test/java/it/JeoAndOpeoTest.java | 57 ++++++++++++++++++---------- 1 file changed, 38 insertions(+), 19 deletions(-) diff --git a/src/test/java/it/JeoAndOpeoTest.java b/src/test/java/it/JeoAndOpeoTest.java index 60df1e88..eafcf5cf 100644 --- a/src/test/java/it/JeoAndOpeoTest.java +++ b/src/test/java/it/JeoAndOpeoTest.java @@ -30,8 +30,10 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; import java.util.stream.Stream; import org.cactoos.bytes.BytesOf; @@ -157,9 +159,13 @@ void findTheProblem() { "/Users/lombrozo/Workspace/EOlang/opeo-maven-plugin/target/it/spring-fat/target/generated-sources/opeo-compile-xmir/org" ); + final AtomicInteger counter = new AtomicInteger(0); + final AtomicInteger errorsCounter = new AtomicInteger(0); + final List errorMessages = new ArrayList<>(0); try (final Stream all = Files.walk(golden).filter(Files::isRegularFile)) { all.forEach( path -> { + counter.incrementAndGet(); final Path relative = golden.relativize(path); XMLDocument good = null; try { @@ -178,6 +184,7 @@ void findTheProblem() { final XmlProgram badProgram = new XmlProgram(bad); final List goodMethods = goodProgram.top().methods(); final List badMethods = badProgram.top().methods(); + outer: for (int i = 0; i < goodMethods.size(); i++) { final XmlMethod goodMethod = goodMethods.get(i); final XmlMethod badMethod = badMethods.get(i); @@ -199,15 +206,20 @@ void findTheProblem() { final XmlInstruction badInstruction = (XmlInstruction) badEntry; if (goodInstruction.opcode() != badInstruction.opcode()) { - throw new IllegalArgumentException( - String.format( - "The operands '%s' and '%s' are differ in %n%s%n%s", - goodEntry, - badEntry, - "file://" + golden.resolve(relative), - "file://" + real.resolve(relative) - ) + final String message = String.format( + "The operands '%s' and '%s' are differ in %n%s%n%s,%nTotal scanned files: %d", + goodEntry, + badEntry, + "file://" + golden.resolve(relative), + "file://" + real.resolve(relative), + counter.get() ); +// throw new IllegalArgumentException( +// message +// ); + errorMessages.add(message); + errorsCounter.incrementAndGet(); + break outer; } final List goodOperands = goodInstruction.operands(); final List badOperands = badInstruction.operands(); @@ -221,18 +233,21 @@ void findTheProblem() { "label") && badOperandString.contains("label")) continue; if (!goodOperandString.equals(badOperandString)) { - throw new IllegalArgumentException( - String.format( - "The operands '%s' and '%s' are differ in '%s'%n'%s'%n'%s',%n%s%n%s", - goodEntry, - badEntry, - relative, - goodOperand, - badOperand, - "file://" + golden.resolve(relative), - "file://" + real.resolve(relative) - ) + final String message = String.format( + "The operands '%s' and '%s' are differ in '%s'%n'%s'%n'%s',%n%s%n%s%nTotal scanned files: %d", + goodEntry, + badEntry, + relative, + goodOperand, + badOperand, + "file://" + golden.resolve(relative), + "file://" + real.resolve(relative), + counter.get() ); +// throw new IllegalArgumentException(message); + errorMessages.add(message); + errorsCounter.incrementAndGet(); + break outer; } } @@ -242,11 +257,15 @@ void findTheProblem() { } } + System.out.println("Total files:" + counter.get()); + System.out.println("Number of failed files:" + errorsCounter.get()); } ); } catch (final IOException exception) { throw new RuntimeException(exception); } + System.out.println("All Errors:\n"); + errorMessages.forEach(System.out::println); } From 167f58b6e9f38513b7d427df2945023d4a0eaa90 Mon Sep 17 00:00:00 2001 From: volodya-lombrozo Date: Tue, 28 May 2024 01:06:51 +0300 Subject: [PATCH 33/41] feat(#229): fix the problem with local variables indexes --- .../opeo/decompilation/LocalVariables.java | 80 ++++++++++++++++--- .../decompilation/handlers/LoadHandler.java | 6 +- 2 files changed, 70 insertions(+), 16 deletions(-) diff --git a/src/main/java/org/eolang/opeo/decompilation/LocalVariables.java b/src/main/java/org/eolang/opeo/decompilation/LocalVariables.java index 8455229d..57768029 100644 --- a/src/main/java/org/eolang/opeo/decompilation/LocalVariables.java +++ b/src/main/java/org/eolang/opeo/decompilation/LocalVariables.java @@ -66,7 +66,7 @@ public final class LocalVariables { * @param descriptor Method descriptor. */ public LocalVariables(final int modifiers, final String descriptor, final String name) { - this(modifiers, Type.getArgumentTypes(descriptor), Type.getType(name)); + this(modifiers, new VariablesArray(modifiers, descriptor).array(), Type.getType(name)); } @@ -76,14 +76,14 @@ public LocalVariables(final int modifiers, final String descriptor, final String * @param descriptor Method descriptor. */ public LocalVariables(final int modifiers, final String descriptor) { - this(modifiers, Type.getArgumentTypes(descriptor)); + this(modifiers, new VariablesArray(modifiers, descriptor).array()); } /** * Constructor. */ LocalVariables() { - this(Opcodes.ACC_PUBLIC, new Type[0]); + this(Opcodes.ACC_PUBLIC, Type.getType(Object.class)); } /** @@ -164,17 +164,73 @@ private boolean isInstanceMethod() { */ private Optional argumentType(final int index) { final Optional result; - final int real; - if (this.isInstanceMethod()) { - real = index - 1; - } else { - real = index; - } - if (real > -1 && real < this.types.length) { - result = Optional.of(this.types[real]); - } else { + if (index < 0 || index >= this.types.length) { result = Optional.empty(); + } else { + result = Optional.ofNullable(this.types[index]); } +// final Optional result; +// final int real; +// if (this.isInstanceMethod()) { +// real = index - 1; +// } else { +// real = index; +// } +// if (real > -1 && real < this.types.length) { +// result = Optional.ofNullable(this.types[real]); +// } else { +// result = Optional.empty(); +// } +// return result; return result; } + + + private static class VariablesArray { + + private final int modifiers; + private final String descriptor; + + public VariablesArray(final int modifiers, final String descriptor) { + this.modifiers = modifiers; + this.descriptor = descriptor; + } + + public Type[] array() { + final Type[] types = Type.getArgumentTypes(this.descriptor); + final Type[] result = new Type[this.size()]; + int offset = 0; + if (this.isInstanceMethod()) { + offset++; + } + for (int index = 0; index < types.length; index++) { + final Type current = types[index]; + result[index + offset] = current; + if (current.getSize() > 1) { + offset = offset + 1; + result[index + offset] = current; + } + } + return result; + } + + + private int size() { + final int result; + final int res = Arrays.stream(Type.getArgumentTypes(this.descriptor)) + .mapToInt(Type::getSize) + .sum(); + if (this.isInstanceMethod()) { + result = res + 1; + } else { + result = res; + } + return result; + } + + private boolean isInstanceMethod() { + return (this.modifiers & Opcodes.ACC_STATIC) == 0; + } + + } } diff --git a/src/main/java/org/eolang/opeo/decompilation/handlers/LoadHandler.java b/src/main/java/org/eolang/opeo/decompilation/handlers/LoadHandler.java index 080ec094..1703958c 100644 --- a/src/main/java/org/eolang/opeo/decompilation/handlers/LoadHandler.java +++ b/src/main/java/org/eolang/opeo/decompilation/handlers/LoadHandler.java @@ -52,11 +52,9 @@ public LoadHandler(final Type type) { @Override public void handle(final DecompilerState state) { + final Integer index = (Integer) state.operand(0); state.stack().push( - state.variable( - (Integer) state.operand(0), - this.type - ) + state.variable(index, this.type) ); } } From 9d1060156f131444ddfc5c5c2c130361689dab83 Mon Sep 17 00:00:00 2001 From: volodya-lombrozo Date: Tue, 28 May 2024 02:38:58 +0300 Subject: [PATCH 34/41] feat(#229): fix the problem with invocation owner --- .../java/org/eolang/opeo/ast/Constant.java | 13 +- .../java/org/eolang/opeo/ast/Invocation.java | 9 +- src/test/java/it/JeoAndOpeoTest.java | 38 ++- .../xmir/disassembled/OpenSSLContext$1.xmir | 247 ++++++++++++++++++ .../xmir/disassembled/SimpleLog.xmir | 143 ++++++++++ 5 files changed, 445 insertions(+), 5 deletions(-) create mode 100644 src/test/resources/xmir/disassembled/OpenSSLContext$1.xmir create mode 100644 src/test/resources/xmir/disassembled/SimpleLog.xmir diff --git a/src/main/java/org/eolang/opeo/ast/Constant.java b/src/main/java/org/eolang/opeo/ast/Constant.java index ac49b414..fce63207 100644 --- a/src/main/java/org/eolang/opeo/ast/Constant.java +++ b/src/main/java/org/eolang/opeo/ast/Constant.java @@ -24,7 +24,12 @@ public Constant(final Object value) { @Override public List opcodes() { - return Collections.singletonList(new Opcode(Opcodes.LDC, this.value)); +// if (this.value instanceof Type) { +// return Collections.singletonList( +// new Opcode(Opcodes.LDC, ((Type) this.value).getClass())); +// } else { + return Collections.singletonList(new Opcode(Opcodes.LDC, this.value)); +// } } @Override @@ -37,7 +42,11 @@ public Iterable toXmir() { @Override public Type type() { - return Type.getType(this.value.getClass()); + if (this.value instanceof Type) { + return (Type) this.value; + } else { + return Type.getType(this.value.getClass()); + } } private static Object parse(final XmlNode node) { diff --git a/src/main/java/org/eolang/opeo/ast/Invocation.java b/src/main/java/org/eolang/opeo/ast/Invocation.java index 0e56eaab..9b3eb4fb 100644 --- a/src/main/java/org/eolang/opeo/ast/Invocation.java +++ b/src/main/java/org/eolang/opeo/ast/Invocation.java @@ -161,12 +161,17 @@ public List opcodes() { this.source ) ); + }//todo: why? + final String owner; + if (this.attributes.toString().contains("owner")) { + owner = this.attributes.owner(); + } else { + owner = ((Typed) this.source).type().getClassName(); } - final Typed owner = (Typed) this.source; res.add( new Opcode( Opcodes.INVOKEVIRTUAL, - owner.type().getClassName().replace('.', '/'), + owner.replace('.', '/'), this.attributes.name(), this.attributes.descriptor(), this.attributes.interfaced() diff --git a/src/test/java/it/JeoAndOpeoTest.java b/src/test/java/it/JeoAndOpeoTest.java index eafcf5cf..599893cf 100644 --- a/src/test/java/it/JeoAndOpeoTest.java +++ b/src/test/java/it/JeoAndOpeoTest.java @@ -109,7 +109,9 @@ void compilesAlreadyCompiledAndAssembles(final String path) { "xmir/disassembled/AssertionsKt$sam$i$org_junit_jupiter_api_function_Executable$0.xmir", "xmir/disassembled/App.xmir", "xmir/disassembled/SmartLifecycle.xmir", - "xmir/disassembled/FlightRecorderStartupEvent.xmir" + "xmir/disassembled/FlightRecorderStartupEvent.xmir", + "xmir/disassembled/SimpleLog.xmir", + "xmir/disassembled/OpenSSLContext$1.xmir", }) void decompilesCompilesAndKeepsTheSameInstructions(final String path) throws Exception { final XMLDocument original = new XMLDocument(new BytesOf(new ResourceOf(path)).asBytes()); @@ -132,6 +134,40 @@ void decompilesCompilesAndKeepsTheSameInstructions(final String path) throws Exc ); } + @ParameterizedTest + @CsvSource({ + "xmir/disassembled/SimpleLog.xmir", +// "xmir/disassembled/OpenSSLContext$1.xmir", + }) + void decompilesCompilesAndKeepsTheSameInstructionsWithTheSameOperands( + final String path + ) throws Exception { + final XMLDocument original = new XMLDocument(new BytesOf(new ResourceOf(path)).asBytes()); + Opcode.disableCounting(); + final List actual = new XmlProgram( + new JeoCompiler( + new JeoDecompiler(original).decompile() + ).compile() + ).top().methods().get(0).instructions(); + final List expected = new XmlProgram(original).top().methods().get(0) + .instructions(); + + final int size = expected.size(); + for (int index = 0; index < size; ++index) { + final XmlBytecodeEntry expect = expected.get(index); + final XmlBytecodeEntry act = actual.get(index); + if(expect instanceof XmlLabel && act instanceof XmlLabel) { + continue; + } + MatcherAssert.assertThat( + "The original and compiled instructions are not equal", + act, + Matchers.equalTo(expect) + ); + + } + } + @Disabled @ParameterizedTest @CsvSource("xmir/disassembled/SimpleTypeConverter.xmir, org.springframework.beans.SimpleTypeConverter") diff --git a/src/test/resources/xmir/disassembled/OpenSSLContext$1.xmir b/src/test/resources/xmir/disassembled/OpenSSLContext$1.xmir new file mode 100644 index 00000000..bd84457f --- /dev/null +++ b/src/test/resources/xmir/disassembled/OpenSSLContext$1.xmir @@ -0,0 +1,247 @@ + + + yv66vgAAADQAVQkAAgADBwAEDAAFAAYBADNvcmcvYXBhY2hlL3RvbWNhdC91dGlsL25ldC9vcGVuc3NsL09wZW5TU0xDb250ZXh0JDEBAAZ0aGlzJDABADNMb3JnL2FwYWNoZS90b21jYXQvdXRpbC9uZXQvb3BlbnNzbC9PcGVuU1NMQ29udGV4dDsKAAgACQcACgwACwAMAQAQamF2YS9sYW5nL09iamVjdAEABjxpbml0PgEAAygpVgoADgAPBwAQDAARABIBADFvcmcvYXBhY2hlL3RvbWNhdC91dGlsL25ldC9vcGVuc3NsL09wZW5TU0xDb250ZXh0AQAKYWNjZXNzJDAwMAEAKihbW0IpW0xqYXZhL3NlY3VyaXR5L2NlcnQvWDUwOUNlcnRpZmljYXRlOwoADgAUDAAVABYBAAphY2Nlc3MkMTAwAQBVKExvcmcvYXBhY2hlL3RvbWNhdC91dGlsL25ldC9vcGVuc3NsL09wZW5TU0xDb250ZXh0OylMamF2YXgvbmV0L3NzbC9YNTA5VHJ1c3RNYW5hZ2VyOwsAGAAZBwAaDAAbABwBAB5qYXZheC9uZXQvc3NsL1g1MDlUcnVzdE1hbmFnZXIBABJjaGVja0NsaWVudFRydXN0ZWQBADooW0xqYXZhL3NlY3VyaXR5L2NlcnQvWDUwOUNlcnRpZmljYXRlO0xqYXZhL2xhbmcvU3RyaW5nOylWBwAeAQATamF2YS9sYW5nL0V4Y2VwdGlvbgoADgAgDAAhACIBAAphY2Nlc3MkMzAwAQAfKClMb3JnL2FwYWNoZS9qdWxpL2xvZ2dpbmcvTG9nOwoADgAkDAAlACYBAAphY2Nlc3MkMjAwAQAsKClMb3JnL2FwYWNoZS90b21jYXQvdXRpbC9yZXMvU3RyaW5nTWFuYWdlcjsIACgBACVvcGVuc3NsLmNlcnRpZmljYXRlVmVyaWZpY2F0aW9uRmFpbGVkCgAqACsHACwMAC0ALgEAKG9yZy9hcGFjaGUvdG9tY2F0L3V0aWwvcmVzL1N0cmluZ01hbmFnZXIBAAlnZXRTdHJpbmcBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwsAMAAxBwAyDAAzADQBABtvcmcvYXBhY2hlL2p1bGkvbG9nZ2luZy9Mb2cBAAVkZWJ1ZwEAKihMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL1Rocm93YWJsZTspVgcANgEAKW9yZy9hcGFjaGUvdG9tY2F0L2puaS9DZXJ0aWZpY2F0ZVZlcmlmaWVyAQA2KExvcmcvYXBhY2hlL3RvbWNhdC91dGlsL25ldC9vcGVuc3NsL09wZW5TU0xDb250ZXh0OylWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBADVMb3JnL2FwYWNoZS90b21jYXQvdXRpbC9uZXQvb3BlbnNzbC9PcGVuU1NMQ29udGV4dCQxOwEABnZlcmlmeQEAGShKW1tCTGphdmEvbGFuZy9TdHJpbmc7KVoBAAFlAQAVTGphdmEvbGFuZy9FeGNlcHRpb247AQADc3NsAQABSgEABWNoYWluAQADW1tCAQAEYXV0aAEAEkxqYXZhL2xhbmcvU3RyaW5nOwEACXBlZXJDZXJ0cwEAJVtMamF2YS9zZWN1cml0eS9jZXJ0L1g1MDlDZXJ0aWZpY2F0ZTsBAA1TdGFja01hcFRhYmxlBwBEBwBMAQAQamF2YS9sYW5nL1N0cmluZwcASAEAClNvdXJjZUZpbGUBABNPcGVuU1NMQ29udGV4dC5qYXZhAQAPRW5jbG9zaW5nTWV0aG9kDABSAFMBAARpbml0AQBXKFtMamF2YXgvbmV0L3NzbC9LZXlNYW5hZ2VyO1tMamF2YXgvbmV0L3NzbC9UcnVzdE1hbmFnZXI7TGphdmEvc2VjdXJpdHkvU2VjdXJlUmFuZG9tOylWAQAMSW5uZXJDbGFzc2VzACAAAgAIAAEANQABEBAABQAGAAAAAgAAAAsANwABADgAAAA+AAIAAgAAAAoqK7UAASq3AAexAAAAAgA5AAAABgABAAABawA6AAAAFgACAAAACgA7ADwAAAAAAAoABQAGAAEAAQA9AD4AAQA4AAAAxQADAAcAAAAuLbgADToFKrQAAbgAExkFGQS5ABcDAASsOga4AB+4ACMSJ7YAKRkGuQAvAwADrAABAAYAFwAYAB0AAwA5AAAAGgAGAAABbgAGAXAAFgFxABgBcgAaAXMALAF1ADoAAAA+AAYAGgASAD8AQAAGAAAALgA7ADwAAAAAAC4AQQBCAAEAAAAuAEMARAADAAAALgBFAEYABAAGACgARwBIAAUASQAAABkAAf8AGAAFBwACBAcASgcASwcATQABBwAdAAMATgAAAAIATwBQAAAABAAOAFEAVAAAAAoAAQACAAAAAAAA + + + + + + package + org.apache.tomcat.util.net.openssl + org.apache.tomcat.util.net.openssl + + + alias + org.eolang.jeo.opcode + org.eolang.jeo.opcode + + + alias + org.eolang.jeo.label + org.eolang.jeo.label + + + + + 00 00 00 00 00 00 00 34 + 00 00 00 00 00 00 00 20 + 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 + + 6F 72 67 2F 61 70 61 63 68 65 2F 74 6F 6D 63 61 74 2F 6A 6E 69 2F 43 65 72 74 69 66 69 63 61 74 65 56 65 72 69 66 69 65 72 + + + 00 00 00 00 00 00 10 10 + 4C 6F 72 67 2F 61 70 61 63 68 65 2F 74 6F 6D 63 61 74 2F 75 74 69 6C 2F 6E 65 74 2F 6F 70 65 6E 73 73 6C 2F 4F 70 65 6E 53 53 4C 43 6F 6E 74 65 78 74 3B + + + + + 00 00 00 00 00 00 00 00 + 28 4C 6F 72 67 2F 61 70 61 63 68 65 2F 74 6F 6D 63 61 74 2F 75 74 69 6C 2F 6E 65 74 2F 6F 70 65 6E 73 73 6C 2F 4F 70 65 6E 53 53 4C 43 6F 6E 74 65 78 74 3B 29 56 + + + + 00 00 00 00 00 00 00 02 + 00 00 00 00 00 00 00 02 + + + + + 36 38 33 37 38 30 32 38 2D 34 63 64 62 2D 34 31 34 63 2D 38 33 63 62 2D 35 37 34 33 63 63 61 66 31 38 34 30 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 01 + + + 00 00 00 00 00 00 00 B5 + 6F 72 67 2F 61 70 61 63 68 65 2F 74 6F 6D 63 61 74 2F 75 74 69 6C 2F 6E 65 74 2F 6F 70 65 6E 73 73 6C 2F 4F 70 65 6E 53 53 4C 43 6F 6E 74 65 78 74 24 31 + 74 68 69 73 24 30 + 4C 6F 72 67 2F 61 70 61 63 68 65 2F 74 6F 6D 63 61 74 2F 75 74 69 6C 2F 6E 65 74 2F 6F 70 65 6E 73 73 6C 2F 4F 70 65 6E 53 53 4C 43 6F 6E 74 65 78 74 3B + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 B7 + 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 + 3C 69 6E 69 74 3E + 28 29 56 + 00 + + + 00 00 00 00 00 00 00 B1 + + 34 30 39 30 65 61 30 36 2D 61 66 30 66 2D 34 36 62 38 2D 39 34 62 33 2D 34 64 37 62 33 63 63 66 62 35 35 31 + + + + + 00 00 00 00 00 00 00 01 + 28 4A 5B 5B 42 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 29 5A + + + + 00 00 00 00 00 00 00 03 + 00 00 00 00 00 00 00 07 + + + + + + + 36 34 32 39 62 38 36 38 2D 32 32 66 66 2D 34 61 61 36 2D 61 30 64 34 2D 34 33 65 34 37 63 61 64 38 62 63 33 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 03 + + + 00 00 00 00 00 00 00 B8 + 6F 72 67 2F 61 70 61 63 68 65 2F 74 6F 6D 63 61 74 2F 75 74 69 6C 2F 6E 65 74 2F 6F 70 65 6E 73 73 6C 2F 4F 70 65 6E 53 53 4C 43 6F 6E 74 65 78 74 + 61 63 63 65 73 73 24 30 30 30 + 28 5B 5B 42 29 5B 4C 6A 61 76 61 2F 73 65 63 75 72 69 74 79 2F 63 65 72 74 2F 58 35 30 39 43 65 72 74 69 66 69 63 61 74 65 3B + 00 + + + 00 00 00 00 00 00 00 3A + 00 00 00 00 00 00 00 05 + + 33 37 63 62 38 66 64 34 2D 61 63 39 61 2D 34 65 30 39 2D 39 36 37 30 2D 64 30 30 35 31 61 39 39 61 64 61 30 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 B4 + 6F 72 67 2F 61 70 61 63 68 65 2F 74 6F 6D 63 61 74 2F 75 74 69 6C 2F 6E 65 74 2F 6F 70 65 6E 73 73 6C 2F 4F 70 65 6E 53 53 4C 43 6F 6E 74 65 78 74 24 31 + 74 68 69 73 24 30 + 4C 6F 72 67 2F 61 70 61 63 68 65 2F 74 6F 6D 63 61 74 2F 75 74 69 6C 2F 6E 65 74 2F 6F 70 65 6E 73 73 6C 2F 4F 70 65 6E 53 53 4C 43 6F 6E 74 65 78 74 3B + + + 00 00 00 00 00 00 00 B8 + 6F 72 67 2F 61 70 61 63 68 65 2F 74 6F 6D 63 61 74 2F 75 74 69 6C 2F 6E 65 74 2F 6F 70 65 6E 73 73 6C 2F 4F 70 65 6E 53 53 4C 43 6F 6E 74 65 78 74 + 61 63 63 65 73 73 24 31 30 30 + 28 4C 6F 72 67 2F 61 70 61 63 68 65 2F 74 6F 6D 63 61 74 2F 75 74 69 6C 2F 6E 65 74 2F 6F 70 65 6E 73 73 6C 2F 4F 70 65 6E 53 53 4C 43 6F 6E 74 65 78 74 3B 29 4C 6A 61 76 61 78 2F 6E 65 74 2F 73 73 6C 2F 58 35 30 39 54 72 75 73 74 4D 61 6E 61 67 65 72 3B + 00 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 05 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 04 + + + 00 00 00 00 00 00 00 B9 + 6A 61 76 61 78 2F 6E 65 74 2F 73 73 6C 2F 58 35 30 39 54 72 75 73 74 4D 61 6E 61 67 65 72 + 63 68 65 63 6B 43 6C 69 65 6E 74 54 72 75 73 74 65 64 + 28 5B 4C 6A 61 76 61 2F 73 65 63 75 72 69 74 79 2F 63 65 72 74 2F 58 35 30 39 43 65 72 74 69 66 69 63 61 74 65 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 29 56 + 01 + + 61 61 66 63 36 66 36 33 2D 66 36 32 38 2D 34 39 36 33 2D 62 65 62 32 2D 33 38 66 65 63 64 30 61 62 33 39 33 + + 00 00 00 00 00 00 00 04 + + 61 66 64 65 35 32 39 32 2D 62 62 37 61 2D 34 32 33 63 2D 61 32 33 30 2D 30 32 30 31 32 37 62 39 36 31 39 61 + + 00 00 00 00 00 00 00 AC + + 30 32 63 36 61 31 63 31 2D 66 35 35 33 2D 34 33 39 35 2D 39 39 31 63 2D 61 37 39 61 63 38 31 32 33 37 64 33 + + 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 05 + + 6F 72 67 2F 61 70 61 63 68 65 2F 74 6F 6D 63 61 74 2F 75 74 69 6C 2F 6E 65 74 2F 6F 70 65 6E 73 73 6C 2F 4F 70 65 6E 53 53 4C 43 6F 6E 74 65 78 74 24 31 + 00 00 00 00 00 00 00 04 + 5B 5B 42 + 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 + 5B 4C 6A 61 76 61 2F 73 65 63 75 72 69 74 79 2F 63 65 72 74 2F 58 35 30 39 43 65 72 74 69 66 69 63 61 74 65 3B + + 00 00 00 00 00 00 00 01 + + 6A 61 76 61 2F 6C 61 6E 67 2F 45 78 63 65 70 74 69 6F 6E + + + + 00 00 00 00 00 00 00 3A + 00 00 00 00 00 00 00 06 + + 36 37 66 30 64 32 34 62 2D 31 32 37 35 2D 34 38 62 38 2D 61 37 66 37 2D 36 37 63 31 35 32 61 39 35 32 64 65 + + 00 00 00 00 00 00 00 B8 + 6F 72 67 2F 61 70 61 63 68 65 2F 74 6F 6D 63 61 74 2F 75 74 69 6C 2F 6E 65 74 2F 6F 70 65 6E 73 73 6C 2F 4F 70 65 6E 53 53 4C 43 6F 6E 74 65 78 74 + 61 63 63 65 73 73 24 33 30 30 + 28 29 4C 6F 72 67 2F 61 70 61 63 68 65 2F 6A 75 6C 69 2F 6C 6F 67 67 69 6E 67 2F 4C 6F 67 3B + 00 + + + 00 00 00 00 00 00 00 B8 + 6F 72 67 2F 61 70 61 63 68 65 2F 74 6F 6D 63 61 74 2F 75 74 69 6C 2F 6E 65 74 2F 6F 70 65 6E 73 73 6C 2F 4F 70 65 6E 53 53 4C 43 6F 6E 74 65 78 74 + 61 63 63 65 73 73 24 32 30 30 + 28 29 4C 6F 72 67 2F 61 70 61 63 68 65 2F 74 6F 6D 63 61 74 2F 75 74 69 6C 2F 72 65 73 2F 53 74 72 69 6E 67 4D 61 6E 61 67 65 72 3B + 00 + + + 00 00 00 00 00 00 00 12 + 6F 70 65 6E 73 73 6C 2E 63 65 72 74 69 66 69 63 61 74 65 56 65 72 69 66 69 63 61 74 69 6F 6E 46 61 69 6C 65 64 + + + 00 00 00 00 00 00 00 B6 + 6F 72 67 2F 61 70 61 63 68 65 2F 74 6F 6D 63 61 74 2F 75 74 69 6C 2F 72 65 73 2F 53 74 72 69 6E 67 4D 61 6E 61 67 65 72 + 67 65 74 53 74 72 69 6E 67 + 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B + 00 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 06 + + + 00 00 00 00 00 00 00 B9 + 6F 72 67 2F 61 70 61 63 68 65 2F 6A 75 6C 69 2F 6C 6F 67 67 69 6E 67 2F 4C 6F 67 + 64 65 62 75 67 + 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 54 68 72 6F 77 61 62 6C 65 3B 29 56 + 01 + + 61 64 35 39 66 61 66 38 2D 38 32 62 64 2D 34 63 61 39 2D 61 64 31 34 2D 35 31 30 38 35 31 63 65 64 65 66 30 + + 00 00 00 00 00 00 00 03 + + + 00 00 00 00 00 00 00 AC + + 30 63 33 31 65 64 32 36 2D 30 62 63 33 2D 34 64 65 35 2D 62 64 38 63 2D 61 61 38 61 35 37 63 63 64 32 66 39 + + + + + 33 37 63 62 38 66 64 34 2D 61 63 39 61 2D 34 65 30 39 2D 39 36 37 30 2D 64 30 30 35 31 61 39 39 61 64 61 30 + 61 66 64 65 35 32 39 32 2D 62 62 37 61 2D 34 32 33 63 2D 61 32 33 30 2D 30 32 30 31 32 37 62 39 36 31 39 61 + 30 32 63 36 61 31 63 31 2D 66 35 35 33 2D 34 33 39 35 2D 39 39 31 63 2D 61 37 39 61 63 38 31 32 33 37 64 33 + 6A 61 76 61 2F 6C 61 6E 67 2F 45 78 63 65 70 74 69 6F 6E + + + + + + 6F 72 67 2F 61 70 61 63 68 65 2F 74 6F 6D 63 61 74 2F 75 74 69 6C 2F 6E 65 74 2F 6F 70 65 6E 73 73 6C 2F 4F 70 65 6E 53 53 4C 43 6F 6E 74 65 78 74 24 31 + 00 00 00 00 00 00 00 00 + + + + + diff --git a/src/test/resources/xmir/disassembled/SimpleLog.xmir b/src/test/resources/xmir/disassembled/SimpleLog.xmir new file mode 100644 index 00000000..3a9b0cd7 --- /dev/null +++ b/src/test/resources/xmir/disassembled/SimpleLog.xmir @@ -0,0 +1,143 @@ + + + yv66vgAAADQANQoACwAbCQAcAB0HAB4KAAMAHwcAIAoAIQAiCgADACMIACQKAAMAJQoAJgAnBwAoAQAGPGluaXQ+AQAVKExqYXZhL2xhbmcvU3RyaW5nOylWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBACtMb3JnL2FwYWNoZS9jb21tb25zL2xvZ2dpbmcvaW1wbC9TaW1wbGVMb2c7AQAEbmFtZQEAEkxqYXZhL2xhbmcvU3RyaW5nOwEAEE1ldGhvZFBhcmFtZXRlcnMBAApTb3VyY2VGaWxlAQAOU2ltcGxlTG9nLmphdmEBAApEZXByZWNhdGVkAQAZUnVudGltZVZpc2libGVBbm5vdGF0aW9ucwEAFkxqYXZhL2xhbmcvRGVwcmVjYXRlZDsMAAwADQcAKQwAKgArAQAXamF2YS9sYW5nL1N0cmluZ0J1aWxkZXIMAAwALAEAKW9yZy9hcGFjaGUvY29tbW9ucy9sb2dnaW5nL2ltcGwvU2ltcGxlTG9nBwAtDAAuAC8MADAAMQEAdCBpcyBkZXByZWNhdGVkIGFuZCBlcXVpdmFsZW50IHRvIE5vT3BMb2cgaW4gc3ByaW5nLWpjbC4gVXNlIGEgc3RhbmRhcmQgTG9nRmFjdG9yeS5nZXRMb2coQ2xhc3MvU3RyaW5nKSBjYWxsIGluc3RlYWQuDAAyAC8HADMMADQADQEAJ29yZy9hcGFjaGUvY29tbW9ucy9sb2dnaW5nL2ltcGwvTm9PcExvZwEAEGphdmEvbGFuZy9TeXN0ZW0BAANvdXQBABVMamF2YS9pby9QcmludFN0cmVhbTsBAAMoKVYBAA9qYXZhL2xhbmcvQ2xhc3MBAAdnZXROYW1lAQAUKClMamF2YS9sYW5nL1N0cmluZzsBAAZhcHBlbmQBAC0oTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsBAAh0b1N0cmluZwEAE2phdmEvaW8vUHJpbnRTdHJlYW0BAAdwcmludGxuACEABQALAAAAAAABAAEADAANAAIADgAAAF8AAwACAAAAIyortwABsgACuwADWbcABBIFtgAGtgAHEgi2AAe2AAm2AAqxAAAAAgAPAAAADgADAAAAIwAFACQAIgAmABAAAAAWAAIAAAAjABEAEgAAAAAAIwATABQAAQAVAAAABQEAEwAAAAMAFgAAAAIAFwAYAAAAAAAZAAAABgABABoAAA== + + + + + + package + org.apache.commons.logging.impl + org.apache.commons.logging.impl + + + alias + org.eolang.jeo.opcode + org.eolang.jeo.opcode + + + alias + org.eolang.jeo.label + org.eolang.jeo.label + + + + + 00 00 00 00 00 00 00 34 + 00 00 00 00 00 02 00 21 + 6F 72 67 2F 61 70 61 63 68 65 2F 63 6F 6D 6D 6F 6E 73 2F 6C 6F 67 67 69 6E 67 2F 69 6D 70 6C 2F 4E 6F 4F 70 4C 6F 67 + + + 00 00 00 00 00 00 00 01 + 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 29 56 + + + + 00 00 00 00 00 00 00 03 + 00 00 00 00 00 00 00 02 + + + + + 66 32 35 61 61 32 64 31 2D 65 31 38 30 2D 34 32 39 38 2D 61 33 31 38 2D 30 64 36 31 66 63 62 64 32 32 30 37 + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 00 + + + 00 00 00 00 00 00 00 19 + 00 00 00 00 00 00 00 01 + + + 00 00 00 00 00 00 00 B7 + 6F 72 67 2F 61 70 61 63 68 65 2F 63 6F 6D 6D 6F 6E 73 2F 6C 6F 67 67 69 6E 67 2F 69 6D 70 6C 2F 4E 6F 4F 70 4C 6F 67 + 3C 69 6E 69 74 3E + 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 29 56 + 00 + + 61 63 64 30 31 66 39 65 2D 39 64 31 37 2D 34 65 61 33 2D 38 32 61 33 2D 34 36 62 34 39 31 65 37 34 66 37 30 + + 00 00 00 00 00 00 00 B2 + 6A 61 76 61 2F 6C 61 6E 67 2F 53 79 73 74 65 6D + 6F 75 74 + 4C 6A 61 76 61 2F 69 6F 2F 50 72 69 6E 74 53 74 72 65 61 6D 3B + + + 00 00 00 00 00 00 00 BB + 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 42 75 69 6C 64 65 72 + + + 00 00 00 00 00 00 00 59 + + + 00 00 00 00 00 00 00 B7 + 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 42 75 69 6C 64 65 72 + 3C 69 6E 69 74 3E + 28 29 56 + 00 + + + 00 00 00 00 00 00 00 12 + 4C 6F 72 67 2F 61 70 61 63 68 65 2F 63 6F 6D 6D 6F 6E 73 2F 6C 6F 67 67 69 6E 67 2F 69 6D 70 6C 2F 53 69 6D 70 6C 65 4C 6F 67 3B + + + 00 00 00 00 00 00 00 B6 + 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 + 67 65 74 4E 61 6D 65 + 28 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B + 00 + + + 00 00 00 00 00 00 00 B6 + 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 42 75 69 6C 64 65 72 + 61 70 70 65 6E 64 + 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 42 75 69 6C 64 65 72 3B + 00 + + + 00 00 00 00 00 00 00 12 + 20 69 73 20 64 65 70 72 65 63 61 74 65 64 20 61 6E 64 20 65 71 75 69 76 61 6C 65 6E 74 20 74 6F 20 4E 6F 4F 70 4C 6F 67 20 69 6E 20 73 70 72 69 6E 67 2D 6A 63 6C 2E 20 55 73 65 20 61 20 73 74 61 6E 64 61 72 64 20 4C 6F 67 46 61 63 74 6F 72 79 2E 67 65 74 4C 6F 67 28 43 6C 61 73 73 2F 53 74 72 69 6E 67 29 20 63 61 6C 6C 20 69 6E 73 74 65 61 64 2E + + + 00 00 00 00 00 00 00 B6 + 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 42 75 69 6C 64 65 72 + 61 70 70 65 6E 64 + 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 42 75 69 6C 64 65 72 3B + 00 + + + 00 00 00 00 00 00 00 B6 + 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 42 75 69 6C 64 65 72 + 74 6F 53 74 72 69 6E 67 + 28 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B + 00 + + + 00 00 00 00 00 00 00 B6 + 6A 61 76 61 2F 69 6F 2F 50 72 69 6E 74 53 74 72 65 61 6D + 70 72 69 6E 74 6C 6E + 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 29 56 + 00 + + 65 65 64 61 34 34 66 36 2D 38 62 35 66 2D 34 35 30 63 2D 38 33 36 66 2D 34 63 38 64 39 31 37 31 62 34 61 62 + + 00 00 00 00 00 00 00 B1 + + 33 35 39 65 66 62 63 63 2D 32 34 64 66 2D 34 63 38 37 2D 38 30 62 33 2D 34 61 64 38 63 66 35 34 35 31 36 32 + + + + + + 4C 6A 61 76 61 2F 6C 61 6E 67 2F 44 65 70 72 65 63 61 74 65 64 3B + 01 + + + + + From ba5134c675f04c9ddfd7b3e81fffab40e651fc40 Mon Sep 17 00:00:00 2001 From: volodya-lombrozo Date: Tue, 28 May 2024 09:52:41 +0300 Subject: [PATCH 35/41] feat(#229): add a new puzzle for JeoAndOpeoTest --- src/test/java/it/JeoAndOpeoTest.java | 150 ++++++++++++--------------- 1 file changed, 67 insertions(+), 83 deletions(-) diff --git a/src/test/java/it/JeoAndOpeoTest.java b/src/test/java/it/JeoAndOpeoTest.java index 599893cf..a0f202b5 100644 --- a/src/test/java/it/JeoAndOpeoTest.java +++ b/src/test/java/it/JeoAndOpeoTest.java @@ -23,7 +23,6 @@ */ package it; -import com.jcabi.xml.XML; import com.jcabi.xml.XMLDocument; import java.io.FileNotFoundException; import java.io.IOException; @@ -31,7 +30,6 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; @@ -47,8 +45,6 @@ import org.eolang.jeo.representation.xmir.XmlMethod; import org.eolang.jeo.representation.xmir.XmlOperand; import org.eolang.jeo.representation.xmir.XmlProgram; -import org.eolang.opeo.ast.Label; -import org.eolang.opeo.ast.Labeled; import org.eolang.opeo.ast.Opcode; import org.eolang.opeo.compilation.JeoCompiler; import org.eolang.opeo.jeo.JeoDecompiler; @@ -65,6 +61,12 @@ * Integration tests for JEO and OPEO transformations. * This class is rather useful for bug identification on different transformation stages. * @since 0.2 + * @todo #229:90min Refactor JeoAndOpeoTest. + * In orderd to check the correctness of the transformation from JEO to OPEO, + * we created this class. Since we didn't have time to write it properly, + * we need to refactor it. The main goal is to make the tests more readable and + * to make the test names more descriptive. Moreover, the test + * {@link #findTheProblem(String, String)} should be moved into a separate place. */ final class JeoAndOpeoTest { @@ -115,14 +117,12 @@ void compilesAlreadyCompiledAndAssembles(final String path) { }) void decompilesCompilesAndKeepsTheSameInstructions(final String path) throws Exception { final XMLDocument original = new XMLDocument(new BytesOf(new ResourceOf(path)).asBytes()); - final XML decompiled = new JeoDecompiler(original).decompile(); - System.out.println(decompiled); MatcherAssert.assertThat( "The original and compiled instructions are not equal", new JeoInstructions( new XmlProgram( new JeoCompiler( - decompiled + new JeoDecompiler(original).decompile() ).compile() ).top().methods().get(0) ).instuctionNames(), @@ -137,7 +137,7 @@ void decompilesCompilesAndKeepsTheSameInstructions(final String path) throws Exc @ParameterizedTest @CsvSource({ "xmir/disassembled/SimpleLog.xmir", -// "xmir/disassembled/OpenSSLContext$1.xmir", + "xmir/disassembled/OpenSSLContext$1.xmir", }) void decompilesCompilesAndKeepsTheSameInstructionsWithTheSameOperands( final String path @@ -151,12 +151,11 @@ void decompilesCompilesAndKeepsTheSameInstructionsWithTheSameOperands( ).top().methods().get(0).instructions(); final List expected = new XmlProgram(original).top().methods().get(0) .instructions(); - final int size = expected.size(); for (int index = 0; index < size; ++index) { final XmlBytecodeEntry expect = expected.get(index); final XmlBytecodeEntry act = actual.get(index); - if(expect instanceof XmlLabel && act instanceof XmlLabel) { + if (expect instanceof XmlLabel && act instanceof XmlLabel) { continue; } MatcherAssert.assertThat( @@ -164,7 +163,6 @@ void decompilesCompilesAndKeepsTheSameInstructionsWithTheSameOperands( act, Matchers.equalTo(expect) ); - } } @@ -186,123 +184,109 @@ void decompilesCompilesAndKeepsExactlyTheSameContent( @Test @Disabled - void findTheProblem() { - Path golden = Paths.get( - "/Users/lombrozo/Workspace/EOlang/opeo-maven-plugin/target-standard/it/spring-fat/target/generated-sources/opeo-compile-xmir/org" - ); - - Path real = Paths.get( - "/Users/lombrozo/Workspace/EOlang/opeo-maven-plugin/target/it/spring-fat/target/generated-sources/opeo-compile-xmir/org" - ); - + @ParameterizedTest + @CsvSource( + "./target-standard/it/spring-fat/target/generated-sources/opeo-compile-xmir, ./target/it/spring-fat/target/generated-sources/opeo-compile-xmir" + ) + void findTheProblem(final String etalon, final String target) { + final Path golden = Paths.get(etalon); + final Path real = Paths.get(target); final AtomicInteger counter = new AtomicInteger(0); - final AtomicInteger errorsCounter = new AtomicInteger(0); - final List errorMessages = new ArrayList<>(0); + final AtomicInteger ecounter = new AtomicInteger(0); + final List errors = new ArrayList<>(0); try (final Stream all = Files.walk(golden).filter(Files::isRegularFile)) { all.forEach( path -> { counter.incrementAndGet(); final Path relative = golden.relativize(path); - XMLDocument good = null; + XMLDocument bad; + XMLDocument good; try { good = new XMLDocument(golden.resolve(relative)); - } catch (final FileNotFoundException exception) { - throw new RuntimeException(exception); - } - XMLDocument bad = null; - try { bad = new XMLDocument(real.resolve(relative)); } catch (final FileNotFoundException exception) { - throw new RuntimeException(exception); + throw new IllegalArgumentException( + String.format("File not found: %s", relative), + exception + ); } - - final XmlProgram goodProgram = new XmlProgram(good); - final XmlProgram badProgram = new XmlProgram(bad); - final List goodMethods = goodProgram.top().methods(); - final List badMethods = badProgram.top().methods(); + final XmlProgram gprogram = new XmlProgram(good); + final XmlProgram bprogram = new XmlProgram(bad); + final List gmethods = gprogram.top().methods(); + final List bmethods = bprogram.top().methods(); + final int size = gmethods.size(); outer: - for (int i = 0; i < goodMethods.size(); i++) { - final XmlMethod goodMethod = goodMethods.get(i); - final XmlMethod badMethod = badMethods.get(i); - final List goodInstructions = goodMethod.instructions() + for (int index = 0; index < size; ++index) { + final XmlMethod gmethod = gmethods.get(index); + final XmlMethod bmethod = bmethods.get(index); + final List ginstuctions = gmethod.instructions() .stream() .filter(xmlBytecodeEntry -> !(xmlBytecodeEntry instanceof XmlLabel)) .collect(Collectors.toList()); - final List badInstructions = badMethod.instructions() + final List binstructions = bmethod.instructions() .stream() .filter(xmlBytecodeEntry -> !(xmlBytecodeEntry instanceof XmlLabel)) .collect(Collectors.toList()); - for (int j = 0; j < goodInstructions.size(); j++) { - final XmlBytecodeEntry goodEntry = goodInstructions.get(j); - final XmlBytecodeEntry badEntry = badInstructions.get(j); - - if (goodEntry instanceof XmlInstruction && badEntry instanceof XmlInstruction) { - - final XmlInstruction goodInstruction = (XmlInstruction) goodEntry; - final XmlInstruction badInstruction = (XmlInstruction) badEntry; - - if (goodInstruction.opcode() != badInstruction.opcode()) { + final int isize = ginstuctions.size(); + for (int jindex = 0; jindex < isize; ++jindex) { + final XmlBytecodeEntry gentry = ginstuctions.get(jindex); + final XmlBytecodeEntry bentry = binstructions.get(jindex); + if (gentry instanceof XmlInstruction + && bentry instanceof XmlInstruction) { + final XmlInstruction ginstruction = (XmlInstruction) gentry; + final XmlInstruction binstruction = (XmlInstruction) bentry; + if (ginstruction.opcode() != binstruction.opcode()) { final String message = String.format( "The operands '%s' and '%s' are differ in %n%s%n%s,%nTotal scanned files: %d", - goodEntry, - badEntry, - "file://" + golden.resolve(relative), - "file://" + real.resolve(relative), + gentry, + bentry, + String.format("file://%s", golden.resolve(relative)), + String.format("file://%s", real.resolve(relative)), counter.get() ); -// throw new IllegalArgumentException( -// message -// ); - errorMessages.add(message); - errorsCounter.incrementAndGet(); + errors.add(message); + ecounter.incrementAndGet(); break outer; } - final List goodOperands = goodInstruction.operands(); - final List badOperands = badInstruction.operands(); - for (int k = 0; k < goodOperands.size(); k++) { - final XmlOperand goodOperand = goodOperands.get(k); - final XmlOperand badOperand = badOperands.get(k); - + final List goodOperands = ginstruction.operands(); + final List badOperands = binstruction.operands(); + for (int kindex = 0; kindex < goodOperands.size(); ++kindex) { + final XmlOperand goodOperand = goodOperands.get(kindex); + final XmlOperand badOperand = badOperands.get(kindex); final String goodOperandString = goodOperand.toString(); final String badOperandString = badOperand.toString(); - if (goodOperandString.contains( - "label") && badOperandString.contains("label")) + if (goodOperandString.contains("label") + && badOperandString.contains("label")) continue; if (!goodOperandString.equals(badOperandString)) { final String message = String.format( "The operands '%s' and '%s' are differ in '%s'%n'%s'%n'%s',%n%s%n%s%nTotal scanned files: %d", - goodEntry, - badEntry, + gentry, + bentry, relative, goodOperand, badOperand, - "file://" + golden.resolve(relative), - "file://" + real.resolve(relative), + String.format("file://%s", golden.resolve(relative)), + String.format("file://%s", real.resolve(relative)), counter.get() ); -// throw new IllegalArgumentException(message); - errorMessages.add(message); - errorsCounter.incrementAndGet(); + errors.add(message); + ecounter.incrementAndGet(); break outer; } } - } - - } } - System.out.println("Total files:" + counter.get()); - System.out.println("Number of failed files:" + errorsCounter.get()); + System.out.printf("Total files:%d%n", counter.get()); + System.out.printf("Number of failed files:%d%n", ecounter.get()); } ); } catch (final IOException exception) { - throw new RuntimeException(exception); + throw new IllegalStateException("Can't walk through the files", exception); } - System.out.println("All Errors:\n"); - errorMessages.forEach(System.out::println); + System.out.println("All Found Errors:\n"); + errors.forEach(System.out::println); } - - } From 808c1cbeea4e4e15bbd2ea3f880f28555f590451 Mon Sep 17 00:00:00 2001 From: volodya-lombrozo Date: Tue, 28 May 2024 10:17:06 +0300 Subject: [PATCH 36/41] feat(#229): print first statistics --- src/it/spring-fat/README.md | 48 +++++++++++++++++++++++++--- src/it/spring-fat/invoker.properties | 2 +- 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/src/it/spring-fat/README.md b/src/it/spring-fat/README.md index 9c16a325..cf9553cb 100644 --- a/src/it/spring-fat/README.md +++ b/src/it/spring-fat/README.md @@ -93,13 +93,51 @@ This might be helpful to exclude an optimization influence. Here is the summary of the first results of the `spring-fat` integration test: +### Total + - The application starts and runs successfully. -- The average test time is approximately **826 seconds (13 minutes)**. +- Time is **11:08 min**. +- The total number of classes is **19511**. +- Phases: **disassemble**, **decompile**, **optimize**, **phi**, **compile**, * + *assemble**. + +### Disassemble + +- All classes are successfully disassembled. - The total number of classes is **19511**. -- The Disassembly phase takes approximately **1 minute**. -- The Decompile phase takes approximately **K minutes**. -- The Compile phase takes approximately **L minutes**. -- The Assembly phase takes approximately **56 seconds**. +- The Disassembly phase takes **50s**. + +### Decompile + +- Some classes are not decompiled due to unsupported instructions. We skip a + file if it contains at least one instruction we don't support yet. Skipped + files are copied as is from the disassembled directory to the decompiled. +- The total number of truly decompiled classes is **4672**. +- The Decompile phase takes **? min**. + +### Optimize + +- We used the "staticize" optimization from the `ineo-maven-plugin`. +- The total number of optimized classes is **1**. +- The Optimize phase takes **? min**. + +### Phi + +- We print PHI expressions for all truly decompiled classes. +- The total number of classes with PHI expressions is **4672**. +- The Phi phase takes **? min**. + +### Compile + +- We compile all the classes from different XMIR representations. +- The total number of compiled classes is **19511**. +- The Compile phase takes **? min**. + +### Assemble + +- We assemble all the classes back to the bytecode. +- The total number of assembled classes is **19511**. +- The Assembly phase takes **57s**. ## Developer Notes diff --git a/src/it/spring-fat/invoker.properties b/src/it/spring-fat/invoker.properties index cf8fd8ea..b0371e18 100644 --- a/src/it/spring-fat/invoker.properties +++ b/src/it/spring-fat/invoker.properties @@ -1,2 +1,2 @@ invoker.goals=clean test -e -invoker.profiles=disassemble,decompile,ineo,compile,assemble +invoker.profiles=disassemble,decompile,ineo,phi,compile,assemble From da64268ede289feef4afabf1057fb4da520324ae Mon Sep 17 00:00:00 2001 From: volodya-lombrozo Date: Tue, 28 May 2024 10:31:22 +0300 Subject: [PATCH 37/41] feat(#229): add two more puzzles for refactoring --- .../java/org/eolang/opeo/ast/Constant.java | 58 +++++++++++++-- .../java/org/eolang/opeo/ast/Duplicate.java | 72 ++++++++++++++++--- 2 files changed, 112 insertions(+), 18 deletions(-) diff --git a/src/main/java/org/eolang/opeo/ast/Constant.java b/src/main/java/org/eolang/opeo/ast/Constant.java index fce63207..d4f00eef 100644 --- a/src/main/java/org/eolang/opeo/ast/Constant.java +++ b/src/main/java/org/eolang/opeo/ast/Constant.java @@ -1,3 +1,26 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2016-2023 Objectionary.com + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ package org.eolang.opeo.ast; import java.util.Collections; @@ -10,26 +33,42 @@ import org.xembly.Directive; import org.xembly.Directives; +/** + * Constant. + * This class represents LDC instruction in the JVM bytecode. + * @since 0.2 + * @todo #229:90min Do we need {@link Constant} class? + * It seems that this class is rather similar to {@link Literal} class. + * We need to investigate if we can remove this class and use {@link Literal} instead. + * If we can't remove this class, we need to add more tests to cover all the cases + * where {@link Constant} is used. + */ public final class Constant implements AstNode, Typed { + /** + * The constant value. + */ private final Object value; + /** + * Constructor. + * @param node The XMIR node with value to parse. + */ public Constant(final XmlNode node) { - this(parse(node)); + this(Constant.parse(node)); } + /** + * Constructor. + * @param value The constant value. + */ public Constant(final Object value) { this.value = value; } @Override public List opcodes() { -// if (this.value instanceof Type) { -// return Collections.singletonList( -// new Opcode(Opcodes.LDC, ((Type) this.value).getClass())); -// } else { - return Collections.singletonList(new Opcode(Opcodes.LDC, this.value)); -// } + return Collections.singletonList(new Opcode(Opcodes.LDC, this.value)); } @Override @@ -49,6 +88,11 @@ public Type type() { } } + /** + * Parse the Constant value from XMIR representation. + * @param node The node to parse. + * @return The parsed value. + */ private static Object parse(final XmlNode node) { final XmlNode child = node.firstChild(); return DataType.find(child.attribute("base").orElseThrow()) diff --git a/src/main/java/org/eolang/opeo/ast/Duplicate.java b/src/main/java/org/eolang/opeo/ast/Duplicate.java index b6ab9298..6fd47469 100644 --- a/src/main/java/org/eolang/opeo/ast/Duplicate.java +++ b/src/main/java/org/eolang/opeo/ast/Duplicate.java @@ -1,3 +1,26 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2016-2023 Objectionary.com + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ package org.eolang.opeo.ast; import java.util.Collections; @@ -11,29 +34,52 @@ import org.xembly.Directive; import org.xembly.Directives; +/** + * Duplicate. + * This class represents the DUP instruction in the JVM bytecode. + * @since 0.2 + * @todo #229:90min Do we need {@link Duplicate} class? + * We have three classes with rather similar semantics: {@link Duplicate}, + * {@link Reference} and {@link Linked}. + * They have similar methods and fields. We need to investigate if we can + * remove one or two of these classes and use the remaining one instead. + */ public final class Duplicate implements AstNode, Typed, Linked { - private final AtomicBoolean convertedToOpcodes; - private final AtomicBoolean convertedToXmir; + /** + * Flag to indicate if the node was compiled. + */ + private final AtomicBoolean compiled; + /** + * Flag to indicate if the node was decompiled. + */ + private final AtomicBoolean decompiled; + + /** + * The original node which was duplicated. + */ private final AtomicReference original; + /** + * Constructor. + * @param original The original node to duplicate. + */ public Duplicate(final AstNode original) { this.original = new AtomicReference<>(original); - this.convertedToOpcodes = new AtomicBoolean(false); - this.convertedToXmir = new AtomicBoolean(false); + this.compiled = new AtomicBoolean(false); + this.decompiled = new AtomicBoolean(false); } @Override public List opcodes() { - if (this.convertedToOpcodes.getAndSet(true)) { + if (this.compiled.getAndSet(true)) { return Collections.emptyList(); } return Stream.concat( this.original.get().opcodes().stream(), Stream.of(new Opcode(Opcodes.DUP)) ).collect(Collectors.toList()); -// return this.original.get().opcodes().stream().collect(Collectors.toList()); } @Override @@ -47,7 +93,7 @@ public Type type() { @Override public Iterable toXmir() { - if (this.convertedToXmir.getAndSet(true)) { + if (this.decompiled.getAndSet(true)) { return Collections.emptyList(); } return new Directives() @@ -57,10 +103,6 @@ public Iterable toXmir() { .up(); } - public AstNode origin() { - return this.original.get(); - } - @Override public void link(final AstNode node) { this.original.set(node); @@ -70,4 +112,12 @@ public void link(final AstNode node) { public AstNode current() { return this.original.get(); } + + /** + * Get the original node which was duplicated. + * @return The original node. + */ + public AstNode origin() { + return this.original.get(); + } } From efba902930890cb8921aba6c5f7896a8619b2589 Mon Sep 17 00:00:00 2001 From: volodya-lombrozo Date: Tue, 28 May 2024 10:44:23 +0300 Subject: [PATCH 38/41] feat(#229): add more puzzles --- src/it/spring-fat/README.md | 4 +- .../org/eolang/opeo/SelectiveDecompiler.java | 20 -------- src/main/java/org/eolang/opeo/ast/Popped.java | 42 ++++++++++++++++- .../opeo/compilation/DefaultCompiler.java | 46 +------------------ 4 files changed, 44 insertions(+), 68 deletions(-) diff --git a/src/it/spring-fat/README.md b/src/it/spring-fat/README.md index cf9553cb..b2af0d65 100644 --- a/src/it/spring-fat/README.md +++ b/src/it/spring-fat/README.md @@ -124,7 +124,9 @@ Here is the summary of the first results of the `spring-fat` integration test: ### Phi - We print PHI expressions for all truly decompiled classes. -- The total number of classes with PHI expressions is **4672**. +- Some classes are not printed due to some issues with the XMIR representation. + We skip a file if it contains at least one issue. +- The total number of classes with PHI expressions is **4153**. - The Phi phase takes **? min**. ### Compile diff --git a/src/main/java/org/eolang/opeo/SelectiveDecompiler.java b/src/main/java/org/eolang/opeo/SelectiveDecompiler.java index 22a24ff0..527c32b1 100644 --- a/src/main/java/org/eolang/opeo/SelectiveDecompiler.java +++ b/src/main/java/org/eolang/opeo/SelectiveDecompiler.java @@ -28,7 +28,6 @@ import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; -import java.util.stream.Stream; import org.eolang.opeo.decompilation.Decompiler; import org.eolang.opeo.decompilation.handlers.RouterHandler; import org.eolang.opeo.jeo.JeoDecompiler; @@ -158,25 +157,6 @@ public void decompile() { ); } - private boolean excluded(final String relative) { - return Stream.of( - // All commented packages were added to the build. Вот эти зависимостри были проверены - они не создают проблем - // "junit", - - - "ch", "com", "javax", - -// "net", - -// То что ниже исключено из билда, то что посередине, добавлено. -// Если билд фейлится, то одна из зависимостей выше инициировала падение - "aopalliance", "apiguardian", "assertj", "eolang", "hamcrest", "json", - "mockito", "objectweb", "objenesis", "opentest4j", "slf4j", "xmlunit", - - "springframework", "yaml" - ).anyMatch(relative::contains); - } - /** * Xpath to find all opcodes that are not supported. * @return Xpath. diff --git a/src/main/java/org/eolang/opeo/ast/Popped.java b/src/main/java/org/eolang/opeo/ast/Popped.java index b3db9ce0..95ae6c7c 100644 --- a/src/main/java/org/eolang/opeo/ast/Popped.java +++ b/src/main/java/org/eolang/opeo/ast/Popped.java @@ -1,7 +1,28 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2016-2023 Objectionary.com + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ package org.eolang.opeo.ast; -import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -10,10 +31,27 @@ import org.xembly.Directive; import org.xembly.Directives; +/** + * Popped. + * This node represents a node that is popped from the stack. + * @since 0.2 + * @todo #229:90min Do we need to implement the `Popped` node? + * The `Popped` node is a node that represents a node that is popped from the stack. + * Maybe it's better to just silently pop the node from the stack and not represent it in the AST. + * Let's decide if we need to implement the `Popped` node or not. + * If we decide to implement it, we need to write tests for it. + */ public final class Popped implements AstNode, Typed { + /** + * The popped node. + */ private final AstNode node; + /** + * Constructor. + * @param node The popped node. + */ public Popped(final AstNode node) { this.node = node; } diff --git a/src/main/java/org/eolang/opeo/compilation/DefaultCompiler.java b/src/main/java/org/eolang/opeo/compilation/DefaultCompiler.java index 5d603195..1e56ef3a 100644 --- a/src/main/java/org/eolang/opeo/compilation/DefaultCompiler.java +++ b/src/main/java/org/eolang/opeo/compilation/DefaultCompiler.java @@ -25,7 +25,6 @@ import com.jcabi.log.Logger; import java.nio.file.Path; -import java.util.stream.Stream; import org.eolang.opeo.storage.CompilationStorage; import org.eolang.opeo.storage.Storage; import org.eolang.opeo.storage.XmirEntry; @@ -86,50 +85,7 @@ public void compile() { * @return Number of compiled files. */ private int compile(final XmirEntry xmir) { -// if (!this.excluded(xmir.relative())) { -// Logger.info(this, "COMPILER CANDIDATE %s", xmir.relative()); - this.storage.save(xmir.transform(xml -> new JeoCompiler(xml).compile())); -// } else { -// this.storage.save(xmir); -// } + this.storage.save(xmir.transform(xml -> new JeoCompiler(xml).compile())); return 1; } - - - private boolean excluded(final String relative) { - return Stream.of( - -// NOT HERE - "javax", -// "javax/servlet", -// "javax/activation", -// "javax/activation", -// "javax/el", -// "javax/security", -// "javax/websocket", -// "javax/xml", - - "ch", - "com", - -//PROBLEM HERE? -// "net/minidev", -// "net/bytebuddy", - - -// Hm excluding them didn't give any results - "aopalliance", "apiguardian", "assertj", "eolang", "hamcrest", "json", -// "junit", - "mockito", "objectweb", "objenesis", "opentest4j", "slf4j", "xmlunit" -// - , - -// Seems that Problem not with spring - "springframework" -// -// WORKS FINE - , "yaml", "net" - ).anyMatch(relative::contains); - } - } From 9f9a19bd743a348fbd13aaafdeeaa8d48d2d5119 Mon Sep 17 00:00:00 2001 From: volodya-lombrozo Date: Tue, 28 May 2024 12:31:53 +0300 Subject: [PATCH 39/41] feat(#229): fixed all qulice suggestions --- .../java/org/eolang/opeo/ast/AstNode.java | 7 +- .../java/org/eolang/opeo/ast/Constant.java | 6 +- .../java/org/eolang/opeo/ast/Constructor.java | 25 ++++-- .../opeo/ast/ConstructorDescriptor.java | 49 +++++------- .../java/org/eolang/opeo/ast/Duplicate.java | 28 ++++--- .../java/org/eolang/opeo/ast/Invocation.java | 7 +- src/main/java/org/eolang/opeo/ast/Linked.java | 35 +++++++++ .../java/org/eolang/opeo/ast/NewAddress.java | 68 +++++++++++++--- src/main/java/org/eolang/opeo/ast/Opcode.java | 1 - .../java/org/eolang/opeo/ast/Reference.java | 4 - .../eolang/opeo/compilation/JeoCompiler.java | 19 +++-- .../eolang/opeo/compilation/XmirParser.java | 12 +-- .../opeo/decompilation/LocalVariables.java | 74 ++++++++++++------ .../opeo/decompilation/OperandStack.java | 13 +++- .../decompilation/handlers/DupHandler.java | 2 - .../handlers/InvokespecialHandler.java | 43 ++--------- .../decompilation/handlers/LabelHandler.java | 3 +- .../decompilation/handlers/LdcHandler.java | 1 - .../decompilation/handlers/NewHandler.java | 1 - .../decompilation/handlers/PopHandler.java | 1 - .../handlers/StoreToArrayHandler.java | 15 +++- .../org/eolang/opeo/jeo/JeoDecompiler.java | 17 ++-- src/test/java/it/JeoAndOpeoTest.java | 77 +++++++++++-------- .../org/eolang/opeo/ast/NewAddressTest.java | 39 +++++++++- .../opeo/compilation/DefaultCompilerTest.java | 3 - .../opeo/compilation/JeoCompilerTest.java | 1 - .../opeo/compilation/XmirParserTest.java | 6 +- .../decompilation/DecompilerMachineTest.java | 59 +++++++------- .../decompilation/NaiveDecompilerTest.java | 2 - .../eolang/opeo/jeo/JeoInstructionsTest.java | 1 - 30 files changed, 374 insertions(+), 245 deletions(-) diff --git a/src/main/java/org/eolang/opeo/ast/AstNode.java b/src/main/java/org/eolang/opeo/ast/AstNode.java index 0e9383dd..ee0a3b78 100644 --- a/src/main/java/org/eolang/opeo/ast/AstNode.java +++ b/src/main/java/org/eolang/opeo/ast/AstNode.java @@ -39,8 +39,11 @@ public interface AstNode extends Xmir { */ List opcodes(); - - class Empty implements AstNode { + /** + * Empty node that does nothing. + * @since 0.2 + */ + final class Empty implements AstNode { @Override public List opcodes() { diff --git a/src/main/java/org/eolang/opeo/ast/Constant.java b/src/main/java/org/eolang/opeo/ast/Constant.java index d4f00eef..bc17a2e1 100644 --- a/src/main/java/org/eolang/opeo/ast/Constant.java +++ b/src/main/java/org/eolang/opeo/ast/Constant.java @@ -81,11 +81,13 @@ public Iterable toXmir() { @Override public Type type() { + final Type result; if (this.value instanceof Type) { - return (Type) this.value; + result = (Type) this.value; } else { - return Type.getType(this.value.getClass()); + result = Type.getType(this.value.getClass()); } + return result; } /** diff --git a/src/main/java/org/eolang/opeo/ast/Constructor.java b/src/main/java/org/eolang/opeo/ast/Constructor.java index d82855d7..b32c03b8 100644 --- a/src/main/java/org/eolang/opeo/ast/Constructor.java +++ b/src/main/java/org/eolang/opeo/ast/Constructor.java @@ -101,6 +101,12 @@ public Constructor( this(new NewAddress(type), attrs, args); } + /** + * Constructor. + * @param ctype Constructor type + * @param attributes Constructor attributes + * @param arguments Constructor arguments + */ public Constructor( final AstNode ctype, final Attributes attributes, @@ -126,13 +132,11 @@ public Iterable toXmir() { public List opcodes() { final List res = new ArrayList<>(0); res.addAll(this.ctype.opcodes()); -// res.add(new Opcode(Opcodes.NEW, this.ctype)); -// res.add(new Opcode(Opcodes.DUP)); this.arguments.stream().map(AstNode::opcodes).forEach(res::addAll); res.add( new Opcode( Opcodes.INVOKESPECIAL, - this.opcodeType(this.ctype), + this.type(this.ctype), "", this.attributes.descriptor(), this.attributes.interfaced() @@ -146,13 +150,19 @@ public Type type() { return ((Typed) this.ctype).type(); } - private String opcodeType(final AstNode node) { + /** + * Get a type of constructor. + * @param node Constructor node. + * @return Type of constructor. + */ + private String type(final AstNode node) { + final String result; if (node instanceof NewAddress) { - return ((NewAddress) node).typeString(); + result = ((NewAddress) node).typeAsString(); } else if (node instanceof Reference) { - return opcodeType(((Reference) node).object()); + result = this.type(((Reference) node).object()); } else if (node instanceof Duplicate) { - return opcodeType(((Duplicate) node).origin()); + result = this.type(((Duplicate) node).origin()); } else { throw new IllegalStateException( String.format( @@ -161,5 +171,6 @@ private String opcodeType(final AstNode node) { ) ); } + return result; } } diff --git a/src/main/java/org/eolang/opeo/ast/ConstructorDescriptor.java b/src/main/java/org/eolang/opeo/ast/ConstructorDescriptor.java index 2136dcf1..1cfed5fe 100644 --- a/src/main/java/org/eolang/opeo/ast/ConstructorDescriptor.java +++ b/src/main/java/org/eolang/opeo/ast/ConstructorDescriptor.java @@ -30,6 +30,11 @@ /** * Constructor descriptor. * @since 0.2 + * @todo #229:90min Generalize ConstructorDescriptor to be used in all cases. + * Currently we have a workarond for classes in `org.eolang` package. + * See {@link #toString()} method. + * As you can see, we have a check for `org/eolang` in the descriptor. + * We should remove this crutch and make it work for all cases. */ public final class ConstructorDescriptor { @@ -43,12 +48,17 @@ public final class ConstructorDescriptor { */ private final List args; + /** + * Constructor. + * @param args Constructor arguments. + */ public ConstructorDescriptor(final List args) { this("", args); } /** * Constructor. + * @param descriptor Descriptor. * @param arguments Constructor arguments. */ public ConstructorDescriptor(final String descriptor, final List arguments) { @@ -58,43 +68,22 @@ public ConstructorDescriptor(final String descriptor, final List argume @Override public String toString() { - return this.combine(); - } - - /** - * TODO: explain - * @return - */ - private String combine() { -// return Type.getMethodDescriptor( -// Type.VOID_TYPE, -// this.args.stream() -// .peek(this::verify) -// .map(Typed.class::cast) -// .map(Typed::type) -// .toArray(Type[]::new) -// ); - - + final String result; if (this.descriptor.contains("org/eolang") || this.descriptor.contains("org.eolang") || this.descriptor.isEmpty()) { - return Type.getMethodDescriptor( + result = Type.getMethodDescriptor( Type.VOID_TYPE, - this.argumentTypes() + this.args.stream() + .peek(this::verify) + .map(Typed.class::cast) + .map(Typed::type) + .toArray(Type[]::new) ); } else { - return this.descriptor; + result = this.descriptor; } - } - - - private Type[] argumentTypes() { - return this.args.stream() - .peek(this::verify) - .map(Typed.class::cast) - .map(Typed::type) - .toArray(Type[]::new); + return result; } /** diff --git a/src/main/java/org/eolang/opeo/ast/Duplicate.java b/src/main/java/org/eolang/opeo/ast/Duplicate.java index 6fd47469..17766250 100644 --- a/src/main/java/org/eolang/opeo/ast/Duplicate.java +++ b/src/main/java/org/eolang/opeo/ast/Duplicate.java @@ -73,13 +73,16 @@ public Duplicate(final AstNode original) { @Override public List opcodes() { + final List result; if (this.compiled.getAndSet(true)) { - return Collections.emptyList(); + result = Collections.emptyList(); + } else { + result = Stream.concat( + this.original.get().opcodes().stream(), + Stream.of(new Opcode(Opcodes.DUP)) + ).collect(Collectors.toList()); } - return Stream.concat( - this.original.get().opcodes().stream(), - Stream.of(new Opcode(Opcodes.DUP)) - ).collect(Collectors.toList()); + return result; } @Override @@ -93,14 +96,17 @@ public Type type() { @Override public Iterable toXmir() { + final Iterable result; if (this.decompiled.getAndSet(true)) { - return Collections.emptyList(); + result = Collections.emptyList(); + } else { + result = new Directives() + .add("o") + .attr("base", "duplicated") + .append(this.original.get().toXmir()) + .up(); } - return new Directives() - .add("o") - .attr("base", "duplicated") - .append(this.original.get().toXmir()) - .up(); + return result; } @Override diff --git a/src/main/java/org/eolang/opeo/ast/Invocation.java b/src/main/java/org/eolang/opeo/ast/Invocation.java index 9b3eb4fb..ce4a59dc 100644 --- a/src/main/java/org/eolang/opeo/ast/Invocation.java +++ b/src/main/java/org/eolang/opeo/ast/Invocation.java @@ -161,7 +161,12 @@ public List opcodes() { this.source ) ); - }//todo: why? + } + //@checkstyle MethodBodyCommentsCheck (10 line) + // @todo #229:90min Avoid using the owner from the attributes. + // Instead, use the owner from the source. + // This will allow us to avoid using the owner in the attributes. + // Right now we have ad-hoc logic to determine the owner. final String owner; if (this.attributes.toString().contains("owner")) { owner = this.attributes.owner(); diff --git a/src/main/java/org/eolang/opeo/ast/Linked.java b/src/main/java/org/eolang/opeo/ast/Linked.java index b5b419d0..18b06a4b 100644 --- a/src/main/java/org/eolang/opeo/ast/Linked.java +++ b/src/main/java/org/eolang/opeo/ast/Linked.java @@ -1,8 +1,43 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2016-2023 Objectionary.com + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ package org.eolang.opeo.ast; +/** + * Class representing a reference. + * @since 0.2 + */ public interface Linked { + /** + * Link the node. + * @param node The node to link. + */ void link(AstNode node); + /** + * Retrieve the current node. + * @return The current node. + */ AstNode current(); } diff --git a/src/main/java/org/eolang/opeo/ast/NewAddress.java b/src/main/java/org/eolang/opeo/ast/NewAddress.java index 14602292..97e2454a 100644 --- a/src/main/java/org/eolang/opeo/ast/NewAddress.java +++ b/src/main/java/org/eolang/opeo/ast/NewAddress.java @@ -1,3 +1,26 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2016-2023 Objectionary.com + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ package org.eolang.opeo.ast; import java.util.Collections; @@ -13,25 +36,37 @@ import org.xembly.Directives; /** - * Same as reference? + * This class represents NEW instruction in the JVM bytecode. + * @since 0.2 */ @ToString @EqualsAndHashCode public final class NewAddress implements AstNode, Typed { - private final String type; + /** + * Type of the new object. + */ + private final String ctype; + /** + * Constructor. + * @param node The XMIR node with a type to parse. + */ public NewAddress(final XmlNode node) { this(NewAddress.parse(node)); } + /** + * Constructor. + * @param type The type. + */ public NewAddress(final String type) { - this.type = type; + this.ctype = type; } @Override public List opcodes() { - return Collections.singletonList(new Opcode(Opcodes.NEW, this.type)); + return Collections.singletonList(new Opcode(Opcodes.NEW, this.ctype)); } @Override @@ -39,20 +74,29 @@ public Iterable toXmir() { return new Directives() .add("o") .attr("base", ".new-type") - .append(new DirectivesData(this.type)) + .append(new DirectivesData(this.ctype)) .up(); } - private static String parse(final XmlNode node) { - return new HexString(node.firstChild().text()).decode(); - } - @Override public Type type() { - return Type.getObjectType(this.type); + return Type.getObjectType(this.ctype); } - public String typeString() { - return this.type; + /** + * Type as string. + * @return Type as string. + */ + String typeAsString() { + return this.ctype; + } + + /** + * Prestructor that retrieves type from XMIR node. + * @param node XMIR node to parse. + * @return Type as string. + */ + private static String parse(final XmlNode node) { + return new HexString(node.firstChild().text()).decode(); } } diff --git a/src/main/java/org/eolang/opeo/ast/Opcode.java b/src/main/java/org/eolang/opeo/ast/Opcode.java index 2b320edd..b5994fb7 100644 --- a/src/main/java/org/eolang/opeo/ast/Opcode.java +++ b/src/main/java/org/eolang/opeo/ast/Opcode.java @@ -118,7 +118,6 @@ public List opcodes() { case Opcodes.INVOKEINTERFACE: case Opcodes.INVOKESPECIAL: case Opcodes.INVOKESTATIC: -// case Opcodes.INVOKEDYNAMIC: this.appendInterfaced(); break; default: diff --git a/src/main/java/org/eolang/opeo/ast/Reference.java b/src/main/java/org/eolang/opeo/ast/Reference.java index 72f41356..bcdd0c42 100644 --- a/src/main/java/org/eolang/opeo/ast/Reference.java +++ b/src/main/java/org/eolang/opeo/ast/Reference.java @@ -63,10 +63,6 @@ public Reference(final AtomicReference ref) { this.ref = ref; } - /** - * Link this reference with the given object. - * @param node Object to link with. - */ @Override public void link(final AstNode node) { this.ref.set(node); diff --git a/src/main/java/org/eolang/opeo/compilation/JeoCompiler.java b/src/main/java/org/eolang/opeo/compilation/JeoCompiler.java index 60589494..3651d1d7 100644 --- a/src/main/java/org/eolang/opeo/compilation/JeoCompiler.java +++ b/src/main/java/org/eolang/opeo/compilation/JeoCompiler.java @@ -76,19 +76,24 @@ public XML compile() { * The method {@link #compile} is catching generic exceptions which is bad. * We should refactor it to simplify the code and remove duplicated catch blocks. * After, don't forget to remove the Checkstyle and PMD tags. + * @todo #229:90min Optimize Labels Generation. + * Here we clean the cache of labels before compiling a method. This is a workaround + * to avoid a bug in the generation of labels. When we have lot's of methods, the cache grows + * and the compilation time increases significantly. + * @todo #229:90min Calculate the Max Stack Size. + * We should calculate the max stack size of the method and set it in the compiled method. + * This is important to avoid runtime errors when running the compiled code. + * We used to use 'withoutMaxs()' method to avoid this, but it causes some errors. + * Actually, you can try to use it to see the errors. * @checkstyle IllegalCatch (50 lines) */ @SuppressWarnings({"PMD.AvoidCatchingGenericException", "PMD.IdenticalCatchBranches"}) private static XmlMethod compile(final XmlMethod method) { try { - //todo! explain new AllLabels().clearCache(); - //todo! explain - return method -// .withoutMaxs() - .withInstructions( - new XmirParser(method.nodes()).toJeoNodes().toArray(XmlNode[]::new) - ); + return method.withInstructions( + new XmirParser(method.nodes()).toJeoNodes().toArray(XmlNode[]::new) + ); } catch (final ClassCastException exception) { throw new IllegalArgumentException( String.format( diff --git a/src/main/java/org/eolang/opeo/compilation/XmirParser.java b/src/main/java/org/eolang/opeo/compilation/XmirParser.java index 4089209b..3c401d38 100644 --- a/src/main/java/org/eolang/opeo/compilation/XmirParser.java +++ b/src/main/java/org/eolang/opeo/compilation/XmirParser.java @@ -66,6 +66,7 @@ * High-level representation of Opeo nodes. * * @since 0.1 + * @checkstyle ClassFanOutComplexityCheck (500 lines) */ @SuppressWarnings("PMD.AvoidDuplicateLiterals") final class XmirParser { @@ -249,16 +250,7 @@ private AstNode node(final XmlNode node) { result = new LocalVariable(node); } else if (".new".equals(base)) { final List inner = node.children().collect(Collectors.toList()); -// final String type = inner.get(0).attribute("base").orElseThrow( -// () -> new IllegalArgumentException( -// String.format( -// "Can't find type of '%s'", -// base -// ) -// ) -// ); - - final AstNode target = node(inner.get(0)); + final AstNode target = this.node(inner.get(0)); final List args = this.args(inner); final String descriptor = node.attribute("scope") .map(Attributes::new) diff --git a/src/main/java/org/eolang/opeo/decompilation/LocalVariables.java b/src/main/java/org/eolang/opeo/decompilation/LocalVariables.java index 57768029..47f38c13 100644 --- a/src/main/java/org/eolang/opeo/decompilation/LocalVariables.java +++ b/src/main/java/org/eolang/opeo/decompilation/LocalVariables.java @@ -56,7 +56,7 @@ public final class LocalVariables { /** * Class type. - * todo! explain + * We need a class name to correctly generate the 'this' reference with the correct type. */ private final Type clazz; @@ -64,12 +64,12 @@ public final class LocalVariables { * Constructor. * @param modifiers Method access modifiers. * @param descriptor Method descriptor. + * @param type Method type. */ - public LocalVariables(final int modifiers, final String descriptor, final String name) { - this(modifiers, new VariablesArray(modifiers, descriptor).array(), Type.getType(name)); + public LocalVariables(final int modifiers, final String descriptor, final String type) { + this(modifiers, new VariablesArray(modifiers, descriptor).array(), Type.getType(type)); } - /** * Constructor. * @param modifiers Method access modifiers. @@ -95,6 +95,12 @@ private LocalVariables(final int modifiers, final Type... types) { this(modifiers, types, Type.getType(Object.class)); } + /** + * Constructor. + * @param modifiers Method access modifiers. + * @param types Method argument types. + * @param clazz Class type. + */ public LocalVariables( final int modifiers, final Type[] types, @@ -169,41 +175,53 @@ private Optional argumentType(final int index) { } else { result = Optional.ofNullable(this.types[index]); } -// final Optional result; -// final int real; -// if (this.isInstanceMethod()) { -// real = index - 1; -// } else { -// real = index; -// } -// if (real > -1 && real < this.types.length) { -// result = Optional.ofNullable(this.types[real]); -// } else { -// result = Optional.empty(); -// } -// return result; return result; } + /** + * Variables array with types. + * @since 0.2 + */ + private static final class VariablesArray { - private static class VariablesArray { - + /** + * Method modifiers. + */ private final int modifiers; + + /** + * Method descriptor. + */ private final String descriptor; - public VariablesArray(final int modifiers, final String descriptor) { + /** + * Constructor. + * @param modifiers Method modifiers. + * @param descriptor Method descriptor. + */ + private VariablesArray(final int modifiers, final String descriptor) { this.modifiers = modifiers; this.descriptor = descriptor; } - public Type[] array() { + /** + * Convert descriptor to an array of types. + * In bytecode: + * - aload_0 is used to load the reference to this onto the stack. + * So index 0 is reserved for this. + * - 'long' and 'double' values occupy two local variable slots each because + * they are 64-bit values. + * + * @return Array of types. + */ + Type[] array() { final Type[] types = Type.getArgumentTypes(this.descriptor); final Type[] result = new Type[this.size()]; int offset = 0; if (this.isInstanceMethod()) { - offset++; + offset = offset + 1; } - for (int index = 0; index < types.length; index++) { + for (int index = 0; index < types.length; ++index) { final Type current = types[index]; result[index + offset] = current; if (current.getSize() > 1) { @@ -214,7 +232,10 @@ public Type[] array() { return result; } - + /** + * Calculate the size of the array with types. + * @return Size. + */ private int size() { final int result; final int res = Arrays.stream(Type.getArgumentTypes(this.descriptor)) @@ -228,9 +249,12 @@ private int size() { return result; } + /** + * Is it an instance method? + * @return True if it is an instance method. + */ private boolean isInstanceMethod() { return (this.modifiers & Opcodes.ACC_STATIC) == 0; } - } } diff --git a/src/main/java/org/eolang/opeo/decompilation/OperandStack.java b/src/main/java/org/eolang/opeo/decompilation/OperandStack.java index 20b0f982..f5d90d72 100644 --- a/src/main/java/org/eolang/opeo/decompilation/OperandStack.java +++ b/src/main/java/org/eolang/opeo/decompilation/OperandStack.java @@ -66,13 +66,18 @@ private OperandStack(final Deque original) { this.stack = original; } - - public Optional popOpt() { + /** + * Pop one node from the stack or return empty. + * @return Optional node. + */ + public Optional first() { + final Optional result; if (this.stack.isEmpty()) { - return Optional.empty(); + result = Optional.empty(); } else { - return Optional.ofNullable(this.stack.pop()); + result = Optional.ofNullable(this.stack.pop()); } + return result; } /** diff --git a/src/main/java/org/eolang/opeo/decompilation/handlers/DupHandler.java b/src/main/java/org/eolang/opeo/decompilation/handlers/DupHandler.java index f2fe8840..b9d681c3 100644 --- a/src/main/java/org/eolang/opeo/decompilation/handlers/DupHandler.java +++ b/src/main/java/org/eolang/opeo/decompilation/handlers/DupHandler.java @@ -23,7 +23,6 @@ */ package org.eolang.opeo.decompilation.handlers; -import org.eolang.opeo.ast.AstNode; import org.eolang.opeo.ast.Duplicate; import org.eolang.opeo.decompilation.DecompilerState; import org.eolang.opeo.decompilation.InstructionHandler; @@ -39,7 +38,6 @@ public final class DupHandler implements InstructionHandler { public void handle(final DecompilerState state) { final OperandStack stack = state.stack(); stack.push(new Duplicate(stack.pop())); -// stack.dup(); } } diff --git a/src/main/java/org/eolang/opeo/decompilation/handlers/InvokespecialHandler.java b/src/main/java/org/eolang/opeo/decompilation/handlers/InvokespecialHandler.java index 06aa9896..89de7df7 100644 --- a/src/main/java/org/eolang/opeo/decompilation/handlers/InvokespecialHandler.java +++ b/src/main/java/org/eolang/opeo/decompilation/handlers/InvokespecialHandler.java @@ -28,10 +28,7 @@ import org.eolang.opeo.ast.AstNode; import org.eolang.opeo.ast.Attributes; import org.eolang.opeo.ast.Constructor; -import org.eolang.opeo.ast.Duplicate; import org.eolang.opeo.ast.Labeled; -import org.eolang.opeo.ast.Linked; -import org.eolang.opeo.ast.Reference; import org.eolang.opeo.ast.Super; import org.eolang.opeo.ast.This; import org.eolang.opeo.decompilation.DecompilerState; @@ -66,44 +63,16 @@ public void handle(final DecompilerState state) { new Super(target, args, descriptor, type, name) ); } else { -// final Linked linked = this.findLinked(target); - final AstNode constructor = new Constructor( - target, - new Attributes().descriptor(descriptor).interfaced(interfaced), - args + state.stack().push( + new Constructor( + target, + new Attributes().descriptor(descriptor).interfaced(interfaced), + args + ) ); -// linked.link(constructor); - state.stack().push(constructor); - - -// if (target instanceof Reference) { -// ((Reference) target).link(constructor); -// } else if (target instanceof Labeled) { -// ((Reference) ((Labeled) target).origin()).link(constructor); -// } else if (target instanceof Duplicate) { -// -// } else { -// throw new IllegalStateException( -// String.format( -// "Unexpected target type: %s", -// target.getClass().getCanonicalName() -// ) -// ); -// } - } - } - - private Linked findLinked(final AstNode node) { - if (node instanceof Linked) { - return (Linked) node; - } else if (node instanceof Labeled) { - return this.findLinked((((Labeled) node).origin())); - } else { - throw new IllegalStateException(String.format("Can find reference for node %s", node)); } } - /** * Check if the node is "this". * @param candidate Node to check diff --git a/src/main/java/org/eolang/opeo/decompilation/handlers/LabelHandler.java b/src/main/java/org/eolang/opeo/decompilation/handlers/LabelHandler.java index 7dc8d09c..5be17b5a 100644 --- a/src/main/java/org/eolang/opeo/decompilation/handlers/LabelHandler.java +++ b/src/main/java/org/eolang/opeo/decompilation/handlers/LabelHandler.java @@ -36,9 +36,8 @@ public final class LabelHandler implements InstructionHandler { @Override public void handle(final DecompilerState state) { - final AstNode node1 = state.stack().popOpt().orElse(new AstNode.Empty()); final Labeled node = new Labeled( - node1, + state.stack().first().orElse(new AstNode.Empty()), new Label(String.class.cast(state.operand(0))) ); state.stack().push(node); diff --git a/src/main/java/org/eolang/opeo/decompilation/handlers/LdcHandler.java b/src/main/java/org/eolang/opeo/decompilation/handlers/LdcHandler.java index 9605c933..479e2a06 100644 --- a/src/main/java/org/eolang/opeo/decompilation/handlers/LdcHandler.java +++ b/src/main/java/org/eolang/opeo/decompilation/handlers/LdcHandler.java @@ -24,7 +24,6 @@ package org.eolang.opeo.decompilation.handlers; import org.eolang.opeo.ast.Constant; -import org.eolang.opeo.ast.Literal; import org.eolang.opeo.decompilation.DecompilerState; import org.eolang.opeo.decompilation.InstructionHandler; diff --git a/src/main/java/org/eolang/opeo/decompilation/handlers/NewHandler.java b/src/main/java/org/eolang/opeo/decompilation/handlers/NewHandler.java index 274b9b49..9cf78c66 100644 --- a/src/main/java/org/eolang/opeo/decompilation/handlers/NewHandler.java +++ b/src/main/java/org/eolang/opeo/decompilation/handlers/NewHandler.java @@ -24,7 +24,6 @@ package org.eolang.opeo.decompilation.handlers; import org.eolang.opeo.ast.NewAddress; -import org.eolang.opeo.ast.Reference; import org.eolang.opeo.decompilation.DecompilerState; import org.eolang.opeo.decompilation.InstructionHandler; diff --git a/src/main/java/org/eolang/opeo/decompilation/handlers/PopHandler.java b/src/main/java/org/eolang/opeo/decompilation/handlers/PopHandler.java index addb26ca..cb114de5 100644 --- a/src/main/java/org/eolang/opeo/decompilation/handlers/PopHandler.java +++ b/src/main/java/org/eolang/opeo/decompilation/handlers/PopHandler.java @@ -36,7 +36,6 @@ public final class PopHandler implements InstructionHandler { @Override public void handle(final DecompilerState state) { - // We do nothing here to keep the stack contains previous computations. final OperandStack stack = state.stack(); stack.push(new Popped(stack.pop())); } diff --git a/src/main/java/org/eolang/opeo/decompilation/handlers/StoreToArrayHandler.java b/src/main/java/org/eolang/opeo/decompilation/handlers/StoreToArrayHandler.java index e82f353c..3257fcf5 100644 --- a/src/main/java/org/eolang/opeo/decompilation/handlers/StoreToArrayHandler.java +++ b/src/main/java/org/eolang/opeo/decompilation/handlers/StoreToArrayHandler.java @@ -45,21 +45,28 @@ public void handle(final DecompilerState state) { final AstNode value = state.stack().pop(); final AstNode index = state.stack().pop(); final AstNode array = state.stack().pop(); - final Reference ref = findRef(array); + final Reference ref = this.findRef(array); ref.link(new StoreArray(ref.object(), index, value)); state.stack().push(ref); } + /** + * Find reference. + * @param node Node where to search for reference. + * @return Reference. + */ private Reference findRef(final AstNode node) { + final Reference result; if (node instanceof Reference) { - return (Reference) node; + result = (Reference) node; } else if (node instanceof Labeled) { - return findRef((((Labeled) node).origin())); + result = this.findRef(((Labeled) node).origin()); } else if (node instanceof Duplicate) { - return findRef((((Duplicate) node).origin())); + result = this.findRef(((Duplicate) node).origin()); } else { throw new IllegalStateException(String.format("Can find reference for node %s", node)); } + return result; } } diff --git a/src/main/java/org/eolang/opeo/jeo/JeoDecompiler.java b/src/main/java/org/eolang/opeo/jeo/JeoDecompiler.java index 85db29ad..48bca0c9 100644 --- a/src/main/java/org/eolang/opeo/jeo/JeoDecompiler.java +++ b/src/main/java/org/eolang/opeo/jeo/JeoDecompiler.java @@ -27,12 +27,9 @@ import com.jcabi.xml.XMLDocument; import java.util.Map; import java.util.stream.Collectors; -import org.eolang.jeo.representation.ClassName; -import org.eolang.jeo.representation.xmir.XmlClass; import org.eolang.jeo.representation.xmir.XmlMethod; import org.eolang.jeo.representation.xmir.XmlNode; import org.eolang.jeo.representation.xmir.XmlProgram; -import org.eolang.opeo.Instruction; import org.eolang.opeo.decompilation.DecompilerMachine; import org.eolang.opeo.decompilation.LocalVariables; import org.objectweb.asm.Type; @@ -52,6 +49,9 @@ public final class JeoDecompiler { */ private final XML prog; + /** + * Program package. + */ private final String pckg; /** @@ -67,13 +67,13 @@ public JeoDecompiler(final XML prog) { * Constructor. * * @param prog Program in XMIR format received from jeo maven plugin. + * @param pckg Program package. */ public JeoDecompiler(final XML prog, final String pckg) { this.prog = prog; this.pckg = pckg; } - /** * Decompile program. * @@ -81,10 +81,10 @@ public JeoDecompiler(final XML prog, final String pckg) { */ public XML decompile() { final Node node = this.prog.node(); - final XmlClass top = new XmlProgram(node).top(); - final String clazz1 = this.pckg.replace(".xmir", "").replace(".", "/"); - final String descriptor = Type.getObjectType(clazz1).getDescriptor(); - top.methods() + final String descriptor = Type.getObjectType( + this.pckg.replace(".xmir", "").replace(".", "/") + ).getDescriptor(); + new XmlProgram(node).top().methods() .forEach(method -> this.decompile(method, descriptor)); return new XMLDocument(node); } @@ -93,6 +93,7 @@ public XML decompile() { * Decompile method. * * @param method Method. + * @param clazz Class name. */ private void decompile(final XmlMethod method, final String clazz) { try { diff --git a/src/test/java/it/JeoAndOpeoTest.java b/src/test/java/it/JeoAndOpeoTest.java index a0f202b5..30661b83 100644 --- a/src/test/java/it/JeoAndOpeoTest.java +++ b/src/test/java/it/JeoAndOpeoTest.java @@ -96,9 +96,13 @@ void dissassemblesDecompilesCompilesAssembles(final String name) { void compilesAlreadyCompiledAndAssembles(final String path) { Assertions.assertDoesNotThrow( () -> new XmirRepresentation( - new JeoCompiler(new XMLDocument(new BytesOf( - new ResourceOf(String.format("xmir/compiled/%s", path)) - ).asBytes())).compile() + new JeoCompiler( + new XMLDocument( + new BytesOf( + new ResourceOf(String.format("xmir/compiled/%s", path)) + ).asBytes() + ) + ).compile() ).toBytecode(), "We expect that the pipeline 'already-compiled-xmir' -> (compile) -> (assemble) ->'.class' will not throw any exceptions." ); @@ -113,7 +117,7 @@ void compilesAlreadyCompiledAndAssembles(final String path) { "xmir/disassembled/SmartLifecycle.xmir", "xmir/disassembled/FlightRecorderStartupEvent.xmir", "xmir/disassembled/SimpleLog.xmir", - "xmir/disassembled/OpenSSLContext$1.xmir", + "xmir/disassembled/OpenSSLContext$1.xmir" }) void decompilesCompilesAndKeepsTheSameInstructions(final String path) throws Exception { final XMLDocument original = new XMLDocument(new BytesOf(new ResourceOf(path)).asBytes()); @@ -137,7 +141,7 @@ void decompilesCompilesAndKeepsTheSameInstructions(final String path) throws Exc @ParameterizedTest @CsvSource({ "xmir/disassembled/SimpleLog.xmir", - "xmir/disassembled/OpenSSLContext$1.xmir", + "xmir/disassembled/OpenSSLContext$1.xmir" }) void decompilesCompilesAndKeepsTheSameInstructionsWithTheSameOperands( final String path @@ -168,7 +172,9 @@ void decompilesCompilesAndKeepsTheSameInstructionsWithTheSameOperands( @Disabled @ParameterizedTest - @CsvSource("xmir/disassembled/SimpleTypeConverter.xmir, org.springframework.beans.SimpleTypeConverter") + @CsvSource( + "xmir/disassembled/SimpleTypeConverter.xmir, org.springframework.beans.SimpleTypeConverter" + ) void decompilesCompilesAndKeepsExactlyTheSameContent( final String path, final String pckg ) throws Exception { @@ -181,26 +187,35 @@ void decompilesCompilesAndKeepsExactlyTheSameContent( ); } - + /** + * This test is used to find the problem in the transformation from JEO to OPEO. + * @param etalon The path to the golden files. + * @param target The path to the real files. + * @checkstyle NestedForDepthCheck (100 lines) + * @checkstyle JavaNCSSCheck (100 lines) + * @checkstyle CyclomaticComplexityCheck (100 lines) + * @checkstyle ExecutableStatementCountCheck (100 lines) + */ @Test @Disabled @ParameterizedTest @CsvSource( "./target-standard/it/spring-fat/target/generated-sources/opeo-compile-xmir, ./target/it/spring-fat/target/generated-sources/opeo-compile-xmir" ) + @SuppressWarnings({"PMD.SystemPrintln", "PMD.CognitiveComplexity"}) void findTheProblem(final String etalon, final String target) { final Path golden = Paths.get(etalon); final Path real = Paths.get(target); final AtomicInteger counter = new AtomicInteger(0); final AtomicInteger ecounter = new AtomicInteger(0); final List errors = new ArrayList<>(0); - try (final Stream all = Files.walk(golden).filter(Files::isRegularFile)) { + try (Stream all = Files.walk(golden).filter(Files::isRegularFile)) { all.forEach( path -> { counter.incrementAndGet(); final Path relative = golden.relativize(path); - XMLDocument bad; - XMLDocument good; + final XMLDocument bad; + final XMLDocument good; try { good = new XMLDocument(golden.resolve(relative)); bad = new XMLDocument(real.resolve(relative)); @@ -219,23 +234,23 @@ void findTheProblem(final String etalon, final String target) { for (int index = 0; index < size; ++index) { final XmlMethod gmethod = gmethods.get(index); final XmlMethod bmethod = bmethods.get(index); - final List ginstuctions = gmethod.instructions() + final List ginstrs = gmethod.instructions() .stream() .filter(xmlBytecodeEntry -> !(xmlBytecodeEntry instanceof XmlLabel)) .collect(Collectors.toList()); - final List binstructions = bmethod.instructions() + final List binstrs = bmethod.instructions() .stream() .filter(xmlBytecodeEntry -> !(xmlBytecodeEntry instanceof XmlLabel)) .collect(Collectors.toList()); - final int isize = ginstuctions.size(); + final int isize = ginstrs.size(); for (int jindex = 0; jindex < isize; ++jindex) { - final XmlBytecodeEntry gentry = ginstuctions.get(jindex); - final XmlBytecodeEntry bentry = binstructions.get(jindex); + final XmlBytecodeEntry gentry = ginstrs.get(jindex); + final XmlBytecodeEntry bentry = binstrs.get(jindex); if (gentry instanceof XmlInstruction && bentry instanceof XmlInstruction) { - final XmlInstruction ginstruction = (XmlInstruction) gentry; - final XmlInstruction binstruction = (XmlInstruction) bentry; - if (ginstruction.opcode() != binstruction.opcode()) { + final XmlInstruction ginstr = (XmlInstruction) gentry; + final XmlInstruction binstr = (XmlInstruction) bentry; + if (ginstr.opcode() != binstr.opcode()) { final String message = String.format( "The operands '%s' and '%s' are differ in %n%s%n%s,%nTotal scanned files: %d", gentry, @@ -248,24 +263,25 @@ void findTheProblem(final String etalon, final String target) { ecounter.incrementAndGet(); break outer; } - final List goodOperands = ginstruction.operands(); - final List badOperands = binstruction.operands(); - for (int kindex = 0; kindex < goodOperands.size(); ++kindex) { - final XmlOperand goodOperand = goodOperands.get(kindex); - final XmlOperand badOperand = badOperands.get(kindex); - final String goodOperandString = goodOperand.toString(); - final String badOperandString = badOperand.toString(); - if (goodOperandString.contains("label") - && badOperandString.contains("label")) + final List goperands = ginstr.operands(); + final List boperands = binstr.operands(); + for (int kindex = 0; kindex < goperands.size(); ++kindex) { + final XmlOperand goperand = goperands.get(kindex); + final XmlOperand boperand = boperands.get(kindex); + final String gsoperand = goperand.toString(); + final String bsoperand = boperand.toString(); + if (gsoperand.contains("label") + && bsoperand.contains("label")) { continue; - if (!goodOperandString.equals(badOperandString)) { + } + if (!gsoperand.equals(bsoperand)) { final String message = String.format( "The operands '%s' and '%s' are differ in '%s'%n'%s'%n'%s',%n%s%n%s%nTotal scanned files: %d", gentry, bentry, relative, - goodOperand, - badOperand, + goperand, + boperand, String.format("file://%s", golden.resolve(relative)), String.format("file://%s", real.resolve(relative)), counter.get() @@ -277,7 +293,6 @@ void findTheProblem(final String etalon, final String target) { } } } - } System.out.printf("Total files:%d%n", counter.get()); System.out.printf("Number of failed files:%d%n", ecounter.get()); diff --git a/src/test/java/org/eolang/opeo/ast/NewAddressTest.java b/src/test/java/org/eolang/opeo/ast/NewAddressTest.java index 4190c562..6ca76940 100644 --- a/src/test/java/org/eolang/opeo/ast/NewAddressTest.java +++ b/src/test/java/org/eolang/opeo/ast/NewAddressTest.java @@ -1,3 +1,26 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2016-2023 Objectionary.com + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ package org.eolang.opeo.ast; import org.eolang.jeo.representation.xmir.XmlNode; @@ -8,8 +31,15 @@ import org.xembly.ImpossibleModificationException; import org.xembly.Xembler; -class NewAddressTest { +/** + * Test case for {@link NewAddress}. + * @since 0.2 + */ +final class NewAddressTest { + /** + * XML representation of new address. + */ private static final String XML = String.join( "\n", "", @@ -18,6 +48,10 @@ class NewAddressTest { "", "" ); + + /** + * Type of new address. + */ private static final String TYPE = "SomeType"; @Test @@ -48,5 +82,4 @@ void convertsToOpcodes() { ) ); } - -} \ No newline at end of file +} diff --git a/src/test/java/org/eolang/opeo/compilation/DefaultCompilerTest.java b/src/test/java/org/eolang/opeo/compilation/DefaultCompilerTest.java index 828cf7e6..7b11cf92 100644 --- a/src/test/java/org/eolang/opeo/compilation/DefaultCompilerTest.java +++ b/src/test/java/org/eolang/opeo/compilation/DefaultCompilerTest.java @@ -23,12 +23,9 @@ */ package org.eolang.opeo.compilation; -import com.jcabi.xml.XMLDocument; import java.io.File; -import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.util.List; import org.cactoos.bytes.BytesOf; import org.cactoos.io.ResourceOf; import org.eolang.opeo.ast.Opcode; diff --git a/src/test/java/org/eolang/opeo/compilation/JeoCompilerTest.java b/src/test/java/org/eolang/opeo/compilation/JeoCompilerTest.java index 2a73dc2e..2c20affd 100644 --- a/src/test/java/org/eolang/opeo/compilation/JeoCompilerTest.java +++ b/src/test/java/org/eolang/opeo/compilation/JeoCompilerTest.java @@ -30,7 +30,6 @@ import org.eolang.opeo.ast.Opcode; import org.hamcrest.MatcherAssert; import org.hamcrest.Matchers; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; /** diff --git a/src/test/java/org/eolang/opeo/compilation/XmirParserTest.java b/src/test/java/org/eolang/opeo/compilation/XmirParserTest.java index 8943bcdc..86947c3d 100644 --- a/src/test/java/org/eolang/opeo/compilation/XmirParserTest.java +++ b/src/test/java/org/eolang/opeo/compilation/XmirParserTest.java @@ -147,7 +147,8 @@ void convertsFieldAssignment() { void parsesInvokeDynamicInstruction() { Opcode.disableCounting(); final XmlNode node = new XmlNode( - String.join("\n", + String.join( + "\n", "", " 00 00 00 00 00 00 00 BA", " 61 70 70 6C 79 41 73 49 6E 74", @@ -171,10 +172,9 @@ void parsesInvokeDynamicInstruction() { " " ) ); - final List nodes = new XmirParser(Collections.singletonList(node)).toJeoNodes(); MatcherAssert.assertThat( "We expect to retrieve exactly 1 opcode INVOKEDYNAMIC (without changes), but got something else instead", - nodes.get(0), + new XmirParser(Collections.singletonList(node)).toJeoNodes().get(0), Matchers.equalTo(node) ); } diff --git a/src/test/java/org/eolang/opeo/decompilation/DecompilerMachineTest.java b/src/test/java/org/eolang/opeo/decompilation/DecompilerMachineTest.java index e938fff1..84681898 100644 --- a/src/test/java/org/eolang/opeo/decompilation/DecompilerMachineTest.java +++ b/src/test/java/org/eolang/opeo/decompilation/DecompilerMachineTest.java @@ -389,37 +389,38 @@ void decompilesVarargInvocation() { ), new SameNode( new Root( - new Popped(new Invocation( - new ClassField( - "java/lang/System", - "out", - "Ljava/io/PrintStream;" - ), - new Attributes() - .name("printf") - .descriptor( - "(Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;" - ) - .owner("java/io/PrintStream") - .interfaced(false), - new Constant("Number is %s"), - new StoreArray( - new ArrayConstructor( - new Literal(1), - type + new Popped( + new Invocation( + new ClassField( + "java/lang/System", + "out", + "Ljava/io/PrintStream;" ), - new Literal(0), - new StaticInvocation( - new Attributes() - .owner("java/lang/Integer") - .name("valueOf") - .descriptor("(I)Ljava/lang/Integer;") - .interfaced(false), - new Owner("java/lang/Integer"), - new Literal(2) + new Attributes() + .name("printf") + .descriptor( + "(Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;" + ) + .owner("java/io/PrintStream") + .interfaced(false), + new Constant("Number is %s"), + new StoreArray( + new ArrayConstructor( + new Literal(1), + type + ), + new Literal(0), + new StaticInvocation( + new Attributes() + .owner("java/lang/Integer") + .name("valueOf") + .descriptor("(I)Ljava/lang/Integer;") + .interfaced(false), + new Owner("java/lang/Integer"), + new Literal(2) + ) ) - ) - )), + )), new Opcode(Opcodes.RETURN, false) ) ) diff --git a/src/test/java/org/eolang/opeo/decompilation/NaiveDecompilerTest.java b/src/test/java/org/eolang/opeo/decompilation/NaiveDecompilerTest.java index 631ab36d..9b03f6bd 100644 --- a/src/test/java/org/eolang/opeo/decompilation/NaiveDecompilerTest.java +++ b/src/test/java/org/eolang/opeo/decompilation/NaiveDecompilerTest.java @@ -23,8 +23,6 @@ */ package org.eolang.opeo.decompilation; -import com.jcabi.xml.XMLDocument; -import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; diff --git a/src/test/java/org/eolang/opeo/jeo/JeoInstructionsTest.java b/src/test/java/org/eolang/opeo/jeo/JeoInstructionsTest.java index 4d113a38..e0d4aed9 100644 --- a/src/test/java/org/eolang/opeo/jeo/JeoInstructionsTest.java +++ b/src/test/java/org/eolang/opeo/jeo/JeoInstructionsTest.java @@ -30,7 +30,6 @@ import org.hamcrest.Matchers; import org.junit.jupiter.api.Test; import org.objectweb.asm.Opcodes; -import org.objectweb.asm.Type; /** * Test case for {@link JeoInstructions}. From f32a78a79bd589446fa99541a79f7c299a1e0880 Mon Sep 17 00:00:00 2001 From: volodya-lombrozo Date: Tue, 28 May 2024 12:38:38 +0300 Subject: [PATCH 40/41] feat(#229): fix all unit tests --- pom.xml | 7 ++- src/test/java/it/JeoAndOpeoTest.java | 2 +- .../xmir/disassembled/OpenSSLContext$1.xmir | 52 +++++++++---------- 3 files changed, 33 insertions(+), 28 deletions(-) diff --git a/pom.xml b/pom.xml index 8136ba3d..6a6793b2 100644 --- a/pom.xml +++ b/pom.xml @@ -208,7 +208,12 @@ SOFTWARE. --> spring-fat/pom.xml - + fuse/pom.xml diff --git a/src/test/java/it/JeoAndOpeoTest.java b/src/test/java/it/JeoAndOpeoTest.java index 30661b83..4506c021 100644 --- a/src/test/java/it/JeoAndOpeoTest.java +++ b/src/test/java/it/JeoAndOpeoTest.java @@ -146,8 +146,8 @@ void decompilesCompilesAndKeepsTheSameInstructions(final String path) throws Exc void decompilesCompilesAndKeepsTheSameInstructionsWithTheSameOperands( final String path ) throws Exception { - final XMLDocument original = new XMLDocument(new BytesOf(new ResourceOf(path)).asBytes()); Opcode.disableCounting(); + final XMLDocument original = new XMLDocument(new BytesOf(new ResourceOf(path)).asBytes()); final List actual = new XmlProgram( new JeoCompiler( new JeoDecompiler(original).decompile() diff --git a/src/test/resources/xmir/disassembled/OpenSSLContext$1.xmir b/src/test/resources/xmir/disassembled/OpenSSLContext$1.xmir index bd84457f..02a330a9 100644 --- a/src/test/resources/xmir/disassembled/OpenSSLContext$1.xmir +++ b/src/test/resources/xmir/disassembled/OpenSSLContext$1.xmir @@ -57,32 +57,32 @@ 36 38 33 37 38 30 32 38 2D 34 63 64 62 2D 34 31 34 63 2D 38 33 63 62 2D 35 37 34 33 63 63 61 66 31 38 34 30 - + 00 00 00 00 00 00 00 19 00 00 00 00 00 00 00 00 - + 00 00 00 00 00 00 00 19 00 00 00 00 00 00 00 01 - + 00 00 00 00 00 00 00 B5 6F 72 67 2F 61 70 61 63 68 65 2F 74 6F 6D 63 61 74 2F 75 74 69 6C 2F 6E 65 74 2F 6F 70 65 6E 73 73 6C 2F 4F 70 65 6E 53 53 4C 43 6F 6E 74 65 78 74 24 31 74 68 69 73 24 30 4C 6F 72 67 2F 61 70 61 63 68 65 2F 74 6F 6D 63 61 74 2F 75 74 69 6C 2F 6E 65 74 2F 6F 70 65 6E 73 73 6C 2F 4F 70 65 6E 53 53 4C 43 6F 6E 74 65 78 74 3B - + 00 00 00 00 00 00 00 19 00 00 00 00 00 00 00 00 - + 00 00 00 00 00 00 00 B7 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3C 69 6E 69 74 3E 28 29 56 00 - + 00 00 00 00 00 00 00 B1 34 30 39 30 65 61 30 36 2D 61 66 30 66 2D 34 36 62 38 2D 39 34 62 33 2D 34 64 37 62 33 63 63 66 62 35 35 31 @@ -104,48 +104,48 @@ 36 34 32 39 62 38 36 38 2D 32 32 66 66 2D 34 61 61 36 2D 61 30 64 34 2D 34 33 65 34 37 63 61 64 38 62 63 33 - + 00 00 00 00 00 00 00 19 00 00 00 00 00 00 00 03 - + 00 00 00 00 00 00 00 B8 6F 72 67 2F 61 70 61 63 68 65 2F 74 6F 6D 63 61 74 2F 75 74 69 6C 2F 6E 65 74 2F 6F 70 65 6E 73 73 6C 2F 4F 70 65 6E 53 53 4C 43 6F 6E 74 65 78 74 61 63 63 65 73 73 24 30 30 30 28 5B 5B 42 29 5B 4C 6A 61 76 61 2F 73 65 63 75 72 69 74 79 2F 63 65 72 74 2F 58 35 30 39 43 65 72 74 69 66 69 63 61 74 65 3B 00 - + 00 00 00 00 00 00 00 3A 00 00 00 00 00 00 00 05 33 37 63 62 38 66 64 34 2D 61 63 39 61 2D 34 65 30 39 2D 39 36 37 30 2D 64 30 30 35 31 61 39 39 61 64 61 30 - + 00 00 00 00 00 00 00 19 00 00 00 00 00 00 00 00 - + 00 00 00 00 00 00 00 B4 6F 72 67 2F 61 70 61 63 68 65 2F 74 6F 6D 63 61 74 2F 75 74 69 6C 2F 6E 65 74 2F 6F 70 65 6E 73 73 6C 2F 4F 70 65 6E 53 53 4C 43 6F 6E 74 65 78 74 24 31 74 68 69 73 24 30 4C 6F 72 67 2F 61 70 61 63 68 65 2F 74 6F 6D 63 61 74 2F 75 74 69 6C 2F 6E 65 74 2F 6F 70 65 6E 73 73 6C 2F 4F 70 65 6E 53 53 4C 43 6F 6E 74 65 78 74 3B - + 00 00 00 00 00 00 00 B8 6F 72 67 2F 61 70 61 63 68 65 2F 74 6F 6D 63 61 74 2F 75 74 69 6C 2F 6E 65 74 2F 6F 70 65 6E 73 73 6C 2F 4F 70 65 6E 53 53 4C 43 6F 6E 74 65 78 74 61 63 63 65 73 73 24 31 30 30 28 4C 6F 72 67 2F 61 70 61 63 68 65 2F 74 6F 6D 63 61 74 2F 75 74 69 6C 2F 6E 65 74 2F 6F 70 65 6E 73 73 6C 2F 4F 70 65 6E 53 53 4C 43 6F 6E 74 65 78 74 3B 29 4C 6A 61 76 61 78 2F 6E 65 74 2F 73 73 6C 2F 58 35 30 39 54 72 75 73 74 4D 61 6E 61 67 65 72 3B 00 - + 00 00 00 00 00 00 00 19 00 00 00 00 00 00 00 05 - + 00 00 00 00 00 00 00 19 00 00 00 00 00 00 00 04 - + 00 00 00 00 00 00 00 B9 6A 61 76 61 78 2F 6E 65 74 2F 73 73 6C 2F 58 35 30 39 54 72 75 73 74 4D 61 6E 61 67 65 72 63 68 65 63 6B 43 6C 69 65 6E 74 54 72 75 73 74 65 64 @@ -153,11 +153,11 @@ 01 61 61 66 63 36 66 36 33 2D 66 36 32 38 2D 34 39 36 33 2D 62 65 62 32 2D 33 38 66 65 63 64 30 61 62 33 39 33 - + 00 00 00 00 00 00 00 04 61 66 64 65 35 32 39 32 2D 62 62 37 61 2D 34 32 33 63 2D 61 32 33 30 2D 30 32 30 31 32 37 62 39 36 31 39 61 - + 00 00 00 00 00 00 00 AC 30 32 63 36 61 31 63 31 2D 66 35 35 33 2D 34 33 39 35 2D 39 39 31 63 2D 61 37 39 61 63 38 31 32 33 37 64 33 @@ -176,41 +176,41 @@ 6A 61 76 61 2F 6C 61 6E 67 2F 45 78 63 65 70 74 69 6F 6E - + 00 00 00 00 00 00 00 3A 00 00 00 00 00 00 00 06 36 37 66 30 64 32 34 62 2D 31 32 37 35 2D 34 38 62 38 2D 61 37 66 37 2D 36 37 63 31 35 32 61 39 35 32 64 65 - + 00 00 00 00 00 00 00 B8 6F 72 67 2F 61 70 61 63 68 65 2F 74 6F 6D 63 61 74 2F 75 74 69 6C 2F 6E 65 74 2F 6F 70 65 6E 73 73 6C 2F 4F 70 65 6E 53 53 4C 43 6F 6E 74 65 78 74 61 63 63 65 73 73 24 33 30 30 28 29 4C 6F 72 67 2F 61 70 61 63 68 65 2F 6A 75 6C 69 2F 6C 6F 67 67 69 6E 67 2F 4C 6F 67 3B 00 - + 00 00 00 00 00 00 00 B8 6F 72 67 2F 61 70 61 63 68 65 2F 74 6F 6D 63 61 74 2F 75 74 69 6C 2F 6E 65 74 2F 6F 70 65 6E 73 73 6C 2F 4F 70 65 6E 53 53 4C 43 6F 6E 74 65 78 74 61 63 63 65 73 73 24 32 30 30 28 29 4C 6F 72 67 2F 61 70 61 63 68 65 2F 74 6F 6D 63 61 74 2F 75 74 69 6C 2F 72 65 73 2F 53 74 72 69 6E 67 4D 61 6E 61 67 65 72 3B 00 - + 00 00 00 00 00 00 00 12 6F 70 65 6E 73 73 6C 2E 63 65 72 74 69 66 69 63 61 74 65 56 65 72 69 66 69 63 61 74 69 6F 6E 46 61 69 6C 65 64 - + 00 00 00 00 00 00 00 B6 6F 72 67 2F 61 70 61 63 68 65 2F 74 6F 6D 63 61 74 2F 75 74 69 6C 2F 72 65 73 2F 53 74 72 69 6E 67 4D 61 6E 61 67 65 72 67 65 74 53 74 72 69 6E 67 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 00 - + 00 00 00 00 00 00 00 19 00 00 00 00 00 00 00 06 - + 00 00 00 00 00 00 00 B9 6F 72 67 2F 61 70 61 63 68 65 2F 6A 75 6C 69 2F 6C 6F 67 67 69 6E 67 2F 4C 6F 67 64 65 62 75 67 @@ -218,10 +218,10 @@ 01 61 64 35 39 66 61 66 38 2D 38 32 62 64 2D 34 63 61 39 2D 61 64 31 34 2D 35 31 30 38 35 31 63 65 64 65 66 30 - + 00 00 00 00 00 00 00 03 - + 00 00 00 00 00 00 00 AC 30 63 33 31 65 64 32 36 2D 30 62 63 33 2D 34 64 65 35 2D 62 64 38 63 2D 61 61 38 61 35 37 63 63 64 32 66 39 From 3d26fffcb0df7691b63bd09a9f1371264d3cb9fd Mon Sep 17 00:00:00 2001 From: volodya-lombrozo Date: Tue, 28 May 2024 12:45:00 +0300 Subject: [PATCH 41/41] feat(#229): fix all xml files --- src/test/java/it/JeoAndOpeoTest.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/test/java/it/JeoAndOpeoTest.java b/src/test/java/it/JeoAndOpeoTest.java index 4506c021..2642dd02 100644 --- a/src/test/java/it/JeoAndOpeoTest.java +++ b/src/test/java/it/JeoAndOpeoTest.java @@ -202,7 +202,12 @@ void decompilesCompilesAndKeepsExactlyTheSameContent( @CsvSource( "./target-standard/it/spring-fat/target/generated-sources/opeo-compile-xmir, ./target/it/spring-fat/target/generated-sources/opeo-compile-xmir" ) - @SuppressWarnings({"PMD.SystemPrintln", "PMD.CognitiveComplexity"}) + @SuppressWarnings({ + "PMD.SystemPrintln", + "PMD.CognitiveComplexity", + "JTCOP.RulePresentTense", + "JTCOP.RuleAssertionMessage" + }) void findTheProblem(final String etalon, final String target) { final Path golden = Paths.get(etalon); final Path real = Paths.get(target);