This is an automated email from the ASF dual-hosted git repository.
exceptionfactory pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git
The following commit(s) were added to refs/heads/main by this push:
new 24f5afcceb NIFI-15553 Replaced the use of JARs in
TestExecuteStreamCommand with the use of Java files (#10860)
24f5afcceb is described below
commit 24f5afcceba578779a3a9dc0da96d20fb9da78a5
Author: dan-s1 <[email protected]>
AuthorDate: Thu Feb 5 12:24:32 2026 -0500
NIFI-15553 Replaced the use of JARs in TestExecuteStreamCommand with the
use of Java files (#10860)
Signed-off-by: David Handermann <[email protected]>
---
.../nifi-standard-processors/pom.xml | 4 -
.../standard/TestExecuteStreamCommand.java | 692 ++++++++-------------
.../src/test/resources/ExecuteCommand/1mb.txt | 101 ---
.../ExecuteCommand/TestDynamicEnvironment.jar | Bin 1200 -> 0 bytes
.../ExecuteCommand/TestIngestAndUpdate.jar | Bin 1170 -> 0 bytes
.../resources/ExecuteCommand/TestLogStdErr.jar | Bin 995 -> 0 bytes
.../test/resources/ExecuteCommand/TestSuccess.jar | Bin 827 -> 0 bytes
.../src/test/resources/ExecuteCommand/test.txt | 2 -
8 files changed, 246 insertions(+), 553 deletions(-)
diff --git
a/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/pom.xml
b/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/pom.xml
index d32b90df57..5981a64173 100644
---
a/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/pom.xml
+++
b/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/pom.xml
@@ -584,10 +584,6 @@
<exclude>src/test/resources/ExecuteCommand/1000bytes.txt</exclude>
<exclude>src/test/resources/ExecuteCommand/1mb.txt</exclude>
<exclude>src/test/resources/ExecuteCommand/test.txt</exclude>
-
<exclude>src/test/resources/ExecuteCommand/TestDynamicEnvironment.jar</exclude>
-
<exclude>src/test/resources/ExecuteCommand/TestIngestAndUpdate.jar</exclude>
-
<exclude>src/test/resources/ExecuteCommand/TestLogStdErr.jar</exclude>
-
<exclude>src/test/resources/ExecuteCommand/TestSuccess.jar</exclude>
<exclude>src/test/resources/hello.txt</exclude>
<exclude>src/test/resources/randombytes-1</exclude>
<exclude>src/test/resources/ScanAttribute/dictionary-with-empty-new-lines</exclude>
diff --git
a/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestExecuteStreamCommand.java
b/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestExecuteStreamCommand.java
index 739dd97056..17d3b125dd 100644
---
a/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestExecuteStreamCommand.java
+++
b/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestExecuteStreamCommand.java
@@ -28,11 +28,14 @@ import org.apache.nifi.util.TestRunner;
import org.apache.nifi.util.TestRunners;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
import java.io.File;
import java.io.FileOutputStream;
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.HashMap;
import java.util.HashSet;
@@ -42,12 +45,21 @@ import java.util.Set;
import java.util.regex.Pattern;
import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
public class TestExecuteStreamCommand {
+ private static final Path JAVA_FILES_DIR = Paths.get("src/test/java");
+ private static final Path NO_SUCH_FILE = Paths.get("NoSuchFile.java");
+ private static final Path TEST_DYNAMIC_ENVIRONMENT =
Paths.get("TestDynamicEnvironment.java");
+ private static final Path TEST_INGEST_AND_UPDATE =
Paths.get("TestIngestAndUpdate.java");
+ private static final Path TEST_LOG_STDERR =
Paths.get("TestLogStdErr.java");
+ private static final Path TEST_SUCCESS = Paths.get("TestSuccess.java");
+ private static final String JAVA_COMMAND = "java";
- private TestRunner runner;
+ @TempDir
+ private File tempDir;
+
+ private TestRunner runner;
@BeforeEach
void setUp() {
@@ -57,7 +69,7 @@ public class TestExecuteStreamCommand {
@Test
public void testDynamicPropertyArgumentsStrategyValid() {
runner.setProperty(ExecuteStreamCommand.ARGUMENTS_STRATEGY,
ExecuteStreamCommand.DYNAMIC_PROPERTY_ARGUMENTS_STRATEGY.getValue());
- runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND, "java");
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND,
JAVA_COMMAND);
runner.setProperty("command.argument.1", "-version");
runner.assertValid();
@@ -69,7 +81,7 @@ public class TestExecuteStreamCommand {
@Test
public void testCommandArgumentsPropertyStrategyValid() {
runner.setProperty(ExecuteStreamCommand.ARGUMENTS_STRATEGY,
ExecuteStreamCommand.COMMAND_ARGUMENTS_PROPERTY_STRATEGY.getValue());
- runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND, "java");
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND,
JAVA_COMMAND);
runner.setProperty("RUNTIME_VERSION", "version-1");
runner.assertValid();
@@ -79,30 +91,23 @@ public class TestExecuteStreamCommand {
}
@Test
- public void testExecuteJar() throws Exception {
- File exJar = new
File("src/test/resources/ExecuteCommand/TestSuccess.jar");
- File dummy = new
File("src/test/resources/ExecuteCommand/1000bytes.txt");
- String jarPath = exJar.getAbsolutePath();
- exJar.setExecutable(true);
+ public void testExecuteJavaFile() {
+ final Path javaFile = JAVA_FILES_DIR.resolve(TEST_SUCCESS);
runner.setProperty(ExecuteStreamCommand.MIME_TYPE.getName(),
"text/plain");
- runner.enqueue(dummy.toPath());
- runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND, "java");
- runner.setProperty(ExecuteStreamCommand.EXECUTION_ARGUMENTS, "-jar;" +
jarPath);
+ runner.enqueue("");
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND,
JAVA_COMMAND);
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_ARGUMENTS,
javaFile.toString());
runner.run(1);
runner.assertTransferCount(ExecuteStreamCommand.ORIGINAL_RELATIONSHIP,
1);
runner.assertTransferCount(ExecuteStreamCommand.OUTPUT_STREAM_RELATIONSHIP, 1);
List<MockFlowFile> flowFiles =
runner.getFlowFilesForRelationship(ExecuteStreamCommand.OUTPUT_STREAM_RELATIONSHIP);
MockFlowFile outputFlowFile = flowFiles.getFirst();
- byte[] byteArray = outputFlowFile.toByteArray();
- String result = new String(byteArray);
+ String result = outputFlowFile.getContent();
assertTrue(Pattern.compile("Test was a
success\r?\n").matcher(result).find());
assertEquals("0", outputFlowFile.getAttribute("execution.status"));
- assertEquals("java", outputFlowFile.getAttribute("execution.command"));
- assertEquals("-jar;",
outputFlowFile.getAttribute("execution.command.args").substring(0, 5));
- String attribute =
outputFlowFile.getAttribute("execution.command.args");
- String expected = "src" + File.separator + "test" + File.separator +
"resources" + File.separator + "ExecuteCommand" + File.separator +
"TestSuccess.jar";
- assertEquals(expected, attribute.substring(attribute.length() -
expected.length()));
+ assertEquals(JAVA_COMMAND,
outputFlowFile.getAttribute("execution.command"));
+ assertEquals(javaFile.toString(),
outputFlowFile.getAttribute("execution.command.args"));
outputFlowFile.assertAttributeEquals(CoreAttributes.MIME_TYPE.key(),
"text/plain");
MockFlowFile originalFlowFile =
runner.getFlowFilesForRelationship(ExecuteStreamCommand.ORIGINAL_RELATIONSHIP).getFirst();
@@ -112,41 +117,28 @@ public class TestExecuteStreamCommand {
}
@Test
- public void testExecuteJarDynamicPropArgs() throws Exception {
- File exJar = new
File("src/test/resources/ExecuteCommand/TestSuccess.jar");
- File dummy = new
File("src/test/resources/ExecuteCommand/1000bytes.txt");
- String jarPath = exJar.getAbsolutePath();
- exJar.setExecutable(true);
- runner.enqueue(dummy.toPath());
- runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND, "java");
+ public void testExecuteJavaFileDynamicPropArgs() {
+ final Path javaFile = JAVA_FILES_DIR.resolve(TEST_SUCCESS);
+ runner.enqueue("");
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND,
JAVA_COMMAND);
runner.setProperty(ExecuteStreamCommand.ARGUMENTS_STRATEGY,
ExecuteStreamCommand.DYNAMIC_PROPERTY_ARGUMENTS_STRATEGY.getValue());
PropertyDescriptor dynamicProp1 = new PropertyDescriptor.Builder()
.dynamic(true)
.name("command.argument.1")
.expressionLanguageSupported(ExpressionLanguageScope.FLOWFILE_ATTRIBUTES)
.build();
- runner.setProperty(dynamicProp1, "-jar");
- PropertyDescriptor dynamicProp2 = new PropertyDescriptor.Builder()
- .dynamic(true)
- .name("command.argument.2")
-
.expressionLanguageSupported(ExpressionLanguageScope.FLOWFILE_ATTRIBUTES)
- .build();
- runner.setProperty(dynamicProp2, jarPath);
+ runner.setProperty(dynamicProp1, javaFile.toString());
runner.run(1);
runner.assertTransferCount(ExecuteStreamCommand.ORIGINAL_RELATIONSHIP,
1);
runner.assertTransferCount(ExecuteStreamCommand.OUTPUT_STREAM_RELATIONSHIP, 1);
List<MockFlowFile> flowFiles =
runner.getFlowFilesForRelationship(ExecuteStreamCommand.OUTPUT_STREAM_RELATIONSHIP);
MockFlowFile outputFlowFile = flowFiles.getFirst();
- byte[] byteArray = outputFlowFile.toByteArray();
- String result = new String(byteArray);
+ String result = outputFlowFile.getContent();
assertTrue(Pattern.compile("Test was a
success\r?\n").matcher(result).find());
assertEquals("0", outputFlowFile.getAttribute("execution.status"));
- assertEquals("java", outputFlowFile.getAttribute("execution.command"));
- assertEquals("-jar",
outputFlowFile.getAttribute("execution.command.args").substring(0, 4).trim());
- String attribute =
outputFlowFile.getAttribute("execution.command.args");
- String expected = "src" + File.separator + "test" + File.separator +
"resources" + File.separator + "ExecuteCommand" + File.separator +
"TestSuccess.jar";
- assertEquals(expected, attribute.substring(attribute.length() -
expected.length()));
+ assertEquals(JAVA_COMMAND,
outputFlowFile.getAttribute("execution.command"));
+ assertEquals(javaFile.toString(),
outputFlowFile.getAttribute("execution.command.args"));
MockFlowFile originalFlowFile =
runner.getFlowFilesForRelationship(ExecuteStreamCommand.ORIGINAL_RELATIONSHIP).getFirst();
assertEquals(outputFlowFile.getAttribute("execution.status"),
originalFlowFile.getAttribute("execution.status"));
@@ -156,14 +148,11 @@ public class TestExecuteStreamCommand {
@Test
- public void testExecuteJarWithBadPath() throws Exception {
- File exJar = new
File("src/test/resources/ExecuteCommand/noSuchFile.jar");
- File dummy = new
File("src/test/resources/ExecuteCommand/1000bytes.txt");
- String jarPath = exJar.getAbsolutePath();
- exJar.setExecutable(true);
- runner.enqueue(dummy.toPath());
- runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND, "java");
- runner.setProperty(ExecuteStreamCommand.EXECUTION_ARGUMENTS, "-jar;" +
jarPath);
+ public void testExecuteJavaFileWithBadPath() {
+ final Path javaFile = JAVA_FILES_DIR.resolve(NO_SUCH_FILE);
+ runner.enqueue("blah");
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND,
JAVA_COMMAND);
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_ARGUMENTS,
javaFile.toString());
runner.run(1);
runner.assertTransferCount(ExecuteStreamCommand.ORIGINAL_RELATIONSHIP,
1);
runner.assertTransferCount(ExecuteStreamCommand.OUTPUT_STREAM_RELATIONSHIP, 0);
@@ -171,31 +160,22 @@ public class TestExecuteStreamCommand {
List<MockFlowFile> flowFiles =
runner.getFlowFilesForRelationship(ExecuteStreamCommand.NONZERO_STATUS_RELATIONSHIP);
MockFlowFile flowFile = flowFiles.getFirst();
assertEquals(0, flowFile.getSize());
- assertTrue(flowFile.getAttribute("execution.error").contains("Error:
Unable to access jarfile"));
+
assertTrue(flowFile.getAttribute("execution.error").contains("java.lang.ClassNotFoundException"));
assertTrue(flowFile.isPenalized());
}
@Test
- public void testExecuteJarWithBadPathDynamicProperties() throws Exception {
- File exJar = new
File("src/test/resources/ExecuteCommand/noSuchFile.jar");
- File dummy = new
File("src/test/resources/ExecuteCommand/1000bytes.txt");
- String jarPath = exJar.getAbsolutePath();
- exJar.setExecutable(true);
- runner.enqueue(dummy.toPath());
- runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND, "java");
+ public void testExecuteJavaFileWithBadPathDynamicProperties() {
+ final Path javaFile = JAVA_FILES_DIR.resolve(NO_SUCH_FILE);
+ runner.enqueue("blah");
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND,
JAVA_COMMAND);
runner.setProperty(ExecuteStreamCommand.ARGUMENTS_STRATEGY,
ExecuteStreamCommand.DYNAMIC_PROPERTY_ARGUMENTS_STRATEGY.getValue());
PropertyDescriptor dynamicProp1 = new PropertyDescriptor.Builder()
.dynamic(true)
.name("command.argument.1")
.expressionLanguageSupported(ExpressionLanguageScope.FLOWFILE_ATTRIBUTES)
.build();
- runner.setProperty(dynamicProp1, "-jar");
- PropertyDescriptor dynamicProp2 = new PropertyDescriptor.Builder()
- .dynamic(true)
- .name("command.argument.2")
-
.expressionLanguageSupported(ExpressionLanguageScope.FLOWFILE_ATTRIBUTES)
- .build();
- runner.setProperty(dynamicProp2, jarPath);
+ runner.setProperty(dynamicProp1, javaFile.toString());
runner.run(1);
runner.assertTransferCount(ExecuteStreamCommand.ORIGINAL_RELATIONSHIP,
1);
runner.assertTransferCount(ExecuteStreamCommand.OUTPUT_STREAM_RELATIONSHIP, 0);
@@ -203,86 +183,57 @@ public class TestExecuteStreamCommand {
List<MockFlowFile> flowFiles =
runner.getFlowFilesForRelationship(ExecuteStreamCommand.NONZERO_STATUS_RELATIONSHIP);
MockFlowFile flowFile = flowFiles.getFirst();
assertEquals(0, flowFile.getSize());
- assertTrue(flowFile.getAttribute("execution.error").contains("Error:
Unable to access jarfile"));
+
assertTrue(flowFile.getAttribute("execution.error").contains("java.lang.ClassNotFoundException"));
assertTrue(flowFile.isPenalized());
}
@Test
- public void testExecuteIngestAndUpdate() throws IOException {
- File exJar = new
File("src/test/resources/ExecuteCommand/TestIngestAndUpdate.jar");
- File dummy = new
File("src/test/resources/ExecuteCommand/1000bytes.txt");
- File dummy10MBytes = new File("target/10MB.txt");
- try (FileOutputStream fos = new FileOutputStream(dummy10MBytes)) {
- byte[] bytes = Files.readAllBytes(dummy.toPath());
- assertEquals(1000, bytes.length);
- for (int i = 0; i < 10000; i++) {
- fos.write(bytes, 0, 1000);
- }
- }
- String jarPath = exJar.getAbsolutePath();
- exJar.setExecutable(true);
- runner.enqueue(dummy10MBytes.toPath());
- runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND, "java");
- runner.setProperty(ExecuteStreamCommand.EXECUTION_ARGUMENTS, "-jar;" +
jarPath);
+ public void testExecuteIngestAndUpdate() {
+ final Path javaFile = JAVA_FILES_DIR.resolve(TEST_INGEST_AND_UPDATE);
+ final String content = "Print Me";
+ runner.enqueue(content);
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND,
JAVA_COMMAND);
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_ARGUMENTS,
javaFile.toString());
runner.run(1);
runner.assertTransferCount(ExecuteStreamCommand.ORIGINAL_RELATIONSHIP,
1);
runner.assertTransferCount(ExecuteStreamCommand.OUTPUT_STREAM_RELATIONSHIP, 1);
List<MockFlowFile> flowFiles =
runner.getFlowFilesForRelationship(ExecuteStreamCommand.OUTPUT_STREAM_RELATIONSHIP);
- byte[] byteArray = flowFiles.getFirst().toByteArray();
- String result = new String(byteArray);
+ String result = flowFiles.getFirst().getContent();
+ final String expectedOutput =
"nifi-standard-processors:ModifiedResult\r?\n%s".formatted(content);
-
assertTrue(Pattern.compile("nifi-standard-processors:ModifiedResult\r?\n").matcher(result).find());
+ assertTrue(Pattern.compile(expectedOutput).matcher(result).find());
}
@Test
- public void testExecuteIngestAndUpdateDynamicProperties() throws
IOException {
- File exJar = new
File("src/test/resources/ExecuteCommand/TestIngestAndUpdate.jar");
- File dummy = new
File("src/test/resources/ExecuteCommand/1000bytes.txt");
- File dummy10MBytes = new File("target/10MB.txt");
- try (FileOutputStream fos = new FileOutputStream(dummy10MBytes)) {
- byte[] bytes = Files.readAllBytes(dummy.toPath());
- assertEquals(1000, bytes.length);
- for (int i = 0; i < 10000; i++) {
- fos.write(bytes, 0, 1000);
- }
- }
- String jarPath = exJar.getAbsolutePath();
- exJar.setExecutable(true);
- runner.enqueue(dummy10MBytes.toPath());
- runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND, "java");
+ public void testExecuteIngestAndUpdateDynamicProperties() {
+ final Path javaFile = JAVA_FILES_DIR.resolve(TEST_INGEST_AND_UPDATE);
+ final String content = "Print Me";
+ runner.enqueue(content);
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND,
JAVA_COMMAND);
runner.setProperty(ExecuteStreamCommand.ARGUMENTS_STRATEGY,
ExecuteStreamCommand.DYNAMIC_PROPERTY_ARGUMENTS_STRATEGY.getValue());
PropertyDescriptor dynamicProp1 = new PropertyDescriptor.Builder()
.dynamic(true)
.name("command.argument.1")
.expressionLanguageSupported(ExpressionLanguageScope.FLOWFILE_ATTRIBUTES)
.build();
- runner.setProperty(dynamicProp1, "-jar");
- PropertyDescriptor dynamicProp2 = new PropertyDescriptor.Builder()
- .dynamic(true)
- .name("command.argument.2")
-
.expressionLanguageSupported(ExpressionLanguageScope.FLOWFILE_ATTRIBUTES)
- .build();
- runner.setProperty(dynamicProp2, jarPath);
+ runner.setProperty(dynamicProp1, javaFile.toString());
runner.run(1);
runner.assertTransferCount(ExecuteStreamCommand.ORIGINAL_RELATIONSHIP,
1);
runner.assertTransferCount(ExecuteStreamCommand.OUTPUT_STREAM_RELATIONSHIP, 1);
List<MockFlowFile> flowFiles =
runner.getFlowFilesForRelationship(ExecuteStreamCommand.OUTPUT_STREAM_RELATIONSHIP);
- byte[] byteArray = flowFiles.getFirst().toByteArray();
- String result = new String(byteArray);
+ String result = flowFiles.getFirst().getContent();
+ final String expectedOutput =
"nifi-standard-processors:ModifiedResult\r?\n%s".formatted(content);
-
assertTrue(Pattern.compile("nifi-standard-processors:ModifiedResult\r?\n").matcher(result).find());
+ assertTrue(Pattern.compile(expectedOutput).matcher(result).find());
}
@Test
- public void testLoggingToStdErr() throws IOException {
- File exJar = new
File("src/test/resources/ExecuteCommand/TestLogStdErr.jar");
- File dummy = new File("src/test/resources/ExecuteCommand/1mb.txt");
- String jarPath = exJar.getAbsolutePath();
- exJar.setExecutable(true);
+ public void testLoggingToStdErr() {
+ Path javaFile = JAVA_FILES_DIR.resolve(TEST_LOG_STDERR);
runner.setValidateExpressionUsage(false);
- runner.enqueue(dummy.toPath());
- runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND, "java");
- runner.setProperty(ExecuteStreamCommand.EXECUTION_ARGUMENTS, "-jar;" +
jarPath);
+ runner.enqueue("");
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND,
JAVA_COMMAND);
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_ARGUMENTS,
javaFile.toString());
runner.run(1);
runner.assertTransferCount(ExecuteStreamCommand.ORIGINAL_RELATIONSHIP,
1);
runner.assertTransferCount(ExecuteStreamCommand.OUTPUT_STREAM_RELATIONSHIP, 1);
@@ -294,27 +245,18 @@ public class TestExecuteStreamCommand {
}
@Test
- public void testLoggingToStdErrDynamicProperties() throws IOException {
- File exJar = new
File("src/test/resources/ExecuteCommand/TestLogStdErr.jar");
- File dummy = new File("src/test/resources/ExecuteCommand/1mb.txt");
- String jarPath = exJar.getAbsolutePath();
- exJar.setExecutable(true);
+ public void testLoggingToStdErrDynamicProperties() {
+ Path javaFile = JAVA_FILES_DIR.resolve(TEST_LOG_STDERR);
runner.setValidateExpressionUsage(false);
- runner.enqueue(dummy.toPath());
- runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND, "java");
+ runner.enqueue("");
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND,
JAVA_COMMAND);
runner.setProperty(ExecuteStreamCommand.ARGUMENTS_STRATEGY,
ExecuteStreamCommand.DYNAMIC_PROPERTY_ARGUMENTS_STRATEGY.getValue());
PropertyDescriptor dynamicProp1 = new PropertyDescriptor.Builder()
.dynamic(true)
.name("command.argument.1")
.expressionLanguageSupported(ExpressionLanguageScope.FLOWFILE_ATTRIBUTES)
.build();
- runner.setProperty(dynamicProp1, "-jar");
- PropertyDescriptor dynamicProp2 = new PropertyDescriptor.Builder()
- .dynamic(true)
- .name("command.argument.2")
-
.expressionLanguageSupported(ExpressionLanguageScope.FLOWFILE_ATTRIBUTES)
- .build();
- runner.setProperty(dynamicProp2, jarPath);
+ runner.setProperty(dynamicProp1, javaFile.toString());
runner.run(1);
runner.assertTransferCount(ExecuteStreamCommand.ORIGINAL_RELATIONSHIP,
1);
runner.assertTransferCount(ExecuteStreamCommand.OUTPUT_STREAM_RELATIONSHIP, 1);
@@ -326,169 +268,135 @@ public class TestExecuteStreamCommand {
}
@Test
- public void testExecuteIngestAndUpdateWithWorkingDir() throws IOException {
- File exJar = new
File("src/test/resources/ExecuteCommand/TestIngestAndUpdate.jar");
- File dummy = new
File("src/test/resources/ExecuteCommand/1000bytes.txt");
- String jarPath = exJar.getAbsolutePath();
- exJar.setExecutable(true);
- runner.enqueue(dummy.toPath());
- runner.setProperty(ExecuteStreamCommand.WORKING_DIR, "target");
- runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND, "java");
- runner.setProperty(ExecuteStreamCommand.EXECUTION_ARGUMENTS, "-jar;" +
jarPath);
+ public void testExecuteIngestAndUpdateWithWorkingDir() {
+ final String content = "Print Me";
+ runner.enqueue(content);
+ runner.setProperty(ExecuteStreamCommand.WORKING_DIR,
JAVA_FILES_DIR.toString());
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND,
JAVA_COMMAND);
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_ARGUMENTS,
TEST_INGEST_AND_UPDATE.toString());
runner.run(1);
runner.assertTransferCount(ExecuteStreamCommand.ORIGINAL_RELATIONSHIP,
1);
runner.assertTransferCount(ExecuteStreamCommand.OUTPUT_STREAM_RELATIONSHIP, 1);
List<MockFlowFile> flowFiles =
runner.getFlowFilesForRelationship(ExecuteStreamCommand.OUTPUT_STREAM_RELATIONSHIP);
- byte[] byteArray = flowFiles.getFirst().toByteArray();
- String result = new String(byteArray);
+ String result = flowFiles.getFirst().getContent();
final String quotedSeparator = Pattern.quote(File.separator);
- assertTrue(Pattern.compile(quotedSeparator +
"nifi-standard-processors" + quotedSeparator +
"target:ModifiedResult\r?\n").matcher(result).find());
+ final String expectedOutput =
"%1$snifi-standard-processors%1$ssrc%1$stest%1$sjava:ModifiedResult\r?\n%2$s".formatted(quotedSeparator,
content);
+
+ assertTrue(Pattern.compile(expectedOutput).matcher(result).find());
}
@Test
- public void testExecuteIngestAndUpdateWithWorkingDirDynamicProperties()
throws IOException {
- File exJar = new
File("src/test/resources/ExecuteCommand/TestIngestAndUpdate.jar");
- File dummy = new
File("src/test/resources/ExecuteCommand/1000bytes.txt");
- String jarPath = exJar.getAbsolutePath();
- exJar.setExecutable(true);
- runner.enqueue(dummy.toPath());
- runner.setProperty(ExecuteStreamCommand.WORKING_DIR, "target");
- runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND, "java");
+ public void testExecuteIngestAndUpdateWithWorkingDirDynamicProperties() {
+ final String content = "Print Me";
+ runner.enqueue(content);
+ runner.setProperty(ExecuteStreamCommand.WORKING_DIR,
JAVA_FILES_DIR.toString());
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND,
JAVA_COMMAND);
runner.setProperty(ExecuteStreamCommand.ARGUMENTS_STRATEGY,
ExecuteStreamCommand.DYNAMIC_PROPERTY_ARGUMENTS_STRATEGY.getValue());
PropertyDescriptor dynamicProp1 = new PropertyDescriptor.Builder()
.dynamic(true)
.name("command.argument.1")
.expressionLanguageSupported(ExpressionLanguageScope.FLOWFILE_ATTRIBUTES)
.build();
- runner.setProperty(dynamicProp1, "-jar");
- PropertyDescriptor dynamicProp2 = new PropertyDescriptor.Builder()
- .dynamic(true)
- .name("command.argument.2")
-
.expressionLanguageSupported(ExpressionLanguageScope.FLOWFILE_ATTRIBUTES)
- .build();
- runner.setProperty(dynamicProp2, jarPath);
+ runner.setProperty(dynamicProp1, TEST_INGEST_AND_UPDATE.toString());
runner.run(1);
runner.assertTransferCount(ExecuteStreamCommand.ORIGINAL_RELATIONSHIP,
1);
runner.assertTransferCount(ExecuteStreamCommand.OUTPUT_STREAM_RELATIONSHIP, 1);
List<MockFlowFile> flowFiles =
runner.getFlowFilesForRelationship(ExecuteStreamCommand.OUTPUT_STREAM_RELATIONSHIP);
- byte[] byteArray = flowFiles.getFirst().toByteArray();
- String result = new String(byteArray);
+ String result = flowFiles.getFirst().getContent();
final String quotedSeparator = Pattern.quote(File.separator);
- assertTrue(Pattern.compile(quotedSeparator +
"nifi-standard-processors" + quotedSeparator +
"target:ModifiedResult\r?\n").matcher(result).find());
+ final String expectedOutput =
"%1$snifi-standard-processors%1$ssrc%1$stest%1$sjava:ModifiedResult\r?\n%2$s".formatted(quotedSeparator,
content);
+
+ assertTrue(Pattern.compile(expectedOutput).matcher(result).find());
}
@Test
- public void testIgnoredStdin() throws IOException {
- File exJar = new
File("src/test/resources/ExecuteCommand/TestIngestAndUpdate.jar");
- File dummy = new
File("src/test/resources/ExecuteCommand/1000bytes.txt");
- String jarPath = exJar.getAbsolutePath();
- exJar.setExecutable(true);
- runner.enqueue(dummy.toPath());
- runner.setProperty(ExecuteStreamCommand.WORKING_DIR, "target");
- runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND, "java");
- runner.setProperty(ExecuteStreamCommand.EXECUTION_ARGUMENTS, "-jar;" +
jarPath);
+ public void testIgnoredStdin() {
+ final String content = "Print Me";
+ runner.enqueue(content);
+ runner.setProperty(ExecuteStreamCommand.WORKING_DIR,
JAVA_FILES_DIR.toString());
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND,
JAVA_COMMAND);
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_ARGUMENTS,
TEST_INGEST_AND_UPDATE.toString());
runner.setProperty(ExecuteStreamCommand.IGNORE_STDIN, "true");
runner.run(1);
runner.assertTransferCount(ExecuteStreamCommand.ORIGINAL_RELATIONSHIP,
1);
runner.assertTransferCount(ExecuteStreamCommand.OUTPUT_STREAM_RELATIONSHIP, 1);
List<MockFlowFile> flowFiles =
runner.getFlowFilesForRelationship(ExecuteStreamCommand.OUTPUT_STREAM_RELATIONSHIP);
- byte[] byteArray = flowFiles.getFirst().toByteArray();
- String result = new String(byteArray);
-
assertTrue(Pattern.compile("target:ModifiedResult\r?\n$").matcher(result).find(),
"TestIngestAndUpdate.jar should not have received anything to modify");
+ String result = flowFiles.getFirst().getContent();
+
+ final String quotedSeparator = Pattern.quote(File.separator);
+ final String expectedOutput =
"src%1$stest%1$sjava:ModifiedResult\r?\n".formatted(quotedSeparator);
+
+ assertTrue(Pattern.compile(expectedOutput).matcher(result).find());
}
@Test
- public void testIgnoredStdinDynamicProperties() throws IOException {
- File exJar = new
File("src/test/resources/ExecuteCommand/TestIngestAndUpdate.jar");
- File dummy = new
File("src/test/resources/ExecuteCommand/1000bytes.txt");
- String jarPath = exJar.getAbsolutePath();
- exJar.setExecutable(true);
- runner.enqueue(dummy.toPath());
- runner.setProperty(ExecuteStreamCommand.WORKING_DIR, "target");
- runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND, "java");
+ public void testIgnoredStdinDynamicProperties() {
+ final String content = "Print Me";
+ runner.enqueue(content);
+ runner.setProperty(ExecuteStreamCommand.WORKING_DIR,
JAVA_FILES_DIR.toString());
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND,
JAVA_COMMAND);
runner.setProperty(ExecuteStreamCommand.ARGUMENTS_STRATEGY,
ExecuteStreamCommand.DYNAMIC_PROPERTY_ARGUMENTS_STRATEGY.getValue());
PropertyDescriptor dynamicProp1 = new PropertyDescriptor.Builder()
.dynamic(true)
.name("command.argument.1")
.expressionLanguageSupported(ExpressionLanguageScope.FLOWFILE_ATTRIBUTES)
.build();
- runner.setProperty(dynamicProp1, "-jar");
- PropertyDescriptor dynamicProp2 = new PropertyDescriptor.Builder()
- .dynamic(true)
- .name("command.argument.2")
-
.expressionLanguageSupported(ExpressionLanguageScope.FLOWFILE_ATTRIBUTES)
- .build();
- runner.setProperty(dynamicProp2, jarPath);
+ runner.setProperty(dynamicProp1, TEST_INGEST_AND_UPDATE.toString());
runner.setProperty(ExecuteStreamCommand.IGNORE_STDIN, "true");
runner.run(1);
runner.assertTransferCount(ExecuteStreamCommand.ORIGINAL_RELATIONSHIP,
1);
runner.assertTransferCount(ExecuteStreamCommand.OUTPUT_STREAM_RELATIONSHIP, 1);
List<MockFlowFile> flowFiles =
runner.getFlowFilesForRelationship(ExecuteStreamCommand.OUTPUT_STREAM_RELATIONSHIP);
- byte[] byteArray = flowFiles.getFirst().toByteArray();
- String result = new String(byteArray);
-
assertTrue(Pattern.compile("target:ModifiedResult\r?\n$").matcher(result).find(),
"TestIngestAndUpdate.jar should not have received anything to modify");
+ String result = flowFiles.getFirst().getContent();
+
+ final String quotedSeparator = Pattern.quote(File.separator);
+ final String expectedOutput =
"src%1$stest%1$sjava:ModifiedResult\r?\n".formatted(quotedSeparator);
+
+ assertTrue(Pattern.compile(expectedOutput).matcher(result).find());
}
@Test
- public void testDynamicEnvironment() throws Exception {
- File exJar = new
File("src/test/resources/ExecuteCommand/TestDynamicEnvironment.jar");
- File dummy = new
File("src/test/resources/ExecuteCommand/1000bytes.txt");
- String jarPath = exJar.getAbsolutePath();
- exJar.setExecutable(true);
+ public void testDynamicEnvironment() {
runner.setProperty("NIFI_TEST_1", "testvalue1");
runner.setProperty("NIFI_TEST_2", "testvalue2");
- runner.enqueue(dummy.toPath());
- runner.setProperty(ExecuteStreamCommand.WORKING_DIR, "target");
- runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND, "java");
- runner.setProperty(ExecuteStreamCommand.EXECUTION_ARGUMENTS, "-jar;" +
jarPath);
+ runner.enqueue("");
+ runner.setProperty(ExecuteStreamCommand.WORKING_DIR,
JAVA_FILES_DIR.toString());
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND,
JAVA_COMMAND);
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_ARGUMENTS,
TEST_DYNAMIC_ENVIRONMENT.toString());
runner.run(1);
runner.assertTransferCount(ExecuteStreamCommand.ORIGINAL_RELATIONSHIP,
1);
runner.assertTransferCount(ExecuteStreamCommand.OUTPUT_STREAM_RELATIONSHIP, 1);
List<MockFlowFile> flowFiles =
runner.getFlowFilesForRelationship(ExecuteStreamCommand.OUTPUT_STREAM_RELATIONSHIP);
- byte[] byteArray = flowFiles.getFirst().toByteArray();
- String result = new String(byteArray);
+ String result = flowFiles.getFirst().getContent();
Set<String> dynamicEnvironmentVariables = new
HashSet<>(Arrays.asList(result.split("\r?\n")));
- assertFalse(dynamicEnvironmentVariables.size() < 2, "Should contain at
least two environment variables starting with NIFI");
-
assertTrue(dynamicEnvironmentVariables.contains("NIFI_TEST_1=testvalue1"),
"NIFI_TEST_1 environment variable is missing");
-
assertTrue(dynamicEnvironmentVariables.contains("NIFI_TEST_2=testvalue2"),
"NIFI_TEST_2 environment variable is missing");
+ Set<String> expectedEnvironmentVariables =
Set.of("NIFI_TEST_1=testvalue1", "NIFI_TEST_2=testvalue2");
+
assertTrue(dynamicEnvironmentVariables.containsAll(expectedEnvironmentVariables));
}
@Test
- public void testDynamicEnvironmentDynamicProperties() throws Exception {
- File exJar = new
File("src/test/resources/ExecuteCommand/TestDynamicEnvironment.jar");
- File dummy = new
File("src/test/resources/ExecuteCommand/1000bytes.txt");
- String jarPath = exJar.getAbsolutePath();
- exJar.setExecutable(true);
+ public void testDynamicEnvironmentDynamicProperties() {
runner.setProperty("NIFI_TEST_1", "testvalue1");
runner.setProperty("NIFI_TEST_2", "testvalue2");
- runner.enqueue(dummy.toPath());
- runner.setProperty(ExecuteStreamCommand.WORKING_DIR, "target");
- runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND, "java");
+ runner.enqueue("");
+ runner.setProperty(ExecuteStreamCommand.WORKING_DIR,
JAVA_FILES_DIR.toString());
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND,
JAVA_COMMAND);
runner.setProperty(ExecuteStreamCommand.ARGUMENTS_STRATEGY,
ExecuteStreamCommand.DYNAMIC_PROPERTY_ARGUMENTS_STRATEGY.getValue());
PropertyDescriptor dynamicProp1 = new PropertyDescriptor.Builder()
.dynamic(true)
.name("command.argument.1")
.expressionLanguageSupported(ExpressionLanguageScope.FLOWFILE_ATTRIBUTES)
.build();
- runner.setProperty(dynamicProp1, "-jar");
- PropertyDescriptor dynamicProp2 = new PropertyDescriptor.Builder()
- .dynamic(true)
- .name("command.argument.2")
-
.expressionLanguageSupported(ExpressionLanguageScope.FLOWFILE_ATTRIBUTES)
- .build();
- runner.setProperty(dynamicProp2, jarPath);
+ runner.setProperty(dynamicProp1, TEST_DYNAMIC_ENVIRONMENT.toString());
runner.run(1);
runner.assertTransferCount(ExecuteStreamCommand.ORIGINAL_RELATIONSHIP,
1);
runner.assertTransferCount(ExecuteStreamCommand.OUTPUT_STREAM_RELATIONSHIP, 1);
List<MockFlowFile> flowFiles =
runner.getFlowFilesForRelationship(ExecuteStreamCommand.OUTPUT_STREAM_RELATIONSHIP);
- byte[] byteArray = flowFiles.getFirst().toByteArray();
- String result = new String(byteArray);
+ String result = flowFiles.getFirst().getContent();
Set<String> dynamicEnvironmentVariables = new
HashSet<>(Arrays.asList(result.split("\r?\n")));
- assertFalse(dynamicEnvironmentVariables.size() < 2, "Should contain at
least two environment variables starting with NIFI");
-
assertTrue(dynamicEnvironmentVariables.contains("NIFI_TEST_1=testvalue1"),
"NIFI_TEST_1 environment variable is missing");
-
assertTrue(dynamicEnvironmentVariables.contains("NIFI_TEST_2=testvalue2"),
"NIFI_TEST_2 environment variable is missing");
+ Set<String> expectedEnvironmentVariables =
Set.of("NIFI_TEST_1=testvalue1", "NIFI_TEST_2=testvalue2");
+
assertTrue(dynamicEnvironmentVariables.containsAll(expectedEnvironmentVariables));
}
@Test
@@ -610,7 +518,7 @@ public class TestExecuteStreamCommand {
List<MockFlowFile> flowFiles =
runner.getFlowFilesForRelationship(ExecuteStreamCommand.OUTPUT_STREAM_RELATIONSHIP);
MockFlowFile outputFlowFile = flowFiles.getFirst();
- String output = new String(outputFlowFile.toByteArray()).trim();
+ String output = outputFlowFile.getContent().trim();
if (isWindows()) {
output = StringUtils.unwrap(output, '"');
}
@@ -620,14 +528,12 @@ public class TestExecuteStreamCommand {
}
@Test
- public void testExecuteJarPutToAttribute() throws Exception {
- File exJar = new
File("src/test/resources/ExecuteCommand/TestSuccess.jar");
- File dummy = new
File("src/test/resources/ExecuteCommand/1000bytes.txt");
- String jarPath = exJar.getAbsolutePath();
- exJar.setExecutable(true);
- runner.enqueue(dummy.toPath());
- runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND, "java");
- runner.setProperty(ExecuteStreamCommand.EXECUTION_ARGUMENTS, "-jar;" +
jarPath);
+ public void testExecuteJavaFilePutToAttribute() {
+ final Path javaFile = JAVA_FILES_DIR.resolve(TEST_SUCCESS);
+ final String content = "Print Me";
+ runner.enqueue(content);
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND,
JAVA_COMMAND);
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_ARGUMENTS,
javaFile.toString());
runner.setProperty(ExecuteStreamCommand.PUT_OUTPUT_IN_ATTRIBUTE,
"executeStreamCommand.output");
runner.run(1);
runner.assertTransferCount(ExecuteStreamCommand.ORIGINAL_RELATIONSHIP,
1);
@@ -636,37 +542,26 @@ public class TestExecuteStreamCommand {
List<MockFlowFile> flowFiles =
runner.getFlowFilesForRelationship(ExecuteStreamCommand.ORIGINAL_RELATIONSHIP);
MockFlowFile outputFlowFile = flowFiles.getFirst();
String result =
outputFlowFile.getAttribute("executeStreamCommand.output");
- outputFlowFile.assertContentEquals(dummy);
+ outputFlowFile.assertContentEquals(content);
assertTrue(Pattern.compile("Test was a
success\r?\n").matcher(result).find());
assertEquals("0", outputFlowFile.getAttribute("execution.status"));
- assertEquals("java", outputFlowFile.getAttribute("execution.command"));
- assertEquals("-jar;",
outputFlowFile.getAttribute("execution.command.args").substring(0, 5));
- String attribute =
outputFlowFile.getAttribute("execution.command.args");
- String expected = "src" + File.separator + "test" + File.separator +
"resources" + File.separator + "ExecuteCommand" + File.separator +
"TestSuccess.jar";
- assertEquals(expected, attribute.substring(attribute.length() -
expected.length()));
+ assertEquals(JAVA_COMMAND,
outputFlowFile.getAttribute("execution.command"));
+ assertEquals(javaFile.toString(),
outputFlowFile.getAttribute("execution.command.args"));
}
@Test
- public void testExecuteJarPutToAttributeDynamicProperties() throws
Exception {
- File exJar = new
File("src/test/resources/ExecuteCommand/TestSuccess.jar");
- File dummy = new
File("src/test/resources/ExecuteCommand/1000bytes.txt");
- String jarPath = exJar.getAbsolutePath();
- exJar.setExecutable(true);
- runner.enqueue(dummy.toPath());
- runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND, "java");
+ public void testExecuteJavaFilePutToAttributeDynamicProperties() {
+ final Path javaFile = JAVA_FILES_DIR.resolve(TEST_SUCCESS);
+ final String content = "Print Me";
+ runner.enqueue(content);
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND,
JAVA_COMMAND);
runner.setProperty(ExecuteStreamCommand.ARGUMENTS_STRATEGY,
ExecuteStreamCommand.DYNAMIC_PROPERTY_ARGUMENTS_STRATEGY.getValue());
PropertyDescriptor dynamicProp1 = new PropertyDescriptor.Builder()
.dynamic(true)
.name("command.argument.1")
.expressionLanguageSupported(ExpressionLanguageScope.FLOWFILE_ATTRIBUTES)
.build();
- runner.setProperty(dynamicProp1, "-jar");
- PropertyDescriptor dynamicProp2 = new PropertyDescriptor.Builder()
- .dynamic(true)
- .name("command.argument.2")
-
.expressionLanguageSupported(ExpressionLanguageScope.FLOWFILE_ATTRIBUTES)
- .build();
- runner.setProperty(dynamicProp2, jarPath);
+ runner.setProperty(dynamicProp1, javaFile.toString());
runner.setProperty(ExecuteStreamCommand.PUT_OUTPUT_IN_ATTRIBUTE,
"executeStreamCommand.output");
runner.run(1);
runner.assertTransferCount(ExecuteStreamCommand.ORIGINAL_RELATIONSHIP,
1);
@@ -675,24 +570,19 @@ public class TestExecuteStreamCommand {
List<MockFlowFile> flowFiles =
runner.getFlowFilesForRelationship(ExecuteStreamCommand.ORIGINAL_RELATIONSHIP);
MockFlowFile outputFlowFile = flowFiles.getFirst();
String result =
outputFlowFile.getAttribute("executeStreamCommand.output");
- outputFlowFile.assertContentEquals(dummy);
+ outputFlowFile.assertContentEquals(content);
assertTrue(Pattern.compile("Test was a
success\r?\n").matcher(result).find());
assertEquals("0", outputFlowFile.getAttribute("execution.status"));
- assertEquals("java", outputFlowFile.getAttribute("execution.command"));
- assertEquals("-jar",
outputFlowFile.getAttribute("execution.command.args").substring(0, 4));
- String attribute =
outputFlowFile.getAttribute("execution.command.args");
- String expected = "src" + File.separator + "test" + File.separator +
"resources" + File.separator + "ExecuteCommand" + File.separator +
"TestSuccess.jar";
- assertEquals(expected, attribute.substring(attribute.length() -
expected.length()));
+ assertEquals(JAVA_COMMAND,
outputFlowFile.getAttribute("execution.command"));
+ assertEquals(javaFile.toString(),
outputFlowFile.getAttribute("execution.command.args"));
}
@Test
- public void testExecuteJarToAttributeConfiguration() throws Exception {
- File exJar = new
File("src/test/resources/ExecuteCommand/TestSuccess.jar");
- String jarPath = exJar.getAbsolutePath();
- exJar.setExecutable(true);
+ public void testExecuteJavaFileToAttributeConfiguration() throws Exception
{
+ final Path javaFile = JAVA_FILES_DIR.resolve(TEST_SUCCESS);
runner.enqueue("small test".getBytes());
- runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND, "java");
- runner.setProperty(ExecuteStreamCommand.EXECUTION_ARGUMENTS, "-jar;" +
jarPath);
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND,
JAVA_COMMAND);
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_ARGUMENTS,
javaFile.toString());
runner.setProperty(ExecuteStreamCommand.PUT_ATTRIBUTE_MAX_LENGTH,
"10");
runner.setProperty(ExecuteStreamCommand.PUT_OUTPUT_IN_ATTRIBUTE,
"outputDest");
assertEquals(1,
runner.getProcessContext().getAvailableRelationships().size());
@@ -707,33 +597,22 @@ public class TestExecuteStreamCommand {
String result = outputFlowFile.getAttribute("outputDest");
assertTrue(Pattern.compile("Test was a").matcher(result).find());
assertEquals("0", outputFlowFile.getAttribute("execution.status"));
- assertEquals("java", outputFlowFile.getAttribute("execution.command"));
- assertEquals("-jar;",
outputFlowFile.getAttribute("execution.command.args").substring(0, 5));
- String attribute =
outputFlowFile.getAttribute("execution.command.args");
- String expected = "src" + File.separator + "test" + File.separator +
"resources" + File.separator + "ExecuteCommand" + File.separator +
"TestSuccess.jar";
- assertEquals(expected, attribute.substring(attribute.length() -
expected.length()));
+ assertEquals(JAVA_COMMAND,
outputFlowFile.getAttribute("execution.command"));
+ assertEquals(javaFile.toString(),
outputFlowFile.getAttribute("execution.command.args"));
}
@Test
- public void testExecuteJarToAttributeConfigurationDyanmicProperties()
throws Exception {
- File exJar = new
File("src/test/resources/ExecuteCommand/TestSuccess.jar");
- String jarPath = exJar.getAbsolutePath();
- exJar.setExecutable(true);
+ public void testExecuteJavaFileToAttributeConfigurationDynamicProperties()
{
+ final Path javaFile = JAVA_FILES_DIR.resolve(TEST_SUCCESS);
runner.enqueue("small test".getBytes());
- runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND, "java");
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND,
JAVA_COMMAND);
runner.setProperty(ExecuteStreamCommand.ARGUMENTS_STRATEGY,
ExecuteStreamCommand.DYNAMIC_PROPERTY_ARGUMENTS_STRATEGY.getValue());
PropertyDescriptor dynamicProp1 = new PropertyDescriptor.Builder()
.dynamic(true)
.name("command.argument.1")
.expressionLanguageSupported(ExpressionLanguageScope.FLOWFILE_ATTRIBUTES)
.build();
- runner.setProperty(dynamicProp1, "-jar");
- PropertyDescriptor dynamicProp2 = new PropertyDescriptor.Builder()
- .dynamic(true)
- .name("command.argument.2")
-
.expressionLanguageSupported(ExpressionLanguageScope.FLOWFILE_ATTRIBUTES)
- .build();
- runner.setProperty(dynamicProp2, jarPath);
+ runner.setProperty(dynamicProp1, javaFile.toString());
runner.setProperty(ExecuteStreamCommand.PUT_ATTRIBUTE_MAX_LENGTH,
"10");
runner.setProperty(ExecuteStreamCommand.PUT_OUTPUT_IN_ATTRIBUTE,
"outputDest");
assertEquals(1,
runner.getProcessContext().getAvailableRelationships().size());
@@ -744,71 +623,41 @@ public class TestExecuteStreamCommand {
List<MockFlowFile> flowFiles =
runner.getFlowFilesForRelationship(ExecuteStreamCommand.ORIGINAL_RELATIONSHIP);
MockFlowFile outputFlowFile = flowFiles.getFirst();
- outputFlowFile.assertContentEquals("small test".getBytes());
+ outputFlowFile.assertContentEquals("small test");
String result = outputFlowFile.getAttribute("outputDest");
assertTrue(Pattern.compile("Test was a").matcher(result).find());
assertEquals("0", outputFlowFile.getAttribute("execution.status"));
- assertEquals("java", outputFlowFile.getAttribute("execution.command"));
- assertEquals("-jar",
outputFlowFile.getAttribute("execution.command.args").substring(0, 4));
- String attribute =
outputFlowFile.getAttribute("execution.command.args");
- String expected = "src" + File.separator + "test" + File.separator +
"resources" + File.separator + "ExecuteCommand" + File.separator +
"TestSuccess.jar";
- assertEquals(expected, attribute.substring(attribute.length() -
expected.length()));
+ assertEquals(JAVA_COMMAND,
outputFlowFile.getAttribute("execution.command"));
+ assertEquals(javaFile.toString(),
outputFlowFile.getAttribute("execution.command.args"));
}
@Test
- public void testExecuteIngestAndUpdatePutToAttribute() throws IOException {
- File exJar = new
File("src/test/resources/ExecuteCommand/TestIngestAndUpdate.jar");
- File dummy = new
File("src/test/resources/ExecuteCommand/1000bytes.txt");
- File dummy10MBytes = new File("target/10MB.txt");
- byte[] bytes = Files.readAllBytes(dummy.toPath());
- try (FileOutputStream fos = new FileOutputStream(dummy10MBytes)) {
- for (int i = 0; i < 10000; i++) {
- fos.write(bytes, 0, 1000);
- }
- }
- String jarPath = exJar.getAbsolutePath();
- exJar.setExecutable(true);
- runner.enqueue(dummy10MBytes.toPath());
- runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND, "java");
- runner.setProperty(ExecuteStreamCommand.EXECUTION_ARGUMENTS, "-jar;" +
jarPath);
+ public void testExecuteIngestAndUpdatePutToAttribute() {
+ final Path javaFile = JAVA_FILES_DIR.resolve(TEST_INGEST_AND_UPDATE);
+ runner.enqueue("");
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND,
JAVA_COMMAND);
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_ARGUMENTS,
javaFile.toString());
runner.setProperty(ExecuteStreamCommand.PUT_OUTPUT_IN_ATTRIBUTE,
"outputDest");
runner.run(1);
runner.assertTransferCount(ExecuteStreamCommand.ORIGINAL_RELATIONSHIP,
1);
runner.assertTransferCount(ExecuteStreamCommand.OUTPUT_STREAM_RELATIONSHIP, 0);
List<MockFlowFile> flowFiles =
runner.getFlowFilesForRelationship(ExecuteStreamCommand.ORIGINAL_RELATIONSHIP);
String result = flowFiles.getFirst().getAttribute("outputDest");
-
assertTrue(Pattern.compile("nifi-standard-processors:ModifiedResult\r?\n").matcher(result).find());
}
@Test
- public void testExecuteIngestAndUpdatePutToAttributeDynamicProperties()
throws IOException {
- File exJar = new
File("src/test/resources/ExecuteCommand/TestIngestAndUpdate.jar");
- File dummy = new
File("src/test/resources/ExecuteCommand/1000bytes.txt");
- File dummy10MBytes = new File("target/10MB.txt");
- byte[] bytes = Files.readAllBytes(dummy.toPath());
- try (FileOutputStream fos = new FileOutputStream(dummy10MBytes)) {
- for (int i = 0; i < 10000; i++) {
- fos.write(bytes, 0, 1000);
- }
- }
- String jarPath = exJar.getAbsolutePath();
- exJar.setExecutable(true);
- runner.enqueue(dummy10MBytes.toPath());
- runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND, "java");
+ public void testExecuteIngestAndUpdatePutToAttributeDynamicProperties() {
+ final Path javaFile = JAVA_FILES_DIR.resolve(TEST_INGEST_AND_UPDATE);
+ runner.enqueue("");
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND,
JAVA_COMMAND);
runner.setProperty(ExecuteStreamCommand.ARGUMENTS_STRATEGY,
ExecuteStreamCommand.DYNAMIC_PROPERTY_ARGUMENTS_STRATEGY.getValue());
PropertyDescriptor dynamicProp1 = new PropertyDescriptor.Builder()
.dynamic(true)
.name("command.argument.1")
.expressionLanguageSupported(ExpressionLanguageScope.FLOWFILE_ATTRIBUTES)
.build();
- runner.setProperty(dynamicProp1, "-jar");
- PropertyDescriptor dynamicProp2 = new PropertyDescriptor.Builder()
- .dynamic(true)
- .name("command.argument.2")
-
.expressionLanguageSupported(ExpressionLanguageScope.FLOWFILE_ATTRIBUTES)
- .build();
- runner.setProperty(dynamicProp2, jarPath);
+ runner.setProperty(dynamicProp1, javaFile.toString());
runner.setProperty(ExecuteStreamCommand.PUT_OUTPUT_IN_ATTRIBUTE,
"outputDest");
runner.run(1);
runner.assertTransferCount(ExecuteStreamCommand.ORIGINAL_RELATIONSHIP,
1);
@@ -822,7 +671,7 @@ public class TestExecuteStreamCommand {
@Test
public void testLargePutToAttribute() throws IOException {
File dummy = new
File("src/test/resources/ExecuteCommand/1000bytes.txt");
- File dummy10MBytes = new File("target/10MB.txt");
+ File dummy10MBytes = new File(tempDir, "10MB.txt");
byte[] bytes = Files.readAllBytes(dummy.toPath());
try (FileOutputStream fos = new FileOutputStream(dummy10MBytes)) {
for (int i = 0; i < 10000; i++) {
@@ -856,7 +705,7 @@ public class TestExecuteStreamCommand {
@Test
public void testLargePutToAttributeDynamicProperties() throws IOException {
File dummy = new
File("src/test/resources/ExecuteCommand/1000bytes.txt");
- File dummy10MBytes = new File("target/10MB.txt");
+ File dummy10MBytes = new File(tempDir, "10MB.txt");
byte[] bytes = Files.readAllBytes(dummy.toPath());
try (FileOutputStream fos = new FileOutputStream(dummy10MBytes)) {
for (int i = 0; i < 10000; i++) {
@@ -904,34 +753,27 @@ public class TestExecuteStreamCommand {
}
@Test
- public void testExecuteIngestAndUpdateWithWorkingDirPutToAttribute()
throws IOException {
- File exJar = new
File("src/test/resources/ExecuteCommand/TestIngestAndUpdate.jar");
- File dummy = new
File("src/test/resources/ExecuteCommand/1000bytes.txt");
- String jarPath = exJar.getAbsolutePath();
- exJar.setExecutable(true);
- runner.enqueue(dummy.toPath());
- runner.setProperty(ExecuteStreamCommand.WORKING_DIR, "target");
- runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND, "java");
+ public void testExecuteIngestAndUpdateWithWorkingDirPutToAttribute() {
+ runner.enqueue("");
+ runner.setProperty(ExecuteStreamCommand.WORKING_DIR,
JAVA_FILES_DIR.toString());
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND,
JAVA_COMMAND);
runner.setProperty(ExecuteStreamCommand.PUT_OUTPUT_IN_ATTRIBUTE,
"streamOutput");
- runner.setProperty(ExecuteStreamCommand.EXECUTION_ARGUMENTS, "-jar;" +
jarPath);
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_ARGUMENTS,
TEST_INGEST_AND_UPDATE.toString());
runner.run(1);
runner.assertTransferCount(ExecuteStreamCommand.ORIGINAL_RELATIONSHIP,
1);
List<MockFlowFile> flowFiles =
runner.getFlowFilesForRelationship(ExecuteStreamCommand.ORIGINAL_RELATIONSHIP);
String result = flowFiles.getFirst().getAttribute("streamOutput");
final String quotedSeparator = Pattern.quote(File.separator);
- assertTrue(Pattern.compile(quotedSeparator +
"nifi-standard-processors" + quotedSeparator +
"target:ModifiedResult\r?\n").matcher(result).find());
+ final String expectedOutput =
"%1$snifi-standard-processors%1$ssrc%1$stest%1$sjava:ModifiedResult\r?\n".formatted(quotedSeparator);
+ assertTrue(Pattern.compile(expectedOutput).matcher(result).find());
}
@Test
- public void
testExecuteIngestAndUpdateWithWorkingDirPutToAttributeDynamicProperties()
throws IOException {
- File exJar = new
File("src/test/resources/ExecuteCommand/TestIngestAndUpdate.jar");
- File dummy = new
File("src/test/resources/ExecuteCommand/1000bytes.txt");
- String jarPath = exJar.getAbsolutePath();
- exJar.setExecutable(true);
- runner.enqueue(dummy.toPath());
- runner.setProperty(ExecuteStreamCommand.WORKING_DIR, "target");
- runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND, "java");
+ public void
testExecuteIngestAndUpdateWithWorkingDirPutToAttributeDynamicProperties() {
+ runner.enqueue("");
+ runner.setProperty(ExecuteStreamCommand.WORKING_DIR,
JAVA_FILES_DIR.toString());
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND,
JAVA_COMMAND);
runner.setProperty(ExecuteStreamCommand.PUT_OUTPUT_IN_ATTRIBUTE,
"streamOutput");
runner.setProperty(ExecuteStreamCommand.ARGUMENTS_STRATEGY,
ExecuteStreamCommand.DYNAMIC_PROPERTY_ARGUMENTS_STRATEGY.getValue());
PropertyDescriptor dynamicProp1 = new PropertyDescriptor.Builder()
@@ -939,130 +781,102 @@ public class TestExecuteStreamCommand {
.name("command.argument.1")
.expressionLanguageSupported(ExpressionLanguageScope.FLOWFILE_ATTRIBUTES)
.build();
- runner.setProperty(dynamicProp1, "-jar");
- PropertyDescriptor dynamicProp2 = new PropertyDescriptor.Builder()
- .dynamic(true)
- .name("command.argument.2")
-
.expressionLanguageSupported(ExpressionLanguageScope.FLOWFILE_ATTRIBUTES)
- .build();
- runner.setProperty(dynamicProp2, jarPath);
+ runner.setProperty(dynamicProp1, TEST_INGEST_AND_UPDATE.toString());
runner.run(1);
runner.assertTransferCount(ExecuteStreamCommand.ORIGINAL_RELATIONSHIP,
1);
List<MockFlowFile> flowFiles =
runner.getFlowFilesForRelationship(ExecuteStreamCommand.ORIGINAL_RELATIONSHIP);
String result = flowFiles.getFirst().getAttribute("streamOutput");
final String quotedSeparator = Pattern.quote(File.separator);
- assertTrue(Pattern.compile(quotedSeparator +
"nifi-standard-processors" + quotedSeparator +
"target:ModifiedResult\r?\n").matcher(result).find());
+ final String expectedOutput =
"%1$snifi-standard-processors%1$ssrc%1$stest%1$sjava:ModifiedResult\r?\n".formatted(quotedSeparator);
+ assertTrue(Pattern.compile(expectedOutput).matcher(result).find());
}
@Test
- public void testIgnoredStdinPutToAttribute() throws IOException {
- File exJar = new
File("src/test/resources/ExecuteCommand/TestIngestAndUpdate.jar");
- File dummy = new
File("src/test/resources/ExecuteCommand/1000bytes.txt");
- String jarPath = exJar.getAbsolutePath();
- exJar.setExecutable(true);
- runner.enqueue(dummy.toPath());
- runner.setProperty(ExecuteStreamCommand.WORKING_DIR, "target");
- runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND, "java");
- runner.setProperty(ExecuteStreamCommand.EXECUTION_ARGUMENTS, "-jar;" +
jarPath);
+ public void testIgnoredStdinPutToAttribute() {
+ runner.enqueue("");
+ runner.setProperty(ExecuteStreamCommand.WORKING_DIR,
JAVA_FILES_DIR.toString());
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND,
JAVA_COMMAND);
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_ARGUMENTS,
TEST_INGEST_AND_UPDATE.toString());
runner.setProperty(ExecuteStreamCommand.IGNORE_STDIN, "true");
runner.setProperty(ExecuteStreamCommand.PUT_OUTPUT_IN_ATTRIBUTE,
"executeStreamCommand.output");
runner.run(1);
runner.assertTransferCount(ExecuteStreamCommand.ORIGINAL_RELATIONSHIP,
1);
List<MockFlowFile> flowFiles =
runner.getFlowFilesForRelationship(ExecuteStreamCommand.ORIGINAL_RELATIONSHIP);
String result =
flowFiles.getFirst().getAttribute("executeStreamCommand.output");
-
assertTrue(Pattern.compile("target:ModifiedResult\r?\n?").matcher(result).find(),
- "TestIngestAndUpdate.jar should not have received anything to
modify");
+
+ final String quotedSeparator = Pattern.quote(File.separator);
+ final String expectedOutput =
"%1$ssrc%1$stest%1$sjava:ModifiedResult\r?\n".formatted(quotedSeparator);
+
+ assertTrue(Pattern.compile(expectedOutput).matcher(result).find(),
+ "TestIngestAndUpdate.java should not have received anything to
modify");
}
@Test
- public void testIgnoredStdinPutToAttributeDynamicProperties() throws
IOException {
- File exJar = new
File("src/test/resources/ExecuteCommand/TestIngestAndUpdate.jar");
- File dummy = new
File("src/test/resources/ExecuteCommand/1000bytes.txt");
- String jarPath = exJar.getAbsolutePath();
- exJar.setExecutable(true);
- runner.enqueue(dummy.toPath());
- runner.setProperty(ExecuteStreamCommand.WORKING_DIR, "target");
- runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND, "java");
+ public void testIgnoredStdinPutToAttributeDynamicProperties() {
+ runner.enqueue("");
+ runner.setProperty(ExecuteStreamCommand.WORKING_DIR,
JAVA_FILES_DIR.toString());
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND,
JAVA_COMMAND);
runner.setProperty(ExecuteStreamCommand.ARGUMENTS_STRATEGY,
ExecuteStreamCommand.DYNAMIC_PROPERTY_ARGUMENTS_STRATEGY.getValue());
PropertyDescriptor dynamicProp1 = new PropertyDescriptor.Builder()
.dynamic(true)
.name("command.argument.1")
.expressionLanguageSupported(ExpressionLanguageScope.FLOWFILE_ATTRIBUTES)
.build();
- runner.setProperty(dynamicProp1, "-jar");
- PropertyDescriptor dynamicProp2 = new PropertyDescriptor.Builder()
- .dynamic(true)
- .name("command.argument.2")
-
.expressionLanguageSupported(ExpressionLanguageScope.FLOWFILE_ATTRIBUTES)
- .build();
- runner.setProperty(dynamicProp2, jarPath);
+ runner.setProperty(dynamicProp1, TEST_INGEST_AND_UPDATE.toString());
runner.setProperty(ExecuteStreamCommand.IGNORE_STDIN, "true");
runner.setProperty(ExecuteStreamCommand.PUT_OUTPUT_IN_ATTRIBUTE,
"executeStreamCommand.output");
runner.run(1);
runner.assertTransferCount(ExecuteStreamCommand.ORIGINAL_RELATIONSHIP,
1);
List<MockFlowFile> flowFiles =
runner.getFlowFilesForRelationship(ExecuteStreamCommand.ORIGINAL_RELATIONSHIP);
String result =
flowFiles.getFirst().getAttribute("executeStreamCommand.output");
-
assertTrue(Pattern.compile("target:ModifiedResult\r?\n?").matcher(result).find(),
- "TestIngestAndUpdate.jar should not have received anything to
modify");
+ final String quotedSeparator = Pattern.quote(File.separator);
+ final String expectedOutput =
"%1$ssrc%1$stest%1$sjava:ModifiedResult\r?\n".formatted(quotedSeparator);
+
+ assertTrue(Pattern.compile(expectedOutput).matcher(result).find(),
+ "TestIngestAndUpdate.java should not have received anything to
modify");
}
@Test
- public void testDynamicEnvironmentPutToAttribute() throws Exception {
- File exJar = new
File("src/test/resources/ExecuteCommand/TestDynamicEnvironment.jar");
- File dummy = new
File("src/test/resources/ExecuteCommand/1000bytes.txt");
- String jarPath = exJar.getAbsolutePath();
- exJar.setExecutable(true);
+ public void testDynamicEnvironmentPutToAttribute() {
runner.setProperty("NIFI_TEST_1", "testvalue1");
runner.setProperty("NIFI_TEST_2", "testvalue2");
- runner.enqueue(dummy.toPath());
- runner.setProperty(ExecuteStreamCommand.WORKING_DIR, "target");
- runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND, "java");
- runner.setProperty(ExecuteStreamCommand.EXECUTION_ARGUMENTS, "-jar;" +
jarPath);
+ runner.enqueue("");
+ runner.setProperty(ExecuteStreamCommand.WORKING_DIR,
JAVA_FILES_DIR.toString());
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND,
JAVA_COMMAND);
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_ARGUMENTS,
TEST_DYNAMIC_ENVIRONMENT.toString());
runner.setProperty(ExecuteStreamCommand.PUT_OUTPUT_IN_ATTRIBUTE,
"executeStreamCommand.output");
runner.run(1);
runner.assertTransferCount(ExecuteStreamCommand.ORIGINAL_RELATIONSHIP,
1);
List<MockFlowFile> flowFiles =
runner.getFlowFilesForRelationship(ExecuteStreamCommand.ORIGINAL_RELATIONSHIP);
String result =
flowFiles.getFirst().getAttribute("executeStreamCommand.output");
Set<String> dynamicEnvironmentVariables = new
HashSet<>(Arrays.asList(result.split("\r?\n")));
- assertFalse(dynamicEnvironmentVariables.size() < 2, "Should contain at
least two environment variables starting with NIFI");
-
assertTrue(dynamicEnvironmentVariables.contains("NIFI_TEST_1=testvalue1"),
"NIFI_TEST_1 environment variable is missing");
-
assertTrue(dynamicEnvironmentVariables.contains("NIFI_TEST_2=testvalue2"),
"NIFI_TEST_2 environment variable is missing");
+ Set<String> expectedEnvironmentVariables =
Set.of("NIFI_TEST_1=testvalue1", "NIFI_TEST_2=testvalue2");
+
assertTrue(dynamicEnvironmentVariables.containsAll(expectedEnvironmentVariables));
}
@Test
- public void testDynamicEnvironmentPutToAttributeDynamicProperties() throws
Exception {
- File exJar = new
File("src/test/resources/ExecuteCommand/TestDynamicEnvironment.jar");
- File dummy = new
File("src/test/resources/ExecuteCommand/1000bytes.txt");
- String jarPath = exJar.getAbsolutePath();
- exJar.setExecutable(true);
+ public void testDynamicEnvironmentPutToAttributeDynamicProperties() {
runner.setProperty("NIFI_TEST_1", "testvalue1");
runner.setProperty("NIFI_TEST_2", "testvalue2");
- runner.enqueue(dummy.toPath());
- runner.setProperty(ExecuteStreamCommand.WORKING_DIR, "target");
- runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND, "java");
+ runner.enqueue("");
+ runner.setProperty(ExecuteStreamCommand.WORKING_DIR,
JAVA_FILES_DIR.toString());
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND,
JAVA_COMMAND);
runner.setProperty(ExecuteStreamCommand.ARGUMENTS_STRATEGY,
ExecuteStreamCommand.DYNAMIC_PROPERTY_ARGUMENTS_STRATEGY.getValue());
PropertyDescriptor dynamicProp1 = new PropertyDescriptor.Builder()
.dynamic(true)
.name("command.argument.1")
.expressionLanguageSupported(ExpressionLanguageScope.FLOWFILE_ATTRIBUTES)
.build();
- runner.setProperty(dynamicProp1, "-jar");
- PropertyDescriptor dynamicProp2 = new PropertyDescriptor.Builder()
- .dynamic(true)
- .name("command.argument.2")
-
.expressionLanguageSupported(ExpressionLanguageScope.FLOWFILE_ATTRIBUTES)
- .build();
- runner.setProperty(dynamicProp2, jarPath);
+ runner.setProperty(dynamicProp1, TEST_DYNAMIC_ENVIRONMENT.toString());
runner.setProperty(ExecuteStreamCommand.PUT_OUTPUT_IN_ATTRIBUTE,
"executeStreamCommand.output");
runner.run(1);
runner.assertTransferCount(ExecuteStreamCommand.ORIGINAL_RELATIONSHIP,
1);
List<MockFlowFile> flowFiles =
runner.getFlowFilesForRelationship(ExecuteStreamCommand.ORIGINAL_RELATIONSHIP);
String result =
flowFiles.getFirst().getAttribute("executeStreamCommand.output");
Set<String> dynamicEnvironmentVariables = new
HashSet<>(Arrays.asList(result.split("\r?\n")));
- assertFalse(dynamicEnvironmentVariables.size() < 2, "Should contain at
least two environment variables starting with NIFI");
-
assertTrue(dynamicEnvironmentVariables.contains("NIFI_TEST_1=testvalue1"),
"NIFI_TEST_1 environment variable is missing");
-
assertTrue(dynamicEnvironmentVariables.contains("NIFI_TEST_2=testvalue2"),
"NIFI_TEST_2 environment variable is missing");
+ Set<String> expectedEnvironmentVariables =
Set.of("NIFI_TEST_1=testvalue1", "NIFI_TEST_2=testvalue2");
+
assertTrue(dynamicEnvironmentVariables.containsAll(expectedEnvironmentVariables));
}
@Test
@@ -1084,14 +898,12 @@ public class TestExecuteStreamCommand {
}
@Test
- public void testExecuteJarPutToAttributeBadPath() throws Exception {
- File exJar = new
File("src/test/resources/ExecuteCommand/noSuchFile.jar");
- File dummy = new
File("src/test/resources/ExecuteCommand/1000bytes.txt");
- String jarPath = exJar.getAbsolutePath();
- exJar.setExecutable(true);
- runner.enqueue(dummy.toPath());
- runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND, "java");
- runner.setProperty(ExecuteStreamCommand.EXECUTION_ARGUMENTS, "-jar;" +
jarPath);
+ public void testExecuteJavaFilePutToAttributeBadPath() {
+ final Path javaFile = JAVA_FILES_DIR.resolve(NO_SUCH_FILE);
+ final String content = "Print Me";
+ runner.enqueue(content);
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND,
JAVA_COMMAND);
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_ARGUMENTS,
javaFile.toString());
runner.setProperty(ExecuteStreamCommand.PUT_OUTPUT_IN_ATTRIBUTE,
"executeStreamCommand.output");
runner.run(1);
runner.assertTransferCount(ExecuteStreamCommand.OUTPUT_STREAM_RELATIONSHIP, 0);
@@ -1101,37 +913,26 @@ public class TestExecuteStreamCommand {
List<MockFlowFile> flowFiles =
runner.getFlowFilesForRelationship(ExecuteStreamCommand.ORIGINAL_RELATIONSHIP);
MockFlowFile outputFlowFile = flowFiles.getFirst();
String result =
outputFlowFile.getAttribute("executeStreamCommand.output");
- outputFlowFile.assertContentEquals(dummy);
- assertTrue(result.isEmpty()); // java -jar with bad path only prints
to standard error not standard out
+ outputFlowFile.assertContentEquals(content);
+ assertTrue(result.isEmpty()); // java with bad path only prints to
standard error not standard out
assertEquals("1", outputFlowFile.getAttribute("execution.status")); //
java -jar with bad path exits with code 1
- assertEquals("java", outputFlowFile.getAttribute("execution.command"));
- assertEquals("-jar;",
outputFlowFile.getAttribute("execution.command.args").substring(0, 5));
- String attribute =
outputFlowFile.getAttribute("execution.command.args");
- String expected = "src" + File.separator + "test" + File.separator +
"resources" + File.separator + "ExecuteCommand" + File.separator +
"noSuchFile.jar";
- assertEquals(expected, attribute.substring(attribute.length() -
expected.length()));
+ assertEquals(JAVA_COMMAND,
outputFlowFile.getAttribute("execution.command"));
+ assertEquals(javaFile.toString(),
outputFlowFile.getAttribute("execution.command.args"));
}
@Test
- public void testExecuteJarPutToAttributeBadPathDynamicProperties() throws
Exception {
- File exJar = new
File("src/test/resources/ExecuteCommand/noSuchFile.jar");
- File dummy = new
File("src/test/resources/ExecuteCommand/1000bytes.txt");
- String jarPath = exJar.getAbsolutePath();
- exJar.setExecutable(true);
- runner.enqueue(dummy.toPath());
- runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND, "java");
+ public void testExecuteJavaFilePutToAttributeBadPathDynamicProperties() {
+ final Path javaFile = JAVA_FILES_DIR.resolve(NO_SUCH_FILE);
+ final String content = "Print Me";
+ runner.enqueue(content);
+ runner.setProperty(ExecuteStreamCommand.EXECUTION_COMMAND,
JAVA_COMMAND);
runner.setProperty(ExecuteStreamCommand.ARGUMENTS_STRATEGY,
ExecuteStreamCommand.DYNAMIC_PROPERTY_ARGUMENTS_STRATEGY.getValue());
PropertyDescriptor dynamicProp1 = new PropertyDescriptor.Builder()
.dynamic(true)
.name("command.argument.1")
.expressionLanguageSupported(ExpressionLanguageScope.FLOWFILE_ATTRIBUTES)
.build();
- runner.setProperty(dynamicProp1, "-jar");
- PropertyDescriptor dynamicProp2 = new PropertyDescriptor.Builder()
- .dynamic(true)
- .name("command.argument.2")
-
.expressionLanguageSupported(ExpressionLanguageScope.FLOWFILE_ATTRIBUTES)
- .build();
- runner.setProperty(dynamicProp2, jarPath);
+ runner.setProperty(dynamicProp1, javaFile.toString());
runner.setProperty(ExecuteStreamCommand.PUT_OUTPUT_IN_ATTRIBUTE,
"executeStreamCommand.output");
runner.run(1);
runner.assertTransferCount(ExecuteStreamCommand.OUTPUT_STREAM_RELATIONSHIP, 0);
@@ -1141,14 +942,13 @@ public class TestExecuteStreamCommand {
List<MockFlowFile> flowFiles =
runner.getFlowFilesForRelationship(ExecuteStreamCommand.ORIGINAL_RELATIONSHIP);
MockFlowFile outputFlowFile = flowFiles.getFirst();
String result =
outputFlowFile.getAttribute("executeStreamCommand.output");
- outputFlowFile.assertContentEquals(dummy);
- assertTrue(result.isEmpty()); // java -jar with bad path only prints
to standard error not standard out
+ outputFlowFile.assertContentEquals(content);
+ assertTrue(result.isEmpty()); // java with bad path only prints to
standard error not standard out
assertEquals("1", outputFlowFile.getAttribute("execution.status")); //
java -jar with bad path exits with code 1
- assertEquals("java", outputFlowFile.getAttribute("execution.command"));
- assertEquals("-jar",
outputFlowFile.getAttribute("execution.command.args").substring(0, 4));
+ assertEquals(JAVA_COMMAND,
outputFlowFile.getAttribute("execution.command"));
+ assertEquals(javaFile.toString(),
outputFlowFile.getAttribute("execution.command.args"));
String attribute =
outputFlowFile.getAttribute("execution.command.args");
- String expected = "src" + File.separator + "test" + File.separator +
"resources" + File.separator + "ExecuteCommand" + File.separator +
"noSuchFile.jar";
- assertEquals(expected, attribute.substring(attribute.length() -
expected.length()));
+ assertEquals(javaFile.toString(), attribute);
}
@Test
diff --git
a/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/resources/ExecuteCommand/1mb.txt
b/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/resources/ExecuteCommand/1mb.txt
deleted file mode 100644
index 6e6483f999..0000000000
---
a/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/resources/ExecuteCommand/1mb.txt
+++ /dev/null
@@ -1,101 +0,0 @@
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[...]
\ No newline at end of file
diff --git
a/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/resources/ExecuteCommand/TestDynamicEnvironment.jar
b/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/resources/ExecuteCommand/TestDynamicEnvironment.jar
deleted file mode 100755
index 8ff95a1798..0000000000
Binary files
a/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/resources/ExecuteCommand/TestDynamicEnvironment.jar
and /dev/null differ
diff --git
a/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/resources/ExecuteCommand/TestIngestAndUpdate.jar
b/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/resources/ExecuteCommand/TestIngestAndUpdate.jar
deleted file mode 100755
index 5788a6d93e..0000000000
Binary files
a/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/resources/ExecuteCommand/TestIngestAndUpdate.jar
and /dev/null differ
diff --git
a/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/resources/ExecuteCommand/TestLogStdErr.jar
b/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/resources/ExecuteCommand/TestLogStdErr.jar
deleted file mode 100755
index cb202b5b47..0000000000
Binary files
a/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/resources/ExecuteCommand/TestLogStdErr.jar
and /dev/null differ
diff --git
a/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/resources/ExecuteCommand/TestSuccess.jar
b/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/resources/ExecuteCommand/TestSuccess.jar
deleted file mode 100755
index b28612a4ec..0000000000
Binary files
a/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/resources/ExecuteCommand/TestSuccess.jar
and /dev/null differ
diff --git
a/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/resources/ExecuteCommand/test.txt
b/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/resources/ExecuteCommand/test.txt
deleted file mode 100755
index fc800bb12c..0000000000
---
a/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/resources/ExecuteCommand/test.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Test was a success
-